diff --git a/civicrm.php b/civicrm.php
index bfc0c589da33361ccbebb0e39602feeaf55a2fc9..5e710fb2dfb9fde3abb6fa2184d52755c9b466ec 100644
--- a/civicrm.php
+++ b/civicrm.php
@@ -2,7 +2,7 @@
 /*
 Plugin Name: CiviCRM
 Description: CiviCRM - Growing and Sustaining Relationships
-Version: 5.30.1
+Version: 5.31.0
 Requires at least: 4.9
 Requires PHP:      7.1
 Author: CiviCRM LLC
@@ -56,7 +56,7 @@ if ( ! defined( 'ABSPATH' ) ) exit;
 
 
 // Set version here: when it changes, will force JS to reload
-define( 'CIVICRM_PLUGIN_VERSION', '5.30.1' );
+define( 'CIVICRM_PLUGIN_VERSION', '5.31.0' );
 
 // Store reference to this file
 if (!defined('CIVICRM_PLUGIN_FILE')) {
diff --git a/civicrm/CRM/ACL/BAO/ACL.php b/civicrm/CRM/ACL/BAO/ACL.php
index 988340c94d42070611ab35d15ffbb2ff31057021..2fa703199fa0deb142fe90a7fef9b8ef6f5d15d2 100644
--- a/civicrm/CRM/ACL/BAO/ACL.php
+++ b/civicrm/CRM/ACL/BAO/ACL.php
@@ -204,36 +204,29 @@ SELECT      acl.*
   protected static function getGroupACLRoles($contact_id) {
     $contact_id = CRM_Utils_Type::escape($contact_id, 'Integer');
 
-    $rule = new CRM_ACL_BAO_ACL();
-
-    $aclRole = 'civicrm_acl_role';
-
-    $aclER = CRM_ACL_DAO_EntityRole::getTableName();
-    $c2g = CRM_Contact_BAO_GroupContact::getTableName();
-
     $query = "   SELECT          acl.*
                         FROM            civicrm_acl acl
                         INNER JOIN      civicrm_option_group og
                                 ON      og.name = 'acl_role'
                         INNER JOIN      civicrm_option_value ov
-                                ON      acl.entity_table   = '$aclRole'
+                                ON      acl.entity_table   = 'civicrm_acl_role'
                                 AND     ov.option_group_id  = og.id
                                 AND     acl.entity_id      = ov.value
                                 AND     ov.is_active        = 1
-                        INNER JOIN      $aclER
-                                ON      $aclER.acl_role_id = acl.entity_id
-                                AND     $aclER.is_active    = 1
-                        INNER JOIN  $c2g
-                                ON      $aclER.entity_id      = $c2g.group_id
-                                AND     $aclER.entity_table   = 'civicrm_group'
-                        WHERE       acl.entity_table       = '$aclRole'
+                        INNER JOIN      civicrm_acl_entity_role acl_entity_role
+                                ON      acl_entity_role.acl_role_id = acl.entity_id
+                                AND     acl_entity_role.is_active    = 1
+                        INNER JOIN  civicrm_group_contact group_contact
+                                ON      acl_entity_role.entity_id      = group_contact.group_id
+                                AND     acl_entity_role.entity_table   = 'civicrm_group'
+                        WHERE       acl.entity_table       = 'civicrm_acl_role'
                             AND     acl.is_active          = 1
-                            AND     $c2g.contact_id         = $contact_id
-                            AND     $c2g.status             = 'Added'";
+                            AND     group_contact.contact_id         = $contact_id
+                            AND     group_contact.status             = 'Added'";
 
     $results = [];
 
-    $rule->query($query);
+    $rule = CRM_Core_DAO::executeQuery($query);
 
     while ($rule->fetch()) {
       $results[$rule->id] = $rule->toArray();
@@ -254,7 +247,7 @@ SELECT acl.*
    AND acl.entity_table   = 'civicrm_acl_role'
 ";
 
-    $rule->query($query);
+    $rule = CRM_Core_DAO::executeQuery($query);
     while ($rule->fetch()) {
       $results[$rule->id] = $rule->toArray();
     }
@@ -484,10 +477,10 @@ SELECT g.*
       $aclKeys = array_keys($acls);
       $aclKeys = implode(',', $aclKeys);
 
-      $cacheKey = CRM_Utils_Cache::cleanKey("$tableName-$aclKeys");
+      $cacheKey = CRM_Utils_Cache::cleanKey("$type-$tableName-$aclKeys");
       $cache = CRM_Utils_Cache::singleton();
       $ids = $cache->get($cacheKey);
-      if (!$ids) {
+      if (!is_array($ids)) {
         $ids = [];
         $query = "
 SELECT   a.operation, a.object_id
diff --git a/civicrm/CRM/ACL/DAO/ACL.php b/civicrm/CRM/ACL/DAO/ACL.php
index fa06cf96c5e2b4d421217ddb1cbfeab5b34ef913..57934d13036c463ef673edd45d3988c27776f92a 100644
--- a/civicrm/CRM/ACL/DAO/ACL.php
+++ b/civicrm/CRM/ACL/DAO/ACL.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/ACL/ACL.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f75eaa0ee87675c14a224ec22b2c30a7)
+ * (GenCodeChecksum:54e8c75c28c9dd74192f60bbcf1605f6)
  */
 
 /**
@@ -117,9 +117,12 @@ class CRM_ACL_DAO_ACL extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('ACLs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('ACLs') : ts('ACL');
   }
 
   /**
diff --git a/civicrm/CRM/ACL/DAO/ACLCache.php b/civicrm/CRM/ACL/DAO/ACLCache.php
index 7e3ac8429f163e60b091c50dbd90983a661e5afc..4418878c769bbb0d163e53f908412741f19a5645 100644
--- a/civicrm/CRM/ACL/DAO/ACLCache.php
+++ b/civicrm/CRM/ACL/DAO/ACLCache.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/ACL/ACLCache.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:cbf36d56ce734a5f7ceeb2071b68ebf8)
+ * (GenCodeChecksum:7faa5879056a56b463304bd81829afda)
  */
 
 /**
@@ -68,9 +68,12 @@ class CRM_ACL_DAO_ACLCache extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('ACLCaches');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('ACLCaches') : ts('ACLCache');
   }
 
   /**
@@ -82,7 +85,6 @@ class CRM_ACL_DAO_ACLCache extends CRM_Core_DAO {
   public static function getReferenceColumns() {
     if (!isset(Civi::$statics[__CLASS__]['links'])) {
       Civi::$statics[__CLASS__]['links'] = static::createReferenceColumns(__CLASS__);
-      Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName(), 'contact_id', 'civicrm_contact', 'id');
       Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName(), 'acl_id', 'civicrm_acl', 'id');
       CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'links_callback', Civi::$statics[__CLASS__]['links']);
     }
@@ -120,7 +122,6 @@ class CRM_ACL_DAO_ACLCache extends CRM_Core_DAO {
           'entity' => 'ACLCache',
           'bao' => 'CRM_ACL_DAO_ACLCache',
           'localizable' => 0,
-          'FKClassName' => 'CRM_Contact_DAO_Contact',
           'html' => [
             'type' => 'EntityRef',
           ],
@@ -228,6 +229,14 @@ class CRM_ACL_DAO_ACLCache extends CRM_Core_DAO {
    */
   public static function indices($localize = TRUE) {
     $indices = [
+      'index_contact_id' => [
+        'name' => 'index_contact_id',
+        'field' => [
+          0 => 'contact_id',
+        ],
+        'localizable' => FALSE,
+        'sig' => 'civicrm_acl_cache::0::contact_id',
+      ],
       'index_acl_id' => [
         'name' => 'index_acl_id',
         'field' => [
diff --git a/civicrm/CRM/ACL/DAO/EntityRole.php b/civicrm/CRM/ACL/DAO/EntityRole.php
index 9130d307ae4c3e1ea10b6bc2a382f48eb3525386..4e31bd8466f96b148a1edf85da78e58dae169b21 100644
--- a/civicrm/CRM/ACL/DAO/EntityRole.php
+++ b/civicrm/CRM/ACL/DAO/EntityRole.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/ACL/EntityRole.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:d985c951ef9a8872008576b41c1f2b9c)
+ * (GenCodeChecksum:c1087517beb5b266d4a1a0a1a342ced0)
  */
 
 /**
@@ -75,9 +75,12 @@ class CRM_ACL_DAO_EntityRole extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Entity Roles');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Entity Roles') : ts('Entity Role');
   }
 
   /**
diff --git a/civicrm/CRM/ACL/Form/ACL.php b/civicrm/CRM/ACL/Form/ACL.php
index de1665dcd4662305a8719393d8121c83f418d42c..1c7af2a0952fdc1a6267cd52c19ff1b50e2ea4b0 100644
--- a/civicrm/CRM/ACL/Form/ACL.php
+++ b/civicrm/CRM/ACL/Form/ACL.php
@@ -96,11 +96,12 @@ class CRM_ACL_Form_ACL extends CRM_Admin_Form {
 
     $this->add('text', 'name', ts('Description'), CRM_Core_DAO::getAttribute('CRM_ACL_DAO_ACL', 'name'), TRUE);
 
-    $operations = ['' => ts('- select -')] + CRM_ACL_BAO_ACL::operation();
     $this->add('select',
       'operation',
       ts('Operation'),
-      $operations, TRUE
+      CRM_ACL_BAO_ACL::operation(),
+      TRUE,
+      ['placeholder' => TRUE]
     );
 
     $objTypes = [
@@ -129,22 +130,22 @@ class CRM_ACL_Form_ACL extends CRM_Admin_Form {
     $this->add('select', 'entity_id', $label, $role, TRUE);
 
     $group = [
-      '-1' => ts('- select -'),
+      '-1' => ts('- select group -'),
       '0' => ts('All Groups'),
     ] + CRM_Core_PseudoConstant::group();
 
     $customGroup = [
-      '-1' => ts('- select -'),
+      '-1' => ts('- select set of custom fields -'),
       '0' => ts('All Custom Groups'),
     ] + CRM_Core_PseudoConstant::get('CRM_Core_DAO_CustomField', 'custom_group_id');
 
     $ufGroup = [
-      '-1' => ts('- select -'),
+      '-1' => ts('- select profile -'),
       '0' => ts('All Profiles'),
     ] + CRM_Core_PseudoConstant::get('CRM_Core_DAO_UFField', 'uf_group_id');
 
     $event = [
-      '-1' => ts('- select -'),
+      '-1' => ts('- select event -'),
       '0' => ts('All Events'),
     ] + CRM_Event_PseudoConstant::event(NULL, FALSE, "( is_template IS NULL OR is_template != 1 )");
 
diff --git a/civicrm/CRM/ACL/Form/EntityRole.php b/civicrm/CRM/ACL/Form/EntityRole.php
index d12686fe433e15881fd1e98e6e850be399125e02..7d599deff475046ed51064b7e029ab0450a4032f 100644
--- a/civicrm/CRM/ACL/Form/EntityRole.php
+++ b/civicrm/CRM/ACL/Form/EntityRole.php
@@ -26,9 +26,8 @@ class CRM_ACL_Form_EntityRole extends CRM_Admin_Form {
       return;
     }
 
-    $aclRoles = ['' => ts('- select -')] + CRM_Core_OptionGroup::values('acl_role');
     $this->add('select', 'acl_role_id', ts('ACL Role'),
-      $aclRoles, TRUE
+      CRM_Core_OptionGroup::values('acl_role'), TRUE, ['placeholder' => TRUE]
     );
 
     $label = ts('Assigned to');
diff --git a/civicrm/CRM/Activity/ActionMapping.php b/civicrm/CRM/Activity/ActionMapping.php
index 05abcf9e24c99c846f76da938a81dae38c80016b..9f73592644b7378f9dcacf92da3eb4fa76cd88d1 100644
--- a/civicrm/CRM/Activity/ActionMapping.php
+++ b/civicrm/CRM/Activity/ActionMapping.php
@@ -118,4 +118,12 @@ class CRM_Activity_ActionMapping extends \Civi\ActionSchedule\Mapping {
     return $query;
   }
 
+  /**
+   * Determine whether a schedule based on this mapping should
+   * send to additional contacts.
+   */
+  public function sendToAdditional($entityId): bool {
+    return TRUE;
+  }
+
 }
diff --git a/civicrm/CRM/Activity/BAO/Activity.php b/civicrm/CRM/Activity/BAO/Activity.php
index 40f6fdc906656c530692d0d9f7449555c8a43adf..8414c93660d9bc52369cc7f15430c5b935d8abd9 100644
--- a/civicrm/CRM/Activity/BAO/Activity.php
+++ b/civicrm/CRM/Activity/BAO/Activity.php
@@ -9,6 +9,8 @@
  +--------------------------------------------------------------------+
  */
 
+use Civi\Api4\ActivityContact;
+
 /**
  *
  * @package CRM
@@ -315,13 +317,8 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
       $params['assignee_contact_id'] = array_unique($params['assignee_contact_id']);
     }
 
-    // CRM-9137
-    if (!empty($params['id'])) {
-      CRM_Utils_Hook::pre('edit', 'Activity', $params['id'], $params);
-    }
-    else {
-      CRM_Utils_Hook::pre('create', 'Activity', NULL, $params);
-    }
+    $action = empty($params['id']) ? 'create' : 'edit';
+    CRM_Utils_Hook::pre($action, 'Activity', $params['id'] ?? NULL, $params);
 
     $activity->copyValues($params);
     if (isset($params['case_id'])) {
@@ -344,124 +341,79 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
     }
 
     $activityId = $activity->id;
-    $sourceID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Source');
-    $assigneeID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Assignees');
-    $targetID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Targets');
-
-    if (isset($params['source_contact_id'])) {
-      $acParams = [
-        'activity_id' => $activityId,
-        'contact_id' => $params['source_contact_id'],
-        'record_type_id' => $sourceID,
-      ];
-      self::deleteActivityContact($activityId, $sourceID);
-      CRM_Activity_BAO_ActivityContact::create($acParams);
-    }
-
-    // check and attach and files as needed
-    CRM_Core_BAO_File::processAttachment($params, 'civicrm_activity', $activityId);
-
-    // attempt to save activity assignment
-    $resultAssignment = NULL;
-    if (!empty($params['assignee_contact_id'])) {
-
-      $assignmentParams = ['activity_id' => $activityId];
+    $activityRecordTypes = [
+      'source_contact_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Source'),
+      'assignee_contact_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Assignees'),
+      'target_contact_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Targets'),
+    ];
 
-      if (is_array($params['assignee_contact_id'])) {
-        if (CRM_Utils_Array::value('deleteActivityAssignment', $params, TRUE)) {
-          // first delete existing assignments if any
-          self::deleteActivityContact($activityId, $assigneeID);
+    $activityContacts = [];
+    // Cast to an array if we just have an integer. Index by record type id.
+    foreach ($activityRecordTypes as $key => $recordTypeID) {
+      if (isset($params[$key])) {
+        if (empty($params[$key])) {
+          $activityContacts[$recordTypeID] = [];
         }
-
-        foreach ($params['assignee_contact_id'] as $acID) {
-          if ($acID) {
-            $assigneeParams = [
-              'activity_id' => $activityId,
-              'contact_id' => $acID,
-              'record_type_id' => $assigneeID,
-            ];
-            CRM_Activity_BAO_ActivityContact::create($assigneeParams);
+        else {
+          foreach ((array) $params[$key] as $contactID) {
+            $activityContacts[$recordTypeID][$contactID] = (int) $contactID;
           }
         }
       }
-      else {
-        $assignmentParams['contact_id'] = $params['assignee_contact_id'];
-        $assignmentParams['record_type_id'] = $assigneeID;
-        if (!empty($params['id'])) {
-          $assignment = new CRM_Activity_BAO_ActivityContact();
-          $assignment->activity_id = $activityId;
-          $assignment->record_type_id = $assigneeID;
-          $assignment->find(TRUE);
-
-          if ($assignment->contact_id != $params['assignee_contact_id']) {
-            $assignmentParams['id'] = $assignment->id;
-            $resultAssignment = CRM_Activity_BAO_ActivityContact::create($assignmentParams);
-          }
+    }
+
+    if ($action === 'edit' && !empty($activityContacts)) {
+      $wheres = [];
+      foreach ($activityContacts as $recordTypeID => $contactIDs) {
+        if (!empty($contactIDs)) {
+          $wheres[$key] = "(record_type_id = $recordTypeID AND contact_id IN (" . implode(',', $contactIDs) . '))';
         }
-        else {
-          $resultAssignment = CRM_Activity_BAO_ActivityContact::create($assignmentParams);
+      }
+      $existingArray = empty($wheres) ? [] : CRM_Core_DAO::executeQuery("
+        SELECT id, contact_id, record_type_id
+        FROM civicrm_activity_contact
+        WHERE activity_id = %1
+          AND (" . implode(' OR ', $wheres) . ')',
+      [1 => [$params['id'], 'Integer']])->fetchAll();
+
+      $recordsToKeep = [];
+      $wheres = [['activity_id', '=', $params['id']], ['record_type_id', 'IN', array_keys($activityContacts)]];
+
+      foreach ($existingArray as $existingRecords) {
+        $recordsToKeep[$existingRecords['id']] = ['contact_id' => $existingRecords['contact_id'], 'record_type_id' => $existingRecords['record_type_id']];
+        unset($activityContacts[$recordTypeID][$existingRecords['contact_id']]);
+        if (empty($activityContacts[$recordTypeID])) {
+          // If we just removed the last one to update then also unset the key.
+          unset($activityContacts[$recordTypeID]);
         }
       }
-    }
-    else {
-      if (CRM_Utils_Array::value('deleteActivityAssignment', $params, TRUE)) {
-        self::deleteActivityContact($activityId, $assigneeID);
+
+      if (!empty($recordsToKeep)) {
+        $wheres[] = ['id', 'NOT IN', array_keys($recordsToKeep)];
       }
-    }
 
-    if (is_a($resultAssignment, 'CRM_Core_Error')) {
-      $transaction->rollback();
-      return $resultAssignment;
+      // Delete all existing records for the types to be updated. Do a quick check to make sure there
+      // is at least one to avoid a delete query if not necessary (delete queries are more likely to cause contention).
+      if (ActivityContact::get($params['check_permissions'] ?? FALSE)->setLimit(1)->setWhere($wheres)->selectRowCount()->execute()) {
+        ActivityContact::delete($params['check_permissions'] ?? FALSE)->setWhere($wheres)->execute();
+      }
     }
 
-    // attempt to save activity targets
-    $resultTarget = NULL;
-    if (!empty($params['target_contact_id'])) {
-
-      $targetParams = ['activity_id' => $activityId];
-      $resultTarget = [];
-      if (is_array($params['target_contact_id'])) {
-        if (CRM_Utils_Array::value('deleteActivityTarget', $params, TRUE)) {
-          // first delete existing targets if any
-          self::deleteActivityContact($activityId, $targetID);
-        }
-
-        foreach ($params['target_contact_id'] as $tid) {
-          if ($tid) {
-            $targetContactParams = [
-              'activity_id' => $activityId,
-              'contact_id' => $tid,
-              'record_type_id' => $targetID,
-            ];
-            CRM_Activity_BAO_ActivityContact::create($targetContactParams);
-          }
-        }
-      }
-      else {
-        $targetParams['contact_id'] = $params['target_contact_id'];
-        $targetParams['record_type_id'] = $targetID;
-        if (!empty($params['id'])) {
-          $target = new CRM_Activity_BAO_ActivityContact();
-          $target->activity_id = $activityId;
-          $target->record_type_id = $targetID;
-          $target->find(TRUE);
-
-          if ($target->contact_id != $params['target_contact_id']) {
-            $targetParams['id'] = $target->id;
-            $resultTarget = CRM_Activity_BAO_ActivityContact::create($targetParams);
-          }
-        }
-        else {
-          $resultTarget = CRM_Activity_BAO_ActivityContact::create($targetParams);
-        }
+    $activityContactApiValues = [];
+    foreach ($activityContacts as $recordTypeID => $contactIDs) {
+      foreach ($contactIDs as $contactID) {
+        $activityContactApiValues[] = ['record_type_id' => $recordTypeID, 'contact_id' => $contactID];
       }
     }
-    else {
-      if (CRM_Utils_Array::value('deleteActivityTarget', $params, TRUE)) {
-        self::deleteActivityContact($activityId, $targetID);
-      }
+
+    if (!empty($activityContactApiValues)) {
+      ActivityContact::save($params['check_permissions'] ?? FALSE)->addDefault('activity_id', $activityId)
+        ->setRecords($activityContactApiValues)->execute();
     }
 
+    // check and attach and files as needed
+    CRM_Core_BAO_File::processAttachment($params, 'civicrm_activity', $activityId);
+
     // write to changelog before transaction is committed/rolled
     // back (and prepare status to display)
     if (!empty($params['id'])) {
@@ -607,13 +559,7 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity {
         self::logActivityAction($activity, "Case details for {$matches[1]} not found while recording an activity on case.");
       }
     }
-    if (!empty($params['id'])) {
-      CRM_Utils_Hook::post('edit', 'Activity', $activity->id, $activity);
-    }
-    else {
-      CRM_Utils_Hook::post('create', 'Activity', $activity->id, $activity);
-    }
-
+    CRM_Utils_Hook::post($action, 'Activity', $activity->id, $activity);
     return $result;
   }
 
@@ -1694,21 +1640,12 @@ WHERE      activity.id IN ($activityIds)";
    */
   public static function addActivity(
     $activity,
-    $activityType = 'Membership Signup',
+    $activityType,
     $targetContactID = NULL,
     $params = []
   ) {
     $date = date('YmdHis');
-    if ($activity->__table == 'civicrm_membership') {
-      $component = 'Membership';
-    }
-    elseif ($activity->__table == 'civicrm_participant') {
-      if ($activityType != 'Email') {
-        $activityType = 'Event Registration';
-      }
-      $component = 'Event';
-    }
-    elseif ($activity->__table == 'civicrm_contribution') {
+    if ($activity->__table == 'civicrm_contribution') {
       // create activity record only for Completed Contributions
       $contributionCompletedStatusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
       if ($activity->contribution_status_id != $contributionCompletedStatusId) {
@@ -1718,7 +1655,6 @@ WHERE      activity.id IN ($activityIds)";
         }
         $params['status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_status_id', 'Scheduled');
       }
-      $activityType = $component = 'Contribution';
 
       // retrieve existing activity based on source_record_id and activity_type
       if (empty($params['id'])) {
@@ -1732,7 +1668,7 @@ WHERE      activity.id IN ($activityIds)";
         $params['campaign_id'] = $activity->campaign_id;
       }
 
-      $date = CRM_Utils_Date::isoToMysql($activity->receive_date);
+      $date = $activity->receive_date;
     }
 
     $activityParams = [
@@ -1772,7 +1708,7 @@ WHERE      activity.id IN ($activityIds)";
     // @todo - use api - remove lots of wrangling above. Remove deprecated fatal & let form layer
     // deal with any exceptions.
     if (is_a(self::create($activityParams), 'CRM_Core_Error')) {
-      throw new CRM_Core_Exception("Failed creating Activity for $component of id {$activity->id}");
+      throw new CRM_Core_Exception("Failed creating Activity of type $activityType for entity id {$activity->id}");
     }
   }
 
@@ -2630,7 +2566,7 @@ INNER JOIN  civicrm_option_group grp ON (grp.id = option_group_id AND grp.name =
             }
           }
         }
-        elseif (!$values['target_contact_name']) {
+        elseif (empty($values['target_contact_name'])) {
           $activity['target_contact_name'] = '<em>n/a</em>';
         }
 
diff --git a/civicrm/CRM/Activity/BAO/ActivityContact.php b/civicrm/CRM/Activity/BAO/ActivityContact.php
index 527e664da5da8d3230cd73d76d63cdb05e17f0c3..6efa32ab9dddfc913d712d7191fe6b35395825e6 100644
--- a/civicrm/CRM/Activity/BAO/ActivityContact.php
+++ b/civicrm/CRM/Activity/BAO/ActivityContact.php
@@ -37,13 +37,22 @@ class CRM_Activity_BAO_ActivityContact extends CRM_Activity_DAO_ActivityContact
    *   activity_contact object
    */
   public static function create($params) {
+    $errorScope = CRM_Core_TemporaryErrorScope::useException();
     $activityContact = new CRM_Activity_DAO_ActivityContact();
-
     $activityContact->copyValues($params);
-    if (!$activityContact->find(TRUE)) {
+    try {
       return $activityContact->save();
     }
-    return $activityContact;
+    catch (PEAR_Exception $e) {
+      // This check used to be done first, creating an extra query before each insert.
+      // However, in none of the core tests was this ever called with values that already
+      // existed, meaning that this line would never or almost never be hit.
+      // hence it's better to save the select query here.
+      if ($activityContact->find(TRUE)) {
+        return $activityContact;
+      }
+      throw $e;
+    }
   }
 
   /**
diff --git a/civicrm/CRM/Activity/BAO/Query.php b/civicrm/CRM/Activity/BAO/Query.php
index d432467e8d40c2ad7f176fff366af0aace58cb45..0aa2df666a3fcbbaa89ca9aba6a1e558d41f9734 100644
--- a/civicrm/CRM/Activity/BAO/Query.php
+++ b/civicrm/CRM/Activity/BAO/Query.php
@@ -478,7 +478,7 @@ class CRM_Activity_BAO_Query {
           'multiple' =>
           'multiple',
           'class' => 'crm-select2',
-          'placeholder' => ts('- select -'),
+          'placeholder' => ts('- select tags -'),
         ]
       );
     }
diff --git a/civicrm/CRM/Activity/Controller/Search.php b/civicrm/CRM/Activity/Controller/Search.php
index 21ad61932c161c3d39980ca00ddabbbc8691ead2..226305d1692e6e0e7f14893c1a08a478c7679fd7 100644
--- a/civicrm/CRM/Activity/Controller/Search.php
+++ b/civicrm/CRM/Activity/Controller/Search.php
@@ -28,6 +28,8 @@
  */
 class CRM_Activity_Controller_Search extends CRM_Core_Controller {
 
+  protected $entity = 'Activity';
+
   /**
    * Class constructor.
    *
@@ -46,6 +48,7 @@ class CRM_Activity_Controller_Search extends CRM_Core_Controller {
 
     // Add all the actions.
     $this->addActions();
+    $this->set('entity', $this->entity);
   }
 
   /**
diff --git a/civicrm/CRM/Activity/DAO/Activity.php b/civicrm/CRM/Activity/DAO/Activity.php
index 03ad751cd6b738217b822db35492b5956a3b0996..26f50e0b5f652bb5d1e2df9557dfbf7b49e10ca8 100644
--- a/civicrm/CRM/Activity/DAO/Activity.php
+++ b/civicrm/CRM/Activity/DAO/Activity.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Activity/Activity.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:cbcbcbb6720f015deae4097b01196c9a)
+ * (GenCodeChecksum:c1b4cc908c0220abf69f57d281eeda95)
  */
 
 /**
@@ -226,9 +226,12 @@ class CRM_Activity_DAO_Activity extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Activities');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Activities') : ts('Activity');
   }
 
   /**
diff --git a/civicrm/CRM/Activity/DAO/ActivityContact.php b/civicrm/CRM/Activity/DAO/ActivityContact.php
index 61676f395b5f4f890305e51fdb8304fe70d48f02..fd6633a19111ab1c04130dc0898548582db81f0d 100644
--- a/civicrm/CRM/Activity/DAO/ActivityContact.php
+++ b/civicrm/CRM/Activity/DAO/ActivityContact.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Activity/ActivityContact.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:777598f3625dfeaf37a81de282808c60)
+ * (GenCodeChecksum:60851972b9f03efb52350929e557c768)
  */
 
 /**
@@ -68,9 +68,12 @@ class CRM_Activity_DAO_ActivityContact extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Activity Contacts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Activity Contacts') : ts('Activity Contact');
   }
 
   /**
diff --git a/civicrm/CRM/Activity/Form/Activity.php b/civicrm/CRM/Activity/Form/Activity.php
index 329e330960674c16ecba3fbbb74c1fcc253934ca..c6b07c4a397dbe7ba522f5b65b8f7d61a722cb9d 100644
--- a/civicrm/CRM/Activity/Form/Activity.php
+++ b/civicrm/CRM/Activity/Form/Activity.php
@@ -503,7 +503,7 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
     }
 
     if ($this->_action & CRM_Core_Action::VIEW) {
-      $this->_values['details'] = CRM_Utils_String::purifyHtml($this->_values['details']);
+      $this->_values['details'] = CRM_Utils_String::purifyHtml($this->_values['details'] ?? '');
       $url = CRM_Utils_System::url(implode("/", $this->urlPath), "reset=1&id={$this->_activityId}&action=view&cid={$this->_values['source_contact_id']}");
       CRM_Utils_Recent::add(CRM_Utils_Array::value('subject', $this->_values, ts('(no subject)')),
         $url,
@@ -628,10 +628,11 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
     $this->assign('suppressForm', FALSE);
 
     $element = $this->add('select', 'activity_type_id', ts('Activity Type'),
-      ['' => '- ' . ts('select') . ' -'] + $this->_fields['followup_activity_type_id']['attributes'],
+      $this->_fields['followup_activity_type_id']['attributes'],
       FALSE, [
         'onchange' => "CRM.buildCustomData( 'Activity', this.value, false, false, false, false, false, false, {$this->_currentlyViewedContactId});",
         'class' => 'crm-select2 required',
+        'placeholder' => TRUE,
       ]
     );
 
@@ -695,7 +696,8 @@ class CRM_Activity_Form_Activity extends CRM_Contact_Form_Task {
         $responseOptions = CRM_Campaign_BAO_Survey::getResponsesOptions($surveyId);
         if ($responseOptions) {
           $this->add('select', 'result', ts('Result'),
-            ['' => ts('- select -')] + array_combine($responseOptions, $responseOptions)
+            array_combine($responseOptions, $responseOptions),
+            FALSE, ['placeholder' => TRUE]
           );
         }
         $surveyTitle = NULL;
diff --git a/civicrm/CRM/Activity/Form/Task.php b/civicrm/CRM/Activity/Form/Task.php
index 462499c38fd338b1bb705f2f9e200413cd1c96e7..3be85d5bc3025648c3dd67e80dce747db8142542 100644
--- a/civicrm/CRM/Activity/Form/Task.php
+++ b/civicrm/CRM/Activity/Form/Task.php
@@ -38,18 +38,16 @@ class CRM_Activity_Form_Task extends CRM_Core_Form_Task {
   /**
    * Common pre-process function.
    *
-   * @param CRM_Core_Form $form
+   * @param \CRM_Core_Form_Task $form
    *
    * @throws \CRM_Core_Exception
    */
   public static function preProcessCommon(&$form) {
     $form->_activityHolderIds = [];
 
-    $values = $form->controller->exportValues($form->get('searchFormName'));
+    $values = $form->getSearchFormValues();
 
     $form->_task = $values['task'];
-    $activityTasks = CRM_Activity_Task::tasks();
-    $form->assign('taskName', $activityTasks[$form->_task]);
 
     $ids = [];
     if ($values['radio_ts'] == 'ts_sel') {
diff --git a/civicrm/CRM/Activity/Form/Task/SearchTaskHookSample.php b/civicrm/CRM/Activity/Form/Task/SearchTaskHookSample.php
deleted file mode 100644
index 003dd58c7e2be660b24f85f3416f4dd614d04eed..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Activity/Form/Task/SearchTaskHookSample.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
- */
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- */
-
-/**
- * This class provides the functionality to save a search
- * Saved Searches are used for saving frequently used queries
- */
-class CRM_Activity_Form_Task_SearchTaskHookSample extends CRM_Activity_Form_Task {
-
-  /**
-   * Build all the data structures needed to build the form.
-   */
-  public function preProcess() {
-    parent::preProcess();
-    $rows = [];
-    // display name and activity details of all selected contacts
-    $activityIDs = implode(',', $this->_activityHolderIds);
-
-    $activityContacts = CRM_Activity_BAO_ActivityContact::buildOptions('record_type_id', 'validate');
-    $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
-    $query = "
-    SELECT at.subject      as subject,
-           ov.label        as activity_type,
-           at.activity_date_time as activity_date,
-           ct.display_name as display_name
-      FROM civicrm_activity at
-LEFT JOIN  civicrm_activity_contact ac ON ( ac.activity_id = at.id AND ac.record_type_id = {$sourceID} )
-INNER JOIN civicrm_contact ct ON ( ac.contact_id = ct.id )
- LEFT JOIN civicrm_option_group og ON ( og.name = 'activity_type' )
- LEFT JOIN civicrm_option_value ov ON (at.activity_type_id = ov.value AND og.id = ov.option_group_id )
-     WHERE at.id IN ( $activityIDs )";
-
-    $dao = CRM_Core_DAO::executeQuery($query);
-
-    while ($dao->fetch()) {
-      $rows[] = [
-        'subject' => $dao->subject,
-        'activity_type' => $dao->activity_type,
-        'activity_date' => $dao->activity_date,
-        'display_name' => $dao->display_name,
-      ];
-    }
-    $this->assign('rows', $rows);
-  }
-
-  /**
-   * Build the form object.
-   */
-  public function buildQuickForm() {
-    $this->addButtons([
-      [
-        'type' => 'done',
-        'name' => ts('Done'),
-        'isDefault' => TRUE,
-      ],
-    ]);
-  }
-
-}
diff --git a/civicrm/CRM/Activity/Page/AJAX.php b/civicrm/CRM/Activity/Page/AJAX.php
index 65262d50f96fda6c3b6b53871aed2d2c86a6a2e9..f61df22bb47834308f3fa2e0efca83fadbee8bbb 100644
--- a/civicrm/CRM/Activity/Page/AJAX.php
+++ b/civicrm/CRM/Activity/Page/AJAX.php
@@ -275,7 +275,7 @@ class CRM_Activity_Page_AJAX {
     if (!$otherActivity->find(TRUE)) {
       return (['error_msg' => 'activity record is missing.']);
     }
-    $actDateTime = CRM_Utils_Date::isoToMysql($otherActivity->activity_date_time);
+    $actDateTime = $otherActivity->activity_date_time;
 
     // Create new activity record.
     $mainActivity = new CRM_Activity_DAO_Activity();
diff --git a/civicrm/CRM/Activity/Tokens.php b/civicrm/CRM/Activity/Tokens.php
index fff8e6224a507fe684cf1465cbf0881d7365ca91..250f88a38dcdaae418f169cd54d15fdabfa33742 100644
--- a/civicrm/CRM/Activity/Tokens.php
+++ b/civicrm/CRM/Activity/Tokens.php
@@ -134,7 +134,7 @@ class CRM_Activity_Tokens extends \Civi\Token\AbstractTokenSubscriber {
 
     $activity = (object) $prefetch['activity'][$activityId];
 
-    if (in_array($field, ['activity_date_time', 'created_date'])) {
+    if (in_array($field, ['activity_date_time', 'created_date', 'modified_date'])) {
       $row->tokens($entity, $field, \CRM_Utils_Date::customFormat($activity->$field));
     }
     elseif (isset($mapping[$field]) and (isset($activity->{$mapping[$field]}))) {
@@ -179,11 +179,12 @@ class CRM_Activity_Tokens extends \Civi\Token\AbstractTokenSubscriber {
         'subject' => ts('Activity Subject'),
         'details' => ts('Activity Details'),
         'activity_date_time' => ts('Activity Date-Time'),
+        'created_date' => ts('Activity Created Date'),
+        'modified_date' => ts('Activity Modified Date'),
         'activity_type_id' => ts('Activity Type ID'),
         'status' => ts('Activity Status'),
         'status_id' => ts('Activity Status ID'),
         'location' => ts('Activity Location'),
-        'created_date' => ts('Activity Creation Date'),
         'duration' => ts('Activity Duration'),
         'campaign' => ts('Activity Campaign'),
         'campaign_id' => ts('Activity Campaign ID'),
diff --git a/civicrm/CRM/Admin/Form/Job.php b/civicrm/CRM/Admin/Form/Job.php
index 65bb09710e2ab6b2609258c8bada34cbe870435a..2738c1b49c17da4ccf19c8f73ae763044511eafe 100644
--- a/civicrm/CRM/Admin/Form/Job.php
+++ b/civicrm/CRM/Admin/Form/Job.php
@@ -24,6 +24,7 @@ class CRM_Admin_Form_Job extends CRM_Admin_Form {
   public function preProcess() {
 
     parent::preProcess();
+    $this->setContext();
 
     CRM_Utils_System::setTitle(ts('Manage - Scheduled Jobs'));
 
@@ -100,7 +101,7 @@ class CRM_Admin_Form_Job extends CRM_Admin_Form {
     $this->add('datepicker', 'scheduled_run_date', ts('Scheduled Run Date'), NULL, FALSE, ['minDate' => date('Y-m-d')]);
 
     $this->add('textarea', 'parameters', ts('Command parameters'),
-      "cols=50 rows=6"
+      ['cols' => 50, 'rows' => 6]
     );
 
     // is this job active ?
@@ -194,7 +195,15 @@ class CRM_Admin_Form_Job extends CRM_Admin_Form {
       $jm->executeJobById($this->_id);
       $jobName = self::getJobName($this->_id);
       CRM_Core_Session::setStatus(ts('%1 Scheduled Job has been executed. See the log for details.', [1 => $jobName]), ts("Executed"), "success");
-      CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/admin/job', 'reset=1'));
+
+      if ($this->getContext() === 'joblog') {
+        // If we were triggered via the joblog form redirect back there when we finish
+        $redirectUrl = CRM_Utils_System::url('civicrm/admin/joblog', 'reset=1&jid=' . $this->_id);
+      }
+      else {
+        $redirectUrl = CRM_Utils_System::url('civicrm/admin/job', 'reset=1');
+      }
+      CRM_Utils_System::redirect($redirectUrl);
       return;
     }
 
diff --git a/civicrm/CRM/Admin/Form/MailSettings.php b/civicrm/CRM/Admin/Form/MailSettings.php
index 4de49fe41356d291fc316ffdf86127b0ac08e401..70c227b1ede4f976e260ce4a8e65808b81b17487 100644
--- a/civicrm/CRM/Admin/Form/MailSettings.php
+++ b/civicrm/CRM/Admin/Form/MailSettings.php
@@ -70,6 +70,9 @@ class CRM_Admin_Form_MailSettings extends CRM_Admin_Form {
     ];
     $this->add('select', 'is_default', ts('Used For?'), $usedfor);
     $this->addField('activity_status', ['placeholder' => FALSE]);
+
+    $this->add('checkbox', 'is_non_case_email_skipped', ts('Skip emails which do not have a Case ID or Case hash'));
+    $this->add('checkbox', 'is_contact_creation_disabled_if_no_match', ts('Do not create new contacts when filing emails'));
   }
 
   /**
@@ -146,6 +149,8 @@ class CRM_Admin_Form_MailSettings extends CRM_Admin_Form {
       'is_ssl',
       'is_default',
       'activity_status',
+      'is_non_case_email_skipped',
+      'is_contact_creation_disabled_if_no_match',
     ];
 
     $params = [];
@@ -153,6 +158,8 @@ class CRM_Admin_Form_MailSettings extends CRM_Admin_Form {
       if (in_array($f, [
         'is_default',
         'is_ssl',
+        'is_non_case_email_skipped',
+        'is_contact_creation_disabled_if_no_match',
       ])) {
         $params[$f] = CRM_Utils_Array::value($f, $formValues, FALSE);
       }
@@ -164,7 +171,7 @@ class CRM_Admin_Form_MailSettings extends CRM_Admin_Form {
     $params['domain_id'] = CRM_Core_Config::domainID();
 
     // assign id only in update mode
-    $status = ts('Your New  Email Settings have been saved.');
+    $status = ts('Your New Email Settings have been saved.');
     if ($this->_action & CRM_Core_Action::UPDATE) {
       $params['id'] = $this->_id;
       $status = ts('Your Email Settings have been updated.');
diff --git a/civicrm/CRM/Admin/Form/MessageTemplates.php b/civicrm/CRM/Admin/Form/MessageTemplates.php
index 5f809f25beddd1ce466f51e926583af61a60226f..47567b4742741093626ed2d3a51fe3ed52da2c4b 100644
--- a/civicrm/CRM/Admin/Form/MessageTemplates.php
+++ b/civicrm/CRM/Admin/Form/MessageTemplates.php
@@ -179,7 +179,7 @@ class CRM_Admin_Form_MessageTemplates extends CRM_Core_Form {
       )
     ) {
       $this->add('textarea', 'msg_html', ts('HTML Message'),
-        "cols=50 rows=6"
+        ['cols' => 50, 'rows' => 6]
       );
     }
     else {
@@ -194,7 +194,7 @@ class CRM_Admin_Form_MessageTemplates extends CRM_Core_Form {
     }
 
     $this->add('textarea', 'msg_text', ts('Text Message'),
-      "cols=50 rows=6"
+      ['cols' => 50, 'rows' => 6]
     );
 
     $this->add('select', 'pdf_format_id', ts('PDF Page Format'),
diff --git a/civicrm/CRM/Admin/Form/OptionGroup.php b/civicrm/CRM/Admin/Form/OptionGroup.php
index af8ca876340c3d770274e8b912c961d8f0d20fe9..2a5ec115a29ccf2bd3beacc86604b1409524335d 100644
--- a/civicrm/CRM/Admin/Form/OptionGroup.php
+++ b/civicrm/CRM/Admin/Form/OptionGroup.php
@@ -133,7 +133,7 @@ class CRM_Admin_Form_OptionGroup extends CRM_Admin_Form {
       }
 
       $optionGroup = CRM_Core_BAO_OptionGroup::add($params);
-      CRM_Core_Session::setStatus(ts('The Option Group \'%1\' has been saved.', [1 => $optionGroup->name]), ts('Saved'), 'success');
+      CRM_Core_Session::setStatus(ts('The Option Group \'%1\' has been saved.', [1 => $optionGroup->title]), ts('Saved'), 'success');
     }
   }
 
diff --git a/civicrm/CRM/Admin/Form/PdfFormats.php b/civicrm/CRM/Admin/Form/PdfFormats.php
index 0ec9042d5839da110292f952ef27294fc05baaca..1f7c10a0f50ceb8854df64679bb9fbd15c7174f2 100644
--- a/civicrm/CRM/Admin/Form/PdfFormats.php
+++ b/civicrm/CRM/Admin/Form/PdfFormats.php
@@ -67,7 +67,7 @@ class CRM_Admin_Form_PdfFormats extends CRM_Admin_Form {
       ['onChange' => "selectPaper( this.value );"]
     );
 
-    $this->add('static', 'paper_dimensions', NULL, ts('Width x Height'));
+    $this->add('static', 'paper_dimensions', ts('Width x Height'));
     $this->add('select', 'orientation', ts('Orientation'), CRM_Core_BAO_PdfFormat::getPageOrientations(), FALSE,
       ['onChange' => "updatePaperDimensions();"]
     );
diff --git a/civicrm/CRM/Admin/Form/Preferences/Display.php b/civicrm/CRM/Admin/Form/Preferences/Display.php
index 775fa2c04ec57cd741a37d0f837fc4884a88ce70..0716cdebd233bd0286546e939b66d674702047af 100644
--- a/civicrm/CRM/Admin/Form/Preferences/Display.php
+++ b/civicrm/CRM/Admin/Form/Preferences/Display.php
@@ -50,7 +50,17 @@ class CRM_Admin_Form_Preferences_Display extends CRM_Admin_Form_Preferences {
     $invoiceSettings = Civi::settings()->get('contribution_invoice_settings');
     $this->assign('invoicing', CRM_Invoicing_Utils::isInvoicingEnabled());
 
-    $this->addElement('submit', 'ckeditor_config', ts('Configure CKEditor'));
+    $this->addElement(
+      'xbutton',
+      'ckeditor_config',
+      CRM_Core_Page::crmIcon('fa-wrench') . ' ' . ts('Configure CKEditor'),
+      [
+        'type' => 'submit',
+        'class' => 'crm-button',
+        'style' => 'display:inline-block;vertical-align:middle;float:none!important;',
+        'value' => 1,
+      ]
+    );
 
     $editOptions = CRM_Core_OptionGroup::values('contact_edit_options', FALSE, FALSE, FALSE, 'AND v.filter = 0');
     $this->assign('editOptions', $editOptions);
diff --git a/civicrm/CRM/Admin/Form/Setting/Smtp.php b/civicrm/CRM/Admin/Form/Setting/Smtp.php
index da909c7f0877817e205df640f1c17df749179c8e..79e0da4f7782a131935ad6b8b2a2f77bdeb49738 100644
--- a/civicrm/CRM/Admin/Form/Setting/Smtp.php
+++ b/civicrm/CRM/Admin/Form/Setting/Smtp.php
@@ -61,7 +61,12 @@ class CRM_Admin_Form_Setting_Smtp extends CRM_Admin_Form_Setting {
     $this->addFormRule(['CRM_Admin_Form_Setting_Smtp', 'formRule']);
     parent::buildQuickForm();
     $buttons = $this->getElement('buttons')->getElements();
-    $buttons[] = $this->createElement('submit', $this->_testButtonName, ts('Save & Send Test Email'), ['crm-icon' => 'fa-envelope-o']);
+    $buttons[] = $this->createElement(
+      'xbutton',
+      $this->_testButtonName,
+      CRM_Core_Page::crmIcon('fa-envelope-o') . ' ' . ts('Save & Send Test Email'),
+      ['type' => 'submit']
+    );
     $this->getElement('buttons')->setElements($buttons);
 
     if (!empty($setStatus)) {
diff --git a/civicrm/CRM/Admin/Page/ConfigTaskList.php b/civicrm/CRM/Admin/Page/ConfigTaskList.php
index ab7e91de6112f4027258df5654e9f9a0ac7e89a1..32a84a32ebc9008099216371374cab062067490d 100644
--- a/civicrm/CRM/Admin/Page/ConfigTaskList.php
+++ b/civicrm/CRM/Admin/Page/ConfigTaskList.php
@@ -50,6 +50,14 @@ class CRM_Admin_Page_ConfigTaskList extends CRM_Core_Page {
     foreach ($result['values'][0]['enable_components'] as $component) {
       $enabled[$component] = 1;
     }
+
+    // Create an array of translated Component titles to use as part of links on the page.
+    $translatedComponents = CRM_Core_Component::getNames(TRUE);
+    $translatedTitles = [];
+    foreach (CRM_Core_Component::getNames() as $key => $component) {
+      $translatedTitles[$component] = $translatedComponents[$key];
+    }
+    $this->assign('componentTitles', $translatedTitles);
     $this->assign('enabledComponents', $enabled);
 
     return parent::run();
diff --git a/civicrm/CRM/Admin/Page/Job.php b/civicrm/CRM/Admin/Page/Job.php
index 2164d2b7cefa57fd7c6531b9b6243d2933abf7cd..5a8d30767c570fcbc86885b991cd37f9abb7dfaf 100644
--- a/civicrm/CRM/Admin/Page/Job.php
+++ b/civicrm/CRM/Admin/Page/Job.php
@@ -117,6 +117,9 @@ class CRM_Admin_Page_Job extends CRM_Core_Page_Basic {
     $this->_action = CRM_Utils_Request::retrieve('action', 'String',
       $this, FALSE, 0
     );
+    $this->_context = CRM_Utils_Request::retrieve('context', 'String',
+      $this, FALSE, 0
+    );
 
     if (($this->_action & CRM_Core_Action::COPY) && (!empty($this->_id))) {
       try {
diff --git a/civicrm/CRM/Admin/Page/JobLog.php b/civicrm/CRM/Admin/Page/JobLog.php
index c7b1226535f9274e0f4b7a328b529b5773e371eb..e31a52558d6fd66fbf18688adf44c0d25554f813 100644
--- a/civicrm/CRM/Admin/Page/JobLog.php
+++ b/civicrm/CRM/Admin/Page/JobLog.php
@@ -73,17 +73,17 @@ class CRM_Admin_Page_JobLog extends CRM_Core_Page_Basic {
    * Browse all jobs.
    */
   public function browse() {
-    $jid = CRM_Utils_Request::retrieve('jid', 'Positive', $this);
+    $jid = CRM_Utils_Request::retrieve('jid', 'Positive');
 
     $sj = new CRM_Core_JobManager();
 
-    $jobName = NULL;
     if ($jid) {
       $jobName = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Job', $jid);
+      $this->assign('jobName', $jobName);
+      $jobRunUrl = CRM_Utils_System::url('civicrm/admin/job', 'action=view&reset=1&context=joblog&id=' . $jid);
+      $this->assign('jobRunUrl', $jobRunUrl);
     }
 
-    $this->assign('jobName', $jobName);
-
     $dao = new CRM_Core_DAO_JobLog();
     $dao->orderBy('id desc');
 
diff --git a/civicrm/CRM/Api4/Page/Api4Explorer.php b/civicrm/CRM/Api4/Page/Api4Explorer.php
index 6de079bb8f157d879ffe80a539372fbebc5396ff..d78ef91ddc55f2bed46234918e364f28db171fd7 100644
--- a/civicrm/CRM/Api4/Page/Api4Explorer.php
+++ b/civicrm/CRM/Api4/Page/Api4Explorer.php
@@ -40,9 +40,9 @@ class CRM_Api4_Page_Api4Explorer extends CRM_Core_Page {
       'groupOptions' => array_column((array) $groupOptions, 'options', 'name'),
     ];
     Civi::resources()
+      ->addBundle('bootstrap3')
       ->addVars('api4', $vars)
       ->addPermissions(['access debug output', 'edit groups', 'administer reserved groups'])
-      ->addScriptFile('civicrm', 'js/load-bootstrap.js')
       ->addScriptFile('civicrm', 'bower_components/js-yaml/dist/js-yaml.min.js')
       ->addScriptFile('civicrm', 'bower_components/marked/marked.min.js')
       ->addScriptFile('civicrm', 'bower_components/google-code-prettify/bin/prettify.min.js')
diff --git a/civicrm/CRM/Batch/DAO/Batch.php b/civicrm/CRM/Batch/DAO/Batch.php
index f2571b674f8361eb9a1e159e5e11bf42da969857..7e153f47861e85c1a057bcbe19d6b14669ee704f 100644
--- a/civicrm/CRM/Batch/DAO/Batch.php
+++ b/civicrm/CRM/Batch/DAO/Batch.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Batch/Batch.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8169fc2f338afc4a163214c0018030be)
+ * (GenCodeChecksum:29e187971d03eba3ce5e3848f2ea1a5b)
  */
 
 /**
@@ -157,9 +157,12 @@ class CRM_Batch_DAO_Batch extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Batches');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Batches') : ts('Batch');
   }
 
   /**
diff --git a/civicrm/CRM/Batch/DAO/EntityBatch.php b/civicrm/CRM/Batch/DAO/EntityBatch.php
index 6c697fb37073e0571bf4f1ca832bb11e512157dd..f7e2fffb74bd1ec85a762ae43aef7f7d56cb41a0 100644
--- a/civicrm/CRM/Batch/DAO/EntityBatch.php
+++ b/civicrm/CRM/Batch/DAO/EntityBatch.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Batch/EntityBatch.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6b6bd1337d9011c2a262de0e62c1e8e1)
+ * (GenCodeChecksum:aaeb317f89d831d683f53e7c45e1b175)
  */
 
 /**
@@ -68,9 +68,12 @@ class CRM_Batch_DAO_EntityBatch extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Entity Batches');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Entity Batches') : ts('Entity Batch');
   }
 
   /**
diff --git a/civicrm/CRM/Batch/Form/Entry.php b/civicrm/CRM/Batch/Form/Entry.php
index e60ababdb45cb910fe6a7ee20aa794e54c5e4d70..35c407a79f267102716643a7d1e62d989d065c35 100644
--- a/civicrm/CRM/Batch/Form/Entry.php
+++ b/civicrm/CRM/Batch/Form/Entry.php
@@ -173,9 +173,14 @@ class CRM_Batch_Form_Entry extends CRM_Core_Form {
     // add the force save button
     $forceSave = $this->getButtonName('upload', 'force');
 
-    $this->addElement('submit',
+    $this->addElement('xbutton',
       $forceSave,
-      ts('Ignore Mismatch & Process the Batch?')
+      ts('Ignore Mismatch & Process the Batch?'),
+      [
+        'type' => 'submit',
+        'value' => 1,
+        'class' => 'crm-button crm-button_qf_Entry_upload_force-save',
+      ]
     );
 
     $this->addButtons([
diff --git a/civicrm/CRM/Campaign/Controller/Search.php b/civicrm/CRM/Campaign/Controller/Search.php
index 8089ddd23fc371c3d73d628a30d1e320bea89836..520c3f9442b73eb44f0b79c06136eae532e422fb 100644
--- a/civicrm/CRM/Campaign/Controller/Search.php
+++ b/civicrm/CRM/Campaign/Controller/Search.php
@@ -28,6 +28,8 @@
  */
 class CRM_Campaign_Controller_Search extends CRM_Core_Controller {
 
+  protected $entity = 'Campaign';
+
   /**
    * Class constructor.
    *
@@ -45,8 +47,8 @@ class CRM_Campaign_Controller_Search extends CRM_Core_Controller {
     $this->addPages($this->_stateMachine, $action);
 
     // add all the actions
-    $config = CRM_Core_Config::singleton();
     $this->addActions();
+    $this->set('entity', $this->entity);
   }
 
 }
diff --git a/civicrm/CRM/Campaign/DAO/Campaign.php b/civicrm/CRM/Campaign/DAO/Campaign.php
index 742996a6bde2c84ddbd4e249d59b731576110a99..8dc0245910ea1a95712955f831fe5589ae63c872 100644
--- a/civicrm/CRM/Campaign/DAO/Campaign.php
+++ b/civicrm/CRM/Campaign/DAO/Campaign.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Campaign/Campaign.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:cfa77579eb9b91b31b6c5618b52c6e87)
+ * (GenCodeChecksum:a5a49e13e66a5d32b690835a49baf535)
  */
 
 /**
@@ -166,9 +166,12 @@ class CRM_Campaign_DAO_Campaign extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Campaigns');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Campaigns') : ts('Campaign');
   }
 
   /**
diff --git a/civicrm/CRM/Campaign/DAO/CampaignGroup.php b/civicrm/CRM/Campaign/DAO/CampaignGroup.php
index 97d4abd5af1839b7b5a9c66f77eee82ca61cb31f..581ab4e5052b63ef51e26b6c5a174aa20f9c4426 100644
--- a/civicrm/CRM/Campaign/DAO/CampaignGroup.php
+++ b/civicrm/CRM/Campaign/DAO/CampaignGroup.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Campaign/CampaignGroup.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:74c02a4708ef706860d023c1635b98c4)
+ * (GenCodeChecksum:55b3974bbc1aa8405d11a5c396401fa9)
  */
 
 /**
@@ -75,9 +75,12 @@ class CRM_Campaign_DAO_CampaignGroup extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Campaign Groups');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Campaign Groups') : ts('Campaign Group');
   }
 
   /**
diff --git a/civicrm/CRM/Campaign/DAO/Survey.php b/civicrm/CRM/Campaign/DAO/Survey.php
index 9c9626b6be8c714478feddfedc7d36e85ca458f4..b6bc1912606154e485b0284fdeb6ba3a0aed247f 100644
--- a/civicrm/CRM/Campaign/DAO/Survey.php
+++ b/civicrm/CRM/Campaign/DAO/Survey.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Campaign/Survey.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e955546c8081852591bc08b1fdee4213)
+ * (GenCodeChecksum:afb7cfcccd2a6177b2b10e07afa92e8e)
  */
 
 /**
@@ -187,9 +187,12 @@ class CRM_Campaign_DAO_Survey extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Surveys');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Surveys') : ts('Survey');
   }
 
   /**
diff --git a/civicrm/CRM/Campaign/Form/Survey/Results.php b/civicrm/CRM/Campaign/Form/Survey/Results.php
index 33d16aa1054978ef0abf3e23b0d1c8d39f3e0a19..846348069652188cf37fe83f2ad3202cb3691c62 100644
--- a/civicrm/CRM/Campaign/Form/Survey/Results.php
+++ b/civicrm/CRM/Campaign/Form/Survey/Results.php
@@ -461,6 +461,8 @@ class CRM_Campaign_Form_Survey_Results extends CRM_Campaign_Form_Survey {
       }
       $this->_createNew = TRUE;
       $this->_id = CRM_Report_Utils_Report::getInstanceIDForValue('survey/detail');
+      CRM_Report_Form_Instance::setDefaultValues($this, $this->_defaults);
+      $this->_params = array_merge($this->_params, $this->_defaults);
       CRM_Report_Form_Instance::postProcess($this, FALSE);
 
       $query = "SELECT MAX(id) FROM civicrm_report_instance WHERE name = %1";
diff --git a/civicrm/CRM/Campaign/Form/Task.php b/civicrm/CRM/Campaign/Form/Task.php
index f59cc30ea60f425f8d24d23c67c0873d597778a0..61411931d0ad3017097b620e3bd4e50440334711 100644
--- a/civicrm/CRM/Campaign/Form/Task.php
+++ b/civicrm/CRM/Campaign/Form/Task.php
@@ -34,9 +34,6 @@ class CRM_Campaign_Form_Task extends CRM_Core_Form_Task {
     $values = $this->controller->exportValues('Search');
 
     $this->_task = $values['task'];
-    $campaignTasks = CRM_Campaign_Task::tasks();
-    $taskName = $campaignTasks[$this->_task] ?? NULL;
-    $this->assign('taskName', $taskName);
 
     $ids = [];
     if ($values['radio_ts'] == 'ts_sel') {
diff --git a/civicrm/CRM/Case/BAO/Case.php b/civicrm/CRM/Case/BAO/Case.php
index 5a3f0b81061b74262c1fc2138237d556f60a840a..96a511e69bc9cdacb2b1021b77e7e5862f34fb12 100644
--- a/civicrm/CRM/Case/BAO/Case.php
+++ b/civicrm/CRM/Case/BAO/Case.php
@@ -1890,6 +1890,7 @@ HERESQL;
         'case_id' => $dao->id,
         'case_type' => $dao->case_type,
         'client_name' => $clientView,
+        'status_id' => $dao->status_id,
         'case_status' => $statuses[$dao->status_id],
         'links' => $caseView,
       ];
@@ -2069,7 +2070,7 @@ SELECT  id
         CRM_Core_DAO::storeValues($otherActivity, $mainActVals);
         $mainActivity->copyValues($mainActVals);
         $mainActivity->id = NULL;
-        $mainActivity->activity_date_time = CRM_Utils_Date::isoToMysql($otherActivity->activity_date_time);
+        $mainActivity->activity_date_time = $otherActivity->activity_date_time;
         $mainActivity->source_record_id = CRM_Utils_Array::value($mainActivity->source_record_id,
           $activityMappingIds
         );
diff --git a/civicrm/CRM/Case/Controller/Search.php b/civicrm/CRM/Case/Controller/Search.php
index 4a4b47cc3f46e09cae41c25230be17f9d9e386a7..bfc16d3c89b8815bd95ddbc32b87a34f79063b88 100644
--- a/civicrm/CRM/Case/Controller/Search.php
+++ b/civicrm/CRM/Case/Controller/Search.php
@@ -28,6 +28,8 @@
  */
 class CRM_Case_Controller_Search extends CRM_Core_Controller {
 
+  protected $entity = 'Case';
+
   /**
    * Class constructor.
    *
@@ -45,8 +47,8 @@ class CRM_Case_Controller_Search extends CRM_Core_Controller {
     $this->addPages($this->_stateMachine, $action);
 
     // add all the actions
-    $config = CRM_Core_Config::singleton();
     $this->addActions();
+    $this->set('entity', $this->entity);
   }
 
 }
diff --git a/civicrm/CRM/Case/DAO/Case.php b/civicrm/CRM/Case/DAO/Case.php
index 946c992f4b6a509042b4d72c8d0387ff82a23fc4..ebf2311f678e44bed07fd27d4018da5296ab802f 100644
--- a/civicrm/CRM/Case/DAO/Case.php
+++ b/civicrm/CRM/Case/DAO/Case.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Case/Case.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8b18140da75bbf971a143c205f2af1cd)
+ * (GenCodeChecksum:bae905b3b253acc0df005cc66dd9b717)
  */
 
 /**
@@ -115,9 +115,12 @@ class CRM_Case_DAO_Case extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Cases');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Cases') : ts('Case');
   }
 
   /**
diff --git a/civicrm/CRM/Case/DAO/CaseActivity.php b/civicrm/CRM/Case/DAO/CaseActivity.php
index 9efe7b4af3e553cc554516347cdc9e0899f848ad..e0d65cb58b8db0babaca907f15b45514ce956dd3 100644
--- a/civicrm/CRM/Case/DAO/CaseActivity.php
+++ b/civicrm/CRM/Case/DAO/CaseActivity.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Case/CaseActivity.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:974d18e84d3416c98293bedd66c3384c)
+ * (GenCodeChecksum:565c78ce07c94d858e5e6e400c4d1ad6)
  */
 
 /**
@@ -61,9 +61,12 @@ class CRM_Case_DAO_CaseActivity extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Case Activities');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Case Activities') : ts('Case Activity');
   }
 
   /**
diff --git a/civicrm/CRM/Case/DAO/CaseContact.php b/civicrm/CRM/Case/DAO/CaseContact.php
index 788b1e58f94810e78b6e6978c1b21fff9b038adc..d5b524ae02b442c984ffd903f6c89bd9af469063 100644
--- a/civicrm/CRM/Case/DAO/CaseContact.php
+++ b/civicrm/CRM/Case/DAO/CaseContact.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Case/CaseContact.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b315f42d7c886c123c9e87c9713c4911)
+ * (GenCodeChecksum:57c93b00e00d0a48d5071d5a991289ab)
  */
 
 /**
@@ -61,9 +61,12 @@ class CRM_Case_DAO_CaseContact extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Case Contacts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Case Contacts') : ts('Case Contact');
   }
 
   /**
diff --git a/civicrm/CRM/Case/DAO/CaseType.php b/civicrm/CRM/Case/DAO/CaseType.php
index dbafcb30a8dbcafeaa5a72f5ee7ceddbcba93f0b..246edc51fd667e459cfe4f9d5c6ecd87a904ec27 100644
--- a/civicrm/CRM/Case/DAO/CaseType.php
+++ b/civicrm/CRM/Case/DAO/CaseType.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Case/CaseType.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:cde81a56b0e8201eac521b92ded6fb45)
+ * (GenCodeChecksum:52f839e38c020cd422ef99dff4ab5f1b)
  */
 
 /**
@@ -96,9 +96,12 @@ class CRM_Case_DAO_CaseType extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Case Types');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Case Types') : ts('Case Type');
   }
 
   /**
diff --git a/civicrm/CRM/Case/Form/CaseView.php b/civicrm/CRM/Case/Form/CaseView.php
index 7c9724a53c83671ca4ee97eec12fc5168257bb3c..f2300dadb23e11ae16d1cd37e48ea083b48aa6de 100644
--- a/civicrm/CRM/Case/Form/CaseView.php
+++ b/civicrm/CRM/Case/Form/CaseView.php
@@ -275,7 +275,10 @@ class CRM_Case_Form_CaseView extends CRM_Core_Form {
     // This button is hidden but gets clicked by javascript at
     // https://github.com/civicrm/civicrm-core/blob/bd28ecf8121a85bc069cad3ab912a0c3dff8fdc5/templates/CRM/Case/Form/CaseView.js#L194
     // by the onChange handler for the above timeline_id select.
-    $this->addElement('submit', $this->getButtonName('next'), ' ', ['class' => 'hiddenElement']);
+    $this->addElement('xbutton', $this->getButtonName('next'), ' ', [
+      'class' => 'hiddenElement',
+      'type' => 'submit',
+    ]);
 
     $this->buildMergeCaseForm();
 
@@ -523,11 +526,12 @@ class CRM_Case_Form_CaseView extends CRM_Core_Form {
       // This button is hidden but gets clicked by javascript at
       // https://github.com/civicrm/civicrm-core/blob/bd28ecf8121a85bc069cad3ab912a0c3dff8fdc5/templates/CRM/Case/Form/CaseView.js#L55
       // when the mergeCasesDialog is saved.
-      $this->addElement('submit',
+      $this->addElement('xbutton',
         $this->getButtonName('next', 'merge_case'),
         ts('Merge'),
         [
           'class' => 'hiddenElement',
+          'type' => 'submit',
         ]
       );
     }
diff --git a/civicrm/CRM/Case/Form/Search.php b/civicrm/CRM/Case/Form/Search.php
index b22ab8c08e97dbbb8884affb03d974a3c61c8eec..d3ba7a07c4d7d029eecb2fb5edbc7818e10dd494 100644
--- a/civicrm/CRM/Case/Form/Search.php
+++ b/civicrm/CRM/Case/Form/Search.php
@@ -58,6 +58,9 @@ class CRM_Case_Form_Search extends CRM_Core_Form_Search {
    * Processing needed for buildForm and later.
    */
   public function preProcess() {
+    // SearchFormName is deprecated & to be removed - the replacement is for the task to
+    // call $this->form->getSearchFormValues()
+    // A couple of extensions use it.
     $this->set('searchFormName', 'Search');
 
     //check for civicase access.
diff --git a/civicrm/CRM/Case/Form/Task/SearchTaskHookSample.php b/civicrm/CRM/Case/Form/Task/SearchTaskHookSample.php
deleted file mode 100644
index df83772a1ff005b1c8afae0b60a4e5180a474638..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Case/Form/Task/SearchTaskHookSample.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
- */
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- */
-
-/**
- * This class provides the functionality to save a search
- * Saved Searches are used for saving frequently used queries
- */
-class CRM_Case_Form_Task_SearchTaskHookSample extends CRM_Case_Form_Task {
-
-  /**
-   * Build all the data structures needed to build the form.
-   */
-  public function preProcess() {
-    parent::preProcess();
-    $rows = [];
-    // display name and email of all contact ids
-    $caseIDs = implode(',', $this->_entityIds);
-    $statusId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', 'case_status', 'id', 'name');
-    $query = "
-SELECT ct.display_name as display_name,
-       cs.start_date   as start_date,
-       ov.label as status
-
-FROM  civicrm_case cs
-INNER JOIN civicrm_case_contact cc ON ( cs.id = cc.case_id)
-INNER JOIN civicrm_contact ct ON ( cc.contact_id = ct.id)
-LEFT  JOIN civicrm_option_value ov ON (cs.status_id = ov.value AND ov.option_group_id = {$statusId} )
-WHERE cs.id IN ( {$caseIDs} )";
-
-    $dao = CRM_Core_DAO::executeQuery($query);
-    while ($dao->fetch()) {
-      $rows[] = [
-        'display_name' => $dao->display_name,
-        'start_date' => CRM_Utils_Date::customFormat($dao->start_date),
-        'status' => $dao->status,
-      ];
-    }
-    $this->assign('rows', $rows);
-  }
-
-  /**
-   * Build the form object.
-   */
-  public function buildQuickForm() {
-    $this->addButtons([
-      [
-        'type' => 'done',
-        'name' => ts('Done'),
-        'isDefault' => TRUE,
-      ],
-    ]);
-  }
-
-}
diff --git a/civicrm/CRM/Contact/ActionMapping.php b/civicrm/CRM/Contact/ActionMapping.php
index f4aee154e83038bff31a4bd9381728d63b45bdf3..ea96b5da7863645e387c72106fbb3b7d4fa47fe4 100644
--- a/civicrm/CRM/Contact/ActionMapping.php
+++ b/civicrm/CRM/Contact/ActionMapping.php
@@ -139,4 +139,12 @@ class CRM_Contact_ActionMapping extends \Civi\ActionSchedule\Mapping {
     return $query;
   }
 
+  /**
+   * Determine whether a schedule based on this mapping should
+   * send to additional contacts.
+   */
+  public function sendToAdditional($entityId): bool {
+    return TRUE;
+  }
+
 }
diff --git a/civicrm/CRM/Contact/BAO/Contact.php b/civicrm/CRM/Contact/BAO/Contact.php
index 5f42dce4faa5665af235fc1995c7eafffdc13f94..d258641cb70ae7fe95619484b4f3ca979f12402d 100644
--- a/civicrm/CRM/Contact/BAO/Contact.php
+++ b/civicrm/CRM/Contact/BAO/Contact.php
@@ -371,9 +371,6 @@ class CRM_Contact_BAO_Contact extends CRM_Contact_DAO_Contact {
       }
     }
 
-    // update the UF user_unique_id if that has changed
-    CRM_Core_BAO_UFMatch::updateUFName($contact->id);
-
     if (!empty($params['custom']) &&
       is_array($params['custom'])
     ) {
@@ -1543,14 +1540,17 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
             [
               'name' => 'organization_name',
               'title' => ts('Current Employer'),
+              'type' => CRM_Utils_Type::T_STRING,
             ],
         ]);
 
+        // This probably would be added anyway by appendPseudoConstantsToFields.
         $locationType = [
           'location_type' => [
             'name' => 'location_type',
             'where' => 'civicrm_location_type.name',
             'title' => ts('Location Type'),
+            'type' => CRM_Utils_Type::T_STRING,
           ],
         ];
 
@@ -1559,6 +1559,7 @@ WHERE     civicrm_contact.id = " . CRM_Utils_Type::escape($id, 'Integer');
             'name' => 'im_provider',
             'where' => 'civicrm_im.provider_id',
             'title' => ts('IM Provider'),
+            'type' => CRM_Utils_Type::T_STRING,
           ],
         ];
 
@@ -2564,33 +2565,6 @@ LEFT JOIN civicrm_email    ON ( civicrm_contact.id = civicrm_email.contact_id )
     return $email;
   }
 
-  /**
-   * Function to get primary OpenID of the contact.
-   *
-   * @param int $contactID
-   *   Contact id.
-   *
-   * @return string
-   *   >openid   OpenID if present else null
-   */
-  public static function getPrimaryOpenId($contactID) {
-    // fetch the primary OpenID
-    $query = "
-SELECT    civicrm_openid.openid as openid
-FROM      civicrm_contact
-LEFT JOIN civicrm_openid ON ( civicrm_contact.id = civicrm_openid.contact_id )
-WHERE     civicrm_contact.id = %1
-AND       civicrm_openid.is_primary = 1";
-    $p = [1 => [$contactID, 'Integer']];
-    $dao = CRM_Core_DAO::executeQuery($query, $p);
-
-    $openId = NULL;
-    if ($dao->fetch()) {
-      $openId = $dao->openid;
-    }
-    return $openId;
-  }
-
   /**
    * Fetch the object and store the values in the values array.
    *
@@ -3554,6 +3528,9 @@ LEFT JOIN civicrm_address ON ( civicrm_address.contact_id = civicrm_contact.id )
         if ($dao->fetch()) {
           $dao->is_primary = 1;
           $dao->save();
+          if ($type === 'Email') {
+            CRM_Core_BAO_UFMatch::updateUFName($dao->contact_id);
+          }
         }
       }
     }
diff --git a/civicrm/CRM/Contact/BAO/Contact/Utils.php b/civicrm/CRM/Contact/BAO/Contact/Utils.php
index 056f792c290f349e4a9bd9c26ed7fccc1b19c33b..7e5477e18e044c79c7969edd4ea3c9ce7620021d 100644
--- a/civicrm/CRM/Contact/BAO/Contact/Utils.php
+++ b/civicrm/CRM/Contact/BAO/Contact/Utils.php
@@ -80,7 +80,7 @@ class CRM_Contact_BAO_Contact_Utils {
       }
 
       $profileURL = CRM_Utils_System::url('civicrm/profile/view',
-        "reset=1&gid={$summaryOverlayProfileId}&id={$contactId}&snippet=4"
+        "reset=1&gid={$summaryOverlayProfileId}&id={$contactId}&snippet=4&is_show_email_task=1"
       );
 
       $imageInfo[$contactType]['summary-link'] = '<a href="' . $profileURL . '" class="crm-summary-link">' . $imageInfo[$contactType]['image'] . '</a>';
diff --git a/civicrm/CRM/Contact/BAO/Group.php b/civicrm/CRM/Contact/BAO/Group.php
index fae22f03b84459168faa82e47e6bf04c19058f53..96d94f478d84cd0e8b29ef2d27a0b7f4fa944bdf 100644
--- a/civicrm/CRM/Contact/BAO/Group.php
+++ b/civicrm/CRM/Contact/BAO/Group.php
@@ -118,7 +118,7 @@ class CRM_Contact_BAO_Group extends CRM_Contact_DAO_Group {
    */
   public static function getGroupContacts($id) {
     $params = [['group', 'IN', [1 => $id], 0, 0]];
-    list($contacts, $_) = CRM_Contact_BAO_Query::apiQuery($params, ['contact_id']);
+    [$contacts] = CRM_Contact_BAO_Query::apiQuery($params, ['contact_id']);
     return $contacts;
   }
 
@@ -1223,6 +1223,14 @@ WHERE {$whereClause}";
       $clauses[] = '`groups`.parents IS NULL';
     }
 
+    $savedSearch = $params['savedSearch'] ?? NULL;
+    if ($savedSearch == 1) {
+      $clauses[] = '`groups`.saved_search_id IS NOT NULL';
+    }
+    elseif ($savedSearch == 2) {
+      $clauses[] = '`groups`.saved_search_id IS NULL';
+    }
+
     // only show child groups of a specific parent group
     $parent_id = $params['parent_id'] ?? NULL;
     if ($parent_id) {
@@ -1329,7 +1337,7 @@ WHERE {$whereClause}";
       $this->{$fieldName} = "NULL";
     }
     else {
-      parent::assignTestValues($fieldName, $fieldDef, $counter);
+      parent::assignTestValue($fieldName, $fieldDef, $counter);
     }
   }
 
diff --git a/civicrm/CRM/Contact/BAO/GroupContact.php b/civicrm/CRM/Contact/BAO/GroupContact.php
index 8e44e6aa40068b455499651adbddb5a7821024fe..e2ae71125ee19ef44d498ea96921361b387564e2 100644
--- a/civicrm/CRM/Contact/BAO/GroupContact.php
+++ b/civicrm/CRM/Contact/BAO/GroupContact.php
@@ -253,10 +253,6 @@ class CRM_Contact_BAO_GroupContact extends CRM_Contact_DAO_GroupContact {
    *   this array has key-> group id and value group title
    */
   public static function getGroupList($contactId = 0, $visibility = FALSE) {
-    $group = new CRM_Contact_DAO_Group();
-
-    $select = $from = $where = '';
-
     $select = 'SELECT civicrm_group.id, civicrm_group.title ';
     $from = ' FROM civicrm_group ';
     $where = " WHERE civicrm_group.is_active = 1 ";
@@ -274,7 +270,7 @@ class CRM_Contact_BAO_GroupContact extends CRM_Contact_DAO_GroupContact {
     $orderby = " ORDER BY civicrm_group.name";
     $sql = $select . $from . $where . $groupBy . $orderby;
 
-    $group->query($sql);
+    $group = CRM_Core_DAO::executeQuery($sql);
 
     $values = [];
     while ($group->fetch()) {
@@ -555,7 +551,7 @@ SELECT    *
       ['group', 'IN', [$groupID], 0, 0],
       ['contact_id', '=', $contactID, 0, 0],
     ];
-    list($contacts, $_) = CRM_Contact_BAO_Query::apiQuery($params, ['contact_id']);
+    [$contacts] = CRM_Contact_BAO_Query::apiQuery($params, ['contact_id']);
 
     if (!empty($contacts)) {
       return TRUE;
diff --git a/civicrm/CRM/Contact/BAO/GroupContactCache.php b/civicrm/CRM/Contact/BAO/GroupContactCache.php
index d4700184f81b9c8747df1e605611c459e1d50375..ce082757662b4767cac5c13d81e7bb46f6a9453e 100644
--- a/civicrm/CRM/Contact/BAO/GroupContactCache.php
+++ b/civicrm/CRM/Contact/BAO/GroupContactCache.php
@@ -9,6 +9,8 @@
  +--------------------------------------------------------------------+
  */
 
+use Civi\Api4\Query\SqlExpression;
+
 /**
  *
  * @package CRM
@@ -701,16 +703,18 @@ ORDER BY   gc.contact_id, g.children
    */
   protected static function getApiSQL(array $savedSearch, string $addSelect, string $excludeClause) {
     $apiParams = $savedSearch['api_params'] + ['select' => ['id'], 'checkPermissions' => FALSE];
-    list($idField) = explode(' AS ', $apiParams['select'][0]);
-    $apiParams['select'] = [
-      $addSelect,
-      $idField,
-    ];
+    $idField = SqlExpression::convert($apiParams['select'][0], TRUE)->getAlias();
+    // Unless there's a HAVING clause, we don't care about other columns
+    if (empty($apiParams['having'])) {
+      $apiParams['select'] = array_slice($apiParams['select'], 0, 1);
+    }
     $api = \Civi\API\Request::create($savedSearch['api_entity'], 'get', $apiParams);
     $query = new \Civi\Api4\Query\Api4SelectQuery($api);
     $query->forceSelectId = FALSE;
     $query->getQuery()->having("$idField $excludeClause");
-    return $query->getSql();
+    $sql = $query->getSql();
+    // Place sql in a nested sub-query, otherwise HAVING is impossible on any field other than contact_id
+    return "SELECT $addSelect, `$idField` AS contact_id FROM ($sql) api_query";
   }
 
   /**
diff --git a/civicrm/CRM/Contact/BAO/Relationship.php b/civicrm/CRM/Contact/BAO/Relationship.php
index 24122a128a84b9a4ecc81227948e5ffa2ed92300..7e6c9bfef293bd386f263d994e746188ced54500 100644
--- a/civicrm/CRM/Contact/BAO/Relationship.php
+++ b/civicrm/CRM/Contact/BAO/Relationship.php
@@ -983,8 +983,7 @@ WHERE  relationship_type_id = " . CRM_Utils_Type::escape($type, 'Integer');
       $queryString .= " AND id !=" . CRM_Utils_Type::escape($relationshipId, 'Integer');
     }
 
-    $relationship = new CRM_Contact_BAO_Relationship();
-    $relationship->query($queryString);
+    $relationship = CRM_Core_DAO::executeQuery($queryString);
     while ($relationship->fetch()) {
       // Check whether the custom field values are identical.
       $result = self::checkDuplicateCustomFields($params, $relationship->id);
diff --git a/civicrm/CRM/Contact/BAO/SavedSearch.php b/civicrm/CRM/Contact/BAO/SavedSearch.php
index c5cd15e6e4df8ad4519324e6bdd94138464caae1..d2ed700e7dcd4b6aaf05b72ac1108469622f17cd 100644
--- a/civicrm/CRM/Contact/BAO/SavedSearch.php
+++ b/civicrm/CRM/Contact/BAO/SavedSearch.php
@@ -54,9 +54,9 @@ class CRM_Contact_BAO_SavedSearch extends CRM_Contact_DAO_SavedSearch {
    * @param array $defaults
    *   (reference ) an assoc array to hold the flattened values.
    *
-   * @return CRM_Contact_BAO_SavedSearch
+   * @return CRM_Contact_DAO_SavedSearch
    */
-  public static function retrieve(&$params, &$defaults) {
+  public static function retrieve($params, &$defaults = []) {
     $savedSearch = new CRM_Contact_DAO_SavedSearch();
     $savedSearch->copyValues($params);
     if ($savedSearch->find(TRUE)) {
@@ -422,4 +422,33 @@ LEFT JOIN civicrm_email ON (contact_a.id = civicrm_email.contact_id AND civicrm_
     }
   }
 
+  /**
+   * Generate a url to the appropriate search form for a given savedSearch
+   *
+   * @param int $id
+   *   Saved search id
+   * @return string
+   */
+  public static function getEditSearchUrl($id) {
+    $savedSearch = self::retrieve(['id' => $id]);
+    // APIv4 search
+    if (!empty($savedSearch->api_entity)) {
+      $groupName = self::getName($id);
+      return CRM_Utils_System::url('civicrm/search', NULL, FALSE, "/load/Group/$groupName");
+    }
+    // Classic search builder
+    if (!empty($savedSearch->mapping_id)) {
+      $path = 'civicrm/contact/search/builder';
+    }
+    // Classic custom search
+    elseif (!empty($savedSearch->search_custom_id)) {
+      $path = 'civicrm/contact/search/custom';
+    }
+    // Classic advanced search
+    else {
+      $path = 'civicrm/contact/search/advanced';
+    }
+    return CRM_Utils_System::url($path, ['reset' => 1, 'ssID' => $id]);
+  }
+
 }
diff --git a/civicrm/CRM/Contact/Controller/Search.php b/civicrm/CRM/Contact/Controller/Search.php
index 6d2d1c4f83e2cc42c5391f0e1f077af6c0ae65e2..af1ca61955c8a9134fe4ae1bb6ebe31cf6aa314f 100644
--- a/civicrm/CRM/Contact/Controller/Search.php
+++ b/civicrm/CRM/Contact/Controller/Search.php
@@ -27,6 +27,8 @@
  */
 class CRM_Contact_Controller_Search extends CRM_Core_Controller {
 
+  protected $entity = 'Contact';
+
   /**
    * Class constructor.
    *
@@ -44,6 +46,7 @@ class CRM_Contact_Controller_Search extends CRM_Core_Controller {
 
     // add all the actions
     $this->addActions();
+    $this->set('entity', $this->entity);
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/ACLContactCache.php b/civicrm/CRM/Contact/DAO/ACLContactCache.php
index 6b319f9636ce77e248b306c203b4f9451a161a5a..eb34f360002d960a331b86e08c9662beab35fbae 100644
--- a/civicrm/CRM/Contact/DAO/ACLContactCache.php
+++ b/civicrm/CRM/Contact/DAO/ACLContactCache.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/ACLContactCache.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:97d9be5e13ece64b6c9ad1722d9bca68)
+ * (GenCodeChecksum:4eaf1e99ce247c430fc280cc6ce68538)
  */
 
 /**
@@ -68,24 +68,12 @@ class CRM_Contact_DAO_ACLContactCache extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
-   */
-  public static function getEntityTitle() {
-    return ts('ACLContact Caches');
-  }
-
-  /**
-   * Returns foreign keys and entity references.
    *
-   * @return array
-   *   [CRM_Core_Reference_Interface]
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getReferenceColumns() {
-    if (!isset(Civi::$statics[__CLASS__]['links'])) {
-      Civi::$statics[__CLASS__]['links'] = static::createReferenceColumns(__CLASS__);
-      Civi::$statics[__CLASS__]['links'][] = new CRM_Core_Reference_Basic(self::getTableName(), 'contact_id', 'civicrm_contact', 'id');
-      CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'links_callback', Civi::$statics[__CLASS__]['links']);
-    }
-    return Civi::$statics[__CLASS__]['links'];
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('ACLContact Caches') : ts('ACLContact Cache');
   }
 
   /**
@@ -132,7 +120,6 @@ class CRM_Contact_DAO_ACLContactCache extends CRM_Core_DAO {
           'entity' => 'ACLContactCache',
           'bao' => 'CRM_Contact_DAO_ACLContactCache',
           'localizable' => 0,
-          'FKClassName' => 'CRM_Contact_DAO_Contact',
           'add' => '3.1',
         ],
         'operation' => [
diff --git a/civicrm/CRM/Contact/DAO/Contact.php b/civicrm/CRM/Contact/DAO/Contact.php
index f91dc3264b1e5e35928815f8b2b63d80434c65c3..c585b127039b72171f6e390c44967ce5a1900020 100644
--- a/civicrm/CRM/Contact/DAO/Contact.php
+++ b/civicrm/CRM/Contact/DAO/Contact.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/Contact.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f58884560d4f49764182cd97f1bbbcdf)
+ * (GenCodeChecksum:f118596cceae71668861504b7316afa7)
  */
 
 /**
@@ -397,9 +397,12 @@ class CRM_Contact_DAO_Contact extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Contacts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Contacts') : ts('Contact');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/ContactType.php b/civicrm/CRM/Contact/DAO/ContactType.php
index 41d8b878036906d1e0e34153eaefbde39dfc34a6..4f7f63f5a3edafac9df7b9b1959fc2b7a4f7a5b2 100644
--- a/civicrm/CRM/Contact/DAO/ContactType.php
+++ b/civicrm/CRM/Contact/DAO/ContactType.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/ContactType.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0f7546e10f09f7637d50f7a34c632cb5)
+ * (GenCodeChecksum:9719ec84435a76decf1937f7a389ac7f)
  */
 
 /**
@@ -96,9 +96,12 @@ class CRM_Contact_DAO_ContactType extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Contact Types');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Contact Types') : ts('Contact Type');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/DashboardContact.php b/civicrm/CRM/Contact/DAO/DashboardContact.php
index 16c0b3b593796c93f952a45700125efe91740eaa..f8f4e87daa3c7c5f3a2888acf4f42f2ab4289337 100644
--- a/civicrm/CRM/Contact/DAO/DashboardContact.php
+++ b/civicrm/CRM/Contact/DAO/DashboardContact.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/DashboardContact.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:67153c09e74eda2febf15986f9c04439)
+ * (GenCodeChecksum:ef3a393d20b6654dcef952f21df8072d)
  */
 
 /**
@@ -80,9 +80,12 @@ class CRM_Contact_DAO_DashboardContact extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Dashboard Contacts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Dashboard Contacts') : ts('Dashboard Contact');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/Group.php b/civicrm/CRM/Contact/DAO/Group.php
index cdae401986356649bb6561599060cea33203d5e1..d0d027ed2ea68d04b30a4a58d7debba7f07efb35 100644
--- a/civicrm/CRM/Contact/DAO/Group.php
+++ b/civicrm/CRM/Contact/DAO/Group.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/Group.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6a2a222c5fa5b461727bb95379723b08)
+ * (GenCodeChecksum:cab0c1d345870ec17420e9100fe2518f)
  */
 
 /**
@@ -175,6 +175,20 @@ class CRM_Contact_DAO_Group extends CRM_Core_DAO {
    */
   public $modified_id;
 
+  /**
+   * Alternative public title for this Group.
+   *
+   * @var string
+   */
+  public $frontend_title;
+
+  /**
+   * Alternative public description of the group.
+   *
+   * @var text
+   */
+  public $frontend_description;
+
   /**
    * Class constructor.
    */
@@ -185,9 +199,12 @@ class CRM_Contact_DAO_Group extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Groups');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Groups') : ts('Group');
   }
 
   /**
@@ -247,8 +264,8 @@ class CRM_Contact_DAO_Group extends CRM_Core_DAO {
           'type' => CRM_Utils_Type::T_STRING,
           'title' => ts('Group Title'),
           'description' => ts('Name of Group.'),
-          'maxlength' => 64,
-          'size' => CRM_Utils_Type::BIG,
+          'maxlength' => 255,
+          'size' => CRM_Utils_Type::HUGE,
           'where' => 'civicrm_group.title',
           'table_name' => 'civicrm_group',
           'entity' => 'Group',
@@ -498,6 +515,42 @@ class CRM_Contact_DAO_Group extends CRM_Core_DAO {
           'FKClassName' => 'CRM_Contact_DAO_Contact',
           'add' => '4.5',
         ],
+        'frontend_title' => [
+          'name' => 'frontend_title',
+          'type' => CRM_Utils_Type::T_STRING,
+          'title' => ts('Public Group Title'),
+          'description' => ts('Alternative public title for this Group.'),
+          'maxlength' => 255,
+          'size' => CRM_Utils_Type::HUGE,
+          'where' => 'civicrm_group.frontend_title',
+          'default' => 'NULL',
+          'table_name' => 'civicrm_group',
+          'entity' => 'Group',
+          'bao' => 'CRM_Contact_BAO_Group',
+          'localizable' => 1,
+          'html' => [
+            'type' => 'Text',
+          ],
+          'add' => '5.31',
+        ],
+        'frontend_description' => [
+          'name' => 'frontend_description',
+          'type' => CRM_Utils_Type::T_TEXT,
+          'title' => ts('Public Group Description'),
+          'description' => ts('Alternative public description of the group.'),
+          'rows' => 2,
+          'cols' => 60,
+          'where' => 'civicrm_group.frontend_description',
+          'default' => 'NULL',
+          'table_name' => 'civicrm_group',
+          'entity' => 'Group',
+          'bao' => 'CRM_Contact_BAO_Group',
+          'localizable' => 1,
+          'html' => [
+            'type' => 'TextArea',
+          ],
+          'add' => '5.31',
+        ],
       ];
       CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
     }
diff --git a/civicrm/CRM/Contact/DAO/GroupContact.php b/civicrm/CRM/Contact/DAO/GroupContact.php
index 52c66fd638c930609b4d353de13d309c20b7612d..3cee7b7e07901cbf628d86f250a659b400e7d232 100644
--- a/civicrm/CRM/Contact/DAO/GroupContact.php
+++ b/civicrm/CRM/Contact/DAO/GroupContact.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/GroupContact.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:143ba4d95cae73fc81c8e932970cbc1f)
+ * (GenCodeChecksum:69e994c5047ecf8d68700c694047720f)
  */
 
 /**
@@ -82,9 +82,12 @@ class CRM_Contact_DAO_GroupContact extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Group Contacts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Group Contacts') : ts('Group Contact');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/GroupContactCache.php b/civicrm/CRM/Contact/DAO/GroupContactCache.php
index 3ee02aa7e2097f2ab0801e4452706d194b555b11..e4310747a9dbb84608b5dd80fd15343d95b1af6b 100644
--- a/civicrm/CRM/Contact/DAO/GroupContactCache.php
+++ b/civicrm/CRM/Contact/DAO/GroupContactCache.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/GroupContactCache.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a169b776ec9bfc8864a05750d4ae6b95)
+ * (GenCodeChecksum:424f49d5c972e05144c327cf7ba0992c)
  */
 
 /**
@@ -61,9 +61,12 @@ class CRM_Contact_DAO_GroupContactCache extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Group Contact Caches');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Group Contact Caches') : ts('Group Contact Cache');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/GroupNesting.php b/civicrm/CRM/Contact/DAO/GroupNesting.php
index 90624a6e98fdb749120d4626376b6d438ead8716..6262c1f5a44fb0bc50a2d9d4e7c3987db5c3881f 100644
--- a/civicrm/CRM/Contact/DAO/GroupNesting.php
+++ b/civicrm/CRM/Contact/DAO/GroupNesting.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/GroupNesting.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0ca7da77b0229b439c9c3a4c4c2e4326)
+ * (GenCodeChecksum:396dffdb22106c85cc4832b61307c264)
  */
 
 /**
@@ -61,9 +61,12 @@ class CRM_Contact_DAO_GroupNesting extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Group Nestings');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Group Nestings') : ts('Group Nesting');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/GroupOrganization.php b/civicrm/CRM/Contact/DAO/GroupOrganization.php
index 407ea31d83f505e3f82cbe9c0c2f7fa273f8c6bd..0553dff9ec648657c078cbfafa26c47b8d7c6c8d 100644
--- a/civicrm/CRM/Contact/DAO/GroupOrganization.php
+++ b/civicrm/CRM/Contact/DAO/GroupOrganization.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/GroupOrganization.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:dfe8edf8f786790af95f09f456d1cbe7)
+ * (GenCodeChecksum:0ae83aef7dbfb877f46a92f27001dd6b)
  */
 
 /**
@@ -61,9 +61,12 @@ class CRM_Contact_DAO_GroupOrganization extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Group Organizations');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Group Organizations') : ts('Group Organization');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/Relationship.php b/civicrm/CRM/Contact/DAO/Relationship.php
index 14b10a52802e77892254edd2063d4583955aaac6..8ad5e40702fd2e64cd43e439993f009502053f01 100644
--- a/civicrm/CRM/Contact/DAO/Relationship.php
+++ b/civicrm/CRM/Contact/DAO/Relationship.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/Relationship.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:25faea8225f483ae95cf29af08a8542d)
+ * (GenCodeChecksum:7fed0ad7c2ed2b072582b55afdb6469f)
  */
 
 /**
@@ -124,9 +124,12 @@ class CRM_Contact_DAO_Relationship extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Relationships');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Relationships') : ts('Relationship');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/RelationshipCache.php b/civicrm/CRM/Contact/DAO/RelationshipCache.php
index cfa5a75bc2e0ec936dd9198202d1190c36cef8e6..1e874cb2bd9ac70fbfc822e3db29c9f40f6151f4 100644
--- a/civicrm/CRM/Contact/DAO/RelationshipCache.php
+++ b/civicrm/CRM/Contact/DAO/RelationshipCache.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/RelationshipCache.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b40781c15c3351a766a6083522f0e5e4)
+ * (GenCodeChecksum:6de8ba08019ff8821fd4e09f14db6da9)
  */
 
 /**
@@ -124,9 +124,12 @@ class CRM_Contact_DAO_RelationshipCache extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Relationship Caches');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Relationship Caches') : ts('Relationship Cache');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/RelationshipType.php b/civicrm/CRM/Contact/DAO/RelationshipType.php
index e703e2fe849b78e5065561a73fa2e65504b74f88..3ac981c81f84193346c2d7af75dc0109e51f72f6 100644
--- a/civicrm/CRM/Contact/DAO/RelationshipType.php
+++ b/civicrm/CRM/Contact/DAO/RelationshipType.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/RelationshipType.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6e9767fcd0fc6eba8fcd408588fe0755)
+ * (GenCodeChecksum:258f862b2238ae69432d8955ae8df803)
  */
 
 /**
@@ -124,9 +124,12 @@ class CRM_Contact_DAO_RelationshipType extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Relationship Types');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Relationship Types') : ts('Relationship Type');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/SavedSearch.php b/civicrm/CRM/Contact/DAO/SavedSearch.php
index a5fb2d460375d06c57bd1bcc742f8c05b9643cc4..c532997a2a3db7381442cdf6be1468f12e9e57c2 100644
--- a/civicrm/CRM/Contact/DAO/SavedSearch.php
+++ b/civicrm/CRM/Contact/DAO/SavedSearch.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/SavedSearch.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4b2f292a8196a5dc4a73afc078cd11cb)
+ * (GenCodeChecksum:d863f8b0b8659633bc84578e1d6cbf10)
  */
 
 /**
@@ -82,9 +82,12 @@ class CRM_Contact_DAO_SavedSearch extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Saved Searches');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Saved Searches') : ts('Saved Search');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/DAO/SubscriptionHistory.php b/civicrm/CRM/Contact/DAO/SubscriptionHistory.php
index 421ea3381555f30664b05db8bf3b608b8874a1f4..cbdab5b5352aab6f512747a777cf19da901f1fb0 100644
--- a/civicrm/CRM/Contact/DAO/SubscriptionHistory.php
+++ b/civicrm/CRM/Contact/DAO/SubscriptionHistory.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contact/SubscriptionHistory.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7c033b0631f14da30172883b14686574)
+ * (GenCodeChecksum:c38d68dcab2d037fc65d4e59bd30d1d4)
  */
 
 /**
@@ -89,9 +89,12 @@ class CRM_Contact_DAO_SubscriptionHistory extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Subscription Histories');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Subscription Histories') : ts('Subscription History');
   }
 
   /**
diff --git a/civicrm/CRM/Contact/Form/Contact.php b/civicrm/CRM/Contact/Form/Contact.php
index 04e3c8a897e79f52c58a27b38d60bf73bbe1ef31..798050800c35a5800bdfa950e2b5afecadf30513 100644
--- a/civicrm/CRM/Contact/Form/Contact.php
+++ b/civicrm/CRM/Contact/Form/Contact.php
@@ -808,17 +808,31 @@ class CRM_Contact_Form_Contact extends CRM_Core_Form {
     $this->addField('image_URL', ['maxlength' => '255', 'label' => ts('Browse/Upload Image')]);
 
     // add the dedupe button
-    $this->addElement('submit',
+    $this->addElement('xbutton',
       $this->_dedupeButtonName,
-      ts('Check for Matching Contact(s)')
+      ts('Check for Matching Contact(s)'),
+      [
+        'type' => 'submit',
+        'value' => 1,
+        'class' => "crm-button crm-button{$this->_dedupeButtonName}",
+      ]
     );
-    $this->addElement('submit',
+    $this->addElement('xbutton',
       $this->_duplicateButtonName,
-      ts('Save Matching Contact')
+      ts('Save Matching Contact'),
+      [
+        'type' => 'submit',
+        'value' => 1,
+        'class' => "crm-button crm-button{$this->_duplicateButtonName}",
+      ]
     );
-    $this->addElement('submit',
+    $this->addElement('xbutton',
       $this->getButtonName('next', 'sharedHouseholdDuplicate'),
-      ts('Save With Duplicate Household')
+      ts('Save With Duplicate Household'),
+      [
+        'type' => 'submit',
+        'value' => 1,
+      ]
     );
 
     $buttons = [
diff --git a/civicrm/CRM/Contact/Form/Edit/Address.php b/civicrm/CRM/Contact/Form/Edit/Address.php
index 7c46252f4a03e58865bfa5d30d3d25a89e705397..105ef33ce3ccd1939294d3fdb1a05e3ed3444c16 100644
--- a/civicrm/CRM/Contact/Form/Edit/Address.php
+++ b/civicrm/CRM/Contact/Form/Edit/Address.php
@@ -121,7 +121,7 @@ class CRM_Contact_Form_Edit_Address {
         $name = 'name';
       }
 
-      $params = ['entity' => 'address'];
+      $params = ['entity' => 'Address'];
 
       if ($name === 'postal_code_suffix') {
         $params['label'] = ts('Suffix');
diff --git a/civicrm/CRM/Contact/Form/Edit/TagsAndGroups.php b/civicrm/CRM/Contact/Form/Edit/TagsAndGroups.php
index 73e9420dff9e5ffb87b958a45414943f682daf93..52d0f9d7b73e522d63e4a85d0c4f82966655427b 100644
--- a/civicrm/CRM/Contact/Form/Edit/TagsAndGroups.php
+++ b/civicrm/CRM/Contact/Form/Edit/TagsAndGroups.php
@@ -93,7 +93,7 @@ class CRM_Contact_Form_Edit_TagsAndGroups {
         $attributes['skiplabel'] = TRUE;
         $elements = [];
         $groupsOptions = [];
-        foreach ($groups as $group) {
+        foreach ($groups as $key => $group) {
           $id = $group['id'];
           // make sure that this group has public visibility
           if ($visibility &&
@@ -103,7 +103,7 @@ class CRM_Contact_Form_Edit_TagsAndGroups {
           }
 
           if ($groupElementType == 'select') {
-            $groupsOptions[$id] = $group;
+            $groupsOptions[$key] = $group;
           }
           else {
             $form->_tagGroup[$fName][$id]['description'] = $group['description'];
diff --git a/civicrm/CRM/Contact/Form/Inline/Address.php b/civicrm/CRM/Contact/Form/Inline/Address.php
index e33118c9133fea7b35abb60675251187026e2f1a..4170a36f0bd14c39a1aa58217f02591f98ce861c 100644
--- a/civicrm/CRM/Contact/Form/Inline/Address.php
+++ b/civicrm/CRM/Contact/Form/Inline/Address.php
@@ -169,7 +169,7 @@ class CRM_Contact_Form_Inline_Address extends CRM_Contact_Form_Inline {
     }
 
     // save address changes
-    $address = CRM_Core_BAO_Address::create($params, TRUE);
+    $address = CRM_Core_BAO_Address::legacyCreate($params, TRUE);
 
     $this->log();
     $this->ajaxResponse['addressId'] = $address[0]->id;
diff --git a/civicrm/CRM/Contact/Form/Search.php b/civicrm/CRM/Contact/Form/Search.php
index 25c95ac6b7ebbb541e47d2d629604db82fad4673..d41d16bb6cd8d47357c7d7fd338dab96058b8b51 100644
--- a/civicrm/CRM/Contact/Form/Search.php
+++ b/civicrm/CRM/Contact/Form/Search.php
@@ -429,11 +429,10 @@ class CRM_Contact_Form_Search extends CRM_Core_Form_Search {
         $ssID = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Group', $this->_groupID, 'saved_search_id');
         $this->assign('ssID', $ssID);
 
-        //get the saved search mapping id
+        //get the saved search edit link
         if ($ssID) {
           $this->_ssID = $ssID;
-          $ssMappingId = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_SavedSearch', $ssID, 'mapping_id');
-          $this->assign('ssMappingID', $ssMappingId);
+          $this->assign('editSmartGroupURL', CRM_Contact_BAO_SavedSearch::getEditSearchUrl($ssID));
         }
 
         // Set dynamic page title for 'Show Members of Group'
@@ -469,8 +468,9 @@ class CRM_Contact_Form_Search extends CRM_Core_Form_Search {
       // also set the group title and freeze the action task with Add Members to Group
       $groupValues = ['id' => $this->_amtgID, 'title' => $this->_group[$this->_amtgID]];
       $this->assign_by_ref('group', $groupValues);
-      $this->add('submit', $this->_actionButtonName, ts('Add Contacts to %1', [1 => $this->_group[$this->_amtgID]]),
+      $this->add('xbutton', $this->_actionButtonName, ts('Add Contacts to %1', [1 => $this->_group[$this->_amtgID]]),
         [
+          'type' => 'submit',
           'class' => 'crm-form-submit',
         ]
       );
diff --git a/civicrm/CRM/Contact/Form/Search/Advanced.php b/civicrm/CRM/Contact/Form/Search/Advanced.php
index e579c743316625c7ba92096d5ce68b0b44eed638..95e981a63dad963c04a05539bb6f38902c17d513 100644
--- a/civicrm/CRM/Contact/Form/Search/Advanced.php
+++ b/civicrm/CRM/Contact/Form/Search/Advanced.php
@@ -24,6 +24,9 @@ class CRM_Contact_Form_Search_Advanced extends CRM_Contact_Form_Search {
    * Processing needed for buildForm and later.
    */
   public function preProcess() {
+    // SearchFormName is deprecated & to be removed - the replacement is for the task to
+    // call $this->form->getSearchFormValues()
+    // A couple of extensions use it.
     $this->set('searchFormName', 'Advanced');
 
     parent::preProcess();
diff --git a/civicrm/CRM/Contact/Form/Search/Basic.php b/civicrm/CRM/Contact/Form/Search/Basic.php
index 158055fed7193edb2b582840d468cf5dc35b1ee8..f7fa2e648560bd6c9d23574efb688ae80e6ab4c5 100644
--- a/civicrm/CRM/Contact/Form/Search/Basic.php
+++ b/civicrm/CRM/Contact/Form/Search/Basic.php
@@ -49,14 +49,13 @@ class CRM_Contact_Form_Search_Basic extends CRM_Contact_Form_Search {
 
     // add select for groups
     // Get hierarchical listing of groups, respecting ACLs for CRM-16836.
-    $groupHierarchy = CRM_Contact_BAO_Group::getGroupsHierarchy($this->_group, NULL, '- ');
+    $groupHierarchy = CRM_Contact_BAO_Group::getGroupsHierarchy($this->_group, NULL, '- ', TRUE);
     if (!empty($searchOptions['groups'])) {
       $this->addField('group', [
         'entity' => 'group_contact',
         'label' => ts('in'),
         'placeholder' => ts('- any group -'),
         'options' => $groupHierarchy,
-        'type' => 'Select2',
       ]);
     }
 
@@ -117,6 +116,9 @@ class CRM_Contact_Form_Search_Basic extends CRM_Contact_Form_Search {
    * Processing needed for buildForm and later.
    */
   public function preProcess() {
+    // SearchFormName is deprecated & to be removed - the replacement is for the task to
+    // call $this->form->getSearchFormValues()
+    // A couple of extensions use it.
     $this->set('searchFormName', 'Basic');
 
     parent::preProcess();
diff --git a/civicrm/CRM/Contact/Form/Search/Builder.php b/civicrm/CRM/Contact/Form/Search/Builder.php
index fc51f6580d352d3491d6ec85f2ac9e7b5e0e08ae..0eccbcb5049f88909a62d873d2544a803c5cd6c1 100644
--- a/civicrm/CRM/Contact/Form/Search/Builder.php
+++ b/civicrm/CRM/Contact/Form/Search/Builder.php
@@ -38,6 +38,9 @@ class CRM_Contact_Form_Search_Builder extends CRM_Contact_Form_Search {
    * Build the form object.
    */
   public function preProcess() {
+    // SearchFormName is deprecated & to be removed - the replacement is for the task to
+    // call $this->form->getSearchFormValues()
+    // A couple of extensions use it.
     $this->set('searchFormName', 'Builder');
 
     $this->set('context', 'builder');
diff --git a/civicrm/CRM/Contact/Form/Search/Custom.php b/civicrm/CRM/Contact/Form/Search/Custom.php
index cfc78ef8355b7a73c972547c30a25363667a4d91..d2b4fd4cdd393aa278c7bcfbfc4caca7e7d772a1 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom.php
@@ -19,6 +19,9 @@ class CRM_Contact_Form_Search_Custom extends CRM_Contact_Form_Search {
   protected $_customClass = NULL;
 
   public function preProcess() {
+    // SearchFormName is deprecated & to be removed - the replacement is for the task to
+    // call $this->form->getSearchFormValues()
+    // A couple of extensions use it.
     $this->set('searchFormName', 'Custom');
 
     $this->set('context', 'custom');
diff --git a/civicrm/CRM/Contact/Form/Search/Custom/FullText.php b/civicrm/CRM/Contact/Form/Search/Custom/FullText.php
index c8ea5961aa3235e76509a6e105610cd995b3c61c..09faca084a55d2e3a89037302cb159991043f034 100644
--- a/civicrm/CRM/Contact/Form/Search/Custom/FullText.php
+++ b/civicrm/CRM/Contact/Form/Search/Custom/FullText.php
@@ -297,11 +297,7 @@ WHERE      t.table_name = 'Activity' AND
     $config = CRM_Core_Config::singleton();
 
     $form->applyFilter('__ALL__', 'trim');
-    $form->add('text',
-      'text',
-      ts('Find'),
-      TRUE
-    );
+    $form->add('text', 'text', ts('Find'), NULL, TRUE);
 
     // also add a select box to allow the search to be constrained
     $tables = ['' => ts('All tables')];
diff --git a/civicrm/CRM/Contact/Form/Task.php b/civicrm/CRM/Contact/Form/Task.php
index 2f7695dc7db1b0d953f9111962ddf71ab59ff658..6dd27e02479e1b6f22d04d7d95b19553f061eff7 100644
--- a/civicrm/CRM/Contact/Form/Task.php
+++ b/civicrm/CRM/Contact/Form/Task.php
@@ -78,7 +78,7 @@ class CRM_Contact_Form_Task extends CRM_Core_Form_Task {
   /**
    * Common pre-processing function.
    *
-   * @param CRM_Core_Form $form
+   * @param \CRM_Core_Form_Task $form
    *
    * @throws \CRM_Core_Exception
    */
@@ -88,7 +88,7 @@ class CRM_Contact_Form_Task extends CRM_Core_Form_Task {
 
     $isStandAlone = in_array('task', $form->urlPath) || in_array('standalone', $form->urlPath);
     if ($isStandAlone) {
-      list($form->_task, $title) = CRM_Contact_Task::getTaskAndTitleByClass(get_class($form));
+      [$form->_task, $title] = CRM_Contact_Task::getTaskAndTitleByClass(get_class($form));
       if (!array_key_exists($form->_task, CRM_Contact_Task::permissionedTaskTitles(CRM_Core_Permission::getPermission()))) {
         CRM_Core_Error::statusBounce(ts('You do not have permission to access this page.'));
       }
@@ -103,19 +103,16 @@ class CRM_Contact_Form_Task extends CRM_Core_Form_Task {
     // we'll need to get fv from either search or adv search in the future
     $fragment = 'search';
     if ($form->_action == CRM_Core_Action::ADVANCED) {
-      self::$_searchFormValues = $form->controller->exportValues('Advanced');
       $fragment .= '/advanced';
     }
     elseif ($form->_action == CRM_Core_Action::PROFILE) {
-      self::$_searchFormValues = $form->controller->exportValues('Builder');
       $fragment .= '/builder';
     }
     elseif ($form->_action == CRM_Core_Action::COPY) {
-      self::$_searchFormValues = $form->controller->exportValues('Custom');
       $fragment .= '/custom';
     }
-    elseif (!$isStandAlone) {
-      self::$_searchFormValues = $form->controller->exportValues('Basic');
+    if (!$isStandAlone) {
+      self::$_searchFormValues = $form->getSearchFormValues();
     }
 
     //set the user context for redirection of task actions
@@ -125,15 +122,13 @@ class CRM_Contact_Form_Task extends CRM_Core_Form_Task {
       $urlParams .= "&qfKey=$qfKey";
     }
 
-    $cacheKey = "civicrm search {$qfKey}";
-
     $url = CRM_Utils_System::url('civicrm/contact/' . $fragment, $urlParams);
     $session = CRM_Core_Session::singleton();
     $session->replaceUserContext($url);
 
+    $cacheKey = "civicrm search {$qfKey}";
+
     $form->_task = self::$_searchFormValues['task'] ?? NULL;
-    $crmContactTaskTasks = CRM_Contact_Task::taskTitles();
-    $form->assign('taskName', CRM_Utils_Array::value($form->_task, $crmContactTaskTasks));
 
     // all contacts or action = save a search
     if ((CRM_Utils_Array::value('radio_ts', self::$_searchFormValues) == 'ts_all') ||
diff --git a/civicrm/CRM/Contact/Form/Task/AddToParentClass.php b/civicrm/CRM/Contact/Form/Task/AddToParentClass.php
index f98aa34e324ff2c48164eed1f66bf3cf5b09734f..aee54878d4754157a8addbf0f0562c59e53ce435 100644
--- a/civicrm/CRM/Contact/Form/Task/AddToParentClass.php
+++ b/civicrm/CRM/Contact/Form/Task/AddToParentClass.php
@@ -65,8 +65,13 @@ class CRM_Contact_Form_Task_AddToParentClass extends CRM_Contact_Form_Task {
     $this->assign('searchCount', $searchCount);
     $this->assign('searchDone', $this->get('searchDone'));
     $this->assign('contact_type_display', $contactType);
-    $this->addElement('submit', $this->getButtonName('refresh'), ts('Search'), ['class' => 'crm-form-submit']);
-    $this->addElement('submit', $this->getButtonName('cancel'), ts('Cancel'), ['class' => 'crm-form-submit']);
+    $buttonAttrs = [
+      'type' => 'submit',
+      'class' => 'crm-form-submit',
+      'value' => 1,
+    ];
+    $this->addElement('xbutton', $this->getButtonName('refresh'), ts('Search'), $buttonAttrs);
+    $this->addElement('xbutton', $this->getButtonName('cancel'), ts('Cancel'), $buttonAttrs);
     $this->addButtons([
       [
         'type' => 'next',
diff --git a/civicrm/CRM/Contact/Form/Task/Delete.php b/civicrm/CRM/Contact/Form/Task/Delete.php
index a4996b227f5e42c010aa6959b58e9d11636d401f..9fac47037a1875e4fc6130234d28a5c4f4324a12 100644
--- a/civicrm/CRM/Contact/Form/Task/Delete.php
+++ b/civicrm/CRM/Contact/Form/Task/Delete.php
@@ -119,7 +119,7 @@ class CRM_Contact_Form_Task_Delete extends CRM_Contact_Form_Task {
             'count' => $sharedAddressCount,
           ]);
         }
-        CRM_Core_Session::setStatus($message . ' ' . ts('Shared addresses will not be removed or altered but will no longer be shared.'), ts('Shared Addesses Owner'));
+        CRM_Core_Session::setStatus($message . ' ' . ts('Shared addresses will not be removed or altered but will no longer be shared.'), ts('Shared Addresses Owner'));
       }
 
       // set in form controller so that queries are not fired again
@@ -244,7 +244,7 @@ class CRM_Contact_Form_Task_Delete extends CRM_Contact_Form_Task {
       }
       $message .= '<ul><li>' . implode('</li><li>', $this->_sharedAddressMessage['contactList']) . '</li></ul>';
 
-      $session->setStatus($message, ts('Shared Addesses Owner Deleted'), 'info', ['expires' => 0]);
+      $session->setStatus($message, ts('Shared Addresses Owner Deleted'), 'info', ['expires' => 0]);
 
       $this->set('sharedAddressMessage', NULL);
     }
diff --git a/civicrm/CRM/Contact/Form/Task/EmailTrait.php b/civicrm/CRM/Contact/Form/Task/EmailTrait.php
index fb5e6ff51289720245aaca6104a66901b6528473..67c06172d8e10aa63031a919ff74cb2bfd971037 100644
--- a/civicrm/CRM/Contact/Form/Task/EmailTrait.php
+++ b/civicrm/CRM/Contact/Form/Task/EmailTrait.php
@@ -247,7 +247,7 @@ trait CRM_Contact_Form_Task_EmailTrait {
 
     $this->assign('totalSelectedContacts', count($this->_contactIds));
 
-    $this->add('text', 'subject', ts('Subject'), 'size=50 maxlength=254', TRUE);
+    $this->add('text', 'subject', ts('Subject'), ['size' => 50, 'maxlength' => 254], TRUE);
 
     $this->add('select', 'from_email_address', ts('From'), $this->_fromEmails, TRUE);
 
@@ -558,12 +558,12 @@ trait CRM_Contact_Form_Task_EmailTrait {
    *   e.g. <a href='{$contactURL}'>Bob Smith</a>'
    */
   protected function getEmailUrlString(array $emailIDs): string {
-    $urlString = '';
+    $urls = [];
     foreach ($emailIDs as $email) {
-      $contactURL = CRM_Utils_System::url('civicrm/contact/view', ['reset' => 1, 'force' => 1, 'cid' => $this->contactEmails[$email]['contact_id']], TRUE);
-      $urlString .= "<a href='{$contactURL}'>" . $this->contactEmails[$email]['contact.display_name'] . '</a>';
+      $contactURL = CRM_Utils_System::url('civicrm/contact/view', ['reset' => 1, 'cid' => $this->contactEmails[$email]['contact_id']], TRUE);
+      $urls[] = "<a href='{$contactURL}'>" . $this->contactEmails[$email]['contact.display_name'] . '</a>';
     }
-    return $urlString;
+    return implode(', ', $urls);
   }
 
   /**
diff --git a/civicrm/CRM/Contact/Form/Task/Label.php b/civicrm/CRM/Contact/Form/Task/Label.php
index 92252cad4b5439a99dff6d7c8959767dfe876b0a..724b6ef786455a5962b1f77876effdb9e505e3ea 100644
--- a/civicrm/CRM/Contact/Form/Task/Label.php
+++ b/civicrm/CRM/Contact/Form/Task/Label.php
@@ -96,7 +96,6 @@ class CRM_Contact_Form_Task_Label extends CRM_Contact_Form_Task {
    */
   public function postProcess($params = NULL) {
     $fv = $params ?: $this->controller->exportValues($this->_name);
-    $config = CRM_Core_Config::singleton();
     $locName = NULL;
     //get the address format sequence from the config file
     $mailingFormat = Civi::settings()->get('mailing_format');
@@ -146,15 +145,12 @@ class CRM_Contact_Form_Task_Label extends CRM_Contact_Form_Task {
       $returnProperties['last_name'] = 1;
     }
 
-    $individualFormat = FALSE;
-
     /*
      * CRM-8338: replace ids of household members with the id of their household
      * so we can merge labels by household.
      */
     if (isset($fv['merge_same_household'])) {
       $this->mergeContactIdsByHousehold();
-      $individualFormat = TRUE;
     }
 
     //get the contacts information
@@ -200,13 +196,12 @@ class CRM_Contact_Form_Task_Label extends CRM_Contact_Form_Task {
 
     //get the total number of contacts to fetch from database.
     $numberofContacts = count($this->_contactIds);
-    $query = new CRM_Contact_BAO_Query($params, $returnProperties);
-    $details = $query->apiQuery($params, $returnProperties, NULL, NULL, 0, $numberofContacts, TRUE, FALSE, TRUE, CRM_Contact_BAO_Query::MODE_CONTACTS, NULL, $primaryLocationOnly);
+    [$details] = CRM_Contact_BAO_Query::apiQuery($params, $returnProperties, NULL, NULL, 0, $numberofContacts, TRUE, FALSE, TRUE, CRM_Contact_BAO_Query::MODE_CONTACTS, NULL, $primaryLocationOnly);
     $messageToken = CRM_Utils_Token::getTokens($mailingFormat);
 
-    // $details[0] is an array of [ contactID => contactDetails ]
+    // $details is an array of [ contactID => contactDetails ]
     // also get all token values
-    CRM_Utils_Hook::tokenValues($details[0],
+    CRM_Utils_Hook::tokenValues($details,
       $this->_contactIds,
       NULL,
       $messageToken,
@@ -224,11 +219,11 @@ class CRM_Contact_Form_Task_Label extends CRM_Contact_Form_Task {
 
     foreach ($this->_contactIds as $value) {
       foreach ($custom as $cfID) {
-        if (isset($details[0][$value]["custom_{$cfID}"])) {
-          $details[0][$value]["custom_{$cfID}"] = CRM_Core_BAO_CustomField::displayValue($details[0][$value]["custom_{$cfID}"], $cfID);
+        if (isset($details[$value]["custom_{$cfID}"])) {
+          $details[$value]["custom_{$cfID}"] = CRM_Core_BAO_CustomField::displayValue($details[$value]["custom_{$cfID}"], $cfID);
         }
       }
-      $contact = $details['0'][$value] ?? NULL;
+      $contact = $details[$value] ?? NULL;
 
       if (is_a($contact, 'CRM_Core_Error')) {
         return NULL;
@@ -271,7 +266,7 @@ class CRM_Contact_Form_Task_Label extends CRM_Contact_Form_Task {
                   'im',
                   'openid',
                 ])) {
-                  if ($k == 'im') {
+                  if ($k === 'im') {
                     $rows[$value][$k] = $v['1']['name'];
                   }
                   else {
diff --git a/civicrm/CRM/Contact/Form/Task/LabelCommon.php b/civicrm/CRM/Contact/Form/Task/LabelCommon.php
index c0c561ff26483de14980692186a73307d302bcb4..5b7a295e87366cc69a96a3b81687fa4422c737e1 100644
--- a/civicrm/CRM/Contact/Form/Task/LabelCommon.php
+++ b/civicrm/CRM/Contact/Form/Task/LabelCommon.php
@@ -30,7 +30,10 @@ class CRM_Contact_Form_Task_LabelCommon {
    * @param string $fileName
    *   The name of the file to save the label in.
    */
-  public static function createLabel(&$contactRows, &$format, $fileName = 'MailingLabels_CiviCRM.pdf') {
+  public static function createLabel($contactRows, $format, $fileName = 'MailingLabels_CiviCRM.pdf') {
+    if (CIVICRM_UF === 'UnitTests') {
+      throw new CRM_Core_Exception_PrematureExitException('civiExit called', ['rows' => $contactRows, 'format' => $format, 'file_name' => $fileName]);
+    }
     $pdf = new CRM_Utils_PDF_Label($format, 'mm');
     $pdf->Open();
     $pdf->AddPage();
@@ -136,12 +139,9 @@ class CRM_Contact_Form_Task_LabelCommon {
     $numberofContacts = count($contactIDs);
     //this does the same as calling civicrm_api3('contact, get, array('id' => array('IN' => $this->_contactIds)
     // except it also handles multiple locations
-    $query = new CRM_Contact_BAO_Query($params, $returnProperties);
-    $details = $query->apiQuery($params, $returnProperties, NULL, NULL, 0, $numberofContacts);
+    [$details] = CRM_Contact_BAO_Query::apiQuery($params, $returnProperties, NULL, NULL, 0, $numberofContacts);
 
-    $messageToken = CRM_Utils_Token::getTokens($mailingFormat);
-    // $details[0] is an array of [ contactID => contactDetails ]
-    $details = $details[0];
+    // $details is an array of [ contactID => contactDetails ]
     $tokenFields = CRM_Contact_Form_Task_LabelCommon::getTokenData($details);
 
     foreach ($contactIDs as $value) {
diff --git a/civicrm/CRM/Contact/Form/Task/SaveSearch.php b/civicrm/CRM/Contact/Form/Task/SaveSearch.php
index a98a29fee0adacc8c6bae1dcaa91ace5448e2328..f843f69ecb1b3c319eab8131ab63fb59ec4e39b3 100644
--- a/civicrm/CRM/Contact/Form/Task/SaveSearch.php
+++ b/civicrm/CRM/Contact/Form/Task/SaveSearch.php
@@ -53,9 +53,7 @@ class CRM_Contact_Form_Task_SaveSearch extends CRM_Contact_Form_Task {
     // Get Task name
     $modeValue = CRM_Contact_Form_Search::getModeValue(CRM_Utils_Array::value('component_mode', $values, CRM_Contact_BAO_Query::MODE_CONTACTS));
     $className = $modeValue['taskClassName'];
-    $taskList = $className::taskTitles();
     $this->_task = $values['task'] ?? NULL;
-    $this->assign('taskName', CRM_Utils_Array::value($this->_task, $taskList));
   }
 
   /**
diff --git a/civicrm/CRM/Contact/Import/Form/MapField.php b/civicrm/CRM/Contact/Import/Form/MapField.php
index dc09e731f58a1712143493cd090bd878cae7183d..8475dcd070cd9b825d3539d91ff87bb9bbc7ed8f 100644
--- a/civicrm/CRM/Contact/Import/Form/MapField.php
+++ b/civicrm/CRM/Contact/Import/Form/MapField.php
@@ -149,14 +149,11 @@ class CRM_Contact_Import_Form_MapField extends CRM_Import_Form_MapField {
     }
     else {
       // get the field names from the temp. DB table
-      $dao = new CRM_Core_DAO();
-      $db = $dao->getDatabaseConnection();
-
       $columnsQuery = "SHOW FIELDS FROM $this->_importTableName
                          WHERE Field NOT LIKE '\_%'";
-      $columnsResult = $db->query($columnsQuery);
-      while ($row = $columnsResult->fetchRow(DB_FETCHMODE_ASSOC)) {
-        $columnNames[] = $row['Field'];
+      $columnsResult = CRM_Core_DAO::executeQuery($columnsQuery);
+      while ($columnsResult->fetch()) {
+        $columnNames[] = $columnsResult->Field;
       }
     }
 
diff --git a/civicrm/CRM/Contact/Page/View.php b/civicrm/CRM/Contact/Page/View.php
index faeb0cb8cfcf03611a8aced9fff676b28c9b0ff5..ce076fe83c89d94e7652d5ef7f6d248864db0f67 100644
--- a/civicrm/CRM/Contact/Page/View.php
+++ b/civicrm/CRM/Contact/Page/View.php
@@ -311,7 +311,13 @@ class CRM_Contact_Page_View extends CRM_Core_Page {
     }
     if ($isDeleted) {
       $title = "<del>{$title}</del>";
-      $mergedTo = civicrm_api3('Contact', 'getmergedto', ['contact_id' => $contactId, 'api.Contact.get' => ['return' => 'display_name']]);
+      try {
+        $mergedTo = civicrm_api3('Contact', 'getmergedto', ['contact_id' => $contactId, 'api.Contact.get' => ['return' => 'display_name']]);
+      }
+      catch (CiviCRM_API3_Exception $e) {
+        CRM_Core_Session::singleton()->setStatus(ts('This contact was deleted during a merge operation. The contact it was merged into cannot be found and may have been deleted.'));
+        $mergedTo = ['count' => 0];
+      }
       if ($mergedTo['count']) {
         $mergedToContactID = $mergedTo['id'];
         $mergedToDisplayName = $mergedTo['values'][$mergedToContactID]['api.Contact.get']['values'][0]['display_name'];
diff --git a/civicrm/CRM/Contact/Page/View/Summary.php b/civicrm/CRM/Contact/Page/View/Summary.php
index a9f61ee85c27cf6f7cff9fff09da041290844622..e173a8df5487c082dd883b4adac8b04169fcc04a 100644
--- a/civicrm/CRM/Contact/Page/View/Summary.php
+++ b/civicrm/CRM/Contact/Page/View/Summary.php
@@ -425,9 +425,8 @@ class CRM_Contact_Page_View_Summary extends CRM_Contact_Page_View {
       $weight += 10;
     }
 
+    // Allow other modules to add or remove tabs
     $context = ['contact_id' => $this->_contactId];
-    // see if any other modules want to add any tabs
-    CRM_Utils_Hook::tabs($allTabs, $this->_contactId);
     CRM_Utils_Hook::tabset('civicrm/contact/view', $allTabs, $context);
 
     // now sort the tabs based on weight
diff --git a/civicrm/CRM/Contact/Selector.php b/civicrm/CRM/Contact/Selector.php
index 2296ddd2e43c8d7c262ea4055119131fbe5b206f..0986377581838dd60cb99d8699ce4cd043afba6f 100644
--- a/civicrm/CRM/Contact/Selector.php
+++ b/civicrm/CRM/Contact/Selector.php
@@ -1018,6 +1018,8 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se
    */
   public function fillupPrevNextCache($sort, $cacheKey, $start = 0, $end = self::CACHE_SIZE) {
     $coreSearch = TRUE;
+    // This ensures exceptions are caught in the try-catch.
+    $handling = CRM_Core_TemporaryErrorScope::useException();
     // For custom searches, use the contactIDs method
     if (is_a($this, 'CRM_Contact_Selector_Custom')) {
       $sql = $this->_search->contactIDs($start, $end, $sort, TRUE);
@@ -1046,7 +1048,7 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se
     try {
       Civi::service('prevnext')->fillWithSql($cacheKey, $sql);
     }
-    catch (CRM_Core_Exception $e) {
+    catch (\Exception $e) {
       if ($coreSearch) {
         // in the case of error, try rebuilding cache using full sql which is used for search selector display
         // this fixes the bugs reported in CRM-13996 & CRM-14438
diff --git a/civicrm/CRM/Contact/Task.php b/civicrm/CRM/Contact/Task.php
index 06696a2953056d701bd5f0eafcd512b7de7df6b4..8832759e3cc06eac867955f60ce24a236ad60b2f 100644
--- a/civicrm/CRM/Contact/Task.php
+++ b/civicrm/CRM/Contact/Task.php
@@ -234,7 +234,7 @@ class CRM_Contact_Task extends CRM_Core_Task {
       if (CRM_Core_Permission::access('CiviEvent')) {
         self::$_tasks[self::ADD_EVENT] = array(
           'title' => ts('Register participants for event'),
-          'class' => 'CRM_Event_Form_Participant',
+          'class' => 'CRM_Event_Form_Task_Register',
         );
       }
 
diff --git a/civicrm/CRM/Contribute/ActionMapping/ByPage.php b/civicrm/CRM/Contribute/ActionMapping/ByPage.php
index 8c09c81cc274faecc894c526c9be23cf13041d74..6dcab6e2a7aeb77f9d88a784731f18b69160c3a9 100644
--- a/civicrm/CRM/Contribute/ActionMapping/ByPage.php
+++ b/civicrm/CRM/Contribute/ActionMapping/ByPage.php
@@ -216,4 +216,12 @@ class CRM_Contribute_ActionMapping_ByPage implements \Civi\ActionSchedule\Mappin
     return FALSE;
   }
 
+  /**
+   * Determine whether a schedule based on this mapping should
+   * send to additional contacts.
+   */
+  public function sendToAdditional($entityId): bool {
+    return TRUE;
+  }
+
 }
diff --git a/civicrm/CRM/Contribute/ActionMapping/ByType.php b/civicrm/CRM/Contribute/ActionMapping/ByType.php
index ea259901a569be5d106631db48688813c5a9dacf..88d60e49c767eb078edb1e8b9f2e70bf9120ccac 100644
--- a/civicrm/CRM/Contribute/ActionMapping/ByType.php
+++ b/civicrm/CRM/Contribute/ActionMapping/ByType.php
@@ -235,4 +235,12 @@ class CRM_Contribute_ActionMapping_ByType implements \Civi\ActionSchedule\Mappin
     return FALSE;
   }
 
+  /**
+   * Determine whether a schedule based on this mapping should
+   * send to additional contacts.
+   */
+  public function sendToAdditional($entityId): bool {
+    return TRUE;
+  }
+
 }
diff --git a/civicrm/CRM/Contribute/BAO/Contribution.php b/civicrm/CRM/Contribute/BAO/Contribution.php
index 238c4f196d3c95f0e3150a132c6c49cb19dfb48a..e931c645dd0e92531d774dc8b78ffbb2739fae55 100644
--- a/civicrm/CRM/Contribute/BAO/Contribution.php
+++ b/civicrm/CRM/Contribute/BAO/Contribution.php
@@ -12,6 +12,8 @@
 use Civi\Api4\Activity;
 use Civi\Api4\ContributionPage;
 use Civi\Api4\ContributionRecur;
+use Civi\Api4\Participant;
+use Civi\Api4\PaymentProcessor;
 
 /**
  *
@@ -84,22 +86,17 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
    *
    * @param array $params
    *   (reference ) an assoc array of name/value pairs.
-   * @param array $ids
-   *   The array that holds all the db ids.
    *
    * @return \CRM_Contribute_BAO_Contribution
    * @throws \CRM_Core_Exception
    * @throws \CiviCRM_API3_Exception
    */
-  public static function add(&$params, $ids = []) {
+  public static function add(&$params) {
     if (empty($params)) {
       return NULL;
     }
-    if (!empty($ids)) {
-      CRM_Core_Error::deprecatedFunctionWarning('ids should not be passed into Contribution.add');
-    }
-    //per http://wiki.civicrm.org/confluence/display/CRM/Database+layer we are moving away from $ids array
-    $contributionID = CRM_Utils_Array::value('contribution', $ids, CRM_Utils_Array::value('id', $params));
+
+    $contributionID = $params['id'] ?? NULL;
     $action = $contributionID ? 'edit' : 'create';
     $duplicates = [];
     if (self::checkDuplicate($params, $duplicates, $contributionID)) {
@@ -149,18 +146,6 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
     }
 
     $setPrevContribution = TRUE;
-    // CRM-13964 partial payment
-    if (!empty($params['partial_payment_total']) && !empty($params['partial_amount_to_pay'])) {
-      CRM_Core_Error::deprecatedFunctionWarning('partial_amount params are deprecated from Contribution.create - use Payment.create');
-      $partialAmtTotal = $params['partial_payment_total'];
-      $partialAmtPay = $params['partial_amount_to_pay'];
-      $params['total_amount'] = $partialAmtTotal;
-      if ($partialAmtPay < $partialAmtTotal) {
-        $params['contribution_status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Partially paid');
-        $params['is_pay_later'] = 0;
-        $setPrevContribution = FALSE;
-      }
-    }
     if ($contributionID && $setPrevContribution) {
       $params['prevContribution'] = self::getOriginalContribution($contributionID);
     }
@@ -215,7 +200,7 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
       CRM_Contribute_BAO_ContributionRecur::updateOnNewPayment(
         (!empty($params['contribution_recur_id']) ? $params['contribution_recur_id'] : $params['prevContribution']->contribution_recur_id),
         $contributionStatus,
-        CRM_Utils_Array::value('receive_date', $params)
+        $params['receive_date'] ?? NULL
       );
     }
 
@@ -444,7 +429,7 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
    *
    * @return int
    */
-  public function getNumTermsByContributionAndMembershipType($membershipTypeID, $contributionID) {
+  public static function getNumTermsByContributionAndMembershipType($membershipTypeID, $contributionID) {
     $numTerms = CRM_Core_DAO::singleValueQuery("
       SELECT membership_num_terms FROM civicrm_line_item li
       LEFT JOIN civicrm_price_field_value v ON li.price_field_value_id = v.id
@@ -460,8 +445,6 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
    *
    * @param array $params
    *   (reference ) an assoc array of name/value pairs.
-   * @param array $ids
-   *   The array that holds all the db ids.
    *
    * @return CRM_Contribute_BAO_Contribution
    *
@@ -469,27 +452,11 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
    * @throws \CRM_Core_Exception
    * @throws \CiviCRM_API3_Exception
    */
-  public static function create(&$params, $ids = []) {
-    $dateFields = [
-      'receive_date',
-      'cancel_date',
-      'receipt_date',
-      'thankyou_date',
-      'revenue_recognition_date',
-    ];
-    foreach ($dateFields as $df) {
-      if (isset($params[$df])) {
-        $params[$df] = CRM_Utils_Date::isoToMysql($params[$df]);
-      }
-    }
+  public static function create(&$params) {
 
     $transaction = new CRM_Core_Transaction();
 
     try {
-      if (!isset($params['id']) && isset($ids['contribution'])) {
-        CRM_Core_Error::deprecatedFunctionWarning('ids should not be used for contribution create');
-        $params['id'] = $ids['contribution'];
-      }
       $contribution = self::add($params);
     }
     catch (CRM_Core_Exception $e) {
@@ -1377,6 +1344,78 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution {
     return TRUE;
   }
 
+  /**
+   * Process failed contribution.
+   *
+   * @param $processContributionObject
+   * @param $memberships
+   * @param $contributionId
+   * @param array $membershipStatuses
+   * @param array $updateResult
+   * @param $participant
+   * @param $pledgePayment
+   * @param $pledgeID
+   * @param array $pledgePaymentIDs
+   * @param $contributionStatusId
+   *
+   * @return array
+   * @throws \CRM_Core_Exception
+   */
+  protected static function processFail($processContributionObject, $memberships, $contributionId, array $membershipStatuses, array $updateResult, $participant, $pledgePayment, $pledgeID, array $pledgePaymentIDs, $contributionStatusId): array {
+    $processContribution = FALSE;
+    if (is_array($memberships)) {
+      foreach ($memberships as $membership) {
+        $update = TRUE;
+        //Update Membership status if there is no other completed contribution associated with the membership.
+        $relatedContributions = CRM_Member_BAO_Membership::getMembershipContributionId($membership->id, TRUE);
+        foreach ($relatedContributions as $contriId) {
+          if ($contriId == $contributionId) {
+            continue;
+          }
+          $statusId = CRM_Core_DAO::getFieldValue('CRM_Contribute_BAO_Contribution', $contriId, 'contribution_status_id');
+          if (CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $statusId) === 'Completed') {
+            $update = FALSE;
+          }
+        }
+        if ($membership && $update) {
+          $membership->status_id = array_search('Expired', $membershipStatuses);
+          $membership->is_override = TRUE;
+          $membership->status_override_end_date = 'null';
+          $membership->save();
+
+          $updateResult['updatedComponents']['CiviMember'] = $membership->status_id;
+          if ($processContributionObject) {
+            $processContribution = TRUE;
+          }
+        }
+      }
+    }
+    if ($participant) {
+      $oldStatus = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Participant',
+        $participant->id,
+        'status_id'
+      );
+      $participantStatuses = CRM_Event_PseudoConstant::participantStatus();
+      $updatedStatusId = array_search('Cancelled', $participantStatuses);
+      CRM_Event_BAO_Participant::updateParticipantStatus($participant->id, $oldStatus, $updatedStatusId, TRUE);
+
+      $updateResult['updatedComponents']['CiviEvent'] = $updatedStatusId;
+      if ($processContributionObject) {
+        $processContribution = TRUE;
+      }
+    }
+
+    if ($pledgePayment) {
+      CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeID, $pledgePaymentIDs, $contributionStatusId);
+
+      $updateResult['updatedComponents']['CiviPledge'] = $contributionStatusId;
+      if ($processContributionObject) {
+        $processContribution = TRUE;
+      }
+    }
+    return [$updateResult, $processContribution];
+  }
+
   /**
    * @inheritDoc
    */
@@ -2141,11 +2180,7 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
       return $updateResult;
     }
 
-    //now we are ready w/ required ids, start processing.
-
-    $baseIPN = new CRM_Core_Payment_BaseIPN();
-
-    $input = $ids = $objects = [];
+    $input = $ids = [];
 
     $input['component'] = $componentDetails['component'] ?? NULL;
     $ids['contribution'] = $contributionId;
@@ -2157,14 +2192,16 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
     $ids['contributionRecur'] = NULL;
     $ids['contributionPage'] = NULL;
 
-    if (!$baseIPN->validateData($input, $ids, $objects, FALSE)) {
-      throw new CRM_Core_Exception('Unable to validate supplied data');
-    }
+    $contribution = new CRM_Contribute_BAO_Contribution();
+    $contribution->id = $ids['contribution'];
+    $contribution->find();
+
+    $contribution->loadRelatedObjects($input, $ids);
+
+    $memberships = $contribution->_relatedObjects['membership'] ?? [];
+    $participant = $contribution->_relatedObjects['participant'] ?? [];
+    $pledgePayment = $contribution->_relatedObjects['pledge_payment'] ?? [];
 
-    $memberships = &$objects['membership'];
-    $participant = &$objects['participant'];
-    $pledgePayment = &$objects['pledge_payment'];
-    $contribution = &$objects['contribution'];
     $pledgeID = $oldStatus = NULL;
     $pledgePaymentIDs = [];
     if ($pledgePayment) {
@@ -2190,51 +2227,7 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
       list($updateResult, $processContribution) = self::cancel($processContributionObject, $memberships, $contributionId, $membershipStatuses, $updateResult, $participant, $oldStatus, $pledgePayment, $pledgeID, $pledgePaymentIDs, $contributionStatusId);
     }
     elseif ($contributionStatusId == array_search('Failed', $contributionStatuses)) {
-      if (is_array($memberships)) {
-        foreach ($memberships as $membership) {
-          $update = TRUE;
-          //Update Membership status if there is no other completed contribution associated with the membership.
-          $relatedContributions = CRM_Member_BAO_Membership::getMembershipContributionId($membership->id, TRUE);
-          foreach ($relatedContributions as $contriId) {
-            if ($contriId == $contributionId) {
-              continue;
-            }
-            $statusId = CRM_Core_DAO::getFieldValue('CRM_Contribute_BAO_Contribution', $contriId, 'contribution_status_id');
-            if (CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $statusId) === 'Completed') {
-              $update = FALSE;
-            }
-          }
-          if ($membership && $update) {
-            $membership->status_id = array_search('Expired', $membershipStatuses);
-            $membership->is_override = TRUE;
-            $membership->status_override_end_date = 'null';
-            $membership->save();
-
-            $updateResult['updatedComponents']['CiviMember'] = $membership->status_id;
-            if ($processContributionObject) {
-              $processContribution = TRUE;
-            }
-          }
-        }
-      }
-      if ($participant) {
-        $updatedStatusId = array_search('Cancelled', $participantStatuses);
-        CRM_Event_BAO_Participant::updateParticipantStatus($participant->id, $oldStatus, $updatedStatusId, TRUE);
-
-        $updateResult['updatedComponents']['CiviEvent'] = $updatedStatusId;
-        if ($processContributionObject) {
-          $processContribution = TRUE;
-        }
-      }
-
-      if ($pledgePayment) {
-        CRM_Pledge_BAO_PledgePayment::updatePledgePaymentStatus($pledgeID, $pledgePaymentIDs, $contributionStatusId);
-
-        $updateResult['updatedComponents']['CiviPledge'] = $contributionStatusId;
-        if ($processContributionObject) {
-          $processContribution = TRUE;
-        }
-      }
+      list($updateResult, $processContribution) = self::processFail($processContributionObject, $memberships, $contributionId, $membershipStatuses, $updateResult, $participant, $pledgePayment, $pledgeID, $pledgePaymentIDs, $contributionStatusId);
     }
     elseif ($contributionStatusId == array_search('Completed', $contributionStatuses)) {
 
@@ -2277,8 +2270,7 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
               WHERE     membership_id=$membership->id
               ORDER BY  id DESC
               LIMIT     1;";
-            $dao = new CRM_Core_DAO();
-            $dao->query($sql);
+            $dao = CRM_Core_DAO::executeQuery($sql);
             if ($dao->fetch()) {
               if (!empty($dao->membership_type_id)) {
                 $membership->membership_type_id = $dao->membership_type_id;
@@ -2290,7 +2282,7 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
             $numterms = 1;
             $lineitems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($contributionId);
             foreach ($lineitems as $lineitem) {
-              if ($membership->membership_type_id == CRM_Utils_Array::value('membership_type_id', $lineitem)) {
+              if ($membership->membership_type_id == ($lineitem['membership_type_id'] ?? NULL)) {
                 $numterms = $lineitem['membership_num_terms'] ?? NULL;
 
                 // in case membership_num_terms comes through as null or zero
@@ -2329,7 +2321,7 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
             $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dates['start_date'],
               $dates['end_date'],
               $dates['join_date'],
-              'today',
+              'now',
               TRUE,
               $membership->membership_type_id,
               (array) $membership
@@ -2352,7 +2344,7 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
             //updating the membership log
             $membershipLog = [];
             $membershipLog = $formattedParams;
-            $logStartDate = CRM_Utils_Date::customFormat(CRM_Utils_Array::value('log_start_date', $dates), $format);
+            $logStartDate = CRM_Utils_Date::customFormat($dates['log_start_date'] ?? NULL, $format);
             $logStartDate = ($logStartDate) ? CRM_Utils_Date::isoToMysql($logStartDate) : $formattedParams['start_date'];
 
             $membershipLog['start_date'] = $logStartDate;
@@ -2802,7 +2794,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
    *   Load all related objects - even where id not passed in? (allows API to call this).
    *
    * @return bool
-   * @throws Exception
+   * @throws CRM_Core_Exception
    */
   public function loadRelatedObjects($input, &$ids, $loadAll = FALSE) {
     // @todo deprecate this function - the steps should be
@@ -2869,7 +2861,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
         $payment = new CRM_Pledge_BAO_PledgePayment();
         $payment->id = $paymentID;
         if (!$payment->find(TRUE)) {
-          throw new Exception("Could not find pledge payment record: " . $paymentID);
+          throw new CRM_Core_Exception("Could not find pledge payment record: " . $paymentID);
         }
         $this->_relatedObjects['pledge_payment'][] = $payment;
       }
@@ -2887,7 +2879,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       if ($ids['event'] &&
         !$event->find(TRUE)
       ) {
-        throw new Exception("Could not find event: " . $ids['event']);
+        throw new CRM_Core_Exception("Could not find event: " . $ids['event']);
       }
 
       $this->_relatedObjects['event'] = &$event;
@@ -2897,7 +2889,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       if ($ids['participant'] &&
         !$participant->find(TRUE)
       ) {
-        throw new Exception("Could not find participant: " . $ids['participant']);
+        throw new CRM_Core_Exception("Could not find participant: " . $ids['participant']);
       }
       $participant->register_date = CRM_Utils_Date::isoToMysql($participant->register_date);
 
@@ -3183,10 +3175,10 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
           foreach ($lineItems as &$eachItem) {
             if (isset($this->_relatedObjects['membership'])
               && is_array($this->_relatedObjects['membership'])
-              && array_key_exists($eachItem['membership_type_id'], $this->_relatedObjects['membership'])) {
-              $eachItem['join_date'] = CRM_Utils_Date::customFormat($this->_relatedObjects['membership'][$eachItem['membership_type_id']]->join_date);
-              $eachItem['start_date'] = CRM_Utils_Date::customFormat($this->_relatedObjects['membership'][$eachItem['membership_type_id']]->start_date);
-              $eachItem['end_date'] = CRM_Utils_Date::customFormat($this->_relatedObjects['membership'][$eachItem['membership_type_id']]->end_date);
+              && array_key_exists($eachItem['entity_id'] . '_' . $eachItem['membership_type_id'], $this->_relatedObjects['membership'])) {
+              $eachItem['join_date'] = CRM_Utils_Date::customFormat($this->_relatedObjects['membership'][$eachItem['entity_id'] . '_' . $eachItem['membership_type_id']]->join_date);
+              $eachItem['start_date'] = CRM_Utils_Date::customFormat($this->_relatedObjects['membership'][$eachItem['entity_id'] . '_' . $eachItem['membership_type_id']]->start_date);
+              $eachItem['end_date'] = CRM_Utils_Date::customFormat($this->_relatedObjects['membership'][$eachItem['entity_id'] . '_' . $eachItem['membership_type_id']]->end_date);
             }
             // This is actually used in conjunction with is_quick_config in the template & we should deprecate it.
             // However, that does create upgrade pain so would be better to be phased in.
@@ -3265,7 +3257,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
 
     // For some unit tests contribution cannot contain paymentProcessor information
     $billingMode = empty($this->_relatedObjects['paymentProcessor']) ? CRM_Core_Payment::BILLING_MODE_NOTIFY : $this->_relatedObjects['paymentProcessor']['billing_mode'];
-    $template->assign('contributeMode', CRM_Utils_Array::value($billingMode, CRM_Core_SelectValues::contributeMode()));
+    $template->assign('contributeMode', CRM_Core_SelectValues::contributeMode()[$billingMode] ?? NULL);
 
     //assign honor information to receipt message
     $softRecord = CRM_Contribute_BAO_ContributionSoft::getSoftContribution($this->id);
@@ -3315,7 +3307,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       $template->assign('price', $productDAO->price);
       $template->assign('sku', $productDAO->sku);
     }
-    $template->assign('title', CRM_Utils_Array::value('title', $values));
+    $template->assign('title', $values['title'] ?? NULL);
     $values['amount'] = CRM_Utils_Array::value('total_amount', $input, (CRM_Utils_Array::value('amount', $input)), NULL);
     if (!$values['amount'] && isset($this->total_amount)) {
       $values['amount'] = $this->total_amount;
@@ -3361,11 +3353,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     );
     $values['receipt_date'] = (empty($this->receipt_date) ? NULL : $this->receipt_date);
     $template->assign('action', $this->is_test ? 1024 : 1);
-    $template->assign('receipt_text',
-      CRM_Utils_Array::value('receipt_text',
-        $values
-      )
-    );
+    $template->assign('receipt_text', $values['receipt_text'] ?? NULL);
     $template->assign('is_monetary', 1);
     $template->assign('is_recur', !empty($this->contribution_recur_id));
     $template->assign('currency', $this->currency);
@@ -3569,47 +3557,6 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     }
 
     $statusId = $params['contribution']->contribution_status_id;
-    // CRM-13964 partial payment
-    if ($contributionStatus == 'Partially paid'
-      && !empty($params['partial_payment_total']) && !empty($params['partial_amount_to_pay'])
-    ) {
-      CRM_Core_Error::deprecatedFunctionWarning('partial_amount params are deprecated from Contribution.create - use Payment.create');
-      $partialAmtPay = CRM_Utils_Rule::cleanMoney($params['partial_amount_to_pay']);
-      $partialAmtTotal = CRM_Utils_Rule::cleanMoney($params['partial_payment_total']);
-
-      $fromFinancialAccountId = CRM_Financial_BAO_FinancialAccount::getFinancialAccountForFinancialTypeByRelationship($params['financial_type_id'], 'Accounts Receivable Account is');
-      $statusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
-      $params['total_amount'] = $partialAmtPay;
-
-      $balanceTrxnInfo = CRM_Core_BAO_FinancialTrxn::getBalanceTrxnAmt($params['contribution']->id, $params['financial_type_id']);
-      if (empty($balanceTrxnInfo['trxn_id'])) {
-        // create new balance transaction record
-        $toFinancialAccount = CRM_Financial_BAO_FinancialAccount::getFinancialAccountForFinancialTypeByRelationship($params['financial_type_id'], 'Accounts Receivable Account is');
-
-        $balanceTrxnParams['total_amount'] = $partialAmtTotal;
-        $balanceTrxnParams['to_financial_account_id'] = $toFinancialAccount;
-        $balanceTrxnParams['contribution_id'] = $params['contribution']->id;
-        $balanceTrxnParams['trxn_date'] = !empty($params['contribution']->receive_date) ? $params['contribution']->receive_date : date('YmdHis');
-        $balanceTrxnParams['fee_amount'] = $params['fee_amount'] ?? NULL;
-        $balanceTrxnParams['net_amount'] = $params['net_amount'] ?? NULL;
-        $balanceTrxnParams['currency'] = $params['contribution']->currency;
-        $balanceTrxnParams['trxn_id'] = $params['contribution']->trxn_id;
-        $balanceTrxnParams['status_id'] = $statusId;
-        $balanceTrxnParams['payment_instrument_id'] = $params['contribution']->payment_instrument_id;
-        $balanceTrxnParams['check_number'] = $params['check_number'] ?? NULL;
-        $balanceTrxnParams['pan_truncation'] = $params['pan_truncation'] ?? NULL;
-        $balanceTrxnParams['card_type_id'] = $params['card_type_id'] ?? NULL;
-        if (!empty($balanceTrxnParams['from_financial_account_id']) &&
-          ($statusId == array_search('Completed', $contributionStatuses) || $statusId == array_search('Partially paid', $contributionStatuses))
-        ) {
-          $balanceTrxnParams['is_payment'] = 1;
-        }
-        if (!empty($params['payment_processor'])) {
-          $balanceTrxnParams['payment_processor_id'] = $params['payment_processor'];
-        }
-        $financialTxn = CRM_Core_BAO_FinancialTrxn::create($balanceTrxnParams);
-      }
-    }
 
     // build line item array if its not set in $params
     if (empty($params['line_item']) || $additionalParticipantId) {
@@ -4201,11 +4148,11 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
    * Get the tax amount (misnamed function).
    *
    * @param array $params
-   * @param bool $isLineItem
    *
    * @return array
+   * @throws \CiviCRM_API3_Exception
    */
-  public static function checkTaxAmount($params, $isLineItem = FALSE) {
+  protected static function checkTaxAmount($params) {
     $taxRates = CRM_Core_PseudoConstant::getTaxRates();
 
     // Update contribution.
@@ -4251,8 +4198,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
 
     // New Contribution and update of contribution with tax rate financial type
     if (isset($params['financial_type_id']) && array_key_exists($params['financial_type_id'], $taxRates) &&
-      empty($params['skipLineItem']) && !$isLineItem
-    ) {
+      empty($params['skipLineItem'])) {
       $taxRateParams = $taxRates[$params['financial_type_id']];
       $taxAmount = CRM_Contribute_BAO_Contribution_Utils::calculateTaxAmount(CRM_Utils_Array::value('total_amount', $params), $taxRateParams);
       $params['tax_amount'] = round($taxAmount['tax_amount'], 2);
@@ -4392,22 +4338,6 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     }
   }
 
-  /**
-   * Compute the stats values
-   *
-   * @param string $stat either 'mode' or 'median'
-   * @param string $sql
-   * @param string $alias of civicrm_contribution
-   *
-   * @return array|null
-   * @deprecated
-   *
-   */
-  public static function computeStats($stat, $sql, $alias = NULL) {
-    CRM_Core_Error::deprecatedFunctionWarning('computeStats is now deprecated');
-    return [];
-  }
-
   /**
    * Is there only one line item attached to the contribution.
    *
@@ -4446,6 +4376,8 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
   public static function completeOrder($input, $ids, $objects, $isPostPaymentCreate = FALSE) {
     $transaction = new CRM_Core_Transaction();
     $contribution = $objects['contribution'];
+    // Unset objects just to make it clear it's not used again.
+    unset($objects);
     // @todo see if we even need this - it's used further down to create an activity
     // but the BAO layer should create that - we just need to add a test to cover it & can
     // maybe remove $ids altogether.
@@ -4475,32 +4407,20 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       'financial_type_id',
     ];
 
-    $event = $objects['event'] ?? NULL;
-
-    $paymentProcessorId = '';
-    if (isset($objects['paymentProcessor'])) {
-      if (is_array($objects['paymentProcessor'])) {
-        $paymentProcessorId = $objects['paymentProcessor']['id'];
-      }
-      else {
-        $paymentProcessorId = $objects['paymentProcessor']->id;
-      }
-    }
+    $paymentProcessorId = $input['payment_processor_id'] ?? NULL;
 
     $completedContributionStatusID = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
 
     $contributionParams = array_merge([
       'contribution_status_id' => $completedContributionStatusID,
-      'source' => self::getRecurringContributionDescription($contribution, $event),
+      'source' => self::getRecurringContributionDescription($contribution, $participantID),
     ], array_intersect_key($input, array_fill_keys($inputContributionWhiteList, 1)
     ));
 
     $contributionParams['payment_processor'] = $paymentProcessorId;
 
-    // If paymentProcessor is not set then the payment_instrument_id would not be correct.
-    // not clear when or if this would occur if you encounter this please fix here & add a unit test.
-    if (empty($contributionParams['payment_instrument_id']) && isset($contribution->_relatedObjects['paymentProcessor']['payment_instrument_id'])) {
-      $contributionParams['payment_instrument_id'] = $contribution->_relatedObjects['paymentProcessor']['payment_instrument_id'];
+    if (empty($contributionParams['payment_instrument_id']) && $paymentProcessorId) {
+      $contributionParams['payment_instrument_id'] = PaymentProcessor::get(FALSE)->addWhere('id', '=', $paymentProcessorId)->addSelect('payment_instrument_id')->execute()->first()['payment_instrument_id'];
     }
 
     if ($recurringContributionID) {
@@ -4509,11 +4429,12 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     $changeDate = CRM_Utils_Array::value('trxn_date', $input, date('YmdHis'));
 
     $contributionResult = self::repeatTransaction($contribution, $input, $contributionParams);
+    $contributionID = (int) $contribution->id;
 
     if ($input['component'] == 'contribute') {
       if ($contributionParams['contribution_status_id'] === $completedContributionStatusID) {
         self::updateMembershipBasedOnCompletionOfContribution(
-          $contribution,
+          $contributionID,
           $changeDate
         );
       }
@@ -4526,7 +4447,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       }
     }
 
-    $contributionParams['id'] = $contribution->id;
+    $contributionParams['id'] = $contributionID;
     $contributionParams['is_post_payment_create'] = $isPostPaymentCreate;
 
     if (!$contributionResult) {
@@ -4535,7 +4456,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
 
     // Add new soft credit against current $contribution.
     if ($recurringContributionID) {
-      CRM_Contribute_BAO_ContributionRecur::addrecurSoftCredit($recurringContributionID, $contribution->id);
+      CRM_Contribute_BAO_ContributionRecur::addrecurSoftCredit($recurringContributionID, $contributionID);
     }
 
     $contribution->contribution_status_id = $contributionParams['contribution_status_id'];
@@ -4544,7 +4465,7 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
     $transaction->commit();
 
     // @todo - check if Contribution::create does this, test, remove.
-    CRM_Contribute_BAO_ContributionRecur::updateRecurLinkedPledge($contribution->id, $recurringContributionID,
+    CRM_Contribute_BAO_ContributionRecur::updateRecurLinkedPledge($contributionID, $recurringContributionID,
       $contributionParams['contribution_status_id'], $input['amount']);
 
     // create an activity record
@@ -4556,12 +4477,12 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
         $targetContactID = $contribution->contact_id;
         $contribution->contact_id = $contributionContactID;
       }
-      CRM_Activity_BAO_Activity::addActivity($contribution, NULL, $targetContactID);
+      CRM_Activity_BAO_Activity::addActivity($contribution, 'Contribution', $targetContactID);
     }
 
     if (self::isEmailReceipt($input, $contribution->contribution_page_id, $recurringContributionID)) {
       civicrm_api3('Contribution', 'sendconfirmation', [
-        'id' => $contribution->id,
+        'id' => $contributionID,
         'payment_processor_id' => $paymentProcessorId,
       ]);
       CRM_Core_Error::debug_log_message("Receipt sent");
@@ -4693,7 +4614,8 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
           $membership->join_date = CRM_Utils_Date::isoToMysql($membership->join_date);
           $membership->start_date = CRM_Utils_Date::isoToMysql($membership->start_date);
           $membership->end_date = CRM_Utils_Date::isoToMysql($membership->end_date);
-          $this->_relatedObjects['membership'][$membership->membership_type_id] = $membership;
+          $this->_relatedObjects['membership'][$membership->id . '_' . $membership->membership_type_id] = $membership;
+
         }
       }
     }
@@ -4704,12 +4626,13 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
    * Get the description (source field) for the recurring contribution.
    *
    * @param CRM_Contribute_BAO_Contribution $contribution
-   * @param CRM_Event_DAO_Event|null $event
+   * @param int|null $participantID
    *
    * @return string
    * @throws \CiviCRM_API3_Exception
+   * @throws \API_Exception
    */
-  protected static function getRecurringContributionDescription($contribution, $event) {
+  protected static function getRecurringContributionDescription($contribution, $participantID) {
     if (!empty($contribution->source)) {
       return $contribution->source;
     }
@@ -4720,8 +4643,12 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac
       ]);
       return ts('Online Contribution') . ': ' . $contributionPageTitle;
     }
-    elseif ($event) {
-      return ts('Online Event Registration') . ': ' . $event->title;
+    elseif ($participantID) {
+      $eventTitle = Participant::get(FALSE)
+        ->addSelect('event.title')
+        ->addWhere('id', '=', (int) $participantID)
+        ->execute()->first()['event.title'];
+      return ts('Online Event Registration') . ': ' . $eventTitle;
     }
     elseif (!empty($contribution->contribution_recur_id)) {
       return 'recurring contribution';
@@ -5157,14 +5084,14 @@ LEFT JOIN  civicrm_contribution on (civicrm_contribution.contact_id = civicrm_co
    * Note that the way in which $memberships are loaded as objects is pretty messy & I think we could just
    * load them in this function. Code clean up would compensate for any minor performance implication.
    *
-   * @param \CRM_Contribute_BAO_Contribution $contribution
+   * @param int $contributionID
    * @param string $changeDate
    *
    * @throws \CRM_Core_Exception
    * @throws \CiviCRM_API3_Exception
    */
-  public static function updateMembershipBasedOnCompletionOfContribution($contribution, $changeDate) {
-    $memberships = self::getRelatedMemberships($contribution->id);
+  public static function updateMembershipBasedOnCompletionOfContribution($contributionID, $changeDate) {
+    $memberships = self::getRelatedMemberships($contributionID);
     foreach ($memberships as $membership) {
       $membershipParams = [
         'id' => $membership['id'],
@@ -5202,9 +5129,9 @@ LIMIT 1;";
         // The api assumes num_terms is a special sauce for 'is_renewal' so we need to not pass it when updating a pending to completed.
         // ... except testCompleteTransactionMembershipPriceSetTwoTerms hits this line so the above is obviously not true....
         // @todo once apiv4 ships with core switch to that & find sanity.
-        $membershipParams['num_terms'] = $contribution->getNumTermsByContributionAndMembershipType(
+        $membershipParams['num_terms'] = self::getNumTermsByContributionAndMembershipType(
           $membershipParams['membership_type_id'],
-          $contribution->id
+          $contributionID
         );
       }
       // @todo remove all this stuff in favour of letting the api call further down handle in
@@ -5236,7 +5163,7 @@ LIMIT 1;";
       $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dates['start_date'],
         $dates['end_date'],
         $dates['join_date'],
-        'today',
+        'now',
         TRUE,
         $membershipParams['membership_type_id'],
         $membershipParams
@@ -5248,11 +5175,6 @@ LIMIT 1;";
       //so make status override false.
       $membershipParams['is_override'] = FALSE;
       $membershipParams['status_override_end_date'] = 'null';
-
-      //CRM-17723 - reset static $relatedContactIds array()
-      // @todo move it to Civi Statics.
-      $var = TRUE;
-      CRM_Member_BAO_Membership::createRelatedMemberships($var, $var, TRUE);
       civicrm_api3('Membership', 'create', $membershipParams);
     }
   }
@@ -5291,35 +5213,27 @@ LIMIT 1;";
       'title' => ts('Record Payment'),
     ];
 
-    if ((int) $balance > 0) {
-      // @todo - this should be possible even if not > 0 - test & remove this if.
-      // it is possible to 'overpay' in the real world & we honor that.
-      if (CRM_Core_Config::isEnabledBackOfficeCreditCardPayments()) {
-        $actionLinks[] = [
-          'url' => CRM_Utils_System::url('civicrm/payment', [
-            'action' => 'add',
-            'reset' => 1,
-            'is_refund' => 0,
-            'id' => $id,
-            'mode' => 'live',
-          ]),
-          'title' => ts('Submit Credit Card payment'),
-        ];
-      }
-    }
-    elseif ((int) $balance < 0) {
-      // @todo - in the future remove this IF - OK to refund money even when not due since
-      // ... life.
+    if (CRM_Core_Config::isEnabledBackOfficeCreditCardPayments()) {
       $actionLinks[] = [
         'url' => CRM_Utils_System::url('civicrm/payment', [
           'action' => 'add',
           'reset' => 1,
+          'is_refund' => 0,
           'id' => $id,
-          'is_refund' => 1,
+          'mode' => 'live',
         ]),
-        'title' => ts('Record Refund'),
+        'title' => ts('Submit Credit Card payment'),
       ];
     }
+    $actionLinks[] = [
+      'url' => CRM_Utils_System::url('civicrm/payment', [
+        'action' => 'add',
+        'reset' => 1,
+        'id' => $id,
+        'is_refund' => 1,
+      ]),
+      'title' => ts('Record Refund'),
+    ];
     return $actionLinks;
   }
 
@@ -5558,7 +5472,7 @@ LIMIT 1;";
       $paid = $entityParams['line_item_amount'] * ($entityParams['trxn_total_amount'] / $entityParams['contribution_total_amount']);
     }
     // Record Entity Financial Trxn; CRM-20145
-    $eftParams['amount'] = CRM_Contribute_BAO_Contribution_Utils::formatAmount($paid);
+    $eftParams['amount'] = $paid;
     civicrm_api3('EntityFinancialTrxn', 'create', $eftParams);
   }
 
diff --git a/civicrm/CRM/Contribute/BAO/Contribution/Utils.php b/civicrm/CRM/Contribute/BAO/Contribution/Utils.php
index 21fd4716d431307f02977235c4cf32ecd7dafea0..af50415499f95453e200e256f74fe366076e0c74 100644
--- a/civicrm/CRM/Contribute/BAO/Contribution/Utils.php
+++ b/civicrm/CRM/Contribute/BAO/Contribution/Utils.php
@@ -345,78 +345,6 @@ INNER JOIN   civicrm_contact contact ON ( contact.id = contrib.contact_id )
     }
   }
 
-  /**
-   * @param array $params
-   * @param string $type
-   *
-   * @return bool
-   */
-  public static function _fillCommonParams(&$params, $type = 'paypal') {
-    if (array_key_exists('transaction', $params)) {
-      $transaction = &$params['transaction'];
-    }
-    else {
-      $transaction = &$params;
-    }
-
-    $params['contact_type'] = 'Individual';
-
-    $billingLocTypeId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_LocationType', 'Billing', 'id', 'name');
-    if (!$billingLocTypeId) {
-      $billingLocTypeId = 1;
-    }
-    if (!CRM_Utils_System::isNull($params['address'])) {
-      $params['address'][1]['is_primary'] = 1;
-      $params['address'][1]['location_type_id'] = $billingLocTypeId;
-    }
-    if (!CRM_Utils_System::isNull($params['email'])) {
-      $params['email'] = [
-        1 => [
-          'email' => $params['email'],
-          'location_type_id' => $billingLocTypeId,
-        ],
-      ];
-    }
-
-    if (isset($transaction['trxn_id'])) {
-      // set error message if transaction has already been processed.
-      $contribution = new CRM_Contribute_DAO_Contribution();
-      $contribution->trxn_id = $transaction['trxn_id'];
-      if ($contribution->find(TRUE)) {
-        $params['error'][] = ts('transaction already processed.');
-      }
-    }
-    else {
-      // generate a new transaction id, if not already exist
-      $transaction['trxn_id'] = md5(uniqid(rand(), TRUE));
-    }
-
-    if (!isset($transaction['financial_type_id'])) {
-      $contributionTypes = array_keys(CRM_Contribute_PseudoConstant::financialType());
-      $transaction['financial_type_id'] = $contributionTypes[0];
-    }
-
-    if (($type == 'paypal') && (!isset($transaction['net_amount']))) {
-      $transaction['net_amount'] = $transaction['total_amount'] - CRM_Utils_Array::value('fee_amount', $transaction, 0);
-    }
-
-    if (!isset($transaction['invoice_id'])) {
-      $transaction['invoice_id'] = $transaction['trxn_id'];
-    }
-
-    $source = ts('ContributionProcessor: %1 API',
-      [1 => ucfirst($type)]
-    );
-    if (isset($transaction['source'])) {
-      $transaction['source'] = $source . ':: ' . $transaction['source'];
-    }
-    else {
-      $transaction['source'] = $source;
-    }
-
-    return TRUE;
-  }
-
   /**
    * @param int $contactID
    *
@@ -496,6 +424,7 @@ LIMIT 1
    *   Amount rounded and returned with the desired decimal places
    */
   public static function formatAmount($amount, $decimals = 2) {
+    CRM_Core_Error::deprecatedFunctionWarning('Use CRM_Utils_Rule::cleanMoney instead');
     return number_format((float) round($amount, (int) $decimals), (int) $decimals, '.', '');
   }
 
diff --git a/civicrm/CRM/Contribute/BAO/ContributionRecur.php b/civicrm/CRM/Contribute/BAO/ContributionRecur.php
index 63d7799768d38a08042dd551330d69ca35be5fdd..b7e12eb2c06cb95ac0043e3e9ba6ca705f604e41 100644
--- a/civicrm/CRM/Contribute/BAO/ContributionRecur.php
+++ b/civicrm/CRM/Contribute/BAO/ContributionRecur.php
@@ -261,9 +261,6 @@ class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_Contributi
     if ($recur->find(TRUE)) {
       $transaction = new CRM_Core_Transaction();
       $recur->contribution_status_id = $cancelledId;
-      $recur->start_date = CRM_Utils_Date::isoToMysql($recur->start_date);
-      $recur->create_date = CRM_Utils_Date::isoToMysql($recur->create_date);
-      $recur->modified_date = CRM_Utils_Date::isoToMysql($recur->modified_date);
       $recur->cancel_reason = $params['cancel_reason'] ?? NULL;
       $recur->cancel_date = date('YmdHis');
       $recur->save();
diff --git a/civicrm/CRM/Contribute/BAO/ContributionSoft.php b/civicrm/CRM/Contribute/BAO/ContributionSoft.php
index 40fe273e22c516793d5705a67d8bb2f7d4d62188..670e30adfae7f030edea4e73c9f6725024b60013 100644
--- a/civicrm/CRM/Contribute/BAO/ContributionSoft.php
+++ b/civicrm/CRM/Contribute/BAO/ContributionSoft.php
@@ -53,39 +53,17 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio
    * Process the soft contribution and/or link to personal campaign page.
    *
    * @param array $params
-   * @param object $contribution CRM_Contribute_DAO_Contribution
+   * @param CRM_Contribute_BAO_Contribution $contribution
    *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
   public static function processSoftContribution($params, $contribution) {
-    //retrieve existing soft-credit and pcp id(s) if any against $contribution
-    $softIDs = self::getSoftCreditIds($contribution->id);
-    $pcpId = self::getSoftCreditIds($contribution->id, TRUE);
-
-    if ($pcp = CRM_Utils_Array::value('pcp', $params)) {
-      $softParams = [];
-      $softParams['id'] = $pcpId ? $pcpId : NULL;
-      $softParams['contribution_id'] = $contribution->id;
-      $softParams['pcp_id'] = $pcp['pcp_made_through_id'];
-      $softParams['contact_id'] = CRM_Core_DAO::getFieldValue('CRM_PCP_DAO_PCP',
-        $pcp['pcp_made_through_id'], 'contact_id'
-      );
-      $softParams['currency'] = $contribution->currency;
-      $softParams['amount'] = $contribution->total_amount;
-      $softParams['pcp_display_in_roll'] = $pcp['pcp_display_in_roll'] ?? NULL;
-      $softParams['pcp_roll_nickname'] = $pcp['pcp_roll_nickname'] ?? NULL;
-      $softParams['pcp_personal_note'] = $pcp['pcp_personal_note'] ?? NULL;
-      $softParams['soft_credit_type_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_ContributionSoft', 'soft_credit_type_id', 'pcp');
-      $contributionSoft = self::add($softParams);
-      //Send notification to owner for PCP
-      if ($contributionSoft->pcp_id && empty($pcpId)) {
-        CRM_Contribute_Form_Contribution_Confirm::pcpNotifyOwner($contribution, $contributionSoft);
-      }
-    }
-    //Delete PCP against this contribution and create new on submitted PCP information
-    elseif (array_key_exists('pcp', $params) && $pcpId) {
-      civicrm_api3('ContributionSoft', 'delete', ['id' => $pcpId]);
+    if (array_key_exists('pcp', $params)) {
+      self::processPCP($params['pcp'], $contribution);
     }
     if (isset($params['soft_credit'])) {
+      $softIDs = self::getSoftCreditIds($contribution->id);
       $softParams = $params['soft_credit'];
       foreach ($softParams as $softParam) {
         if (!empty($softIDs)) {
@@ -602,4 +580,42 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio
     }
   }
 
+  /**
+   * Process the pcp associated with a contribution.
+   *
+   * @param array $pcp
+   * @param \CRM_Contribute_BAO_Contribution $contribution
+   *
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
+   */
+  protected static function processPCP($pcp, $contribution) {
+    $pcpId = self::getSoftCreditIds($contribution->id, TRUE);
+
+    if ($pcp) {
+      $softParams = [];
+      $softParams['id'] = $pcpId ?: NULL;
+      $softParams['contribution_id'] = $contribution->id;
+      $softParams['pcp_id'] = $pcp['pcp_made_through_id'];
+      $softParams['contact_id'] = CRM_Core_DAO::getFieldValue('CRM_PCP_DAO_PCP',
+        $pcp['pcp_made_through_id'], 'contact_id'
+      );
+      $softParams['currency'] = $contribution->currency;
+      $softParams['amount'] = $contribution->total_amount;
+      $softParams['pcp_display_in_roll'] = $pcp['pcp_display_in_roll'] ?? NULL;
+      $softParams['pcp_roll_nickname'] = $pcp['pcp_roll_nickname'] ?? NULL;
+      $softParams['pcp_personal_note'] = $pcp['pcp_personal_note'] ?? NULL;
+      $softParams['soft_credit_type_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_ContributionSoft', 'soft_credit_type_id', 'pcp');
+      $contributionSoft = self::add($softParams);
+      //Send notification to owner for PCP
+      if ($contributionSoft->pcp_id && empty($pcpId)) {
+        CRM_Contribute_Form_Contribution_Confirm::pcpNotifyOwner($contribution, $contributionSoft);
+      }
+    }
+    //Delete PCP against this contribution and create new on submitted PCP information
+    elseif ($pcpId) {
+      civicrm_api3('ContributionSoft', 'delete', ['id' => $pcpId]);
+    }
+  }
+
 }
diff --git a/civicrm/CRM/Contribute/Controller/Search.php b/civicrm/CRM/Contribute/Controller/Search.php
index 0fb964ed776c4bc98f229ec77a90b732dec44ce3..88b41e4e6d8da8a2ae7e2a35f6ee327676bd80ed 100644
--- a/civicrm/CRM/Contribute/Controller/Search.php
+++ b/civicrm/CRM/Contribute/Controller/Search.php
@@ -27,12 +27,16 @@
  */
 class CRM_Contribute_Controller_Search extends CRM_Core_Controller {
 
+  protected $entity = 'Contribution';
+
   /**
    * Class constructor.
    *
    * @param string $title
    * @param bool|int $action
    * @param bool $modal
+   *
+   * @throws \CRM_Core_Exception
    */
   public function __construct($title = NULL, $action = CRM_Core_Action::NONE, $modal = TRUE) {
 
@@ -40,6 +44,7 @@ class CRM_Contribute_Controller_Search extends CRM_Core_Controller {
     $this->_stateMachine = new CRM_Contribute_StateMachine_Search($this, $action);
     $this->addPages($this->_stateMachine, $action);
     $this->addActions();
+    $this->set('entity', $this->entity);
   }
 
 }
diff --git a/civicrm/CRM/Contribute/DAO/Contribution.php b/civicrm/CRM/Contribute/DAO/Contribution.php
index 45f51b756cad855b0a4ae6c45d1bda1a92c7925e..174e9bf69591ed243117ec5f61e0137dac46330c 100644
--- a/civicrm/CRM/Contribute/DAO/Contribution.php
+++ b/civicrm/CRM/Contribute/DAO/Contribution.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/Contribution.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:cc3bcdbce84066823084f71e30f6990b)
+ * (GenCodeChecksum:d937ea0497be1a1aeb1bac09986dd802)
  */
 
 /**
@@ -252,9 +252,12 @@ class CRM_Contribute_DAO_Contribution extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Contributions');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Contributions') : ts('Contribution');
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/DAO/ContributionPage.php b/civicrm/CRM/Contribute/DAO/ContributionPage.php
index 80ec08d3acf67e474c303f50f213a8665539c268..be85752fb787330ae99639d90580752ed572abab 100644
--- a/civicrm/CRM/Contribute/DAO/ContributionPage.php
+++ b/civicrm/CRM/Contribute/DAO/ContributionPage.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/ContributionPage.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:902bfa164280b9ba21a7cb5a38aceba8)
+ * (GenCodeChecksum:4910b973830834fcb2ce5bb3637070d6)
  */
 
 /**
@@ -362,9 +362,12 @@ class CRM_Contribute_DAO_ContributionPage extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Contribution Pages');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Contribution Pages') : ts('Contribution Page');
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/DAO/ContributionProduct.php b/civicrm/CRM/Contribute/DAO/ContributionProduct.php
index e5a0f053702abd27b6be9e7f4abc20a0cd49b8e1..9837f2b8c084241ab20ccf933ebf5b3b041b6cb5 100644
--- a/civicrm/CRM/Contribute/DAO/ContributionProduct.php
+++ b/civicrm/CRM/Contribute/DAO/ContributionProduct.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/ContributionProduct.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4e76d9dc75f5bc1b1141645c8ee5e2e4)
+ * (GenCodeChecksum:a2a4170ca2004a1630e27ba83e5edff3)
  */
 
 /**
@@ -100,9 +100,12 @@ class CRM_Contribute_DAO_ContributionProduct extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Contribution Products');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Contribution Products') : ts('Contribution Product');
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/DAO/ContributionRecur.php b/civicrm/CRM/Contribute/DAO/ContributionRecur.php
index 2ccd7486d6c3dd11f3920b8dc1b7f48c6fe91d12..f61c447051453bfc5b03b7afe3669dc8eb1df2a1 100644
--- a/civicrm/CRM/Contribute/DAO/ContributionRecur.php
+++ b/civicrm/CRM/Contribute/DAO/ContributionRecur.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/ContributionRecur.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:decf43c002d0e4ded0fe5f2a2e2f7bd0)
+ * (GenCodeChecksum:ba5f7682a5f99b682f70cd45097feb56)
  */
 
 /**
@@ -239,9 +239,12 @@ class CRM_Contribute_DAO_ContributionRecur extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Recurring Contributions');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Recurring Contributions') : ts('Recurring Contribution');
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/DAO/ContributionSoft.php b/civicrm/CRM/Contribute/DAO/ContributionSoft.php
index 3a1a9b7af7609c05af4aa5179fc6cb8151f185bd..fa78630bad12eca067132a37ffb3e327aaa2b053 100644
--- a/civicrm/CRM/Contribute/DAO/ContributionSoft.php
+++ b/civicrm/CRM/Contribute/DAO/ContributionSoft.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/ContributionSoft.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:caa58722ef865c7342fdff08f24d86ee)
+ * (GenCodeChecksum:e37496d0b9938151e5bcf9e6dad23c0a)
  */
 
 /**
@@ -104,9 +104,12 @@ class CRM_Contribute_DAO_ContributionSoft extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Contribution Softs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Contribution Softs') : ts('Contribution Soft');
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/DAO/Premium.php b/civicrm/CRM/Contribute/DAO/Premium.php
index 7e0020c134926741b9c068a8c73681af624ab722..ebbafd660e65a7351998d0e48a3a49e22ac85e80 100644
--- a/civicrm/CRM/Contribute/DAO/Premium.php
+++ b/civicrm/CRM/Contribute/DAO/Premium.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/Premium.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:cd1826e777cea80450636ef175aaab7f)
+ * (GenCodeChecksum:b35b6fb4895df990a55d9015bb82a852)
  */
 
 /**
@@ -111,9 +111,12 @@ class CRM_Contribute_DAO_Premium extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Premiums');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Premiums') : ts('Premium');
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/DAO/PremiumsProduct.php b/civicrm/CRM/Contribute/DAO/PremiumsProduct.php
index b153adb274962e9a89de5b1789fe607092cdde9d..f99e9ddf30b8a99e1081d3df6bdcee9592ebc39b 100644
--- a/civicrm/CRM/Contribute/DAO/PremiumsProduct.php
+++ b/civicrm/CRM/Contribute/DAO/PremiumsProduct.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/PremiumsProduct.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4831cb4c7e0611db0f4312f6522d2c20)
+ * (GenCodeChecksum:84fea8d6a2a852495da5ed86232d42d1)
  */
 
 /**
@@ -73,9 +73,12 @@ class CRM_Contribute_DAO_PremiumsProduct extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Premiums Products');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Premiums Products') : ts('Premiums Product');
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/DAO/Product.php b/civicrm/CRM/Contribute/DAO/Product.php
index 8433e1820ad0ee4b6982f5b79413d5725ae82ddc..7b481641af4da90dbdba7d5257c73eef99aa14ae 100644
--- a/civicrm/CRM/Contribute/DAO/Product.php
+++ b/civicrm/CRM/Contribute/DAO/Product.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/Product.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:dea1c7db61776456a70f752fe9f93f06)
+ * (GenCodeChecksum:d6c90aacbe802ff244a6a4bbaecad4d3)
  */
 
 /**
@@ -170,9 +170,12 @@ class CRM_Contribute_DAO_Product extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Products');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Products') : ts('Product');
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/DAO/Widget.php b/civicrm/CRM/Contribute/DAO/Widget.php
index 5da47438da53eebf0e55504fd27d37a6cc5d7a05..a49f0a9471d9f9fd65e69c7061c225f412de0102 100644
--- a/civicrm/CRM/Contribute/DAO/Widget.php
+++ b/civicrm/CRM/Contribute/DAO/Widget.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Contribute/Widget.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e24eaf675b793969d408fbc0f847a9ed)
+ * (GenCodeChecksum:bb99920b9b2c2a8b7419ecd94dcbf577)
  */
 
 /**
@@ -141,9 +141,12 @@ class CRM_Contribute_DAO_Widget extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Widgets');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Widgets') : ts('Widget');
   }
 
   /**
diff --git a/civicrm/CRM/Contribute/Form/CancelSubscription.php b/civicrm/CRM/Contribute/Form/CancelSubscription.php
index ecb18817c51b8a088ef19da5eeaeb10622cd0fd7..a1b8abf9e0cce4fee3f518110d1def64ed131fbb 100644
--- a/civicrm/CRM/Contribute/Form/CancelSubscription.php
+++ b/civicrm/CRM/Contribute/Form/CancelSubscription.php
@@ -179,7 +179,6 @@ class CRM_Contribute_Form_CancelSubscription extends CRM_Contribute_Form_Contrib
    */
   public function setDefaultValues() {
     return [
-      'is_notify' => 1,
       'send_cancel_request' => 1,
     ];
   }
diff --git a/civicrm/CRM/Contribute/Form/Contribution/Confirm.php b/civicrm/CRM/Contribute/Form/Contribution/Confirm.php
index 93a210a5530ca8840b12ce71a23501120f4adcef..d9642ae9bcf249965ce51cd9a71478e6fa758c5c 100644
--- a/civicrm/CRM/Contribute/Form/Contribution/Confirm.php
+++ b/civicrm/CRM/Contribute/Form/Contribution/Confirm.php
@@ -93,7 +93,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $pledgeParams['frequency_interval'] = $params['pledge_frequency_interval'];
       $pledgeParams['installments'] = $params['pledge_installments'];
       $pledgeParams['frequency_unit'] = $params['pledge_frequency_unit'];
-      if ($pledgeParams['frequency_unit'] == 'month') {
+      if ($pledgeParams['frequency_unit'] === 'month') {
         $pledgeParams['frequency_day'] = intval(date("d"));
       }
       else {
@@ -149,6 +149,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
    * @param int $recurringContributionID
    *
    * @return array
+   * @throws \CRM_Core_Exception
    */
   public static function getContributionParams(
     $params, $financialTypeID,
@@ -235,7 +236,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
         }
         // if there is a product - compare the value to the contribution amount
         if (isset($selectProduct) &&
-          $selectProduct != 'no_thanks'
+          $selectProduct !== 'no_thanks'
         ) {
           $productDAO = new CRM_Contribute_DAO_Product();
           $productDAO->id = $selectProduct;
@@ -332,15 +333,15 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
         }
 
         if (in_array($field, $addressBlocks)) {
-          if ($locType == 'Primary') {
+          if ($locType === 'Primary') {
             $defaultLocationType = CRM_Core_BAO_LocationType::getDefault();
             $locType = $defaultLocationType->id;
           }
 
-          if ($field == 'country') {
+          if ($field === 'country') {
             $value = CRM_Core_PseudoConstant::countryIsoCode($value);
           }
-          elseif ($field == 'state_province') {
+          elseif ($field === 'state_province') {
             $value = CRM_Core_PseudoConstant::stateProvinceAbbreviation($value);
           }
 
@@ -361,7 +362,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
           if (!$typeId || is_numeric($typeId)) {
             $blockName = $fieldName = $field;
             $locationType = 'location_type_id';
-            if ($locType == 'Primary') {
+            if ($locType === 'Primary') {
               $defaultLocationType = CRM_Core_BAO_LocationType::getDefault();
               $locationValue = $defaultLocationType->id;
             }
@@ -423,7 +424,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
           $this->_params['onbehalf_location']["{$loc}"] = $value;
         }
         else {
-          if ($loc == 'contact_sub_type') {
+          if ($loc === 'contact_sub_type') {
             $this->_params['onbehalf_location'][$loc] = $value;
           }
           else {
@@ -510,7 +511,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       $this->_params['is_quick_config'] = 1;
     }
 
-    if (!empty($params['selectProduct']) && $params['selectProduct'] != 'no_thanks') {
+    if (!empty($params['selectProduct']) && $params['selectProduct'] !== 'no_thanks') {
       $option = $params['options_' . $params['selectProduct']] ?? NULL;
       $productID = $params['selectProduct'];
       CRM_Contribute_BAO_Premium::buildPremiumBlock($this, $this->_id, FALSE,
@@ -522,7 +523,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     $config = CRM_Core_Config::singleton();
     if (in_array('CiviMember', $config->enableComponents) && empty($this->_ccid)) {
       if (isset($params['selectMembership']) &&
-        $params['selectMembership'] != 'no_thanks'
+        $params['selectMembership'] !== 'no_thanks'
       ) {
         $this->buildMembershipBlock(
           $this->_membershipContactID,
@@ -1020,7 +1021,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
 
     // create an activity record
     if ($contribution) {
-      CRM_Activity_BAO_Activity::addActivity($contribution, NULL, $targetContactID, $actParams);
+      CRM_Activity_BAO_Activity::addActivity($contribution, 'Contribution', $targetContactID, $actParams);
     }
 
     $transaction->commit();
@@ -1145,19 +1146,9 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     // create employer relationship with $contactID only when new organization is there
     // else retain the existing relationship
     else {
-      // get the Employee relationship type id
-      $relTypeId = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_RelationshipType', 'Employee of', 'id', 'name_a_b');
-
-      // keep relationship params ready
-      $relParams['relationship_type_id'] = $relTypeId . '_a_b';
-      $relParams['is_permission_a_b'] = 1;
-      $relParams['is_active'] = 1;
       $isNotCurrentEmployer = TRUE;
     }
 
-    // formalities for creating / editing organization.
-    $behalfOrganization['contact_type'] = 'Organization';
-
     if (!$orgID) {
       // check if matching organization contact exists
       $dupeIDs = CRM_Contact_BAO_Contact::getDuplicateContacts($behalfOrganization, 'Organization', 'Unsupervised', [], FALSE);
@@ -1182,14 +1173,26 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     }
 
     // create organization, add location
+    $behalfOrganization['contact_type'] = 'Organization';
     $orgID = CRM_Contact_BAO_Contact::createProfileContact($behalfOrganization, $fields, $orgID,
       NULL, NULL, 'Organization'
     );
     // create relationship
     if ($isNotCurrentEmployer) {
-      $relParams['contact_check'][$orgID] = 1;
-      $cid = ['contact' => $contactID];
-      CRM_Contact_BAO_Relationship::legacyCreateMultiple($relParams, $cid);
+      try {
+        \Civi\Api4\Relationship::create(FALSE)
+          ->addValue('contact_id_a', $contactID)
+          ->addValue('contact_id_b', $orgID)
+          ->addValue('relationship_type_id', CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_RelationshipType', 'Employee of', 'id', 'name_a_b'))
+          ->addValue('is_permission_a_b:name', 'View and update')
+          ->execute();
+      }
+      catch (CRM_Core_Exception $e) {
+        // Ignore if duplicate relationship.
+        if ($e->getMessage() !== 'Duplicate Relationship') {
+          throw $e;
+        }
+      }
     }
 
     // if multiple match - send a duplicate alert
@@ -1903,9 +1906,19 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
     $params['invoiceID'] = md5(uniqid(rand(), TRUE));
 
     // We want to move away from passing in amount as it is calculated by the actually-submitted params.
-    $params['amount'] = $params['amount'] ?? $form->getMainContributionAmount($params);
+    if ($form->getMainContributionAmount($params)) {
+      $params['amount'] = $form->getMainContributionAmount($params);
+    }
     $paramsProcessedForForm = $form->_params = self::getFormParams($params['id'], $params);
-    $form->_amount = $params['amount'];
+
+    $order = new CRM_Financial_BAO_Order();
+    $order->setPriceSelectionFromUnfilteredInput($params);
+    if (isset($params['amount'])) {
+      // @todo deprecate receiving amount, calculate on the form.
+      $order->setOverrideTotalAmount($params['amount']);
+    }
+    $amount = $order->getTotalAmount();
+    $form->_amount = $params['amount'] = $form->_params['amount'] = $params['amount'] ?? $amount;
     // hack these in for test support.
     $form->_fields['billing_first_name'] = 1;
     $form->_fields['billing_last_name'] = 1;
@@ -1983,7 +1996,7 @@ class CRM_Contribute_Form_Contribution_Confirm extends CRM_Contribute_Form_Contr
       if (!empty($params['payment_processor_id'])) {
         $params['is_pay_later'] = 0;
       }
-      elseif ($params['amount'] !== 0) {
+      elseif (($params['amount'] ?? 0) !== 0) {
         $params['is_pay_later'] = civicrm_api3('contribution_page', 'getvalue', [
           'id' => $id,
           'return' => 'is_pay_later',
diff --git a/civicrm/CRM/Contribute/Form/Contribution/Main.php b/civicrm/CRM/Contribute/Form/Contribution/Main.php
index 7753b2a135732b8644b0a83597645ed24ceec7fb..6ff333e145f9022c99553835a4dc5304880d8408 100644
--- a/civicrm/CRM/Contribute/Form/Contribution/Main.php
+++ b/civicrm/CRM/Contribute/Form/Contribution/Main.php
@@ -605,11 +605,10 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
       $isTest = $self->_action & CRM_Core_Action::PREVIEW;
       $lifeMember = CRM_Member_BAO_Membership::getAllContactMembership($self->_membershipContactID, $isTest, TRUE);
 
-      $membershipOrgDetails = CRM_Member_BAO_MembershipType::getMembershipTypeOrganization();
-
+      $membershipOrgDetails = CRM_Member_BAO_MembershipType::getAllMembershipTypes();
       $unallowedOrgs = [];
       foreach (array_keys($lifeMember) as $memTypeId) {
-        $unallowedOrgs[] = $membershipOrgDetails[$memTypeId];
+        $unallowedOrgs[] = $membershipOrgDetails[$memTypeId]['member_of_contact_id'];
       }
     }
 
@@ -774,7 +773,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
         if (!empty($lifeMember)) {
           foreach ($priceFieldIDS as $priceFieldId) {
             if (($id = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldId, 'membership_type_id')) &&
-              in_array($membershipOrgDetails[$id], $unallowedOrgs)
+              in_array($membershipOrgDetails[$id]['member_of_contact_id'], $unallowedOrgs)
             ) {
               $errors['_qf_default'] = ts('You already have a lifetime membership and cannot select a membership with a shorter term.');
               break;
@@ -791,6 +790,7 @@ class CRM_Contribute_Form_Contribution_Main extends CRM_Contribute_Form_Contribu
           foreach ($count as $id => $occurrence) {
             if ($occurrence > 1) {
               $errors['_qf_default'] = ts('You have selected multiple memberships for the same organization or entity. Please review your selections and choose only one membership per entity. Contact the site administrator if you need assistance.');
+              break;
             }
           }
         }
diff --git a/civicrm/CRM/Contribute/Form/ContributionBase.php b/civicrm/CRM/Contribute/Form/ContributionBase.php
index 6822a355f6f560c8009ab857d72a366839da5c50..7bb940637f2b98ec50567385996753a3553bbc6c 100644
--- a/civicrm/CRM/Contribute/Form/ContributionBase.php
+++ b/civicrm/CRM/Contribute/Form/ContributionBase.php
@@ -154,8 +154,18 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
   public $_action;
 
   /**
-   * Contribution mode e.g express for payment express, notify for off-site + notification back to CiviCRM
+   * Contribution mode.
+   *
+   * In general we are trying to deprecate this parameter but some templates and processors still
+   * require it to denote whether the processor redirects offsite (notify) or not.
+   *
+   * The intent is that this knowledge should not be required and all contributions should
+   * be created in a pending state and updated based on the payment result without needing to be
+   * aware of the processor workings.
+   *
    * @var string
+   *
+   * @deprecated
    */
   public $_contributeMode;
 
@@ -179,8 +189,10 @@ class CRM_Contribute_Form_ContributionBase extends CRM_Core_Form {
   public $_emailExists = FALSE;
 
   /**
-   * Is this a backoffice form
-   * (this will affect whether paypal express code is displayed)
+   * Is this a backoffice form.
+   *
+   * Processors may display different options to backoffice users.
+   *
    * @var bool
    */
   public $isBackOffice = FALSE;
diff --git a/civicrm/CRM/Contribute/Form/ContributionPage.php b/civicrm/CRM/Contribute/Form/ContributionPage.php
index ba8bb64ec08706d24b8822fe9dc816d4af568f4b..76e245eabdb77d787ffb02798bfb19176abe2f00 100644
--- a/civicrm/CRM/Contribute/Form/ContributionPage.php
+++ b/civicrm/CRM/Contribute/Form/ContributionPage.php
@@ -222,7 +222,10 @@ class CRM_Contribute_Form_ContributionPage extends CRM_Core_Form {
     // views are implemented as frozen form
     if ($this->_action & CRM_Core_Action::VIEW) {
       $this->freeze();
-      $this->addElement('button', 'done', ts('Done'), ['onclick' => "location.href='civicrm/admin/custom/group?reset=1&action=browse'"]);
+      $this->addElement('xbutton', 'done', ts('Done'), [
+        'type' => 'button',
+        'onclick' => "location.href='civicrm/admin/custom/group?reset=1&action=browse'",
+      ]);
     }
 
     // don't show option for contribution amounts section if membership price set
diff --git a/civicrm/CRM/Contribute/Form/ContributionPage/Premium.php b/civicrm/CRM/Contribute/Form/ContributionPage/Premium.php
index ba5b7863b77704a67888a0499f1f85b91d1a841a..7683f3d90015b1aa8cb8acc8b47e7927321940a1 100644
--- a/civicrm/CRM/Contribute/Form/ContributionPage/Premium.php
+++ b/civicrm/CRM/Contribute/Form/ContributionPage/Premium.php
@@ -52,7 +52,7 @@ class CRM_Contribute_Form_ContributionPage_Premium extends CRM_Contribute_Form_C
 
     $this->addElement('text', 'premiums_intro_title', ts('Title'), $attributes['premiums_intro_title']);
 
-    $this->add('textarea', 'premiums_intro_text', ts('Introductory Message'), 'rows=5, cols=50');
+    $this->add('textarea', 'premiums_intro_text', ts('Introductory Message'), ['cols' => 50, 'rows' => 5]);
 
     $this->add('text', 'premiums_contact_email', ts('Contact Email') . ' ', $attributes['premiums_contact_email']);
 
diff --git a/civicrm/CRM/Contribute/Form/ContributionPage/Widget.php b/civicrm/CRM/Contribute/Form/ContributionPage/Widget.php
index 7c6ee1bb991cdef4b2a58bcf694f71b1c32760fa..f962551188c5f44a01cd8a06fc7fb532c136c669 100644
--- a/civicrm/CRM/Contribute/Form/ContributionPage/Widget.php
+++ b/civicrm/CRM/Contribute/Form/ContributionPage/Widget.php
@@ -188,9 +188,10 @@ class CRM_Contribute_Form_ContributionPage_Widget extends CRM_Contribute_Form_Co
     $this->assign_by_ref('colorFields', $this->_colorFields);
 
     $this->_refreshButtonName = $this->getButtonName('refresh');
-    $this->addElement('submit',
+    $this->addElement('xbutton',
       $this->_refreshButtonName,
-      ts('Save and Preview')
+      ts('Save and Preview'),
+      ['type' => 'submit', 'class' => 'crm-button crm-form-submit crm-button-type-submit']
     );
     parent::buildQuickForm();
     $this->addFormRule(['CRM_Contribute_Form_ContributionPage_Widget', 'formRule'], $this);
diff --git a/civicrm/CRM/Contribute/Form/ManagePremiums.php b/civicrm/CRM/Contribute/Form/ManagePremiums.php
index 61da18d8f4437fdfc0de4e9d5581ef8ff0ff1646..85b8ad03c9fb793476c4cec5d1f39de1b12c463e 100644
--- a/civicrm/CRM/Contribute/Form/ManagePremiums.php
+++ b/civicrm/CRM/Contribute/Form/ManagePremiums.php
@@ -81,7 +81,7 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
     ]);
     $this->add('text', 'sku', ts('SKU'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'sku'));
 
-    $this->add('textarea', 'description', ts('Description'), 'rows=3, cols=60');
+    $this->add('textarea', 'description', ts('Description'), ['cols' => 60, 'rows' => 3]);
 
     $image['image'] = $this->createElement('radio', NULL, NULL, ts('Upload from my computer'), 'image', 'onclick="add_upload_file_block(\'image\');');
     $image['thumbnail'] = $this->createElement('radio', NULL, NULL, ts('Display image and thumbnail from these locations on the web:'), 'thumbnail', 'onclick="add_upload_file_block(\'thumbnail\');');
@@ -94,7 +94,7 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
     $this->addElement('text', 'imageUrl', ts('Image URL'));
     $this->addElement('text', 'thumbnailUrl', ts('Thumbnail URL'));
 
-    $this->add('file', 'uploadFile', ts('Image File Name'), 'onChange="select_option();"');
+    $this->add('file', 'uploadFile', ts('Image File Name'), ['onChange' => 'select_option();']);
 
     $this->add('text', 'price', ts('Market Value'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'price'), TRUE);
     $this->addRule('price', ts('Please enter the Market Value for this product.'), 'money');
@@ -105,21 +105,20 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
     $this->add('text', 'min_contribution', ts('Minimum Contribution Amount'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'min_contribution'), TRUE);
     $this->addRule('min_contribution', ts('Please enter a monetary value for the Minimum Contribution Amount.'), 'money');
 
-    $this->add('textarea', 'options', ts('Options'), 'rows=3, cols=60');
+    $this->add('textarea', 'options', ts('Options'), ['cols' => 60, 'rows' => 3]);
 
     $this->add('select', 'period_type', ts('Period Type'), [
-      '' => '- select -',
       'rolling' => 'Rolling',
       'fixed' => 'Fixed',
-    ]);
+    ], FALSE, ['placeholder' => TRUE]);
 
     $this->add('text', 'fixed_period_start_day', ts('Fixed Period Start Day'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'fixed_period_start_day'));
 
-    $this->add('Select', 'duration_unit', ts('Duration Unit'), ['' => '- select period -'] + CRM_Core_SelectValues::getPremiumUnits());
+    $this->add('Select', 'duration_unit', ts('Duration Unit'), CRM_Core_SelectValues::getPremiumUnits(), FALSE, ['placeholder' => ts('- select period -')]);
 
     $this->add('text', 'duration_interval', ts('Duration'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'duration_interval'));
 
-    $this->add('Select', 'frequency_unit', ts('Frequency Unit'), ['' => '- select period -'] + CRM_Core_SelectValues::getPremiumUnits());
+    $this->add('Select', 'frequency_unit', ts('Frequency Unit'), CRM_Core_SelectValues::getPremiumUnits(), FALSE, ['placeholder' => ts('- select period -')]);
 
     $this->add('text', 'frequency_interval', ts('Frequency'), CRM_Core_DAO::getAttribute('CRM_Contribute_DAO_Product', 'frequency_interval'));
 
@@ -157,7 +156,9 @@ class CRM_Contribute_Form_ManagePremiums extends CRM_Contribute_Form {
       'select',
       'financial_type_id',
       ts('Financial Type'),
-      ['' => ts('- select -')] + $financialType
+      $financialType,
+      FALSE,
+      ['placeholder' => TRUE]
     );
 
     $this->add('checkbox', 'is_active', ts('Enabled?'));
diff --git a/civicrm/CRM/Contribute/Form/Search.php b/civicrm/CRM/Contribute/Form/Search.php
index 4f1009b41a07fc20f24c348d8ab1322c80f6111b..866c178848dffcb0e06980d53c9bf788d2f36475 100644
--- a/civicrm/CRM/Contribute/Form/Search.php
+++ b/civicrm/CRM/Contribute/Form/Search.php
@@ -61,6 +61,9 @@ class CRM_Contribute_Form_Search extends CRM_Core_Form_Search {
    * @throws \CRM_Core_Exception
    */
   public function preProcess() {
+    // SearchFormName is deprecated & to be removed - the replacement is for the task to
+    // call $this->form->getSearchFormValues()
+    // A couple of extensions use it.
     $this->set('searchFormName', 'Search');
 
     $this->_actionButtonName = $this->getButtonName('next', 'action');
@@ -386,12 +389,14 @@ class CRM_Contribute_Form_Search extends CRM_Core_Form_Search {
 
     $cid = CRM_Utils_Request::retrieve('cid', 'Positive', $this);
 
-    if ($cid) {
+    // skip cid (contact id of membership/participant record) to get associated payments for membership/participant record,
+    // contribution record may be on different contact id.
+    $skip_cid = CRM_Utils_Request::retrieve('skip_cid', 'Boolean', $this, FALSE, FALSE);
+
+    if ($cid && !$skip_cid) {
       $cid = CRM_Utils_Type::escape($cid, 'Integer');
       if ($cid > 0) {
         $this->_formValues['contact_id'] = $cid;
-        // @todo - why do we retrieve these when they are not used?
-        list($display, $image) = CRM_Contact_BAO_Contact::getDisplayAndImage($cid);
         $this->_defaults['sort_name'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $cid,
           'sort_name'
         );
diff --git a/civicrm/CRM/Contribute/Form/Task.php b/civicrm/CRM/Contribute/Form/Task.php
index 16d61166670f2fad61b8a996f481ced123d99d96..e6cc4ea750453eb9c129213d27aee29c97ce33af 100644
--- a/civicrm/CRM/Contribute/Form/Task.php
+++ b/civicrm/CRM/Contribute/Form/Task.php
@@ -50,16 +50,16 @@ class CRM_Contribute_Form_Task extends CRM_Core_Form_Task {
   }
 
   /**
-   * @param CRM_Core_Form $form
+   * @param \CRM_Core_Form_Task $form
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function preProcessCommon(&$form) {
     $form->_contributionIds = [];
 
-    $values = $form->controller->exportValues($form->get('searchFormName'));
+    $values = $form->getSearchFormValues();
 
     $form->_task = $values['task'] ?? NULL;
-    $contributeTasks = CRM_Contribute_Task::tasks();
-    $form->assign('taskName', CRM_Utils_Array::value($form->_task, $contributeTasks));
 
     $ids = [];
     if (isset($values['radio_ts']) && $values['radio_ts'] == 'ts_sel') {
diff --git a/civicrm/CRM/Contribute/Form/Task/Invoice.php b/civicrm/CRM/Contribute/Form/Task/Invoice.php
index b2087a6474622c69e45469aa23d3e36017085efd..262225d49061bc97974822faa326225c3a3bbf91 100644
--- a/civicrm/CRM/Contribute/Form/Task/Invoice.php
+++ b/civicrm/CRM/Contribute/Form/Task/Invoice.php
@@ -15,6 +15,8 @@
  * @copyright CiviCRM LLC https://civicrm.org/licensing
  */
 
+use Civi\Api4\Email;
+
 /**
  * This class provides the functionality to email a group of
  * contacts.
@@ -143,6 +145,12 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
       $this->addRule('from_email_address', ts('From Email Address is required'), 'required');
     }
 
+    $attributes = ['class' => 'huge'];
+    $this->addEntityRef('cc_id', ts('CC'), [
+      'entity' => 'Email',
+      'multiple' => TRUE,
+    ]);
+    $this->add('text', 'subject', ts('Subject'), $attributes + ['placeholder' => ts('Optional')]);
     $this->add('wysiwyg', 'email_comment', ts('If you would like to add personal message to email please add it here. (If sending to more then one receipient the same message will be sent to each contact.)'), [
       'rows' => 2,
       'cols' => 40,
@@ -210,7 +218,7 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
     $pendingStatusId = CRM_Utils_Array::key('Pending', $contributionStatusID);
 
     foreach ($invoiceElements['details'] as $contribID => $detail) {
-      $input = $ids = $objects = [];
+      $input = $ids = [];
       if (in_array($detail['contact'], $invoiceElements['excludeContactIds'])) {
         continue;
       }
@@ -225,11 +233,10 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
       $ids['participant'] = $detail['participant'] ?? NULL;
       $ids['event'] = $detail['event'] ?? NULL;
 
-      if (!$invoiceElements['baseIPN']->validateData($input, $ids, $objects, FALSE)) {
-        CRM_Core_Error::statusBounce('Supplied data was not able to be validated');
-      }
-
-      $contribution = &$objects['contribution'];
+      $contribution = new CRM_Contribute_BAO_Contribution();
+      $contribution->id = $contribID;
+      $contribution->fetch();
+      $contribution->loadRelatedObjects($input, $ids, TRUE);
 
       $input['amount'] = $contribution->total_amount;
       $input['invoice_id'] = $contribution->invoice_id;
@@ -237,8 +244,6 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
       $input['contribution_status_id'] = $contribution->contribution_status_id;
       $input['organization_name'] = $contribution->_relatedObjects['contact']->organization_name;
 
-      $objects['contribution']->receive_date = CRM_Utils_Date::isoToMysql($objects['contribution']->receive_date);
-
       // Fetch the billing address. getValues should prioritize the billing
       // address, otherwise will return the primary address.
       $billingAddress = [];
@@ -413,6 +418,34 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
 
       // from email address
       $fromEmailAddress = $params['from_email_address'] ?? NULL;
+      if (!empty($params['cc_id'])) {
+        // get contacts and their emails from email id
+        $emailIDs = $params['cc_id'] ? explode(',', $params['cc_id']) : [];
+        $emails = Email::get()
+          ->addWhere('id', 'IN', $emailIDs)
+          ->setCheckPermissions(FALSE)
+          ->setSelect(['contact_id', 'email', 'contact.sort_name', 'contact.display_name'])->execute();
+        $emailStrings = $contactUrlStrings = [];
+        foreach ($emails as $email) {
+          $emailStrings[] = '"' . $email['contact.sort_name'] . '" <' . $email['email'] . '>';
+          // generate the contact url to put in Activity
+          $contactURL = CRM_Utils_System::url('civicrm/contact/view', ['reset' => 1, 'force' => 1, 'cid' => $email['contact_id']], TRUE);
+          $contactUrlStrings[] = "<a href='{$contactURL}'>" . $email['contact.display_name'] . '</a>';
+        }
+        $cc_emails = implode(',', $emailStrings);
+        $values['cc_receipt'] = $cc_emails;
+        $ccContactsDetails = implode(',', $contactUrlStrings);
+        // add CC emails as activity details
+        $params['activity_details'] = "\ncc : " . $ccContactsDetails;
+
+        // unset bcc to avoid unknown email come from online page configuration.
+        unset($values['bcc_receipt']);
+      }
+
+      // get subject from UI
+      if (!empty($params['subject'])) {
+        $sendTemplateParams['subject'] = $values['subject'] = $params['subject'];
+      }
 
       // condition to check for download PDF Invoice or email Invoice
       if ($invoiceElements['createPdf']) {
@@ -445,7 +478,12 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
 
         list($sent, $subject, $message, $html) = CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams);
         // functions call for adding activity with attachment
-        $fileName = self::putFile($html, $pdfFileName);
+        // make sure page layout is same for email and download invoices.
+        $fileName = self::putFile($html, $pdfFileName, [
+          'margin_top' => 10,
+          'margin_left' => 65,
+          'metric' => 'px',
+        ]);
         self::addActivities($subject, $contribution->contact_id, $fileName, $params, $contribution->id);
       }
       elseif ($contribution->_component == 'event') {
@@ -535,6 +573,7 @@ class CRM_Contribute_Form_Task_Invoice extends CRM_Contribute_Form_Task {
       'target_contact_id' => $contactIds,
       'activity_type_id' => $activityType,
       'activity_date_time' => date('YmdHis'),
+      'details' => $params['activity_details'] ?? NULL,
       'attachFile_1' => [
         'uri' => $fileName,
         'type' => 'application/pdf',
diff --git a/civicrm/CRM/Contribute/Form/Task/PDF.php b/civicrm/CRM/Contribute/Form/Task/PDF.php
index e05ebab9d5a8b5619228e67cda7e7dc9f7a21df0..7b99516a88b9e748ecc0f3a97bc639c732317f6f 100644
--- a/civicrm/CRM/Contribute/Form/Task/PDF.php
+++ b/civicrm/CRM/Contribute/Form/Task/PDF.php
@@ -142,12 +142,12 @@ AND    {$this->_componentClause}";
     $elements = self::getElements($this->_contributionIds, $params, $this->_contactIds);
 
     foreach ($elements['details'] as $contribID => $detail) {
-      $input = $ids = $objects = [];
+      $input = $ids = [];
 
       if (in_array($detail['contact'], $elements['excludeContactIds'])) {
         continue;
       }
-
+      // @todo - CRM_Contribute_BAO_Contribution::sendMail re-does pretty much everything between here & when we call it.
       $input['component'] = $detail['component'];
 
       $ids['contact'] = $detail['contact'];
@@ -158,11 +158,9 @@ AND    {$this->_componentClause}";
       $ids['participant'] = $detail['participant'] ?? NULL;
       $ids['event'] = $detail['event'] ?? NULL;
 
-      if (!$elements['baseIPN']->validateData($input, $ids, $objects, FALSE)) {
-        throw new CRM_Core_Exception('invalid data');
-      }
-
-      $contribution = &$objects['contribution'];
+      $contribution = new CRM_Contribute_BAO_Contribution();
+      $contribution->id = $contribID;
+      $contribution->fetch();
 
       // set some fake input values so we can reuse IPN code
       $input['amount'] = $contribution->total_amount;
@@ -181,9 +179,6 @@ AND    {$this->_componentClause}";
             1 => [$contribution->trxn_id, 'String'],
           ]);
 
-      // CRM_Contribute_BAO_Contribution::composeMessageArray expects mysql formatted date
-      $objects['contribution']->receive_date = CRM_Utils_Date::isoToMysql($objects['contribution']->receive_date);
-
       if (isset($params['from_email_address']) && !$elements['createPdf']) {
         // If a logged in user from email is used rather than a domain wide from email address
         // the from_email_address params key will be numerical and we need to convert it to be
@@ -195,7 +190,7 @@ AND    {$this->_componentClause}";
         $input['receipt_from_name'] = str_replace('"', '', $fromDetails[0]);
       }
 
-      $mail = CRM_Contribute_BAO_Contribution::sendMail($input, $ids, $objects['contribution']->id, $elements['createPdf']);
+      $mail = CRM_Contribute_BAO_Contribution::sendMail($input, $ids, $contribID, $elements['createPdf']);
 
       if ($mail['html']) {
         $message[] = $mail['html'];
diff --git a/civicrm/CRM/Contribute/Form/Task/PDFLetterCommon.php b/civicrm/CRM/Contribute/Form/Task/PDFLetterCommon.php
index a201830384eaa0f4eeab7ad7bead0ef8fa01de9b..be8422ac9acd1d9e1c2b76171f1370b9439ff30c 100644
--- a/civicrm/CRM/Contribute/Form/Task/PDFLetterCommon.php
+++ b/civicrm/CRM/Contribute/Form/Task/PDFLetterCommon.php
@@ -296,7 +296,7 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
     // Hooks allow more nuanced smarty usage here.
     CRM_Core_Smarty::singleton()->assign('contributions', $contributions);
     foreach ($contacts as $contactID => $contact) {
-      $tokenResolvedContacts = CRM_Utils_Token::getTokenDetails(['contact_id' => $contactID],
+      [$tokenResolvedContacts] = CRM_Utils_Token::getTokenDetails(['contact_id' => $contactID],
         $returnProperties,
         $skipOnHold,
         $skipDeceased,
@@ -304,7 +304,7 @@ class CRM_Contribute_Form_Task_PDFLetterCommon extends CRM_Contact_Form_Task_PDF
         $messageToken,
         $task
       );
-      $contacts[$contactID] = array_merge($tokenResolvedContacts[0][$contactID], $contact);
+      $contacts[$contactID] = array_merge($tokenResolvedContacts[$contactID], $contact);
     }
     return [$contributions, $contacts];
   }
diff --git a/civicrm/CRM/Contribute/Form/Task/SearchTaskHookSample.php b/civicrm/CRM/Contribute/Form/Task/SearchTaskHookSample.php
deleted file mode 100644
index 0e081647bb22b51d938be5728515cafb4935ba68..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Contribute/Form/Task/SearchTaskHookSample.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
- */
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- */
-
-/**
- * This class provides the functionality to save a search
- * Saved Searches are used for saving frequently used queries
- */
-class CRM_Contribute_Form_Task_SearchTaskHookSample extends CRM_Contribute_Form_Task {
-
-  /**
-   * Build all the data structures needed to build the form.
-   */
-  public function preProcess() {
-    parent::preProcess();
-    $rows = [];
-    // display name and contribution details of all selected contacts
-    $contribIDs = implode(',', $this->_contributionIds);
-
-    $query = "
-    SELECT co.total_amount as amount,
-           co.receive_date as receive_date,
-           co.source       as source,
-           ct.display_name as display_name
-      FROM civicrm_contribution co
-INNER JOIN civicrm_contact ct ON ( co.contact_id = ct.id )
-     WHERE co.id IN ( $contribIDs )";
-
-    $dao = CRM_Core_DAO::executeQuery($query);
-
-    while ($dao->fetch()) {
-      $rows[] = [
-        'display_name' => $dao->display_name,
-        'amount' => $dao->amount,
-        'source' => $dao->source,
-        'receive_date' => $dao->receive_date,
-      ];
-    }
-    $this->assign('rows', $rows);
-  }
-
-  /**
-   * Build the form object.
-   */
-  public function buildQuickForm() {
-    $this->addButtons([
-      [
-        'type' => 'done',
-        'name' => ts('Done'),
-        'isDefault' => TRUE,
-      ],
-    ]);
-  }
-
-}
diff --git a/civicrm/CRM/Contribute/Form/UpdateSubscription.php b/civicrm/CRM/Contribute/Form/UpdateSubscription.php
index 51e218b99f3b1c97c847c0d2f56d08ad90721444..31e16f76cff9b524edb164c2161d50b24736cf70 100644
--- a/civicrm/CRM/Contribute/Form/UpdateSubscription.php
+++ b/civicrm/CRM/Contribute/Form/UpdateSubscription.php
@@ -131,7 +131,6 @@ class CRM_Contribute_Form_UpdateSubscription extends CRM_Contribute_Form_Contrib
     $this->_defaults['installments'] = $this->_subscriptionDetails->installments;
     $this->_defaults['campaign_id'] = $this->_subscriptionDetails->campaign_id;
     $this->_defaults['financial_type_id'] = $this->_subscriptionDetails->financial_type_id;
-    $this->_defaults['is_notify'] = 1;
     foreach ($this->editableScheduleFields as $field) {
       $this->_defaults[$field] = $this->_subscriptionDetails->$field ?? NULL;
     }
diff --git a/civicrm/CRM/Contribute/Import/Form/DataSource.php b/civicrm/CRM/Contribute/Import/Form/DataSource.php
index f1c72357c7bf9c41b5158909bff8c4db3262f816..6833eafd0e252eba747ee44b164bd80b4aa7094e 100644
--- a/civicrm/CRM/Contribute/Import/Form/DataSource.php
+++ b/civicrm/CRM/Contribute/Import/Form/DataSource.php
@@ -38,7 +38,10 @@ class CRM_Contribute_Import_Form_DataSource extends CRM_Import_Form_DataSource {
 
     $this->setDefaults(['onDuplicate' => CRM_Import_Parser::DUPLICATE_SKIP]);
 
-    $this->addElement('submit', 'loadMapping', ts('Load Mapping'), NULL, ['onclick' => 'checkSelect()']);
+    $this->addElement('xbutton', 'loadMapping', ts('Load Mapping'), [
+      'type' => 'submit',
+      'onclick' => 'checkSelect()',
+    ]);
 
     $this->addContactTypeSelector();
   }
diff --git a/civicrm/CRM/Core/BAO/Address.php b/civicrm/CRM/Core/BAO/Address.php
index ea7da9440c15adeb8cf30a5c1d73ce4dfc23e5ba..fdbf08fe6b383c75be73211fabcc80e88567faab 100644
--- a/civicrm/CRM/Core/BAO/Address.php
+++ b/civicrm/CRM/Core/BAO/Address.php
@@ -29,82 +29,15 @@ class CRM_Core_BAO_Address extends CRM_Core_DAO_Address {
    *   True if you need to fix (format) address values.
    *                               before inserting in db
    *
-   * @param null $entity
-   *
-   * @return array|NULL
+   * @return array|NULL|self
    *   array of created address
    */
-  public static function create(&$params, $fixAddress = TRUE, $entity = NULL) {
+  public static function create(&$params, $fixAddress = TRUE) {
     if (!isset($params['address']) || !is_array($params['address'])) {
-      return NULL;
-    }
-    CRM_Core_BAO_Block::sortPrimaryFirst($params['address']);
-    $addresses = [];
-    $contactId = NULL;
-
-    $updateBlankLocInfo = CRM_Utils_Array::value('updateBlankLocInfo', $params, FALSE);
-    if (!$entity) {
-      $contactId = $params['contact_id'];
-      //get all the addresses for this contact
-      $addresses = self::allAddress($contactId);
-    }
-    else {
-      // get all address from location block
-      $entityElements = [
-        'entity_table' => $params['entity_table'],
-        'entity_id' => $params['entity_id'],
-      ];
-      $addresses = self::allEntityAddress($entityElements);
-    }
-
-    $isPrimary = $isBilling = TRUE;
-    $blocks = [];
-    foreach ($params['address'] as $key => $value) {
-      if (!is_array($value)) {
-        continue;
-      }
-
-      $addressExists = self::dataExists($value);
-      if (empty($value['id'])) {
-        if (!empty($addresses) && !empty($value['location_type_id']) && array_key_exists($value['location_type_id'], $addresses)) {
-          $value['id'] = $addresses[$value['location_type_id']];
-        }
-      }
-
-      // Note there could be cases when address info already exist ($value[id] is set) for a contact/entity
-      // BUT info is not present at this time, and therefore we should be really careful when deleting the block.
-      // $updateBlankLocInfo will help take appropriate decision. CRM-5969
-      if (isset($value['id']) && !$addressExists && $updateBlankLocInfo) {
-        //delete the existing record
-        CRM_Core_BAO_Block::blockDelete('Address', ['id' => $value['id']]);
-        continue;
-      }
-      elseif (!$addressExists) {
-        continue;
-      }
-
-      if ($isPrimary && !empty($value['is_primary'])) {
-        $isPrimary = FALSE;
-      }
-      else {
-        $value['is_primary'] = 0;
-      }
-
-      if ($isBilling && !empty($value['is_billing'])) {
-        $isBilling = FALSE;
-      }
-      else {
-        $value['is_billing'] = 0;
-      }
-
-      if (empty($value['manual_geo_code'])) {
-        $value['manual_geo_code'] = 0;
-      }
-      $value['contact_id'] = $contactId;
-      $blocks[] = self::add($value, $fixAddress);
+      return self::add($params, $fixAddress);
     }
-
-    return $blocks;
+    CRM_Core_Error::deprecatedFunctionWarning('Use legacyCreate if not doing a single crud action');
+    return self::legacyCreate($params, $fixAddress);
   }
 
   /**
@@ -131,10 +64,7 @@ class CRM_Core_BAO_Address extends CRM_Core_DAO_Address {
     $hook = empty($params['id']) ? 'create' : 'edit';
     CRM_Utils_Hook::pre($hook, 'Address', CRM_Utils_Array::value('id', $params), $params);
 
-    // if id is set & is_primary isn't we can assume no change
-    if (is_numeric(CRM_Utils_Array::value('is_primary', $params)) || empty($params['id'])) {
-      CRM_Core_BAO_Block::handlePrimary($params, get_class());
-    }
+    CRM_Core_BAO_Block::handlePrimary($params, get_class());
 
     // (prevent chaining 1 and 3) CRM-21214
     if (isset($params['master_id']) && !CRM_Utils_System::isNull($params['master_id'])) {
@@ -1382,4 +1312,73 @@ SELECT is_primary,
     return TRUE;
   }
 
+  /**
+   * Create multiple addresses using legacy methodology.
+   *
+   * @param array $params
+   * @param bool $fixAddress
+   *
+   * @return array|null
+   */
+  public static function legacyCreate(array $params, bool $fixAddress) {
+    if (!isset($params['address']) || !is_array($params['address'])) {
+      return NULL;
+    }
+    CRM_Core_BAO_Block::sortPrimaryFirst($params['address']);
+    $contactId = NULL;
+
+    $updateBlankLocInfo = CRM_Utils_Array::value('updateBlankLocInfo', $params, FALSE);
+    $contactId = $params['contact_id'];
+    //get all the addresses for this contact
+    $addresses = self::allAddress($contactId);
+
+    $isPrimary = $isBilling = TRUE;
+    $blocks = [];
+    foreach ($params['address'] as $key => $value) {
+      if (!is_array($value)) {
+        continue;
+      }
+
+      $addressExists = self::dataExists($value);
+      if (empty($value['id'])) {
+        if (!empty($addresses) && !empty($value['location_type_id']) && array_key_exists($value['location_type_id'], $addresses)) {
+          $value['id'] = $addresses[$value['location_type_id']];
+        }
+      }
+
+      // Note there could be cases when address info already exist ($value[id] is set) for a contact/entity
+      // BUT info is not present at this time, and therefore we should be really careful when deleting the block.
+      // $updateBlankLocInfo will help take appropriate decision. CRM-5969
+      if (isset($value['id']) && !$addressExists && $updateBlankLocInfo) {
+        //delete the existing record
+        CRM_Core_BAO_Block::blockDelete('Address', ['id' => $value['id']]);
+        continue;
+      }
+      elseif (!$addressExists) {
+        continue;
+      }
+
+      if ($isPrimary && !empty($value['is_primary'])) {
+        $isPrimary = FALSE;
+      }
+      else {
+        $value['is_primary'] = 0;
+      }
+
+      if ($isBilling && !empty($value['is_billing'])) {
+        $isBilling = FALSE;
+      }
+      else {
+        $value['is_billing'] = 0;
+      }
+
+      if (empty($value['manual_geo_code'])) {
+        $value['manual_geo_code'] = 0;
+      }
+      $value['contact_id'] = $contactId;
+      $blocks[] = self::add($value, $fixAddress);
+    }
+    return $blocks;
+  }
+
 }
diff --git a/civicrm/CRM/Core/BAO/Block.php b/civicrm/CRM/Core/BAO/Block.php
index 0689b0a495bdad7d84dd45ad77f59ac45a2385e1..dde0c3fae211018b281fea6e31518c11628f19e2 100644
--- a/civicrm/CRM/Core/BAO/Block.php
+++ b/civicrm/CRM/Core/BAO/Block.php
@@ -131,20 +131,15 @@ class CRM_Core_BAO_Block {
    * Check if the current block exits.
    *
    * @param string $blockName
-   *   Bloack name.
+   *   Block name.
    * @param array $params
-   *   Associated array of submitted fields.
+   *   Array of submitted fields.
    *
    * @return bool
-   *   true if the block exits, otherwise false
+   *   true if the block is in the params and is an array
    */
-  public static function blockExists($blockName, &$params) {
-    // return if no data present
-    if (empty($params[$blockName]) || !is_array($params[$blockName])) {
-      return FALSE;
-    }
-
-    return TRUE;
+  public static function blockExists($blockName, $params) {
+    return !empty($params[$blockName]) && is_array($params[$blockName]);
   }
 
   /**
@@ -197,14 +192,12 @@ class CRM_Core_BAO_Block {
    * @param string $blockName
    *   Block name.
    * @param array $params
-   *   (reference ) an assoc array of name/value pairs.
-   * @param null $entity
-   * @param int $contactId
+   *   Array of name/value pairs.
    *
-   * @return object
-   *   CRM_Core_BAO_Block object on success, null otherwise
+   * @return array|null
+   *   Array of created location entities or NULL if none to create.
    */
-  public static function create($blockName, &$params, $entity = NULL, $contactId = NULL) {
+  public static function create($blockName, $params) {
     if (!self::blockExists($blockName, $params)) {
       return NULL;
     }
@@ -215,15 +208,7 @@ class CRM_Core_BAO_Block {
     $resetPrimaryId = NULL;
     $primaryId = FALSE;
 
-    if ($entity) {
-      $entityElements = [
-        'entity_table' => $params['entity_table'],
-        'entity_id' => $params['entity_id'],
-      ];
-    }
-    else {
-      $contactId = $params['contact_id'];
-    }
+    $contactId = $params['contact_id'];
 
     $updateBlankLocInfo = CRM_Utils_Array::value('updateBlankLocInfo', $params, FALSE);
     $isIdSet = CRM_Utils_Array::value('isIdSet', $params[$blockName], FALSE);
@@ -240,31 +225,8 @@ class CRM_Core_BAO_Block {
           unset($value['id']);
         }
       }
-      //lets allow to update primary w/ more cleanly.
-      if (!$resetPrimaryId && !empty($value['is_primary'])) {
-        $primaryId = TRUE;
-        if (is_array($blockIds)) {
-          foreach ($blockIds as $blockId => $blockValue) {
-            if (!empty($blockValue['is_primary'])) {
-              $resetPrimaryId = $blockId;
-              break;
-            }
-          }
-        }
-        if ($resetPrimaryId) {
-          $baoString = 'CRM_Core_BAO_' . $blockName;
-          $block = new $baoString();
-          $block->selectAdd();
-          $block->selectAdd("id, is_primary");
-          $block->id = $resetPrimaryId;
-          if ($block->find(TRUE)) {
-            $block->is_primary = FALSE;
-            $block->save();
-          }
-        }
-      }
     }
-
+    $baoString = 'CRM_Core_BAO_' . $name;
     foreach ($params[$blockName] as $count => $value) {
       if (!is_array($value)) {
         continue;
@@ -304,7 +266,7 @@ class CRM_Core_BAO_Block {
       // $updateBlankLocInfo will help take appropriate decision. CRM-5969
       if (!empty($value['id']) && !$dataExists && $updateBlankLocInfo) {
         //delete the existing record
-        self::blockDelete($blockName, ['id' => $value['id']]);
+        $baoString::del($value['id']);
         continue;
       }
       elseif (!$dataExists) {
@@ -315,12 +277,6 @@ class CRM_Core_BAO_Block {
         'location_type_id' => $value['location_type_id'] ?? NULL,
       ];
 
-      $contactFields['is_primary'] = 0;
-      if ($isPrimary && !empty($value['is_primary'])) {
-        $contactFields['is_primary'] = $value['is_primary'];
-        $isPrimary = FALSE;
-      }
-
       $contactFields['is_billing'] = 0;
       if ($isBilling && !empty($value['is_billing'])) {
         $contactFields['is_billing'] = $value['is_billing'];
@@ -328,18 +284,7 @@ class CRM_Core_BAO_Block {
       }
 
       $blockFields = array_merge($value, $contactFields);
-      if ($name === 'Email') {
-        // @todo ideally all would call the api which is our main tested function,
-        // and towards that call the create rather than add which is preferred by the
-        // api. In order to be careful with change only email is swapped over here because it
-        // is specifically tested in testImportParserWithUpdateWithContactID
-        // and the primary handling is otherwise bypassed on importing an email update.
-        $blocks[] = CRM_Core_BAO_Email::create($blockFields);
-      }
-      else {
-        $baoString = 'CRM_Core_BAO_' . $name;
-        $blocks[] = $baoString::add($blockFields);
-      }
+      $blocks[] = $baoString::create($blockFields);
     }
 
     return $blocks;
@@ -347,6 +292,7 @@ class CRM_Core_BAO_Block {
 
   /**
    * Delete block.
+   * @deprecated - just call the BAO / api directly.
    *
    * @param string $blockName
    *   Block name.
@@ -362,15 +308,8 @@ class CRM_Core_BAO_Block {
       $name = 'OpenID';
     }
 
-    $baoString = 'CRM_Core_DAO_' . $name;
-    $block = new $baoString();
-
-    $block->copyValues($params);
-
-    // CRM-11006 add call to pre and post hook for delete action
-    CRM_Utils_Hook::pre('delete', $name, $block->id, CRM_Core_DAO::$_nullArray);
-    $block->delete();
-    CRM_Utils_Hook::post('delete', $name, $block->id, $block);
+    $baoString = 'CRM_Core_BAO_' . $name;
+    $baoString::del($params['id']);
   }
 
   /**
@@ -393,6 +332,10 @@ class CRM_Core_BAO_Block {
    * @throws API_Exception
    */
   public static function handlePrimary(&$params, $class) {
+    if (isset($params['id']) && CRM_Utils_System::isNull($params['is_primary'] ?? NULL)) {
+      // if id is set & is_primary isn't we can assume no change)
+      return;
+    }
     $table = CRM_Core_DAO_AllCoreTables::getTableForClass($class);
     if (!$table) {
       throw new API_Exception("Failed to locate table for class [$class]");
diff --git a/civicrm/CRM/Core/BAO/ConfigSetting.php b/civicrm/CRM/Core/BAO/ConfigSetting.php
index 45e0378974903192132872b49f14eaaffaa01525..54ad2e1a74d16c79630fef4e8cf6f55846ed0ea7 100644
--- a/civicrm/CRM/Core/BAO/ConfigSetting.php
+++ b/civicrm/CRM/Core/BAO/ConfigSetting.php
@@ -178,7 +178,7 @@ class CRM_Core_BAO_ConfigSetting {
        * If the language is specified via "lcMessages" we skip this, since the
        * intention of the URL query var is to override all other sources.
        */
-      if ($settings->get('inheritLocale') && empty($chosenLocale)) {
+      if ($settings->get('inheritLocale')) {
 
         /*
          * FIXME: On multi-language installs, CRM_Utils_System::getUFLocale() in
diff --git a/civicrm/CRM/Core/BAO/CustomField.php b/civicrm/CRM/Core/BAO/CustomField.php
index 66871a7d5d8ea88bad7a04fdaaa1186d653607f7..14014b3cf9aa2f2fe78e7b56d08fbd7394381c32 100644
--- a/civicrm/CRM/Core/BAO/CustomField.php
+++ b/civicrm/CRM/Core/BAO/CustomField.php
@@ -157,13 +157,13 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
    * Fetch object based on array of properties.
    *
    * @param array $params
-   *   (reference ) an assoc array of name/value pairs.
+   *   An assoc array of name/value pairs.
    * @param array $defaults
    *   (reference ) an assoc array to hold the flattened values.
    *
    * @return CRM_Core_DAO_CustomField
    */
-  public static function retrieve(&$params, &$defaults) {
+  public static function retrieve($params, &$defaults) {
     return CRM_Core_DAO::commonRetrieve('CRM_Core_DAO_CustomField', $params, $defaults);
   }
 
@@ -250,7 +250,9 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     // This provides legacy support for APIv3, allowing no-longer-existent html types
     if ($fieldName == 'html_type' && isset($props['version']) && $props['version'] == 3) {
       $options['Multi-Select'] = 'Multi-Select';
+      $options['Select Country'] = 'Select Country';
       $options['Multi-Select Country'] = 'Multi-Select Country';
+      $options['Select State/Province'] = 'Select State/Province';
       $options['Multi-Select State/Province'] = 'Multi-Select State/Province';
     }
     return $options;
@@ -330,7 +332,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     $cacheKey .= $inline ? '_1_' : '_0_';
     $cacheKey .= $onlyParent ? '_1_' : '_0_';
     $cacheKey .= $onlySubType ? '_1_' : '_0_';
-    $cacheKey .= $checkPermission ? '_1_' : '_0_';
+    $cacheKey .= $checkPermission ? '_1_' . CRM_Core_Session::getLoggedInContactID() . '_' : '_0_0_';
     $cacheKey .= '_' . CRM_Core_Config::domainID() . '_';
 
     $cgTable = CRM_Core_DAO_CustomGroup::getTableName();
@@ -665,114 +667,97 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     $element = NULL;
     $customFieldAttributes = [];
 
+    if (!isset($label)) {
+      $label = $field->label;
+    }
+
+    // DAO stores attributes as a string, but it's hard to manipulate and
+    // CRM_Core_Form::add() wants them as an array.
+    $fieldAttributes = self::attributesFromString($field->attributes);
+
     // Custom field HTML should indicate group+field name
     $groupName = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $field->custom_group_id);
-    $dataCrmCustomVal = $groupName . ':' . $field->name;
-    $dataCrmCustomAttr = 'data-crm-custom="' . $dataCrmCustomVal . '"';
-    $field->attributes .= $dataCrmCustomAttr;
+    $fieldAttributes['data-crm-custom'] = $groupName . ':' . $field->name;
 
     // Fixed for Issue CRM-2183
     if ($widget == 'TextArea' && $search) {
       $widget = 'Text';
     }
 
-    $placeholder = $search ? ts('- any -') : ($useRequired ? ts('- select -') : ts('- none -'));
+    $placeholder = $search ? ts('- any %1 -', [1 => $label]) : ts('- select %1 -', [1 => $label]);
 
-    // FIXME: Why are select state/country separate widget types?
-    $isSelect = (in_array($widget, [
+    if (in_array($widget, [
       'Select',
-      'Select State/Province',
-      'Select Country',
       'CheckBox',
       'Radio',
-    ]));
-
-    if ($isSelect) {
+    ])) {
       $options = $field->getOptions($search ? 'search' : 'create');
 
       // Consolidate widget types to simplify the below switch statement
-      if ($search || (strpos($widget, 'Select') !== FALSE)) {
+      if ($search) {
         $widget = 'Select';
       }
 
-      $customFieldAttributes['data-crm-custom'] = $dataCrmCustomVal;
-      $selectAttributes = ['class' => 'crm-select2'];
-
       // Search field is always multi-select
       if ($search || (self::isSerialized($field) && $widget === 'Select')) {
-        $selectAttributes['class'] .= ' huge';
-        $selectAttributes['multiple'] = 'multiple';
-        $selectAttributes['placeholder'] = $placeholder;
+        $fieldAttributes['class'] = ltrim(($fieldAttributes['class'] ?? '') . ' huge');
+        $fieldAttributes['multiple'] = 'multiple';
+        $fieldAttributes['placeholder'] = $placeholder;
       }
 
       // Add data for popup link. Normally this is handled by CRM_Core_Form->addSelect
       $canEditOptions = CRM_Core_Permission::check('administer CiviCRM');
-      if ($field->option_group_id && !$search && $isSelect && $canEditOptions) {
+      if ($field->option_group_id && !$search && $canEditOptions) {
         $customFieldAttributes += [
           'data-api-entity' => $field->getEntity(),
           'data-api-field' => 'custom_' . $field->id,
           'data-option-edit-path' => 'civicrm/admin/options/' . CRM_Core_DAO::getFieldValue('CRM_Core_DAO_OptionGroup', $field->option_group_id),
         ];
-        $selectAttributes += $customFieldAttributes;
+        $fieldAttributes = array_merge($fieldAttributes, $customFieldAttributes);
       }
     }
 
     $rangeDataTypes = ['Int', 'Float', 'Money'];
 
-    if (!isset($label)) {
-      $label = $field->label;
-    }
-
     // at some point in time we might want to split the below into small functions
 
     switch ($widget) {
       case 'Text':
       case 'Link':
         if ($field->is_search_range && $search && in_array($field->data_type, $rangeDataTypes)) {
-          $qf->add('text', $elementName . '_from', $label . ' ' . ts('From'), $field->attributes);
-          $qf->add('text', $elementName . '_to', ts('To'), $field->attributes);
+          $qf->add('text', $elementName . '_from', $label . ' ' . ts('From'), $fieldAttributes);
+          $qf->add('text', $elementName . '_to', ts('To'), $fieldAttributes);
         }
         else {
           if ($field->text_length) {
-            $field->attributes .= ' maxlength=' . $field->text_length;
+            $fieldAttributes['maxlength'] = $field->text_length;
             if ($field->text_length < 20) {
-              $field->attributes .= ' size=' . $field->text_length;
+              $fieldAttributes['size'] = $field->text_length;
             }
           }
           $element = $qf->add('text', $elementName, $label,
-            $field->attributes,
+            $fieldAttributes,
             $useRequired && !$search
           );
         }
         break;
 
       case 'TextArea':
-        $attributes = $dataCrmCustomAttr;
-        if ($field->note_rows) {
-          $attributes .= 'rows=' . $field->note_rows;
-        }
-        else {
-          $attributes .= 'rows=4';
-        }
-        if ($field->note_columns) {
-          $attributes .= ' cols=' . $field->note_columns;
-        }
-        else {
-          $attributes .= ' cols=60';
-        }
+        $fieldAttributes['rows'] = $field->note_rows ?? 4;
+        $fieldAttributes['cols'] = $field->note_columns ?? 60;
+
         if ($field->text_length) {
-          $attributes .= ' maxlength=' . $field->text_length;
+          $fieldAttributes['maxlength'] = $field->text_length;
         }
         $element = $qf->add('textarea',
           $elementName,
           $label,
-          $attributes,
+          $fieldAttributes,
           $useRequired && !$search
         );
         break;
 
       case 'Select Date':
-        $attr = ['data-crm-custom' => $dataCrmCustomVal];
         //CRM-18379: Fix for date range of 'Select Date' custom field when include in profile.
         $minYear = isset($field->start_date_years) ? (date('Y') - $field->start_date_years) : NULL;
         $maxYear = isset($field->end_date_years) ? (date('Y') + $field->end_date_years) : NULL;
@@ -785,40 +770,40 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           'time' => $field->time_format ? $field->time_format * 12 : FALSE,
         ];
         if ($field->is_search_range && $search) {
-          $qf->add('datepicker', $elementName . '_from', $label, $attr + array('placeholder' => ts('From')), FALSE, $params);
-          $qf->add('datepicker', $elementName . '_to', NULL, $attr + array('placeholder' => ts('To')), FALSE, $params);
+          $qf->add('datepicker', $elementName . '_from', $label, $fieldAttributes + array('placeholder' => ts('From')), FALSE, $params);
+          $qf->add('datepicker', $elementName . '_to', NULL, $fieldAttributes + array('placeholder' => ts('To')), FALSE, $params);
         }
         else {
-          $element = $qf->add('datepicker', $elementName, $label, $attr, $useRequired && !$search, $params);
+          $element = $qf->add('datepicker', $elementName, $label, $fieldAttributes, $useRequired && !$search, $params);
         }
         break;
 
       case 'Radio':
         if ($field->is_search_range && $search && in_array($field->data_type, $rangeDataTypes)) {
-          $qf->add('text', $elementName . '_from', $label . ' ' . ts('From'), $field->attributes);
-          $qf->add('text', $elementName . '_to', ts('To'), $field->attributes);
+          $qf->add('text', $elementName . '_from', $label . ' ' . ts('From'), $fieldAttributes);
+          $qf->add('text', $elementName . '_to', ts('To'), $fieldAttributes);
         }
         else {
-          parse_str($field->attributes, $radioAttributes);
-          $radioAttributes = array_merge($radioAttributes, $customFieldAttributes);
+          $fieldAttributes = array_merge($fieldAttributes, $customFieldAttributes);
           if ($search || empty($useRequired)) {
-            $radioAttributes['allowClear'] = TRUE;
+            $fieldAttributes['allowClear'] = TRUE;
           }
-          $qf->addRadio($elementName, $label, $options, $radioAttributes, NULL, $useRequired);
+          $qf->addRadio($elementName, $label, $options, $fieldAttributes, NULL, $useRequired);
         }
         break;
 
       // For all select elements
       case 'Select':
+        $fieldAttributes['class'] = ltrim(($fieldAttributes['class'] ?? '') . ' crm-select2');
         if ($field->is_search_range && $search && in_array($field->data_type, $rangeDataTypes)) {
-          $qf->add('text', $elementName . '_from', $label . ' ' . ts('From'), $field->attributes);
-          $qf->add('text', $elementName . '_to', ts('To'), $field->attributes);
+          $qf->add('text', $elementName . '_from', $label . ' ' . ts('From'), $fieldAttributes);
+          $qf->add('text', $elementName . '_to', ts('To'), $fieldAttributes);
         }
         else {
-          if (empty($selectAttributes['multiple'])) {
+          if (empty($fieldAttributes['multiple'])) {
             $options = ['' => $placeholder] + $options;
           }
-          $element = $qf->add('select', $elementName, $label, $options, $useRequired && !$search, $selectAttributes);
+          $element = $qf->add('select', $elementName, $label, $options, $useRequired && !$search, $fieldAttributes);
 
           // Add and/or option for fields that store multiple values
           if ($search && self::isSerialized($field)) {
@@ -837,6 +822,9 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
       case 'CheckBox':
         $check = [];
         foreach ($options as $v => $l) {
+          // TODO: I'm not sure if this is supposed to exclude whatever might be
+          // in $field->attributes (available in array format as
+          // $fieldAttributes).  Leaving as-is for now.
           $check[] = &$qf->addElement('advcheckbox', $v, NULL, $l, $customFieldAttributes);
         }
 
@@ -860,44 +848,31 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
           strtolower($field->html_type),
           $elementName,
           $label,
-          $field->attributes,
+          $fieldAttributes,
           $useRequired && !$search
         );
         $qf->addUploadElement($elementName);
         break;
 
       case 'RichTextEditor':
-        $attributes = [
-          'rows' => $field->note_rows,
-          'cols' => $field->note_columns,
-          'data-crm-custom' => $dataCrmCustomVal,
-        ];
+        $fieldAttributes['rows'] = $field->note_rows;
+        $fieldAttributes['cols'] = $field->note_columns;
         if ($field->text_length) {
-          $attributes['maxlength'] = $field->text_length;
+          $fieldAttributes['maxlength'] = $field->text_length;
         }
-        $element = $qf->add('wysiwyg', $elementName, $label, $attributes, $useRequired && !$search);
+        $element = $qf->add('wysiwyg', $elementName, $label, $fieldAttributes, $useRequired && !$search);
         break;
 
       case 'Autocomplete-Select':
         static $customUrls = [];
-        // Fixme: why is this a string in the first place??
-        $attributes = [];
-        if ($field->attributes) {
-          foreach (explode(' ', $field->attributes) as $at) {
-            if (strpos($at, '=')) {
-              list($k, $v) = explode('=', $at);
-              $attributes[$k] = trim($v, ' "');
-            }
-          }
-        }
         if ($field->data_type == 'ContactReference') {
           // break if contact does not have permission to access ContactReference
           if (!CRM_Core_Permission::check('access contact reference fields')) {
             break;
           }
-          $attributes['class'] = (isset($attributes['class']) ? $attributes['class'] . ' ' : '') . 'crm-form-contact-reference huge';
-          $attributes['data-api-entity'] = 'Contact';
-          $element = $qf->add('text', $elementName, $label, $attributes, $useRequired && !$search);
+          $fieldAttributes['class'] = ltrim(($fieldAttributes['class'] ?? '') . ' crm-form-contact-reference huge');
+          $fieldAttributes['data-api-entity'] = 'Contact';
+          $element = $qf->add('text', $elementName, $label, $fieldAttributes, $useRequired && !$search);
 
           $urlParams = "context=customfield&id={$field->id}";
           $idOfelement = $elementName;
@@ -916,7 +891,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
         }
         else {
           // FIXME: This won't work with customFieldOptions hook
-          $attributes += [
+          $fieldAttributes += [
             'entity' => 'OptionValue',
             'placeholder' => $placeholder,
             'multiple' => $search,
@@ -924,7 +899,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
               'params' => ['option_group_id' => $field->option_group_id, 'is_active' => 1],
             ],
           ];
-          $element = $qf->addEntityRef($elementName, $label, $attributes, $useRequired && !$search);
+          $element = $qf->addEntityRef($elementName, $label, $fieldAttributes, $useRequired && !$search);
         }
 
         $qf->assign('customUrls', $customUrls);
@@ -974,6 +949,27 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
     return $element;
   }
 
+  /**
+   * Take a string of HTML element attributes and turn it into an associative
+   * array.
+   *
+   * @param string $attrString
+   *   The attributes as a string, e.g. `rows=3 cols=40`.
+   *
+   * @return array
+   *   The attributes as an array, e.g. `['rows' => 3, 'cols' => 40]`.
+   */
+  public static function attributesFromString($attrString) {
+    $attributes = [];
+    foreach (explode(' ', $attrString) as $at) {
+      if (strpos($at, '=')) {
+        list($k, $v) = explode('=', $at);
+        $attributes[$k] = trim($v, ' "');
+      }
+    }
+    return $attributes;
+  }
+
   /**
    * Delete the Custom Field.
    *
@@ -1057,8 +1053,6 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
       case 'Select':
       case 'Autocomplete-Select':
       case 'Radio':
-      case 'Select Country':
-      case 'Select State/Province':
       case 'CheckBox':
         if ($field['data_type'] == 'ContactReference' && $value) {
           if (is_numeric($value)) {
@@ -1613,10 +1607,15 @@ SELECT $columnName
    */
   public static function defaultCustomTableSchema($params) {
     // add the id and extends_id
+    $collation = CRM_Core_BAO_SchemaHandler::getInUseCollation();
+    $characterSet = 'utf8';
+    if (stripos($collation, 'utf8mb4') !== FALSE) {
+      $characterSet = 'utf8mb4';
+    }
     $table = [
       'name' => $params['name'],
       'is_multiple' => $params['is_multiple'],
-      'attributes' => "ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci",
+      'attributes' => "ENGINE=InnoDB DEFAULT CHARACTER SET {$characterSet} COLLATE {$collation}",
       'fields' => [
         [
           'name' => 'id',
@@ -1699,6 +1698,25 @@ SELECT $columnName
     return CRM_Core_BAO_SchemaHandler::getFieldAlterSQL($params, $indexExist);
   }
 
+  /**
+   * Reformat existing values for a field when changing its serialize attribute
+   *
+   * @param CRM_Core_DAO_CustomField $field
+   * @throws CRM_Core_Exception
+   */
+  private static function alterSerialize($field) {
+    $table = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $field->custom_group_id, 'table_name');
+    $col = $field->column_name;
+    $sp = CRM_Core_DAO::VALUE_SEPARATOR;
+    if ($field->serialize) {
+      $sql = "UPDATE `$table` SET `$col` = CONCAT('$sp', `$col`, '$sp') WHERE `$col` IS NOT NULL AND `$col` NOT LIKE '$sp%' AND `$col` != ''";
+    }
+    else {
+      $sql = "UPDATE `$table` SET `$col` = SUBSTRING_INDEX(SUBSTRING(`$col`, 2), '$sp', 1) WHERE `$col` LIKE '$sp%'";
+    }
+    CRM_Core_DAO::executeQuery($sql);
+  }
+
   /**
    * Determine whether it would be safe to move a field.
    *
@@ -1992,6 +2010,9 @@ WHERE  id IN ( %1, %2 )
     $transaction = new CRM_Core_Transaction();
     $params = self::prepareCreate($params);
 
+    $alterSerialize = isset($params['serialize']) && !empty($params['id'])
+      && ($params['serialize'] != CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomField', $params['id'], 'serialize'));
+
     $customField = new CRM_Core_DAO_CustomField();
     $customField->copyValues($params);
     $customField->save();
@@ -2011,6 +2032,11 @@ WHERE  id IN ( %1, %2 )
 
     // make sure all values are present in the object for further processing
     $customField->find(TRUE);
+
+    if ($alterSerialize) {
+      self::alterSerialize($customField);
+    }
+
     return $customField;
   }
 
diff --git a/civicrm/CRM/Core/BAO/CustomGroup.php b/civicrm/CRM/Core/BAO/CustomGroup.php
index 3a0dac33f1613641fd3c815a2e3e184407924834..52a96839fb927d792d66a49e31503d8ef397bc81 100644
--- a/civicrm/CRM/Core/BAO/CustomGroup.php
+++ b/civicrm/CRM/Core/BAO/CustomGroup.php
@@ -1121,53 +1121,16 @@ ORDER BY civicrm_custom_group.weight,
    * @see _apachesolr_civiAttachments_dereference_file_parent
    */
   public static function getTableNameByEntityName($entityType) {
-    $tableName = '';
     switch ($entityType) {
       case 'Contact':
       case 'Individual':
       case 'Household':
       case 'Organization':
-        $tableName = 'civicrm_contact';
-        break;
-
-      case 'Contribution':
-        $tableName = 'civicrm_contribution';
-        break;
-
-      case 'Group':
-        $tableName = 'civicrm_group';
-        break;
-
-      // DRAFTING: Verify if we cannot make it pluggable
-
-      case 'Activity':
-        $tableName = 'civicrm_activity';
-        break;
-
-      case 'Relationship':
-        $tableName = 'civicrm_relationship';
-        break;
-
-      case 'Membership':
-        $tableName = 'civicrm_membership';
-        break;
-
-      case 'Participant':
-        $tableName = 'civicrm_participant';
-        break;
-
-      case 'Event':
-        $tableName = 'civicrm_event';
-        break;
-
-      case 'Grant':
-        $tableName = 'civicrm_grant';
-        break;
+        return 'civicrm_contact';
 
-      // need to add cases for Location, Address
+      default:
+        return CRM_Core_DAO_AllCoreTables::getTableForEntityName($entityType);
     }
-
-    return $tableName;
   }
 
   /**
diff --git a/civicrm/CRM/Core/BAO/Email.php b/civicrm/CRM/Core/BAO/Email.php
index 0dd1bca05a49d314cd910b8415f2e82aa4cba4ba..aa0fdc956a883c5a23a74ec01aeec425b7ff2bfc 100644
--- a/civicrm/CRM/Core/BAO/Email.php
+++ b/civicrm/CRM/Core/BAO/Email.php
@@ -31,33 +31,11 @@ class CRM_Core_BAO_Email extends CRM_Core_DAO_Email {
    * @return object
    */
   public static function create($params) {
-    // if id is set & is_primary isn't we can assume no change
-    if (is_numeric(CRM_Utils_Array::value('is_primary', $params)) || empty($params['id'])) {
-      CRM_Core_BAO_Block::handlePrimary($params, get_class());
-    }
-
-    $email = CRM_Core_BAO_Email::add($params);
+    CRM_Core_BAO_Block::handlePrimary($params, get_class());
 
-    return $email;
-  }
-
-  /**
-   * Takes an associative array and adds email.
-   *
-   * @param array $params
-   *   (reference ) an assoc array of name/value pairs.
-   *
-   * @return object
-   *   CRM_Core_BAO_Email object on success, null otherwise
-   */
-  public static function add(&$params) {
     $hook = empty($params['id']) ? 'create' : 'edit';
     CRM_Utils_Hook::pre($hook, 'Email', CRM_Utils_Array::value('id', $params), $params);
 
-    if (isset($params['is_bulkmail']) && $params['is_bulkmail'] === 'null') {
-      CRM_Core_Error::deprecatedFunctionWarning('It is not valid to set bulkmail to null, it is boolean');
-      $params['bulkmail'] = 0;
-    }
     $email = new CRM_Core_DAO_Email();
     $email->copyValues($params);
     if (!empty($email->email)) {
@@ -98,6 +76,20 @@ WHERE  contact_id = {$params['contact_id']}
     return $email;
   }
 
+  /**
+   * Takes an associative array and adds email.
+   *
+   * @param array $params
+   *   (reference ) an assoc array of name/value pairs.
+   *
+   * @return object
+   *   CRM_Core_BAO_Email object on success, null otherwise
+   */
+  public static function add(&$params) {
+    CRM_Core_Error::deprecatedFunctionWarning('apiv4 create');
+    return self::create($params);
+  }
+
   /**
    * Given the list of params in the params array, fetch the object
    * and store the values in the values array
diff --git a/civicrm/CRM/Core/BAO/IM.php b/civicrm/CRM/Core/BAO/IM.php
index 3a950122dd68a3318ee5871e4d9a112f5656c91e..bca4ce1365df5d9e34e6e6b9a328f31c3e6ad2d6 100644
--- a/civicrm/CRM/Core/BAO/IM.php
+++ b/civicrm/CRM/Core/BAO/IM.php
@@ -24,12 +24,32 @@ class CRM_Core_BAO_IM extends CRM_Core_DAO_IM {
    * Create or update IM record.
    *
    * @param array $params
-   * @return CRM_Core_DAO_IM
+   *
+   * @return \CRM_Core_DAO|\CRM_Core_DAO_IM
+   * @throws \CRM_Core_Exception
+   * @throws \API_Exception
    */
-  public static function add($params) {
+  public static function create($params) {
+    CRM_Core_BAO_Block::handlePrimary($params, __CLASS__);
     return self::writeRecord($params);
   }
 
+  /**
+   * Create or update IM record.
+   *
+   * @deprecated
+   *
+   * @param array $params
+   *
+   * @return \CRM_Core_DAO|\CRM_Core_DAO_IM
+   * @throws \CRM_Core_Exception
+   * @throws \API_Exception
+   */
+  public static function add($params) {
+    CRM_Core_Error::deprecatedFunctionWarning('use the v4 api');
+    return self::create($params);
+  }
+
   /**
    * Given the list of params in the params array, fetch the object
    * and store the values in the values array
diff --git a/civicrm/CRM/Core/BAO/Location.php b/civicrm/CRM/Core/BAO/Location.php
index 6af1d85bc8cf9cf639737ff56d3f7dc66d953944..c19fd727c699988fc9b66a9255c7f478feac0d28 100644
--- a/civicrm/CRM/Core/BAO/Location.php
+++ b/civicrm/CRM/Core/BAO/Location.php
@@ -35,11 +35,9 @@ class CRM_Core_BAO_Location extends CRM_Core_DAO {
    *   True if you need to fix (format) address values.
    *                               before inserting in db
    *
-   * @param null $entity
-   *
    * @return array
    */
-  public static function create(&$params, $fixAddress = TRUE, $entity = NULL) {
+  public static function create(&$params, $fixAddress = TRUE) {
     $location = [];
     if (!self::dataExists($params)) {
       return $location;
@@ -47,30 +45,11 @@ class CRM_Core_BAO_Location extends CRM_Core_DAO {
 
     // create location blocks.
     foreach (self::$blocks as $block) {
-      if ($block != 'address') {
-        $location[$block] = CRM_Core_BAO_Block::create($block, $params, $entity);
-      }
-      else {
-        $location[$block] = CRM_Core_BAO_Address::create($params, $fixAddress, $entity);
+      if ($block !== 'address') {
+        $location[$block] = CRM_Core_BAO_Block::create($block, $params);
       }
-    }
-
-    if ($entity) {
-      // this is a special case for adding values in location block table
-      $entityElements = [
-        'entity_table' => $params['entity_table'],
-        'entity_id' => $params['entity_id'],
-      ];
-
-      $location['id'] = self::createLocBlock($location, $entityElements);
-    }
-    else {
-      // when we come from a form which displays all the location elements (like the edit form or the inline block
-      // elements, we can skip the below check. The below check adds quite a feq queries to an already overloaded
-      // form
-      if (empty($params['updateBlankLocInfo'])) {
-        // make sure contact should have only one primary block, CRM-5051
-        self::checkPrimaryBlocks(CRM_Utils_Array::value('contact_id', $params));
+      elseif (is_array($params['address'] ?? NULL)) {
+        $location[$block] = CRM_Core_BAO_Address::legacyCreate($params, $fixAddress);
       }
     }
 
@@ -80,12 +59,13 @@ class CRM_Core_BAO_Location extends CRM_Core_DAO {
   /**
    * Creates the entry in the civicrm_loc_block.
    *
-   * @param string $location
+   * @param array $location
    * @param array $entityElements
    *
    * @return int
    */
-  public static function createLocBlock(&$location, &$entityElements) {
+  public static function createLocBlock($location, $entityElements) {
+    CRM_Core_Error::deprecatedFunctionWarning('Use LocBlock api');
     $locId = self::findExisting($entityElements);
     $locBlock = [];
 
@@ -116,8 +96,7 @@ class CRM_Core_BAO_Location extends CRM_Core_DAO {
       return NULL;
     }
 
-    $locBlockInfo = self::addLocBlock($locBlock);
-    return $locBlockInfo->id;
+    return self::addLocBlock($locBlock)->id;
   }
 
   /**
@@ -147,17 +126,15 @@ WHERE e.id = %1";
    * Takes an associative array and adds location block.
    *
    * @param array $params
-   *   (reference ) an assoc array of name/value pairs.
    *
-   * @return CRM_Core_BAO_locBlock
+   * @return CRM_Core_DAO_LocBlock
    *   Object on success, null otherwise
    */
-  public static function addLocBlock(&$params) {
+  public static function addLocBlock($params) {
     $locBlock = new CRM_Core_DAO_LocBlock();
-
     $locBlock->copyValues($params);
-
-    return $locBlock->save();
+    $locBlock->save();
+    return $locBlock;
   }
 
   /**
@@ -255,6 +232,10 @@ WHERE e.id = %1";
   /**
    * Delete all the block associated with the location.
    *
+   * Note a universe search on 1 Oct 2020 found no calls to this function.
+   *
+   * @deprecated
+   *
    * @param int $contactId
    *   Contact id.
    * @param int $locationTypeId
@@ -262,6 +243,7 @@ WHERE e.id = %1";
    * @throws CRM_Core_Exception
    */
   public static function deleteLocationBlocks($contactId, $locationTypeId) {
+    CRM_Core_Error::deprecatedFunctionWarning('Use v4 api');
     // ensure that contactId has a value
     if (empty($contactId) ||
       !CRM_Utils_Rule::positiveInteger($contactId)
diff --git a/civicrm/CRM/Core/BAO/Mapping.php b/civicrm/CRM/Core/BAO/Mapping.php
index e2e0e7057a29de51be7091621772fe334e24e630..3c9bf18beaa7b6e494e17a46a227bbbee9632d08 100644
--- a/civicrm/CRM/Core/BAO/Mapping.php
+++ b/civicrm/CRM/Core/BAO/Mapping.php
@@ -318,8 +318,12 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
     $hasRelationTypes = [];
 
     $columnCount = $columnNo;
-    $form->addElement('submit', 'addBlock', ts('Also include contacts where'),
-      ['class' => 'submit-link']
+    $form->addElement('xbutton', 'addBlock', ts('Also include contacts where'),
+      [
+        'type' => 'submit',
+        'class' => 'submit-link',
+        'value' => 1,
+      ]
     );
 
     $contactTypes = CRM_Contact_BAO_ContactType::basicTypes();
@@ -553,7 +557,11 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
         $form->add('text', "value[$x][$i]", '');
       }
 
-      $form->addElement('submit', "addMore[$x]", ts('Another search field'), ['class' => 'submit-link']);
+      $form->addElement('xbutton', "addMore[$x]", ts('Another search field'), [
+        'type' => 'submit',
+        'class' => 'submit-link',
+        'value' => 1,
+      ]);
     }
     //end of block for
 
diff --git a/civicrm/CRM/Core/BAO/MessageTemplate.php b/civicrm/CRM/Core/BAO/MessageTemplate.php
index 4dedb8c66e7d6e1bfd86bff788ceaa2b23ec4516..e32ab9d4cabd876f870a81d951be385c6e7304fb 100644
--- a/civicrm/CRM/Core/BAO/MessageTemplate.php
+++ b/civicrm/CRM/Core/BAO/MessageTemplate.php
@@ -238,7 +238,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
       }
 
       $params = [['contact_id', '=', $contactId, 0, 0]];
-      list($contact, $_) = CRM_Contact_BAO_Query::apiQuery($params);
+      [$contact] = CRM_Contact_BAO_Query::apiQuery($params);
 
       //CRM-4524
       $contact = reset($contact);
@@ -464,6 +464,11 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
       $mailContent['html'] = preg_replace('/<body(.*)$/im', "<body\\1\n{$testDao->html}", $mailContent['html']);
     }
 
+    // Overwrite subject from form field
+    if (!empty($params['subject'])) {
+      $mailContent['subject'] = $params['subject'];
+    }
+
     // replace tokens in the three elements (in subject as if it was the text body)
     $domain = CRM_Core_BAO_Domain::getDomain();
     $hookTokens = [];
@@ -576,7 +581,7 @@ class CRM_Core_BAO_MessageTemplate extends CRM_Core_DAO_MessageTemplate {
 
     if ($params['toEmail']) {
       $contactParams = [['email', 'LIKE', $params['toEmail'], 0, 1]];
-      list($contact, $_) = CRM_Contact_BAO_Query::apiQuery($contactParams);
+      [$contact] = CRM_Contact_BAO_Query::apiQuery($contactParams);
 
       $prefs = array_pop($contact);
 
diff --git a/civicrm/CRM/Core/BAO/OpenID.php b/civicrm/CRM/Core/BAO/OpenID.php
index 34326a7562578ccf60250ec4f8a3b18227ea7f1b..f2000435737d9d98f9b8925a7210f5044b7d7895 100644
--- a/civicrm/CRM/Core/BAO/OpenID.php
+++ b/civicrm/CRM/Core/BAO/OpenID.php
@@ -24,12 +24,33 @@ class CRM_Core_BAO_OpenID extends CRM_Core_DAO_OpenID {
    * Create or update OpenID record.
    *
    * @param array $params
+   *
    * @return CRM_Core_DAO_OpenID
+   *
+   * @throws \API_Exception
+   * @throws \CRM_Core_Exception
    */
-  public static function add($params) {
+  public static function create($params) {
+    CRM_Core_BAO_Block::handlePrimary($params, __CLASS__);
     return self::writeRecord($params);
   }
 
+  /**
+   * Create or update OpenID record.
+   *
+   * @deprecated
+   *
+   * @param array $params
+   *
+   * @return \CRM_Core_DAO|\CRM_Core_DAO_IM
+   * @throws \CRM_Core_Exception
+   * @throws \API_Exception
+   */
+  public static function add($params) {
+    CRM_Core_Error::deprecatedFunctionWarning('use the v4 api');
+    return self::create($params);
+  }
+
   /**
    * Given the list of params in the params array, fetch the object
    * and store the values in the values array
@@ -38,28 +59,12 @@ class CRM_Core_BAO_OpenID extends CRM_Core_DAO_OpenID {
    *   Input parameters to find object.
    *
    * @return mixed
+   * @throws \CRM_Core_Exception
    */
   public static function &getValues($entityBlock) {
     return CRM_Core_BAO_Block::getValues('openid', $entityBlock);
   }
 
-  /**
-   * Returns whether or not this OpenID is allowed to login.
-   *
-   * @param string $identity_url
-   *   The OpenID to check.
-   *
-   * @return bool
-   */
-  public static function isAllowedToLogin($identity_url) {
-    $openId = new CRM_Core_DAO_OpenID();
-    $openId->openid = $identity_url;
-    if ($openId->find(TRUE)) {
-      return $openId->allowed_to_login == 1;
-    }
-    return FALSE;
-  }
-
   /**
    * Get all the openids for a specified contact_id, with the primary openid being first
    *
diff --git a/civicrm/CRM/Core/BAO/Phone.php b/civicrm/CRM/Core/BAO/Phone.php
index f5851eee26cf4559c3cefdc87ecc1cc98a42e038..7e5a7eede55faf7e314f0e2fef87acaf6d35a221 100644
--- a/civicrm/CRM/Core/BAO/Phone.php
+++ b/civicrm/CRM/Core/BAO/Phone.php
@@ -26,38 +26,35 @@ class CRM_Core_BAO_Phone extends CRM_Core_DAO_Phone {
    *
    * @param array $params
    *
-   * @return object
+   * @return \CRM_Core_DAO_Phone
+   *
    * @throws API_Exception
+   * @throws \CRM_Core_Exception
    */
   public static function create($params) {
     // Ensure mysql phone function exists
     CRM_Core_DAO::checkSqlFunctionsExist();
-
-    if (is_numeric(CRM_Utils_Array::value('is_primary', $params)) ||
-      // if id is set & is_primary isn't we can assume no change
-      empty($params['id'])
-    ) {
-      CRM_Core_BAO_Block::handlePrimary($params, get_class());
-    }
-    $phone = self::add($params);
-
-    return $phone;
+    CRM_Core_BAO_Block::handlePrimary($params, get_class());
+    return self::writeRecord($params);
   }
 
   /**
    * Takes an associative array and adds phone.
    *
+   * @deprecated use create.
+   *
    * @param array $params
    *   (reference ) an assoc array of name/value pairs.
    *
    * @return object
    *   CRM_Core_BAO_Phone object on success, null otherwise
+   *
+   * @throws \API_Exception
+   * @throws \CRM_Core_Exception
    */
-  public static function add(&$params) {
-    // Ensure mysql phone function exists
-    CRM_Core_DAO::checkSqlFunctionsExist();
-
-    return self::writeRecord($params);
+  public static function add($params) {
+    CRM_Core_Error::deprecatedFunctionWarning('Use the v4 api');
+    return self::create($params);
   }
 
   /**
@@ -68,6 +65,7 @@ class CRM_Core_BAO_Phone extends CRM_Core_DAO_Phone {
    *
    * @return array
    *   array of phone objects
+   * @throws \CRM_Core_Exception
    */
   public static function &getValues($entityBlock) {
     $getValues = CRM_Core_BAO_Block::getValues('phone', $entityBlock);
diff --git a/civicrm/CRM/Core/BAO/SchemaHandler.php b/civicrm/CRM/Core/BAO/SchemaHandler.php
index 675475bd4e1ff92b96b29fe2160e8bda9811804b..90b1e0b809a025ed8feccf14f911541bf5ad5a54 100644
--- a/civicrm/CRM/Core/BAO/SchemaHandler.php
+++ b/civicrm/CRM/Core/BAO/SchemaHandler.php
@@ -365,9 +365,9 @@ ADD UNIQUE INDEX `unique_entity_id` ( `entity_id` )";
    *
    * @param $tables
    *   Tables to create index for in the format:
-   *     array('civicrm_entity_table' => 'entity_id')
+   *     ['civicrm_entity_table' => ['entity_id']]
    *     OR
-   *     array('civicrm_entity_table' => array('entity_id', 'entity_table'))
+   *     array['civicrm_entity_table' => array['entity_id', 'entity_table']]
    *   The latter will create a combined index on the 2 keys (in order).
    *
    *  Side note - when creating combined indexes the one with the most variation
diff --git a/civicrm/CRM/Core/BAO/UFGroup.php b/civicrm/CRM/Core/BAO/UFGroup.php
index aca664795e7f2c5987402714aa230db5fe5519cc..412f753ce7cf424d20effc9e7cdbc0401b795169 100644
--- a/civicrm/CRM/Core/BAO/UFGroup.php
+++ b/civicrm/CRM/Core/BAO/UFGroup.php
@@ -1310,12 +1310,7 @@ class CRM_Core_BAO_UFGroup extends CRM_Core_DAO_UFGroup {
           if ($htmlType == 'Link') {
             $url = $params[$index];
           }
-          elseif (in_array($htmlType, [
-            'CheckBox',
-            'Multi-Select',
-            'Multi-Select State/Province',
-            'Multi-Select Country',
-          ])) {
+          elseif (!empty($field['serialize'])) {
             $valSeparator = CRM_Core_DAO::VALUE_SEPARATOR;
             $selectedOptions = explode($valSeparator, $params[$index]);
 
@@ -1869,7 +1864,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
       }
     }
     elseif (substr($fieldName, 0, 7) === 'country') {
-      $form->add('select', $name, $title, ['' => ts('- select -')] + CRM_Core_PseudoConstant::country(), $required, $selectAttributes);
+      $form->add('select', $name, $title, CRM_Core_PseudoConstant::country(), $required, $selectAttributes);
       $config = CRM_Core_Config::singleton();
       if (!in_array($mode, [CRM_Profile_Form::MODE_EDIT, CRM_Profile_Form::MODE_SEARCH]) &&
         $config->defaultContactCountry
@@ -1895,16 +1890,12 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
             $providerName = substr($name, 0, -1) . '-provider_id]';
           }
           $form->add('select', $providerName, NULL,
-            [
-              '' => ts('- select -'),
-            ] + CRM_Core_PseudoConstant::get('CRM_Core_DAO_IM', 'provider_id'), $required
+            CRM_Core_PseudoConstant::get('CRM_Core_DAO_IM', 'provider_id'), $required
           );
         }
         else {
           $form->add('select', $name . '-provider_id', $title,
-            [
-              '' => ts('- select -'),
-            ] + CRM_Core_PseudoConstant::get('CRM_Core_DAO_IM', 'provider_id'), $required
+            CRM_Core_PseudoConstant::get('CRM_Core_DAO_IM', 'provider_id'), $required
           );
         }
 
@@ -1916,7 +1907,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
     elseif (CRM_Utils_Array::value('name', $field) == 'membership_type') {
       list($orgInfo, $types) = CRM_Member_BAO_MembershipType::getMembershipTypeInfo();
       $sel = &$form->addElement('hierselect', $name, $title);
-      $select = ['' => ts('- select -')];
+      $select = ['' => ts('- select membership type -')];
       if (count($orgInfo) == 1 && $field['is_required']) {
         // we only have one org - so we should default to it. Not sure about defaulting to first type
         // as it could be missed - so adding a select
@@ -1932,9 +1923,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
     }
     elseif (CRM_Utils_Array::value('name', $field) == 'membership_status') {
       $form->add('select', $name, $title,
-        [
-          '' => ts('- select -'),
-        ] + CRM_Member_PseudoConstant::membershipStatus(NULL, NULL, 'label'), $required
+        CRM_Member_PseudoConstant::membershipStatus(NULL, NULL, 'label'), $required
       );
     }
     elseif (in_array($fieldName, ['gender_id', 'communication_style_id'])) {
@@ -1999,7 +1988,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
         'contact_type' => $profileType,
         'greeting_type' => $fieldName,
       ];
-      $form->add('select', $name, $title, ['' => ts('- select -')] + CRM_Core_PseudoConstant::greeting($greeting), $required);
+      $form->add('select', $name, $title, CRM_Core_PseudoConstant::greeting($greeting), $required, ['placeholder' => TRUE]);
       // add custom greeting element
       $form->add('text', $fieldName . '_custom', ts('Custom %1', [1 => ucwords(str_replace('_', ' ', $fieldName))]),
         NULL, FALSE
@@ -2019,7 +2008,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
       $form->add('select', $name, $title, CRM_Core_SelectValues::pmf());
     }
     elseif ($fieldName === 'preferred_language') {
-      $form->add('select', $name, $title, ['' => ts('- select -')] + CRM_Contact_BAO_Contact::buildOptions('preferred_language'));
+      $form->add('select', $name, $title, CRM_Contact_BAO_Contact::buildOptions('preferred_language'), $required, ['placeholder' => TRUE]);
     }
     elseif ($fieldName == 'external_identifier') {
       $form->add('text', $name, $title, $attributes, $required);
@@ -2078,35 +2067,29 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
     elseif ($fieldName === 'product_name') {
       list($products, $options) = CRM_Contribute_BAO_Premium::getPremiumProductInfo();
       $sel = &$form->addElement('hierselect', $name, $title);
-      $products = ['0' => ts('- select -')] + $products;
+      $products = ['0' => ts('- select %1 -', [1 => $title])] + $products;
       $sel->setOptions([$products, $options]);
     }
     elseif ($fieldName === 'payment_instrument') {
       $form->add('select', $name, $title,
-        ['' => ts('- select -')] + CRM_Contribute_PseudoConstant::paymentInstrument(), $required);
+        CRM_Contribute_PseudoConstant::paymentInstrument(), $required, ['placeholder' => TRUE]);
     }
     elseif ($fieldName === 'financial_type') {
       $form->add('select', $name, $title,
-        [
-          '' => ts('- select -'),
-        ] + CRM_Contribute_PseudoConstant::financialType(), $required
+        CRM_Contribute_PseudoConstant::financialType(), $required, ['placeholder' => TRUE]
       );
     }
     elseif ($fieldName === 'contribution_status_id') {
       $contributionStatuses = CRM_Contribute_BAO_Contribution_Utils::getContributionStatuses();
 
       $form->add('select', $name, $title,
-        [
-          '' => ts('- select -'),
-        ] + $contributionStatuses, $required
+        $contributionStatuses, $required, ['placeholder' => TRUE]
       );
     }
     elseif ($fieldName === 'soft_credit_type') {
       $name = "soft_credit_type[$rowNumber]";
       $form->add('select', $name, $title,
-        [
-          '' => ts('- select -'),
-        ] + CRM_Core_OptionGroup::values("soft_credit_type")
+        CRM_Core_OptionGroup::values("soft_credit_type"), ['placeholder' => TRUE]
       );
       //CRM-15350: choose SCT field default value as 'Gift' for membership use
       //else (for contribution), use configured SCT default value
@@ -2124,23 +2107,20 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
     }
     elseif ($fieldName == 'contribution_page_id') {
       $form->add('select', $name, $title,
-        [
-          '' => ts('- select -'),
-        ] + CRM_Contribute_PseudoConstant::contributionPage(), $required, 'class="big"'
+        CRM_Contribute_PseudoConstant::contributionPage(), $required, [
+          'class' => 'big',
+          'placeholder' => TRUE,
+        ]
       );
     }
     elseif ($fieldName == 'activity_status_id') {
       $form->add('select', $name, $title,
-        [
-          '' => ts('- select -'),
-        ] + CRM_Core_PseudoConstant::activityStatus(), $required
+        CRM_Core_PseudoConstant::activityStatus(), $required, ['placeholder' => TRUE]
       );
     }
     elseif ($fieldName == 'activity_engagement_level') {
       $form->add('select', $name, $title,
-        [
-          '' => ts('- select -'),
-        ] + CRM_Campaign_PseudoConstant::engagementLevel(), $required
+        CRM_Campaign_PseudoConstant::engagementLevel(), $required, ['placeholder' => TRUE]
       );
     }
     elseif ($fieldName == 'participant_status') {
@@ -2149,9 +2129,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
         $cond = 'visibility_id = 1';
       }
       $form->add('select', $name, $title,
-        [
-          '' => ts('- select -'),
-        ] + CRM_Event_PseudoConstant::participantStatus(NULL, $cond, 'label'), $required
+        CRM_Event_PseudoConstant::participantStatus(NULL, $cond, 'label'), $required, ['placeholder' => TRUE]
       );
     }
     elseif ($fieldName == 'participant_role') {
@@ -2160,9 +2138,7 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
       }
       else {
         $form->add('select', $name, $title,
-          [
-            '' => ts('- select -'),
-          ] + CRM_Event_PseudoConstant::participantRole(), $required
+          CRM_Event_PseudoConstant::participantRole(), $required, ['placeholder' => TRUE]
         );
       }
     }
@@ -2181,9 +2157,11 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
           $form->_componentCampaigns
         ));
         $form->add('select', $name, $title,
+          $campaigns, $required,
           [
-            '' => ts('- select -'),
-          ] + $campaigns, $required, 'class="crm-select2 big"'
+            'class' => 'crm-select2 big',
+            'placeholder' => TRUE,
+          ]
         );
       }
     }
@@ -2196,10 +2174,8 @@ AND    ( entity_id IS NULL OR entity_id <= 0 )
     }
     elseif ($fieldName == 'case_status') {
       $form->add('select', $name, $title,
-        [
-          '' => ts('- select -'),
-        ] + CRM_Case_BAO_Case::buildOptions('case_status_id', 'create'),
-        $required
+        CRM_Case_BAO_Case::buildOptions('case_status_id', 'create'),
+        $required, ['placeholder' => TRUE]
       );
     }
     else {
diff --git a/civicrm/CRM/Core/BAO/UFMatch.php b/civicrm/CRM/Core/BAO/UFMatch.php
index 9e61b990b3ce6c9ee5c9318913ecda59504f8226..9d0a58bbac35ac79ab05c4c95ee07f6a5bf721de 100644
--- a/civicrm/CRM/Core/BAO/UFMatch.php
+++ b/civicrm/CRM/Core/BAO/UFMatch.php
@@ -340,6 +340,14 @@ AND    domain_id    = %4
       return;
     }
 
+    // 1.do check for contact Id.
+    $ufmatch = new CRM_Core_DAO_UFMatch();
+    $ufmatch->contact_id = $contactId;
+    $ufmatch->domain_id = CRM_Core_Config::domainID();
+    if (!$ufmatch->find(TRUE)) {
+      return;
+    }
+
     $config = CRM_Core_Config::singleton();
     $ufName = CRM_Contact_BAO_Contact::getPrimaryEmail($contactId);
 
@@ -349,13 +357,6 @@ AND    domain_id    = %4
 
     $update = FALSE;
 
-    // 1.do check for contact Id.
-    $ufmatch = new CRM_Core_DAO_UFMatch();
-    $ufmatch->contact_id = $contactId;
-    $ufmatch->domain_id = CRM_Core_Config::domainID();
-    if (!$ufmatch->find(TRUE)) {
-      return;
-    }
     if ($ufmatch->uf_name != $ufName) {
       $update = TRUE;
     }
diff --git a/civicrm/CRM/Core/BAO/Website.php b/civicrm/CRM/Core/BAO/Website.php
index 358ddd2f3c2c001652836db90bd3e75775e3bd7e..d5f386e8fdb8d7eb9fc7501ec77a67f98093be36 100644
--- a/civicrm/CRM/Core/BAO/Website.php
+++ b/civicrm/CRM/Core/BAO/Website.php
@@ -24,9 +24,11 @@ class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
    * Create or update Website record.
    *
    * @param array $params
+   *
    * @return CRM_Core_DAO_Website
+   * @throws \CRM_Core_Exception
    */
-  public static function add($params) {
+  public static function create($params) {
     return self::writeRecord($params);
   }
 
@@ -36,23 +38,13 @@ class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
    * If called in a legacy manner this, temporarily, fails back to calling the legacy function.
    *
    * @param array $params
-   * @param int $contactID
-   * @param bool $skipDelete
    *
    * @return bool|CRM_Core_BAO_Website
+   * @throws \CRM_Core_Exception
    */
-  public static function create($params, $contactID = NULL, $skipDelete = NULL) {
-    if ($skipDelete !== NULL || ($contactID && !is_array($contactID))) {
-      \Civi::log()->warning(ts('Calling website:create with vars other than $params is deprecated. Use process'), ['civi.tag' => 'deprecated']);
-      return self::process($params, $contactID, $skipDelete);
-    }
-    foreach ($params as $key => $value) {
-      if (is_numeric($key)) {
-        \Civi::log()->warning(ts('Calling website:create for multiple websites $params is deprecated. Use process'), ['civi.tag' => 'deprecated']);
-        return self::process($params, $contactID, $skipDelete);
-      }
-    }
-    return self::add($params);
+  public static function add($params) {
+    CRM_Core_Error::deprecatedFunctionWarning('use apiv4');
+    return self::create($params);
   }
 
   /**
@@ -65,6 +57,7 @@ class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
    * @param bool $skipDelete
    *
    * @return bool
+   * @throws \CRM_Core_Exception
    */
   public static function process($params, $contactID, $skipDelete) {
     if (empty($params)) {
@@ -87,7 +80,7 @@ class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
       }
       if (!empty($values['url'])) {
         $values['contact_id'] = $contactID;
-        self::add($values);
+        self::create($values);
       }
       elseif ($skipDelete && !empty($values['id'])) {
         self::del($values['id']);
diff --git a/civicrm/CRM/Core/CodeGen/GenerateData.php b/civicrm/CRM/Core/CodeGen/GenerateData.php
new file mode 100644
index 0000000000000000000000000000000000000000..31a2352c3f8c28df87b510a1a46e32d0ed6c20b3
--- /dev/null
+++ b/civicrm/CRM/Core/CodeGen/GenerateData.php
@@ -0,0 +1,1995 @@
+<?php
+
+class CRM_Core_CodeGen_GenerateData {
+
+  /**
+   * Constants
+   */
+
+  // Set ADD_TO_DB = FALSE to do a dry run
+  const ADD_TO_DB = TRUE;
+
+  const DATA_FILENAME = "sample_data.xml";
+  const NUM_DOMAIN = 1;
+  const NUM_CONTACT = 200;
+  const INDIVIDUAL_PERCENT = 80;
+  const HOUSEHOLD_PERCENT = 10;
+  const ORGANIZATION_PERCENT = 10;
+  const NUM_INDIVIDUAL_PER_HOUSEHOLD = 4;
+  const NUM_ACTIVITY = 150;
+
+  // Location types from the table crm_location_type
+  const HOME = 1;
+  const WORK = 2;
+  const MAIN = 3;
+  const OTHER = 4;
+
+  /**
+   * Class constructor
+   *
+   * @param string|int $seed
+   *   Some scalar value used as the starting point for random-number generation.
+   * @param int $time
+   *   A timestamp; some facsimile of "now".
+   */
+  public function __construct($seed, $time) {
+    // initialize all the vars
+    $this->seed = $seed;
+    $this->time = $time;
+    $this->numIndividual = self::INDIVIDUAL_PERCENT * self::NUM_CONTACT / 100;
+    $this->numHousehold = self::HOUSEHOLD_PERCENT * self::NUM_CONTACT / 100;
+    $this->numOrganization = self::ORGANIZATION_PERCENT * self::NUM_CONTACT / 100;
+    $this->numStrictIndividual = $this->numIndividual - ($this->numHousehold * self::NUM_INDIVIDUAL_PER_HOUSEHOLD);
+
+    // Parse data file
+    foreach ((array) simplexml_load_file(self::getCivicrmDir() . '/sql/' . self::DATA_FILENAME) as $key => $val) {
+      $val = (array) $val;
+      $this->sampleData[$key] = (array) $val['item'];
+    }
+    // Init DB
+    $config = CRM_Core_Config::singleton();
+
+    // Relationship types indexed by name_a_b from the table civicrm_relationship_type
+    $this->relTypes = CRM_Utils_Array::index(array('name_a_b'), CRM_Core_PseudoConstant::relationshipType('name'));
+  }
+
+  /**
+   * Create a full, standard set of random data.
+   */
+  public function generateAll() {
+    $this->initID();
+    $this->generate('Domain');
+    $this->generate('Contact');
+    $this->generate('Individual');
+    $this->generate('Household');
+    $this->generate('Organization');
+    $this->generate('Relationship');
+    $this->generate('EntityTag');
+    $this->generate('Group');
+    $this->generate('Note');
+    $this->generate('Activity');
+    $this->generate('Event');
+    $this->generate('Contribution');
+    $this->generate('ContributionLineItem');
+    $this->generate('Membership');
+    $this->generate('MembershipPayment');
+    $this->generate('MembershipLog');
+    $this->generate('PCP');
+    $this->generate('SoftContribution');
+    $this->generate('Pledge');
+    $this->generate('PledgePayment');
+    $this->generate('Participant');
+    $this->generate('ParticipantPayment');
+    $this->generate('LineItemParticipants');
+    $this->generate('AccountingEntries');
+  }
+
+  /**
+   * Write a log message.
+   *
+   * @param string $message
+   */
+  public function write($message) {
+    echo $message;
+  }
+
+  /**
+   * Public wrapper for calling private "add" functions
+   * Provides user feedback
+   * @param $itemName
+   */
+  public function generate($itemName) {
+    $this->write("Generating $itemName\n");
+    $fn = "add$itemName";
+    $this->$fn();
+  }
+
+  /**
+   * this function creates arrays for the following
+   *
+   * domain id
+   * contact id
+   * contact_location id
+   * contact_contact_location id
+   * contact_email uuid
+   * contact_phone_uuid
+   * contact_instant_message uuid
+   * contact_relationship uuid
+   * contact_task uuid
+   * contact_note uuid
+   */
+  public function initID() {
+    // get the domain and contact id arrays
+    $this->domain = range(1, self::NUM_DOMAIN);
+    $this->domain = $this->shuffle($this->domain);
+
+    // Get first contact id
+    $this->startCid = $cid = CRM_Core_DAO::singleValueQuery("SELECT MAX(id) FROM civicrm_contact");
+    $this->contact = range($cid + 1, $cid + self::NUM_CONTACT);
+    $this->contact = $this->shuffle($this->contact);
+
+    // get the individual, household  and organizaton contacts
+    $offset = 0;
+    $this->Individual = array_slice($this->contact, $offset, $this->numIndividual);
+    $offset += $this->numIndividual;
+    $this->Household = array_slice($this->contact, $offset, $this->numHousehold);
+    $offset += $this->numHousehold;
+    $this->Organization = array_slice($this->contact, $offset, $this->numOrganization);
+
+    // get the strict individual contacts (i.e individual contacts not belonging to any household)
+    $this->strictIndividual = array_slice($this->Individual, 0, $this->numStrictIndividual);
+
+    // get the household to individual mapping array
+    $this->householdIndividual = array_slice($this->Individual, $this->numStrictIndividual);
+    $this->householdIndividual = array_chunk($this->householdIndividual, self::NUM_INDIVIDUAL_PER_HOUSEHOLD);
+    $this->householdIndividual = array_combine($this->Household, $this->householdIndividual);
+  }
+
+  /*
+   * private members
+   *
+   */
+
+  /**
+   * @var int
+   */
+  private $seed;
+
+  /**
+   * enum's from database
+   * @var array
+   */
+  private $preferredCommunicationMethod = array('1', '2', '3', '4', '5');
+  private $contactType = array('Individual', 'Household', 'Organization');
+  private $phoneType = array('1', '2', '3', '4');
+
+  /**
+   * customizable enums (foreign keys)
+   * @var array
+   */
+  private $prefix = array(
+    // Female
+    1 => array(
+      1 => 'Mrs.',
+      2 => 'Ms.',
+      4 => 'Dr.',
+    ),
+    // Male
+    2 => array(
+      3 => 'Mr.',
+      4 => 'Dr.',
+    ),
+  );
+  /**
+   * @var array
+   */
+  private $suffix = array(1 => 'Jr.', 2 => 'Sr.', 3 => 'II', 4 => 'III');
+  private $gender = array(1 => 'female', 2 => 'male');
+
+  /**
+   * store domain id's
+   * @var array
+   */
+  private $domain = array();
+
+  /**
+   * store contact id's
+   * @var array
+   */
+  private $contact = array();
+  private $Individual = array();
+  private $Household = array();
+  private $Organization = array();
+
+  // store which contacts have a location entity
+  /**
+   * for automatic management of is_primary field
+   * @var array
+   */
+  private $location = array(
+    'Email' => array(),
+    'Phone' => array(),
+    'Address' => array(),
+  );
+
+  /**
+   * stores the strict individual id and household id to individual id mapping
+   * @var array
+   */
+  private $strictIndividual = array();
+  private $householdIndividual = array();
+  private $householdName = array();
+
+  /**
+   * sample data in xml format
+   * @var array
+   */
+  private $sampleData = array();
+
+  /**
+   * private vars
+   * @var array
+   */
+  private $startCid;
+  private $numIndividual = 0;
+  private $numHousehold = 0;
+  private $numOrganization = 0;
+  private $numStrictIndividual = 0;
+  private $stateMap = array();
+  private $states = array();
+
+  private $groupMembershipStatus = array('Added', 'Removed', 'Pending');
+  private $subscriptionHistoryMethod = array('Admin', 'Email');
+  private $deceasedContactIds = array();
+
+  /*********************************
+   * private methods
+   * *******************************
+   */
+
+  /**
+   * Random number generator.
+   *
+   * All other random() functions should derive from this.
+   *
+   * This is very weak RNG. The goal is to provide a reproducible sequence of
+   * random-ish values for generating dummy-data.
+   *
+   * @param int $min
+   * @param int $max
+   * @return int
+   */
+  private function randomInt($min, $max) {
+    $range = min(1 + $max - $min, mt_getrandmax());
+    $this->seed = md5($this->seed . chr(0) . $min . chr(0) . $max);
+    return $min + (hexdec(substr($this->seed, 20, 8)) % $range);
+  }
+
+  /**
+   * Get a randomly generated string.
+   *
+   * @param int $size
+   *
+   * @return string
+   */
+  private function randomString($size = 32) {
+    $string = "";
+
+    // get an ascii code for each character
+    for ($i = 0; $i < $size; $i++) {
+      $random_int = $this->randomInt(65, 122);
+      if (($random_int < 97) && ($random_int > 90)) {
+        // if ascii code between 90 and 97 substitute with space
+        $random_int = 32;
+      }
+      $random_char = chr($random_int);
+      $string .= $random_char;
+    }
+    return $string;
+  }
+
+  /**
+   * @return string
+   */
+  private function randomChar() {
+    return chr($this->randomInt(65, 90));
+  }
+
+  /**
+   * Get a random item from the sample data or any other array
+   *
+   * @param $items (array or string) - if string, used as key for sample data, if array, used as data source
+   *
+   * @return mixed (element from array)
+   *
+   * @private
+   */
+  private function randomItem($items) {
+    if (!is_array($items)) {
+      $key = $items;
+      $items = $this->sampleData[$key];
+    }
+    if (!$items) {
+      $this->write("Error: no items found for '$key'\n");
+      return FALSE;
+    }
+    return $items[$this->randomInt(0, count($items) - 1)];
+  }
+
+  /**
+   * @param $items
+   *
+   * @return mixed
+   */
+  private function randomIndex($items) {
+    return $this->randomItem(array_keys($items));
+  }
+
+  /**
+   * @param $items
+   *
+   * @return array
+   */
+  private function randomKeyValue($items) {
+    $key = $this->randomIndex($items);
+    return array($key, $items[$key]);
+  }
+
+  private function shuffle($array) {
+    for ($i = count($array) - 1; $i >= 1; $i--) {
+      $j = $this->randomInt(0, $i);
+      $tmp = $array[$i];
+      $array[$i] = $array[$j];
+      $array[$j] = $tmp;
+    }
+    return $array;
+  }
+
+  /**
+   * @param $chance
+   *
+   * @return int
+   */
+  private function probability($chance) {
+    if ($this->randomInt(0, 100) < ($chance * 100)) {
+      return 1;
+    }
+    return 0;
+  }
+
+  /**
+   * Generate a random date.
+   *
+   *   If both $startDate and $endDate are defined generate
+   *   date between them.
+   *
+   *   If only startDate is specified then date generated is
+   *   between startDate + 1 year.
+   *
+   *   if only endDate is specified then date generated is
+   *   between endDate - 1 year.
+   *
+   *   if none are specified - date is between today - 1year
+   *   and today
+   *
+   * @param  int $startDate Start Date in Unix timestamp
+   * @param  int $endDate End Date in Unix timestamp
+   * @access private
+   *
+   * @return string randomly generated date in the format "Ymd"
+   *
+   */
+  private function randomDate($startDate = 0, $endDate = 0) {
+
+    // number of seconds per year
+    $numSecond = 31536000;
+    $dateFormat = "YmdHis";
+    $today = $this->time;
+
+    // both are defined
+    if ($startDate && $endDate) {
+      return date($dateFormat, $this->randomInt($startDate, $endDate));
+    }
+
+    // only startDate is defined
+    if ($startDate) {
+      return date($dateFormat, $this->randomInt($startDate, $startDate + $numSecond));
+    }
+
+    // only endDate is defined
+    if ($startDate) {
+      return date($dateFormat, $this->randomInt($endDate - $numSecond, $endDate));
+    }
+
+    // none are defined
+    return date($dateFormat, $this->randomInt($today - $numSecond, $today));
+  }
+
+  /**
+   * Automatically manage the is_primary field by tracking which contacts have each item
+   * @param $cid
+   * @param $type
+   * @return int
+   */
+  private function isPrimary($cid, $type) {
+    if (empty($this->location[$type][$cid])) {
+      $this->location[$type][$cid] = TRUE;
+      return 1;
+    }
+    return 0;
+  }
+
+  /**
+   * Execute a query unless we are doing a dry run
+   * Note: this wrapper should not be used for SELECT queries
+   * @param $query
+   * @param array $params
+   * @return \CRM_Core_DAO
+   */
+  private function _query($query, $params = array()) {
+    if (self::ADD_TO_DB) {
+      return CRM_Core_DAO::executeQuery($query, $params);
+    }
+  }
+
+  /**
+   * Call dao insert method unless we are doing a dry run
+   * @param $dao
+   */
+  private function _insert(&$dao) {
+    if (self::ADD_TO_DB) {
+      $dao->insert();
+    }
+  }
+
+  /**
+   * Call dao update method unless we are doing a dry run
+   * @param $dao
+   */
+  private function _update(&$dao) {
+    if (self::ADD_TO_DB) {
+      $dao->update();
+    }
+  }
+
+  /**
+   * Add core DAO object
+   * @param $type
+   * @param $params
+   */
+  private function _addDAO($type, $params) {
+    $daoName = "CRM_Core_DAO_$type";
+    $obj = new $daoName();
+    foreach ($params as $key => $value) {
+      $obj->$key = $value;
+    }
+    if (isset($this->location[$type])) {
+      $obj->is_primary = $this->isPrimary($params['contact_id'], $type);
+    }
+    $this->_insert($obj);
+  }
+
+  /**
+   * Fetch contact type based on stored mapping
+   * @param $id
+   * @return string $type
+   */
+  private function getContactType($id) {
+    foreach (array('Individual', 'Household', 'Organization') as $type) {
+      if (in_array($id, $this->$type)) {
+        return $type;
+      }
+    }
+  }
+
+  /**
+   * This method adds NUM_DOMAIN domains and then adds NUM_REVISION
+   * revisions for each domain with the latest revision being the last one..
+   */
+  private function addDomain() {
+
+    /* Add a location for domain 1 */
+
+    $domain = new CRM_Core_DAO_Domain();
+    for ($id = 2; $id <= self::NUM_DOMAIN; $id++) {
+      // domain name is pretty simple. it is "Domain $id"
+      $domain->name = "Domain $id";
+      $domain->description = "Description $id";
+      $domain->contact_name = $this->randomName();
+
+      // insert domain
+      $this->_insert($domain);
+    }
+  }
+
+  /**
+   * @return string
+   */
+  public function randomName() {
+    $first_name = $this->randomItem(($this->probability(.5) ? 'fe' : '') . 'male_name');
+    $middle_name = ucfirst($this->randomChar());
+    $last_name = $this->randomItem('last_name');
+    return "$first_name $middle_name. $last_name";
+  }
+
+  /**
+   * This method adds data to the contact table
+   *
+   * id - from $contact
+   * contact_type 'Individual' 'Household' 'Organization'
+   * preferred_communication (random 1 to 3)
+   */
+  private function addContact() {
+    $contact = new CRM_Contact_DAO_Contact();
+    $cid = $this->startCid;
+
+    for ($id = $cid + 1; $id <= $cid + self::NUM_CONTACT; $id++) {
+      $contact->contact_type = $this->getContactType($id);
+      $contact->do_not_phone = $this->probability(.2);
+      $contact->do_not_email = $this->probability(.2);
+      $contact->do_not_post = $this->probability(.2);
+      $contact->do_not_trade = $this->probability(.2);
+      $contact->preferred_communication_method = NULL;
+      if ($this->probability(.5)) {
+        $contact->preferred_communication_method = CRM_Core_DAO::VALUE_SEPARATOR . $this->randomItem($this->preferredCommunicationMethod) . CRM_Core_DAO::VALUE_SEPARATOR;
+      }
+      $contact->source = 'Sample Data';
+      $this->_insert($contact);
+    }
+  }
+
+  /**
+   * addIndividual()
+   *
+   * This method adds individual's data to the contact table
+   *
+   * The following fields are generated and added.
+   *
+   * contact_uuid - individual
+   * contact_rid - latest one
+   * first_name 'First Name $contact_uuid'
+   * middle_name 'Middle Name $contact_uuid'
+   * last_name 'Last Name $contact_uuid'
+   * job_title 'Job Title $contact_uuid'
+   *
+   */
+  private function addIndividual() {
+
+    $contact = new CRM_Contact_DAO_Contact();
+    $year = 60 * 60 * 24 * 365.25;
+    $now = $this->time;
+
+    foreach ($this->Individual as $cid) {
+      $contact->is_deceased = $contact->gender_id = $contact->birth_date = $contact->deceased_date = $email = NULL;
+      list($gender_id, $gender) = $this->randomKeyValue($this->gender);
+      $birth_date = $this->randomInt($now - 90 * $year, $now - 10 * $year);
+
+      $contact->last_name = $this->randomItem('last_name');
+
+      // Manage household names
+      if (!in_array($contact->id, $this->strictIndividual)) {
+        // Find position in household
+        foreach ($this->householdIndividual as $householdId => $house) {
+          foreach ($house as $position => $memberId) {
+            if ($memberId == $cid) {
+              break 2;
+            }
+          }
+        }
+        // Head of household: set name
+        if (empty($this->householdName[$householdId])) {
+          $this->householdName[$householdId] = $contact->last_name;
+        }
+        // Kids get household name, spouse might get it
+        if ($position > 1 || $this->probability(.5)) {
+          $contact->last_name = $this->householdName[$householdId];
+        }
+        elseif ($this->householdName[$householdId] != $contact->last_name) {
+          // Spouse might hyphenate name
+          if ($this->probability(.5)) {
+            $contact->last_name .= '-' . $this->householdName[$householdId];
+          }
+          // Kids might hyphenate name
+          else {
+            $this->householdName[$householdId] .= '-' . $contact->last_name;
+          }
+        }
+        // Sensible ages and genders
+        $offset = $this->randomInt($now - 40 * $year, $now);
+        // Parents
+        if ($position < 2) {
+          $birth_date = $this->randomInt($offset - 35 * $year, $offset - 20 * $year);
+          if ($this->probability(.8)) {
+            $gender_id = 2 - $position;
+            $gender = $this->gender[$gender_id];
+          }
+        }
+        // Kids
+        else {
+          $birth_date = $this->randomInt($offset - 10 * $year, $offset);
+        }
+      }
+      // Non household people
+      else {
+        if ($this->probability(.6)) {
+          $this->_addAddress($cid);
+        }
+      }
+
+      $contact->first_name = $this->randomItem($gender . '_name');
+      $contact->middle_name = $this->probability(.5) ? '' : ucfirst($this->randomChar());
+      $age = intval(($now - $birth_date) / $year);
+
+      // Prefix and suffix by gender and age
+      $contact->prefix_id = $contact->suffix_id = $prefix = $suffix = NULL;
+      if ($this->probability(.5) && $age > 20) {
+        list($contact->prefix_id, $prefix) = $this->randomKeyValue($this->prefix[$gender_id]);
+        $prefix .= ' ';
+      }
+      if ($gender == 'male' && $this->probability(.50)) {
+        list($contact->suffix_id, $suffix) = $this->randomKeyValue($this->suffix);
+        $suffix = ' ' . $suffix;
+      }
+      if ($this->probability(.7)) {
+        $contact->gender_id = $gender_id;
+      }
+      if ($this->probability(.7)) {
+        $contact->birth_date = date("Ymd", $birth_date);
+      }
+
+      // Deceased probability based on age
+      if ($contact->gender_id && $contact->gender_id == 2) {
+        $checkAge = 64;
+      }
+      else {
+        $checkAge = 68;
+      }
+      if ($age > $checkAge && count($this->deceasedContactIds) < 4) {
+        $contact->is_deceased = $this->probability(($age - 30) / 100);
+        if ($contact->is_deceased && $this->probability(.7)) {
+          $contact->deceased_date = $this->randomDate();
+        }
+      }
+
+      // Add 0, 1 or 2 email address
+      $count = $this->randomInt(0, 2);
+      for ($i = 0; $i < $count; ++$i) {
+        $email = $this->_individualEmail($contact);
+        $this->_addEmail($cid, $email, self::HOME);
+      }
+
+      // Add 0, 1 or 2 phones
+      $count = $this->randomInt(0, 2);
+      for ($i = 0; $i < $count; ++$i) {
+        $this->_addPhone($cid);
+      }
+
+      // Occasionally you get contacts with just an email in the db
+      if ($this->probability(.2) && $email) {
+        $contact->first_name = $contact->last_name = $contact->middle_name = NULL;
+        $contact->is_deceased = $contact->gender_id = $contact->birth_date = $contact->deceased_date = NULL;
+        $contact->display_name = $contact->sort_name = $email;
+        $contact->postal_greeting_display = $contact->email_greeting_display = "Dear $email";
+      }
+      else {
+        $contact->display_name = $prefix . $contact->first_name . ' ' . $contact->last_name . $suffix;
+        $contact->sort_name = $contact->last_name . ', ' . $contact->first_name;
+        $contact->postal_greeting_display = $contact->email_greeting_display = 'Dear ' . $contact->first_name;
+      }
+      $contact->addressee_id = $contact->postal_greeting_id = $contact->email_greeting_id = 1;
+      $contact->addressee_display = $contact->display_name;
+      $contact->hash = crc32($contact->sort_name);
+      $contact->id = $cid;
+      $this->_update($contact);
+      if ($contact->is_deceased) {
+        $this->deceasedContactIds[] = $cid;
+      }
+    }
+  }
+
+  /**
+   * This method adds household's data to the contact table
+   *
+   * The following fields are generated and added.
+   *
+   * contact_uuid - household_individual
+   * contact_rid - latest one
+   * household_name 'household $contact_uuid primary contact $primary_contact_uuid'
+   * nick_name 'nick $contact_uuid'
+   * primary_contact_uuid = $household_individual[$contact_uuid][0];
+   *
+   */
+  private function addHousehold() {
+
+    $contact = new CRM_Contact_DAO_Contact();
+    foreach ($this->Household as $cid) {
+      // Add address
+      $this->_addAddress($cid);
+
+      $contact->id = $cid;
+      $contact->household_name = $this->householdName[$cid] . " family";
+      // need to update the sort name for the main contact table
+      $contact->display_name = $contact->sort_name = $contact->household_name;
+      $contact->postal_greeting_id = $contact->email_greeting_id = 5;
+      $contact->postal_greeting_display = $contact->email_greeting_display = 'Dear ' . $contact->household_name;
+      $contact->addressee_id = 2;
+      $contact->addressee_display = $contact->display_name;
+      $contact->hash = crc32($contact->sort_name);
+      $this->_update($contact);
+    }
+  }
+
+  /**
+   * This method adds organization data to the contact table
+   *
+   * The following fields are generated and added.
+   *
+   * contact_uuid - organization
+   * contact_rid - latest one
+   * organization_name 'organization $contact_uuid'
+   * legal_name 'legal  $contact_uuid'
+   * nick_name 'nick $contact_uuid'
+   * sic_code 'sic $contact_uuid'
+   * primary_contact_id - random individual contact uuid
+   *
+   */
+  private function addOrganization() {
+
+    $org = new CRM_Contact_DAO_Contact();
+    $employees = $this->Individual;
+    $employees = $this->shuffle($employees);
+
+    foreach ($this->Organization as $key => $id) {
+      $org->primary_contact_id = $website = $email = NULL;
+      $org->id = $id;
+      $address = $this->_addAddress($id);
+
+      $namePre = $this->randomItem('organization_prefix');
+      $nameMid = $this->randomItem('organization_name');
+      $namePost = $this->randomItem('organization_suffix');
+
+      // Some orgs are named after their location
+      if ($this->probability(.7)) {
+        $place = $this->randomItem(array('city', 'street_name', 'state'));
+        $namePre = $address[$place];
+      }
+      $org->organization_name = "$namePre $nameMid $namePost";
+
+      // Most orgs have a website and email
+      if ($this->probability(.8)) {
+        $website = $this->_addWebsite($id, $org->organization_name);
+        $url = str_replace('http://', '', $website['url']);
+        $email = $this->randomItem('email_address') . '@' . $url;
+        $this->_addEmail($id, $email, self::MAIN);
+      }
+
+      // current employee
+      if ($this->probability(.8)) {
+        $indiv = new CRM_Contact_DAO_Contact();
+        $org->primary_contact_id = $indiv->id = $employees[$key];
+        $indiv->organization_name = $org->organization_name;
+        $indiv->employer_id = $id;
+        $this->_update($indiv);
+        // Share address with employee
+        if ($this->probability(.8)) {
+          $this->_addAddress($indiv->id, $id);
+        }
+        // Add work email for employee
+        if ($website) {
+          $indiv->find(TRUE);
+          $email = $this->_individualEmail($indiv, $url);
+          $this->_addEmail($indiv->id, $email, self::WORK);
+        }
+      }
+
+      // need to update the sort name for the main contact table
+      $org->display_name = $org->sort_name = $org->organization_name;
+      $org->addressee_id = 3;
+      $org->addressee_display = $org->display_name;
+      $org->hash = crc32($org->sort_name);
+      $this->_update($org);
+    }
+  }
+
+  /**
+   * This method adds data to the contact_relationship table
+   */
+  private function addRelationship() {
+
+    $relationship = new CRM_Contact_DAO_Relationship();
+
+    // Household relationships
+    foreach ($this->householdIndividual as $household_id => $household_member) {
+      // Default active
+      $relationship->is_active = 1;
+
+      // add child_of relationship for each child
+      $relationship->relationship_type_id = $this->relTypes['Child of']['id'];
+      foreach (array(0, 1) as $parent) {
+        foreach (array(2, 3) as $child) {
+          $relationship->contact_id_a = $household_member[$child];
+          $relationship->contact_id_b = $household_member[$parent];
+          $this->_insert($relationship);
+        }
+      }
+
+      // add sibling_of relationship
+      $relationship->relationship_type_id = $this->relTypes['Sibling of']['id'];
+      $relationship->contact_id_a = $household_member[3];
+      $relationship->contact_id_b = $household_member[2];
+      $this->_insert($relationship);
+
+      // add member_of_household relationships and shared address
+      $relationship->relationship_type_id = $this->relTypes['Household Member of']['id'];
+      $relationship->contact_id_b = $household_id;
+      for ($i = 1; $i < 4; ++$i) {
+        $relationship->contact_id_a = $household_member[$i];
+        $this->_insert($relationship);
+        $this->_addAddress($household_member[$i], $household_id);
+      }
+
+      // Divorced/separated couples - end relationship and different address
+      if ($this->probability(.4)) {
+        $relationship->is_active = 0;
+        $this->_addAddress($household_member[0]);
+      }
+      else {
+        $this->_addAddress($household_member[0], $household_id);
+      }
+
+      // add head_of_household relationship 1 for head of house
+      $relationship->relationship_type_id = $this->relTypes['Head of Household for']['id'];
+      $relationship->contact_id_a = $household_member[0];
+      $relationship->contact_id_b = $household_id;
+      $this->_insert($relationship);
+
+      // add spouse_of relationship 1 for both the spouses
+      $relationship->relationship_type_id = $this->relTypes['Spouse of']['id'];
+      $relationship->contact_id_a = $household_member[1];
+      $relationship->contact_id_b = $household_member[0];
+      $this->_insert($relationship);
+    }
+
+    // Add current employer relationships
+    $this->_query("INSERT INTO civicrm_relationship
+      (contact_id_a, contact_id_b, relationship_type_id, is_active)
+      (SELECT id, employer_id, " . $this->relTypes['Employee of']['id'] . ", 1 FROM civicrm_contact WHERE employer_id IN (" . implode(',', $this->Organization) . "))"
+    );
+  }
+
+  /**
+   * Create an address for a contact
+   *
+   * @param $cid int: contact id
+   * @param $masterContactId int: set if this is a shared address
+   *
+   * @return array
+   */
+  private function _addAddress($cid, $masterContactId = NULL) {
+
+    // Share existing address
+    if ($masterContactId) {
+      $dao = new CRM_Core_DAO_Address();
+      $dao->is_primary = 1;
+      $dao->contact_id = $masterContactId;
+      $dao->find(TRUE);
+      $dao->master_id = $dao->id;
+      $dao->id = NULL;
+      $dao->contact_id = $cid;
+      $dao->is_primary = $this->isPrimary($cid, 'Address');
+      $dao->location_type_id = $this->getContactType($masterContactId) == 'Organization' ? self::WORK : self::HOME;
+      $this->_insert($dao);
+    }
+
+    // Generate new address
+    else {
+      $params = array(
+        'contact_id' => $cid,
+        'location_type_id' => $this->getContactType($cid) == 'Organization' ? self::MAIN : self::HOME,
+        'street_number' => $this->randomInt(1, 1000),
+        'street_number_suffix' => ucfirst($this->randomChar()),
+        'street_name' => $this->randomItem('street_name'),
+        'street_type' => $this->randomItem('street_type'),
+        'street_number_postdirectional' => $this->randomItem('address_direction'),
+        'county_id' => 1,
+      );
+
+      $params['street_address'] = $params['street_number'] . $params['street_number_suffix'] . " " . $params['street_name'] . " " . $params['street_type'] . " " . $params['street_number_postdirectional'];
+
+      if ($params['location_type_id'] == self::MAIN) {
+        $params['supplemental_address_1'] = $this->randomItem('supplemental_addresses_1');
+      }
+
+      // Hack to add lat/long (limited to USA based addresses)
+      list(
+        $params['country_id'],
+        $params['state_province_id'],
+        $params['city'],
+        $params['postal_code'],
+        $params['geo_code_1'],
+        $params['geo_code_2'],
+        ) = $this->getZipCodeInfo();
+
+      $this->_addDAO('Address', $params);
+      $params['state'] = $this->states[$params['state_province_id']];
+      return $params;
+    }
+  }
+
+  /**
+   * Add a phone number for a contact
+   *
+   * @param $cid int: contact id
+   *
+   * @return array
+   */
+  private function _addPhone($cid) {
+    $area = $this->probability(.5) ? '' : $this->randomInt(201, 899);
+    $pre = $this->randomInt(201, 899);
+    $post = $this->randomInt(1000, 9999);
+    $params = array(
+      'location_type_id' => $this->getContactType($cid) == 'Organization' ? self::MAIN : self::HOME,
+      'contact_id' => $cid,
+      'phone' => ($area ? "($area) " : '') . "$pre-$post",
+      'phone_numeric' => $area . $pre . $post,
+      'phone_type_id' => $this->randomInt(1, 2),
+    );
+    $this->_addDAO('Phone', $params);
+    return $params;
+  }
+
+  /**
+   * Add an email for a contact
+   *
+   * @param $cid int: contact id
+   * @param $email
+   * @param $locationType
+   *
+   * @return array
+   */
+  private function _addEmail($cid, $email, $locationType) {
+    $params = array(
+      'location_type_id' => $locationType,
+      'contact_id' => $cid,
+      'email' => $email,
+    );
+    $this->_addDAO('Email', $params);
+    return $params;
+  }
+
+  /**
+   * Add a website based on organization name
+   * Using common naming patterns
+   *
+   * @param $cid int: contact id
+   * @param $name str: contact name
+   *
+   * @return array
+   */
+  private function _addWebsite($cid, $name) {
+    $part = array_pad(explode(' ', strtolower($name)), 3, '');
+    if (count($part) > 3) {
+      // Abbreviate the place name if it's two words
+      $domain = $part[0][0] . $part[1][0] . $part[2] . $part[3];
+    }
+    else {
+      // Common naming patterns
+      switch ($this->randomInt(1, 3)) {
+        case 1:
+          $domain = $part[0] . $part[1] . $part[2];
+          break;
+
+        case 2:
+          $domain = $part[0] . $part[1];
+          break;
+
+        case 3:
+          $domain = $part[0] . $part[2];
+          break;
+      }
+    }
+    $params = array(
+      'website_type_id' => 1,
+      'location_type_id' => self::MAIN,
+      'contact_id' => $cid,
+      'url' => "http://$domain.org",
+    );
+    $this->_addDAO('Website', $params);
+    return $params;
+  }
+
+  /**
+   * Create an email address based on a person's name
+   * Using common naming patterns
+   *
+   * @param $contact obj: individual contact record
+   * @param $domain str: supply a domain (i.e. for a work address)
+   *
+   * @return string
+   */
+  private function _individualEmail($contact, $domain = NULL) {
+    $first = $contact->first_name;
+    $last = $contact->last_name;
+    $f = $first[0];
+    $l = $last[0];
+    $m = $contact->middle_name ? $contact->middle_name[0] . '.' : '';
+    // Common naming patterns
+    switch ($this->randomInt(1, 6)) {
+      case 1:
+        $email = $first . $last;
+        break;
+
+      case 2:
+        $email = "$last.$first";
+        break;
+
+      case 3:
+        $email = $last . $f;
+        break;
+
+      case 4:
+        $email = $first . $l;
+        break;
+
+      case 5:
+        $email = "$last.$m$first";
+        break;
+
+      case 6:
+        $email = "$f$m$last";
+        break;
+    }
+    //to ensure we dont insert
+    //invalid characters in email
+    $email = preg_replace("([^a-zA-Z0-9_\.-]*)", "", $email);
+
+    // Some people have numbers in their address
+    if ($this->probability(.4)) {
+      $email .= $this->randomInt(1, 99);
+    }
+    // Generate random domain if not specified
+    if (!$domain) {
+      $domain = $this->randomItem('email_domain') . '.' . $this->randomItem('email_tld');
+    }
+    return strtolower($email) . '@' . $domain;
+  }
+
+  /**
+   * This method populates the civicrm_entity_tag table
+   */
+  private function addEntityTag() {
+
+    $entity_tag = new CRM_Core_DAO_EntityTag();
+
+    // add categories 1,2,3 for Organizations.
+    for ($i = 0; $i < $this->numOrganization; $i += 2) {
+      $org_id = $this->Organization[$i];
+      // echo "org_id = $org_id\n";
+      $entity_tag->entity_id = $this->Organization[$i];
+      $entity_tag->entity_table = 'civicrm_contact';
+      $entity_tag->tag_id = $this->randomInt(1, 3);
+      $this->_insert($entity_tag);
+    }
+
+    // add categories 4,5 for Individuals.
+    for ($i = 0; $i < $this->numIndividual; $i += 2) {
+      $entity_tag->entity_table = 'civicrm_contact';
+      $entity_tag->entity_id = $this->Individual[$i];
+      if (($entity_tag->entity_id) % 3) {
+        $entity_tag->tag_id = $this->randomInt(4, 5);
+        $this->_insert($entity_tag);
+      }
+      else {
+        // some of the individuals are in both categories (4 and 5).
+        $entity_tag->tag_id = 4;
+        $this->_insert($entity_tag);
+        $entity_tag->tag_id = 5;
+        $this->_insert($entity_tag);
+      }
+    }
+  }
+
+  /**
+   * This method populates the civicrm_group_contact table
+   */
+  private function addGroup() {
+    // add the 3 groups first
+    foreach ($this->sampleData['group'] as $groupName) {
+      $group = new CRM_Contact_BAO_Group();
+      $group->name = $group->title = $groupName;
+      $group->group_type = "12";
+      $group->visibility = 'Public Pages';
+      $group->is_active = 1;
+      $group->save();
+    }
+
+    // 60 are for newsletter
+    for ($i = 0; $i < 60; $i++) {
+      $groupContact = new CRM_Contact_DAO_GroupContact();
+      // newsletter subscribers
+      $groupContact->group_id = 2;
+      $groupContact->contact_id = $this->Individual[$i];
+      // always add members
+      $groupContact->status = 'Added';
+
+      $subscriptionHistory = new CRM_Contact_DAO_SubscriptionHistory();
+      $subscriptionHistory->contact_id = $groupContact->contact_id;
+
+      $subscriptionHistory->group_id = $groupContact->group_id;
+      $subscriptionHistory->status = $groupContact->status;
+      // method
+      $subscriptionHistory->method = $this->randomItem($this->subscriptionHistoryMethod);
+      $subscriptionHistory->date = $this->randomDate();
+      if ($groupContact->status != 'Pending') {
+        $this->_insert($groupContact);
+      }
+      $this->_insert($subscriptionHistory);
+    }
+
+    // 15 volunteers
+    for ($i = 0; $i < 15; $i++) {
+      $groupContact = new CRM_Contact_DAO_GroupContact();
+      // Volunteers
+      $groupContact->group_id = 3;
+      $groupContact->contact_id = $this->Individual[$i + 60];
+      // membership status
+      $groupContact->status = 'Added';
+
+      $subscriptionHistory = new CRM_Contact_DAO_SubscriptionHistory();
+      $subscriptionHistory->contact_id = $groupContact->contact_id;
+      $subscriptionHistory->group_id = $groupContact->group_id;
+      $subscriptionHistory->status = $groupContact->status;
+      // method
+      $subscriptionHistory->method = $this->randomItem($this->subscriptionHistoryMethod);
+      $subscriptionHistory->date = $this->randomDate();
+
+      if ($groupContact->status != 'Pending') {
+        $this->_insert($groupContact);
+      }
+      $this->_insert($subscriptionHistory);
+    }
+
+    // 8 advisory board group
+    for ($i = 0; $i < 8; $i++) {
+      $groupContact = new CRM_Contact_DAO_GroupContact();
+      // advisory board group
+      $groupContact->group_id = 4;
+      $groupContact->contact_id = $this->Individual[$i * 7];
+      // membership status
+      $groupContact->status = 'Added';
+
+      $subscriptionHistory = new CRM_Contact_DAO_SubscriptionHistory();
+      $subscriptionHistory->contact_id = $groupContact->contact_id;
+      $subscriptionHistory->group_id = $groupContact->group_id;
+      $subscriptionHistory->status = $groupContact->status;
+      // method
+      $subscriptionHistory->method = $this->randomItem($this->subscriptionHistoryMethod);
+      $subscriptionHistory->date = $this->randomDate();
+
+      if ($groupContact->status != 'Pending') {
+        $this->_insert($groupContact);
+      }
+      $this->_insert($subscriptionHistory);
+    }
+
+    //In this function when we add groups that time we are cache the contact fields
+    //But at the end of setup we are appending sample custom data, so for consistency
+    //reset the cache.
+    Civi::cache('fields')->flush();
+    CRM_Core_BAO_Cache::resetCaches();
+  }
+
+  /**
+   * This method populates the civicrm_note table
+   */
+  private function addNote() {
+    $params = array(
+      'entity_table' => 'civicrm_contact',
+      'contact_id' => 1,
+      'privacy' => 0,
+    );
+    for ($i = 0; $i < self::NUM_CONTACT; $i += 10) {
+      $params['entity_id'] = $this->randomItem($this->contact);
+      $params['note'] = $this->randomItem('note');
+      $params['modified_date'] = $this->randomDate();
+      $this->_addDAO('Note', $params);
+    }
+  }
+
+  /**
+   * This method populates the civicrm_activity_history table
+   */
+  private function addActivity() {
+    $contactDAO = new CRM_Contact_DAO_Contact();
+    $contactDAO->contact_type = 'Individual';
+    $contactDAO->selectAdd();
+    $contactDAO->selectAdd('id');
+    $contactDAO->orderBy('sort_name');
+    $contactDAO->find();
+
+    $count = 0;
+    $activityContacts = CRM_Activity_BAO_ActivityContact::buildOptions('record_type_id', 'validate');
+    while ($contactDAO->fetch()) {
+      if ($count++ > 2) {
+        break;
+      }
+      for ($i = 0; $i < self::NUM_ACTIVITY; $i++) {
+        $activityDAO = new CRM_Activity_DAO_Activity();
+        $activityId = CRM_Core_OptionGroup::values('activity_type', NULL, NULL, NULL, ' AND v.name IN ("Tell A Friend", "Pledge Acknowledgment")');
+        $activityTypeID = $this->randomIndex($activityId);
+        $activity = CRM_Core_PseudoConstant::activityType();
+        $activityDAO->activity_type_id = $activityTypeID;
+        $activityDAO->subject = "Subject for $activity[$activityTypeID]";
+        $activityDAO->activity_date_time = $this->randomDate();
+        $activityDAO->status_id = 2;
+        $this->_insert($activityDAO);
+
+        $activityContactDAO = new CRM_Activity_DAO_ActivityContact();
+        $activityContactDAO->activity_id = $activityDAO->id;
+        $activityContactDAO->contact_id = $contactDAO->id;
+        $activityContactDAO->record_type_id = CRM_Utils_Array::key('Activity Source', $activityContacts);
+        $this->_insert($activityContactDAO);
+
+        if ($activityTypeID == 9) {
+          $activityContactDAO = new CRM_Activity_DAO_ActivityContact();
+          $activityContactDAO->activity_id = $activityDAO->id;
+          $activityContactDAO->contact_id = $this->randomInt(1, 101);
+          $activityContactDAO->record_type_id = CRM_Utils_Array::key('Activity Targets', $activityContacts);
+          $this->_insert($activityContactDAO);
+        }
+      }
+    }
+  }
+
+  /**
+   * @return array
+   */
+  public function getZipCodeInfo() {
+
+    if (!$this->stateMap) {
+      $query = 'SELECT id, name, abbreviation from civicrm_state_province where country_id = 1228';
+      $dao = new CRM_Core_DAO();
+      $dao->query($query);
+      $this->stateMap = array();
+      while ($dao->fetch()) {
+        $this->stateMap[$dao->abbreviation] = $dao->id;
+        $this->states[$dao->id] = $dao->name;
+      }
+    }
+
+    static $zipCodes = NULL;
+    if ($zipCodes === NULL) {
+      $zipCodes = json_decode(file_get_contents(self::getCivicrmDir() . '/sql/zipcodes.json'));
+    }
+
+    $zipCode = $zipCodes[$this->randomInt(0, count($zipCodes))];
+
+    if ($this->stateMap[$zipCode->state]) {
+      $stateID = $this->stateMap[$zipCode->state];
+    }
+    else {
+      $stateID = 1004;
+    }
+
+    $zip = str_pad($zipCode->zip, 5, '0', STR_PAD_LEFT);
+    return array(1228, $stateID, $zipCode->city, $zip, $zipCode->latitude, $zipCode->longitude);
+  }
+
+  /**
+   * @param $zipCode
+   *
+   * @return array
+   */
+  public static function getLatLong($zipCode) {
+    $query = "http://maps.google.com/maps?q=$zipCode&output=js";
+    $userAgent = "Mozilla/5.0 (Macintosh; U; PPC Mac OS X Mach-O; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0";
+
+    $ch = curl_init();
+    curl_setopt($ch, CURLOPT_URL, $query);
+    curl_setopt($ch, CURLOPT_HEADER, FALSE);
+    curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
+    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+
+    // grab URL and pass it to the browser
+    $outstr = curl_exec($ch);
+
+    // close CURL resource, and free up system resources
+    curl_close($ch);
+
+    $preg = "/'(<\?xml.+?)',/s";
+    preg_match($preg, $outstr, $matches);
+    if ($matches[1]) {
+      $xml = simplexml_load_string($matches[1]);
+      $attributes = $xml->center->attributes();
+      if (!empty($attributes)) {
+        return array((float ) $attributes['lat'], (float ) $attributes['lng']);
+      }
+    }
+    return array(NULL, NULL);
+  }
+
+  private function addMembershipType() {
+    $organizationDAO = new CRM_Contact_DAO_Contact();
+    $organizationDAO->id = 5;
+    $organizationDAO->find(TRUE);
+    $contact_id = $organizationDAO->contact_id;
+
+    $membershipType = "INSERT INTO civicrm_membership_type
+        (name, description, member_of_contact_id, financial_type_id, minimum_fee, duration_unit, duration_interval, period_type, fixed_period_start_day, fixed_period_rollover_day, relationship_type_id, relationship_direction, visibility, weight, is_active)
+        VALUES
+        ('General', 'Regular annual membership.', " . $contact_id . ", 2, 100, 'year', 1, 'rolling',null, null, 7, 'b_a', 'Public', 1, 1),
+        ('Student', 'Discount membership for full-time students.', " . $contact_id . ", 2, 50, 'year', 1, 'rolling', null, null, 7, 'b_a', 'Public', 2, 1),
+        ('Lifetime', 'Lifetime membership.', " . $contact_id . ", 2, 1200, 'lifetime', 1, 'rolling', null, null, 7, 'b_a', 'Admin', 3, 1);
+        ";
+    $this->_query($membershipType);
+  }
+
+  private function addMembership() {
+    $contact = new CRM_Contact_DAO_Contact();
+    $contact->query("SELECT id FROM civicrm_contact where contact_type = 'Individual'");
+    $activityContacts = CRM_Activity_BAO_ActivityContact::buildOptions('record_type_id', 'validate');
+    while ($contact->fetch()) {
+      $contacts[] = $contact->id;
+    }
+    $contacts = $this->shuffle($contacts);
+
+    $randomContacts = array_slice($contacts, 20, 30);
+
+    $sources = array('Payment', 'Donation', 'Check');
+    $membershipTypes = array(1, 2);
+    $membershipTypeNames = array('General', 'Student');
+    $statuses = array(3, 4);
+
+    $membership = "
+INSERT INTO civicrm_membership
+        (contact_id, membership_type_id, join_date, start_date, end_date, source, status_id)
+VALUES
+";
+
+    $activity = "
+INSERT INTO civicrm_activity
+        (source_record_id, activity_type_id, subject, activity_date_time, duration, location, phone_id, phone_number, details, priority_id,parent_id, is_test, status_id)
+VALUES
+";
+
+    $activityContact = "
+INSERT INTO civicrm_activity_contact
+  (activity_id, contact_id, record_type_id)
+VALUES
+";
+
+    $currentActivityID = CRM_Core_DAO::singleValueQuery("SELECT MAX(id) FROM civicrm_activity");
+    $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+    foreach ($randomContacts as $count => $dontCare) {
+      $source = $this->randomItem($sources);
+      $activitySourceId = $count + 1;
+      $currentActivityID++;
+      $activityContact .= "( $currentActivityID, {$randomContacts[$count]}, {$sourceID} )";
+      if ((($count + 1) % 11 == 0)) {
+        // lifetime membership, status can be anything
+        $startDate = date('Y-m-d', mktime(0, 0, 0, date('m'), (date('d') - $count), date('Y')));
+        $membership .= "( {$randomContacts[$count]}, 3, '{$startDate}', '{$startDate}', null, '{$source}', 1)";
+        $activity .= "( {$activitySourceId}, 7, 'Lifetime', '{$startDate} 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 )";
+      }
+      elseif (($count + 1) % 5 == 0) {
+        // Grace or expired, memberhsip type is random of 1 & 2
+        $randIndex = $this->randomIndex($membershipTypes);
+        $membershipTypeId = $membershipTypes[$randIndex];
+        $membershipStatusId = $statuses[$randIndex];
+        $membershipTypeName = $membershipTypeNames[$randIndex];
+        $YearFactor = $membershipTypeId * 2;
+        //reverse the type and consider as year factor.
+        if ($YearFactor != 2) {
+          $YearFactor = 1;
+        }
+        $dateFactor = ($count * ($YearFactor) * ($YearFactor) * ($YearFactor));
+        $startDate = date('Y-m-d', mktime(0, 0, 0,
+          date('m'),
+          (date('d') - ($dateFactor)),
+          (date('Y') - ($YearFactor))
+        ));
+        $partOfDate = explode('-', $startDate);
+        $endDate = date('Y-m-d', mktime(0, 0, 0,
+          $partOfDate[1],
+          ($partOfDate[2] - 1),
+          ($partOfDate[0] + ($YearFactor))
+        ));
+
+        $membership .= "( {$randomContacts[$count]}, {$membershipTypeId}, '{$startDate}', '{$startDate}', '{$endDate}', '{$source}', {$membershipStatusId})";
+        $activity .= "( {$activitySourceId}, 7, '{$membershipTypeName}', '{$startDate} 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 )";
+      }
+      elseif (($count + 1) % 2 == 0) {
+        // membership type 2
+        $startDate = date('Y-m-d', mktime(0, 0, 0, date('m'), (date('d') - $count), date('Y')));
+        $endDate = date('Y-m-d', mktime(0, 0, 0, date('m'), (date('d') - ($count + 1)), (date('Y') + 1)));
+        $membership .= "( {$randomContacts[$count]}, 2, '{$startDate}', '{$startDate}', '{$endDate}', '{$source}', 1)";
+        $activity .= "( {$activitySourceId}, 7, 'Student', '{$startDate} 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 )";
+      }
+      else {
+        // membership type 1
+        $startDate = date('Y-m-d', mktime(0, 0, 0, date('m'), (date('d') - $count), date('Y')));
+        $endDate = date('Y-m-d', mktime(0, 0, 0, date('m'), (date('d') - ($count + 1)), (date('Y') + 2)));
+        $membership .= "( {$randomContacts[$count]}, 1, '{$startDate}', '{$startDate}', '{$endDate}', '{$source}', 1)";
+        $activity .= "( {$activitySourceId}, 7, 'General', '{$startDate} 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 )";
+      }
+
+      if ($count != 29) {
+        $membership .= ",";
+        $activity .= ",";
+        $activityContact .= ",";
+      }
+    }
+
+    $this->_query($membership);
+    $this->_query($activity);
+    $this->_query($activityContact);
+  }
+
+  /**
+   * @param $date
+   *
+   * @return string
+   */
+  public static function repairDate($date) {
+    $dropArray = array('-' => '', ':' => '', ' ' => '');
+    return strtr($date, $dropArray);
+  }
+
+  private function addMembershipLog() {
+    $membership = new CRM_Member_DAO_Membership();
+    $membership->query("SELECT id FROM civicrm_membership");
+    while ($membership->fetch()) {
+      $ids[] = $membership->id;
+    }
+    foreach ($ids as $id) {
+      $membership = new CRM_Member_DAO_Membership();
+      $membership->id = $id;
+      $membershipLog = new CRM_Member_DAO_MembershipLog();
+      if ($membership->find(TRUE)) {
+        $membershipLog->membership_id = $membership->id;
+        $membershipLog->status_id = $membership->status_id;
+        $membershipLog->start_date = self::repairDate($membership->start_date);
+        $membershipLog->end_date = self::repairDate($membership->end_date);
+        $membershipLog->modified_id = $membership->contact_id;
+        $membershipLog->modified_date = date("Ymd");
+        $membershipLog->membership_type_id = $membership->membership_type_id;
+        $membershipLog->save();
+      }
+      $membershipLog = NULL;
+    }
+  }
+
+  private function addEvent() {
+    $event = "INSERT INTO civicrm_address ( contact_id, location_type_id, is_primary, is_billing, street_address, street_number, street_number_suffix, street_number_predirectional, street_name, street_type, street_number_postdirectional, street_unit, supplemental_address_1, supplemental_address_2, supplemental_address_3, city, county_id, state_province_id, postal_code_suffix, postal_code, usps_adc, country_id, geo_code_1, geo_code_2, timezone)
+      VALUES
+      ( NULL, 1, 1, 1, '14S El Camino Way E', 14, 'S', NULL, 'El Camino', 'Way', NULL, NULL, NULL, NULL, NULL, 'Collinsville', NULL, 1006, NULL, '6022', NULL, 1228, 41.8328, -72.9253, NULL),
+      ( NULL, 1, 1, 1, '11B Woodbridge Path SW', 11, 'B', NULL, 'Woodbridge', 'Path', NULL, NULL, NULL, NULL, NULL, 'Dayton', NULL, 1034, NULL, '45417', NULL, 1228, 39.7531, -84.2471, NULL),
+      ( NULL, 1, 1, 1, '581O Lincoln Dr SW', 581, 'O', NULL, 'Lincoln', 'Dr', NULL, NULL, NULL, NULL, NULL, 'Santa Fe', NULL, 1030, NULL, '87594', NULL, 1228, 35.5212, -105.982, NULL)
+      ";
+    $this->_query($event);
+
+    $sql = "SELECT id from civicrm_address where street_address = '14S El Camino Way E'";
+    $eventAdd1 = CRM_Core_DAO::singleValueQuery($sql);
+    $sql = "SELECT id from civicrm_address where street_address = '11B Woodbridge Path SW'";
+    $eventAdd2 = CRM_Core_DAO::singleValueQuery($sql);
+    $sql = "SELECT id from civicrm_address where street_address = '581O Lincoln Dr SW'";
+    $eventAdd3 = CRM_Core_DAO::singleValueQuery($sql);
+
+    $event = "INSERT INTO civicrm_email (contact_id, location_type_id, email, is_primary, is_billing, on_hold, hold_date, reset_date)
+       VALUES
+       (NULL, 1, 'development@example.org', 0, 0, 0, NULL, NULL),
+       (NULL, 1, 'tournaments@example.org', 0, 0, 0, NULL, NULL),
+       (NULL, 1, 'celebration@example.org', 0, 0, 0, NULL, NULL)
+       ";
+    $this->_query($event);
+
+    $sql = "SELECT id from civicrm_email where email = 'development@example.org'";
+    $eventEmail1 = CRM_Core_DAO::singleValueQuery($sql);
+    $sql = "SELECT id from civicrm_email where email = 'tournaments@example.org'";
+    $eventEmail2 = CRM_Core_DAO::singleValueQuery($sql);
+    $sql = "SELECT id from civicrm_email where email = 'celebration@example.org'";
+    $eventEmail3 = CRM_Core_DAO::singleValueQuery($sql);
+
+    $event = "INSERT INTO civicrm_phone (contact_id, location_type_id, is_primary, is_billing, mobile_provider_id, phone, phone_numeric, phone_type_id)
+       VALUES
+       (NULL, 1, 0, 0, NULL, '204 222-1000', '2042221000', '1'),
+       (NULL, 1, 0, 0, NULL, '204 223-1000', '2042231000', '1'),
+       (NULL, 1, 0, 0, NULL, '303 323-1000', '3033231000', '1')
+       ";
+    $this->_query($event);
+
+    $sql = "SELECT id from civicrm_phone where phone = '204 222-1000'";
+    $eventPhone1 = CRM_Core_DAO::singleValueQuery($sql);
+    $sql = "SELECT id from civicrm_phone where phone = '204 223-1000'";
+    $eventPhone2 = CRM_Core_DAO::singleValueQuery($sql);
+    $sql = "SELECT id from civicrm_phone where phone = '303 323-1000'";
+    $eventPhone3 = CRM_Core_DAO::singleValueQuery($sql);
+
+    $event = "INSERT INTO civicrm_loc_block ( address_id, email_id, phone_id, address_2_id, email_2_id, phone_2_id)
+       VALUES
+      ( $eventAdd1, $eventEmail1, $eventPhone1, NULL,NULL,NULL),
+      ( $eventAdd2, $eventEmail2, $eventPhone2, NULL,NULL,NULL),
+      ( $eventAdd3, $eventEmail3, $eventPhone3, NULL,NULL,NULL)
+       ";
+
+    $this->_query($event);
+
+    $sql = "SELECT id from civicrm_loc_block where phone_id = $eventPhone1 AND email_id = $eventEmail1 AND address_id = $eventAdd1";
+    $eventLok1 = CRM_Core_DAO::singleValueQuery($sql);
+    $sql = "SELECT id from civicrm_loc_block where phone_id = $eventPhone2 AND email_id = $eventEmail2 AND address_id = $eventAdd2";
+    $eventLok2 = CRM_Core_DAO::singleValueQuery($sql);
+    $sql = "SELECT id from civicrm_loc_block where phone_id = $eventPhone3 AND email_id = $eventEmail3 AND address_id = $eventAdd3";
+    $eventLok3 = CRM_Core_DAO::singleValueQuery($sql);
+
+    $event = "INSERT INTO civicrm_event
+        ( title, summary, description, event_type_id, participant_listing_id, is_public, start_date, end_date, is_online_registration, registration_link_text, max_participants, event_full_text, is_monetary, financial_type_id, is_map, is_active, fee_label, is_show_location, loc_block_id,intro_text, footer_text, confirm_title, confirm_text, confirm_footer_text, is_email_confirm, confirm_email_text, confirm_from_name, confirm_from_email, cc_confirm, bcc_confirm, default_fee_id, thankyou_title, thankyou_text, thankyou_footer_text, is_pay_later, pay_later_text, pay_later_receipt, is_multiple_registrations, allow_same_participant_emails, currency )
+        VALUES
+        ( 'Fall Fundraiser Dinner', 'Kick up your heels at our Fall Fundraiser Dinner/Dance at Glen Echo Park! Come by yourself or bring a partner, friend or the entire family!', 'This event benefits our teen programs. Admission includes a full 3 course meal and wine or soft drinks. Grab your dancing shoes, bring the kids and come join the party!', 3, 1, 1, '" . date('Y-m-d 17:00:00', strtotime("+6 months", $this->time)) . "', '" . date('Y-m-d 17:00:00', strtotime("+6 months +2 days", $this->time)) . "', 1, 'Register Now', 100, 'Sorry! The Fall Fundraiser Dinner is full. Please call Jane at 204 222-1000 ext 33 if you want to be added to the waiting list.', 1, 4, 1, 1, 'Dinner Contribution', 1 ,$eventLok1,'Fill in the information below to join as at this wonderful dinner event.', NULL, 'Confirm Your Registration Information', 'Review the information below carefully.', NULL, 1, 'Contact the Development Department if you need to make any changes to your registration.', 'Fundraising Dept.', 'development@example.org', NULL, NULL, NULL, 'Thanks for Registering!', '<p>Thank you for your support. Your contribution will help us build even better tools.</p><p>Please tell your friends and colleagues about this wonderful event.</p>', '<p><a href=https://civicrm.org>Back to CiviCRM Home Page</a></p>', 1, 'I will send payment by check', 'Send a check payable to Our Organization within 3 business days to hold your reservation. Checks should be sent to: 100 Main St., Suite 3, San Francisco CA 94110', 1, 0, 'USD' ),
+        ( 'Summer Solstice Festival Day Concert', 'Festival Day is coming! Join us and help support your parks.', 'We will gather at noon, learn a song all together,  and then join in a joyous procession to the pavilion. We will be one of many groups performing at this wonderful concert which benefits our city parks.', 5, 1, 1, '" . date('Y-m-d 12:00:00', strtotime("-1 day", $this->time)) . "', '" . date('Y-m-d 17:00:00', strtotime("-1 day", $this->time)) . "', 1, 'Register Now', 50, 'We have all the singers we can handle. Come to the pavilion anyway and join in from the audience.', 1, 2, NULL, 1, 'Festival Fee', 1, $eventLok2, 'Complete the form below and click Continue to register online for the festival. Or you can register by calling us at 204 222-1000 ext 22.', '', 'Confirm Your Registration Information', '', '', 1, 'This email confirms your registration. If you have questions or need to change your registration - please do not hesitate to call us.', 'Event Dept.', 'events@example.org', '', NULL, NULL, 'Thanks for Your Joining In!', '<p>Thank you for your support. Your participation will help build new parks.</p><p>Please tell your friends and colleagues about the concert.</p>', '<p><a href=https://civicrm.org>Back to CiviCRM Home Page</a></p>', 0, NULL, NULL, 1, 0, 'USD' ),
+        ( 'Rain-forest Cup Youth Soccer Tournament', 'Sign up your team to participate in this fun tournament which benefits several Rain-forest protection groups in the Amazon basin.', 'This is a FYSA Sanctioned Tournament, which is open to all USSF/FIFA affiliated organizations for boys and girls in age groups: U9-U10 (6v6), U11-U12 (8v8), and U13-U17 (Full Sided).', 3, 1, 1, '" . date('Y-m-d 07:00:00', strtotime("+7 months", $this->time)) . "', '" . date('Y-m-d 17:00:00', strtotime("+7 months +3 days", $this->time)) . "', 1, 'Register Now', 500, 'Sorry! All available team slots for this tournament have been filled. Contact Jill Futbol for information about the waiting list and next years event.', 1, 4, NULL, 1, 'Tournament Fees',1, $eventLok3, 'Complete the form below to register your team for this year''s tournament.', '<em>A Soccer Youth Event</em>', 'Review and Confirm Your Registration Information', '', '<em>A Soccer Youth Event</em>', 1, 'Contact our Tournament Director for eligibility details.', 'Tournament Director', 'tournament@example.org', '', NULL, NULL, 'Thanks for Your Support!', '<p>Thank you for your support. Your participation will help save thousands of acres of rainforest.</p>', '<p><a href=https://civicrm.org>Back to CiviCRM Home Page</a></p>', 0, NULL, NULL, 0, 0, 'USD' )
+         ";
+    $this->_query($event);
+
+    //CRM-4464
+    $eventTemplates = "INSERT INTO civicrm_event
+        ( is_template, template_title, event_type_id, default_role_id, participant_listing_id, is_public, is_monetary, is_online_registration, is_multiple_registrations, allow_same_participant_emails, is_email_confirm, financial_type_id, fee_label, confirm_title, thankyou_title, confirm_from_name, confirm_from_email, is_active, currency )
+        VALUES
+        ( 1, 'Free Meeting without Online Registration', 4, 1, 1, 1, 0, 0, null, null, null, null,             null, null, null, null, null, 1, 'USD'  ),
+        ( 1, 'Free Meeting with Online Registration',    4, 1, 1, 1, 0, 1,    1,    1,    0, null,             null, 'Confirm Your Registration Information', 'Thanks for Registering!', null, null, 1, 'USD'  ),
+        ( 1, 'Paid Conference with Online Registration', 1, 1, 1, 1, 1, 1,    1,    1,    1,     4, 'Conference Fee', 'Confirm Your Registration Information', 'Thanks for Registering!', 'Event Template Dept.', 'event_templates@example.org', 1, 'USD' )";
+
+    $this->_query($eventTemplates);
+
+    $ufJoinValues = $tellFriendValues = array();
+    $profileID = CRM_Core_DAO::singleValueQuery("Select id from civicrm_uf_group where name ='event_registration'");
+
+    // grab id's for all events and event templates
+    $query = "
+SELECT  id
+  FROM  civicrm_event";
+
+    $template = CRM_Core_DAO::executeQuery($query);
+    while ($template->fetch()) {
+      if ($profileID) {
+        $ufJoinValues[] = "( 1, 'CiviEvent', 'civicrm_event', {$template->id}, 1, {$profileID} )";
+      }
+      $tellFriendValues[] = "( 'civicrm_event', {$template->id}, 'Tell A Friend', '<p>Help us spread the word about this event. Use the space below to personalize your email message - let your friends know why you''re attending. Then fill in the name(s) and email address(es) and click ''Send Your Message''.</p>', 'Thought you might be interested in checking out this event. I''m planning on attending.', NULL, 'Thanks for Spreading the Word', '<p>Thanks for spreading the word about this event to your friends.</p>', 1)";
+    }
+
+    //insert values in civicrm_uf_join for the required event_registration profile - CRM-9587
+    if (!empty($ufJoinValues)) {
+      $includeProfile = "INSERT INTO civicrm_uf_join
+                               (is_active, module, entity_table, entity_id, weight, uf_group_id )
+                               VALUES " . implode(',', $ufJoinValues);
+      $this->_query($includeProfile);
+    }
+
+    //insert values in civicrm_tell_friend
+    if (!empty($tellFriendValues)) {
+      $tellFriend = "INSERT INTO civicrm_tell_friend
+                           (entity_table, entity_id, title, intro, suggested_message,
+                           general_link,  thankyou_title, thankyou_text, is_active)
+                           VALUES " . implode(',', $tellFriendValues);
+      $this->_query($tellFriend);
+    }
+  }
+
+  private function addParticipant() {
+    $contact = new CRM_Contact_DAO_Contact();
+    $contact->query("SELECT id FROM civicrm_contact");
+    while ($contact->fetch()) {
+      $contacts[] = $contact->id;
+    }
+    $contacts = $this->shuffle($contacts);
+    $randomContacts = array_slice($contacts, 20, 50);
+
+    $participant = "
+INSERT INTO civicrm_participant
+        (contact_id, event_id, status_id, role_id, register_date, source, fee_level, is_test, fee_amount, fee_currency)
+VALUES
+        ( " . $randomContacts[0] . ", 1, 1, 1, '2009-01-21', 'Check', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[1] . ", 2, 2, 2, '2008-05-07', 'Credit Card', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[2] . ", 3, 3, 3, '2008-05-05', 'Credit Card', 'Tiny-tots (ages 5-8)', 0, 800, 'USD') ,
+        ( " . $randomContacts[3] . ", 1, 4, 4, '2008-10-21', 'Direct Transfer', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[4] . ", 2, 1, 1, '2008-01-10', 'Check', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[5] . ", 3, 2, 2, '2008-03-05', 'Direct Transfer', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[6] . ", 1, 3, 3, '2009-07-21', 'Direct Transfer', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[7] . ", 2, 4, 4, '2009-03-07', 'Credit Card', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[8] . ", 3, 1, 1, '2008-02-05', 'Direct Transfer', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[9] . ", 1, 2, 2, '2008-02-01', 'Check', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[10] . ", 2, 3, 3, '2009-01-10', 'Direct Transfer', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[11] . ", 3, 4, 4, '2009-03-06', 'Credit Card', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[12] . ", 1, 1, 2, '2008-06-04', 'Credit Card', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[13] . ", 2, 2, 3, '2008-01-10', 'Direct Transfer', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[14] . ", 3, 4, 1, '2008-07-04', 'Check', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[15] . ", 1, 4, 2, '2009-01-21', 'Credit Card', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[16] . ", 2, 2, 3, '2008-01-10', 'Credit Card', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[17] . ", 3, 3, 1, '2009-03-05', 'Credit Card', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[18] . ", 1, 2, 1, '2008-10-21', 'Direct Transfer', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[19] . ", 2, 4, 1, '2009-01-10', 'Credit Card', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[20] . ", 3, 1, 4, '2008-03-25', 'Check', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[21] . ", 1, 2, 3, '2009-10-21', 'Direct Transfer', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[22] . ", 2, 4, 1, '2008-01-10', 'Direct Transfer', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[23] . ", 3, 3, 1, '2008-03-11', 'Credit Card', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[24] . ", 3, 2, 2, '2008-04-05', 'Direct Transfer', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[25] . ", 1, 1, 1, '2009-01-21', 'Check', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[26] . ", 2, 2, 2, '2008-05-07', 'Credit Card', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[27] . ", 3, 3, 3, '2009-12-12', 'Direct Transfer', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[28] . ", 1, 4, 4, '2009-12-13', 'Credit Card', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[29] . ", 2, 1, 1, '2009-12-14', 'Direct Transfer', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[30] . ", 3, 2, 2, '2009-12-15', 'Credit Card', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[31] . ", 1, 3, 3, '2009-07-21', 'Check', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[32] . ", 2, 4, 4, '2009-03-07', 'Direct Transfer', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[33] . ", 3, 1, 1, '2009-12-15', 'Credit Card', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[34] . ", 1, 2, 2, '2009-12-13', 'Direct Transfer', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[35] . ", 2, 3, 3, '2009-01-10', 'Direct Transfer', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[36] . ", 3, 4, 4, '2009-03-06', 'Check', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[37] . ", 1, 1, 2, '2009-12-13', 'Direct Transfer', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[38] . ", 2, 2, 3, '2008-01-10', 'Direct Transfer', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[39] . ", 3, 4, 1, '2009-12-14', 'Credit Card', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[40] . ", 1, 4, 2, '2009-01-21', 'Credit Card', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[41] . ", 2, 2, 3, '2009-12-15', 'Credit Card', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[42] . ", 3, 3, 1, '2009-03-05', 'Credit Card', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[43] . ", 1, 2, 1, '2009-12-13', 'Direct Transfer', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[44] . ", 2, 4, 1, '2009-01-10', 'Direct Transfer', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[45] . ", 3, 1, 4, '2009-12-13', 'Check', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[46] . ", 1, 2, 3, '2009-10-21', 'Credit Card', 'Single', 0, 50, 'USD'),
+        ( " . $randomContacts[47] . ", 2, 4, 1, '2009-12-10', 'Credit Card', 'Soprano', 0, 50, 'USD'),
+        ( " . $randomContacts[48] . ", 3, 3, 1, '2009-03-11', 'Credit Card', 'Tiny-tots (ages 5-8)', 0, 800, 'USD'),
+        ( " . $randomContacts[49] . ", 3, 2, 2, '2009-04-05', 'Check', 'Tiny-tots (ages 5-8)', 0, 800, 'USD');
+";
+    $this->_query($participant);
+
+    $query = "
+INSERT INTO civicrm_activity
+    (source_record_id, activity_type_id, subject, activity_date_time, duration, location, phone_id, phone_number, details, priority_id,parent_id, is_test, status_id)
+VALUES
+    (01, 5, 'NULL', '2009-01-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (02, 5, 'NULL', '2008-05-07 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (03, 5, 'NULL', '2008-05-05 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (04, 5, 'NULL', '2008-10-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (05, 5, 'NULL', '2008-01-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (06, 5, 'NULL', '2008-03-05 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (07, 5, 'NULL', '2009-07-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (08, 5, 'NULL', '2009-03-07 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (09, 5, 'NULL', '2008-02-05 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (10, 5, 'NULL', '2008-02-01 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (11, 5, 'NULL', '2009-01-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (12, 5, 'NULL', '2009-03-06 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (13, 5, 'NULL', '2008-06-04 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (14, 5, 'NULL', '2008-01-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (15, 5, 'NULL', '2008-07-04 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (16, 5, 'NULL', '2009-01-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (17, 5, 'NULL', '2008-01-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (18, 5, 'NULL', '2009-03-05 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (19, 5, 'NULL', '2008-10-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (20, 5, 'NULL', '2009-01-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (21, 5, 'NULL', '2008-03-25 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (22, 5, 'NULL', '2009-10-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (23, 5, 'NULL', '2008-01-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (24, 5, 'NULL', '2008-03-11 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (25, 5, 'NULL', '2008-04-05 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (26, 5, 'NULL', '2009-01-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (27, 5, 'NULL', '2008-05-07 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (28, 5, 'NULL', '2009-12-12 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (29, 5, 'NULL', '2009-12-13 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (30, 5, 'NULL', '2009-12-14 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (31, 5, 'NULL', '2009-12-15 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (32, 5, 'NULL', '2009-07-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (33, 5, 'NULL', '2009-03-07 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (34, 5, 'NULL', '2009-12-15 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (35, 5, 'NULL', '2009-12-13 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (36, 5, 'NULL', '2009-01-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (37, 5, 'NULL', '2009-03-06 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (38, 5, 'NULL', '2009-12-13 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (39, 5, 'NULL', '2008-01-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (40, 5, 'NULL', '2009-12-14 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (41, 5, 'NULL', '2009-01-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (42, 5, 'NULL', '2009-12-15 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (43, 5, 'NULL', '2009-03-05 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (44, 5, 'NULL', '2009-12-13 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (45, 5, 'NULL', '2009-01-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (46, 5, 'NULL', '2009-12-13 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (47, 5, 'NULL', '2009-10-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (48, 5, 'NULL', '2009-12-10 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (49, 5, 'NULL', '2009-03-11 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (50, 5, 'NULL', '2009-04-05 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 )
+    ";
+    $this->_query($query);
+
+    $activityContact = "
+INSERT INTO civicrm_activity_contact
+  (contact_id, activity_id, record_type_id)
+VALUES
+";
+    $activityContacts = CRM_Activity_BAO_ActivityContact::buildOptions('record_type_id', 'validate');
+    $currentActivityID = CRM_Core_DAO::singleValueQuery("SELECT MAX(id) FROM civicrm_activity");
+    $currentActivityID -= 50;
+    $sourceID = CRM_Utils_Array::key('Activity Source', $activityContacts);
+    for ($i = 0; $i < 50; $i++) {
+      $currentActivityID++;
+      $activityContact .= "({$randomContacts[$i]}, $currentActivityID, $sourceID)";
+      if ($i != 49) {
+        $activityContact .= ", ";
+      }
+    }
+    $this->_query($activityContact);
+  }
+
+  private function addPCP() {
+    $query = "
+INSERT INTO `civicrm_pcp`
+    (contact_id, status_id, title, intro_text, page_text, donate_link_text, page_id, page_type, is_thermometer, is_honor_roll, goal_amount, currency, is_active, pcp_block_id, is_notify)
+VALUES
+    ({$this->Individual[3]}, 2, 'My Personal Civi Fundraiser', 'I''m on a mission to get all my friends and family to help support my favorite open-source civic sector CRM.', '<p>Friends and family - please help build much needed infrastructure for the civic sector by supporting my personal campaign!</p>\r\n<p><a href=\"https://civicrm.org\">You can learn more about CiviCRM here</a>.</p>\r\n<p>Then click the <strong>Contribute Now</strong> button to go to our easy-to-use online contribution form.</p>', 'Contribute Now', 1, 'contribute', 1, 1, 5000.00, 'USD', 1, 1, 1);
+";
+    $this->_query($query);
+  }
+
+  private function addContribution() {
+    $query = "
+INSERT INTO civicrm_contribution
+    (contact_id, financial_type_id, payment_instrument_id, receive_date, non_deductible_amount, total_amount, trxn_id, check_number, currency, cancel_date, cancel_reason, receipt_date, thankyou_date, source )
+VALUES
+    (2, 1, 4, '2010-04-11 00:00:00', 0.00, 125.00, NULL, '1041', 'USD', NULL, NULL, NULL, NULL, 'Apr 2007 Mailer 1' ),
+    (4, 1, 1, '2010-03-21 00:00:00', 0.00, 50.00, 'P20901X1', NULL, 'USD', NULL, NULL, NULL, NULL, 'Online: Save the Penguins' ),
+    (6, 1, 4, '2010-04-29 00:00:00', 0.00, 25.00, NULL, '2095', 'USD', NULL, NULL, NULL, NULL, 'Apr 2007 Mailer 1' ),
+    (8, 1, 4, '2010-04-11 00:00:00', 0.00, 50.00, NULL, '10552', 'USD', NULL, NULL, NULL, NULL, 'Apr 2007 Mailer 1' ),
+    (16, 1, 4, '2010-04-15 00:00:00', 0.00, 500.00, NULL, '509', 'USD', NULL, NULL, NULL, NULL, 'Apr 2007 Mailer 1' ),
+    (19, 1, 4, '2010-04-11 00:00:00', 0.00, 175.00, NULL, '102', 'USD', NULL, NULL, NULL, NULL, 'Apr 2007 Mailer 1' ),
+    (82, 1, 1, '2010-03-27 00:00:00', 0.00, 50.00, 'P20193L2', NULL, 'USD', NULL, NULL, NULL, NULL, 'Online: Save the Penguins' ),
+    (92, 1, 1, '2010-03-08 00:00:00', 0.00, 10.00, 'P40232Y3', NULL, 'USD', NULL, NULL, NULL, NULL, 'Online: Help CiviCRM' ),
+    (34, 1, 1, '2010-04-22 00:00:00', 0.00, 250.00, 'P20193L6', NULL, 'USD', NULL, NULL, NULL, NULL, 'Online: Help CiviCRM' ),
+    (71, 1, 1, '2009-07-01 11:53:50', 0.00, 500.00, 'PL71', NULL, 'USD', NULL, NULL, NULL, NULL, NULL ),
+    (43, 1, 1, '2009-07-01 12:55:41', 0.00, 200.00, 'PL43II', NULL, 'USD', NULL, NULL, NULL, NULL, NULL ),
+    (32, 1, 1, '2009-10-01 11:53:50', 0.00, 200.00, 'PL32I', NULL, 'USD', NULL, NULL, NULL, NULL, NULL ),
+    (32, 1, 1, '2009-12-01 12:55:41', 0.00, 200.00, 'PL32II', NULL, 'USD', NULL, NULL, NULL, NULL, NULL );
+";
+    $this->_query($query);
+
+    $currentActivityID = CRM_Core_DAO::singleValueQuery("SELECT MAX(id) FROM civicrm_activity");
+    $query = "
+INSERT INTO civicrm_activity
+    (source_record_id, activity_type_id, subject, activity_date_time, duration, location, phone_id, phone_number, details, priority_id,parent_id, is_test, status_id)
+VALUES
+    (1, 6, '$ 125.00-Apr 2007 Mailer 1', '2010-04-11 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (2, 6, '$ 50.00-Online: Save the Penguins', '2010-03-21 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (3, 6, '$ 25.00-Apr 2007 Mailer 1', '2010-04-29 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (4, 6, '$ 50.00-Apr 2007 Mailer 1', '2010-04-11 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (5, 6, '$ 500.00-Apr 2007 Mailer 1', '2010-04-15 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (6, 6, '$ 175.00-Apr 2007 Mailer 1', '2010-04-11 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (7, 6, '$ 50.00-Online: Save the Penguins', '2010-03-27 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (8, 6, '$ 10.00-Online: Save the Penguins', '2010-03-08 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (9, 6, '$ 250.00-Online: Save the Penguins', '2010-04-22 00:00:00', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (10, 6, NULL, '2009-07-01 11:53:50', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (11, 6, NULL, '2009-07-01 12:55:41', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (12, 6, NULL, '2009-10-01 11:53:50', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 ),
+    (13, 6, NULL, '2009-12-01 12:55:41', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 2 );
+    ";
+    $this->_query($query);
+
+    $activityContact = "
+INSERT INTO civicrm_activity_contact
+  (contact_id, activity_id, record_type_id)
+VALUES
+";
+
+    $arbitraryNumbers = array(2, 4, 6, 8, 16, 19, 82, 92, 34, 71, 43, 32, 32);
+    for ($i = 0; $i < count($arbitraryNumbers); $i++) {
+      $currentActivityID++;
+      $activityContact .= "({$arbitraryNumbers[$i]}, $currentActivityID, 2)";
+      if ($i != count($arbitraryNumbers) - 1) {
+        $activityContact .= ", ";
+      }
+    }
+    $this->_query($activityContact);
+  }
+
+  private function addSoftContribution() {
+
+    $sql = "SELECT id from civicrm_contribution where contact_id = 92";
+    $contriId1 = CRM_Core_DAO::singleValueQuery($sql);
+
+    $sql = "SELECT id from civicrm_contribution where contact_id = 34";
+    $contriId2 = CRM_Core_DAO::singleValueQuery($sql);
+
+    $sql = "SELECT cov.value FROM civicrm_option_value cov LEFT JOIN civicrm_option_group cog ON cog.id = cov.option_group_id WHERE cov.name = 'pcp' AND cog.name = 'soft_credit_type'";
+
+    $pcpId = CRM_Core_DAO::singleValueQuery($sql);
+
+    $query = "
+INSERT INTO `civicrm_contribution_soft`
+      ( contribution_id, contact_id ,amount , currency, pcp_id , pcp_display_in_roll ,pcp_roll_nickname,pcp_personal_note, soft_credit_type_id )
+VALUES
+    ( $contriId1, {$this->Individual[3]}, 10.00, 'USD', 1, 1, 'Jones Family', 'Helping Hands', $pcpId),
+    ( $contriId2, {$this->Individual[3]}, 250.00, 'USD', 1, 1, 'Annie and the kids', 'Annie Helps', $pcpId);
+ ";
+
+    $this->_query($query);
+  }
+
+  private function addPledge() {
+    $pledge = "INSERT INTO civicrm_pledge
+        (contact_id, financial_type_id, contribution_page_id, amount, original_installment_amount, currency,frequency_unit, frequency_interval, frequency_day, installments, start_date, create_date, acknowledge_date, modified_date, cancel_date, end_date, status_id, is_test)
+        VALUES
+       (71, 1, 1, 500.00, '500', 'USD', 'month', 1, 1, 1, '2009-07-01 00:00:00', '2009-06-26 00:00:00', NULL, NULL, NULL,'2009-07-01 00:00:00', 1, 0),
+       (43, 1, 1, 800.00, '200', 'USD', 'month', 3, 1, 4, '2009-07-01 00:00:00', '2009-06-23 00:00:00', '2009-06-23 00:00:00', NULL, NULL, '2009-04-01 10:11:40', 5, 0),
+       (32, 1, 1, 600.00, '200', 'USD', 'month', 1, 1, 3, '2009-10-01 00:00:00', '2009-09-14 00:00:00', '2009-09-14 00:00:00', NULL, NULL, '2009-12-01 00:00:00', 5, 0);
+";
+    $this->_query($pledge);
+  }
+
+  private function addPledgePayment() {
+    $pledgePayment = "INSERT INTO civicrm_pledge_payment
+        ( pledge_id, contribution_id, scheduled_amount, actual_amount, currency, scheduled_date, reminder_date, reminder_count, status_id)
+       VALUES
+         (1, 10, 500.00, 500.00, 'USD','2009-07-01 00:00:00', null, 0, 1 ),
+         (2, 11,   200.00, 200.00, 'USD','2009-07-01 00:00:00', null, 0,  1 ),
+         (2, null, 200.00, null, 'USD', '2009-10-01 00:00:00', null, 0,  2 ),
+         (2, null, 200.00, null, 'USD', '2009-01-01 00:00:00', null, 0,  2 ),
+         (2, null, 200.00, null, 'USD', '2009-04-01 00:00:00', null, 0,  2 ),
+
+         (3, 12,   200.00, 200.00, 'USD', '2009-10-01 00:00:00', null, 0, 1 ),
+         (3, 13,   200.00, 200.00, 'USD', '2009-11-01 00:0:00', '2009-10-28 00:00:00', 1, 1),
+         (3, null, 200.00, null, 'USD', '2009-12-01 00:00:00', null, 0, 2 );
+        ";
+    $this->_query($pledgePayment);
+  }
+
+  private function addContributionLineItem() {
+    $query = " INSERT INTO civicrm_line_item (`entity_table`, `entity_id`, contribution_id, `price_field_id`, `label`, `qty`, `unit_price`, `line_total`, `participant_count`, `price_field_value_id`, `financial_type_id`)
+SELECT 'civicrm_contribution', cc.id, cc.id contribution_id, cpf.id as price_field, cpfv.label, 1, cc.total_amount, cc.total_amount line_total, 0, cpfv.id as price_field_value, cpfv.financial_type_id
+FROM civicrm_contribution cc
+LEFT JOIN civicrm_price_set cps ON cps.name = 'default_contribution_amount'
+LEFT JOIN civicrm_price_field cpf ON cpf.price_set_id = cps.id
+LEFT JOIN civicrm_price_field_value cpfv ON cpfv.price_field_id = cpf.id
+order by cc.id; ";
+    $this->_query($query);
+  }
+
+  private function addAccountingEntries() {
+    $components = array('contribution', 'membership', 'participant');
+    $select = 'SELECT contribution.id contribution_id, cli.id as line_item_id, contribution.contact_id, contribution.receive_date, contribution.total_amount, contribution.currency, cli.label,
+      cli.financial_type_id,  cefa.financial_account_id, contribution.payment_instrument_id, contribution.check_number, contribution.trxn_id';
+    $where = 'WHERE cefa.account_relationship = 1';
+    $financialAccountId = CRM_Financial_BAO_FinancialTypeAccount::getInstrumentFinancialAccount(4);
+    foreach ($components as $component) {
+      if ($component == 'contribution') {
+        $from = 'FROM `civicrm_contribution` contribution';
+      }
+      else {
+        $from = " FROM `civicrm_{$component}` {$component}
+          INNER JOIN civicrm_{$component}_payment cpp ON cpp.{$component}_id = {$component}.id
+          INNER JOIN civicrm_contribution contribution on contribution.id = cpp.contribution_id";
+      }
+      $from .= " INNER JOIN civicrm_line_item cli ON cli.entity_id = {$component}.id and cli.entity_table = 'civicrm_{$component}'
+        INNER JOIN civicrm_entity_financial_account cefa ON cefa.entity_id =  cli.financial_type_id ";
+      $sql = " {$select} {$from} {$where} ";
+      $result = CRM_Core_DAO::executeQuery($sql);
+      $this->addFinancialItem($result, $financialAccountId);
+    }
+  }
+
+  /**
+   * @param $result
+   * @param null $financialAccountId
+   */
+  private function addFinancialItem($result, $financialAccountId) {
+    $defaultFinancialAccount = CRM_Core_DAO::singleValueQuery("SELECT id FROM civicrm_financial_account WHERE is_default = 1 AND financial_account_type_id = 1");
+    while ($result->fetch()) {
+      $trxnParams = array(
+        'trxn_date' => CRM_Utils_Date::processDate($result->receive_date),
+        'total_amount' => $result->total_amount,
+        'currency' => $result->currency,
+        'status_id' => 1,
+        'trxn_id' => $result->trxn_id,
+        'contribution_id' => $result->contribution_id,
+        'to_financial_account_id' => empty($financialAccountId[$result->payment_instrument_id]) ? $defaultFinancialAccount : $financialAccountId[$result->payment_instrument_id],
+        'payment_instrument_id' => $result->payment_instrument_id,
+        'check_number' => $result->check_number,
+        'is_payment' => 1,
+      );
+      $trxn = CRM_Core_BAO_FinancialTrxn::create($trxnParams);
+      $financialItem = array(
+        'transaction_date' => CRM_Utils_Date::processDate($result->receive_date),
+        'amount' => $result->total_amount,
+        'currency' => $result->currency,
+        'status_id' => 1,
+        'entity_id' => $result->line_item_id,
+        'contact_id' => $result->contact_id,
+        'entity_table' => 'civicrm_line_item',
+        'description' => $result->label,
+        'financial_account_id' => $result->financial_account_id,
+      );
+      $trxnId['id'] = $trxn->id;
+      CRM_Financial_BAO_FinancialItem::create($financialItem, NULL, $trxnId);
+    }
+  }
+
+  private function addLineItemParticipants() {
+    $participant = new CRM_Event_DAO_Participant();
+    $participant->query("INSERT INTO civicrm_line_item (`entity_table`, `entity_id`, contribution_id, `price_field_id`, `label`, `qty`, `unit_price`, `line_total`, `participant_count`, `price_field_value_id`, `financial_type_id`)
+SELECT 'civicrm_participant', cp.id, cpp.contribution_id, cpfv.price_field_id, cpfv.label, 1, cpfv.amount, cpfv.amount as line_total, 0, cpfv.id, cpfv.financial_type_id FROM civicrm_participant cp LEFT JOIN civicrm_participant_payment cpp ON cpp.participant_id = cp.id
+LEFT JOIN civicrm_price_set_entity cpe ON cpe.entity_id = cp.event_id LEFT JOIN civicrm_price_field cpf ON cpf.price_set_id = cpe.price_set_id LEFT JOIN civicrm_price_field_value cpfv ON cpfv.price_field_id = cpf.id WHERE cpfv.label = cp.fee_level");
+  }
+
+  private function addMembershipPayment() {
+    $maxContribution = CRM_Core_DAO::singleValueQuery("select max(id) from civicrm_contribution");
+    $financialTypeID = CRM_Core_DAO::singleValueQuery("select id from civicrm_financial_type where name = 'Member Dues'");
+    $paymentInstrumentID = CRM_Core_DAO::singleValueQuery("select value from civicrm_option_value where name = 'Credit Card' AND option_group_id = (SELECT id from civicrm_option_group where name = 'payment_instrument')");
+    $sql = "INSERT INTO civicrm_contribution (contact_id,financial_type_id,payment_instrument_id, receive_date, total_amount, currency, source, contribution_status_id)
+SELECT  cm.contact_id, $financialTypeID, $paymentInstrumentID, now(), cmt.minimum_fee, 'USD', CONCAT(cmt.name, ' Membership: Offline signup'), 1 FROM `civicrm_membership` cm
+LEFT JOIN civicrm_membership_type cmt ON cmt.id = cm.membership_type_id;";
+
+    $this->_query($sql);
+
+    $sql = "INSERT INTO civicrm_membership_payment (contribution_id,membership_id)
+SELECT cc.id, cm.id FROM civicrm_contribution cc
+LEFT JOIN civicrm_membership cm ON cm.contact_id = cc.contact_id
+WHERE cc.id > $maxContribution;";
+
+    $this->_query($sql);
+
+    $sql = "INSERT INTO civicrm_line_item (entity_table, entity_id, contribution_id, price_field_value_id, price_field_id, label, qty, unit_price, line_total, financial_type_id)
+SELECT 'civicrm_membership', cm.id, cmp.contribution_id, cpfv.id, cpfv.price_field_id, cpfv.label, 1, cpfv.amount, cpfv.amount as unit_price, cpfv.financial_type_id FROM `civicrm_membership` cm
+LEFT JOIN civicrm_membership_payment cmp ON cmp.membership_id = cm.id
+LEFT JOIN civicrm_price_field_value cpfv ON cpfv.membership_type_id = cm.membership_type_id
+LEFT JOIN civicrm_price_field cpf ON cpf.id = cpfv.price_field_id
+LEFT JOIN civicrm_price_set cps ON cps.id = cpf.price_set_id
+WHERE cps.name = 'default_membership_type_amount'";
+    $this->_query($sql);
+
+    $sql = "INSERT INTO civicrm_activity(source_record_id, activity_type_id, subject, activity_date_time, status_id, details)
+SELECT id, 6, CONCAT('$ ', total_amount, ' - ', source), now(), 2, 'Membership Payment' FROM civicrm_contribution WHERE id > $maxContribution";
+    $this->_query($sql);
+
+    $sql = "INSERT INTO civicrm_activity_contact(contact_id, activity_id, record_type_id)
+SELECT c.contact_id, a.id, 2
+FROM   civicrm_contribution c, civicrm_activity a
+WHERE  c.id > $maxContribution
+AND    a.source_record_id = c.id
+AND    a.details = 'Membership Payment'
+";
+    $this->_query($sql);
+  }
+
+  private function addParticipantPayment() {
+    $maxContribution = CRM_Core_DAO::singleValueQuery("select max(id) from civicrm_contribution");
+    $financialTypeID = CRM_Core_DAO::singleValueQuery("select id from civicrm_financial_type where name = 'Event Fee'");
+    $paymentInstrumentID = CRM_Core_DAO::singleValueQuery("select value from civicrm_option_value where name = 'Credit Card' AND option_group_id = (SELECT id from civicrm_option_group where name = 'payment_instrument')");
+    $sql = "INSERT INTO civicrm_contribution (contact_id, financial_type_id, payment_instrument_id, receive_date, total_amount, currency, receipt_date, source, contribution_status_id)
+SELECT  `contact_id`, $financialTypeID, $paymentInstrumentID, now(), `fee_amount`, 'USD', now(), CONCAT(ce.title, ' : Offline registration'), 1  FROM `civicrm_participant` cp
+LEFT JOIN civicrm_event ce ON ce.id = cp.event_id
+group by `contact_id`, `fee_amount`, `title`;";
+
+    $this->_query($sql);
+
+    $sql = "INSERT INTO civicrm_participant_payment (contribution_id,participant_id)
+SELECT cc.id, cp.id FROM civicrm_contribution cc
+LEFT JOIN civicrm_participant cp ON cp.contact_id = cc.contact_id
+WHERE cc.id > $maxContribution";
+
+    $this->_query($sql);
+
+    $sql = "INSERT INTO civicrm_activity(source_record_id, activity_type_id, subject, activity_date_time, status_id, details)
+SELECT id, 6, CONCAT('$ ', total_amount, ' - ', source), now(), 2, 'Participant' FROM `civicrm_contribution` WHERE id > $maxContribution";
+    $this->_query($sql);
+
+    $sql = "INSERT INTO civicrm_activity_contact(contact_id, activity_id, record_type_id)
+SELECT c.contact_id, a.id, 2
+FROM   civicrm_contribution c, civicrm_activity a
+WHERE  c.id > $maxContribution
+AND    a.source_record_id = c.id
+AND    a.details = 'Participant Payment'
+";
+    $this->_query($sql);
+  }
+
+  /**
+   * @return string
+   */
+  protected static function getCivicrmDir():string {
+    return dirname(dirname(dirname(__DIR__)));
+  }
+
+}
diff --git a/civicrm/CRM/Core/CodeGen/Main.php b/civicrm/CRM/Core/CodeGen/Main.php
index 1b754b959fb4274020eb631489e845d4b0ee9fcc..d108102259617250657d3a13a654d5bb4e78d99d 100644
--- a/civicrm/CRM/Core/CodeGen/Main.php
+++ b/civicrm/CRM/Core/CodeGen/Main.php
@@ -5,6 +5,10 @@
  */
 class CRM_Core_CodeGen_Main {
   public $buildVersion;
+
+  /**
+   * @var string
+   */
   public $db_version;
   /**
    * drupal, joomla, wordpress
@@ -76,11 +80,11 @@ class CRM_Core_CodeGen_Main {
 
     $versionFile = $this->phpCodePath . "/xml/version.xml";
     $versionXML = CRM_Core_CodeGen_Util_Xml::parse($versionFile);
-    $this->db_version = $versionXML->version_no;
+    $this->db_version = (string) $versionXML->version_no;
     $this->buildVersion = preg_replace('/^(\d{1,2}\.\d{1,2})\.(\d{1,2}|\w{4,7})$/i', '$1', $this->db_version);
     if (isset($argVersion)) {
       // change the version to that explicitly passed, if any
-      $this->db_version = $argVersion;
+      $this->db_version = (string) $argVersion;
     }
 
     $this->schemaPath = $schemaPath;
diff --git a/civicrm/CRM/Core/CodeGen/Specification.php b/civicrm/CRM/Core/CodeGen/Specification.php
index 4d2be52ad41a80a166a0a7e479ab6de497f6e767..6a96e0d7c2ab1b2596341dfaf101607ebaa71bd2 100644
--- a/civicrm/CRM/Core/CodeGen/Specification.php
+++ b/civicrm/CRM/Core/CodeGen/Specification.php
@@ -204,13 +204,15 @@ class CRM_Core_CodeGen_Specification {
       }
     }
 
+    $titleFromClass = preg_replace('/([a-z])([A-Z])/', '$1 $2', $klass);
     $table = [
       'name' => $name,
       'base' => $daoPath,
       'sourceFile' => $sourceFile,
       'fileName' => $klass . '.php',
       'objectName' => $klass,
-      'title' => $tableXML->title ?? self::nameToTitle($klass),
+      'title' => $tableXML->title ?? $titleFromClass,
+      'titlePlural' => $tableXML->titlePlural ?? CRM_Utils_String::pluralize($tableXML->title ?? $titleFromClass),
       'icon' => $tableXML->icon ?? NULL,
       'add' => $tableXML->add ?? NULL,
       'labelName' => substr($name, 8),
@@ -746,15 +748,4 @@ class CRM_Core_CodeGen_Specification {
     return 'CRM_Utils_Type::HUGE';
   }
 
-  /**
-   * Converts an entity name to a user friendly string.
-   *
-   * @param string $name
-   * return string
-   */
-  public static function nameToTitle(string $name) {
-    $name = preg_replace('/([a-z])([A-Z])/', '$1 $2', $name);
-    return CRM_Utils_String::pluralize($name);
-  }
-
 }
diff --git a/civicrm/CRM/Core/Controller.php b/civicrm/CRM/Core/Controller.php
index 4a4254c25505eab19aecbaf5105742fe943f76cc..68c653185855e6a0c726458358ef90da6addef69 100644
--- a/civicrm/CRM/Core/Controller.php
+++ b/civicrm/CRM/Core/Controller.php
@@ -568,8 +568,8 @@ class CRM_Core_Controller extends HTML_QuickForm_Controller {
   public function addWizardStyle(&$wizard) {
     $wizard['style'] = [
       'barClass' => '',
-      'stepPrefixCurrent' => '<i class="crm-i fa-chevron-right" aria-hidden="true"></i>&nbsp;',
-      'stepPrefixPast' => '<i class="crm-i fa-check" aria-hidden="true"></i>&nbsp;',
+      'stepPrefixCurrent' => '<i class="crm-i fa-chevron-right" aria-hidden="true"></i> ',
+      'stepPrefixPast' => '<i class="crm-i fa-check" aria-hidden="true"></i> ',
       'stepPrefixFuture' => ' ',
       'subStepPrefixCurrent' => '&nbsp;&nbsp;',
       'subStepPrefixPast' => '&nbsp;&nbsp;',
diff --git a/civicrm/CRM/Core/DAO.php b/civicrm/CRM/Core/DAO.php
index d62fba1401e7961d9af93590f7527de490ca577d..f29b13cca9015e07875c35c2310f1d53b8c0e706 100644
--- a/civicrm/CRM/Core/DAO.php
+++ b/civicrm/CRM/Core/DAO.php
@@ -121,11 +121,12 @@ class CRM_Core_DAO extends DB_DataObject {
 
   /**
    * Returns localized title of this entity.
+   *
    * @return string
    */
   public static function getEntityTitle() {
     $className = static::class;
-    Civi::log()->warning("$className needs to be regeneraged. Missing getEntityTitle method.", ['civi.tag' => 'deprecated']);
+    Civi::log()->warning("$className needs to be regenerated. Missing getEntityTitle method.", ['civi.tag' => 'deprecated']);
     return CRM_Core_DAO_AllCoreTables::getBriefName($className);
   }
 
@@ -146,10 +147,21 @@ class CRM_Core_DAO extends DB_DataObject {
   }
 
   /**
-   * Empty definition for virtual function.
+   * Returns the name of this table
+   *
+   * @return string
    */
   public static function getTableName() {
-    return NULL;
+    return self::getLocaleTableName(static::$_tableName ?? NULL);
+  }
+
+  /**
+   * Returns if this table needs to be logged
+   *
+   * @return bool
+   */
+  public function getLog() {
+    return static::$_log ?? FALSE;
   }
 
   /**
@@ -2726,11 +2738,11 @@ SELECT contact_id
    */
   public function getFieldSpec($fieldName) {
     $fields = $this->fields();
-    $fieldKeys = $this->fieldKeys();
 
     // Support "unique names" as well as sql names
     $fieldKey = $fieldName;
     if (empty($fields[$fieldKey])) {
+      $fieldKeys = $this->fieldKeys();
       $fieldKey = $fieldKeys[$fieldName] ?? NULL;
     }
     // If neither worked then this field doesn't exist. Return false.
@@ -3129,4 +3141,14 @@ SELECT contact_id
     }
   }
 
+  /**
+   * Return a mapping from field-name to the corresponding key (as used in fields()).
+   *
+   * @return array
+   *   Array(string $name => string $uniqueName).
+   */
+  public static function fieldKeys() {
+    return array_flip(CRM_Utils_Array::collect('name', static::fields()));
+  }
+
 }
diff --git a/civicrm/CRM/Core/DAO/ActionLog.php b/civicrm/CRM/Core/DAO/ActionLog.php
index f725a2558a186451449ae1ba0461a6e334d51646..8eb9523e50a5e53c62aef17caf8dec10ff6d3048 100644
--- a/civicrm/CRM/Core/DAO/ActionLog.php
+++ b/civicrm/CRM/Core/DAO/ActionLog.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/ActionLog.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:2ccef6f7cc6a43d833301e93a2a0d61f)
+ * (GenCodeChecksum:a449765feaf80c56214be9fce2f118b4)
  */
 
 /**
@@ -108,9 +108,12 @@ class CRM_Core_DAO_ActionLog extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Action Logs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Action Logs') : ts('Action Log');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/ActionMapping.php b/civicrm/CRM/Core/DAO/ActionMapping.php
index 8a61ce5bbc492cc9bfe0792b2e3fd10d088a0ef9..3224bc1269fafbd9c04ac024563c7af82e99fb1a 100644
--- a/civicrm/CRM/Core/DAO/ActionMapping.php
+++ b/civicrm/CRM/Core/DAO/ActionMapping.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/ActionMapping.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:037a3f26719a4774957814f28c499e60)
+ * (GenCodeChecksum:7db8e13984f33629f584a8a54c37fd4a)
  */
 
 /**
@@ -101,9 +101,12 @@ class CRM_Core_DAO_ActionMapping extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Action Mappings');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Action Mappings') : ts('Action Mapping');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/ActionSchedule.php b/civicrm/CRM/Core/DAO/ActionSchedule.php
index 666f773ba859b2c7226dc70327bbfe912dfb8dd1..181a1bdee5068f92442792866ea12f7db881abaa 100644
--- a/civicrm/CRM/Core/DAO/ActionSchedule.php
+++ b/civicrm/CRM/Core/DAO/ActionSchedule.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/ActionSchedule.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:d05639de89f460efbb3474dcaf5acd27)
+ * (GenCodeChecksum:77bfa18590c85ad7b6430c018acd508c)
  */
 
 /**
@@ -300,9 +300,12 @@ class CRM_Core_DAO_ActionSchedule extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Action Schedules');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Action Schedules') : ts('Action Schedule');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Address.php b/civicrm/CRM/Core/DAO/Address.php
index 7151847db2f9c41fe4745643fc994f2bf2180648..257de9924f398f2ca97b359d5d610a626b28d447 100644
--- a/civicrm/CRM/Core/DAO/Address.php
+++ b/civicrm/CRM/Core/DAO/Address.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Address.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a6b8f21dd3839de1ce1273e0910f0c8c)
+ * (GenCodeChecksum:01b95dc4df972f40d718b61c77cd3b58)
  */
 
 /**
@@ -250,9 +250,12 @@ class CRM_Core_DAO_Address extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Addresses');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Addresses') : ts('Address');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/AddressFormat.php b/civicrm/CRM/Core/DAO/AddressFormat.php
index 762b90b6a177136e61d4353dd7e0fb57a35f0251..d1c1d088427b811ca49e9facd74197e1453c217e 100644
--- a/civicrm/CRM/Core/DAO/AddressFormat.php
+++ b/civicrm/CRM/Core/DAO/AddressFormat.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/AddressFormat.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:1ce11647576d05acfc364969eddfcce4)
+ * (GenCodeChecksum:7cc2864a78be48031ca829de49afeef6)
  */
 
 /**
@@ -54,9 +54,12 @@ class CRM_Core_DAO_AddressFormat extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Address Formats');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Address Formats') : ts('Address Format');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/AllCoreTables.data.php b/civicrm/CRM/Core/DAO/AllCoreTables.data.php
index fcf35a9eed48de57689ec135ddc6eab43153c15c..fdbda3a704c390e436fbbfa211c3313822355187 100644
--- a/civicrm/CRM/Core/DAO/AllCoreTables.data.php
+++ b/civicrm/CRM/Core/DAO/AllCoreTables.data.php
@@ -77,6 +77,11 @@ return [
     'class' => 'CRM_ACL_DAO_ACL',
     'table' => 'civicrm_acl',
   ],
+  'CRM_ACL_DAO_ACLCache' => [
+    'name' => 'ACLCache',
+    'class' => 'CRM_ACL_DAO_ACLCache',
+    'table' => 'civicrm_acl_cache',
+  ],
   'CRM_ACL_DAO_EntityRole' => [
     'name' => 'EntityRole',
     'class' => 'CRM_ACL_DAO_EntityRole',
@@ -392,11 +397,6 @@ return [
     'class' => 'CRM_Core_DAO_StatusPreference',
     'table' => 'civicrm_status_pref',
   ],
-  'CRM_ACL_DAO_ACLCache' => [
-    'name' => 'ACLCache',
-    'class' => 'CRM_ACL_DAO_ACLCache',
-    'table' => 'civicrm_acl_cache',
-  ],
   'CRM_Contact_DAO_Group' => [
     'name' => 'Group',
     'class' => 'CRM_Contact_DAO_Group',
diff --git a/civicrm/CRM/Core/DAO/AllCoreTables.php b/civicrm/CRM/Core/DAO/AllCoreTables.php
index 5b9ffe5ef671d0e04d169fad4574684851530a57..9e4970c301d4cab08919e72b55cce99f8e18d294 100644
--- a/civicrm/CRM/Core/DAO/AllCoreTables.php
+++ b/civicrm/CRM/Core/DAO/AllCoreTables.php
@@ -280,7 +280,7 @@ class CRM_Core_DAO_AllCoreTables {
    * Get the classname for the table.
    *
    * @param string $tableName
-   * @return string
+   * @return string|CRM_Core_DAO|NULL
    */
   public static function getClassForTable($tableName) {
     //CRM-19677: on multilingual setup, trim locale from $tableName to fetch class name
@@ -296,7 +296,7 @@ class CRM_Core_DAO_AllCoreTables {
    *
    * @param string $daoName
    *   Ex: 'Contact'.
-   * @return CRM_Core_DAO|NULL
+   * @return string|CRM_Core_DAO|NULL
    *   Ex: 'CRM_Contact_DAO_Contact'.
    */
   public static function getFullName($daoName) {
diff --git a/civicrm/CRM/Core/DAO/Cache.php b/civicrm/CRM/Core/DAO/Cache.php
index 01bc33ea91c53c34348d14bf780e11976cf54ed2..f8366cb2d037f34c0b72202d0bc182702d34c16c 100644
--- a/civicrm/CRM/Core/DAO/Cache.php
+++ b/civicrm/CRM/Core/DAO/Cache.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Cache.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:af1401f844c699c6ad35366a32a8db03)
+ * (GenCodeChecksum:bafe6ce2f7fd94b2581bfc4dad813130)
  */
 
 /**
@@ -89,9 +89,12 @@ class CRM_Core_DAO_Cache extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Caches');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Caches') : ts('Cache');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Component.php b/civicrm/CRM/Core/DAO/Component.php
index f9b7b077f9ad6a15942caa88643cf4fe129c9962..f1d560b656b6518ab3f2d9a14b452e4935df106f 100644
--- a/civicrm/CRM/Core/DAO/Component.php
+++ b/civicrm/CRM/Core/DAO/Component.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Component.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6c3fd2c8e875746c0ceffa499624f77c)
+ * (GenCodeChecksum:a5136517000cfab182cdacc3130bc29c)
  */
 
 /**
@@ -61,9 +61,12 @@ class CRM_Core_DAO_Component extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Components');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Components') : ts('Component');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Country.php b/civicrm/CRM/Core/DAO/Country.php
index 24d458b99cef0c31da41f71899cfa516e5b50612..b91e0062fb23137743f151c95de8058a4d2fd854 100644
--- a/civicrm/CRM/Core/DAO/Country.php
+++ b/civicrm/CRM/Core/DAO/Country.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Country.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:cdd80b394924586274cf4b91183d3637)
+ * (GenCodeChecksum:2215bb79c9fe62c60700f232598a9462)
  */
 
 /**
@@ -103,9 +103,12 @@ class CRM_Core_DAO_Country extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Countries');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Countries') : ts('Country');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/County.php b/civicrm/CRM/Core/DAO/County.php
index 97d2fae58ea13c74485b2ab7c3547072d5095648..9b05e4bee6ccfee332df35512c689e35f7f88d90 100644
--- a/civicrm/CRM/Core/DAO/County.php
+++ b/civicrm/CRM/Core/DAO/County.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/County.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:96f94dbbafff9a4e1f0ff276799fcbbd)
+ * (GenCodeChecksum:5620d2136c764c786eef1c15853eaf9b)
  */
 
 /**
@@ -68,9 +68,12 @@ class CRM_Core_DAO_County extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Counties');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Counties') : ts('County');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/CustomField.php b/civicrm/CRM/Core/DAO/CustomField.php
index 698d34a4956dcf58c98788594edcc6003ee43d1c..a453096360b9319df1479f9d88a298c149fd3b10 100644
--- a/civicrm/CRM/Core/DAO/CustomField.php
+++ b/civicrm/CRM/Core/DAO/CustomField.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/CustomField.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4ded3c0d1a8e34502a5957ee74c4480a)
+ * (GenCodeChecksum:3a8f6978ec00d7e2cff93f2915ac1f48)
  */
 
 /**
@@ -257,9 +257,12 @@ class CRM_Core_DAO_CustomField extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Custom Fields');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Custom Fields') : ts('Custom Field');
   }
 
   /**
@@ -365,6 +368,7 @@ class CRM_Core_DAO_CustomField extends CRM_Core_DAO {
           'localizable' => 0,
           'html' => [
             'type' => 'Select',
+            'label' => ts("Data Type"),
           ],
           'pseudoconstant' => [
             'callback' => 'CRM_Core_BAO_CustomField::dataType',
@@ -384,6 +388,10 @@ class CRM_Core_DAO_CustomField extends CRM_Core_DAO {
           'entity' => 'CustomField',
           'bao' => 'CRM_Core_BAO_CustomField',
           'localizable' => 0,
+          'html' => [
+            'type' => 'Select',
+            'label' => ts("Field Input Type"),
+          ],
           'pseudoconstant' => [
             'callback' => 'CRM_Core_SelectValues::customHtmlType',
           ],
diff --git a/civicrm/CRM/Core/DAO/CustomGroup.php b/civicrm/CRM/Core/DAO/CustomGroup.php
index 12dd47769ebcc12105696d1b50de33d0fe7be493..8be9d28b24265a1a6d236f771c9df16660c9fe7d 100644
--- a/civicrm/CRM/Core/DAO/CustomGroup.php
+++ b/civicrm/CRM/Core/DAO/CustomGroup.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/CustomGroup.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:494d883be861157d8067e6a6c50c23f6)
+ * (GenCodeChecksum:3436e2a4cf99bd9b7c859170db37bce3)
  */
 
 /**
@@ -194,9 +194,12 @@ class CRM_Core_DAO_CustomGroup extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Custom Groups');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Custom Groups') : ts('Custom Group');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Dashboard.php b/civicrm/CRM/Core/DAO/Dashboard.php
index a9d40d32437c04f176e4a46787d24f6a608e69b0..57773da9dfce5e44c15ed857e720277c772ca9cd 100644
--- a/civicrm/CRM/Core/DAO/Dashboard.php
+++ b/civicrm/CRM/Core/DAO/Dashboard.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Dashboard.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:2d134bfa6938d2e8a8d8e25e99769823)
+ * (GenCodeChecksum:262213759ac6f4c9943f4ebd454256ae)
  */
 
 /**
@@ -115,9 +115,12 @@ class CRM_Core_DAO_Dashboard extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Dashboards');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Dashboards') : ts('Dashboard');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Discount.php b/civicrm/CRM/Core/DAO/Discount.php
index ed2f53e1e1d5e9cdb48909c5ac9af7c5bb5ab8fb..a18cacfb6003801a2352c9d1167a1b9735127477 100644
--- a/civicrm/CRM/Core/DAO/Discount.php
+++ b/civicrm/CRM/Core/DAO/Discount.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Discount.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a23716379d3cccf678a9d8e423690e7c)
+ * (GenCodeChecksum:5fbe08bc556f5b913860a55c6d0cedc4)
  */
 
 /**
@@ -82,9 +82,12 @@ class CRM_Core_DAO_Discount extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Discounts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Discounts') : ts('Discount');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Domain.php b/civicrm/CRM/Core/DAO/Domain.php
index 82ccf0f5a8f9508bb40d0e62b2f2800406f9bd04..ce6b480508f95181ed2eb591b66a0f58ae43b32f 100644
--- a/civicrm/CRM/Core/DAO/Domain.php
+++ b/civicrm/CRM/Core/DAO/Domain.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Domain.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:57a526de0b2bc02fed832a22dc50ad80)
+ * (GenCodeChecksum:99a50c29878792b8864e20d184ce9bbb)
  */
 
 /**
@@ -89,9 +89,12 @@ class CRM_Core_DAO_Domain extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Domains');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Domains') : ts('Domain');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Email.php b/civicrm/CRM/Core/DAO/Email.php
index 7c0a55b812bdbb031ec7904f0752eb9a81ee3a94..4f890d5cf0b0edbb1f5d8d64ff65feb991943521 100644
--- a/civicrm/CRM/Core/DAO/Email.php
+++ b/civicrm/CRM/Core/DAO/Email.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Email.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:866b627595adac9091080a4e4ab146bc)
+ * (GenCodeChecksum:2736b767bcd747315f0382f4e298ad35)
  */
 
 /**
@@ -131,9 +131,12 @@ class CRM_Core_DAO_Email extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Emails');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Emails') : ts('Email');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/EntityFile.php b/civicrm/CRM/Core/DAO/EntityFile.php
index 0d32257d1e18d5c8f5d46a905147ac65011fbcef..e405a0d0d6a6c08a25ebd721661ab4402ea45317 100644
--- a/civicrm/CRM/Core/DAO/EntityFile.php
+++ b/civicrm/CRM/Core/DAO/EntityFile.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/EntityFile.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f2d4dfec2466ad664b4949983b1c7e58)
+ * (GenCodeChecksum:70221552c8c9532b2aaf9cd89e73a68d)
  */
 
 /**
@@ -68,9 +68,12 @@ class CRM_Core_DAO_EntityFile extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Entity Files');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Entity Files') : ts('Entity File');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/EntityTag.php b/civicrm/CRM/Core/DAO/EntityTag.php
index eb2be19b6666f88d5de59b2b0aac0e7f3266d1af..6db35b547c235a5fc360199ba3d14621d8b39fad 100644
--- a/civicrm/CRM/Core/DAO/EntityTag.php
+++ b/civicrm/CRM/Core/DAO/EntityTag.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/EntityTag.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:58f15f695b38fa4cacfdf82d2734e0f0)
+ * (GenCodeChecksum:82e27d87178a408cd0a1c201f3501dd2)
  */
 
 /**
@@ -68,9 +68,12 @@ class CRM_Core_DAO_EntityTag extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Entity Tags');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Entity Tags') : ts('Entity Tag');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Extension.php b/civicrm/CRM/Core/DAO/Extension.php
index c666e3ab0222b5338cbb22a59f118ae5cd61c424..b1fc0de3f60ff8ad9e2c495b906ba742ada64f55 100644
--- a/civicrm/CRM/Core/DAO/Extension.php
+++ b/civicrm/CRM/Core/DAO/Extension.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Extension.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:08d2151b75e68f334bd88475b58fab7b)
+ * (GenCodeChecksum:46f6ff725b1ad9909d2340d728438d36)
  */
 
 /**
@@ -94,9 +94,12 @@ class CRM_Core_DAO_Extension extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Extensions');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Extensions') : ts('Extension');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/File.php b/civicrm/CRM/Core/DAO/File.php
index dc6508d4a6e48fe001f6e36370e7970094a18448..620734811c1e8ccfa813bd02d5b3208889d56179 100644
--- a/civicrm/CRM/Core/DAO/File.php
+++ b/civicrm/CRM/Core/DAO/File.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/File.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:aa0883a815a43dd250612348f3ec470e)
+ * (GenCodeChecksum:dd8a70727f67481339dd514fdca6aae5)
  */
 
 /**
@@ -96,9 +96,12 @@ class CRM_Core_DAO_File extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Files');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Files') : ts('File');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/IM.php b/civicrm/CRM/Core/DAO/IM.php
index 958b4dda190c5e123d76685c1d6ad163c543240d..fdc40df188c436c77bb38be31d33594cdccb347c 100644
--- a/civicrm/CRM/Core/DAO/IM.php
+++ b/civicrm/CRM/Core/DAO/IM.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/IM.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:da6b080a31b208a71635d272fabab7ec)
+ * (GenCodeChecksum:f64b9a15f4a240d7a137cb5655feb696)
  */
 
 /**
@@ -96,9 +96,12 @@ class CRM_Core_DAO_IM extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Instant Messaging');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Instant Messaging') : ts('Instant Messaging');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Job.php b/civicrm/CRM/Core/DAO/Job.php
index ebdb62818e4e9a77330b8a13efeb1ddf57d0fc03..cbc870082e443b171089aa37bf8a164d4ba4e3bb 100644
--- a/civicrm/CRM/Core/DAO/Job.php
+++ b/civicrm/CRM/Core/DAO/Job.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Job.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6e3a5de515fda550b1b5aeb493c50f0b)
+ * (GenCodeChecksum:bbc36abe96310ec5cf23d46d2d1728cb)
  */
 
 /**
@@ -117,9 +117,12 @@ class CRM_Core_DAO_Job extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Jobs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Jobs') : ts('Job');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/JobLog.php b/civicrm/CRM/Core/DAO/JobLog.php
index b59a98b1f5b2c5f509febbd870024fe0bc57c72c..51db9714637f98acc8acdad9cf99874c179e97c0 100644
--- a/civicrm/CRM/Core/DAO/JobLog.php
+++ b/civicrm/CRM/Core/DAO/JobLog.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/JobLog.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:eca8e7af1026dbfaf7beecb95ce02361)
+ * (GenCodeChecksum:74e191eba977eb496bae109ca9720ab7)
  */
 
 /**
@@ -96,9 +96,12 @@ class CRM_Core_DAO_JobLog extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Job Logs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Job Logs') : ts('Job Log');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/LocBlock.php b/civicrm/CRM/Core/DAO/LocBlock.php
index 154a2e776c611457313b7891800c34bfe2a1d868..2eca88b4b625f4792d70a00d5c5fe4be673bd4de 100644
--- a/civicrm/CRM/Core/DAO/LocBlock.php
+++ b/civicrm/CRM/Core/DAO/LocBlock.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/LocBlock.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8459c5a6d25e5c70e44de49b109a82fa)
+ * (GenCodeChecksum:801a2e7e05f688cf38882b466f22a292)
  */
 
 /**
@@ -87,9 +87,12 @@ class CRM_Core_DAO_LocBlock extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Loc Blocks');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Loc Blocks') : ts('Loc Block');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/LocationType.php b/civicrm/CRM/Core/DAO/LocationType.php
index 70648f67db31fbe838d863c08ef0e13b3fa679a5..3427ba89b38bb95514a8ce766a215f2e00ccda2d 100644
--- a/civicrm/CRM/Core/DAO/LocationType.php
+++ b/civicrm/CRM/Core/DAO/LocationType.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/LocationType.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:325ccb933339bc909efc7d6b60c7186b)
+ * (GenCodeChecksum:450719aeeb146b60007152d03e0b6faf)
  */
 
 /**
@@ -96,9 +96,12 @@ class CRM_Core_DAO_LocationType extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Location Types');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Location Types') : ts('Location Type');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Log.php b/civicrm/CRM/Core/DAO/Log.php
index 182d42f5d40e5979f3dd592939d85079a18213b4..b550b04515c63e1bfe89c4cd0b668f650e5c648a 100644
--- a/civicrm/CRM/Core/DAO/Log.php
+++ b/civicrm/CRM/Core/DAO/Log.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Log.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:5dfdb2863ba1bc7b84288a522cdaef51)
+ * (GenCodeChecksum:3b97d17eeaa407d9f7f7aa6e1d819090)
  */
 
 /**
@@ -82,9 +82,12 @@ class CRM_Core_DAO_Log extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Logs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Logs') : ts('Log');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/MailSettings.php b/civicrm/CRM/Core/DAO/MailSettings.php
index acc8278c190423109dc960345d58cb4c9e33bb72..86b0d72cd23fdc69cbcbd880c1b5cfcee74a7de0 100644
--- a/civicrm/CRM/Core/DAO/MailSettings.php
+++ b/civicrm/CRM/Core/DAO/MailSettings.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/MailSettings.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b43716d8c8e362738d8d3420e8fbe03d)
+ * (GenCodeChecksum:7ce404283a48da50fceaf69d40c58048)
  */
 
 /**
@@ -135,6 +135,18 @@ class CRM_Core_DAO_MailSettings extends CRM_Core_DAO {
    */
   public $activity_status;
 
+  /**
+   * Enabling this option will have CiviCRM skip any emails that do not have the Case ID or Case Hash so that the system will only process emails that can be placed on case records. Any emails that are not processed will be moved to the ignored folder.
+   *
+   * @var bool
+   */
+  public $is_non_case_email_skipped;
+
+  /**
+   * @var bool
+   */
+  public $is_contact_creation_disabled_if_no_match;
+
   /**
    * Class constructor.
    */
@@ -145,9 +157,12 @@ class CRM_Core_DAO_MailSettings extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Mail Settingses');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Mail Settingses') : ts('Mail Settings');
   }
 
   /**
@@ -396,6 +411,37 @@ class CRM_Core_DAO_MailSettings extends CRM_Core_DAO {
           ],
           'add' => '4.7',
         ],
+        'is_non_case_email_skipped' => [
+          'name' => 'is_non_case_email_skipped',
+          'type' => CRM_Utils_Type::T_BOOLEAN,
+          'title' => ts('Skip emails which do not have a Case ID or Case hash'),
+          'description' => ts('Enabling this option will have CiviCRM skip any emails that do not have the Case ID or Case Hash so that the system will only process emails that can be placed on case records. Any emails that are not processed will be moved to the ignored folder.'),
+          'where' => 'civicrm_mail_settings.is_non_case_email_skipped',
+          'default' => '0',
+          'table_name' => 'civicrm_mail_settings',
+          'entity' => 'MailSettings',
+          'bao' => 'CRM_Core_BAO_MailSettings',
+          'localizable' => 0,
+          'html' => [
+            'type' => 'CheckBox',
+          ],
+          'add' => '5.31',
+        ],
+        'is_contact_creation_disabled_if_no_match' => [
+          'name' => 'is_contact_creation_disabled_if_no_match',
+          'type' => CRM_Utils_Type::T_BOOLEAN,
+          'title' => ts('Do not create new contacts when filing emails'),
+          'where' => 'civicrm_mail_settings.is_contact_creation_disabled_if_no_match',
+          'default' => '0',
+          'table_name' => 'civicrm_mail_settings',
+          'entity' => 'MailSettings',
+          'bao' => 'CRM_Core_BAO_MailSettings',
+          'localizable' => 0,
+          'html' => [
+            'type' => 'CheckBox',
+          ],
+          'add' => '5.31',
+        ],
       ];
       CRM_Core_DAO_AllCoreTables::invoke(__CLASS__, 'fields_callback', Civi::$statics[__CLASS__]['fields']);
     }
diff --git a/civicrm/CRM/Core/DAO/Managed.php b/civicrm/CRM/Core/DAO/Managed.php
index 212817ec7860199c70106ef5e58520302f432bee..a67271247cbef168e0a44f7beaf5caa294978c0d 100644
--- a/civicrm/CRM/Core/DAO/Managed.php
+++ b/civicrm/CRM/Core/DAO/Managed.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Managed.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e6146e35f8c8321e600a4198cbd6949e)
+ * (GenCodeChecksum:119de7e386aa83b1ca5038a1e409aafe)
  */
 
 /**
@@ -82,9 +82,12 @@ class CRM_Core_DAO_Managed extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Manageds');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Manageds') : ts('Managed');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Mapping.php b/civicrm/CRM/Core/DAO/Mapping.php
index 59505d1d5fb0ade1c846554322ecd57b50f377ef..3c7639a857d5406dc87307fc825cdaee263d6481 100644
--- a/civicrm/CRM/Core/DAO/Mapping.php
+++ b/civicrm/CRM/Core/DAO/Mapping.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Mapping.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c97b13ea2aaccdf8ba13b6552ccb59f2)
+ * (GenCodeChecksum:49336d40a24f0312944123741932dd25)
  */
 
 /**
@@ -68,9 +68,12 @@ class CRM_Core_DAO_Mapping extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Mappings');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Mappings') : ts('Mapping');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/MappingField.php b/civicrm/CRM/Core/DAO/MappingField.php
index cd5f06e741b4969d8f6c9194cf12c558d941f1be..bfe139eda99242d2bd45573ed7c37a4576908249 100644
--- a/civicrm/CRM/Core/DAO/MappingField.php
+++ b/civicrm/CRM/Core/DAO/MappingField.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/MappingField.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:3702a3c3cb9cd696eb829d15f4676439)
+ * (GenCodeChecksum:7197da108e5452be6ab8b419a1506aec)
  */
 
 /**
@@ -137,9 +137,12 @@ class CRM_Core_DAO_MappingField extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Mapping Fields');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Mapping Fields') : ts('Mapping Field');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Menu.php b/civicrm/CRM/Core/DAO/Menu.php
index 98f3f4ad1491e196def19bf19f93fab70a2fde00..3fb9a797c3e08ef5dd52c917e09ce7619849c529 100644
--- a/civicrm/CRM/Core/DAO/Menu.php
+++ b/civicrm/CRM/Core/DAO/Menu.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Menu.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8be7941b4dccb08266109e3e1599159f)
+ * (GenCodeChecksum:b94ecc10dafe21deb7e5067ef46f32af)
  */
 
 /**
@@ -190,9 +190,12 @@ class CRM_Core_DAO_Menu extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Menus');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Menus') : ts('Menu');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/MessageTemplate.php b/civicrm/CRM/Core/DAO/MessageTemplate.php
index 5c7965c83f83e91cc309268fa5289dbd8548c5e4..f3da47e578b71f353bd6e7a9102580e214cc90b3 100644
--- a/civicrm/CRM/Core/DAO/MessageTemplate.php
+++ b/civicrm/CRM/Core/DAO/MessageTemplate.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/MessageTemplate.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:68dd4ac3c9f098e3577dbed8d5a2a105)
+ * (GenCodeChecksum:6881b34cbbefc06722c58fe7f20b1c58)
  */
 
 /**
@@ -120,9 +120,12 @@ class CRM_Core_DAO_MessageTemplate extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Message Templates');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Message Templates') : ts('Message Template');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Navigation.php b/civicrm/CRM/Core/DAO/Navigation.php
index b567777810a4405d38851f507252262671f64af7..ed52b19610f37387c71cb0a40755d9e27646fde2 100644
--- a/civicrm/CRM/Core/DAO/Navigation.php
+++ b/civicrm/CRM/Core/DAO/Navigation.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Navigation.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:34c3d3b834400b49f1b8c6c99a08c99e)
+ * (GenCodeChecksum:8cc5473f0cd98bf289dc455eefb0af76)
  */
 
 /**
@@ -122,9 +122,12 @@ class CRM_Core_DAO_Navigation extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Navigations');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Navigations') : ts('Navigation');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Note.php b/civicrm/CRM/Core/DAO/Note.php
index 748d1076f18eca09adf58db42d3dad389ec04900..3c730b47ee70318bbc80326a5f526e3d77ab7df3 100644
--- a/civicrm/CRM/Core/DAO/Note.php
+++ b/civicrm/CRM/Core/DAO/Note.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Note.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:86e72396a497a58c1568d0d081435e75)
+ * (GenCodeChecksum:75161cdedcd719f035387c9c1d0d83dd)
  */
 
 /**
@@ -103,9 +103,12 @@ class CRM_Core_DAO_Note extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Notes');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Notes') : ts('Note');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/OpenID.php b/civicrm/CRM/Core/DAO/OpenID.php
index 1a61aba156032d6f376fec6bf0310a2e264e1f87..dfe13c489d5cd092ecd970b4a092ee431c35c721 100644
--- a/civicrm/CRM/Core/DAO/OpenID.php
+++ b/civicrm/CRM/Core/DAO/OpenID.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/OpenID.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4d60933113e2b5330dd8194e7ebe6ae4)
+ * (GenCodeChecksum:7af55174e40a30da959ad7734573eb9a)
  */
 
 /**
@@ -82,9 +82,12 @@ class CRM_Core_DAO_OpenID extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Open IDs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Open IDs') : ts('Open ID');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/OptionGroup.php b/civicrm/CRM/Core/DAO/OptionGroup.php
index 9feb9fd8f107cf13be5610f4976fe49de1929943..76ef9a0bcff1ae9d883c28c8d4f8ff8915b643fe 100644
--- a/civicrm/CRM/Core/DAO/OptionGroup.php
+++ b/civicrm/CRM/Core/DAO/OptionGroup.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/OptionGroup.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:d0011ad2bb6c090eeb86d25916c5624b)
+ * (GenCodeChecksum:e9bb68e874d377a0c30b433103d438d4)
  */
 
 /**
@@ -96,9 +96,12 @@ class CRM_Core_DAO_OptionGroup extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Option Groups');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Option Groups') : ts('Option Group');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/OptionValue.php b/civicrm/CRM/Core/DAO/OptionValue.php
index 7f0c3644f208aa9db0ef521c0f066bb9de23a826..5fb8ddb4521fddd174fc84ec15adaab4ae52fad1 100644
--- a/civicrm/CRM/Core/DAO/OptionValue.php
+++ b/civicrm/CRM/Core/DAO/OptionValue.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/OptionValue.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e51b16ecfe5f8302c8610b7f5dfd55e5)
+ * (GenCodeChecksum:f47024ac081427ddadce4c569934f8a6)
  */
 
 /**
@@ -164,9 +164,12 @@ class CRM_Core_DAO_OptionValue extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Option Values');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Option Values') : ts('Option Value');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Phone.php b/civicrm/CRM/Core/DAO/Phone.php
index 9a6b668620a60c9d0e8d8bbbca940cc6a33e0016..5c0b7816a5c20027ce051e48fcb03df19373274e 100644
--- a/civicrm/CRM/Core/DAO/Phone.php
+++ b/civicrm/CRM/Core/DAO/Phone.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Phone.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:efdb60e03b54f246e73588b6eb99611d)
+ * (GenCodeChecksum:f77d3ef5985c8945730c2fe22bb3fa45)
  */
 
 /**
@@ -117,9 +117,12 @@ class CRM_Core_DAO_Phone extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Phones');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Phones') : ts('Phone');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/PreferencesDate.php b/civicrm/CRM/Core/DAO/PreferencesDate.php
index b1d08e7cd045d04aacab815891eba79b58b35701..78fa11538f443257dd6bd8a406d38536eb3e1a95 100644
--- a/civicrm/CRM/Core/DAO/PreferencesDate.php
+++ b/civicrm/CRM/Core/DAO/PreferencesDate.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/PreferencesDate.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:21383b05b8c8e98ed1721aab06031907)
+ * (GenCodeChecksum:d0de29e655d17a479ec8cfc762582c39)
  */
 
 /**
@@ -87,9 +87,12 @@ class CRM_Core_DAO_PreferencesDate extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Preferences Dates');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Preferences Dates') : ts('Preferences Date');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/PrevNextCache.php b/civicrm/CRM/Core/DAO/PrevNextCache.php
index a39549db9e6c467e88ef7eefa66dd14b9feb57ef..258e3ef5c403f749302a6e7ebd01e2e93c55569c 100644
--- a/civicrm/CRM/Core/DAO/PrevNextCache.php
+++ b/civicrm/CRM/Core/DAO/PrevNextCache.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/PrevNextCache.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8086ffe55554b0fba698136fd6dee894)
+ * (GenCodeChecksum:325d605774498631dd0a2742963d1032)
  */
 
 /**
@@ -85,9 +85,12 @@ class CRM_Core_DAO_PrevNextCache extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Prev Next Caches');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Prev Next Caches') : ts('Prev Next Cache');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/PrintLabel.php b/civicrm/CRM/Core/DAO/PrintLabel.php
index 129e80804da9c2a2c7a5bd52aaf16ec8bbf38b5b..97575a87dd917e372201c36a326dec6beb9a64e7 100644
--- a/civicrm/CRM/Core/DAO/PrintLabel.php
+++ b/civicrm/CRM/Core/DAO/PrintLabel.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/PrintLabel.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:484a16ebc1b881e7718bfcf139024ee7)
+ * (GenCodeChecksum:9612aababed43ba4eaacc71a727c5ed9)
  */
 
 /**
@@ -115,9 +115,12 @@ class CRM_Core_DAO_PrintLabel extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Print Labels');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Print Labels') : ts('Print Label');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/RecurringEntity.php b/civicrm/CRM/Core/DAO/RecurringEntity.php
index d22aa96ac773d2b782c7236cbda2939ccd5c5516..1cffe8c273d422715e5a1d9759a6d2cf16e2fc7f 100644
--- a/civicrm/CRM/Core/DAO/RecurringEntity.php
+++ b/civicrm/CRM/Core/DAO/RecurringEntity.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/RecurringEntity.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b78474c715335f7689a9a5fcdcb5718e)
+ * (GenCodeChecksum:2667b60a5f917352d52964de09cf85fa)
  */
 
 /**
@@ -73,9 +73,12 @@ class CRM_Core_DAO_RecurringEntity extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Recurring Entities');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Recurring Entities') : ts('Recurring Entity');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Setting.php b/civicrm/CRM/Core/DAO/Setting.php
index 160f781cda0f36f080989606a55240bffd23260d..4fb42fd82a45f528f58a48a0a505baac834fc950 100644
--- a/civicrm/CRM/Core/DAO/Setting.php
+++ b/civicrm/CRM/Core/DAO/Setting.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Setting.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c1fda2807e8265021ffaa490325a7e4f)
+ * (GenCodeChecksum:24ec63102452f5cdff8424b5caf8b679)
  */
 
 /**
@@ -101,9 +101,12 @@ class CRM_Core_DAO_Setting extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Settings');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Settings') : ts('Setting');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/StateProvince.php b/civicrm/CRM/Core/DAO/StateProvince.php
index 80a91c2e1f15debe29d19e8be6370a09f7f877e2..e376f57c6555637f078dcdea41c26e7455e716f1 100644
--- a/civicrm/CRM/Core/DAO/StateProvince.php
+++ b/civicrm/CRM/Core/DAO/StateProvince.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/StateProvince.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:2dced9a7a3e6be3d05ea7b7babe4b113)
+ * (GenCodeChecksum:504a7092bbd803d38b7f0fb91756bede)
  */
 
 /**
@@ -68,9 +68,12 @@ class CRM_Core_DAO_StateProvince extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('State Provinces');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('States/Provinces') : ts('State/Province');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/StatusPreference.php b/civicrm/CRM/Core/DAO/StatusPreference.php
index b06b206f24836be57396a808f7f8b63158e4d610..e5654e60147c83755916dd131d98d28869ee90c6 100644
--- a/civicrm/CRM/Core/DAO/StatusPreference.php
+++ b/civicrm/CRM/Core/DAO/StatusPreference.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/StatusPreference.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:1fa80acc24bcb14df3947cba2daa930f)
+ * (GenCodeChecksum:7c7deea1bd07dccee5a5bae0b1d6c4c7)
  */
 
 /**
@@ -96,9 +96,12 @@ class CRM_Core_DAO_StatusPreference extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Status Preferences');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Status Preferences') : ts('Status Preference');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/SystemLog.php b/civicrm/CRM/Core/DAO/SystemLog.php
index c18ee55ebca7dd4faa51523d4b4a31c9d9d98781..d3cc2ec3588086931d1cf7df89b5379dace258ed 100644
--- a/civicrm/CRM/Core/DAO/SystemLog.php
+++ b/civicrm/CRM/Core/DAO/SystemLog.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/SystemLog.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:46d7f317ffb5d01d9cb22898ce38abb3)
+ * (GenCodeChecksum:3765c5a89ca1e9ff224fbd49e31a4037)
  */
 
 /**
@@ -89,9 +89,12 @@ class CRM_Core_DAO_SystemLog extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('System Logs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('System Logs') : ts('System Log');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Tag.php b/civicrm/CRM/Core/DAO/Tag.php
index 65ae7a378b80abf5e8ce5bd8d2110b4f3b7853a2..15078e57da7ef54f27926895822cbe6d84a753ff 100644
--- a/civicrm/CRM/Core/DAO/Tag.php
+++ b/civicrm/CRM/Core/DAO/Tag.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Tag.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7a2eb010fd96445604104b6ada9c0b99)
+ * (GenCodeChecksum:8a5eeefa40273898a4e3661b1ef43b3d)
  */
 
 /**
@@ -118,9 +118,12 @@ class CRM_Core_DAO_Tag extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Tags');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Tags') : ts('Tag');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Timezone.php b/civicrm/CRM/Core/DAO/Timezone.php
index 5f9abdfc6c34bb51d37ece90343520cc7d1b4a0b..bae04f5e2d28660e5994b551742ff7d30d3dcd33 100644
--- a/civicrm/CRM/Core/DAO/Timezone.php
+++ b/civicrm/CRM/Core/DAO/Timezone.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Timezone.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:fb1089cb65c1587b1242b9d250c664f7)
+ * (GenCodeChecksum:b49b5541f20c732fc7ff4cdc3687899b)
  */
 
 /**
@@ -80,9 +80,12 @@ class CRM_Core_DAO_Timezone extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Timezones');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Timezones') : ts('Timezone');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/UFField.php b/civicrm/CRM/Core/DAO/UFField.php
index a112e1c6f32f156dbe83f04b2d37f6eb8115be10..87cde6f32d88ddb55373560b733a986828099164 100644
--- a/civicrm/CRM/Core/DAO/UFField.php
+++ b/civicrm/CRM/Core/DAO/UFField.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/UFField.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:e717ec384cfe13629b4fc440af2a99d5)
+ * (GenCodeChecksum:1cf845aa31eed1a29bffcd4404862f6a)
  */
 
 /**
@@ -173,9 +173,12 @@ class CRM_Core_DAO_UFField extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('UFFields');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('UFFields') : ts('UFField');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/UFGroup.php b/civicrm/CRM/Core/DAO/UFGroup.php
index ae79d22da8e8343abe11e7d94e866bbf7d690beb..89d25b997ee094e3df91abdcdc0e553c7825c7dd 100644
--- a/civicrm/CRM/Core/DAO/UFGroup.php
+++ b/civicrm/CRM/Core/DAO/UFGroup.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/UFGroup.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:1cac6e6b80a630f69ce25f709a20e4a3)
+ * (GenCodeChecksum:e33df676b4e3ae50e18f1c44e437e3ea)
  */
 
 /**
@@ -227,9 +227,12 @@ class CRM_Core_DAO_UFGroup extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('UFGroups');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('UFGroups') : ts('UFGroup');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/UFJoin.php b/civicrm/CRM/Core/DAO/UFJoin.php
index 98639423b142cbc65deae012b9a98c4eaec1e5e3..28f3f56340ba6631daf5229b475e2bff2b72e137 100644
--- a/civicrm/CRM/Core/DAO/UFJoin.php
+++ b/civicrm/CRM/Core/DAO/UFJoin.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/UFJoin.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:191143bced279d48cf34cdf6cf85a5fb)
+ * (GenCodeChecksum:4bcf2b3e5905f98d83d449b1226903da)
  */
 
 /**
@@ -96,9 +96,12 @@ class CRM_Core_DAO_UFJoin extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('UFJoins');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('UFJoins') : ts('UFJoin');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/UFMatch.php b/civicrm/CRM/Core/DAO/UFMatch.php
index fa08f60b222fc97675444b17341dc41929e2df83..6a5d32b772a034288a6e2c90643ce2b2d92af980 100644
--- a/civicrm/CRM/Core/DAO/UFMatch.php
+++ b/civicrm/CRM/Core/DAO/UFMatch.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/UFMatch.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4fca2151c2ecbd762ac9e2f067f0030f)
+ * (GenCodeChecksum:613e38722266d0117e69f521e4f0d140)
  */
 
 /**
@@ -82,9 +82,12 @@ class CRM_Core_DAO_UFMatch extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('UFMatches');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('UFMatches') : ts('UFMatch');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Website.php b/civicrm/CRM/Core/DAO/Website.php
index e9415359c1143aced76d2b52b5caa65511a2b136..aed21d3676e19c2e9101703d554c004fc9408131 100644
--- a/civicrm/CRM/Core/DAO/Website.php
+++ b/civicrm/CRM/Core/DAO/Website.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Website.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:9e449b1f3a997b63c79066bd5cd782ae)
+ * (GenCodeChecksum:1d9c6cf4e3d809a3b3f5963ccb189e83)
  */
 
 /**
@@ -75,9 +75,12 @@ class CRM_Core_DAO_Website extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Websites');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Websites') : ts('Website');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/WordReplacement.php b/civicrm/CRM/Core/DAO/WordReplacement.php
index 65ac087b554357b7f7e862727dc7047e9bd2a0d4..691291abcfc155cdfc5458e9ac887f3fe8d7edeb 100644
--- a/civicrm/CRM/Core/DAO/WordReplacement.php
+++ b/civicrm/CRM/Core/DAO/WordReplacement.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/WordReplacement.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f4afc331da543068dba6d243d98b8e39)
+ * (GenCodeChecksum:104090c38770547ffa491fccdf299765)
  */
 
 /**
@@ -80,9 +80,12 @@ class CRM_Core_DAO_WordReplacement extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Word Replacements');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Word Replacements') : ts('Word Replacement');
   }
 
   /**
diff --git a/civicrm/CRM/Core/DAO/Worldregion.php b/civicrm/CRM/Core/DAO/Worldregion.php
index 1dd866013d6030c445f68c7d73acaeb18eb8dee8..0974aecff55c88c7ad993b18356964a8ec61d40a 100644
--- a/civicrm/CRM/Core/DAO/Worldregion.php
+++ b/civicrm/CRM/Core/DAO/Worldregion.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Core/Worldregion.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0312ba4169a285839ec54d655ff5ceb3)
+ * (GenCodeChecksum:af9fba05839764ec479cc5fad738390a)
  */
 
 /**
@@ -54,9 +54,12 @@ class CRM_Core_DAO_Worldregion extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Worldregions');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Worldregions') : ts('Worldregion');
   }
 
   /**
diff --git a/civicrm/CRM/Core/Error.php b/civicrm/CRM/Core/Error.php
index 98d1a29ded926a09bd22b8fa503e151b9f560f7a..ec287600277dac29c2f4e07671972240b329c832 100644
--- a/civicrm/CRM/Core/Error.php
+++ b/civicrm/CRM/Core/Error.php
@@ -529,11 +529,14 @@ class CRM_Core_Error extends PEAR_ErrorStack {
         $out = "\$$variable_name = $out";
       }
       else {
-        // use var_dump
-        ob_start();
-        var_dump($variable);
-        $dump = ob_get_contents();
-        ob_end_clean();
+        // Use Symfony var-dumper to avoid circular references that exhaust
+        // memory when using var_dump().
+        // Use its CliDumper since if we use the simpler `dump()` then it
+        // comes out as some overly decorated html which is hard to read.
+        $dump = (new \Symfony\Component\VarDumper\Dumper\CliDumper('php://output'))
+          ->dump(
+            (new \Symfony\Component\VarDumper\Cloner\VarCloner())->cloneVar($variable),
+            TRUE);
         $out = "\n\$$variable_name = $dump";
       }
       // reset if it is an array
@@ -608,7 +611,7 @@ class CRM_Core_Error extends PEAR_ErrorStack {
       CRM_Core_Error::backtrace($string, TRUE);
     }
     elseif (CIVICRM_DEBUG_LOG_QUERY) {
-      CRM_Core_Error::debug_var('Query', $string, TRUE, TRUE, 'sql_log', PEAR_LOG_DEBUG);
+      CRM_Core_Error::debug_var('Query', $string, TRUE, TRUE, 'sql_log' . CIVICRM_DEBUG_LOG_QUERY, PEAR_LOG_DEBUG);
     }
   }
 
diff --git a/civicrm/CRM/Core/Form.php b/civicrm/CRM/Core/Form.php
index 98526b5a8198102ab15a687c1b8f98faed0d2a9f..28417580e3507f686f23f685551c5c31e9c4a246 100644
--- a/civicrm/CRM/Core/Form.php
+++ b/civicrm/CRM/Core/Form.php
@@ -350,7 +350,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
    * @param string $type
    * @param string $name
    * @param string $label
-   * @param string|array $attributes (options for select elements)
+   * @param array $attributes (options for select elements)
    * @param bool $required
    * @param array $extra
    *   (attributes for select elements).
@@ -364,11 +364,18 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
    */
   public function &add(
     $type, $name, $label = '',
-    $attributes = '', $required = FALSE, $extra = NULL
+    $attributes = NULL, $required = FALSE, $extra = NULL
   ) {
     if ($type === 'radio') {
       CRM_Core_Error::deprecatedFunctionWarning('CRM_Core_Form::addRadio');
     }
+
+    if ($type !== 'static' && $attributes && !is_array($attributes)) {
+      // The $attributes param used to allow for strings and would default to an
+      // empty string.  However, now that the variable is heavily manipulated,
+      // we should expect it to always be an array.
+      Civi::log()->warning('Attributes passed to CRM_Core_Form::add() are not an array.', ['civi.tag' => 'deprecated']);
+    }
     // Fudge some extra types that quickform doesn't support
     $inputType = $type;
     if ($type == 'wysiwyg' || in_array($type, self::$html5Types)) {
@@ -413,7 +420,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
 
       $attributes['data-crm-datepicker'] = json_encode((array) $extra);
       if (!empty($attributes['aria-label']) || $label) {
-        $attributes['aria-label'] = CRM_Utils_Array::value('aria-label', $attributes, $label);
+        $attributes['aria-label'] = $attributes['aria-label'] ?? $label;
       }
       $type = "text";
     }
@@ -429,7 +436,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
       // Add placeholder option for select
       if (isset($extra['placeholder'])) {
         if ($extra['placeholder'] === TRUE) {
-          $extra['placeholder'] = $required ? ts('- select -') : ts('- none -');
+          $extra['placeholder'] = ts('- select %1 -', [1 => $label]);
         }
         if (($extra['placeholder'] || $extra['placeholder'] === '') && empty($extra['multiple']) && is_array($attributes) && !isset($attributes[''])) {
           $attributes = ['' => $extra['placeholder']] + $attributes;
@@ -668,6 +675,13 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
 
       $attrs = ['class' => 'crm-form-submit'] + (array) CRM_Utils_Array::value('js', $button);
 
+      // A lot of forms use the hacky method of looking at
+      // `$params['button name']` (dating back to them being inputs with a
+      // "value" of the button label) rather than looking at
+      // `$this->controller->getButtonName()`. It makes sense to give buttons a
+      // value by default as a precaution.
+      $attrs['value'] = 1;
+
       if (!empty($button['class'])) {
         $attrs['class'] .= ' ' . $button['class'];
       }
@@ -686,7 +700,8 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
       }
 
       if ($button['type'] === 'reset') {
-        $prevnext[] = $this->createElement($button['type'], 'reset', $button['name'], $attrs);
+        $attrs['type'] = 'reset';
+        $prevnext[] = $this->createElement('xbutton', 'reset', $button['name'], $attrs);
       }
       else {
         if (!empty($button['subName'])) {
@@ -704,12 +719,11 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
         if (in_array($button['type'], ['next', 'upload', 'done']) && $button['name'] === ts('Save')) {
           $attrs['accesskey'] = 'S';
         }
-        $icon = CRM_Utils_Array::value('icon', $button, $defaultIcon);
-        if ($icon) {
-          $attrs['crm-icon'] = $icon;
-        }
+        $buttonContents = CRM_Core_Page::crmIcon($button['icon'] ?? $defaultIcon) . ' ' . $button['name'];
         $buttonName = $this->getButtonName($button['type'], CRM_Utils_Array::value('subName', $button));
-        $prevnext[] = $this->createElement('submit', $buttonName, $button['name'], $attrs);
+        $attrs['class'] .= " crm-button crm-button-type-{$button['type']} crm-button{$buttonName}";
+        $attrs['type'] = 'submit';
+        $prevnext[] = $this->createElement('xbutton', $buttonName, $buttonContents, $attrs);
       }
       if (!empty($button['isDefault'])) {
         $this->setDefaultAction($button['type']);
@@ -1197,12 +1211,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
       $optAttributes = $attributes;
       if (!empty($optionAttributes[$key])) {
         foreach ($optionAttributes[$key] as $optAttr => $optVal) {
-          if (!empty($optAttributes[$optAttr])) {
-            $optAttributes[$optAttr] .= ' ' . $optVal;
-          }
-          else {
-            $optAttributes[$optAttr] = $optVal;
-          }
+          $optAttributes[$optAttr] = ltrim(($optAttributes[$optAttr] ?? '') . ' ' . $optVal);
         }
       }
       // We use a class here to avoid html5 issues with collapsed cutsomfield sets.
@@ -1489,8 +1498,8 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
       $info = civicrm_api3($props['entity'], 'getoptions', $props);
       $options = $info['values'];
     }
-    if (!array_key_exists('placeholder', $props)) {
-      $props['placeholder'] = $required ? ts('- select -') : (CRM_Utils_Array::value('context', $props) == 'search' ? ts('- any -') : ts('- none -'));
+    if (!array_key_exists('placeholder', $props) && $placeholder = self::selectOrAnyPlaceholder($props, $required)) {
+      $props['placeholder'] = $placeholder;
     }
     // Handle custom field
     if (strpos($name, 'custom_') === 0 && is_numeric($name[7])) {
@@ -1525,6 +1534,38 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
     return $this->add('select', $name, $label, $options, $required, $props);
   }
 
+  /**
+   * Handles a repeated bit supplying a placeholder for entity selection
+   *
+   * @param string $props
+   *   The field properties, including the entity and context.
+   * @param bool $required
+   *   If the field is required.
+   * @param string $title
+   *   A field title, if applicable.
+   * @return string
+   *   The placeholder text.
+   */
+  private static function selectOrAnyPlaceholder($props, $required, $title = NULL) {
+    if (empty($props['entity'])) {
+      return NULL;
+    }
+    if (!$title) {
+      $daoToClass = CRM_Core_DAO_AllCoreTables::daoToClass();
+      if (array_key_exists($props['entity'], $daoToClass)) {
+        $daoClass = $daoToClass[$props['entity']];
+        $title = $daoClass::getEntityTitle();
+      }
+      else {
+        $title = ts('option');
+      }
+    }
+    if (($props['context'] ?? '') == 'search' && !$required) {
+      return ts('- any %1 -', [1 => $title]);
+    }
+    return ts('- select %1 -', [1 => $title]);
+  }
+
   /**
    * Adds a field based on metadata.
    *
@@ -1623,6 +1664,11 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
       }
     }
     $props += CRM_Utils_Array::value('html', $fieldSpec, []);
+    if (in_array($widget, ['Select', 'Select2'])
+      && !array_key_exists('placeholder', $props)
+      && $placeholder = self::selectOrAnyPlaceholder($props, $required, $label)) {
+      $props['placeholder'] = $placeholder;
+    }
     CRM_Utils_Array::remove($props, 'entity', 'name', 'context', 'label', 'action', 'type', 'option_url', 'options');
 
     // TODO: refactor switch statement, to separate methods.
@@ -1681,9 +1727,6 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
       case 'Select':
       case 'Select2':
         $props['class'] = CRM_Utils_Array::value('class', $props, 'big') . ' crm-select2';
-        if (!array_key_exists('placeholder', $props)) {
-          $props['placeholder'] = $required ? ts('- select -') : ($context == 'search' ? ts('- any -') : ts('- none -'));
-        }
         // TODO: Add and/or option for fields that store multiple values
         return $this->add(strtolower($widget), $name, $label, $options, $required, $props);
 
@@ -2052,14 +2095,14 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
   public function addEntityRef($name, $label = '', $props = [], $required = FALSE) {
     // Default properties
     $props['api'] = CRM_Utils_Array::value('api', $props, []);
-    $props['entity'] = CRM_Core_DAO_AllCoreTables::convertEntityNameToCamel(CRM_Utils_Array::value('entity', $props, 'Contact'));
-    $props['class'] = ltrim(CRM_Utils_Array::value('class', $props, '') . ' crm-form-entityref');
+    $props['entity'] = CRM_Core_DAO_AllCoreTables::convertEntityNameToCamel($props['entity'] ?? 'Contact');
+    $props['class'] = ltrim(($props['class'] ?? '') . ' crm-form-entityref');
 
     if (array_key_exists('create', $props) && empty($props['create'])) {
       unset($props['create']);
     }
 
-    $props['placeholder'] = CRM_Utils_Array::value('placeholder', $props, $required ? ts('- select %1 -', [1 => ts(str_replace('_', ' ', $props['entity']))]) : ts('- none -'));
+    $props['placeholder'] = $props['placeholder'] ?? self::selectOrAnyPlaceholder($props, $required);
 
     $defaults = [];
     if (!empty($props['multiple'])) {
@@ -2391,6 +2434,8 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
    * @return HTML_QuickForm_Element
    */
   public function addChainSelect($elementName, $settings = []) {
+    $required = $settings['required'] ?? FALSE;
+    $label = strpos($elementName, 'rovince') ? CRM_Core_DAO_StateProvince::getEntityTitle() : CRM_Core_DAO_County::getEntityTitle();
     $props = $settings += [
       'control_field' => str_replace(['state_province', 'StateProvince', 'county', 'County'], [
         'country',
@@ -2399,15 +2444,15 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
         'StateProvince',
       ], $elementName),
       'data-callback' => strpos($elementName, 'rovince') ? 'civicrm/ajax/jqState' : 'civicrm/ajax/jqCounty',
-      'label' => strpos($elementName, 'rovince') ? ts('State/Province') : ts('County'),
+      'label' => $label,
       'data-empty-prompt' => strpos($elementName, 'rovince') ? ts('Choose country first') : ts('Choose state first'),
       'data-none-prompt' => ts('- N/A -'),
       'multiple' => FALSE,
-      'required' => FALSE,
-      'placeholder' => empty($settings['required']) ? ts('- none -') : ts('- select -'),
+      'required' => $required,
+      'placeholder' => ts('- select %1 -', [1 => $label]),
     ];
     CRM_Utils_Array::remove($props, 'label', 'required', 'control_field', 'context');
-    $props['class'] = (empty($props['class']) ? '' : "{$props['class']} ") . 'crm-select2';
+    $props['class'] = (empty($props['class']) ? '' : "{$props['class']} ") . 'crm-select2' . ($required ? ' required crm-field-required' : '');
     $props['data-select-prompt'] = $props['placeholder'];
     $props['data-name'] = $elementName;
 
@@ -2417,7 +2462,7 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
     // CRM-15225 - normally QF will reject any selected values that are not part of the field's options, but due to a
     // quirk in our patched version of HTML_QuickForm_select, this doesn't happen if the options are NULL
     // which seems a bit dirty but it allows our dynamically-popuplated select element to function as expected.
-    return $this->add('select', $elementName, $settings['label'], NULL, $settings['required'], $props);
+    return $this->add('select', $elementName, $settings['label'], NULL, $required, $props);
   }
 
   /**
@@ -2448,7 +2493,10 @@ class CRM_Core_Form extends HTML_QuickForm_Page {
         $this->_actionButtonName = $this->getButtonName('next', 'action');
       }
       $this->assign('actionButtonName', $this->_actionButtonName);
-      $this->add('submit', $this->_actionButtonName, ts('Go'), ['class' => 'hiddenElement crm-search-go-button']);
+      $this->add('xbutton', $this->_actionButtonName, ts('Go'), [
+        'type' => 'submit',
+        'class' => 'hiddenElement crm-search-go-button',
+      ]);
 
       // Radio to choose "All items" or "Selected items only"
       $selectedRowsRadio = $this->addElement('radio', 'radio_ts', NULL, '', 'ts_sel', ['checked' => 'checked']);
diff --git a/civicrm/CRM/Core/Form/Task.php b/civicrm/CRM/Core/Form/Task.php
index 67ca0537adce8d3db83201b93c60fee21f9583d4..2bc0033da6707fe65734b9516ccb6b6349148583 100644
--- a/civicrm/CRM/Core/Form/Task.php
+++ b/civicrm/CRM/Core/Form/Task.php
@@ -92,12 +92,9 @@ abstract class CRM_Core_Form_Task extends CRM_Core_Form {
   public static function preProcessCommon(&$form) {
     $form->_entityIds = [];
 
-    $searchFormValues = $form->controller->exportValues($form->get('searchFormName'));
+    $searchFormValues = $form->getSearchFormValues();
 
     $form->_task = $searchFormValues['task'];
-    $className = 'CRM_' . ucfirst($form::$entityShortname) . '_Task';
-    $entityTasks = $className::tasks();
-    $form->assign('taskName', $entityTasks[$form->_task]);
 
     $entityIds = [];
     if ($searchFormValues['radio_ts'] == 'ts_sel') {
@@ -251,4 +248,25 @@ SELECT contact_id
     return '';
   }
 
+  /**
+   * Get the submitted values for the form.
+   *
+   * @return array
+   */
+  public function getSearchFormValues() {
+    if ($this->_action === CRM_Core_Action::ADVANCED) {
+      return $this->controller->exportValues('Advanced');
+    }
+    if ($this->_action === CRM_Core_Action::PROFILE) {
+      return $this->controller->exportValues('Builder');
+    }
+    if ($this->_action == CRM_Core_Action::COPY) {
+      return $this->controller->exportValues('Custom');
+    }
+    if ($this->get('entity') !== 'Contact') {
+      return $this->controller->exportValues('Search');
+    }
+    return $this->controller->exportValues('Basic');
+  }
+
 }
diff --git a/civicrm/CRM/Core/Form/Task/PDFLetterCommon.php b/civicrm/CRM/Core/Form/Task/PDFLetterCommon.php
index 49776534e041f81bab4c199583820ac95f0a538a..330e68c0c13b29f5faed98d294107356b33a7c88 100644
--- a/civicrm/CRM/Core/Form/Task/PDFLetterCommon.php
+++ b/civicrm/CRM/Core/Form/Task/PDFLetterCommon.php
@@ -52,7 +52,6 @@ class CRM_Core_Form_Task_PDFLetterCommon {
       FALSE
     );
 
-    $form->add('static', 'pdf_format_header', NULL, ts('Page Format: %1', [1 => '<span class="pdf-format-header-label"></span>']));
     $form->addSelect('format_id', [
       'label' => ts('Select Format'),
       'placeholder' => ts('Default'),
@@ -68,7 +67,6 @@ class CRM_Core_Form_Task_PDFLetterCommon {
       FALSE,
       ['onChange' => "selectPaper( this.value ); showUpdateFormatChkBox();"]
     );
-    $form->add('static', 'paper_dimensions', NULL, ts('Width x Height'));
     $form->add(
       'select',
       'orientation',
diff --git a/civicrm/CRM/Core/I18n/SchemaStructure.php b/civicrm/CRM/Core/I18n/SchemaStructure.php
index 02a51c9a7874743830aacb42da5238c55b6519fa..03fda988b5ff60b694dc55d571dbc63f302bd177 100644
--- a/civicrm/CRM/Core/I18n/SchemaStructure.php
+++ b/civicrm/CRM/Core/I18n/SchemaStructure.php
@@ -92,7 +92,9 @@ class CRM_Core_I18n_SchemaStructure {
           'description' => "text COMMENT 'Optional description.'",
         ],
         'civicrm_group' => [
-          'title' => "varchar(64) COMMENT 'Name of Group.'",
+          'title' => "varchar(255) COMMENT 'Name of Group.'",
+          'frontend_title' => "varchar(255) DEFAULT NULL COMMENT 'Alternative public title for this Group.'",
+          'frontend_description' => "text DEFAULT NULL COMMENT 'Alternative public description of the group.'",
         ],
         'civicrm_contribution_page' => [
           'title' => "varchar(255) COMMENT 'Contribution Page title. For top of page display'",
@@ -413,6 +415,14 @@ class CRM_Core_I18n_SchemaStructure {
           'title' => [
             'type' => "Text",
           ],
+          'frontend_title' => [
+            'type' => "Text",
+          ],
+          'frontend_description' => [
+            'type' => "TextArea",
+            'rows' => "2",
+            'cols' => "60",
+          ],
         ],
         'civicrm_contribution_page' => [
           'title' => [
diff --git a/civicrm/CRM/Core/I18n/SchemaStructure_5_31_alpha1.php b/civicrm/CRM/Core/I18n/SchemaStructure_5_31_alpha1.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc9ced236d2552813f474cc381de19a358b7d472
--- /dev/null
+++ b/civicrm/CRM/Core/I18n/SchemaStructure_5_31_alpha1.php
@@ -0,0 +1,722 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ *
+ * Generated from schema_structure.tpl
+ * DO NOT EDIT.  Generated by CRM_Core_CodeGen
+ */
+class CRM_Core_I18n_SchemaStructure_5_31_alpha1 {
+
+  /**
+   * Get translatable columns.
+   *
+   * @return array
+   *   A table-indexed array of translatable columns.
+   */
+  public static function &columns() {
+    static $result = NULL;
+    if (!$result) {
+      $result = [
+        'civicrm_location_type' => [
+          'display_name' => "varchar(64) COMMENT 'Location Type Display Name.'",
+        ],
+        'civicrm_option_group' => [
+          'title' => "varchar(255) COMMENT 'Option Group title.'",
+          'description' => "varchar(255) COMMENT 'Option group description.'",
+        ],
+        'civicrm_relationship_type' => [
+          'label_a_b' => "varchar(64) COMMENT 'label for relationship of contact_a to contact_b.'",
+          'label_b_a' => "varchar(64) COMMENT 'Optional label for relationship of contact_b to contact_a.'",
+          'description' => "varchar(255) COMMENT 'Optional verbose description of the relationship type.'",
+        ],
+        'civicrm_contact_type' => [
+          'label' => "varchar(64) COMMENT 'localized Name of Contact Type.'",
+          'description' => "text COMMENT 'localized Optional verbose description of the type.'",
+        ],
+        'civicrm_batch' => [
+          'title' => "varchar(255) COMMENT 'Friendly Name.'",
+          'description' => "text COMMENT 'Description of this batch set.'",
+        ],
+        'civicrm_premiums' => [
+          'premiums_intro_title' => "varchar(255) COMMENT 'Title for Premiums section.'",
+          'premiums_intro_text' => "text COMMENT 'Displayed in <div> at top of Premiums section of page. Text and HTML allowed.'",
+          'premiums_nothankyou_label' => "varchar(255) COMMENT 'Label displayed for No Thank-you option in premiums block (e.g. No thank you)'",
+        ],
+        'civicrm_membership_status' => [
+          'label' => "varchar(128) COMMENT 'Label for Membership Status'",
+        ],
+        'civicrm_survey' => [
+          'title' => "varchar(255) NOT NULL COMMENT 'Title of the Survey.'",
+          'instructions' => "text COMMENT 'Script instructions for volunteers to use for the survey.'",
+          'thankyou_title' => "varchar(255) COMMENT 'Title for Thank-you page (header title tag, and display at the top of the page).'",
+          'thankyou_text' => "text COMMENT 'text and html allowed. displayed above result on success page'",
+        ],
+        'civicrm_participant_status_type' => [
+          'label' => "varchar(255) COMMENT 'localized label for display of this status type'",
+        ],
+        'civicrm_case_type' => [
+          'title' => "varchar(64) NOT NULL COMMENT 'Natural language name for Case Type'",
+          'description' => "varchar(255) COMMENT 'Description of the Case Type'",
+        ],
+        'civicrm_tell_friend' => [
+          'title' => "varchar(255)",
+          'intro' => "text COMMENT 'Introductory message to contributor or participant displayed on the Tell a Friend form.'",
+          'suggested_message' => "text COMMENT 'Suggested message to friends, provided as default on the Tell A Friend form.'",
+          'thankyou_title' => "varchar(255) COMMENT 'Text for Tell a Friend thank you page header and HTML title.'",
+          'thankyou_text' => "text COMMENT 'Thank you message displayed on success page.'",
+        ],
+        'civicrm_custom_group' => [
+          'title' => "varchar(64) NOT NULL COMMENT 'Friendly Name.'",
+          'help_pre' => "text COMMENT 'Description and/or help text to display before fields in form.'",
+          'help_post' => "text COMMENT 'Description and/or help text to display after fields in form.'",
+        ],
+        'civicrm_custom_field' => [
+          'label' => "varchar(255) NOT NULL COMMENT 'Text for form field label (also friendly name for administering this custom property).'",
+          'help_pre' => "text COMMENT 'Description and/or help text to display before this field.'",
+          'help_post' => "text COMMENT 'Description and/or help text to display after this field.'",
+        ],
+        'civicrm_option_value' => [
+          'label' => "varchar(512) NOT NULL COMMENT 'Option string as displayed to users - e.g. the label in an HTML OPTION tag.'",
+          'description' => "text COMMENT 'Optional description.'",
+        ],
+        'civicrm_group' => [
+          'title' => "varchar(255) NOT NULL COMMENT 'Name of Group.'",
+          'frontend_title' => "varchar(255) DEFAULT NULL COMMENT 'Alternative public title for this Group.'",
+          'frontend_description' => "text DEFAULT NULL COMMENT 'Alternative public description of the group.'",
+        ],
+        'civicrm_contribution_page' => [
+          'title' => "varchar(255) COMMENT 'Contribution Page title. For top of page display'",
+          'intro_text' => "text COMMENT 'Text and html allowed. Displayed below title.'",
+          'pay_later_text' => "text COMMENT 'The text displayed to the user in the main form'",
+          'pay_later_receipt' => "text COMMENT 'The receipt sent to the user instead of the normal receipt text'",
+          'initial_amount_label' => "varchar(255) COMMENT 'Initial amount label for partial payment'",
+          'initial_amount_help_text' => "text COMMENT 'Initial amount help text for partial payment'",
+          'thankyou_title' => "varchar(255) COMMENT 'Title for Thank-you page (header title tag, and display at the top of the page).'",
+          'thankyou_text' => "text COMMENT 'text and html allowed. displayed above result on success page'",
+          'thankyou_footer' => "text COMMENT 'Text and html allowed. displayed at the bottom of the success page. Common usage is to include link(s) to other pages such as tell-a-friend, etc.'",
+          'receipt_from_name' => "varchar(255) COMMENT 'FROM email name used for receipts generated by contributions to this contribution page.'",
+          'receipt_text' => "text COMMENT 'text to include above standard receipt info on receipt email. emails are text-only, so do not allow html for now'",
+          'footer_text' => "text COMMENT 'Text and html allowed. Displayed at the bottom of the first page of the contribution wizard.'",
+          'frontend_title' => "varchar(255) DEFAULT NULL COMMENT 'Contribution Page Public title'",
+        ],
+        'civicrm_product' => [
+          'name' => "varchar(255) NOT NULL COMMENT 'Required product/premium name'",
+          'description' => "text COMMENT 'Optional description of the product/premium.'",
+          'options' => "text COMMENT 'Store comma-delimited list of color, size, etc. options for the product.'",
+        ],
+        'civicrm_payment_processor' => [
+          'title' => "varchar(127) COMMENT 'Payment Processor Descriptive Name.'",
+        ],
+        'civicrm_membership_type' => [
+          'name' => "varchar(128) NOT NULL COMMENT 'Name of Membership Type'",
+          'description' => "varchar(255) COMMENT 'Description of Membership Type'",
+        ],
+        'civicrm_membership_block' => [
+          'new_title' => "varchar(255) COMMENT 'Title to display at top of block'",
+          'new_text' => "text COMMENT 'Text to display below title'",
+          'renewal_title' => "varchar(255) COMMENT 'Title for renewal'",
+          'renewal_text' => "text COMMENT 'Text to display for member renewal'",
+        ],
+        'civicrm_price_set' => [
+          'title' => "varchar(255) NOT NULL COMMENT 'Displayed title for the Price Set.'",
+          'help_pre' => "text COMMENT 'Description and/or help text to display before fields in form.'",
+          'help_post' => "text COMMENT 'Description and/or help text to display after fields in form.'",
+        ],
+        'civicrm_dashboard' => [
+          'label' => "varchar(255) COMMENT 'dashlet title'",
+        ],
+        'civicrm_uf_group' => [
+          'title' => "varchar(64) NOT NULL COMMENT 'Form title.'",
+          'frontend_title' => "varchar(64) COMMENT 'Profile Form Public title'",
+          'help_pre' => "text COMMENT 'Description and/or help text to display before fields in form.'",
+          'help_post' => "text COMMENT 'Description and/or help text to display after fields in form.'",
+          'cancel_button_text' => "varchar(64) DEFAULT NULL COMMENT 'Custom Text to display on the Cancel button when used in create or edit mode'",
+          'submit_button_text' => "varchar(64) DEFAULT NULL COMMENT 'Custom Text to display on the submit button on profile edit/create screens'",
+        ],
+        'civicrm_uf_field' => [
+          'help_post' => "text COMMENT 'Description and/or help text to display after this field.'",
+          'help_pre' => "text COMMENT 'Description and/or help text to display before this field.'",
+          'label' => "varchar(255) NOT NULL COMMENT 'To save label for fields.'",
+        ],
+        'civicrm_price_field' => [
+          'label' => "varchar(255) NOT NULL COMMENT 'Text for form field label (also friendly name for administering this field).'",
+          'help_pre' => "text COMMENT 'Description and/or help text to display before this field.'",
+          'help_post' => "text COMMENT 'Description and/or help text to display after this field.'",
+        ],
+        'civicrm_price_field_value' => [
+          'label' => "varchar(255) DEFAULT NULL COMMENT 'Price field option label'",
+          'description' => "text DEFAULT NULL COMMENT 'Price field option description.'",
+          'help_pre' => "text DEFAULT NULL COMMENT 'Price field option pre help text.'",
+          'help_post' => "text DEFAULT NULL COMMENT 'Price field option post field help.'",
+        ],
+        'civicrm_pcp_block' => [
+          'link_text' => "varchar(255) DEFAULT NULL COMMENT 'Link text for PCP.'",
+        ],
+        'civicrm_event' => [
+          'title' => "varchar(255) COMMENT 'Event Title (e.g. Fall Fundraiser Dinner)'",
+          'summary' => "text COMMENT 'Brief summary of event. Text and html allowed. Displayed on Event Registration form and can be used on other CMS pages which need an event summary.'",
+          'description' => "text COMMENT 'Full description of event. Text and html allowed. Displayed on built-in Event Information screens.'",
+          'registration_link_text' => "varchar(255) COMMENT 'Text for link to Event Registration form which is displayed on Event Information screen when is_online_registration is true.'",
+          'event_full_text' => "text COMMENT 'Message to display on Event Information page and INSTEAD OF Event Registration form if maximum participants are signed up. Can include email address/info about getting on a waiting list, etc. Text and html allowed.'",
+          'fee_label' => "varchar(255)",
+          'intro_text' => "text COMMENT 'Introductory message for Event Registration page. Text and html allowed. Displayed at the top of Event Registration form.'",
+          'footer_text' => "text COMMENT 'Footer message for Event Registration page. Text and html allowed. Displayed at the bottom of Event Registration form.'",
+          'confirm_title' => "varchar(255) DEFAULT NULL COMMENT 'Title for Confirmation page.'",
+          'confirm_text' => "text COMMENT 'Introductory message for Event Registration page. Text and html allowed. Displayed at the top of Event Registration form.'",
+          'confirm_footer_text' => "text COMMENT 'Footer message for Event Registration page. Text and html allowed. Displayed at the bottom of Event Registration form.'",
+          'confirm_email_text' => "text COMMENT 'text to include above standard event info on confirmation email. emails are text-only, so do not allow html for now'",
+          'confirm_from_name' => "varchar(255) COMMENT 'FROM email name used for confirmation emails.'",
+          'thankyou_title' => "varchar(255) DEFAULT NULL COMMENT 'Title for ThankYou page.'",
+          'thankyou_text' => "text COMMENT 'ThankYou Text.'",
+          'thankyou_footer_text' => "text COMMENT 'Footer message.'",
+          'pay_later_text' => "text COMMENT 'The text displayed to the user in the main form'",
+          'pay_later_receipt' => "text COMMENT 'The receipt sent to the user instead of the normal receipt text'",
+          'initial_amount_label' => "varchar(255) COMMENT 'Initial amount label for partial payment'",
+          'initial_amount_help_text' => "text COMMENT 'Initial amount help text for partial payment'",
+          'waitlist_text' => "text COMMENT 'Text to display when the event is full, but participants can signup for a waitlist.'",
+          'approval_req_text' => "text COMMENT 'Text to display when the approval is required to complete registration for an event.'",
+          'template_title' => "varchar(255) COMMENT 'Event Template Title'",
+        ],
+      ];
+    }
+    return $result;
+  }
+
+  /**
+   * Get a table indexed array of the indices for translatable fields.
+   *
+   * @return array
+   *   Indices for translatable fields.
+   */
+  public static function &indices() {
+    static $result = NULL;
+    if (!$result) {
+      $result = [
+        'civicrm_custom_group' => [
+          'UI_title_extends' => [
+            'name' => 'UI_title_extends',
+            'field' => [
+              'title',
+              'extends',
+            ],
+            'unique' => 1,
+          ],
+        ],
+        'civicrm_custom_field' => [
+          'UI_label_custom_group_id' => [
+            'name' => 'UI_label_custom_group_id',
+            'field' => [
+              'label',
+              'custom_group_id',
+            ],
+            'unique' => 1,
+          ],
+        ],
+        'civicrm_group' => [
+          'UI_title' => [
+            'name' => 'UI_title',
+            'field' => [
+              'title',
+            ],
+            'unique' => 1,
+          ],
+        ],
+      ];
+    }
+    return $result;
+  }
+
+  /**
+   * Get tables with translatable fields.
+   *
+   * @return array
+   *   Array of names of tables with fields that can be translated.
+   */
+  public static function &tables() {
+    static $result = NULL;
+    if (!$result) {
+      $result = array_keys(self::columns());
+    }
+    return $result;
+  }
+
+  /**
+   * Get a list of widgets for editing translatable fields.
+   *
+   * @return array
+   *   Array of the widgets for editing translatable fields.
+   */
+  public static function &widgets() {
+    static $result = NULL;
+    if (!$result) {
+      $result = [
+        'civicrm_location_type' => [
+          'display_name' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_option_group' => [
+          'title' => [
+            'type' => "Text",
+          ],
+          'description' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_relationship_type' => [
+          'label_a_b' => [
+            'type' => "Text",
+          ],
+          'label_b_a' => [
+            'type' => "Text",
+          ],
+          'description' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_contact_type' => [
+          'label' => [
+            'type' => "Text",
+          ],
+          'description' => [
+            'type' => "TextArea",
+            'rows' => "2",
+            'cols' => "60",
+          ],
+        ],
+        'civicrm_batch' => [
+          'title' => [
+            'type' => "Text",
+          ],
+          'description' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "80",
+          ],
+        ],
+        'civicrm_premiums' => [
+          'premiums_intro_title' => [
+            'type' => "Text",
+          ],
+          'premiums_intro_text' => [
+            'type' => "Text",
+          ],
+          'premiums_nothankyou_label' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_membership_status' => [
+          'label' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_survey' => [
+          'title' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'instructions' => [
+            'type' => "TextArea",
+            'rows' => "20",
+            'cols' => "80",
+          ],
+          'thankyou_title' => [
+            'type' => "Text",
+          ],
+          'thankyou_text' => [
+            'type' => "TextArea",
+            'rows' => "8",
+            'cols' => "60",
+          ],
+        ],
+        'civicrm_participant_status_type' => [
+          'label' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_case_type' => [
+          'title' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'description' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_tell_friend' => [
+          'title' => [
+            'type' => "Text",
+          ],
+          'intro' => [
+            'type' => "Text",
+          ],
+          'suggested_message' => [
+            'type' => "Text",
+          ],
+          'thankyou_title' => [
+            'type' => "Text",
+          ],
+          'thankyou_text' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_custom_group' => [
+          'title' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'help_pre' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "80",
+          ],
+          'help_post' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "80",
+          ],
+        ],
+        'civicrm_custom_field' => [
+          'label' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'help_pre' => [
+            'type' => "Text",
+          ],
+          'help_post' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_option_value' => [
+          'label' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'description' => [
+            'type' => "TextArea",
+            'rows' => "8",
+            'cols' => "60",
+          ],
+        ],
+        'civicrm_group' => [
+          'title' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'frontend_title' => [
+            'type' => "Text",
+          ],
+          'frontend_description' => [
+            'type' => "TextArea",
+            'rows' => "2",
+            'cols' => "60",
+          ],
+        ],
+        'civicrm_contribution_page' => [
+          'title' => [
+            'type' => "Text",
+          ],
+          'intro_text' => [
+            'type' => "RichTextEditor",
+            'rows' => "6",
+            'cols' => "50",
+          ],
+          'pay_later_text' => [
+            'type' => "Text",
+          ],
+          'pay_later_receipt' => [
+            'type' => "Text",
+          ],
+          'initial_amount_label' => [
+            'type' => "Text",
+          ],
+          'initial_amount_help_text' => [
+            'type' => "Text",
+          ],
+          'thankyou_title' => [
+            'type' => "Text",
+          ],
+          'thankyou_text' => [
+            'type' => "RichTextEditor",
+            'rows' => "8",
+            'cols' => "60",
+          ],
+          'thankyou_footer' => [
+            'type' => "RichTextEditor",
+            'rows' => "8",
+            'cols' => "60",
+          ],
+          'receipt_from_name' => [
+            'type' => "Text",
+          ],
+          'receipt_text' => [
+            'type' => "TextArea",
+            'rows' => "6",
+            'cols' => "50",
+          ],
+          'footer_text' => [
+            'type' => "RichTextEditor",
+            'rows' => "6",
+            'cols' => "50",
+          ],
+          'frontend_title' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_product' => [
+          'name' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'description' => [
+            'type' => "Text",
+          ],
+          'options' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_payment_processor' => [
+          'title' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_membership_type' => [
+          'name' => [
+            'type' => "Text",
+            'label' => "Name",
+            'required' => "true",
+          ],
+          'description' => [
+            'type' => "TextArea",
+            'rows' => "6",
+            'cols' => "50",
+            'label' => "Description",
+          ],
+        ],
+        'civicrm_membership_block' => [
+          'new_title' => [
+            'type' => "Text",
+          ],
+          'new_text' => [
+            'type' => "Text",
+          ],
+          'renewal_title' => [
+            'type' => "Text",
+          ],
+          'renewal_text' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_price_set' => [
+          'title' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'help_pre' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "80",
+          ],
+          'help_post' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "80",
+          ],
+        ],
+        'civicrm_dashboard' => [
+          'label' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_uf_group' => [
+          'title' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'frontend_title' => [
+            'type' => "Text",
+          ],
+          'help_pre' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "80",
+          ],
+          'help_post' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "80",
+          ],
+          'cancel_button_text' => [
+            'type' => "Text",
+          ],
+          'submit_button_text' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_uf_field' => [
+          'help_post' => [
+            'type' => "Text",
+          ],
+          'help_pre' => [
+            'type' => "Text",
+          ],
+          'label' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+        ],
+        'civicrm_price_field' => [
+          'label' => [
+            'type' => "Text",
+            'required' => "true",
+          ],
+          'help_pre' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "80",
+          ],
+          'help_post' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "80",
+          ],
+        ],
+        'civicrm_price_field_value' => [
+          'label' => [
+            'type' => "Text",
+          ],
+          'description' => [
+            'type' => "TextArea",
+            'rows' => "2",
+            'cols' => "60",
+          ],
+          'help_pre' => [
+            'type' => "TextArea",
+            'rows' => "2",
+            'cols' => "60",
+          ],
+          'help_post' => [
+            'type' => "TextArea",
+            'rows' => "2",
+            'cols' => "60",
+          ],
+        ],
+        'civicrm_pcp_block' => [
+          'link_text' => [
+            'type' => "Text",
+          ],
+        ],
+        'civicrm_event' => [
+          'title' => [
+            'type' => "Text",
+          ],
+          'summary' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "60",
+          ],
+          'description' => [
+            'type' => "RichTextEditor",
+            'rows' => "8",
+            'cols' => "60",
+          ],
+          'registration_link_text' => [
+            'type' => "Text",
+          ],
+          'event_full_text' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "60",
+          ],
+          'fee_label' => [
+            'type' => "Text",
+          ],
+          'intro_text' => [
+            'type' => "RichTextEditor",
+            'rows' => "6",
+            'cols' => "50",
+          ],
+          'footer_text' => [
+            'type' => "RichTextEditor",
+            'rows' => "6",
+            'cols' => "50",
+          ],
+          'confirm_title' => [
+            'type' => "Text",
+          ],
+          'confirm_text' => [
+            'type' => "RichTextEditor",
+            'rows' => "6",
+            'cols' => "50",
+          ],
+          'confirm_footer_text' => [
+            'type' => "RichTextEditor",
+            'rows' => "6",
+            'cols' => "50",
+          ],
+          'confirm_email_text' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "50",
+          ],
+          'confirm_from_name' => [
+            'type' => "Text",
+          ],
+          'thankyou_title' => [
+            'type' => "Text",
+          ],
+          'thankyou_text' => [
+            'type' => "RichTextEditor",
+            'rows' => "6",
+            'cols' => "50",
+          ],
+          'thankyou_footer_text' => [
+            'type' => "RichTextEditor",
+            'rows' => "6",
+            'cols' => "50",
+          ],
+          'pay_later_text' => [
+            'type' => "RichTextEditor",
+          ],
+          'pay_later_receipt' => [
+            'type' => "Text",
+          ],
+          'initial_amount_label' => [
+            'type' => "Text",
+          ],
+          'initial_amount_help_text' => [
+            'type' => "Text",
+          ],
+          'waitlist_text' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "60",
+          ],
+          'approval_req_text' => [
+            'type' => "TextArea",
+            'rows' => "4",
+            'cols' => "60",
+          ],
+          'template_title' => [
+            'type' => "Text",
+          ],
+        ],
+      ];
+    }
+    return $result;
+  }
+
+}
diff --git a/civicrm/CRM/Core/IDS.php b/civicrm/CRM/Core/IDS.php
index 5401ea811701ca7790b1b306f315dfa8978be6c5..59e48c24a6f082105011306f71f4bca5f22a4478 100644
--- a/civicrm/CRM/Core/IDS.php
+++ b/civicrm/CRM/Core/IDS.php
@@ -47,7 +47,7 @@ class CRM_Core_IDS {
     }
 
     // lets bypass a few civicrm urls from this check
-    $skip = ['civicrm/admin/setting/updateConfigBackend', 'civicrm/admin/messageTemplates'];
+    $skip = ['civicrm/admin/setting/updateConfigBackend', 'civicrm/admin/messageTemplates', 'civicrm/ajax/api4'];
     CRM_Utils_Hook::idsException($skip);
     $this->path = $route['path'];
     if (in_array($this->path, $skip)) {
diff --git a/civicrm/CRM/Core/Payment.php b/civicrm/CRM/Core/Payment.php
index b312c8e8d9318fe1d12426f75638cb074bb8c686..94bdfd88ec35af1d0633547d9b6bc16c31ea47be 100644
--- a/civicrm/CRM/Core/Payment.php
+++ b/civicrm/CRM/Core/Payment.php
@@ -1131,7 +1131,7 @@ abstract class CRM_Core_Payment {
         '' => ts('- select -'),
       ] + CRM_Core_PseudoConstant::country(),
       'is_required' => TRUE,
-      'extra' => ['class' => 'required'],
+      'extra' => ['class' => 'required crm-form-select2 crm-select2'],
     ];
     return $metadata;
   }
diff --git a/civicrm/CRM/Core/Payment/AuthorizeNetIPN.php b/civicrm/CRM/Core/Payment/AuthorizeNetIPN.php
index 83697bd338fa7f7da2e3aa99bbc420a78e136ae7..06e3049cf4e95c4c1d76009383c3bb3d160834bc 100644
--- a/civicrm/CRM/Core/Payment/AuthorizeNetIPN.php
+++ b/civicrm/CRM/Core/Payment/AuthorizeNetIPN.php
@@ -35,61 +35,121 @@ class CRM_Core_Payment_AuthorizeNetIPN extends CRM_Core_Payment_BaseIPN {
    * @return bool|void
    */
   public function main($component = 'contribute') {
+    try {
+      //we only get invoice num as a key player from payment gateway response.
+      //for ARB we get x_subscription_id and x_subscription_paynum
+      $x_subscription_id = $this->retrieve('x_subscription_id', 'String');
+      $ids = $objects = $input = [];
 
-    //we only get invoice num as a key player from payment gateway response.
-    //for ARB we get x_subscription_id and x_subscription_paynum
-    $x_subscription_id = $this->retrieve('x_subscription_id', 'String');
-    $ids = $objects = $input = [];
+      if ($x_subscription_id) {
+        // Presence of the id means it is approved.
+        $input['component'] = $component;
 
-    if ($x_subscription_id) {
-      // Presence of the id means it is approved.
-      $input['component'] = $component;
+        // load post vars in $input
+        $this->getInput($input, $ids);
 
-      // load post vars in $input
-      $this->getInput($input, $ids);
+        // load post ids in $ids
+        $this->getIDs($ids, $input);
 
-      // load post ids in $ids
-      $this->getIDs($ids, $input);
+        // Attempt to get payment processor ID from URL
+        if (!empty($this->_inputParameters['processor_id'])) {
+          $paymentProcessorID = $this->_inputParameters['processor_id'];
+        }
+        else {
+          // This is an unreliable method as there could be more than one instance.
+          // Recommended approach is to use the civicrm/payment/ipn/xx url where xx is the payment
+          // processor id & the handleNotification function (which should call the completetransaction api & by-pass this
+          // entirely). The only thing the IPN class should really do is extract data from the request, validate it
+          // & call completetransaction or call fail? (which may not exist yet).
+          Civi::log()->warning('Unreliable method used to get payment_processor_id for AuthNet IPN - this will cause problems if you have more than one instance');
+          $paymentProcessorTypeID = CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessorType',
+            'AuthNet', 'id', 'name'
+          );
+          $paymentProcessorID = (int) civicrm_api3('PaymentProcessor', 'getvalue', [
+            'is_test' => 0,
+            'options' => ['limit' => 1],
+            'payment_processor_type_id' => $paymentProcessorTypeID,
+            'return' => 'id',
+          ]);
+        }
 
-      // Attempt to get payment processor ID from URL
-      if (!empty($this->_inputParameters['processor_id'])) {
-        $paymentProcessorID = $this->_inputParameters['processor_id'];
-      }
-      else {
-        // This is an unreliable method as there could be more than one instance.
-        // Recommended approach is to use the civicrm/payment/ipn/xx url where xx is the payment
-        // processor id & the handleNotification function (which should call the completetransaction api & by-pass this
-        // entirely). The only thing the IPN class should really do is extract data from the request, validate it
-        // & call completetransaction or call fail? (which may not exist yet).
-        Civi::log()->warning('Unreliable method used to get payment_processor_id for AuthNet IPN - this will cause problems if you have more than one instance');
-        $paymentProcessorTypeID = CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessorType',
-          'AuthNet', 'id', 'name'
-        );
-        $paymentProcessorID = (int) civicrm_api3('PaymentProcessor', 'getvalue', [
-          'is_test' => 0,
-          'options' => ['limit' => 1],
-          'payment_processor_type_id' => $paymentProcessorTypeID,
-          'return' => 'id',
-        ]);
-      }
+        // Check if the contribution exists
+        // make sure contribution exists and is valid
+        $contribution = new CRM_Contribute_BAO_Contribution();
+        $contribution->id = $ids['contribution'];
+        if (!$contribution->find(TRUE)) {
+          throw new CRM_Core_Exception('Failure: Could not find contribution record for ' . (int) $contribution->id, NULL, ['context' => "Could not find contribution record: {$contribution->id} in IPN request: " . print_r($input, TRUE)]);
+        }
 
-      if (!$this->validateData($input, $ids, $objects, TRUE, $paymentProcessorID)) {
-        return FALSE;
-      }
-      if (!empty($ids['paymentProcessor']) && $objects['contributionRecur']->payment_processor_id != $ids['paymentProcessor']) {
-        Civi::log()->warning('Payment Processor does not match the recurring processor id.', ['civi.tag' => 'deprecated']);
-      }
+        // make sure contact exists and is valid
+        // use the contact id from the contribution record as the id in the IPN may not be valid anymore.
+        $contact = new CRM_Contact_BAO_Contact();
+        $contact->id = $contribution->contact_id;
+        $contact->find(TRUE);
+        if ($contact->id != $ids['contact']) {
+          // If the ids do not match then it is possible the contact id in the IPN has been merged into another contact which is why we use the contact_id from the contribution
+          CRM_Core_Error::debug_log_message("Contact ID in IPN {$ids['contact']} not found but contact_id found in contribution {$contribution->contact_id} used instead");
+          echo "WARNING: Could not find contact record: {$ids['contact']}<p>";
+          $ids['contact'] = $contribution->contact_id;
+        }
+
+        if (!empty($ids['contributionRecur'])) {
+          $contributionRecur = new CRM_Contribute_BAO_ContributionRecur();
+          $contributionRecur->id = $ids['contributionRecur'];
+          if (!$contributionRecur->find(TRUE)) {
+            CRM_Core_Error::debug_log_message("Could not find contribution recur record: {$ids['ContributionRecur']} in IPN request: " . print_r($input, TRUE));
+            echo "Failure: Could not find contribution recur record: {$ids['ContributionRecur']}<p>";
+            return FALSE;
+          }
+        }
 
-      if ($component == 'contribute' && $ids['contributionRecur']) {
-        // check if first contribution is completed, else complete first contribution
-        $first = TRUE;
-        if ($objects['contribution']->contribution_status_id == 1) {
-          $first = FALSE;
+        $objects['contact'] = &$contact;
+        $objects['contribution'] = &$contribution;
+
+        // CRM-19478: handle oddity when p=null is set in place of contribution page ID,
+        if (!empty($ids['contributionPage']) && !is_numeric($ids['contributionPage'])) {
+          // We don't need to worry if about removing contribution page id as it will be set later in
+          //  CRM_Contribute_BAO_Contribution::loadRelatedObjects(..) using $objects['contribution']->contribution_page_id
+          unset($ids['contributionPage']);
+        }
+
+        $this->loadObjects($input, $ids, $objects, TRUE, $paymentProcessorID);
+
+        if (!empty($ids['paymentProcessor']) && $objects['contributionRecur']->payment_processor_id != $ids['paymentProcessor']) {
+          Civi::log()->warning('Payment Processor does not match the recurring processor id.', ['civi.tag' => 'deprecated']);
+        }
+
+        if ($component == 'contribute' && $ids['contributionRecur']) {
+          // check if first contribution is completed, else complete first contribution
+          $first = TRUE;
+          if ($objects['contribution']->contribution_status_id == 1) {
+            $first = FALSE;
+            //load new contribution object if required.
+            // create a contribution and then get it processed
+            $contribution = new CRM_Contribute_BAO_Contribution();
+            $contribution->contact_id = $ids['contact'];
+            $contribution->financial_type_id = $objects['contributionType']->id;
+            $contribution->contribution_page_id = $ids['contributionPage'];
+            $contribution->contribution_recur_id = $ids['contributionRecur'];
+            $contribution->receive_date = $input['receive_date'];
+            $contribution->currency = $objects['contribution']->currency;
+            $contribution->amount_level = $objects['contribution']->amount_level;
+            $contribution->address_id = $objects['contribution']->address_id;
+            $contribution->campaign_id = $objects['contribution']->campaign_id;
+            $contribution->_relatedObjects = $objects['contribution']->_relatedObjects;
+
+            $objects['contribution'] = &$contribution;
+          }
+          $input['payment_processor_id'] = $paymentProcessorID;
+          return $this->recur($input, $ids, $objects, $first);
         }
-        return $this->recur($input, $ids, $objects, $first);
       }
+      return TRUE;
+    }
+    catch (CRM_Core_Exception $e) {
+      Civi::log()->debug($e->getMessage());
+      echo 'Invalid or missing data';
     }
-    return TRUE;
   }
 
   /**
@@ -99,41 +159,21 @@ class CRM_Core_Payment_AuthorizeNetIPN extends CRM_Core_Payment_BaseIPN {
    * @param $first
    *
    * @return bool
+   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
   public function recur($input, $ids, $objects, $first) {
-    $this->_isRecurring = TRUE;
     $recur = &$objects['contributionRecur'];
-    $paymentProcessorObject = $objects['contribution']->_relatedObjects['paymentProcessor']['object'];
 
     // do a subscription check
     if ($recur->processor_id != $input['subscription_id']) {
-      CRM_Core_Error::debug_log_message('Unrecognized subscription.');
-      echo 'Failure: Unrecognized subscription<p>';
-      return FALSE;
+      throw new CRM_Core_Exception('Unrecognized subscription.');
     }
 
     $contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
 
     $now = date('YmdHis');
 
-    //load new contribution object if required.
-    if (!$first) {
-      // create a contribution and then get it processed
-      $contribution = new CRM_Contribute_BAO_Contribution();
-      $contribution->contact_id = $ids['contact'];
-      $contribution->financial_type_id = $objects['contributionType']->id;
-      $contribution->contribution_page_id = $ids['contributionPage'];
-      $contribution->contribution_recur_id = $ids['contributionRecur'];
-      $contribution->receive_date = $input['receive_date'];
-      $contribution->currency = $objects['contribution']->currency;
-      $contribution->payment_instrument_id = $objects['contribution']->payment_instrument_id;
-      $contribution->amount_level = $objects['contribution']->amount_level;
-      $contribution->address_id = $objects['contribution']->address_id;
-      $contribution->campaign_id = $objects['contribution']->campaign_id;
-      $contribution->_relatedObjects = $objects['contribution']->_relatedObjects;
-
-      $objects['contribution'] = &$contribution;
-    }
     $objects['contribution']->invoice_id = md5(uniqid(rand(), TRUE));
     $objects['contribution']->total_amount = $input['amount'];
     $objects['contribution']->trxn_id = $input['trxn_id'];
@@ -182,7 +222,11 @@ class CRM_Core_Payment_AuthorizeNetIPN extends CRM_Core_Payment_BaseIPN {
       return TRUE;
     }
 
-    $this->completeTransaction($input, $ids, $objects);
+    CRM_Contribute_BAO_Contribution::completeOrder($input, [
+      'related_contact' => $ids['related_contact'] ?? NULL,
+      'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL,
+      'contributionRecur' => !empty($objects['contributionRecur']) ? $objects['contributionRecur']->id : NULL,
+    ], ['contribution' => $objects['contribution']]);
 
     // Only Authorize.net does this so it is on the a.net class. If there is a need for other processors
     // to do this we should make it available via the api, e.g as a parameter, changing the nuance
diff --git a/civicrm/CRM/Core/Payment/BaseIPN.php b/civicrm/CRM/Core/Payment/BaseIPN.php
index fdfce40a0f58a7d0d154459a339c09715b2389e4..e1fa68af31b61bc8293d58dbe01a0b7f1461d892 100644
--- a/civicrm/CRM/Core/Payment/BaseIPN.php
+++ b/civicrm/CRM/Core/Payment/BaseIPN.php
@@ -92,9 +92,7 @@ class CRM_Core_Payment_BaseIPN {
     $contribution = new CRM_Contribute_BAO_Contribution();
     $contribution->id = $ids['contribution'];
     if (!$contribution->find(TRUE)) {
-      CRM_Core_Error::debug_log_message("Could not find contribution record: {$contribution->id} in IPN request: " . print_r($input, TRUE));
-      echo "Failure: Could not find contribution record for {$contribution->id}<p>";
-      return FALSE;
+      throw new CRM_Core_Exception('Failure: Could not find contribution record for ' . (int) $contribution->id, NULL, ['context' => "Could not find contribution record: {$contribution->id} in IPN request: " . print_r($input, TRUE)]);
     }
 
     // make sure contact exists and is valid
@@ -119,9 +117,6 @@ class CRM_Core_Payment_BaseIPN {
       }
     }
 
-    $contribution->receive_date = CRM_Utils_Date::isoToMysql($contribution->receive_date);
-    $contribution->receipt_date = CRM_Utils_Date::isoToMysql($contribution->receipt_date);
-
     $objects['contact'] = &$contact;
     $objects['contribution'] = &$contribution;
 
@@ -148,51 +143,16 @@ class CRM_Core_Payment_BaseIPN {
    * @param array $objects
    * @param bool $required
    * @param int $paymentProcessorID
-   * @param array $error_handling
    *
    * @return bool|array
+   * @throws \CRM_Core_Exception
    */
-  public function loadObjects($input, &$ids, &$objects, $required, $paymentProcessorID, $error_handling = NULL) {
-    if (empty($error_handling)) {
-      // default options are that we log an error & echo it out
-      // note that we should refactor this error handling into error code @ some point
-      // but for now setting up enough separation so we can do unit tests
-      $error_handling = [
-        'log_error' => 1,
-        'echo_error' => 1,
-      ];
-    }
+  public function loadObjects($input, &$ids, &$objects, $required, $paymentProcessorID) {
+    $contribution = &$objects['contribution'];
     $ids['paymentProcessor'] = $paymentProcessorID;
-    if (is_a($objects['contribution'], 'CRM_Contribute_BAO_Contribution')) {
-      $contribution = &$objects['contribution'];
-    }
-    else {
-      //legacy support - functions are 'used' to be able to pass in a DAO
-      $contribution = new CRM_Contribute_BAO_Contribution();
-      $contribution->id = $ids['contribution'] ?? NULL;
-      $contribution->find(TRUE);
-      $objects['contribution'] = &$contribution;
-    }
-    try {
-      $success = $contribution->loadRelatedObjects($input, $ids);
-      if ($required && empty($contribution->_relatedObjects['paymentProcessor'])) {
-        throw new CRM_Core_Exception("Could not find payment processor for contribution record: " . $contribution->id);
-      }
-    }
-    catch (Exception $e) {
-      $success = FALSE;
-      if (!empty($error_handling['log_error'])) {
-        CRM_Core_Error::debug_log_message($e->getMessage());
-      }
-      if (!empty($error_handling['echo_error'])) {
-        echo $e->getMessage();
-      }
-      if (!empty($error_handling['return_error'])) {
-        return [
-          'is_error' => 1,
-          'error_message' => ($e->getMessage()),
-        ];
-      }
+    $success = $contribution->loadRelatedObjects($input, $ids);
+    if ($required && empty($contribution->_relatedObjects['paymentProcessor'])) {
+      throw new CRM_Core_Exception("Could not find payment processor for contribution record: " . $contribution->id);
     }
     $objects = array_merge($objects, $contribution->_relatedObjects);
     return $success;
@@ -235,17 +195,15 @@ class CRM_Core_Payment_BaseIPN {
       CRM_Contribute_BAO_ContributionRecur::copyCustomValues($objects['contributionRecur']->id, $contribution->id);
     }
 
-    if (empty($input['IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved'])) {
-      if (!empty($memberships)) {
-        foreach ($memberships as $membership) {
-          // @fixme Should we cancel only Pending memberships? per cancelled()
-          $this->cancelMembership($membership, $membership->status_id, FALSE);
-        }
+    if (!empty($memberships)) {
+      foreach ($memberships as $membership) {
+        // @fixme Should we cancel only Pending memberships? per cancelled()
+        $this->cancelMembership($membership, $membership->status_id, FALSE);
       }
+    }
 
-      if ($participant) {
-        $this->cancelParticipant($participant->id);
-      }
+    if ($participant) {
+      $this->cancelParticipant($participant->id);
     }
 
     if ($transaction) {
@@ -305,9 +263,6 @@ class CRM_Core_Payment_BaseIPN {
       'flip' => 1,
     ]);
     $contribution->contribution_status_id = $contributionStatuses['Cancelled'];
-    $contribution->receive_date = CRM_Utils_Date::isoToMysql($contribution->receive_date);
-    $contribution->receipt_date = CRM_Utils_Date::isoToMysql($contribution->receipt_date);
-    $contribution->thankyou_date = CRM_Utils_Date::isoToMysql($contribution->thankyou_date);
     $contribution->cancel_date = self::$_now;
     $contribution->cancel_reason = $input['reasonCode'] ?? NULL;
     $contribution->save();
@@ -324,19 +279,18 @@ class CRM_Core_Payment_BaseIPN {
       CRM_Contribute_BAO_ContributionRecur::copyCustomValues($objects['contributionRecur']->id, $contribution->id);
     }
 
-    if (empty($input['IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved'])) {
-      if (!empty($memberships)) {
-        foreach ($memberships as $membership) {
-          if ($membership) {
-            $this->cancelMembership($membership, $membership->status_id);
-          }
+    if (!empty($memberships)) {
+      foreach ($memberships as $membership) {
+        if ($membership) {
+          $this->cancelMembership($membership, $membership->status_id);
         }
       }
+    }
 
-      if ($participant) {
-        $this->cancelParticipant($participant->id);
-      }
+    if ($participant) {
+      $this->cancelParticipant($participant->id);
     }
+
     if ($transaction) {
       $transaction->commit();
     }
@@ -468,6 +422,7 @@ class CRM_Core_Payment_BaseIPN {
    * @throws \CiviCRM_API3_Exception
    */
   public function completeTransaction($input, $ids, $objects) {
+    CRM_Core_Error::deprecatedFunctionWarning('Use Payment.create api');
     CRM_Contribute_BAO_Contribution::completeOrder($input, [
       'related_contact' => $ids['related_contact'] ?? NULL,
       'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL,
diff --git a/civicrm/CRM/Core/Payment/PayPalIPN.php b/civicrm/CRM/Core/Payment/PayPalIPN.php
index b6948ddbd47b2f10cbea78e55e9e9a6daeff99e6..c9e35fae42977bd14e6d3da7df46f2d3ff723926 100644
--- a/civicrm/CRM/Core/Payment/PayPalIPN.php
+++ b/civicrm/CRM/Core/Payment/PayPalIPN.php
@@ -53,8 +53,6 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN {
   public function retrieve($name, $type, $abort = TRUE) {
     $value = CRM_Utils_Type::validate(CRM_Utils_Array::value($name, $this->_inputParameters), $type, FALSE);
     if ($abort && $value === NULL) {
-      Civi::log()->debug("PayPalIPN: Could not find an entry for $name");
-      echo "Failure: Missing Parameter<p>" . CRM_Utils_Type::escape($name, 'String');
       throw new CRM_Core_Exception("PayPalIPN: Could not find an entry for $name");
     }
     return $value;
@@ -98,14 +96,6 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN {
 
     $now = date('YmdHis');
 
-    // fix dates that already exist
-    $dates = ['create', 'start', 'end', 'cancel', 'modified'];
-    foreach ($dates as $date) {
-      $name = "{$date}_date";
-      if ($recur->$name) {
-        $recur->$name = CRM_Utils_Date::isoToMysql($recur->$name);
-      }
-    }
     $sendNotification = FALSE;
     $subscriptionPaymentStatus = NULL;
     // set transaction type
@@ -216,9 +206,11 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN {
       return;
     }
 
-    $this->single($input, $ids, $objects,
-      TRUE, $first
-    );
+    $this->single($input, [
+      'related_contact' => $ids['related_contact'] ?? NULL,
+      'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL,
+      'contributionRecur' => !empty($objects['contributionRecur']) ? $objects['contributionRecur']->id : NULL,
+    ], $objects, TRUE);
   }
 
   /**
@@ -226,25 +218,19 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN {
    * @param array $ids
    * @param array $objects
    * @param bool $recur
-   * @param bool $first
    *
    * @return void
    * @throws \CRM_Core_Exception
    * @throws \CiviCRM_API3_Exception
    */
-  public function single($input, $ids, $objects, $recur = FALSE, $first = FALSE) {
+  public function single($input, $ids, $objects, $recur = FALSE) {
     $contribution = &$objects['contribution'];
 
     // make sure the invoice is valid and matches what we have in the contribution record
-    if ((!$recur) || ($recur && $first)) {
-      if ($contribution->invoice_id != $input['invoice']) {
-        Civi::log()->debug('PayPalIPN: Invoice values dont match between database and IPN request. (ID: ' . $contribution->id . ').');
-        echo "Failure: Invoice values dont match between database and IPN request<p>";
-        return;
-      }
-    }
-    else {
-      $contribution->invoice_id = md5(uniqid(rand(), TRUE));
+    if ($contribution->invoice_id != $input['invoice']) {
+      Civi::log()->debug('PayPalIPN: Invoice values dont match between database and IPN request. (ID: ' . $contribution->id . ').');
+      echo "Failure: Invoice values dont match between database and IPN request<p>";
+      return;
     }
 
     if (!$recur) {
@@ -258,24 +244,6 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN {
       $contribution->total_amount = $input['amount'];
     }
 
-    $status = $input['paymentStatus'];
-    if ($status === 'Denied' || $status === 'Failed' || $status === 'Voided') {
-      $this->failed($objects);
-      return;
-    }
-    if ($status === 'Pending') {
-      Civi::log()->debug('Returning since contribution status is Pending');
-      return;
-    }
-    elseif ($status === 'Refunded' || $status === 'Reversed') {
-      $this->cancelled($objects);
-      return;
-    }
-    elseif ($status !== 'Completed') {
-      Civi::log()->debug('Returning since contribution status is not handled');
-      return;
-    }
-
     // check if contribution is already completed, if so we ignore this ipn
     $completedStatusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
     if ($contribution->contribution_status_id == $completedStatusId) {
@@ -284,7 +252,7 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN {
       return;
     }
 
-    $this->completeTransaction($input, $ids, $objects);
+    CRM_Contribute_BAO_Contribution::completeOrder($input, $ids, $objects);
   }
 
   /**
@@ -294,84 +262,113 @@ class CRM_Core_Payment_PayPalIPN extends CRM_Core_Payment_BaseIPN {
    * @throws \CiviCRM_API3_Exception
    */
   public function main() {
-    $objects = $ids = $input = [];
-    $component = $this->retrieve('module', 'String');
-    $input['component'] = $component;
+    try {
+      $objects = $ids = $input = [];
+      $component = $this->retrieve('module', 'String');
+      $input['component'] = $component;
 
-    $ids['contact'] = $this->retrieve('contactID', 'Integer', TRUE);
-    $contributionID = $ids['contribution'] = $this->retrieve('contributionID', 'Integer', TRUE);
-    $membershipID = $this->retrieve('membershipID', 'Integer', FALSE);
-    $contributionRecurID = $this->retrieve('contributionRecurID', 'Integer', FALSE);
+      $ids['contact'] = $this->retrieve('contactID', 'Integer', TRUE);
+      $contributionID = $ids['contribution'] = $this->retrieve('contributionID', 'Integer', TRUE);
+      $membershipID = $this->retrieve('membershipID', 'Integer', FALSE);
+      $contributionRecurID = $this->retrieve('contributionRecurID', 'Integer', FALSE);
 
-    $this->getInput($input);
+      $this->getInput($input);
 
-    if ($component == 'event') {
-      $ids['event'] = $this->retrieve('eventID', 'Integer', TRUE);
-      $ids['participant'] = $this->retrieve('participantID', 'Integer', TRUE);
-    }
-    else {
-      // get the optional ids
-      $ids['membership'] = $membershipID;
-      $ids['contributionRecur'] = $contributionRecurID;
-      $ids['contributionPage'] = $this->retrieve('contributionPageID', 'Integer', FALSE);
-      $ids['related_contact'] = $this->retrieve('relatedContactID', 'Integer', FALSE);
-      $ids['onbehalf_dupe_alert'] = $this->retrieve('onBehalfDupeAlert', 'Integer', FALSE);
-    }
+      if ($component == 'event') {
+        $ids['event'] = $this->retrieve('eventID', 'Integer', TRUE);
+        $ids['participant'] = $this->retrieve('participantID', 'Integer', TRUE);
+      }
+      else {
+        // get the optional ids
+        $ids['membership'] = $membershipID;
+        $ids['contributionRecur'] = $contributionRecurID;
+        $ids['contributionPage'] = $this->retrieve('contributionPageID', 'Integer', FALSE);
+        $ids['related_contact'] = $this->retrieve('relatedContactID', 'Integer', FALSE);
+        $ids['onbehalf_dupe_alert'] = $this->retrieve('onBehalfDupeAlert', 'Integer', FALSE);
+      }
 
-    $paymentProcessorID = $this->getPayPalPaymentProcessorID($input, $ids);
+      $paymentProcessorID = $this->getPayPalPaymentProcessorID($input, $ids);
 
-    Civi::log()->debug('PayPalIPN: Received (ContactID: ' . $ids['contact'] . '; trxn_id: ' . $input['trxn_id'] . ').');
+      Civi::log()->debug('PayPalIPN: Received (ContactID: ' . $ids['contact'] . '; trxn_id: ' . $input['trxn_id'] . ').');
 
-    // Debugging related to possible missing membership linkage
-    if ($contributionRecurID && $this->retrieve('membershipID', 'Integer', FALSE)) {
-      $templateContribution = CRM_Contribute_BAO_ContributionRecur::getTemplateContribution($contributionRecurID);
-      $membershipPayment = civicrm_api3('MembershipPayment', 'get', [
-        'contribution_id' => $templateContribution['id'],
-        'membership_id' => $membershipID,
-      ]);
-      $lineItems  = civicrm_api3('LineItem', 'get', [
-        'contribution_id' => $templateContribution['id'],
-        'entity_id' => $membershipID,
-        'entity_table' => 'civicrm_membership',
-      ]);
-      Civi::log()->debug('PayPalIPN: Received payment for membership ' . (int) $membershipID
-        . '. Original contribution was ' . (int) $contributionID . '. The template for this contribution is '
-        . $templateContribution['id'] . ' it is linked to ' . $membershipPayment['count']
-        . 'payments for this membership. It has ' . $lineItems['count'] . ' line items linked to  this membership.'
-        . '  it is  expected the original contribution will be linked by both entities to the membership.'
-      );
-      if (empty($membershipPayment['count']) && empty($lineItems['count'])) {
-        Civi::log()->debug('PayPalIPN: Will attempt to compensate');
-        $input['membership_id'] = $this->retrieve('membershipID', 'Integer', FALSE);
-      }
-      if ($contributionRecurID) {
-        $recurLinks = civicrm_api3('ContributionRecur', 'get', [
+      // Debugging related to possible missing membership linkage
+      if ($contributionRecurID && $this->retrieve('membershipID', 'Integer', FALSE)) {
+        $templateContribution = CRM_Contribute_BAO_ContributionRecur::getTemplateContribution($contributionRecurID);
+        $membershipPayment = civicrm_api3('MembershipPayment', 'get', [
+          'contribution_id' => $templateContribution['id'],
           'membership_id' => $membershipID,
-          'contribution_recur_id' => $contributionRecurID,
         ]);
-        Civi::log()->debug('PayPalIPN: Membership should be  linked to  contribution recur  record ' . $contributionRecurID
-          . ' ' . $recurLinks['count'] . 'links found'
+        $lineItems = civicrm_api3('LineItem', 'get', [
+          'contribution_id' => $templateContribution['id'],
+          'entity_id' => $membershipID,
+          'entity_table' => 'civicrm_membership',
+        ]);
+        Civi::log()->debug('PayPalIPN: Received payment for membership ' . (int) $membershipID
+          . '. Original contribution was ' . (int) $contributionID . '. The template for this contribution is '
+          . $templateContribution['id'] . ' it is linked to ' . $membershipPayment['count']
+          . 'payments for this membership. It has ' . $lineItems['count'] . ' line items linked to  this membership.'
+          . '  it is  expected the original contribution will be linked by both entities to the membership.'
         );
+        if (empty($membershipPayment['count']) && empty($lineItems['count'])) {
+          Civi::log()->debug('PayPalIPN: Will attempt to compensate');
+          $input['membership_id'] = $this->retrieve('membershipID', 'Integer', FALSE);
+        }
+        if ($contributionRecurID) {
+          $recurLinks = civicrm_api3('ContributionRecur', 'get', [
+            'membership_id' => $membershipID,
+            'contribution_recur_id' => $contributionRecurID,
+          ]);
+          Civi::log()->debug('PayPalIPN: Membership should be  linked to  contribution recur  record ' . $contributionRecurID
+            . ' ' . $recurLinks['count'] . 'links found'
+          );
+        }
+      }
+      if (!$this->validateData($input, $ids, $objects, TRUE, $paymentProcessorID)) {
+        return;
       }
-    }
-    if (!$this->validateData($input, $ids, $objects, TRUE, $paymentProcessorID)) {
-      return;
-    }
 
-    self::$_paymentProcessor = &$objects['paymentProcessor'];
-    if ($component == 'contribute') {
-      if ($ids['contributionRecur']) {
-        // check if first contribution is completed, else complete first contribution
-        $first = TRUE;
-        $completedStatusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
-        if ($objects['contribution']->contribution_status_id == $completedStatusId) {
-          $first = FALSE;
+      $input['payment_processor_id'] = $paymentProcessorID;
+
+      self::$_paymentProcessor = &$objects['paymentProcessor'];
+      if ($component == 'contribute') {
+        if ($ids['contributionRecur']) {
+          // check if first contribution is completed, else complete first contribution
+          $first = TRUE;
+          $completedStatusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
+          if ($objects['contribution']->contribution_status_id == $completedStatusId) {
+            $first = FALSE;
+          }
+          $this->recur($input, $ids, $objects, $first);
+          return;
         }
-        $this->recur($input, $ids, $objects, $first);
+      }
+      $status = $input['paymentStatus'];
+      if ($status === 'Denied' || $status === 'Failed' || $status === 'Voided') {
+        $this->failed($objects);
+        return;
+      }
+      if ($status === 'Pending') {
+        Civi::log()->debug('Returning since contribution status is Pending');
         return;
       }
+      if ($status === 'Refunded' || $status === 'Reversed') {
+        $this->cancelled($objects);
+        return;
+      }
+      if ($status !== 'Completed') {
+        Civi::log()->debug('Returning since contribution status is not handled');
+        return;
+      }
+      $this->single($input, [
+        'related_contact' => $ids['related_contact'] ?? NULL,
+        'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL,
+        'contributionRecur' => !empty($objects['contributionRecur']) ? $objects['contributionRecur']->id : NULL,
+      ], $objects);
+    }
+    catch (CRM_Core_Exception $e) {
+      Civi::log()->debug($e->getMessage());
+      echo 'Invalid or missing data';
     }
-    $this->single($input, $ids, $objects);
   }
 
   /**
diff --git a/civicrm/CRM/Core/Payment/PayPalImpl.php b/civicrm/CRM/Core/Payment/PayPalImpl.php
index 2820e426c89054ebb3952a349a4bd5a2ae43a49d..428d77317ebd03b0f0b60c0f17623aec2cf93928 100644
--- a/civicrm/CRM/Core/Payment/PayPalImpl.php
+++ b/civicrm/CRM/Core/Payment/PayPalImpl.php
@@ -45,6 +45,25 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
     $this->_paymentProcessor = $paymentProcessor;
   }
 
+  /**
+   * @var GuzzleHttp\Client
+   */
+  protected $guzzleClient;
+
+  /**
+   * @return \GuzzleHttp\Client
+   */
+  public function getGuzzleClient(): \GuzzleHttp\Client {
+    return $this->guzzleClient ?? new \GuzzleHttp\Client();
+  }
+
+  /**
+   * @param \GuzzleHttp\Client $guzzleClient
+   */
+  public function setGuzzleClient(\GuzzleHttp\Client $guzzleClient) {
+    $this->guzzleClient = $guzzleClient;
+  }
+
   /**
    * Helper function to check which payment processor type is being used.
    *
@@ -1009,35 +1028,19 @@ class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
       throw new PaymentProcessorException('curl functions NOT available.');
     }
 
-    //setting the curl parameters.
-    $ch = curl_init();
-    curl_setopt($ch, CURLOPT_URL, $url);
-    curl_setopt($ch, CURLOPT_VERBOSE, 0);
-
-    //turning off the server and peer verification(TrustManager Concept).
-    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, Civi::settings()->get('verifySSL'));
-    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, Civi::settings()->get('verifySSL') ? 2 : 0);
-
-    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-    curl_setopt($ch, CURLOPT_POST, 1);
+    $response = (string) $this->getGuzzleClient()->post($url, [
+      'body' => $nvpreq,
+      'curl' => [
+        CURLOPT_RETURNTRANSFER => TRUE,
+        CURLOPT_SSL_VERIFYPEER => Civi::settings()->get('verifySSL'),
+      ],
+    ])->getBody();
 
-    //setting the nvpreq as POST FIELD to curl
-    curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
-
-    //getting response from server
-    $response = curl_exec($ch);
-
-    //converting NVPResponse to an Associative Array
     $result = self::deformat($response);
 
-    if (curl_errno($ch)) {
-      throw new PaymentProcessorException(ts('Network error') . ' ' . curl_error($ch) . curl_errno($ch), curl_errno($ch));
-    }
-    curl_close($ch);
-
-    $outcome = strtolower(CRM_Utils_Array::value('ack', $result));
+    $outcome = strtolower($result['ack'] ?? '');
 
-    if ($outcome != 'success' && $outcome != 'successwithwarning') {
+    if ($outcome !== 'success' && $outcome !== 'successwithwarning') {
       throw new PaymentProcessorException("{$result['l_shortmessage0']} {$result['l_longmessage0']}");
     }
 
diff --git a/civicrm/CRM/Core/Payment/PayPalProIPN.php b/civicrm/CRM/Core/Payment/PayPalProIPN.php
index e5c58d3de7ec8045dbb6e4187fd822b114853a43..2866c9bdd6b3666e634d202e955d8f1f3988ee8c 100644
--- a/civicrm/CRM/Core/Payment/PayPalProIPN.php
+++ b/civicrm/CRM/Core/Payment/PayPalProIPN.php
@@ -174,15 +174,6 @@ class CRM_Core_Payment_PayPalProIPN extends CRM_Core_Payment_BaseIPN {
 
     $now = date('YmdHis');
 
-    // fix dates that already exist
-    $dates = ['create', 'start', 'end', 'cancel', 'modified'];
-    foreach ($dates as $date) {
-      $name = "{$date}_date";
-      if ($recur->$name) {
-        $recur->$name = CRM_Utils_Date::isoToMysql($recur->$name);
-      }
-    }
-
     $sendNotification = FALSE;
     $subscriptionPaymentStatus = NULL;
     //List of Transaction Type
@@ -321,7 +312,7 @@ class CRM_Core_Payment_PayPalProIPN extends CRM_Core_Payment_BaseIPN {
    *
    * @return void
    */
-  public function single(&$input, &$ids, &$objects, $recur = FALSE, $first = FALSE) {
+  public function single($input, $ids, $objects, $recur = FALSE, $first = FALSE) {
     $contribution = &$objects['contribution'];
 
     // make sure the invoice is valid and matches what we have in the contribution record
@@ -373,7 +364,11 @@ class CRM_Core_Payment_PayPalProIPN extends CRM_Core_Payment_BaseIPN {
       return;
     }
 
-    $this->completeTransaction($input, $ids, $objects);
+    CRM_Contribute_BAO_Contribution::completeOrder($input, [
+      'related_contact' => $ids['related_contact'] ?? NULL,
+      'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL,
+      'contributionRecur' => !empty($objects['contributionRecur']) ? $objects['contributionRecur']->id : NULL,
+    ], $objects);
   }
 
   /**
@@ -412,77 +407,85 @@ class CRM_Core_Payment_PayPalProIPN extends CRM_Core_Payment_BaseIPN {
   public function main() {
     CRM_Core_Error::debug_var('GET', $_GET, TRUE, TRUE);
     CRM_Core_Error::debug_var('POST', $_POST, TRUE, TRUE);
-    if ($this->_isPaymentExpress) {
-      $this->handlePaymentExpress();
-      return;
-    }
-    $objects = $ids = $input = [];
-    $this->_component = $input['component'] = self::getValue('m');
-    $input['invoice'] = self::getValue('i', TRUE);
-    // get the contribution and contact ids from the GET params
-    $ids['contact'] = self::getValue('c', TRUE);
-    $ids['contribution'] = self::getValue('b', TRUE);
-
-    $this->getInput($input);
-
-    if ($this->_component == 'event') {
-      $ids['event'] = self::getValue('e', TRUE);
-      $ids['participant'] = self::getValue('p', TRUE);
-      $ids['contributionRecur'] = self::getValue('r', FALSE);
-    }
-    else {
-      // get the optional ids
-      //@ how can this not be broken retrieving from GET as we are dealing with a POST request?
-      // copy & paste? Note the retrieve function now uses data from _REQUEST so this will be included
-      $ids['membership'] = self::retrieve('membershipID', 'Integer', 'GET', FALSE);
-      $ids['contributionRecur'] = self::getValue('r', FALSE);
-      $ids['contributionPage'] = self::getValue('p', FALSE);
-      $ids['related_contact'] = self::retrieve('relatedContactID', 'Integer', 'GET', FALSE);
-      $ids['onbehalf_dupe_alert'] = self::retrieve('onBehalfDupeAlert', 'Integer', 'GET', FALSE);
-    }
+    try {
+      if ($this->_isPaymentExpress) {
+        $this->handlePaymentExpress();
+        return;
+      }
+      $objects = $ids = $input = [];
+      $this->_component = $input['component'] = self::getValue('m');
+      $input['invoice'] = self::getValue('i', TRUE);
+      // get the contribution and contact ids from the GET params
+      $ids['contact'] = self::getValue('c', TRUE);
+      $ids['contribution'] = self::getValue('b', TRUE);
+
+      $this->getInput($input);
+
+      if ($this->_component == 'event') {
+        $ids['event'] = self::getValue('e', TRUE);
+        $ids['participant'] = self::getValue('p', TRUE);
+        $ids['contributionRecur'] = self::getValue('r', FALSE);
+      }
+      else {
+        // get the optional ids
+        //@ how can this not be broken retrieving from GET as we are dealing with a POST request?
+        // copy & paste? Note the retrieve function now uses data from _REQUEST so this will be included
+        $ids['membership'] = self::retrieve('membershipID', 'Integer', 'GET', FALSE);
+        $ids['contributionRecur'] = self::getValue('r', FALSE);
+        $ids['contributionPage'] = self::getValue('p', FALSE);
+        $ids['related_contact'] = self::retrieve('relatedContactID', 'Integer', 'GET', FALSE);
+        $ids['onbehalf_dupe_alert'] = self::retrieve('onBehalfDupeAlert', 'Integer', 'GET', FALSE);
+      }
 
-    if (!$ids['membership'] && $ids['contributionRecur']) {
-      $sql = "
+      if (!$ids['membership'] && $ids['contributionRecur']) {
+        $sql = "
     SELECT m.id
       FROM civicrm_membership m
 INNER JOIN civicrm_membership_payment mp ON m.id = mp.membership_id AND mp.contribution_id = %1
      WHERE m.contribution_recur_id = %2
      LIMIT 1";
-      $sqlParams = [
-        1 => [$ids['contribution'], 'Integer'],
-        2 => [$ids['contributionRecur'], 'Integer'],
-      ];
-      if ($membershipId = CRM_Core_DAO::singleValueQuery($sql, $sqlParams)) {
-        $ids['membership'] = $membershipId;
+        $sqlParams = [
+          1 => [$ids['contribution'], 'Integer'],
+          2 => [$ids['contributionRecur'], 'Integer'],
+        ];
+        if ($membershipId = CRM_Core_DAO::singleValueQuery($sql, $sqlParams)) {
+          $ids['membership'] = $membershipId;
+        }
       }
-    }
 
-    $paymentProcessorID = CRM_Utils_Array::value('processor_id', $this->_inputParameters);
-    if (!$paymentProcessorID) {
-      $paymentProcessorID = self::getPayPalPaymentProcessorID();
-    }
+      $paymentProcessorID = CRM_Utils_Array::value('processor_id', $this->_inputParameters);
+      if (!$paymentProcessorID) {
+        $paymentProcessorID = self::getPayPalPaymentProcessorID();
+      }
 
-    if (!$this->validateData($input, $ids, $objects, TRUE, $paymentProcessorID)) {
-      return;
-    }
+      if (!$this->validateData($input, $ids, $objects, TRUE, $paymentProcessorID)) {
+        return;
+      }
 
-    self::$_paymentProcessor = &$objects['paymentProcessor'];
-    //?? how on earth would we not have component be one of these?
-    // they are the only valid settings & this IPN file can't even be called without one of them
-    // grepping for this class doesn't find other paths to call this class
-    if ($this->_component == 'contribute' || $this->_component == 'event') {
-      if ($ids['contributionRecur']) {
-        // check if first contribution is completed, else complete first contribution
-        $first = TRUE;
-        $completedStatusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
-        if ($objects['contribution']->contribution_status_id == $completedStatusId) {
-          $first = FALSE;
+      $input['payment_processor_id'] = $paymentProcessorID;
+
+      self::$_paymentProcessor = &$objects['paymentProcessor'];
+      //?? how on earth would we not have component be one of these?
+      // they are the only valid settings & this IPN file can't even be called without one of them
+      // grepping for this class doesn't find other paths to call this class
+      if ($this->_component == 'contribute' || $this->_component == 'event') {
+        if ($ids['contributionRecur']) {
+          // check if first contribution is completed, else complete first contribution
+          $first = TRUE;
+          $completedStatusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
+          if ($objects['contribution']->contribution_status_id == $completedStatusId) {
+            $first = FALSE;
+          }
+          $this->recur($input, $ids, $objects, $first);
+          return;
         }
-        $this->recur($input, $ids, $objects, $first);
-        return;
       }
+      $this->single($input, $ids, $objects, FALSE, FALSE);
+    }
+    catch (CRM_Core_Exception $e) {
+      Civi::log()->debug($e->getMessage());
+      echo 'Invalid or missing data';
     }
-    $this->single($input, $ids, $objects, FALSE, FALSE);
   }
 
   /**
diff --git a/civicrm/CRM/Core/Permission.php b/civicrm/CRM/Core/Permission.php
index 2c71a406defaeeb5851d23eaea4e1062330d2b20..899440812e6bfa95417859e81d131578beceeb06 100644
--- a/civicrm/CRM/Core/Permission.php
+++ b/civicrm/CRM/Core/Permission.php
@@ -119,9 +119,17 @@ class CRM_Core_Permission {
       }
       else {
         // This is an individual permission
-        $granted = CRM_Core_Config::singleton()->userPermissionClass->check($permission, $userId);
-        // Call the permission_check hook to permit dynamic escalation (CRM-19256)
-        CRM_Utils_Hook::permission_check($permission, $granted, $contactId);
+        $impliedPermissions = self::getImpliedPermissionsFor($permission);
+        $impliedPermissions[] = $permission;
+        foreach ($impliedPermissions as $permissionOption) {
+          $granted = CRM_Core_Config::singleton()->userPermissionClass->check($permissionOption, $userId);
+          // Call the permission_check hook to permit dynamic escalation (CRM-19256)
+          CRM_Utils_Hook::permission_check($permissionOption, $granted, $contactId);
+          if ($granted) {
+            break;
+          }
+        }
+
         if (
           !$granted
           && !($tempPerm && $tempPerm->check($permission))
@@ -893,11 +901,53 @@ class CRM_Core_Permission {
         $prefix . ts('send SMS'),
         ts('Send an SMS'),
       ],
+      'administer CiviCRM system' => [
+        'label' => $prefix . ts('administer CiviCRM System'),
+        'description' => ts('Perform all system administration tasks in CiviCRM'),
+      ],
+      'administer CiviCRM data' => [
+        'label' => $prefix . ts('administer CiviCRM Data'),
+        'description' => ts('Permit altering all restricted data options'),
+      ],
     ];
-
+    foreach (self::getImpliedPermissions() as $name => $includes) {
+      foreach ($includes as $permission) {
+        $permissions[$name][] = $permissions[$permission];
+      }
+    }
     return $permissions;
   }
 
+  /**
+   * Get permissions implied by 'superset' permissions.
+   *
+   * @return array
+   */
+  public static function getImpliedPermissions() {
+    return [
+      'administer CiviCRM' => ['administer CiviCRM system', 'administer CiviCRM data'],
+      'administer CiviCRM data' => ['edit message templates', 'administer dedupe rules'],
+      'administer CiviCRM system' => ['edit system workflow message templates'],
+    ];
+  }
+
+  /**
+   * Get any super-permissions that imply the given permission.
+   *
+   * @param string $permission
+   *
+   * @return array
+   */
+  public static function getImpliedPermissionsFor(string $permission) {
+    $return = [];
+    foreach (self::getImpliedPermissions() as $superPermission => $components) {
+      if (in_array($permission, $components, TRUE)) {
+        $return[$superPermission] = $superPermission;
+      }
+    }
+    return $return;
+  }
+
   /**
    * For each entity provides an array of permissions required for each action
    *
diff --git a/civicrm/CRM/Core/PrevNextCache/Sql.php b/civicrm/CRM/Core/PrevNextCache/Sql.php
index 7f8696732fedef6bc99b698740d6fef20066f8da..85cf78b139ef8e6ccbaaa1162d1f70134dabfd79 100644
--- a/civicrm/CRM/Core/PrevNextCache/Sql.php
+++ b/civicrm/CRM/Core/PrevNextCache/Sql.php
@@ -277,7 +277,7 @@ ORDER BY id
       AND        c.created_date < date_sub( NOW( ), INTERVAL %2 day )
     ";
     $params = [
-      1 => [CRM_Core_BAO_Cache::cleanKey('CiviCRM Search PrevNextCache'), 'String'],
+      1 => [CRM_Utils_Cache::cleanKey('CiviCRM Search PrevNextCache'), 'String'],
       2 => [self::cacheDays, 'Integer'],
     ];
     CRM_Core_DAO::executeQuery($sql, $params);
diff --git a/civicrm/CRM/Core/Region.php b/civicrm/CRM/Core/Region.php
index 06cece6bc9e7fd08e0da124e6e16fb39b945f710..c7eab5c58418638048df690882e7081b0c15fc2e 100644
--- a/civicrm/CRM/Core/Region.php
+++ b/civicrm/CRM/Core/Region.php
@@ -3,8 +3,7 @@
 /**
  * Maintain a set of markup/templates to inject inside various regions
  */
-class CRM_Core_Region {
-  static private $_instances = NULL;
+class CRM_Core_Region implements CRM_Core_Resources_CollectionInterface, CRM_Core_Resources_CollectionAdderInterface {
 
   /**
    * Obtain the content for a given region.
@@ -15,12 +14,14 @@ class CRM_Core_Region {
    * @return CRM_Core_Region
    */
   public static function &instance($name, $autocreate = TRUE) {
-    if ($autocreate && !isset(self::$_instances[$name])) {
-      self::$_instances[$name] = new CRM_Core_Region($name);
+    if ($autocreate && !isset(Civi::$statics[__CLASS__][$name])) {
+      Civi::$statics[__CLASS__][$name] = new CRM_Core_Region($name);
     }
-    return self::$_instances[$name];
+    return Civi::$statics[__CLASS__][$name];
   }
 
+  use CRM_Core_Resources_CollectionTrait;
+
   /**
    * Symbolic name of this region
    *
@@ -28,28 +29,13 @@ class CRM_Core_Region {
    */
   public $_name;
 
-  /**
-   * List of snippets to inject within region.
-   *
-   * e.g. $this->_snippets[3]['type'] = 'template';
-   *
-   * @var array
-   */
-  public $_snippets;
-
-  /**
-   * Whether the snippets array has been sorted
-   *
-   * @var bool
-   */
-  public $_isSorted;
-
   /**
    * @param string $name
    */
   public function __construct($name) {
     $this->_name = $name;
-    $this->_snippets = [];
+    $this->types = ['markup', 'template', 'callback', 'scriptFile', 'scriptUrl', 'script', 'jquery', 'settings', 'style', 'styleFile', 'styleUrl'];
+    $this->defaults['region'] = $name;
 
     // Placeholder which represents any of the default content generated by the main Smarty template
     $this->add([
@@ -58,92 +44,6 @@ class CRM_Core_Region {
       'markup' => '',
       'weight' => 0,
     ]);
-    $this->_isSorted = TRUE;
-  }
-
-  /**
-   * Add a snippet of content to a region.
-   *
-   * ```
-   * CRM_Core_Region::instance('page-header')->add(array(
-   *   'markup' => '<div style="color:red">Hello!</div>',
-   * ));
-   * CRM_Core_Region::instance('page-header')->add(array(
-   *   'script' => 'alert("Hello");',
-   * ));
-   * CRM_Core_Region::instance('page-header')->add(array(
-   *   'template' => 'CRM/Myextension/Extra.tpl',
-   * ));
-   * CRM_Core_Region::instance('page-header')->add(array(
-   *   'callback' => 'myextension_callback_function',
-   * ));
-   * ```
-   *
-   * Note: This function does not perform any extra encoding of markup, script code, or etc. If
-   * you're passing in user-data, you must clean it yourself.
-   *
-   * @param array $snippet
-   *   Array; keys:.
-   *   - type: string (auto-detected for markup, template, callback, script, scriptUrl, jquery, style, styleUrl)
-   *   - name: string, optional
-   *   - weight: int, optional; default=1
-   *   - disabled: int, optional; default=0
-   *   - markup: string, HTML; required (for type==markup)
-   *   - template: string, path; required (for type==template)
-   *   - callback: mixed; required (for type==callback)
-   *   - arguments: array, optional (for type==callback)
-   *   - script: string, Javascript code
-   *   - scriptUrl: string, URL of a Javascript file
-   *   - jquery: string, Javascript code which runs inside a jQuery(function($){...}); block
-   *   - style: string, CSS code
-   *   - styleUrl: string, URL of a CSS file
-   *
-   * @return array
-   */
-  public function add($snippet) {
-    static $types = ['markup', 'template', 'callback', 'scriptUrl', 'script', 'jquery', 'style', 'styleUrl'];
-    $defaults = [
-      'region' => $this->_name,
-      'weight' => 1,
-      'disabled' => FALSE,
-    ];
-    $snippet += $defaults;
-    if (!isset($snippet['type'])) {
-      foreach ($types as $type) {
-        // auto-detect
-        if (isset($snippet[$type])) {
-          $snippet['type'] = $type;
-          break;
-        }
-      }
-    }
-    if (!isset($snippet['name'])) {
-      $snippet['name'] = count($this->_snippets);
-    }
-
-    $this->_snippets[$snippet['name']] = $snippet;
-    $this->_isSorted = FALSE;
-    return $snippet;
-  }
-
-  /**
-   * @param string $name
-   * @param $snippet
-   */
-  public function update($name, $snippet) {
-    $this->_snippets[$name] = array_merge($this->_snippets[$name], $snippet);
-    $this->_isSorted = FALSE;
-  }
-
-  /**
-   * Get snippet.
-   *
-   * @param string $name
-   *
-   * @return mixed
-   */
-  public function get($name) {
-    return !empty($this->_snippets[$name]) ? $this->_snippets[$name] : NULL;
   }
 
   /**
@@ -157,23 +57,17 @@ class CRM_Core_Region {
    */
   public function render($default, $allowCmsOverride = TRUE) {
     // $default is just another part of the region
-    if (is_array($this->_snippets['default'])) {
-      $this->_snippets['default']['markup'] = $default;
+    if (is_array($this->snippets['default'])) {
+      $this->snippets['default']['markup'] = $default;
     }
-    // We hand as much of the work off to the CMS as possible
-    $cms = CRM_Core_Config::singleton()->userSystem;
 
-    if (!$this->_isSorted) {
-      uasort($this->_snippets, ['CRM_Core_Region', '_cmpSnippet']);
-      $this->_isSorted = TRUE;
-    }
+    $this->sort();
 
+    $cms = CRM_Core_Config::singleton()->userSystem;
     $smarty = CRM_Core_Smarty::singleton();
     $html = '';
-    foreach ($this->_snippets as $snippet) {
-      if ($snippet['disabled']) {
-        continue;
-      }
+
+    $renderSnippet = function($snippet) use (&$html, $smarty, $cms, $allowCmsOverride, &$renderSnippet) {
       switch ($snippet['type']) {
         case 'markup':
           $html .= $snippet['markup'];
@@ -198,14 +92,30 @@ class CRM_Core_Region {
           break;
 
         case 'jquery':
-          $snippet['script'] = sprintf("CRM.\$(function(\$) {\n%s\n});", $snippet['jquery']);
-          // no break - continue processing as script
+          $renderSnippet([
+            'type' => 'script',
+            'script' => sprintf("CRM.\$(function(\$) {\n%s\n});", $snippet['jquery']),
+          ]);
+          break;
+
+        case 'scriptFile':
+          foreach ($snippet['scriptFileUrls'] as $url) {
+            $html .= $renderSnippet(['type' => 'scriptUrl', 'scriptUrl' => $url] + $snippet);
+          }
+          break;
+
         case 'script':
           if (!$allowCmsOverride || !$cms->addScript($snippet['script'], $this->_name)) {
             $html .= sprintf("<script type=\"text/javascript\">\n%s\n</script>\n", $snippet['script']);
           }
           break;
 
+        case 'styleFile':
+          foreach ($snippet['styleFileUrls'] as $url) {
+            $html .= $renderSnippet(['type' => 'styleUrl', 'styleUrl' => $url] + $snippet);
+          }
+          break;
+
         case 'styleUrl':
           if (!$allowCmsOverride || !$cms->addStyleUrl($snippet['styleUrl'], $this->_name)) {
             $html .= sprintf("<link href=\"%s\" rel=\"stylesheet\" type=\"text/css\"/>\n", $snippet['styleUrl']);
@@ -218,35 +128,26 @@ class CRM_Core_Region {
           }
           break;
 
+        case 'settings':
+          $settingsData = json_encode($this->getSettings(), JSON_UNESCAPED_SLASHES);
+          $js = "(function(vars) {
+            if (window.CRM) CRM.$.extend(true, CRM, vars); else window.CRM = vars;
+            })($settingsData)";
+          $html .= sprintf("<script type=\"text/javascript\">\n%s\n</script>\n", $js);
+          break;
+
         default:
           throw new CRM_Core_Exception(ts('Snippet type %1 is unrecognized',
             [1 => $snippet['type']]));
       }
-    }
-    return $html;
-  }
+    };
 
-  /**
-   * @param $a
-   * @param $b
-   *
-   * @return int
-   */
-  public static function _cmpSnippet($a, $b) {
-    if ($a['weight'] < $b['weight']) {
-      return -1;
-    }
-    if ($a['weight'] > $b['weight']) {
-      return 1;
-    }
-    // fallback to name sort; don't really want to do this, but it makes results more stable
-    if ($a['name'] < $b['name']) {
-      return -1;
-    }
-    if ($a['name'] > $b['name']) {
-      return 1;
+    foreach ($this->snippets as $snippet) {
+      if (empty($snippet['disabled'])) {
+        $renderSnippet($snippet);
+      }
     }
-    return 0;
+    return $html;
   }
 
 }
diff --git a/civicrm/CRM/Core/Resources.php b/civicrm/CRM/Core/Resources.php
index 0fdc57cf21ded218925ae180b11156b934f0e5e8..77467b61203eeba218c6dc50c47bb17eaaec6e1a 100644
--- a/civicrm/CRM/Core/Resources.php
+++ b/civicrm/CRM/Core/Resources.php
@@ -24,10 +24,12 @@ use Civi\Core\Event\GenericHookEvent;
  * @package CRM
  * @copyright CiviCRM LLC https://civicrm.org/licensing
  */
-class CRM_Core_Resources {
+class CRM_Core_Resources implements CRM_Core_Resources_CollectionAdderInterface {
   const DEFAULT_WEIGHT = 0;
   const DEFAULT_REGION = 'page-footer';
 
+  use CRM_Core_Resources_CollectionAdderTrait;
+
   /**
    * We don't have a container or dependency-injection, so use singleton instead
    *
@@ -46,18 +48,13 @@ class CRM_Core_Resources {
   private $strings = NULL;
 
   /**
-   * Settings in free-form data tree.
+   * Any bundles that have been added.
    *
-   * @var array
-   */
-  protected $settings = [];
-
-  /**
-   * Setting factories.
+   * Format is ($bundleName => bool).
    *
-   * @var callable[]
+   * @var array
    */
-  protected $settingsFactories = [];
+  protected $addedBundles = [];
 
   /**
    * Added core resources.
@@ -68,15 +65,6 @@ class CRM_Core_Resources {
    */
   protected $addedCoreResources = [];
 
-  /**
-   * Added core styles.
-   *
-   * Format is ($regionName => bool).
-   *
-   * @var array
-   */
-  protected $addedCoreStyles = [];
-
   /**
    * Added settings.
    *
@@ -135,13 +123,13 @@ class CRM_Core_Resources {
    *
    * @param CRM_Extension_Mapper $extMapper
    *   Map extension names to their base path or URLs.
-   * @param CRM_Utils_Cache_Interface $cache
+   * @param CRM_Core_Resources_Strings $strings
    *   JS-localization cache.
    * @param string|null $cacheCodeKey Random code to append to resource URLs; changing the code forces clients to reload resources
    */
-  public function __construct($extMapper, $cache, $cacheCodeKey = NULL) {
+  public function __construct($extMapper, $strings, $cacheCodeKey = NULL) {
     $this->extMapper = $extMapper;
-    $this->strings = new CRM_Core_Resources_Strings($cache);
+    $this->strings = $strings;
     $this->cacheCodeKey = $cacheCodeKey;
     if ($cacheCodeKey !== NULL) {
       $this->cacheCode = Civi::settings()->get($cacheCodeKey);
@@ -154,329 +142,105 @@ class CRM_Core_Resources {
   }
 
   /**
-   * Export permission data to the client to enable smarter GUIs.
-   *
-   * Note: Application security stems from the server's enforcement
-   * of the security logic (e.g. in the API permissions). There's no way
-   * the client can use this info to make the app more secure; however,
-   * it can produce a better-tuned (non-broken) UI.
+   * Add an item to the collection.
    *
-   * @param array $permNames
-   *   List of permission names to check/export.
-   * @return CRM_Core_Resources
+   * @param array $snippet
+   * @return array
+   *   The full/computed snippet (with defaults applied).
+   * @see CRM_Core_Resources_CollectionInterface::add()
    */
-  public function addPermissions($permNames) {
-    $permNames = (array) $permNames;
-    $perms = [];
-    foreach ($permNames as $permName) {
-      $perms[$permName] = CRM_Core_Permission::check($permName);
+  public function add($snippet) {
+    if (!isset($snippet['region'])) {
+      $snippet['region'] = self::DEFAULT_REGION;
     }
-    return $this->addSetting([
-      'permissions' => $perms,
-    ]);
-  }
-
-  /**
-   * Add a JavaScript file to the current page using <SCRIPT SRC>.
-   *
-   * @param string $ext
-   *   extension name; use 'civicrm' for core.
-   * @param string $file
-   *   file path -- relative to the extension base dir.
-   * @param int $weight
-   *   relative weight within a given region.
-   * @param string $region
-   *   location within the file; 'html-header', 'page-header', 'page-footer'.
-   * @param bool|string $translate
-   *   Whether to load translated strings for this file. Use one of:
-   *   - FALSE: Do not load translated strings.
-   *   - TRUE: Load translated strings. Use the $ext's default domain.
-   *   - string: Load translated strings. Use a specific domain.
-   *
-   * @return CRM_Core_Resources
-   *
-   * @throws \CRM_Core_Exception
-   */
-  public function addScriptFile($ext, $file, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION, $translate = TRUE) {
-    if ($translate) {
-      $domain = ($translate === TRUE) ? $ext : $translate;
-      $this->addString($this->strings->get($domain, $this->getPath($ext, $file), 'text/javascript'), $domain);
+    if (!isset($snippet['weight'])) {
+      $snippet['weight'] = self::DEFAULT_WEIGHT;
     }
-    $url = $this->getUrl($ext, $this->filterMinify($ext, $file), TRUE);
-    return $this->addScriptUrl($url, $weight, $region);
-  }
-
-  /**
-   * Add a JavaScript file to the current page using <SCRIPT SRC>.
-   *
-   * @param string $url
-   * @param int $weight
-   *   relative weight within a given region.
-   * @param string $region
-   *   location within the file; 'html-header', 'page-header', 'page-footer'.
-   * @return CRM_Core_Resources
-   */
-  public function addScriptUrl($url, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) {
-    CRM_Core_Region::instance($region)->add([
-      'name' => $url,
-      'type' => 'scriptUrl',
-      'scriptUrl' => $url,
-      'weight' => $weight,
-      'region' => $region,
-    ]);
-    return $this;
+    return CRM_Core_Region::instance($snippet['region'])->add($snippet);
   }
 
   /**
-   * Add a JavaScript file to the current page using <SCRIPT SRC>.
+   * Locate the 'settings' snippet.
    *
-   * @param string $code
-   *   JavaScript source code.
-   * @param int $weight
-   *   relative weight within a given region.
-   * @param string $region
-   *   location within the file; 'html-header', 'page-header', 'page-footer'.
-   * @return CRM_Core_Resources
+   * @param array $options
+   * @return array
+   * @see CRM_Core_Resources_CollectionTrait::findCreateSettingSnippet()
    */
-  public function addScript($code, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) {
-    CRM_Core_Region::instance($region)->add([
-        // 'name' => automatic
-      'type' => 'script',
-      'script' => $code,
-      'weight' => $weight,
-      'region' => $region,
+  public function &findCreateSettingSnippet($options = []): array {
+    $options = CRM_Core_Resources_CollectionAdderTrait::mergeSettingOptions($options, [
+      'region' => NULL,
     ]);
-    return $this;
-  }
-
-  /**
-   * Add JavaScript variables to CRM.vars
-   *
-   * Example:
-   * From the server:
-   * CRM_Core_Resources::singleton()->addVars('myNamespace', array('foo' => 'bar'));
-   * Access var from javascript:
-   * CRM.vars.myNamespace.foo // "bar"
-   *
-   * @see https://docs.civicrm.org/dev/en/latest/standards/javascript/
-   *
-   * @param string $nameSpace
-   *   Usually the name of your extension.
-   * @param array $vars
-   * @param string $region
-   *   The region to add settings to (eg. for payment processors usually billing-block)
-   *
-   * @return CRM_Core_Resources
-   */
-  public function addVars($nameSpace, $vars, $region = NULL) {
-    $existing = CRM_Utils_Array::value($nameSpace, CRM_Utils_Array::value('vars', $this->settings), []);
-    $vars = $this->mergeSettings($existing, $vars);
-    $this->addSetting(['vars' => [$nameSpace => $vars]], $region);
-    return $this;
-  }
-
-  /**
-   * Add JavaScript variables to the root of the CRM object.
-   * This function is usually reserved for low-level system use.
-   * Extensions and components should generally use addVars instead.
-   *
-   * @param array $settings
-   * @param string $region
-   *   The region to add settings to (eg. for payment processors usually billing-block)
-   *
-   * @return CRM_Core_Resources
-   */
-  public function addSetting($settings, $region = NULL) {
-    if (!$region) {
-      $region = self::isAjaxMode() ? 'ajax-snippet' : 'html-header';
-    }
-    $this->settings = $this->mergeSettings($this->settings, $settings);
-    if (isset($this->addedSettings[$region])) {
+    return $this->getSettingRegion($options['region'])->findCreateSettingSnippet($options);
+  }
+
+  /**
+   * Assimilate all the resources listed in a bundle.
+   *
+   * @param iterable|string|\CRM_Core_Resources_Bundle $bundle
+   *   Either bundle object, or the symbolic name of a bundle, or a list of bundles.
+   *   Note: For symbolic names, the bundle must be a container service ('bundle.FOO').
+   * @return static
+   */
+  public function addBundle($bundle) {
+    // There are two ways you might write this method: (1) immediately merge
+    // resources from the bundle, or (2) store a reference to the bundle and
+    // merge resources later. Both have pros/cons. The implementation does #1.
+    //
+    // The upshot of #1 is *multi-region* support. For example, a bundle might
+    // add some JS to `html-header` and then add some HTML to `page-header`.
+    // Implementing this requires splitting the bundle (ie copying specific
+    // resources to their respective regions). The timing of `addBundle()` is
+    // favorable to splitting.
+    //
+    // The upshot of #2 would be *reduced timing sensitivity for downstream*:
+    // if party A wants to include some bundle, and party B wants to refine
+    // the same bundle, then it wouldn't matter if A or B executed first.
+    // This should make DX generally more forgiving. But we can't split until
+    // everyone has their shot at tweaking the bundle.
+    //
+    // In theory, you could have both characteristics if you figure the right
+    // time at which to perform a split. Or maybe you could have both by tracking
+    // more detailed references+events among the bundles/regions. I haven't
+    // seen a simple way to do get both.
+
+    if (is_iterable($bundle)) {
+      foreach ($bundle as $b) {
+        $this->addBundle($b);
+      }
       return $this;
     }
-    $resources = $this;
-    $settingsResource = [
-      'callback' => function (&$snippet, &$html) use ($resources, $region) {
-        $html .= "\n" . $resources->renderSetting($region);
-      },
-      'weight' => -100000,
-    ];
-    CRM_Core_Region::instance($region)->add($settingsResource);
-    $this->addedSettings[$region] = TRUE;
-    return $this;
-  }
-
-  /**
-   * Add JavaScript variables to the global CRM object via a callback function.
-   *
-   * @param callable $callable
-   * @return CRM_Core_Resources
-   */
-  public function addSettingsFactory($callable) {
-    // Make sure our callback has been registered
-    $this->addSetting([]);
-    $this->settingsFactories[] = $callable;
-    return $this;
-  }
-
-  /**
-   * Helper fn for addSettingsFactory.
-   */
-  public function getSettings() {
-    $result = $this->settings;
-    foreach ($this->settingsFactories as $callable) {
-      $result = $this->mergeSettings($result, $callable());
-    }
-    CRM_Utils_Hook::alterResourceSettings($result);
-    return $result;
-  }
 
-  /**
-   * @param array $settings
-   * @param array $additions
-   * @return array
-   *   combination of $settings and $additions
-   */
-  protected function mergeSettings($settings, $additions) {
-    foreach ($additions as $k => $v) {
-      if (isset($settings[$k]) && is_array($settings[$k]) && is_array($v)) {
-        $v += $settings[$k];
-      }
-      $settings[$k] = $v;
+    if (is_string($bundle)) {
+      $bundle = Civi::service('bundle.' . $bundle);
     }
-    return $settings;
-  }
 
-  /**
-   * Helper fn for addSetting.
-   * Render JavaScript variables for the global CRM object.
-   *
-   * @return string
-   */
-  public function renderSetting($region = NULL) {
-    // On a standard page request we construct the CRM object from scratch
-    if (($region === 'html-header') || !self::isAjaxMode()) {
-      $js = 'var CRM = ' . json_encode($this->getSettings()) . ';';
-    }
-    // For an ajax request we append to it
-    else {
-      $js = 'CRM.$.extend(true, CRM, ' . json_encode($this->getSettings()) . ');';
+    if (isset($this->addedBundles[$bundle->name])) {
+      return $this;
     }
-    return sprintf("<script type=\"text/javascript\">\n%s\n</script>\n", $js);
-  }
+    $this->addedBundles[$bundle->name] = TRUE;
 
-  /**
-   * Add translated string to the js CRM object.
-   * It can then be retrived from the client-side ts() function
-   * Variable substitutions can happen from client-side
-   *
-   * Note: this function rarely needs to be called directly and is mostly for internal use.
-   * See CRM_Core_Resources::addScriptFile which automatically adds translated strings from js files
-   *
-   * Simple example:
-   * // From php:
-   * CRM_Core_Resources::singleton()->addString('Hello');
-   * // The string is now available to javascript code i.e.
-   * ts('Hello');
-   *
-   * Example with client-side substitutions:
-   * // From php:
-   * CRM_Core_Resources::singleton()->addString('Your %1 has been %2');
-   * // ts() in javascript works the same as in php, for example:
-   * ts('Your %1 has been %2', {1: objectName, 2: actionTaken});
-   *
-   * NOTE: This function does not work with server-side substitutions
-   * (as this might result in collisions and unwanted variable injections)
-   * Instead, use code like:
-   * CRM_Core_Resources::singleton()->addSetting(array('myNamespace' => array('myString' => ts('Your %1 has been %2', array(subs)))));
-   * And from javascript access it at CRM.myNamespace.myString
-   *
-   * @param string|array $text
-   * @param string|null $domain
-   * @return CRM_Core_Resources
-   */
-  public function addString($text, $domain = 'civicrm') {
-    foreach ((array) $text as $str) {
-      $translated = ts($str, [
-        'domain' => ($domain == 'civicrm') ? NULL : [$domain, NULL],
-        'raw' => TRUE,
-      ]);
-
-      // We only need to push this string to client if the translation
-      // is actually different from the original
-      if ($translated != $str) {
-        $bucket = $domain == 'civicrm' ? 'strings' : 'strings::' . $domain;
-        $this->addSetting([
-          $bucket => [$str => $translated],
-        ]);
+    // Ensure that every asset has a region.
+    $bundle->filter(function($snippet) {
+      if (empty($snippet['region'])) {
+        $snippet['region'] = isset($snippet['settings'])
+          ? $this->getSettingRegion()->_name
+          : self::DEFAULT_REGION;
       }
-    }
-    return $this;
-  }
+      return $snippet;
+    });
 
-  /**
-   * Add a CSS file to the current page using <LINK HREF>.
-   *
-   * @param string $ext
-   *   extension name; use 'civicrm' for core.
-   * @param string $file
-   *   file path -- relative to the extension base dir.
-   * @param int $weight
-   *   relative weight within a given region.
-   * @param string $region
-   *   location within the file; 'html-header', 'page-header', 'page-footer'.
-   * @return CRM_Core_Resources
-   */
-  public function addStyleFile($ext, $file, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) {
-    /** @var Civi\Core\Themes $theme */
-    $theme = Civi::service('themes');
-    foreach ($theme->resolveUrls($theme->getActiveThemeKey(), $ext, $file) as $url) {
-      $this->addStyleUrl($url, $weight, $region);
+    $byRegion = CRM_Utils_Array::index(['region', 'name'], $bundle->getAll());
+    foreach ($byRegion as $regionName => $snippets) {
+      CRM_Core_Region::instance($regionName)->merge($snippets);
     }
     return $this;
   }
 
   /**
-   * Add a CSS file to the current page using <LINK HREF>.
-   *
-   * @param string $url
-   * @param int $weight
-   *   relative weight within a given region.
-   * @param string $region
-   *   location within the file; 'html-header', 'page-header', 'page-footer'.
-   * @return CRM_Core_Resources
-   */
-  public function addStyleUrl($url, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) {
-    CRM_Core_Region::instance($region)->add([
-      'name' => $url,
-      'type' => 'styleUrl',
-      'styleUrl' => $url,
-      'weight' => $weight,
-      'region' => $region,
-    ]);
-    return $this;
-  }
-
-  /**
-   * Add a CSS content to the current page using <STYLE>.
-   *
-   * @param string $code
-   *   CSS source code.
-   * @param int $weight
-   *   relative weight within a given region.
-   * @param string $region
-   *   location within the file; 'html-header', 'page-header', 'page-footer'.
-   * @return CRM_Core_Resources
+   * Helper fn for addSettingsFactory.
    */
-  public function addStyle($code, $weight = self::DEFAULT_WEIGHT, $region = self::DEFAULT_REGION) {
-    CRM_Core_Region::instance($region)->add([
-        // 'name' => automatic
-      'type' => 'style',
-      'style' => $code,
-      'weight' => $weight,
-      'region' => $region,
-    ]);
-    return $this;
+  public function getSettings($region = NULL) {
+    return $this->getSettingRegion($region)->getSettings();
   }
 
   /**
@@ -601,50 +365,19 @@ class CRM_Core_Resources {
    * This adds CiviCRM's standard css and js to the specified region of the document.
    * It will only run once.
    *
-   * TODO: Separate the functional code (like addStyle/addScript) from the policy code
-   * (like addCoreResources/addCoreStyles).
-   *
    * @param string $region
    * @return CRM_Core_Resources
    */
   public function addCoreResources($region = 'html-header') {
-    if (!isset($this->addedCoreResources[$region]) && !self::isAjaxMode()) {
-      $this->addedCoreResources[$region] = TRUE;
-      $config = CRM_Core_Config::singleton();
-
-      // Add resources from coreResourceList
-      $jsWeight = -9999;
-      foreach ($this->coreResourceList($region) as $item) {
-        if (is_array($item)) {
-          $this->addSetting($item);
-        }
-        elseif (strpos($item, '.css')) {
-          $this->isFullyFormedUrl($item) ? $this->addStyleUrl($item, -100, $region) : $this->addStyleFile('civicrm', $item, -100, $region);
-        }
-        elseif ($this->isFullyFormedUrl($item)) {
-          $this->addScriptUrl($item, $jsWeight++, $region);
-        }
-        else {
-          // Don't bother  looking for ts() calls in packages, there aren't any
-          $translate = (substr($item, 0, 3) == 'js/');
-          $this->addScriptFile('civicrm', $item, $jsWeight++, $region, $translate);
-        }
-      }
-      // Add global settings
-      $settings = [
-        'config' => [
-          'isFrontend' => $config->userFrameworkFrontend,
-        ],
-      ];
-      // Disable profile creation if user lacks permission
-      if (!CRM_Core_Permission::check('edit all contacts') && !CRM_Core_Permission::check('add contacts')) {
-        $settings['config']['entityRef']['contactCreate'] = FALSE;
-      }
-      $this->addSetting($settings);
-
-      // Give control of jQuery and _ back to the CMS - this loads last
-      $this->addScriptFile('civicrm', 'js/noconflict.js', 9999, $region, FALSE);
-
+    if ($region !== 'html-header') {
+      // The signature of this method allowed different regions. However, this
+      // doesn't appear to be used - based on grepping `universe` generally
+      // and `civicrm-{core,backdrop,drupal,packages,wordpress,joomla}` specifically,
+      // it appears that all callers use 'html-header' (either implicitly or explicitly).
+      throw new \CRM_Core_Exception("Error: addCoreResources only supports html-header");
+    }
+    if (!self::isAjaxMode()) {
+      $this->addBundle('coreResources');
       $this->addCoreStyles($region);
     }
     return $this;
@@ -653,28 +386,18 @@ class CRM_Core_Resources {
   /**
    * This will add CiviCRM's standard CSS
    *
-   * TODO: Separate the functional code (like addStyle/addScript) from the policy code
-   * (like addCoreResources/addCoreStyles).
-   *
    * @param string $region
    * @return CRM_Core_Resources
    */
   public function addCoreStyles($region = 'html-header') {
-    if (!isset($this->addedCoreStyles[$region])) {
-      $this->addedCoreStyles[$region] = TRUE;
-
-      // Load custom or core css
-      $config = CRM_Core_Config::singleton();
-      if (!empty($config->customCSSURL)) {
-        $customCSSURL = $this->addCacheCode($config->customCSSURL);
-        $this->addStyleUrl($customCSSURL, 99, $region);
-      }
-      if (!Civi::settings()->get('disable_core_css')) {
-        $this->addStyleFile('civicrm', 'css/civicrm.css', -99, $region);
-      }
-      // crm-i.css added ahead of other styles so it can be overridden by FA.
-      $this->addStyleFile('civicrm', 'css/crm-i.css', -101, $region);
-    }
+    if ($region !== 'html-header') {
+      // The signature of this method allowed different regions. However, this
+      // doesn't appear to be used - based on grepping `universe` generally
+      // and `civicrm-{core,backdrop,drupal,packages,wordpress,joomla}` specifically,
+      // it appears that all callers use 'html-header' (either implicitly or explicitly).
+      throw new \CRM_Core_Exception("Error: addCoreResources only supports html-header");
+    }
+    $this->addBundle('coreStyles');
     return $this;
   }
 
@@ -715,142 +438,6 @@ class CRM_Core_Resources {
     CRM_Utils_System::civiExit();
   }
 
-  /**
-   * List of core resources we add to every CiviCRM page.
-   *
-   * Note: non-compressed versions of .min files will be used in debug mode
-   *
-   * @param string $region
-   * @return array
-   */
-  public function coreResourceList($region) {
-    $config = CRM_Core_Config::singleton();
-
-    // Scripts needed by everyone, everywhere
-    // FIXME: This is too long; list needs finer-grained segmentation
-    $items = [
-      "bower_components/jquery/dist/jquery.min.js",
-      "bower_components/jquery-ui/jquery-ui.min.js",
-      "bower_components/jquery-ui/themes/smoothness/jquery-ui.min.css",
-      "bower_components/lodash-compat/lodash.min.js",
-      "packages/jquery/plugins/jquery.mousewheel.min.js",
-      "bower_components/select2/select2.min.js",
-      "bower_components/select2/select2.min.css",
-      "bower_components/font-awesome/css/font-awesome.min.css",
-      "packages/jquery/plugins/jquery.form.min.js",
-      "packages/jquery/plugins/jquery.timeentry.min.js",
-      "packages/jquery/plugins/jquery.blockUI.min.js",
-      "bower_components/datatables/media/js/jquery.dataTables.min.js",
-      "bower_components/datatables/media/css/jquery.dataTables.min.css",
-      "bower_components/jquery-validation/dist/jquery.validate.min.js",
-      "bower_components/jquery-validation/dist/additional-methods.min.js",
-      "packages/jquery/plugins/jquery.ui.datepicker.validation.min.js",
-      "js/Common.js",
-      "js/crm.datepicker.js",
-      "js/crm.ajax.js",
-      "js/wysiwyg/crm.wysiwyg.js",
-    ];
-
-    // Dynamic localization script
-    $items[] = $this->addCacheCode(
-      CRM_Utils_System::url('civicrm/ajax/l10n-js/' . CRM_Core_I18n::getLocale(),
-        ['cid' => CRM_Core_Session::getLoggedInContactID()], FALSE, NULL, FALSE)
-    );
-
-    // add wysiwyg editor
-    $editor = Civi::settings()->get('editor_id');
-    if ($editor == "CKEditor") {
-      CRM_Admin_Form_CKEditorConfig::setConfigDefault();
-      $items[] = [
-        'config' => [
-          'wysisygScriptLocation' => Civi::paths()->getUrl("[civicrm.root]/js/wysiwyg/crm.ckeditor.js"),
-          'CKEditorCustomConfig' => CRM_Admin_Form_CKEditorConfig::getConfigUrl(),
-        ],
-      ];
-    }
-
-    // These scripts are only needed by back-office users
-    if (CRM_Core_Permission::check('access CiviCRM')) {
-      $items[] = "packages/jquery/plugins/jquery.tableHeader.js";
-      $items[] = "packages/jquery/plugins/jquery.notify.min.js";
-    }
-
-    $contactID = CRM_Core_Session::getLoggedInContactID();
-
-    // Menubar
-    $position = 'none';
-    if (
-      $contactID && !$config->userFrameworkFrontend
-      && CRM_Core_Permission::check('access CiviCRM')
-      && !@constant('CIVICRM_DISABLE_DEFAULT_MENU')
-      && !CRM_Core_Config::isUpgradeMode()
-    ) {
-      $position = Civi::settings()->get('menubar_position') ?: 'over-cms-menu';
-    }
-    if ($position !== 'none') {
-      $items[] = 'bower_components/smartmenus/dist/jquery.smartmenus.min.js';
-      $items[] = 'bower_components/smartmenus/dist/addons/keyboard/jquery.smartmenus.keyboard.min.js';
-      $items[] = 'js/crm.menubar.js';
-      // @see CRM_Core_Resources::renderMenubarStylesheet
-      $items[] = Civi::service('asset_builder')->getUrl('crm-menubar.css', [
-        'menubarColor' => Civi::settings()->get('menubar_color'),
-        'height' => 40,
-        'breakpoint' => 768,
-      ]);
-      // Variables for crm.menubar.js
-      $items[] = [
-        'menubar' => [
-          'position' => $position,
-          'qfKey' => CRM_Core_Key::get('CRM_Contact_Controller_Search', TRUE),
-          'cacheCode' => CRM_Core_BAO_Navigation::getCacheKey($contactID),
-        ],
-      ];
-    }
-
-    // JS for multilingual installations
-    if (!empty($config->languageLimit) && count($config->languageLimit) > 1 && CRM_Core_Permission::check('translate CiviCRM')) {
-      $items[] = "js/crm.multilingual.js";
-    }
-
-    // Enable administrators to edit option lists in a dialog
-    if (CRM_Core_Permission::check('administer CiviCRM') && $this->ajaxPopupsEnabled) {
-      $items[] = "js/crm.optionEdit.js";
-    }
-
-    $tsLocale = CRM_Core_I18n::getLocale();
-    // Add localized jQuery UI files
-    if ($tsLocale && $tsLocale != 'en_US') {
-      // Search for i18n file in order of specificity (try fr-CA, then fr)
-      list($lang) = explode('_', $tsLocale);
-      $path = "bower_components/jquery-ui/ui/i18n";
-      foreach ([str_replace('_', '-', $tsLocale), $lang] as $language) {
-        $localizationFile = "$path/datepicker-{$language}.js";
-        if ($this->getPath('civicrm', $localizationFile)) {
-          $items[] = $localizationFile;
-          break;
-        }
-      }
-    }
-
-    // Allow hooks to modify this list
-    CRM_Utils_Hook::coreResourceList($items, $region);
-
-    // Oof, existing listeners would expect $items to typically begin with 'bower_components/' or 'packages/'
-    // (using an implicit base of `[civicrm.root]`). We preserve the hook contract and cleanup $items post-hook.
-    $map = [
-      'bower_components' => rtrim(Civi::paths()->getUrl('[civicrm.bower]/.', 'absolute'), '/'),
-      'packages' => rtrim(Civi::paths()->getUrl('[civicrm.packages]/.', 'absolute'), '/'),
-    ];
-    $filter = function($m) use ($map) {
-      return $map[$m[1]] . $m[2];
-    };
-    $items = array_map(function($item) use ($filter) {
-      return is_array($item) ? $item : preg_replace_callback(';^(bower_components|packages)(/.*);', $filter, $item);
-    }, $items);
-
-    return $items;
-  }
-
   /**
    * @return bool
    *   is this page request an ajax snippet?
@@ -994,4 +581,14 @@ class CRM_Core_Resources {
     return (substr($url, 0, 4) === 'http') || (substr($url, 0, 1) === '/');
   }
 
+  /**
+   * @param string|NULL $region
+   *   Optional request for a specific region. If NULL/omitted, use global default.
+   * @return \CRM_Core_Region
+   */
+  private function getSettingRegion($region = NULL) {
+    $region = $region ?: (self::isAjaxMode() ? 'ajax-snippet' : 'html-header');
+    return CRM_Core_Region::instance($region);
+  }
+
 }
diff --git a/civicrm/CRM/Core/Resources/Bundle.php b/civicrm/CRM/Core/Resources/Bundle.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c1124f54cfc56fad6c77a9009d69d4aff16fdd0
--- /dev/null
+++ b/civicrm/CRM/Core/Resources/Bundle.php
@@ -0,0 +1,77 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Class CRM_Core_Resources_Bundle
+ *
+ * A bundle is a collection of web resources with the following details:
+ * - Only scripts, styles, and settings are allowed. Free-form markup is not.
+ * - Resources *may* have a 'region'. Hopefully, this is not necessary for most bundles.
+ * - If no 'region' is given, then CRM_Core_Resources will pick a default at activation time.
+ */
+class CRM_Core_Resources_Bundle implements CRM_Core_Resources_CollectionInterface {
+
+  use CRM_Core_Resources_CollectionTrait;
+
+  /**
+   * Symbolic name for this bundle.
+   *
+   * @var string|null
+   */
+  public $name;
+
+  /**
+   * @param string|NULL $name
+   * @param string[]|NULL $types
+   *   List of resource-types to permit in this bundle. NULL for a default list.
+   *   Ex: ['styleFile', 'styleUrl']
+   *   The following aliases are allowed: '*all*', '*default*', '*script*', '*style*'
+   */
+  public function __construct($name = NULL, $types = NULL) {
+    $this->name = $name;
+
+    $typeAliases = [
+      '*all*' => ['script', 'scriptFile', 'scriptUrl', 'settings', 'style', 'styleFile', 'styleUrl', 'markup', 'template', 'callback'],
+      '*default*' => ['script', 'scriptFile', 'scriptUrl', 'settings', 'style', 'styleFile', 'styleUrl'],
+      '*style*' => ['style', 'styleFile', 'styleUrl'],
+      '*script*' => ['script', 'scriptFile', 'scriptUrl'],
+    ];
+    $mapType = function ($t) use ($typeAliases) {
+      return $typeAliases[$t] ?? [$t];
+    };
+    $types = $types ?: ['*default*'];
+    $this->types = array_unique(array_merge(...array_map($mapType, (array) $types)));
+  }
+
+  /**
+   * Fill in default values for the 'region' property.
+   *
+   * @return static
+   */
+  public function fillDefaults() {
+    $this->filter(function ($s) {
+      if (!isset($s['region'])) {
+        if ($s['type'] === 'settings') {
+          $s['region'] = NULL;
+        }
+        elseif (preg_match(';^(markup|template|callback);', $s['type'])) {
+          $s['region'] = 'page-header';
+        }
+        else {
+          $s['region'] = CRM_Core_Resources_Common::REGION;
+        }
+      }
+      return $s;
+    });
+    return $this;
+  }
+
+}
diff --git a/civicrm/CRM/Core/Resources/CollectionAdderInterface.php b/civicrm/CRM/Core/Resources/CollectionAdderInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..e3b4f2cc92122859aed75472d35772c287aaee57
--- /dev/null
+++ b/civicrm/CRM/Core/Resources/CollectionAdderInterface.php
@@ -0,0 +1,232 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * The collection-adder interface provides write-only support for a collection.
+ *
+ * @see CRM_Core_Resources_CollectionAdderTrait
+ */
+interface CRM_Core_Resources_CollectionAdderInterface {
+
+  /**
+   * Add an item to the collection.
+   *
+   * @param array $snippet
+   * @return array
+   *   The full/computed snippet (with defaults applied).
+   * @see CRM_Core_Resources_CollectionInterface::add()
+   */
+  public function add($snippet);
+
+  // TODO public function addBundle($bundle);
+
+  /**
+   * Add an HTML blob.
+   *
+   * Ex: addMarkup('<p>Hello world!</p>', ['weight' => 123]);
+   *
+   * @param string $markup
+   *   HTML code.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addMarkup(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addScript()
+   */
+  public function addMarkup(string $markup, ...$options);
+
+  /**
+   * Export permission data to the client to enable smarter GUIs.
+   *
+   * Note: Application security stems from the server's enforcement
+   * of the security logic (e.g. in the API permissions). There's no way
+   * the client can use this info to make the app more secure; however,
+   * it can produce a better-tuned (non-broken) UI.
+   *
+   * @param string|iterable $permNames
+   *   List of permission names to check/export.
+   * @return static
+   */
+  public function addPermissions($permNames);
+
+  /**
+   * Add a JavaScript file to the current page using <SCRIPT SRC>.
+   *
+   * Ex: addScript('alert("Hello world");', ['weight' => 123]);
+   *
+   * @param string $code
+   *   JavaScript source code.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addScript(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   */
+  public function addScript(string $code, ...$options);
+
+  /**
+   * Add a JavaScript file to the current page using <SCRIPT SRC>.
+   *
+   * Ex: addScriptFile('myextension', 'myscript.js', ['weight' => 123]);
+   *
+   * @param string $ext
+   *   Extension name; use 'civicrm' for core.
+   * @param string $file
+   *   File path -- relative to the extension base dir.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addScriptFile(string $code, int $weight, string $region, mixed $translate).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   */
+  public function addScriptFile(string $ext, string $file, ...$options);
+
+  /**
+   * Add a JavaScript URL to the current page using <SCRIPT SRC>.
+   *
+   * Ex: addScriptUrl('http://example.com/foo.js', ['weight' => 123])
+   *
+   * @param string $url
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addScriptUrl(string $url, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   */
+  public function addScriptUrl(string $url, ...$options);
+
+  /**
+   * Add translated string to the js CRM object.
+   * It can then be retrived from the client-side ts() function
+   * Variable substitutions can happen from client-side
+   *
+   * Note: this function rarely needs to be called directly and is mostly for internal use.
+   * See CRM_Core_Resources::addScriptFile which automatically adds translated strings from js files
+   *
+   * Simple example:
+   * // From php:
+   * CRM_Core_Resources::singleton()->addString('Hello');
+   * // The string is now available to javascript code i.e.
+   * ts('Hello');
+   *
+   * Example with client-side substitutions:
+   * // From php:
+   * CRM_Core_Resources::singleton()->addString('Your %1 has been %2');
+   * // ts() in javascript works the same as in php, for example:
+   * ts('Your %1 has been %2', {1: objectName, 2: actionTaken});
+   *
+   * NOTE: This function does not work with server-side substitutions
+   * (as this might result in collisions and unwanted variable injections)
+   * Instead, use code like:
+   * CRM_Core_Resources::singleton()->addSetting(array('myNamespace' => array('myString' => ts('Your %1 has been %2', array(subs)))));
+   * And from javascript access it at CRM.myNamespace.myString
+   *
+   * @param string|array $text
+   * @param string|null $domain
+   * @return static
+   */
+  public function addString($text, $domain = 'civicrm');
+
+  /**
+   * Add a CSS content to the current page using <STYLE>.
+   *
+   * Ex: addStyle('p { color: red; }', ['weight' => 100]);
+   *
+   * @param string $code
+   *   CSS source code.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addStyle(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   */
+  public function addStyle(string $code, ...$options);
+
+  /**
+   * Add a CSS file to the current page using <LINK HREF>.
+   *
+   * Ex: addStyleFile('myextension', 'mystyles.css', ['weight' => 100]);
+   *
+   * @param string $ext
+   *   Extension name; use 'civicrm' for core.
+   * @param string $file
+   *   File path -- relative to the extension base dir.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addStyle(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   */
+  public function addStyleFile(string $ext, string $file, ...$options);
+
+  /**
+   * Add a CSS file to the current page using <LINK HREF>.
+   *
+   * Ex: addStyleUrl('http://example.com/foo.css', ['weight' => 100]);
+   *
+   * @param string $url
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addStyleUrl(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   */
+  public function addStyleUrl(string $url, ...$options);
+
+  /**
+   * Add JavaScript variables to CRM.vars
+   *
+   * Example:
+   *   From the server:
+   *     CRM_Core_Resources::singleton()->addVars('myNamespace', array('foo' => 'bar'));
+   *   Access var from javascript:
+   *     CRM.vars.myNamespace.foo // "bar"
+   *
+   * @see https://docs.civicrm.org/dev/en/latest/standards/javascript/
+   *
+   * @param string $nameSpace
+   *   Usually the name of your extension.
+   * @param array $vars
+   *   Data to export.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addVars(string $namespace, array $vars, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   */
+  public function addVars(string $nameSpace, array $vars, ...$options);
+
+  /**
+   * Add JavaScript variables to the root of the CRM object.
+   * This function is usually reserved for low-level system use.
+   * Extensions and components should generally use addVars instead.
+   *
+   * @param array $settings
+   *   Data to export.
+   * @param array $options
+   *   Not used.
+   *   Positional equivalence: addSetting(array $settings, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addSetting()
+   */
+  public function addSetting(array $settings, ...$options);
+
+  /**
+   * Add JavaScript variables to the global CRM object via a callback function.
+   *
+   * @param callable $callable
+   * @return static
+   */
+  public function addSettingsFactory($callable);
+
+}
diff --git a/civicrm/CRM/Core/Resources/CollectionAdderTrait.php b/civicrm/CRM/Core/Resources/CollectionAdderTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..da81a34a03d9935211646b66e49ace2441929fc6
--- /dev/null
+++ b/civicrm/CRM/Core/Resources/CollectionAdderTrait.php
@@ -0,0 +1,429 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Class CRM_Core_Resources_CollectionTrait
+ *
+ * This trait is a building-block for creating classes which maintain a list of
+ * resources. It defines a set of helper functions which provide syntactic sugar
+ * for calling the add() method. It implements most of the `CollectionAdderInterface`.
+ *
+ * @see CRM_Core_Resources_CollectionAdderInterface
+ */
+trait CRM_Core_Resources_CollectionAdderTrait {
+
+  /**
+   * Add an item to the collection.
+   *
+   * @param array $snippet
+   * @return array
+   *   The full/computed snippet (with defaults applied).
+   * @see CRM_Core_Resources_CollectionInterface::add()
+   * @see CRM_Core_Resources_CollectionTrait::add()
+   */
+  abstract public function add($snippet);
+
+  /**
+   * Locate the 'settings' snippet.
+   *
+   * @param array $options
+   * @return array
+   * @see CRM_Core_Resources_CollectionTrait::findCreateSettingSnippet()
+   */
+  abstract public function &findCreateSettingSnippet($options = []): array;
+
+  /**
+   * Add an HTML blob.
+   *
+   * Ex: addMarkup('<p>Hello world!</p>', ['weight' => 123]);
+   *
+   * @param string $markup
+   *   HTML code.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addMarkup(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addMarkup()
+   */
+  public function addMarkup(string $markup, ...$options) {
+    $this->add(self::mergeStandardOptions($options, [
+      'markup' => $markup,
+    ]));
+    return $this;
+  }
+
+  /**
+   * Export permission data to the client to enable smarter GUIs.
+   *
+   * @param string|iterable $permNames
+   *   List of permission names to check/export.
+   * @return static
+   * @see CRM_Core_Resources_CollectionAdderInterface::addPermissions()
+   */
+  public function addPermissions($permNames) {
+    // TODO: Maybe this should be its own resource type to allow smarter management?
+    $permNames = is_scalar($permNames) ? [$permNames] : $permNames;
+
+    $perms = [];
+    foreach ($permNames as $permName) {
+      $perms[$permName] = CRM_Core_Permission::check($permName);
+    }
+    return $this->addSetting([
+      'permissions' => $perms,
+    ]);
+  }
+
+  /**
+   * Add a JavaScript file to the current page using <SCRIPT SRC>.
+   *
+   * Ex: addScript('alert("Hello world");', ['weight' => 123]);
+   *
+   * @param string $code
+   *   JavaScript source code.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addScript(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addScript()
+   */
+  public function addScript(string $code, ...$options) {
+    $this->add(self::mergeStandardOptions($options, [
+      'script' => $code,
+    ]));
+    return $this;
+  }
+
+  /**
+   * Add a JavaScript file to the current page using <SCRIPT SRC>.
+   *
+   * Ex: addScriptFile('myextension', 'myscript.js', ['weight' => 123]);
+   *
+   * @param string $ext
+   *   Extension name; use 'civicrm' for core.
+   * @param string $file
+   *   File path -- relative to the extension base dir.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addScriptFile(string $code, int $weight, string $region, mixed $translate).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addScriptFile()
+   */
+  public function addScriptFile(string $ext, string $file, ...$options) {
+    $this->add(self::mergeStandardOptions($options, [
+      'scriptFile' => [$ext, $file],
+      'name' => "$ext:$file",
+      // Setting the name above may appear superfluous, but it preserves a historical quirk
+      // where Region::add() and Resources::addScriptFile() produce slightly different orderings.
+    ]));
+    return $this;
+  }
+
+  /**
+   * Add a JavaScript URL to the current page using <SCRIPT SRC>.
+   *
+   * Ex: addScriptUrl('http://example.com/foo.js', ['weight' => 123])
+   *
+   * @param string $url
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addScriptUrl(string $url, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addScriptUrl()
+   */
+  public function addScriptUrl(string $url, ...$options) {
+    $this->add(self::mergeStandardOptions($options, [
+      'scriptUrl' => $url,
+      'name' => $url,
+      // Setting the name above may appear superfluous, but it preserves a historical quirk
+      // where Region::add() and Resources::addScriptUrl() produce slightly different orderings.
+    ]));
+    return $this;
+  }
+
+  /**
+   * Add translated string to the js CRM object.
+   * It can then be retrived from the client-side ts() function
+   * Variable substitutions can happen from client-side
+   *
+   * Note: this function rarely needs to be called directly and is mostly for internal use.
+   * See CRM_Core_Resources::addScriptFile which automatically adds translated strings from js files
+   *
+   * Simple example:
+   * // From php:
+   * CRM_Core_Resources::singleton()->addString('Hello');
+   * // The string is now available to javascript code i.e.
+   * ts('Hello');
+   *
+   * Example with client-side substitutions:
+   * // From php:
+   * CRM_Core_Resources::singleton()->addString('Your %1 has been %2');
+   * // ts() in javascript works the same as in php, for example:
+   * ts('Your %1 has been %2', {1: objectName, 2: actionTaken});
+   *
+   * NOTE: This function does not work with server-side substitutions
+   * (as this might result in collisions and unwanted variable injections)
+   * Instead, use code like:
+   * CRM_Core_Resources::singleton()->addSetting(array('myNamespace' => array('myString' => ts('Your %1 has been %2', array(subs)))));
+   * And from javascript access it at CRM.myNamespace.myString
+   *
+   * @param string|array $text
+   * @param string|null $domain
+   * @return static
+   * @see CRM_Core_Resources_CollectionAdderInterface::addString()
+   */
+  public function addString($text, $domain = 'civicrm') {
+    // TODO: Maybe this should be its own resource type to allow smarter management?
+
+    foreach ((array) $text as $str) {
+      $translated = ts($str, [
+        'domain' => ($domain == 'civicrm') ? NULL : [$domain, NULL],
+        'raw' => TRUE,
+      ]);
+
+      // We only need to push this string to client if the translation
+      // is actually different from the original
+      if ($translated != $str) {
+        $bucket = $domain == 'civicrm' ? 'strings' : 'strings::' . $domain;
+        $this->addSetting([
+          $bucket => [$str => $translated],
+        ]);
+      }
+    }
+    return $this;
+  }
+
+  /**
+   * Add a CSS content to the current page using <STYLE>.
+   *
+   * Ex: addStyle('p { color: red; }', ['weight' => 100]);
+   *
+   * @param string $code
+   *   CSS source code.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addStyle(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addStyle()
+   */
+  public function addStyle(string $code, ...$options) {
+    $this->add(self::mergeStandardOptions($options, [
+      'style' => $code,
+    ]));
+    return $this;
+  }
+
+  /**
+   * Add a CSS file to the current page using <LINK HREF>.
+   *
+   * Ex: addStyleFile('myextension', 'mystyles.css', ['weight' => 100]);
+   *
+   * @param string $ext
+   *   Extension name; use 'civicrm' for core.
+   * @param string $file
+   *   File path -- relative to the extension base dir.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addStyle(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addStyleFile()
+   */
+  public function addStyleFile(string $ext, string $file, ...$options) {
+    $this->add(self::mergeStandardOptions($options, [
+      'styleFile' => [$ext, $file],
+      'name' => "$ext:$file",
+      // Setting the name above may appear superfluous, but it preserves a historical quirk
+      // where Region::add() and Resources::addScriptUrl() produce slightly different orderings.
+    ]));
+    return $this;
+  }
+
+  /**
+   * Add a CSS file to the current page using <LINK HREF>.
+   *
+   * Ex: addStyleUrl('http://example.com/foo.css', ['weight' => 100]);
+   *
+   * @param string $url
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addStyleUrl(string $code, int $weight, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addStyleUrl()
+   */
+  public function addStyleUrl(string $url, ...$options) {
+    $this->add(self::mergeStandardOptions($options, [
+      'styleUrl' => $url,
+      'name' => $url,
+      // Setting the name above may appear superfluous, but it preserves a historical quirk
+      // where Region::add() and Resources::addScriptUrl() produce slightly different orderings.
+    ]));
+    return $this;
+  }
+
+  /**
+   * Add JavaScript variables to the root of the CRM object.
+   * This function is usually reserved for low-level system use.
+   * Extensions and components should generally use addVars instead.
+   *
+   * @param array $settings
+   *   Data to export.
+   * @param array $options
+   *   Not used.
+   *   Positional equivalence: addSetting(array $settings, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addSetting()
+   */
+  public function addSetting(array $settings, ...$options) {
+    $s = &$this->findCreateSettingSnippet($options);
+    $s['settings'] = self::mergeSettings($s['settings'], $settings);
+    return $this;
+  }
+
+  /**
+   * Add JavaScript variables to the global CRM object via a callback function.
+   *
+   * @param callable $callable
+   * @return static
+   * @see CRM_Core_Resources_CollectionAdderInterface::addSettingsFactory()
+   */
+  public function addSettingsFactory($callable) {
+    $s = &$this->findCreateSettingSnippet();
+    $s['settingsFactories'][] = $callable;
+    return $this;
+  }
+
+  /**
+   * Add JavaScript variables to CRM.vars
+   *
+   * Example:
+   *   From the server:
+   *     CRM_Core_Resources::singleton()->addVars('myNamespace', array('foo' => 'bar'));
+   *   Access var from javascript:
+   *     CRM.vars.myNamespace.foo // "bar"
+   *
+   * @see https://docs.civicrm.org/dev/en/latest/standards/javascript/
+   *
+   * @param string $nameSpace
+   *   Usually the name of your extension.
+   * @param array $vars
+   *   Data to export.
+   * @param array $options
+   *   Open-ended list of key-value options. See CollectionInterface docs.
+   *   Positional equivalence: addVars(string $namespace, array $vars, string $region).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionAdderInterface::addVars()
+   */
+  public function addVars(string $nameSpace, array $vars, ...$options) {
+    $s = &$this->findCreateSettingSnippet($options);
+    $s['settings']['vars'][$nameSpace] = self::mergeSettings(
+      $s['settings']['vars'][$nameSpace] ?? [],
+      $vars
+    );
+    return $this;
+  }
+
+  /**
+   * Given the "$options" for "addScriptUrl()" (etal), normalize the contents
+   * and potentially add more.
+   *
+   * @param array $splats
+   *   A list of options, as represented by the splat mechanism ("...$options").
+   *   This may appear in one of two ways:
+   *   - New (String Index): as in `addFoo($foo, array $options)`
+   *   - Old (Numeric Index): as in `addFoo($foo, int $weight = X, string $region = Y, bool $translate = X)`
+   * @param array $defaults
+   *   List of values to merge into $options.
+   * @return array
+   */
+  public static function mergeStandardOptions(array $splats, array $defaults = []) {
+    $count = count($splats);
+    switch ($count) {
+      case 0:
+        // Common+simple case: No splat options. We can short-circuit.
+        return $defaults;
+
+      case 1:
+        // Might be new format (key-value pairs) or old format
+        $parsed = is_array($splats[0]) ? $splats[0] : ['weight' => $splats[0]];
+        break;
+
+      case 2:
+        $parsed = ['weight' => $splats[0], 'region' => $splats[1]];
+        break;
+
+      case 3:
+        $parsed = ['weight' => $splats[0], 'region' => $splats[1], 'translate' => $splats[2]];
+        break;
+
+      default:
+        throw new \RuntimeException("Cannot resolve resource options. For clearest behavior, pass options in key-value format.");
+    }
+
+    return array_merge($defaults, $parsed);
+  }
+
+  /**
+   * Given the "$options" for "addSetting()" (etal), normalize the contents
+   * and potentially add more.
+   *
+   * @param array $splats
+   *   A list of options, as represented by the splat mechanism ("...$options").
+   *   This may appear in one of two ways:
+   *   - New (String Index): as in `addFoo($foo, array $options)`
+   *   - Old (Numeric Index): as in `addFoo($foo, int $weight = X, string $region = Y, bool $translate = X)`
+   * @param array $defaults
+   *   List of values to merge into $options.
+   * @return array
+   */
+  public static function mergeSettingOptions(array $splats, array $defaults = []) {
+    $count = count($splats);
+    switch ($count) {
+      case 0:
+        // Common+simple case: No splat options. We can short-circuit.
+        return $defaults;
+
+      case 1:
+        // Might be new format (key-value pairs) or old format
+        $parsed = is_array($splats[0]) ? $splats[0] : ['region' => $splats[0]];
+        break;
+
+      default:
+        throw new \RuntimeException("Cannot resolve resource options. For clearest behavior, pass options in key-value format.");
+    }
+
+    return array_merge($defaults, $parsed);
+  }
+
+  /**
+   * @param array $settings
+   * @param array $additions
+   * @return array
+   *   combination of $settings and $additions
+   */
+  public static function mergeSettings(array $settings, array $additions): array {
+    foreach ($additions as $k => $v) {
+      if (isset($settings[$k]) && is_array($settings[$k]) && is_array($v)) {
+        $v += $settings[$k];
+      }
+      $settings[$k] = $v;
+    }
+    return $settings;
+  }
+
+}
diff --git a/civicrm/CRM/Core/Resources/CollectionInterface.php b/civicrm/CRM/Core/Resources/CollectionInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..a81db1cfacb32e45f4eed2ee9c9ba7a265e3cac1
--- /dev/null
+++ b/civicrm/CRM/Core/Resources/CollectionInterface.php
@@ -0,0 +1,168 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Class CRM_Core_Resources_CollectionInterface
+ *
+ * A resource collection is a mix of *resources* (or *snippets* or *assets*) that can be
+ * added to a page. A fully-formed resource might look like this:
+ *
+ * ```
+ * array(
+ *   'name' => 'jQuery',
+ *   'region' => 'html-header',
+ *   'weight' => 100,
+ *   'type' => 'scriptUrl',
+ *   'scriptUrl' => 'https://example.com/js/jquery.min.js'
+ * )
+ * ```
+ *
+ * Typically, a resource is created with just one option, eg
+ *
+ * ```
+ * // Add resources in array notation
+ * $c->add(['script' => 'alert("Hello");']);
+ * $c->add(['scriptFile' => ['civicrm', 'js/crm.ckeditor.js']]);
+ * $c->add(['scriptUrl' => 'https://example.com/js/jquery.min.js']);
+ * $c->add(['style' => 'p { font-size: 4em; }']);
+ * $c->add(['styleFile' => ['civicrm', 'css/dashboard.css']]);
+ * $c->add(['styleUrl' => 'https://example.com/css/foobar.css']);
+ *
+ * // Add resources with helper methods
+ * $c->addScript('alert("Hello");');
+ * $c->addScriptFile('civicrm', 'js/crm.ckeditor.js');
+ * $c->addScriptUrl('https://example.com/js/jquery.min.js');
+ * $c->addStyle('p { font-size: 4em; }');
+ * $c->addStyleFile('civicrm', 'css/dashboard.css');
+ * $c->addStyleUrl('https://example.com/css/foobar.css');
+ * ```
+ *
+ * The other properties are automatically computed (dependent upon context),
+ * but they may be set explicitly. These options include:
+ *
+ *   - type: string (markup, template, callback, script, scriptFile, scriptUrl, jquery, style, styleFile, styleUrl)
+ *   - name: string, symbolic identifier for this resource
+ *   - aliases: string[], list of alternative names for this resource
+ *   - weight: int, default=1. Lower weights come before higher weights.
+ *     (If two resources have the same weight, then a secondary ordering will be
+ *     used to ensure reproducibility. However, the secondary ordering is
+ *     not guaranteed among versions/implementations.)
+ *   - disabled: int, default=0
+ *   - region: string
+ *   - translate: bool|string, Autoload translations. (Only applies to 'scriptFile')
+ *       - FALSE: Do not load translated strings.
+ *       - TRUE: Load translated strings. Use the $ext's default domain.
+ *       - string: Load translated strings. Use a specific domain.
+ *
+ * For example, the following are equivalent ways to set the 'weight' option:
+ *
+ * ```php
+ * $c->add([
+ *   'script' => 'alert("Hello");',
+ *   'weight' => 100,
+ * ]);
+ * $c->addScript('alert("Hello");', ['weight' => 100]);
+ * ```
+ *
+ * Passing options in array (key-value) notation is clearest. For backward
+ * compatibility, some methods (eg `addScript()`) accept options in positional form.
+ * Where applicable, the docblock of each `addFoo()` will include a comment about positional form.
+ *
+ * @see CRM_Core_Resources_CollectionTrait
+ */
+interface CRM_Core_Resources_CollectionInterface {
+
+  /**
+   * Add an item to the collection. For example, when working with 'page-header' collection:
+   *
+   * Note: This function does not perform any extra encoding of markup, script code, or etc. If
+   * you're passing in user-data, you must clean it yourself.
+   *
+   * @param array $snippet
+   *   The resource to add. For a full list of properties, see CRM_Core_Resources_CollectionInterface.
+   * @return array
+   *   The full/computed snippet (with defaults applied).
+   * @see CRM_Core_Resources_CollectionInterface
+   */
+  public function add($snippet);
+
+  /**
+   * Update specific properties of a snippet.
+   *
+   * Ex: $region->update('default', ['disabled' => TRUE]);
+   *
+   * @param string $name
+   *   Symbolic of the resource/snippet to update.
+   * @param array $snippet
+   *   Resource options. See CollectionInterface docs.
+   * @return static
+   */
+  public function update($name, $snippet);
+
+  /**
+   * Remove all snippets.
+   *
+   * @return static
+   */
+  public function clear();
+
+  /**
+   * Get snippet.
+   *
+   * @param string $name
+   * @return array|NULL
+   */
+  public function &get($name);
+
+  /**
+   * Get a list of all snippets in this collection.
+   *
+   * @return iterable
+   */
+  public function getAll(): iterable;
+
+  /**
+   * Alter the contents of the collection.
+   *
+   * @param callable $callback
+   *   The callback is invoked once for each member in the collection.
+   *   The callback may return one of three values:
+   *   - TRUE: The item is OK and belongs in the collection.
+   *   - FALSE: The item is not OK and should be omitted from the collection.
+   *   - Array: The item should be revised (using the returned value).
+   * @return static
+   */
+  public function filter($callback);
+
+  /**
+   * Find all snippets which match the given criterion.
+   *
+   * @param callable $callback
+   *   The callback is invoked once for each member in the collection.
+   *   The callback may return one of two values:
+   *   - TRUE: The item is OK and belongs in the collection.
+   *   - FALSE: The item is not OK and should be omitted from the collection.
+   * @return iterable
+   *   List of matching snippets.
+   */
+  public function find($callback): iterable;
+
+  /**
+   * Assimilate a list of resources into this list.
+   *
+   * @param iterable $others
+   *   List of snippets to add.
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface::merge()
+   */
+  public function merge(iterable $others);
+
+}
diff --git a/civicrm/CRM/Core/Resources/CollectionTrait.php b/civicrm/CRM/Core/Resources/CollectionTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..71fe17ece0ccfb8c93df4ab5950e843e27e743ac
--- /dev/null
+++ b/civicrm/CRM/Core/Resources/CollectionTrait.php
@@ -0,0 +1,414 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Class CRM_Core_Resources_CollectionTrait
+ *
+ * This is a building-block for creating classes which maintain a list of resources.
+ * It implements of the `CollectionInterface`.
+ *
+ * @see CRM_Core_Resources_CollectionInterface
+ */
+trait CRM_Core_Resources_CollectionTrait {
+
+  use CRM_Core_Resources_CollectionAdderTrait;
+
+  /**
+   * Static defaults - a list of options to apply to any new snippets.
+   *
+   * @var array
+   */
+  protected $defaults = ['weight' => 1, 'disabled' => FALSE];
+
+  /**
+   * List of snippets to inject within region.
+   *
+   * e.g. $this->_snippets[3]['type'] = 'template';
+   *
+   * @var array
+   */
+  protected $snippets = [];
+
+  /**
+   * Whether the snippets array has been sorted
+   *
+   * @var bool
+   */
+  protected $isSorted = TRUE;
+
+  /**
+   * Whitelist of supported types.
+   *
+   * @var array
+   */
+  protected $types = [];
+
+  /**
+   * Add an item to the collection.
+   *
+   * @param array $snippet
+   *   Resource options. See CollectionInterface docs.
+   * @return array
+   *   The full/computed snippet (with defaults applied).
+   * @see CRM_Core_Resources_CollectionInterface
+   * @see CRM_Core_Resources_CollectionInterface::add()
+   */
+  public function add($snippet) {
+    $snippet = array_merge($this->defaults, $snippet);
+    $snippet['id'] = $this->nextId();
+    if (!isset($snippet['type'])) {
+      foreach ($this->types as $type) {
+        // auto-detect
+        if (isset($snippet[$type])) {
+          $snippet['type'] = $type;
+          break;
+        }
+      }
+    }
+    if (!in_array($snippet['type'] ?? NULL, $this->types)) {
+      $typeExpr = $snippet['type'] ?? '(' . implode(',', array_keys($snippet)) . ')';
+      throw new \RuntimeException("Unsupported snippet type: $typeExpr");
+    }
+    // Traditional behavior: sort by (1) weight and (2) either name or natural position. This second thing is called 'sortId'.
+    if (isset($snippet['name'])) {
+      $snippet['sortId'] = $snippet['name'];
+    }
+    else {
+      switch ($snippet['type']) {
+        case 'scriptUrl':
+        case 'styleUrl':
+          $snippet['sortId'] = $snippet['id'];
+          $snippet['name'] = $snippet[$snippet['type']];
+          break;
+
+        case 'scriptFile':
+        case 'styleFile':
+          $snippet['sortId'] = $snippet['id'];
+          $snippet['name'] = implode(':', $snippet[$snippet['type']]);
+          break;
+
+        default:
+          $snippet['sortId'] = $snippet['id'];
+          $snippet['name'] = $snippet['sortId'];
+          break;
+      }
+    }
+
+    if ($snippet['type'] === 'scriptFile' && !isset($snippet['scriptFileUrls'])) {
+      $res = Civi::resources();
+      list ($ext, $file) = $snippet['scriptFile'];
+
+      $snippet['translate'] = $snippet['translate'] ?? TRUE;
+      if ($snippet['translate']) {
+        $domain = ($snippet['translate'] === TRUE) ? $ext : $snippet['translate'];
+        // Is this too early?
+        $this->addString(Civi::service('resources.js_strings')->get($domain, $res->getPath($ext, $file), 'text/javascript'), $domain);
+      }
+      $snippet['scriptFileUrls'] = [$res->getUrl($ext, $res->filterMinify($ext, $file), TRUE)];
+    }
+    if ($snippet['type'] === 'scriptFile' && !isset($snippet['aliases'])) {
+      $snippet['aliases'] = $snippet['scriptFileUrls'];
+    }
+
+    if ($snippet['type'] === 'styleFile' && !isset($snippet['styleFileUrls'])) {
+      /** @var Civi\Core\Themes $theme */
+      $theme = Civi::service('themes');
+      list ($ext, $file) = $snippet['styleFile'];
+      $snippet['styleFileUrls'] = $theme->resolveUrls($theme->getActiveThemeKey(), $ext, $file);
+    }
+    if ($snippet['type'] === 'styleFile' && !isset($snippet['aliases'])) {
+      $snippet['aliases'] = $snippet['styleFileUrls'];
+    }
+
+    if (isset($snippet['aliases']) && !is_array($snippet['aliases'])) {
+      $snippet['aliases'] = [$snippet['aliases']];
+    }
+
+    $this->snippets[$snippet['name']] = $snippet;
+    $this->isSorted = FALSE;
+    return $snippet;
+  }
+
+  protected function nextId() {
+    if (!isset(Civi::$statics['CRM_Core_Resource_Count'])) {
+      $resId = Civi::$statics['CRM_Core_Resource_Count'] = 1;
+    }
+    else {
+      $resId = ++Civi::$statics['CRM_Core_Resource_Count'];
+    }
+
+    return $resId;
+  }
+
+  /**
+   * Update specific properties of a snippet.
+   *
+   * @param string $name
+   *   Symbolic of the resource/snippet to update.
+   * @param array $snippet
+   *   Resource options. See CollectionInterface docs.
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface::update()
+   */
+  public function update($name, $snippet) {
+    foreach ($this->resolveName($name) as $realName) {
+      $this->snippets[$realName] = array_merge($this->snippets[$realName], $snippet);
+      $this->isSorted = FALSE;
+      return $this;
+    }
+
+    Civi::log()->warning('Failed to update resource by name ({name})', [
+      'name' => $name,
+    ]);
+    return $this;
+  }
+
+  /**
+   * Remove all snippets.
+   *
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface::clear()
+   */
+  public function clear() {
+    $this->snippets = [];
+    $this->isSorted = TRUE;
+    return $this;
+  }
+
+  /**
+   * Get snippet.
+   *
+   * @param string $name
+   * @return array|NULL
+   * @see CRM_Core_Resources_CollectionInterface::get()
+   */
+  public function &get($name) {
+    foreach ($this->resolveName($name) as $realName) {
+      return $this->snippets[$realName];
+    }
+
+    $null = NULL;
+    return $null;
+  }
+
+  /**
+   * Get a list of all snippets in this collection.
+   *
+   * @return iterable
+   * @see CRM_Core_Resources_CollectionInterface::getAll()
+   */
+  public function getAll(): iterable {
+    $this->sort();
+    return $this->snippets;
+  }
+
+  /**
+   * Alter the contents of the collection.
+   *
+   * @param callable $callback
+   *   The callback is invoked once for each member in the collection.
+   *   The callback may return one of three values:
+   *   - TRUE: The item is OK and belongs in the collection.
+   *   - FALSE: The item is not OK and should be omitted from the collection.
+   *   - Array: The item should be revised (using the returned value).
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface::filter()
+   */
+  public function filter($callback) {
+    $this->sort();
+    $names = array_keys($this->snippets);
+    foreach ($names as $name) {
+      $ret = $callback($this->snippets[$name]);
+      if ($ret === TRUE) {
+        // OK
+      }
+      elseif ($ret === FALSE) {
+        unset($this->snippets[$name]);
+      }
+      elseif (is_array($ret)) {
+        $this->snippets[$name] = $ret;
+        $this->isSorted = FALSE;
+      }
+      else {
+        throw new \RuntimeException("CollectionTrait::filter() - Callback returned invalid value");
+      }
+    }
+    return $this;
+  }
+
+  /**
+   * Find all snippets which match the given criterion.
+   *
+   * @param callable $callback
+   *   The callback is invoked once for each member in the collection.
+   *   The callback may return one of three values:
+   *   - TRUE: The item is OK and belongs in the collection.
+   *   - FALSE: The item is not OK and should be omitted from the collection.
+   * @return iterable
+   *   List of matching snippets.
+   * @see CRM_Core_Resources_CollectionInterface::find()
+   */
+  public function find($callback): iterable {
+    $r = [];
+    $this->sort();
+    foreach ($this->snippets as $name => $snippet) {
+      if ($callback($snippet)) {
+        $r[$name] = $snippet;
+      }
+    }
+    return $r;
+  }
+
+  /**
+   * Assimilate a list of resources into this list.
+   *
+   * @param iterable $snippets
+   *   List of snippets to add.
+   * @return static
+   * @see CRM_Core_Resources_CollectionInterface::merge()
+   */
+  public function merge(iterable $snippets) {
+    foreach ($snippets as $next) {
+      $name = $next['name'];
+      $current = $this->snippets[$name] ?? NULL;
+      if ($current === NULL) {
+        $this->add($next);
+      }
+      elseif ($current['type'] === 'settings' && $next['type'] === 'settings') {
+        $this->addSetting($next['settings']);
+        foreach ($next['settingsFactories'] as $factory) {
+          $this->addSettingsFactory($factory);
+        }
+        $this->isSorted = FALSE;
+      }
+      elseif ($current['type'] === 'settings' || $next['type'] === 'settings') {
+        throw new \RuntimeException(sprintf("Cannot merge snippets of types [%s] and [%s]" . $current['type'], $next['type']));
+      }
+      else {
+        $this->add($next);
+      }
+    }
+    return $this;
+  }
+
+  /**
+   * Ensure that the collection is sorted.
+   *
+   * @return static
+   */
+  protected function sort() {
+    if (!$this->isSorted) {
+      uasort($this->snippets, [__CLASS__, '_cmpSnippet']);
+      $this->isSorted = TRUE;
+    }
+    return $this;
+  }
+
+  /**
+   * @param string $name
+   *   Name or alias.
+   * return array
+   *   List of real names.
+   */
+  protected function resolveName($name) {
+    if (isset($this->snippets[$name])) {
+      return [$name];
+    }
+    foreach ($this->snippets as $snippetName => $snippet) {
+      if (isset($snippet['aliases']) && in_array($name, $snippet['aliases'])) {
+        return [$snippetName];
+      }
+    }
+    return [];
+  }
+
+  /**
+   * @param $a
+   * @param $b
+   *
+   * @return int
+   */
+  public static function _cmpSnippet($a, $b) {
+    if ($a['weight'] < $b['weight']) {
+      return -1;
+    }
+    if ($a['weight'] > $b['weight']) {
+      return 1;
+    }
+    // fallback to name sort; don't really want to do this, but it makes results more stable
+    if ($a['sortId'] < $b['sortId']) {
+      return -1;
+    }
+    if ($a['sortId'] > $b['sortId']) {
+      return 1;
+    }
+    return 0;
+  }
+
+  // -----------------------------------------------
+
+  /**
+   * Assimilate all the resources listed in a bundle.
+   *
+   * @param iterable|string|\CRM_Core_Resources_Bundle $bundle
+   *   Either bundle object, or the symbolic name of a bundle.
+   *   Note: For symbolic names, the bundle must be a container service ('bundle.FOO').
+   * @return static
+   */
+  public function addBundle($bundle) {
+    if (is_iterable($bundle)) {
+      foreach ($bundle as $b) {
+        $this->addBundle($b);
+      }
+      return $this;
+    }
+    if (is_string($bundle)) {
+      $bundle = Civi::service('bundle.' . $bundle);
+    }
+    return $this->merge($bundle->getAll());
+  }
+
+  /**
+   * Get a fully-formed/altered list of settings, including the results of
+   * any callbacks/listeners.
+   *
+   * @return array
+   */
+  public function getSettings(): array {
+    $s = &$this->findCreateSettingSnippet();
+    $result = $s['settings'];
+    foreach ($s['settingsFactories'] as $callable) {
+      $result = CRM_Core_Resources_CollectionAdderTrait::mergeSettings($result, $callable());
+    }
+    CRM_Utils_Hook::alterResourceSettings($result);
+    return $result;
+  }
+
+  /**
+   * @return array
+   */
+  public function &findCreateSettingSnippet($options = []): array {
+    $snippet = &$this->get('settings');
+    if ($snippet !== NULL) {
+      return $snippet;
+    }
+
+    $this->add([
+      'name' => 'settings',
+      'type' => 'settings',
+      'settings' => [],
+      'settingsFactories' => [],
+      'weight' => -100000,
+    ]);
+    return $this->get('settings');
+  }
+
+}
diff --git a/civicrm/CRM/Core/Resources/Common.php b/civicrm/CRM/Core/Resources/Common.php
new file mode 100644
index 0000000000000000000000000000000000000000..13b86a233dfe6c9688d419279c3f1daf2ced912b
--- /dev/null
+++ b/civicrm/CRM/Core/Resources/Common.php
@@ -0,0 +1,306 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Define some common, global lists of resources.
+ */
+class CRM_Core_Resources_Common {
+
+  const REGION = 'html-header';
+
+  /**
+   * Create a "basic" (generic) bundle.
+   *
+   * The bundle goes through some lifecycle events (like `hook_alterBundle`).
+   *
+   * To define default content for a basic bundle, you may either give an
+   * `$init` function or subscribe to `hook_alterBundle`.
+   *
+   * @param string $name
+   *   Symbolic name of the bundle.
+   * @param callable|NULL $init
+   *   Optional initialization function. Populate default resources.
+   *   Signature: `function($bundle): void`
+   *   Example: `function myinit($b) { $b->addScriptFile(...)->addStyleFile(...); }`
+   * @param string|string[] $types
+   *   List of resource-types to permit in this bundle. NULL for a default list.
+   *   Example: ['styleFile', 'styleUrl']
+   *   The following aliases are allowed: '*all*', '*default*', '*script*', '*style*'
+   * @return CRM_Core_Resources_Bundle
+   */
+  public static function createBasicBundle($name, $init = NULL, $types = NULL) {
+    $bundle = new CRM_Core_Resources_Bundle($name, $types);
+    if ($init !== NULL) {
+      $init($bundle);
+    }
+    CRM_Utils_Hook::alterBundle($bundle);
+    $bundle->fillDefaults();
+    return $bundle;
+  }
+
+  /**
+   * The 'bundle.bootstrap3' service is a collection of resources which are
+   * loaded when a page needs to support Boostrap CSS v3.
+   *
+   * @param string $name
+   *   i.e. 'bootstrap3'
+   * @return \CRM_Core_Resources_Bundle
+   */
+  public static function createBootstrap3Bundle($name) {
+    $bundle = new CRM_Core_Resources_Bundle($name, ['script', 'scriptFile', 'scriptUrl', 'settings', 'style', 'styleFile', 'styleUrl', 'markup']);
+    // Leave it to the theme/provider to register specific resources.
+    // $bundle->addStyleFile('civicrm', 'css/bootstrap3.css');
+    // $bundle->addScriptFile('civicrm', 'js/bootstrap3.js', [
+    //  'translate' => FALSE,
+    //]);
+
+    //  This warning will show if bootstrap is unavailable. Normally it will be hidden by the bootstrap .collapse class.
+    $bundle->addMarkup('
+      <div id="bootstrap-theme">
+        <div class="messages warning no-popup collapse">
+          <p>
+            <i class="crm-i fa-exclamation-triangle" aria-hidden="true"></i>
+            <strong>' . ts('Bootstrap theme not found.') . '</strong>
+          </p>
+          <p>' . ts('This screen may not work correctly without a bootstrap-based theme such as Shoreditch installed.') . '</p>
+        </div>
+      </div>',
+      ['region' => 'page-header']
+    );
+
+    CRM_Utils_Hook::alterBundle($bundle);
+    $bundle->fillDefaults();
+    return $bundle;
+  }
+
+  /**
+   * The 'bundle.coreStyles' service is a collection of resources used on some
+   * non-Civi pages (wherein Civi may be mixed-in).
+   *
+   * @param string $name
+   *   i.e. 'coreStyles'
+   * @return \CRM_Core_Resources_Bundle
+   * @see \Civi\Core\Container::createContainer()
+   */
+  public static function createStyleBundle($name) {
+    $bundle = new CRM_Core_Resources_Bundle($name);
+
+    // Load custom or core css
+    $config = CRM_Core_Config::singleton();
+    if (!empty($config->customCSSURL)) {
+      $customCSSURL = Civi::resources()->addCacheCode($config->customCSSURL);
+      $bundle->addStyleUrl($customCSSURL, 99);
+    }
+    if (!Civi::settings()->get('disable_core_css')) {
+      $bundle->addStyleFile('civicrm', 'css/civicrm.css', -99);
+    }
+    // crm-i.css added ahead of other styles so it can be overridden by FA.
+    $bundle->addStyleFile('civicrm', 'css/crm-i.css', -101);
+
+    CRM_Utils_Hook::alterBundle($bundle);
+    $bundle->fillDefaults();
+    return $bundle;
+  }
+
+  /**
+   * The 'bundle.coreResources' service is a collection of resources
+   * shared by Civi pages (ie pages where Civi controls rendering).
+   *
+   * @param string $name
+   *   i.e. 'coreResources'
+   * @return \CRM_Core_Resources_Bundle
+   * @see \Civi\Core\Container::createContainer()
+   */
+  public static function createFullBundle($name) {
+    $bundle = new CRM_Core_Resources_Bundle($name);
+    $config = CRM_Core_Config::singleton();
+
+    // Add resources from coreResourceList
+    $jsWeight = -9999;
+    foreach (self::coreResourceList(self::REGION) as $item) {
+      if (is_array($item)) {
+        $bundle->addSetting($item);
+      }
+      elseif (strpos($item, '.css')) {
+        Civi::resources()->isFullyFormedUrl($item) ? $bundle->addStyleUrl($item, -100) : $bundle->addStyleFile('civicrm', $item, -100);
+      }
+      elseif (Civi::resources()->isFullyFormedUrl($item)) {
+        $bundle->addScriptUrl($item, $jsWeight++);
+      }
+      else {
+        // Don't bother  looking for ts() calls in packages, there aren't any
+        $translate = (substr($item, 0, 3) == 'js/');
+        $bundle->addScriptFile('civicrm', $item, [
+          'weight' => $jsWeight++,
+          'translate' => $translate,
+        ]);
+      }
+    }
+    // Add global settings
+    $settings = [
+      'config' => [
+        'isFrontend' => $config->userFrameworkFrontend,
+      ],
+    ];
+    // Disable profile creation if user lacks permission
+    if (!CRM_Core_Permission::check('edit all contacts') && !CRM_Core_Permission::check('add contacts')) {
+      $settings['config']['entityRef']['contactCreate'] = FALSE;
+    }
+    $bundle->addSetting($settings);
+
+    // Give control of jQuery and _ back to the CMS - this loads last
+    $bundle->addScriptFile('civicrm', 'js/noconflict.js', [
+      'weight' => 9999,
+      'translate' => FALSE,
+    ]);
+
+    CRM_Utils_Hook::alterBundle($bundle);
+    $bundle->fillDefaults();
+    return $bundle;
+  }
+
+  /**
+   * List of core resources we add to every CiviCRM page.
+   *
+   * Note: non-compressed versions of .min files will be used in debug mode
+   *
+   * @param string $region
+   * @return array
+   */
+  protected static function coreResourceList($region) {
+    $config = CRM_Core_Config::singleton();
+
+    // Scripts needed by everyone, everywhere
+    // FIXME: This is too long; list needs finer-grained segmentation
+    $items = [
+      "bower_components/jquery/dist/jquery.min.js",
+      "bower_components/jquery-ui/jquery-ui.min.js",
+      "bower_components/jquery-ui/themes/smoothness/jquery-ui.min.css",
+      "bower_components/lodash-compat/lodash.min.js",
+      "packages/jquery/plugins/jquery.mousewheel.min.js",
+      "bower_components/select2/select2.min.js",
+      "bower_components/select2/select2.min.css",
+      "bower_components/font-awesome/css/font-awesome.min.css",
+      "packages/jquery/plugins/jquery.form.min.js",
+      "packages/jquery/plugins/jquery.timeentry.min.js",
+      "packages/jquery/plugins/jquery.blockUI.min.js",
+      "bower_components/datatables/media/js/jquery.dataTables.min.js",
+      "bower_components/datatables/media/css/jquery.dataTables.min.css",
+      "bower_components/jquery-validation/dist/jquery.validate.min.js",
+      "bower_components/jquery-validation/dist/additional-methods.min.js",
+      "packages/jquery/plugins/jquery.ui.datepicker.validation.min.js",
+      "js/Common.js",
+      "js/crm.datepicker.js",
+      "js/crm.ajax.js",
+      "js/wysiwyg/crm.wysiwyg.js",
+    ];
+
+    // Dynamic localization script
+    $items[] = Civi::resources()->addCacheCode(
+      CRM_Utils_System::url('civicrm/ajax/l10n-js/' . CRM_Core_I18n::getLocale(),
+        ['cid' => CRM_Core_Session::getLoggedInContactID()], FALSE, NULL, FALSE)
+    );
+
+    // add wysiwyg editor
+    $editor = Civi::settings()->get('editor_id');
+    if ($editor == "CKEditor") {
+      CRM_Admin_Form_CKEditorConfig::setConfigDefault();
+      $items[] = [
+        'config' => [
+          'wysisygScriptLocation' => Civi::paths()->getUrl("[civicrm.root]/js/wysiwyg/crm.ckeditor.js"),
+          'CKEditorCustomConfig' => CRM_Admin_Form_CKEditorConfig::getConfigUrl(),
+        ],
+      ];
+    }
+
+    // These scripts are only needed by back-office users
+    if (CRM_Core_Permission::check('access CiviCRM')) {
+      $items[] = "packages/jquery/plugins/jquery.tableHeader.js";
+      $items[] = "packages/jquery/plugins/jquery.notify.min.js";
+    }
+
+    $contactID = CRM_Core_Session::getLoggedInContactID();
+
+    // Menubar
+    $position = 'none';
+    if (
+      $contactID && !$config->userFrameworkFrontend
+      && CRM_Core_Permission::check('access CiviCRM')
+      && !@constant('CIVICRM_DISABLE_DEFAULT_MENU')
+      && !CRM_Core_Config::isUpgradeMode()
+    ) {
+      $position = Civi::settings()->get('menubar_position') ?: 'over-cms-menu';
+    }
+    if ($position !== 'none') {
+      $items[] = 'bower_components/smartmenus/dist/jquery.smartmenus.min.js';
+      $items[] = 'bower_components/smartmenus/dist/addons/keyboard/jquery.smartmenus.keyboard.min.js';
+      $items[] = 'js/crm.menubar.js';
+      // @see CRM_Core_Resources::renderMenubarStylesheet
+      $items[] = Civi::service('asset_builder')->getUrl('crm-menubar.css', [
+        'menubarColor' => Civi::settings()->get('menubar_color'),
+        'height' => 40,
+        'breakpoint' => 768,
+      ]);
+      // Variables for crm.menubar.js
+      $items[] = [
+        'menubar' => [
+          'position' => $position,
+          'qfKey' => CRM_Core_Key::get('CRM_Contact_Controller_Search', TRUE),
+          'cacheCode' => CRM_Core_BAO_Navigation::getCacheKey($contactID),
+        ],
+      ];
+    }
+
+    // JS for multilingual installations
+    if (!empty($config->languageLimit) && count($config->languageLimit) > 1 && CRM_Core_Permission::check('translate CiviCRM')) {
+      $items[] = "js/crm.multilingual.js";
+    }
+
+    // Enable administrators to edit option lists in a dialog
+    if (CRM_Core_Permission::check('administer CiviCRM') && Civi::settings()->get('ajaxPopupsEnabled')) {
+      $items[] = "js/crm.optionEdit.js";
+    }
+
+    $tsLocale = CRM_Core_I18n::getLocale();
+    // Add localized jQuery UI files
+    if ($tsLocale && $tsLocale != 'en_US') {
+      // Search for i18n file in order of specificity (try fr-CA, then fr)
+      list($lang) = explode('_', $tsLocale);
+      $path = "bower_components/jquery-ui/ui/i18n";
+      foreach ([str_replace('_', '-', $tsLocale), $lang] as $language) {
+        $localizationFile = "$path/datepicker-{$language}.js";
+        if (Civi::resources()->getPath('civicrm', $localizationFile)) {
+          $items[] = $localizationFile;
+          break;
+        }
+      }
+    }
+
+    // Allow hooks to modify this list
+    CRM_Utils_Hook::coreResourceList($items, $region);
+
+    // Oof, existing listeners would expect $items to typically begin with 'bower_components/' or 'packages/'
+    // (using an implicit base of `[civicrm.root]`). We preserve the hook contract and cleanup $items post-hook.
+    $map = [
+      'bower_components' => rtrim(Civi::paths()->getUrl('[civicrm.bower]/.', 'absolute'), '/'),
+      'packages' => rtrim(Civi::paths()->getUrl('[civicrm.packages]/.', 'absolute'), '/'),
+    ];
+    $filter = function($m) use ($map) {
+      return $map[$m[1]] . $m[2];
+    };
+    $items = array_map(function($item) use ($filter) {
+      return is_array($item) ? $item : preg_replace_callback(';^(bower_components|packages)(/.*);', $filter, $item);
+    }, $items);
+
+    return $items;
+  }
+
+}
diff --git a/civicrm/CRM/Core/SelectValues.php b/civicrm/CRM/Core/SelectValues.php
index f7d22c826a1d9182fd7a596f98ed7a847640554e..b81422698ff8b8c8d955d827cacb065dab7d140a 100644
--- a/civicrm/CRM/Core/SelectValues.php
+++ b/civicrm/CRM/Core/SelectValues.php
@@ -174,12 +174,9 @@ class CRM_Core_SelectValues {
       'CheckBox' => ts('Checkbox(es)'),
       'Select Date' => ts('Select Date'),
       'File' => ts('File'),
-      'Select State/Province' => ts('Select State/Province'),
-      'Select Country' => ts('Select Country'),
       'RichTextEditor' => ts('Rich Text Editor'),
       'Autocomplete-Select' => ts('Autocomplete-Select'),
       'Link' => ts('Link'),
-      'ContactReference' => ts('Autocomplete-Select'),
     ];
   }
 
diff --git a/civicrm/CRM/Core/Smarty/plugins/block.crmButton.php b/civicrm/CRM/Core/Smarty/plugins/block.crmButton.php
index 390a8e73030e4d039daa89eff48c6c9c05a0502d..64543d5957683dbbf5d193dda100261bd8f42140 100644
--- a/civicrm/CRM/Core/Smarty/plugins/block.crmButton.php
+++ b/civicrm/CRM/Core/Smarty/plugins/block.crmButton.php
@@ -47,7 +47,7 @@ function smarty_block_crmButton($params, $text, &$smarty) {
     if (strpos($icon, 'fa-') !== 0) {
       $icon = "fa-$icon";
     }
-    $iconMarkup = "<i class='crm-i $icon' aria-hidden=\"true\"></i>&nbsp; ";
+    $iconMarkup = "<i class='crm-i $icon' aria-hidden=\"true\"></i> ";
   }
   // All other params are treated as html attributes
   CRM_Utils_Array::remove($params, 'icon', 'p', 'q', 'a', 'f', 'h', 'fb', 'fe');
diff --git a/civicrm/CRM/Core/xml/Menu/Admin.xml b/civicrm/CRM/Core/xml/Menu/Admin.xml
index 20b52451cc27c20c438e6643e304fe25000f42c8..245b7ae549bd060fd38b413759dc0468dbaa5399 100644
--- a/civicrm/CRM/Core/xml/Menu/Admin.xml
+++ b/civicrm/CRM/Core/xml/Menu/Admin.xml
@@ -36,11 +36,6 @@
      <title>Custom Field - Move</title>
      <page_callback>CRM_Custom_Form_MoveField</page_callback>
   </item>
-  <item>
-     <path>civicrm/admin/custom/group/field/changetype</path>
-     <title>Custom Field - Change Type</title>
-     <page_callback>CRM_Custom_Form_ChangeFieldType</page_callback>
-  </item>
   <item>
      <path>civicrm/admin/uf/group</path>
      <title>Profiles</title>
@@ -259,7 +254,7 @@
      <desc>Schedule Reminders.</desc>
      <page_callback>CRM_Admin_Page_ScheduleReminders</page_callback>
      <access_callback>1</access_callback>
-     <access_arguments>administer CiviCRM;edit all events</access_arguments>
+     <access_arguments>administer CiviCRM data;edit all events</access_arguments>
      <adminGroup>Communications</adminGroup>
      <weight>40</weight>
   </item>
@@ -397,7 +392,7 @@
      <title>Manage Extensions</title>
      <page_callback>CRM_Admin_Page_Extensions</page_callback>
      <desc></desc>
-     <access_arguments>administer CiviCRM</access_arguments>
+     <access_arguments>administer CiviCRM system</access_arguments>
      <adminGroup>System Settings</adminGroup>
      <weight>120</weight>
   </item>
@@ -405,7 +400,7 @@
      <path>civicrm/admin/extensions/upgrade</path>
      <title>Database Upgrades</title>
      <page_callback>CRM_Admin_Page_ExtensionsUpgrade</page_callback>
-     <access_arguments>administer CiviCRM</access_arguments>
+     <access_arguments>administer CiviCRM system</access_arguments>
   </item>
   <item>
      <path>civicrm/admin/setting/smtp</path>
@@ -413,6 +408,7 @@
      <page_callback>CRM_Admin_Form_Setting_Smtp</page_callback>
      <adminGroup>System Settings</adminGroup>
      <weight>20</weight>
+    <access_arguments>administer CiviCRM system</access_arguments>
   </item>
   <item>
      <path>civicrm/admin/paymentProcessor</path>
@@ -535,14 +531,14 @@
      <path>civicrm/admin/runjobs</path>
      <desc>URL used for running scheduled jobs.</desc>
      <page_callback>CRM_Utils_System::executeScheduledJobs</page_callback>
-     <access_arguments>access CiviCRM,administer CiviCRM</access_arguments>
+     <access_arguments>access CiviCRM,administer CiviCRM system</access_arguments>
   </item>
   <item>
      <path>civicrm/admin/job</path>
      <title>Scheduled Jobs</title>
      <desc>Managing periodially running tasks.</desc>
      <page_callback>CRM_Admin_Page_Job</page_callback>
-     <access_arguments>access CiviCRM,administer CiviCRM</access_arguments>
+     <access_arguments>access CiviCRM,administer CiviCRM system</access_arguments>
      <adminGroup>System Settings</adminGroup>
      <weight>1370</weight>
   </item>
@@ -551,7 +547,7 @@
      <title>Scheduled Jobs Log</title>
      <desc>Browsing the log of periodially running tasks.</desc>
      <page_callback>CRM_Admin_Page_JobLog</page_callback>
-     <access_arguments>access CiviCRM,administer CiviCRM</access_arguments>
+     <access_arguments>access CiviCRM,administer CiviCRM system</access_arguments>
      <adminGroup>Manage</adminGroup>
      <weight>1380</weight>
   </item>
@@ -573,7 +569,7 @@
   <item>
      <path>civicrm/admin</path>
      <title>Administer CiviCRM</title>
-     <access_arguments>administer CiviCRM,access CiviCRM</access_arguments>
+     <access_arguments>administer CiviCRM system,administer CiviCRM data,access CiviCRM</access_arguments>
      <page_type>1</page_type>
      <page_callback>CRM_Admin_Page_Admin</page_callback>
      <is_ssl>true</is_ssl>
diff --git a/civicrm/CRM/Custom/Form/ChangeFieldType.php b/civicrm/CRM/Custom/Form/ChangeFieldType.php
deleted file mode 100644
index 8ba794c5cc565655d15c95a405fe76a3371cf375..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Custom/Form/ChangeFieldType.php
+++ /dev/null
@@ -1,310 +0,0 @@
-<?php
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
- */
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- */
-
-/**
- * This class is to build the form for Deleting Group
- */
-class CRM_Custom_Form_ChangeFieldType extends CRM_Core_Form {
-
-  /**
-   * The field id
-   *
-   * @var int
-   */
-  protected $_id;
-
-  /**
-   * Array of custom field values
-   * @var array
-   */
-  protected $_values;
-
-  /**
-   * Mapper array of valid field type
-   * @var array
-   */
-  protected $_htmlTypeTransitions;
-
-  /**
-   * Set up variables to build the form.
-   *
-   * @return void
-   * @access protected
-   */
-  public function preProcess() {
-    $this->_id = CRM_Utils_Request::retrieve('id', 'Positive',
-      $this, TRUE
-    );
-
-    $this->_values = [];
-    $params = ['id' => $this->_id];
-    CRM_Core_BAO_CustomField::retrieve($params, $this->_values);
-
-    if ($this->_values['html_type'] == 'Select' && $this->_values['serialize']) {
-      $this->_values['html_type'] = 'Multi-Select';
-    }
-    $this->_htmlTypeTransitions = self::fieldTypeTransitions(CRM_Utils_Array::value('data_type', $this->_values),
-      CRM_Utils_Array::value('html_type', $this->_values)
-    );
-
-    if (empty($this->_values) || empty($this->_htmlTypeTransitions)) {
-      CRM_Core_Error::statusBounce(ts("Invalid custom field or can't change input type of this custom field."));
-    }
-
-    $url = CRM_Utils_System::url('civicrm/admin/custom/group/field/update',
-      "action=update&reset=1&gid={$this->_values['custom_group_id']}&id={$this->_id}"
-    );
-    $session = CRM_Core_Session::singleton();
-    $session->pushUserContext($url);
-
-    CRM_Utils_System::setTitle(ts('Change Field Type: %1',
-      [1 => $this->_values['label']]
-    ));
-  }
-
-  /**
-   * Build the form object.
-   *
-   * @return void
-   */
-  public function buildQuickForm() {
-
-    $srcHtmlType = $this->add('select',
-      'src_html_type',
-      ts('Current HTML Type'),
-      [$this->_values['html_type'] => $this->_values['html_type']],
-      TRUE
-    );
-
-    $srcHtmlType->setValue($this->_values['html_type']);
-    $srcHtmlType->freeze();
-
-    $this->assign('srcHtmlType', $this->_values['html_type']);
-
-    $dstHtmlType = $this->add('select',
-      'dst_html_type',
-      ts('New HTML Type'),
-      [
-        '' => ts('- select -'),
-      ] + $this->_htmlTypeTransitions,
-      TRUE
-    );
-
-    $this->addButtons([
-      [
-        'type' => 'next',
-        'name' => ts('Change Field Type'),
-        'isDefault' => TRUE,
-        'js' => ['onclick' => 'return checkCustomDataField();'],
-      ],
-      [
-        'type' => 'cancel',
-        'name' => ts('Cancel'),
-      ],
-    ]);
-  }
-
-  /**
-   * Process the form when submitted.
-   *
-   * @return void
-   */
-  public function postProcess() {
-    $params = $this->controller->exportValues($this->_name);
-
-    $tableName = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup',
-      $this->_values['custom_group_id'],
-      'table_name'
-    );
-
-    $singleValueOps = [
-      'Text',
-      'Select',
-      'Radio',
-      'Autocomplete-Select',
-    ];
-
-    $mutliValueOps = [
-      'CheckBox',
-      'Multi-Select',
-    ];
-
-    $srcHtmlType = $this->_values['html_type'];
-    $dstHtmlType = $params['dst_html_type'];
-
-    $customField = new CRM_Core_DAO_CustomField();
-    $customField->id = $this->_id;
-    $customField->find(TRUE);
-    $customField->serialize = in_array($dstHtmlType, $mutliValueOps, TRUE);
-
-    if ($dstHtmlType == 'Text' && in_array($srcHtmlType, [
-      'Select',
-      'Radio',
-      'Autocomplete-Select',
-    ])) {
-      $customField->option_group_id = 'NULL';
-      CRM_Core_BAO_CustomField::checkOptionGroup($this->_values['option_group_id']);
-    }
-
-    if (in_array($srcHtmlType, $mutliValueOps) &&
-      in_array($dstHtmlType, $singleValueOps)) {
-      $this->flattenToFirstValue($tableName, $this->_values['column_name']);
-    }
-    elseif (in_array($srcHtmlType, $singleValueOps) &&
-      in_array($dstHtmlType, $mutliValueOps)) {
-      $this->firstValueToFlatten($tableName, $this->_values['column_name']);
-    }
-
-    $customField->html_type = ($dstHtmlType === 'Multi-Select') ? 'Select' : $dstHtmlType;
-    $customField->save();
-
-    // Reset cache for custom fields
-    Civi::cache('fields')->flush();
-    // reset ACL and system caches.
-    CRM_Core_BAO_Cache::resetCaches();
-
-    CRM_Core_Session::setStatus(ts('Input type of custom field \'%1\' has been successfully changed to \'%2\'.',
-      [1 => $this->_values['label'], 2 => $dstHtmlType]
-    ), ts('Field Type Changed'), 'success');
-  }
-
-  /**
-   * @param $dataType
-   * @param $htmlType
-   *
-   * @return array|null
-   */
-  public static function fieldTypeTransitions($dataType, $htmlType) {
-    // Text field is single value field,
-    // can not be change to other single value option which contains option group
-    if ($htmlType == 'Text') {
-      return NULL;
-    }
-
-    $singleValueOps = [
-      'Text' => 'Text',
-      'Select' => 'Select',
-      'Radio' => 'Radio',
-      'Autocomplete-Select' => 'Autocomplete-Select',
-    ];
-
-    $mutliValueOps = [
-      'CheckBox' => 'CheckBox',
-      'Multi-Select' => 'Multi-Select',
-    ];
-
-    switch ($dataType) {
-      case 'String':
-        if (in_array($htmlType, array_keys($singleValueOps))) {
-          unset($singleValueOps[$htmlType]);
-          return array_merge($singleValueOps, $mutliValueOps);
-        }
-        elseif (in_array($htmlType, array_keys($mutliValueOps))) {
-          unset($singleValueOps['Text']);
-          foreach ($singleValueOps as $type => $label) {
-            $singleValueOps[$type] = "{$label} ( " . ts('Not Safe') . " )";
-          }
-          unset($mutliValueOps[$htmlType]);
-          return array_merge($mutliValueOps, $singleValueOps);
-        }
-        break;
-
-      case 'Int':
-      case 'Float':
-      case 'Int':
-      case 'Money':
-        if (in_array($htmlType, array_keys($singleValueOps))) {
-          unset($singleValueOps[$htmlType]);
-          return $singleValueOps;
-        }
-        break;
-
-      case 'Memo':
-        $ops = [
-          'TextArea' => 'TextArea',
-          'RichTextEditor' => 'RichTextEditor',
-        ];
-        if (in_array($htmlType, array_keys($ops))) {
-          unset($ops[$htmlType]);
-          return $ops;
-        }
-        break;
-    }
-
-    return NULL;
-  }
-
-  /**
-   * Take a single-value column (eg: a Radio or Select etc ) and convert
-   * value to the multi listed value (eg:"^Foo^")
-   *
-   * @param string $table
-   * @param string $column
-   */
-  public function firstValueToFlatten($table, $column) {
-    $selectSql = "SELECT id, $column FROM $table WHERE $column IS NOT NULL";
-    $updateSql = "UPDATE $table SET $column = %1 WHERE id = %2";
-    $dao = CRM_Core_DAO::executeQuery($selectSql);
-    while ($dao->fetch()) {
-      if (!$dao->{$column}) {
-        continue;
-      }
-      $value = CRM_Core_DAO::VALUE_SEPARATOR . $dao->{$column} . CRM_Core_DAO::VALUE_SEPARATOR;
-      $params = [
-        1 => [(string) $value, 'String'],
-        2 => [$dao->id, 'Integer'],
-      ];
-      CRM_Core_DAO::executeQuery($updateSql, $params);
-    }
-  }
-
-  /**
-   * Take a multi-value column (e.g. a Multi-Select or CheckBox column), and convert
-   * all values (of the form "^^" or "^Foo^" or "^Foo^Bar^") to the first listed value ("Foo")
-   *
-   * @param string $table
-   * @param string $column
-   */
-  public function flattenToFirstValue($table, $column) {
-    $selectSql = "SELECT id, $column FROM $table WHERE $column IS NOT NULL";
-    $updateSql = "UPDATE $table SET $column = %1 WHERE id = %2";
-    $dao = CRM_Core_DAO::executeQuery($selectSql);
-    while ($dao->fetch()) {
-      $values = self::explode($dao->{$column});
-      $params = [
-        1 => [(string) array_shift($values), 'String'],
-        2 => [$dao->id, 'Integer'],
-      ];
-      CRM_Core_DAO::executeQuery($updateSql, $params);
-    }
-  }
-
-  /**
-   * @param $str
-   *
-   * @return array
-   */
-  public static function explode($str) {
-    if (empty($str) || $str == CRM_Core_DAO::VALUE_SEPARATOR . CRM_Core_DAO::VALUE_SEPARATOR) {
-      return [];
-    }
-    else {
-      return explode(CRM_Core_DAO::VALUE_SEPARATOR, trim($str, CRM_Core_DAO::VALUE_SEPARATOR));
-    }
-  }
-
-}
diff --git a/civicrm/CRM/Custom/Form/Field.php b/civicrm/CRM/Custom/Form/Field.php
index f5e6096c0e6c687804103b6178a78448dd71c5f4..ba68cc706a72f04505de7246441f9f99a7c5a3e2 100644
--- a/civicrm/CRM/Custom/Form/Field.php
+++ b/civicrm/CRM/Custom/Form/Field.php
@@ -39,13 +39,6 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
    */
   protected $_id;
 
-  /**
-   * The default custom data/input types, when editing the field
-   *
-   * @var array
-   */
-  protected $_defaultDataType;
-
   /**
    * Array of custom field values if update mode.
    * @var array
@@ -57,36 +50,26 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
    *
    * @var array
    */
-  private static $_dataTypeValues = NULL;
-  private static $_dataTypeKeys = NULL;
-
-  private static $_dataToLabels = NULL;
+  public static $htmlTypesWithOptions = ['Select', 'Radio', 'CheckBox', 'Autocomplete-Select'];
 
   /**
-   * Used for mapping data types to html type options.
+   * Maps each data_type to allowed html_type options
    *
-   * Each item in this array corresponds to the same index in the dataType array
-   * @var array
+   * @var array[]
    */
   public static $_dataToHTML = [
-    [
-      'Text' => 'Text',
-      'Select' => 'Select',
-      'Radio' => 'Radio',
-      'CheckBox' => 'CheckBox',
-      'Autocomplete-Select' => 'Autocomplete-Select',
-    ],
-    ['Text' => 'Text', 'Select' => 'Select', 'Radio' => 'Radio'],
-    ['Text' => 'Text', 'Select' => 'Select', 'Radio' => 'Radio'],
-    ['Text' => 'Text', 'Select' => 'Select', 'Radio' => 'Radio'],
-    ['TextArea' => 'TextArea', 'RichTextEditor' => 'RichTextEditor'],
-    ['Date' => 'Select Date'],
-    ['Radio' => 'Radio'],
-    ['StateProvince' => 'Select State/Province'],
-    ['Country' => 'Select Country'],
-    ['File' => 'File'],
-    ['Link' => 'Link'],
-    ['ContactReference' => 'Autocomplete-Select'],
+    'String' => ['Text', 'Select', 'Radio', 'CheckBox', 'Autocomplete-Select'],
+    'Int' => ['Text', 'Select', 'Radio'],
+    'Float' => ['Text', 'Select', 'Radio'],
+    'Money' => ['Text', 'Select', 'Radio'],
+    'Memo' => ['TextArea', 'RichTextEditor'],
+    'Date' => ['Select Date'],
+    'Boolean' => ['Radio'],
+    'StateProvince' => ['Select'],
+    'Country' => ['Select'],
+    'File' => ['File'],
+    'Link' => ['Link'],
+    'ContactReference' => ['Autocomplete-Select'],
   ];
 
   /**
@@ -95,19 +78,15 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
    * @return void
    */
   public function preProcess() {
-    if (!(self::$_dataTypeKeys)) {
-      self::$_dataTypeKeys = array_keys(CRM_Core_BAO_CustomField::dataType());
-      self::$_dataTypeValues = array_values(CRM_Core_BAO_CustomField::dataType());
-    }
-
     //custom field id
     $this->_id = CRM_Utils_Request::retrieve('id', 'Positive', $this);
 
+    $this->assign('dataToHTML', self::$_dataToHTML);
+
     $this->_values = [];
     //get the values form db if update.
     if ($this->_id) {
-      $params = ['id' => $this->_id];
-      CRM_Core_BAO_CustomField::retrieve($params, $this->_values);
+      CRM_Core_BAO_CustomField::retrieve(['id' => $this->_id], $this->_values);
       // note_length is an alias for the text_length field
       $this->_values['note_length'] = $this->_values['text_length'] ?? NULL;
       // custom group id
@@ -130,41 +109,6 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
       $session = CRM_Core_Session::singleton();
       $session->pushUserContext($url);
     }
-
-    if (self::$_dataToLabels == NULL) {
-      self::$_dataToLabels = [
-        [
-          'Text' => ts('Text'),
-          'Select' => ts('Select'),
-          'Radio' => ts('Radio'),
-          'CheckBox' => ts('CheckBox'),
-          'Autocomplete-Select' => ts('Autocomplete-Select'),
-        ],
-        [
-          'Text' => ts('Text'),
-          'Select' => ts('Select'),
-          'Radio' => ts('Radio'),
-        ],
-        [
-          'Text' => ts('Text'),
-          'Select' => ts('Select'),
-          'Radio' => ts('Radio'),
-        ],
-        [
-          'Text' => ts('Text'),
-          'Select' => ts('Select'),
-          'Radio' => ts('Radio'),
-        ],
-        ['TextArea' => ts('TextArea'), 'RichTextEditor' => ts('Rich Text Editor')],
-        ['Date' => ts('Select Date')],
-        ['Radio' => ts('Radio')],
-        ['StateProvince' => ts('Select State/Province')],
-        ['Country' => ts('Select Country')],
-        ['File' => ts('Select File')],
-        ['Link' => ts('Link')],
-        ['ContactReference' => ts('Autocomplete-Select')],
-      ];
-    }
   }
 
   /**
@@ -177,21 +121,11 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
   public function setDefaultValues() {
     $defaults = $this->_values;
 
+    // Defaults for update mode
     if ($this->_id) {
       $this->assign('id', $this->_id);
       $this->_gid = $defaults['custom_group_id'];
-
-      //get the value for state or country
-      if ($defaults['data_type'] == 'StateProvince' &&
-        $stateId = CRM_Utils_Array::value('default_value', $defaults)
-      ) {
-        $defaults['default_value'] = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_StateProvince', $stateId);
-      }
-      elseif ($defaults['data_type'] == 'Country' &&
-        $countryId = CRM_Utils_Array::value('default_value', $defaults)
-      ) {
-        $defaults['default_value'] = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Country', $countryId);
-      }
+      $defaultValue = $defaults['default_value'] ?? NULL;
 
       if ($defaults['data_type'] == 'ContactReference' && !empty($defaults['filter'])) {
         $contactRefFilter = 'Advance';
@@ -218,58 +152,32 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
         $defaults['filter_selected'] = $contactRefFilter;
       }
 
-      if (!empty($defaults['data_type'])) {
-        $defaultDataType = array_search($defaults['data_type'],
-          self::$_dataTypeKeys
-        );
-        $defaultHTMLType = array_search($defaults['html_type'],
-          self::$_dataToHTML[$defaultDataType]
-        );
-        $defaults['data_type'] = [
-          '0' => $defaultDataType,
-          '1' => $defaultHTMLType,
-        ];
-        $this->_defaultDataType = $defaults['data_type'];
-      }
-
       $defaults['option_type'] = 2;
-
-      $this->assign('changeFieldType', CRM_Custom_Form_ChangeFieldType::fieldTypeTransitions($this->_values['data_type'], $this->_values['html_type']));
     }
-    else {
+
+    // Defaults for create mode
+    if ($this->_action & CRM_Core_Action::ADD) {
+      $defaults['data_type'] = 'String';
+      $defaults['html_type'] = 'Text';
       $defaults['is_active'] = 1;
       $defaults['option_type'] = 1;
       $defaults['is_search_range'] = 1;
-    }
-
-    // set defaults for weight.
-    for ($i = 1; $i <= self::NUM_OPTION; $i++) {
-      $defaults['option_status[' . $i . ']'] = 1;
-      $defaults['option_weight[' . $i . ']'] = $i;
-      $defaults['option_value[' . $i . ']'] = $i;
-    }
-
-    if ($this->_action & CRM_Core_Action::ADD) {
-      $fieldValues = ['custom_group_id' => $this->_gid];
-      $defaults['weight'] = CRM_Utils_Weight::getDefaultWeight('CRM_Core_DAO_CustomField', $fieldValues);
-
+      $defaults['weight'] = CRM_Utils_Weight::getDefaultWeight('CRM_Core_DAO_CustomField', ['custom_group_id' => $this->_gid]);
       $defaults['text_length'] = 255;
       $defaults['note_columns'] = 60;
       $defaults['note_rows'] = 4;
       $defaults['is_view'] = 0;
-    }
 
-    if (!empty($defaults['html_type'])) {
-      $dontShowLink = substr($defaults['html_type'], -14) == 'State/Province' || substr($defaults['html_type'], -7) == 'Country' ? 1 : 0;
+      if (CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $this->_gid, 'is_multiple')) {
+        $defaults['in_selector'] = 1;
+      }
     }
 
-    if (isset($dontShowLink)) {
-      $this->assign('dontShowLink', $dontShowLink);
-    }
-    if ($this->_action & CRM_Core_Action::ADD &&
-      CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $this->_gid, 'is_multiple', 'id')
-    ) {
-      $defaults['in_selector'] = 1;
+    // Set defaults for option values.
+    for ($i = 1; $i <= self::NUM_OPTION; $i++) {
+      $defaults['option_status[' . $i . ']'] = 1;
+      $defaults['option_weight[' . $i . ']'] = $i;
+      $defaults['option_value[' . $i . ']'] = $i;
     }
 
     return $defaults;
@@ -287,8 +195,6 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
       $this->assign('gid', $this->_gid);
     }
 
-    $this->assign('dataTypeKeys', self::$_dataTypeKeys);
-
     // lets trim all the whitespace
     $this->applyFilter('__ALL__', 'trim');
 
@@ -302,17 +208,11 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
       TRUE
     );
 
-    $dt = &self::$_dataTypeValues;
-    $it = [];
-    foreach ($dt as $key => $value) {
-      $it[$key] = self::$_dataToLabels[$key];
-    }
-    $sel = &$this->addElement('hierselect',
-      'data_type',
-      ts('Data and Input Field Type'),
-      '&nbsp;&nbsp;&nbsp;'
-    );
-    $sel->setOptions([$dt, $it]);
+    // FIXME: Switch addField to use APIv4 so we don't get those legacy options from v3
+    $htmlOptions = CRM_Core_BAO_CustomField::buildOptions('html_type', 'create');
+
+    $this->addField('data_type', ['class' => 'twenty'], TRUE);
+    $this->addField('html_type', ['class' => 'twenty', 'options' => $htmlOptions], TRUE);
 
     if (CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $this->_gid, 'is_multiple')) {
       $this->add('checkbox', 'in_selector', ts('Display in Table?'));
@@ -330,11 +230,17 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
     if ($this->_action == CRM_Core_Action::UPDATE) {
       $this->freeze('data_type');
       if (!empty($this->_values['option_group_id'])) {
+        $this->assign('hasOptionGroup', in_array($this->_values['html_type'], self::$htmlTypesWithOptions));
         // Before dev/core#155 we didn't set the is_reserved flag properly, which should be handled by the upgrade script...
         //  but it is still possible that existing installs may have optiongroups linked to custom fields that are marked reserved.
         $optionGroupParams['id'] = $this->_values['option_group_id'];
         $optionGroupParams['options']['or'] = [["is_reserved", "id"]];
       }
+      $this->assign('originalHtmlType', $this->_values['html_type']);
+      $this->assign('originalSerialize', $this->_values['serialize']);
+      if (!empty($this->_values['serialize'])) {
+        $this->assign('existingMultiValueCount', $this->getMultiValueCount());
+      }
     }
 
     // Retrieve optiongroups for selection list
@@ -540,8 +446,7 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
     // is searchable by range?
     $this->addRadio('is_search_range', ts('Search by Range?'), [ts('No'), ts('Yes')]);
 
-    // add buttons
-    $this->addButtons([
+    $buttons = [
       [
         'type' => 'done',
         'name' => ts('Save'),
@@ -556,7 +461,14 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
         'type' => 'cancel',
         'name' => ts('Cancel'),
       ],
-    ]);
+    ];
+    // Save & new only applies to adding a field
+    if ($this->_id) {
+      unset($buttons[1]);
+    }
+
+    // add buttons
+    $this->addButtons($buttons);
 
     // add a form rule to check default value
     $this->addFormRule(['CRM_Custom_Form_Field', 'formRule'], $this);
@@ -565,10 +477,13 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
     if ($this->_action & CRM_Core_Action::VIEW) {
       $this->freeze();
       $url = CRM_Utils_System::url('civicrm/admin/custom/group/field', 'reset=1&action=browse&gid=' . $this->_gid);
-      $this->addElement('button',
+      $this->addElement('xbutton',
         'done',
         ts('Done'),
-        ['onclick' => "location.href='$url'"]
+        [
+          'type' => 'button',
+          'onclick' => "location.href='$url'",
+        ]
       );
     }
   }
@@ -623,11 +538,7 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
       $errors['label'] = ts("You cannot use 'id' as a field label.");
     }
 
-    if (!isset($fields['data_type'][0]) || !isset($fields['data_type'][1])) {
-      $errors['_qf_default'] = ts('Please enter valid - Data and Input Field Type.');
-    }
-
-    $dataType = self::$_dataTypeKeys[$fields['data_type'][0]];
+    $dataType = $fields['data_type'];
 
     if ($default || $dataType == 'ContactReference') {
       switch ($dataType) {
@@ -669,8 +580,8 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
 
         case 'Country':
           if (!empty($default)) {
-            $query = "SELECT count(*) FROM civicrm_country WHERE name = %1 OR iso_code = %1";
-            $params = [1 => [$fields['default_value'], 'String']];
+            $query = "SELECT count(*) FROM civicrm_country WHERE id = %1";
+            $params = [1 => [$fields['default_value'], 'Int']];
             if (CRM_Core_DAO::singleValueQuery($query, $params) <= 0) {
               $errors['default_value'] = ts('Invalid default value for country.');
             }
@@ -682,9 +593,8 @@ class CRM_Custom_Form_Field extends CRM_Core_Form {
             $query = "
 SELECT count(*)
   FROM civicrm_state_province
- WHERE name = %1
-    OR abbreviation = %1";
-            $params = [1 => [$fields['default_value'], 'String']];
+ WHERE id = %1";
+            $params = [1 => [$fields['default_value'], 'Int']];
             if (CRM_Core_DAO::singleValueQuery($query, $params) <= 0) {
               $errors['default_value'] = ts('The invalid default value for State/Province data type');
             }
@@ -705,7 +615,7 @@ SELECT count(*)
       }
     }
 
-    if (self::$_dataTypeKeys[$fields['data_type'][0]] == 'Date') {
+    if ($dataType == 'Date') {
       if (!$fields['date_format']) {
         $errors['date_format'] = ts('Please select a date format.');
       }
@@ -717,11 +627,7 @@ SELECT count(*)
      */
     $_flagOption = $_rowError = 0;
     $_showHide = new CRM_Core_ShowHideBlocks('', '');
-    $dataType = self::$_dataTypeKeys[$fields['data_type'][0]];
-    if (isset($fields['data_type'][1])) {
-      $dataField = $fields['data_type'][1];
-    }
-    $optionFields = ['Select', 'CheckBox', 'Radio'];
+    $htmlType = $fields['html_type'];
 
     if (isset($fields['option_type']) && $fields['option_type'] == 1) {
       //capture duplicate Custom option values
@@ -833,8 +739,7 @@ SELECT count(*)
         $_flagOption = $_emptyRow = 0;
       }
     }
-    elseif (isset($dataField) &&
-      in_array($dataField, $optionFields) &&
+    elseif (in_array($htmlType, self::$htmlTypesWithOptions) &&
       !in_array($dataType, ['Boolean', 'Country', 'StateProvince'])
     ) {
       if (!$fields['option_group_id']) {
@@ -847,10 +752,7 @@ FROM   civicrm_custom_field
 WHERE  data_type != %1
 AND    option_group_id = %2";
         $params = [
-          1 => [
-            self::$_dataTypeKeys[$fields['data_type'][0]],
-            'String',
-          ],
+          1 => [$dataType, 'String'],
           2 => [$fields['option_group_id'], 'Integer'],
         ];
         $count = CRM_Core_DAO::singleValueQuery($query, $params);
@@ -866,18 +768,10 @@ AND    option_group_id = %2";
       $assignError->assign('optionRowError', $_rowError);
     }
     else {
-      if (isset($fields['data_type'][1])) {
-        switch (self::$_dataToHTML[$fields['data_type'][0]][$fields['data_type'][1]]) {
+      if (isset($htmlType)) {
+        switch ($htmlType) {
           case 'Radio':
-            $_fieldError = 1;
-            $assignError->assign('fieldError', $_fieldError);
-            break;
-
-          case 'Checkbox':
-            $_fieldError = 1;
-            $assignError->assign('fieldError', $_fieldError);
-            break;
-
+          case 'CheckBox':
           case 'Select':
             $_fieldError = 1;
             $assignError->assign('fieldError', $_fieldError);
@@ -906,6 +800,27 @@ AND    option_group_id = %2";
       $errors['is_view'] = ts('Can not set this field Required and View Only at the same time.');
     }
 
+    // If switching to a new option list, validate existing data
+    if (empty($errors) && $self->_id && in_array($htmlType, self::$htmlTypesWithOptions)) {
+      $oldHtmlType = $self->_values['html_type'];
+      $oldOptionGroup = $self->_values['option_group_id'];
+      if ($oldHtmlType === 'Text' || $oldOptionGroup != $fields['option_group_id'] || $fields['option_type'] == 1) {
+        if ($fields['option_type'] == 2) {
+          $optionQuery = "SELECT value FROM civicrm_option_value WHERE option_group_id = " . (int) $fields['option_group_id'];
+        }
+        else {
+          $options = array_map(['CRM_Core_DAO', 'escapeString'], array_filter($fields['option_value'], 'strlen'));
+          $optionQuery = '"' . implode('","', $options) . '"';
+        }
+        $table = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $self->_gid, 'table_name');
+        $column = $self->_values['column_name'];
+        $invalid = CRM_Core_DAO::singleValueQuery("SELECT COUNT(*) FROM `$table` WHERE `$column` NOT IN ($optionQuery)");
+        if ($invalid) {
+          $errors['html_type'] = ts('Cannot impose option list because there is existing data which does not match the options.');
+        }
+      }
+    }
+
     return empty($errors) ? TRUE : $errors;
   }
 
@@ -918,24 +833,9 @@ AND    option_group_id = %2";
     // store the submitted values in an array
     $params = $this->controller->exportValues($this->_name);
     self::clearEmptyOptions($params);
-    if ($this->_action == CRM_Core_Action::UPDATE) {
-      $dataTypeKey = $this->_defaultDataType[0];
-      $params['data_type'] = self::$_dataTypeKeys[$this->_defaultDataType[0]];
-      $params['html_type'] = self::$_dataToHTML[$this->_defaultDataType[0]][$this->_defaultDataType[1]];
-    }
-    else {
-      $dataTypeKey = $params['data_type'][0];
-      $params['html_type'] = self::$_dataToHTML[$params['data_type'][0]][$params['data_type'][1]];
-      $params['data_type'] = self::$_dataTypeKeys[$params['data_type'][0]];
-    }
 
     //fix for 'is_search_range' field.
-    if (in_array($dataTypeKey, [
-      1,
-      2,
-      3,
-      5,
-    ])) {
+    if (in_array($params['data_type'], ['Int', 'Float', 'Money', 'Date'])) {
       if (empty($params['is_searchable'])) {
         $params['is_search_range'] = 0;
       }
@@ -944,11 +844,7 @@ AND    option_group_id = %2";
       $params['is_search_range'] = 0;
     }
 
-    // Serialization cannot be changed on update
-    if ($this->_id) {
-      unset($params['serialize']);
-    }
-    elseif (strpos($params['html_type'], 'Select') === 0) {
+    if ($params['html_type'] === 'Select') {
       $params['serialize'] = $params['serialize'] ? CRM_Core_DAO::SERIALIZE_SEPARATOR_BOOKEND : 'null';
     }
     else {
@@ -956,12 +852,11 @@ AND    option_group_id = %2";
     }
 
     $filter = 'null';
-    if ($dataTypeKey == 11 && !empty($params['filter_selected'])) {
+    if ($params['data_type'] == 'ContactReference' && !empty($params['filter_selected'])) {
       if ($params['filter_selected'] == 'Advance' && trim(CRM_Utils_Array::value('filter', $params))) {
         $filter = trim($params['filter']);
       }
       elseif ($params['filter_selected'] == 'Group' && !empty($params['group_id'])) {
-
         $filter = 'action=lookup&group=' . implode(',', $params['group_id']);
       }
     }
@@ -977,43 +872,6 @@ AND    option_group_id = %2";
       $params['weight'] = CRM_Utils_Weight::updateOtherWeights('CRM_Core_DAO_CustomField', $oldWeight, $params['weight'], $fieldValues);
     }
 
-    $strtolower = function_exists('mb_strtolower') ? 'mb_strtolower' : 'strtolower';
-
-    //store the primary key for State/Province or Country as default value.
-    if (strlen(trim($params['default_value']))) {
-      switch ($params['data_type']) {
-        case 'StateProvince':
-          $fieldStateProvince = $strtolower($params['default_value']);
-
-          // LOWER in query below roughly translates to 'hurt my database without deriving any benefit' See CRM-19811.
-          $query = "
-SELECT id
-  FROM civicrm_state_province
- WHERE LOWER(name) = '$fieldStateProvince'
-    OR abbreviation = '$fieldStateProvince'";
-          $dao = CRM_Core_DAO::executeQuery($query);
-          if ($dao->fetch()) {
-            $params['default_value'] = $dao->id;
-          }
-          break;
-
-        case 'Country':
-          $fieldCountry = $strtolower($params['default_value']);
-
-          // LOWER in query below roughly translates to 'hurt my database without deriving any benefit' See CRM-19811.
-          $query = "
-SELECT id
-  FROM civicrm_country
- WHERE LOWER(name) = '$fieldCountry'
-    OR iso_code = '$fieldCountry'";
-          $dao = CRM_Core_DAO::executeQuery($query);
-          if ($dao->fetch()) {
-            $params['default_value'] = $dao->id;
-          }
-          break;
-      }
-    }
-
     // The text_length attribute for Memo fields is in a different input as there
     // are different label, help text and default value than for other type fields
     if ($params['data_type'] == "Memo") {
@@ -1068,4 +926,32 @@ SELECT id
     }
   }
 
+  /**
+   * Get number of existing records for this field that contain more than one serialized value.
+   *
+   * @return int
+   * @throws CRM_Core_Exception
+   */
+  public function getMultiValueCount() {
+    $table = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup', $this->_gid, 'table_name');
+    $column = $this->_values['column_name'];
+    $sp = CRM_Core_DAO::VALUE_SEPARATOR;
+    $sql = "SELECT COUNT(*) FROM `$table` WHERE `$column` LIKE '{$sp}%{$sp}%{$sp}'";
+    return (int) CRM_Core_DAO::singleValueQuery($sql);
+  }
+
+  /**
+   * @return string
+   */
+  public function getDefaultContext() {
+    return 'create';
+  }
+
+  /**
+   * @return string
+   */
+  public function getDefaultEntity() {
+    return 'CustomField';
+  }
+
 }
diff --git a/civicrm/CRM/Custom/Form/Group.php b/civicrm/CRM/Custom/Form/Group.php
index 0c37d9037416f3bc3158bc17170bd53eab0d8013..09cffc753310635b4b1002abeb9c9fa8abba058c 100644
--- a/civicrm/CRM/Custom/Form/Group.php
+++ b/civicrm/CRM/Custom/Form/Group.php
@@ -351,7 +351,10 @@ class CRM_Custom_Form_Group extends CRM_Core_Form {
     // TODO: Is this condition ever true? Can this code be removed?
     if ($this->_action & CRM_Core_Action::VIEW) {
       $this->freeze();
-      $this->addElement('button', 'done', ts('Done'), ['onclick' => "location.href='civicrm/admin/custom/group?reset=1&action=browse'"]);
+      $this->addElement('xbutton', 'done', ts('Done'), [
+        'type' => 'button',
+        'onclick' => "location.href='civicrm/admin/custom/group?reset=1&action=browse'",
+      ]);
     }
   }
 
diff --git a/civicrm/CRM/Custom/Form/Option.php b/civicrm/CRM/Custom/Form/Option.php
index 3bb6a5fb6c0430adc52370d250a4143bfe58cf5d..05f6dcd81e72784dffd4ce024dbd224208efef91 100644
--- a/civicrm/CRM/Custom/Form/Option.php
+++ b/civicrm/CRM/Custom/Form/Option.php
@@ -201,10 +201,14 @@ class CRM_Custom_Form_Option extends CRM_Core_Form {
           'reset=1&action=browse&fid=' . $this->_fid . '&gid=' . $this->_gid,
           TRUE, NULL, FALSE
         );
-        $this->addElement('button',
+        $this->addElement('xbutton',
           'done',
-          ts('Done'),
-          ['onclick' => "location.href='$url'", 'class' => 'crm-form-submit cancel', 'crm-icon' => 'fa-times']
+          CRM_Core_Page::crmIcon('fa-times') . ' ' . ts('Done'),
+          [
+            'type' => 'button',
+            'onclick' => "location.href='$url'",
+            'class' => 'crm-form-submit cancel',
+          ]
         );
       }
     }
diff --git a/civicrm/CRM/Cxn/DAO/Cxn.php b/civicrm/CRM/Cxn/DAO/Cxn.php
index b0b70337bd8a60876f7eca1180c5177144df75cf..03e9fc8ef045c7b053f4fbd73366a53e4f7e9bc4 100644
--- a/civicrm/CRM/Cxn/DAO/Cxn.php
+++ b/civicrm/CRM/Cxn/DAO/Cxn.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Cxn/Cxn.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:059dd4994211085d728a9fc8b7d80803)
+ * (GenCodeChecksum:10e6547299a52750abd62b96dfacc9de)
  */
 
 /**
@@ -117,9 +117,12 @@ class CRM_Cxn_DAO_Cxn extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Cxns');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Cxns') : ts('Cxn');
   }
 
   /**
diff --git a/civicrm/CRM/Dedupe/BAO/RuleGroup.php b/civicrm/CRM/Dedupe/BAO/RuleGroup.php
index 5e1258e775311e520f7601362f1a25ea2c47addf..6cbb407c844b1e5ee4096fcc6f877bb1e09af7c5 100644
--- a/civicrm/CRM/Dedupe/BAO/RuleGroup.php
+++ b/civicrm/CRM/Dedupe/BAO/RuleGroup.php
@@ -212,7 +212,6 @@ class CRM_Dedupe_BAO_RuleGroup extends CRM_Dedupe_DAO_RuleGroup {
     $patternColumn = '/t1.(\w+)/';
     $exclWeightSum = [];
 
-    $dao = new CRM_Core_DAO();
     CRM_Utils_Hook::dupeQuery($this, 'table', $tableQueries);
 
     while (!empty($tableQueries)) {
@@ -257,7 +256,7 @@ class CRM_Dedupe_BAO_RuleGroup extends CRM_Dedupe_DAO_RuleGroup {
 
           // construct and execute the intermediate query
           $query = "{$insertClause} {$query} {$groupByClause} ON DUPLICATE KEY UPDATE weight = weight + VALUES(weight)";
-          $dao->query($query);
+          $dao = CRM_Core_DAO::executeQuery($query);
 
           // FIXME: we need to be more acurate with affected rows, especially for insert vs duplicate insert.
           // And that will help optimize further.
@@ -279,7 +278,7 @@ class CRM_Dedupe_BAO_RuleGroup extends CRM_Dedupe_DAO_RuleGroup {
         $fieldWeight = $fieldWeight[0];
         $query = array_shift($tableQueries);
         $query = "{$insertClause} {$query} {$groupByClause} ON DUPLICATE KEY UPDATE weight = weight + VALUES(weight)";
-        $dao->query($query);
+        $dao = CRM_Core_DAO::executeQuery($query);
         if ($dao->affectedRows() >= 1) {
           $exclWeightSum[] = substr($fieldWeight, strrpos($fieldWeight, '.') + 1);
         }
diff --git a/civicrm/CRM/Dedupe/DAO/Exception.php b/civicrm/CRM/Dedupe/DAO/Exception.php
index cdbb87cc90c7b5ba3adc8a051224eec0f87b7fd3..ca488f4208b16aae42107b099a8b845097ab591a 100644
--- a/civicrm/CRM/Dedupe/DAO/Exception.php
+++ b/civicrm/CRM/Dedupe/DAO/Exception.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Dedupe/Exception.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f4bc21b42b1b5c9cfb0ffa7d3eb46e65)
+ * (GenCodeChecksum:95d83f44443d6ddfed8758214c46ff1b)
  */
 
 /**
@@ -61,9 +61,12 @@ class CRM_Dedupe_DAO_Exception extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Exceptions');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Exceptions') : ts('Exception');
   }
 
   /**
diff --git a/civicrm/CRM/Dedupe/DAO/Rule.php b/civicrm/CRM/Dedupe/DAO/Rule.php
index dea3d38759d4c96ce5822ba452671fd266ea3c22..a09f6a7f4be5084f893f18ceb6b7f4f4cc93a04a 100644
--- a/civicrm/CRM/Dedupe/DAO/Rule.php
+++ b/civicrm/CRM/Dedupe/DAO/Rule.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Dedupe/Rule.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:56abeb7ada5e3dfde910bc5033ca047d)
+ * (GenCodeChecksum:1c0c64573702774a043ea32c73f05bd8)
  */
 
 /**
@@ -82,9 +82,12 @@ class CRM_Dedupe_DAO_Rule extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Rules');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Rules') : ts('Rule');
   }
 
   /**
diff --git a/civicrm/CRM/Dedupe/DAO/RuleGroup.php b/civicrm/CRM/Dedupe/DAO/RuleGroup.php
index 366ff64246d5e3d0ca78a01709223e41db7305b4..62c6a4b2d01771b5c2adb047e77a9a4b157ca2a9 100644
--- a/civicrm/CRM/Dedupe/DAO/RuleGroup.php
+++ b/civicrm/CRM/Dedupe/DAO/RuleGroup.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Dedupe/RuleGroup.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:87a385df0b5bca8150117411f2c31a4a)
+ * (GenCodeChecksum:5fb31b058249567562ab0a30a739fda2)
  */
 
 /**
@@ -89,9 +89,12 @@ class CRM_Dedupe_DAO_RuleGroup extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Rule Groups');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Rule Groups') : ts('Rule Group');
   }
 
   /**
diff --git a/civicrm/CRM/Dedupe/Finder.php b/civicrm/CRM/Dedupe/Finder.php
index 52f6dc4a8172457ede58793f3f10417f4b935882..a6d670e03c07bd61f53f4e6dc534bcbe0be83b89 100644
--- a/civicrm/CRM/Dedupe/Finder.php
+++ b/civicrm/CRM/Dedupe/Finder.php
@@ -47,13 +47,12 @@ class CRM_Dedupe_Finder {
     }
 
     $rgBao->fillTable();
-    $dao = new CRM_Core_DAO();
-    $dao->query($rgBao->thresholdQuery($checkPermissions));
+    $dao = CRM_Core_DAO::executeQuery($rgBao->thresholdQuery($checkPermissions));
     $dupes = [];
     while ($dao->fetch()) {
       $dupes[] = [$dao->id1, $dao->id2, $dao->weight];
     }
-    $dao->query($rgBao->tableDropQuery());
+    CRM_Core_DAO::executeQuery(($rgBao->tableDropQuery()));
 
     return $dupes;
   }
diff --git a/civicrm/CRM/Dedupe/MergeHandler.php b/civicrm/CRM/Dedupe/MergeHandler.php
index 6b86b2f9b91d817164e9d62489775ce1c2b1ec86..654e87c20930b6cd6aed0960a4e92fea3417244c 100644
--- a/civicrm/CRM/Dedupe/MergeHandler.php
+++ b/civicrm/CRM/Dedupe/MergeHandler.php
@@ -190,4 +190,100 @@ class CRM_Dedupe_MergeHandler {
     return $locBlocks;
   }
 
+  /**
+   * Copy the data to be moved to a new DAO object.
+   *
+   * This is intended as a refactoring step - not the long term function. Do not
+   * call from any function other than the one it is taken from (Merger::mergeLocations).
+   *
+   * @param int $otherBlockId
+   * @param string $name
+   * @param int $blkCount
+   *
+   * @return CRM_Core_DAO_Address|CRM_Core_DAO_Email|CRM_Core_DAO_IM|CRM_Core_DAO_Phone|CRM_Core_DAO_Website
+   *
+   * @throws \CRM_Core_Exception
+   */
+  public function copyDataToNewBlockDAO($otherBlockId, $name, $blkCount) {
+    // For the block which belongs to other-contact, link the location block to main-contact
+    $otherBlockDAO = $this->getDAOForLocationEntity($name, $this->getSelectedLocationType($name, $blkCount), $this->getSelectedType($name, $blkCount));
+    $otherBlockDAO->contact_id = $this->getToKeepID();
+    // Get the ID of this block on the 'other' contact, otherwise skip
+    $otherBlockDAO->id = $otherBlockId;
+    return $otherBlockDAO;
+  }
+
+  /**
+   * Get the DAO object appropriate to the location entity.
+   *
+   * @param string $entity
+   *
+   * @param int|null $locationTypeID
+   * @param int|null $typeID
+   *
+   * @return CRM_Core_DAO_Address|CRM_Core_DAO_Email|CRM_Core_DAO_IM|CRM_Core_DAO_Phone|CRM_Core_DAO_Website
+   * @throws \CRM_Core_Exception
+   */
+  public function getDAOForLocationEntity($entity, $locationTypeID = NULL, $typeID = NULL) {
+    switch ($entity) {
+      case 'email':
+        $dao = new CRM_Core_DAO_Email();
+        $dao->location_type_id = $locationTypeID;
+        return $dao;
+
+      case 'address':
+        $dao = new CRM_Core_DAO_Address();
+        $dao->location_type_id = $locationTypeID;
+        return $dao;
+
+      case 'phone':
+        $dao = new CRM_Core_DAO_Phone();
+        $dao->location_type_id = $locationTypeID;
+        $dao->phone_type_id = $typeID;
+        return $dao;
+
+      case 'website':
+        $dao = new CRM_Core_DAO_Website();
+        $dao->website_type_id = $typeID;
+        return $dao;
+
+      case 'im':
+        $dao = new CRM_Core_DAO_IM();
+        $dao->location_type_id = $locationTypeID;
+        return $dao;
+
+      default:
+        // Mostly here, along with the switch over a more concise format, to help IDEs understand the possibilities.
+        throw new CRM_Core_Exception('Unsupported entity');
+    }
+  }
+
+  /**
+   * Get the selected location type for the given location block.
+   *
+   * This will retrieve any user selection if they specified which location to move a block to.
+   *
+   * @param string $entity
+   * @param int $blockIndex
+   *
+   * @return int|null
+   */
+  protected function getSelectedLocationType($entity, $blockIndex) {
+    return $this->getMigrationInfo()['location_blocks'][$entity][$blockIndex]['locTypeId'] ?? NULL;
+  }
+
+  /**
+   * Get the selected type for the given location block.
+   *
+   * This will retrieve any user selection if they specified which type to move a block to (e.g 'Mobile' for phone).
+   *
+   * @param string $entity
+   * @param int $blockIndex
+   *
+   * @return int|null
+   */
+  protected function getSelectedType($entity, $blockIndex) {
+    return $this->getMigrationInfo()['location_blocks'][$entity][$blockIndex]['typeTypeId'] ?? NULL;
+  }
+
 }
diff --git a/civicrm/CRM/Dedupe/Merger.php b/civicrm/CRM/Dedupe/Merger.php
index 69827f16192f092175828e3fb217564ec6499268..b3898072216a75a775f272e7b47d4cf49d1eabb2 100644
--- a/civicrm/CRM/Dedupe/Merger.php
+++ b/civicrm/CRM/Dedupe/Merger.php
@@ -1806,9 +1806,6 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
 
       foreach ($locBlocks as $name => $block) {
         $blocksDAO[$name] = ['delete' => [], 'update' => []];
-        if (!is_array($block) || CRM_Utils_System::isNull($block)) {
-          continue;
-        }
         $daoName = 'CRM_Core_DAO_' . $locationBlocks[$name]['label'];
         $changePrimary = FALSE;
         $primaryDAOId = (array_key_exists($name, $primaryBlockIds)) ? array_pop($primaryBlockIds[$name]) : NULL;
@@ -1820,23 +1817,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
           if (!$otherBlockId) {
             continue;
           }
-
-          // For the block which belongs to other-contact, link the location block to main-contact
-          $otherBlockDAO = new $daoName();
-          $otherBlockDAO->contact_id = $mergeHandler->getToKeepID();
-
-          // Get the ID of this block on the 'other' contact, otherwise skip
-          $otherBlockDAO->id = $otherBlockId;
-
-          // Add/update location and type information from the form, if applicable
-          if ($locationBlocks[$name]['hasLocation']) {
-            $locTypeId = $migrationInfo['location_blocks'][$name][$blkCount]['locTypeId'] ?? NULL;
-            $otherBlockDAO->location_type_id = $locTypeId;
-          }
-          if ($locationBlocks[$name]['hasType']) {
-            $typeTypeId = $migrationInfo['location_blocks'][$name][$blkCount]['typeTypeId'] ?? NULL;
-            $otherBlockDAO->{$locationBlocks[$name]['hasType']} = $typeTypeId;
-          }
+          $otherBlockDAO = $mergeHandler->copyDataToNewBlockDAO($otherBlockId, $name, $blkCount);
 
           // If we're deliberately setting this as primary then add the flag
           // and remove it from the current primary location (if there is one).
@@ -1845,7 +1826,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
           if (!$changePrimary && $set_primary == "1") {
             $otherBlockDAO->is_primary = 1;
             if ($primaryDAOId) {
-              $removePrimaryDAO = new $daoName();
+              $removePrimaryDAO = $mergeHandler->getDAOForLocationEntity($name);
               $removePrimaryDAO->id = $primaryDAOId;
               $removePrimaryDAO->is_primary = 0;
               $blocksDAO[$name]['update'][$primaryDAOId] = $removePrimaryDAO;
@@ -1864,7 +1845,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
 
           // overwrite - need to delete block which belongs to main-contact.
           if (!empty($mainBlockId) && $values['is_replace']) {
-            $deleteDAO = new $daoName();
+            $deleteDAO = $mergeHandler->getDAOForLocationEntity($name);
             $deleteDAO->id = $mainBlockId;
             $deleteDAO->find(TRUE);
 
diff --git a/civicrm/CRM/Event/ActionMapping.php b/civicrm/CRM/Event/ActionMapping.php
index 77fa8d77edfb6fe72abc2b8920a6944a1cf2a694..9c8aaae7a5070c7b28ba118b9cb23cfe76f7819d 100644
--- a/civicrm/CRM/Event/ActionMapping.php
+++ b/civicrm/CRM/Event/ActionMapping.php
@@ -159,6 +159,7 @@ class CRM_Event_ActionMapping extends \Civi\ActionSchedule\Mapping {
     }
 
     // build where clause
+    // FIXME: This handles scheduled reminder of type "Event Name" and "Event Type", gives incorrect result on "Event Template".
     if (!empty($selectedValues)) {
       $valueField = ($this->id == \CRM_Event_ActionMapping::EVENT_TYPE_MAPPING_ID) ? 'event_type_id' : 'id';
       $query->where("r.{$valueField} IN (@selectedValues)")
@@ -186,4 +187,49 @@ class CRM_Event_ActionMapping extends \Civi\ActionSchedule\Mapping {
     return $query;
   }
 
+  /**
+   * Determine whether a schedule based on this mapping should
+   * send to additional contacts.
+   *
+   * @param string $entityId Either an event ID/event type ID, or a set of event IDs/types separated
+   *  by the separation character.
+   */
+  public function sendToAdditional($entityId): bool {
+    $selectedValues = (array) \CRM_Utils_Array::explodePadded($entityId);
+    switch ($this->id) {
+      case self::EVENT_TYPE_MAPPING_ID:
+        $valueTable = 'e';
+        $valueField = 'event_type_id';
+        $templateReminder = FALSE;
+        break;
+
+      case self::EVENT_NAME_MAPPING_ID:
+        $valueTable = 'e';
+        $valueField = 'id';
+        $templateReminder = FALSE;
+        break;
+
+      case self::EVENT_TPL_MAPPING_ID:
+        $valueTable = 't';
+        $valueField = 'id';
+        $templateReminder = TRUE;
+        break;
+    }
+    // Don't send to additional recipients if this event is deleted or a template.
+    $query = new \CRM_Utils_SQL_Select('civicrm_event e');
+    $query
+      ->select('e.id')
+      ->where("e.is_template = 0")
+      ->where("e.is_active = 1");
+    if ($templateReminder) {
+      $query->join('r', 'INNER JOIN civicrm_event t ON e.template_title = t.template_title AND t.is_template = 1');
+    }
+    $sql = $query
+      ->where("{$valueTable}.{$valueField} IN (@selectedValues)")
+      ->param('selectedValues', $selectedValues)
+      ->toSQL();
+    $dao = \CRM_Core_DAO::executeQuery($sql);
+    return (bool) $dao->N;
+  }
+
 }
diff --git a/civicrm/CRM/Event/BAO/Participant.php b/civicrm/CRM/Event/BAO/Participant.php
index f18198b2096152b5c67be0cf2e5f43f158626bff..c68f021c9a590b28e324cd5817fa807ce5a75fe0 100644
--- a/civicrm/CRM/Event/BAO/Participant.php
+++ b/civicrm/CRM/Event/BAO/Participant.php
@@ -191,7 +191,7 @@ class CRM_Event_BAO_Participant extends CRM_Event_DAO_Participant {
     ) {
       // Default status if not specified
       $participant->status_id = $participant->status_id ?: self::fields()['participant_status_id']['default'];
-      CRM_Activity_BAO_Activity::addActivity($participant);
+      CRM_Activity_BAO_Activity::addActivity($participant, 'Event Registration');
     }
 
     //CRM-5403
diff --git a/civicrm/CRM/Event/Cart/DAO/Cart.php b/civicrm/CRM/Event/Cart/DAO/Cart.php
index 38da6b32272d210f3ee7c86576a908a48e075e56..bf8ece70d43a145dab456c6b65935244eb96688a 100644
--- a/civicrm/CRM/Event/Cart/DAO/Cart.php
+++ b/civicrm/CRM/Event/Cart/DAO/Cart.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Event/Cart/Cart.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b4aacbeb6deddb31e520ce700e774db5)
+ * (GenCodeChecksum:b7a4ad0bbb09a64b8afefd7a1a2d6a9b)
  */
 
 /**
@@ -59,9 +59,12 @@ class CRM_Event_Cart_DAO_Cart extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Carts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Carts') : ts('Cart');
   }
 
   /**
diff --git a/civicrm/CRM/Event/Cart/DAO/EventInCart.php b/civicrm/CRM/Event/Cart/DAO/EventInCart.php
index d1550cd54ad61d1c01258fd53aa70168817eebce..61f42ceb2254f03560b88ff74ae569a4793d8c69 100644
--- a/civicrm/CRM/Event/Cart/DAO/EventInCart.php
+++ b/civicrm/CRM/Event/Cart/DAO/EventInCart.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Event/Cart/EventInCart.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b1cb9524ae26740c93dda80d0cb4ff91)
+ * (GenCodeChecksum:ef07999cbb7872dc9c1cfa6a0055bee1)
  */
 
 /**
@@ -61,9 +61,12 @@ class CRM_Event_Cart_DAO_EventInCart extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Event In Carts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Event In Carts') : ts('Event In Cart');
   }
 
   /**
diff --git a/civicrm/CRM/Event/Controller/Search.php b/civicrm/CRM/Event/Controller/Search.php
index 927c9422fe53ed306733c892647849f89131a7f1..1206ecee06e3945f4a0cf5321d4d105115089220 100644
--- a/civicrm/CRM/Event/Controller/Search.php
+++ b/civicrm/CRM/Event/Controller/Search.php
@@ -22,6 +22,8 @@
  */
 class CRM_Event_Controller_Search extends CRM_Core_Controller {
 
+  protected $entity = 'Participant';
+
   /**
    * Class constructor.
    *
@@ -56,6 +58,7 @@ class CRM_Event_Controller_Search extends CRM_Core_Controller {
 
     // add all the actions
     $this->addActions($uploadDir, $uploadNames);
+    $this->set('entity', $this->entity);
   }
 
 }
diff --git a/civicrm/CRM/Event/DAO/Event.php b/civicrm/CRM/Event/DAO/Event.php
index a7febe5bfe94e9be9e40fd3e911f899c97da69a5..553ddd7e1f39bc3fd4a9bcab1128a370b249b802 100644
--- a/civicrm/CRM/Event/DAO/Event.php
+++ b/civicrm/CRM/Event/DAO/Event.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Event/Event.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:82ba48cbb804cf6f4b26fa50f07d44db)
+ * (GenCodeChecksum:3514f838a27ddbf9bdf6e63ea20aabec)
  */
 
 /**
@@ -528,9 +528,12 @@ class CRM_Event_DAO_Event extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Events');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Events') : ts('Event');
   }
 
   /**
diff --git a/civicrm/CRM/Event/DAO/Participant.php b/civicrm/CRM/Event/DAO/Participant.php
index 94db537c3abe12954e9d5cbbf37d1316e1530255..3d7a2fa49dbddf5142cb977955203fc6ea296768 100644
--- a/civicrm/CRM/Event/DAO/Participant.php
+++ b/civicrm/CRM/Event/DAO/Participant.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Event/Participant.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:bf8ed42264e81ccaef0ae236242990d0)
+ * (GenCodeChecksum:97d6a90c8b1f973347dc8decd97f84ee)
  */
 
 /**
@@ -177,9 +177,12 @@ class CRM_Event_DAO_Participant extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Participants');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Participants') : ts('Participant');
   }
 
   /**
diff --git a/civicrm/CRM/Event/DAO/ParticipantPayment.php b/civicrm/CRM/Event/DAO/ParticipantPayment.php
index ee0070dfc21351b1e72e740c038ad82c51942c89..44cff71fabed05ba2de773f1f4da0a5f229ccaea 100644
--- a/civicrm/CRM/Event/DAO/ParticipantPayment.php
+++ b/civicrm/CRM/Event/DAO/ParticipantPayment.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Event/ParticipantPayment.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0c828890e84b791e0432445eb2d01086)
+ * (GenCodeChecksum:767fb54121e25d39d9b82cfbb4a5355b)
  */
 
 /**
@@ -61,9 +61,12 @@ class CRM_Event_DAO_ParticipantPayment extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Participant Payments');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Participant Payments') : ts('Participant Payment');
   }
 
   /**
diff --git a/civicrm/CRM/Event/DAO/ParticipantStatusType.php b/civicrm/CRM/Event/DAO/ParticipantStatusType.php
index 2b6e4f8f030f152499f879e9a2bad0f1d9c55d44..cf410c357bcdf2f9a7ab949c76784ffcaf20416c 100644
--- a/civicrm/CRM/Event/DAO/ParticipantStatusType.php
+++ b/civicrm/CRM/Event/DAO/ParticipantStatusType.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Event/ParticipantStatusType.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4a3012f88c67826cb4264a3340e908ec)
+ * (GenCodeChecksum:6bf827c56f673a914923346816449255)
  */
 
 /**
@@ -103,9 +103,12 @@ class CRM_Event_DAO_ParticipantStatusType extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Participant Status Types');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Participant Status Types') : ts('Participant Status Type');
   }
 
   /**
diff --git a/civicrm/CRM/Event/Form/EventFees.php b/civicrm/CRM/Event/Form/EventFees.php
index 14be8ec5f6e8ba76f251f09d514389b5a240aacc..2b15c288cef972ecb51c2c820849c9c0c13e9593 100644
--- a/civicrm/CRM/Event/Form/EventFees.php
+++ b/civicrm/CRM/Event/Form/EventFees.php
@@ -159,6 +159,7 @@ class CRM_Event_Form_EventFees {
       if (in_array(get_class($form),
         [
           'CRM_Event_Form_Participant',
+          'CRM_Event_Form_Task_Register',
           'CRM_Event_Form_Registration_Register',
           'CRM_Event_Form_Registration_AdditionalParticipant',
         ]
@@ -173,7 +174,7 @@ class CRM_Event_Form_EventFees {
         foreach ($form->_priceSet['fields'] as $key => $val) {
           foreach ($val['options'] as $keys => $values) {
             if ($values['is_default']) {
-              if (get_class($form) != 'CRM_Event_Form_Participant' && !empty($values['is_full'])) {
+              if (!in_array(get_class($form), ['CRM_Event_Form_Participant', 'CRM_Event_Form_Task_Register']) && !empty($values['is_full'])) {
                 continue;
               }
 
diff --git a/civicrm/CRM/Event/Form/ManageEvent.php b/civicrm/CRM/Event/Form/ManageEvent.php
index 74c595c4999b06129f199cb8a0fac22b7b24830b..292e8b2b4c85eae76f0a0f12d5e23d09c4deec50 100644
--- a/civicrm/CRM/Event/Form/ManageEvent.php
+++ b/civicrm/CRM/Event/Form/ManageEvent.php
@@ -180,7 +180,7 @@ class CRM_Event_Form_ManageEvent extends CRM_Core_Form {
     $ufEdit = CRM_ACL_API::group(CRM_Core_Permission::EDIT, NULL, 'civicrm_uf_group', $ufGroups);
     $checkPermission = [
       [
-        'administer CiviCRM',
+        'administer CiviCRM data',
         'manage event profiles',
       ],
     ];
diff --git a/civicrm/CRM/Event/Form/ManageEvent/Fee.php b/civicrm/CRM/Event/Form/ManageEvent/Fee.php
index 40b40fc9126e655739992dda15e0c02448771af1..fa96e1a4f6c4a7f304124294eafb68d50ca18cb5 100644
--- a/civicrm/CRM/Event/Form/ManageEvent/Fee.php
+++ b/civicrm/CRM/Event/Form/ManageEvent/Fee.php
@@ -355,8 +355,12 @@ class CRM_Event_Form_ManageEvent_Fee extends CRM_Event_Form_ManageEvent {
       $this->add('datepicker', 'discount_end_date[' . $i . ']', ts('Discount End Date'), [], FALSE, ['time' => FALSE]);
     }
     $_showHide->addToTemplate();
-    $this->addElement('submit', $this->getButtonName('submit'), ts('Add Discount Set to Fee Table'),
-      ['class' => 'crm-form-submit cancel']
+    $this->addElement('xbutton', $this->getButtonName('submit'), ts('Add Discount Set to Fee Table'),
+      [
+        'type' => 'submit',
+        'class' => 'crm-form-submit cancel',
+        'value' => 1,
+      ]
     );
     if (Civi::settings()->get('deferred_revenue_enabled')) {
       $deferredFinancialType = CRM_Financial_BAO_FinancialAccount::getDeferredFinancialType();
diff --git a/civicrm/CRM/Event/Form/ManageEvent/Location.php b/civicrm/CRM/Event/Form/ManageEvent/Location.php
index 61145c3d560b00b514168e2afa1773dbe23726a4..b0d045da488255d82dbf36c20dc3f13485cec007 100644
--- a/civicrm/CRM/Event/Form/ManageEvent/Location.php
+++ b/civicrm/CRM/Event/Form/ManageEvent/Location.php
@@ -9,6 +9,12 @@
  +--------------------------------------------------------------------+
  */
 
+use Civi\Api4\Event;
+use Civi\Api4\LocBlock;
+use Civi\Api4\Email;
+use Civi\Api4\Phone;
+use Civi\Api4\Address;
+
 /**
  *
  *
@@ -22,6 +28,11 @@
  */
 class CRM_Event_Form_ManageEvent_Location extends CRM_Event_Form_ManageEvent {
 
+  /**
+   * @var \Civi\Api4\Generic\Result
+   */
+  protected $locationBlock;
+
   /**
    * How many locationBlocks should we display?
    *
@@ -143,9 +154,11 @@ class CRM_Event_Form_ManageEvent_Location extends CRM_Event_Form_ManageEvent {
     $this->assign('action', $this->_action);
 
     if ($this->_id) {
-      $this->_oldLocBlockId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Event',
-        $this->_id, 'loc_block_id'
-      );
+      $this->locationBlock = Event::get()
+        ->addWhere('id', '=', $this->_id)
+        ->setSelect(['loc_block.*', 'loc_block_id'])
+        ->execute()->first();
+      $this->_oldLocBlockId = $this->locationBlock['loc_block_id'];
     }
 
     // get the list of location blocks being used by other events
@@ -211,7 +224,6 @@ class CRM_Event_Form_ManageEvent_Location extends CRM_Event_Form_ManageEvent {
       );
     }
 
-    $this->_values['address'] = $this->_values['phone'] = $this->_values['email'] = [];
     // if 'create new loc' option is selected OR selected new loc is different
     // from old one, go ahead and delete the old loc provided thats not being
     // used by any other event
@@ -219,32 +231,43 @@ class CRM_Event_Form_ManageEvent_Location extends CRM_Event_Form_ManageEvent {
       CRM_Event_BAO_Event::deleteEventLocBlock($this->_oldLocBlockId, $this->_id);
     }
 
-    // get ready with location block params
-    $params['entity_table'] = 'civicrm_event';
-    $params['entity_id'] = $this->_id;
+    $isUpdateToExistingLocationBlock = !$deleteOldBlock && !empty($params['loc_event_id']) && (int) $params['loc_event_id'] === $this->locationBlock['loc_block_id'];
+    // It should be impossible for there to be no default location type. Consider removing this handling
+    $defaultLocationTypeID = CRM_Core_BAO_LocationType::getDefault()->id ?? 1;
 
-    $defaultLocationType = CRM_Core_BAO_LocationType::getDefault();
     foreach ([
-      'address',
-      'phone',
-      'email',
-    ] as $block) {
-      if (empty($params[$block]) || !is_array($params[$block])) {
-        continue;
-      }
-      foreach ($params[$block] as $count => & $values) {
-        if ($count == 1) {
-          $values['is_primary'] = 1;
+      'address' => $params['address'],
+      'phone' => $params['phone'],
+      'email' => $params['email'],
+    ] as $block => $locationEntities) {
+
+      $params[$block][1]['is_primary'] = 1;
+      foreach ($locationEntities as $index => $locationEntity) {
+        if (!$this->isLocationHasData($block, $locationEntity)) {
+          unset($params[$block][$index]);
+          continue;
         }
-        $values['location_type_id'] = ($defaultLocationType->id) ? $defaultLocationType->id : 1;
-        if (isset($this->_values[$block][$count])) {
-          $values['id'] = $this->_values[$block][$count]['id'];
+        $params[$block][$index]['location_type_id'] = $defaultLocationTypeID;
+        $fieldKey = (int) $index === 1 ? '_id' : '_2_id';
+        if ($isUpdateToExistingLocationBlock && !empty($this->locationBlock['loc_block.' . $block . $fieldKey])) {
+          $params[$block][$index]['id'] = $this->locationBlock['loc_block.' . $block . $fieldKey];
         }
       }
     }
-
-    // create/update event location
-    $params['loc_block_id'] = CRM_Core_BAO_Location::create($params, TRUE, 'event')['id'];
+    $addresses = empty($params['address']) ? [] : Address::save(FALSE)->setRecords($params['address'])->execute();
+    $emails = empty($params['email']) ? [] : Email::save(FALSE)->setRecords($params['email'])->execute();
+    $phones = empty($params['phone']) ? [] : Phone::save(FALSE)->setRecords($params['phone'])->execute();
+
+    $params['loc_block_id'] = LocBlock::save(FALSE)->setRecords([
+      [
+        'email_id' => $emails[0]['id'] ?? NULL,
+        'address_id' => $addresses[0]['id'] ?? NULL,
+        'phone_id' => $phones[0]['id'] ?? NULL,
+        'email_2_id' => $emails[1]['id'] ?? NULL,
+        'address_2_id' => $addresses[1]['id'] ?? NULL,
+        'phone_2_id' => $phones[1]['id'] ?? NULL,
+      ],
+    ])->execute()->first()['id'];
 
     // finally update event params
     $params['id'] = $this->_id;
@@ -264,4 +287,27 @@ class CRM_Event_Form_ManageEvent_Location extends CRM_Event_Form_ManageEvent {
     return ts('Event Location');
   }
 
+  /**
+   * Is there some data to save for the given entity
+   *
+   * @param string $block
+   * @param array $locationEntity
+   *
+   * @return bool
+   */
+  protected function isLocationHasData(string $block, array $locationEntity): bool {
+    if ($block === 'email') {
+      return !empty($locationEntity['email']);
+    }
+    if ($block === 'phone') {
+      return !empty($locationEntity['phone']);
+    }
+    foreach ($locationEntity as $value) {
+      if (!empty($value)) {
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+
 }
diff --git a/civicrm/CRM/Event/Form/ManageEvent/TabHeader.php b/civicrm/CRM/Event/Form/ManageEvent/TabHeader.php
index ebfba8f0dc39c1fdaca1e36f4bb13e64cf30dcd7..260605871f1a9b396e985abfd4118ae7600067a5 100644
--- a/civicrm/CRM/Event/Form/ManageEvent/TabHeader.php
+++ b/civicrm/CRM/Event/Form/ManageEvent/TabHeader.php
@@ -70,7 +70,7 @@ class CRM_Event_Form_ManageEvent_TabHeader {
     $tabs['registration'] = ['title' => ts('Online Registration')] + $default;
     // @fixme I don't understand the event permissions check here - can we just get rid of it?
     $permissions = CRM_Event_BAO_Event::getAllPermissions();
-    if (CRM_Core_Permission::check('administer CiviCRM') || !empty($permissions[CRM_Core_Permission::EDIT])) {
+    if (CRM_Core_Permission::check('administer CiviCRM data') || !empty($permissions[CRM_Core_Permission::EDIT])) {
       $tabs['reminder'] = ['title' => ts('Schedule Reminders'), 'class' => 'livePage'] + $default;
     }
     $tabs['conference'] = ['title' => ts('Conference Slots')] + $default;
diff --git a/civicrm/CRM/Event/Form/Participant.php b/civicrm/CRM/Event/Form/Participant.php
index 5bf815072a32b347bc212a9950e4e8f6de128fb4..71c3204b8ce7dffd8872fb53e657078da0e3f9e4 100644
--- a/civicrm/CRM/Event/Form/Participant.php
+++ b/civicrm/CRM/Event/Form/Participant.php
@@ -99,11 +99,14 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
 
   /**
    * Are we operating in "single mode", i.e. adding / editing only
-   * one participant record, or is this a batch add operation
+   * one participant record, or is this a batch add operation.
+   *
+   * Note the goal is to disentangle all the non-single stuff
+   * to CRM_Event_Form_Task_Register and discontinue this param.
    *
    * @var bool
    */
-  public $_single = FALSE;
+  public $_single = TRUE;
 
   /**
    * If event is paid or unpaid.
@@ -335,57 +338,7 @@ class CRM_Event_Form_Participant extends CRM_Contribute_Form_AbstractEditPayment
       return CRM_Event_Form_EventFees::preProcess($this);
     }
 
-    //check the mode when this form is called either single or as
-    //search task action
-    if ($this->_id || $this->_contactId || $this->_context == 'standalone') {
-      $this->_single = TRUE;
-      $this->assign('urlPath', 'civicrm/contact/view/participant');
-      if (!$this->_id && !$this->_contactId) {
-        $breadCrumbs = [
-          [
-            'title' => ts('CiviEvent Dashboard'),
-            'url' => CRM_Utils_System::url('civicrm/event', 'reset=1'),
-          ],
-        ];
-
-        CRM_Utils_System::appendBreadCrumb($breadCrumbs);
-      }
-    }
-    else {
-      //set the appropriate action
-      $context = $this->get('context');
-      $urlString = 'civicrm/contact/search';
-      $this->_action = CRM_Core_Action::BASIC;
-      switch ($context) {
-        case 'advanced':
-          $urlString = 'civicrm/contact/search/advanced';
-          $this->_action = CRM_Core_Action::ADVANCED;
-          break;
-
-        case 'builder':
-          $urlString = 'civicrm/contact/search/builder';
-          $this->_action = CRM_Core_Action::PROFILE;
-          break;
-
-        case 'basic':
-          $urlString = 'civicrm/contact/search/basic';
-          $this->_action = CRM_Core_Action::BASIC;
-          break;
-
-        case 'custom':
-          $urlString = 'civicrm/contact/search/custom';
-          $this->_action = CRM_Core_Action::COPY;
-          break;
-      }
-      CRM_Contact_Form_Task::preProcessCommon($this);
-
-      $this->_single = FALSE;
-      $this->_contactId = NULL;
-
-      //set ajax path, this used for custom data building
-      $this->assign('urlPath', $urlString);
-      $this->assign('urlPathVar', "_qf_Participant_display=true&qfKey={$this->controller->_key}");
-    }
+    $this->assignUrlPath();
 
     $this->assign('single', $this->_single);
 
@@ -2328,4 +2281,21 @@ INNER JOIN civicrm_price_field_value value ON ( value.id = lineItem.price_field_
     return $feeDetails;
   }
 
+  /**
+   * Assign the url path to the template.
+   */
+  protected function assignUrlPath() {
+    $this->assign('urlPath', 'civicrm/contact/view/participant');
+    if (!$this->_id && !$this->_contactId) {
+      $breadCrumbs = [
+        [
+          'title' => ts('CiviEvent Dashboard'),
+          'url' => CRM_Utils_System::url('civicrm/event', 'reset=1'),
+        ],
+      ];
+
+      CRM_Utils_System::appendBreadCrumb($breadCrumbs);
+    }
+  }
+
 }
diff --git a/civicrm/CRM/Event/Form/Registration.php b/civicrm/CRM/Event/Form/Registration.php
index 4b2692e67b515cb8221836b1e71692fc164ca479..2d481e486efccb5ade07620dbe40168897a0d184 100644
--- a/civicrm/CRM/Event/Form/Registration.php
+++ b/civicrm/CRM/Event/Form/Registration.php
@@ -657,7 +657,7 @@ class CRM_Event_Form_Registration extends CRM_Core_Form {
       }
     }
     if ($isPaidEvent && empty($form->_values['fee'])) {
-      if (CRM_Utils_System::getClassName($form) != 'CRM_Event_Form_Participant') {
+      if (!in_array(CRM_Utils_System::getClassName($form), ['CRM_Event_Form_Participant', 'CRM_Event_Form_Task_Register'])) {
         CRM_Core_Error::statusBounce(ts('No Fee Level(s) or Price Set is configured for this event.<br />Click <a href=\'%1\'>CiviEvent >> Manage Event >> Configure >> Event Fees</a> to configure the Fee Level(s) or Price Set for this event.', [1 => CRM_Utils_System::url('civicrm/event/manage/fee', 'reset=1&action=update&id=' . $form->_eventId)]));
       }
     }
diff --git a/civicrm/CRM/Event/Form/Registration/Register.php b/civicrm/CRM/Event/Form/Registration/Register.php
index bd133450b0e12884b7b89e8d10103f80dfa489df..5d39b2a126dc50cc62cfb1599e9ed847daf34d1c 100644
--- a/civicrm/CRM/Event/Form/Registration/Register.php
+++ b/civicrm/CRM/Event/Form/Registration/Register.php
@@ -563,7 +563,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
 
       // CRM-14492 Admin price fields should show up on event registration if user has 'administer CiviCRM' permissions
       $adminFieldVisible = FALSE;
-      if (CRM_Core_Permission::check('administer CiviCRM')) {
+      if (CRM_Core_Permission::check('administer CiviCRM data')) {
         $adminFieldVisible = TRUE;
       }
 
@@ -577,6 +577,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
         if (CRM_Utils_Array::value('visibility', $field) == 'public' ||
           (CRM_Utils_Array::value('visibility', $field) == 'admin' && $adminFieldVisible == TRUE) ||
           $className == 'CRM_Event_Form_Participant' ||
+          $className === 'CRM_Event_Form_Task_Register' ||
           $className == 'CRM_Event_Form_ParticipantFeeSelection'
         ) {
           $fieldId = $field['id'];
@@ -589,7 +590,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
 
           //user might modified w/ hook.
           $options = $field['options'] ?? NULL;
-          $formClasses = ['CRM_Event_Form_Participant', 'CRM_Event_Form_ParticipantFeeSelection'];
+          $formClasses = ['CRM_Event_Form_Participant', 'CRM_Event_Form_Task_Register', 'CRM_Event_Form_ParticipantFeeSelection'];
 
           if (!is_array($options)) {
             continue;
@@ -636,7 +637,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
 
           //CRM-7632, CRM-6201
           $totalAmountJs = NULL;
-          if ($className == 'CRM_Event_Form_Participant') {
+          if ($className == 'CRM_Event_Form_Participant' || $className === 'CRM_Event_Form_Task_Register') {
             $totalAmountJs = ['onClick' => "fillTotalAmount(" . $fee['value'] . ")"];
           }
 
@@ -755,7 +756,7 @@ class CRM_Event_Form_Registration_Register extends CRM_Event_Form_Registration {
       }
 
       //ignore option full for offline registration.
-      if ($className == 'CRM_Event_Form_Participant') {
+      if ($className == 'CRM_Event_Form_Participant' || $className === 'CRM_Event_Form_Task_Register') {
         $optionFullIds = [];
       }
 
diff --git a/civicrm/CRM/Event/Form/Search.php b/civicrm/CRM/Event/Form/Search.php
index 30001106871355690a3bc30630499c7825466323..ac4404ca6de11e530b1b2f84dcebfa42bd935a0a 100644
--- a/civicrm/CRM/Event/Form/Search.php
+++ b/civicrm/CRM/Event/Form/Search.php
@@ -79,6 +79,9 @@ class CRM_Event_Form_Search extends CRM_Core_Form_Search {
    * @throws \CiviCRM_API3_Exception
    */
   public function preProcess() {
+    // SearchFormName is deprecated & to be removed - the replacement is for the task to
+    // call $this->form->getSearchFormValues()
+    // A couple of extensions use it.
     $this->set('searchFormName', 'Search');
 
     /**
diff --git a/civicrm/CRM/Event/Form/Task.php b/civicrm/CRM/Event/Form/Task.php
index 18962108a61cfc379596c8c0077e2ff1fb4f962d..4da684f51308070f10a006c0da301fd01bf75629 100644
--- a/civicrm/CRM/Event/Form/Task.php
+++ b/civicrm/CRM/Event/Form/Task.php
@@ -40,19 +40,18 @@ class CRM_Event_Form_Task extends CRM_Core_Form_Task {
   }
 
   /**
-   * @param CRM_Core_Form $form
+   * @param CRM_Core_Form_Task $form
    */
   public static function preProcessCommon(&$form) {
     $form->_participantIds = [];
 
-    $values = $form->controller->exportValues($form->get('searchFormName'));
+    $values = $form->getSearchFormValues();
 
     $form->_task = $values['task'];
     $tasks = CRM_Event_Task::permissionedTaskTitles(CRM_Core_Permission::getPermission());
     if (!array_key_exists($form->_task, $tasks)) {
       CRM_Core_Error::statusBounce(ts('You do not have permission to access this page.'));
     }
-    $form->assign('taskName', $tasks[$form->_task]);
 
     $ids = [];
     if ($values['radio_ts'] == 'ts_sel') {
diff --git a/civicrm/CRM/Event/Form/Task/Batch.php b/civicrm/CRM/Event/Form/Task/Batch.php
index bc00eccc68d1a2a637eeadb938e95dacd8e4e84e..395feda8652fa7c75e9d4cf9f904de8d2369885c 100644
--- a/civicrm/CRM/Event/Form/Task/Batch.php
+++ b/civicrm/CRM/Event/Form/Task/Batch.php
@@ -280,28 +280,21 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
     $negativeStatuses = CRM_Event_PseudoConstant::participantStatus(NULL, "class = 'Negative'");
     $contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
 
-    $contributionStatusId = NULL;
     if (array_key_exists($statusId, $positiveStatuses)) {
-      $contributionStatusId = array_search('Completed', $contributionStatuses);
+      $params = [
+        'component_id' => $participantId,
+        'contribution_id' => $contributionId,
+        'IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved' => 1,
+      ];
+
+      //change related contribution status.
+      self::updateContributionStatus($params);
     }
     if (array_key_exists($statusId, $negativeStatuses)) {
-      $contributionStatusId = array_search('Cancelled', $contributionStatuses);
-    }
-
-    if (!$contributionStatusId || !$participantId || !$contributionId) {
+      civicrm_api3('Contribution', 'create', ['id' => $contributionId, 'contribution_status_id' => 'Cancelled']);
       return;
     }
 
-    $params = [
-      'component_id' => $participantId,
-      'componentName' => 'Event',
-      'contribution_id' => $contributionId,
-      'contribution_status_id' => $contributionStatusId,
-      'IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved' => 1,
-    ];
-
-    //change related contribution status.
-    self::updateContributionStatus($params);
   }
 
   /**
@@ -319,73 +312,21 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
    *
    */
   public static function updateContributionStatus($params) {
-    // get minimum required values.
-    $statusId = $params['contribution_status_id'] ?? NULL;
-    $componentId = $params['component_id'] ?? NULL;
-    $componentName = $params['componentName'] ?? NULL;
-    $contributionId = $params['contribution_id'] ?? NULL;
-
-    $input = $ids = $objects = [];
-
-    //get the required ids.
-    $ids['contribution'] = $contributionId;
-
-    if (!$ids['contact'] = CRM_Utils_Array::value('contact_id', $params)) {
-      $ids['contact'] = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution',
-        $contributionId,
-        'contact_id'
-      );
-    }
-
-    if ($componentName === 'Event') {
-      $name = 'event';
-      $ids['participant'] = $componentId;
-
-      if (!$ids['event'] = CRM_Utils_Array::value('event_id', $params)) {
-        $ids['event'] = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Participant',
-          $componentId,
-          'event_id'
-        );
-      }
-    }
-
-    if ($componentName === 'Membership') {
-      $name = 'contribute';
-      $ids['membership'] = $componentId;
-    }
-    $ids['contributionPage'] = NULL;
-    $ids['contributionRecur'] = NULL;
-    $input['component'] = $name;
-
-    $baseIPN = new CRM_Core_Payment_BaseIPN();
+    $input = ['component' => 'event'];
 
     // reset template values.
     $template = CRM_Core_Smarty::singleton();
     $template->clearTemplateVars();
 
-    if (!$baseIPN->validateData($input, $ids, $objects, FALSE)) {
-      throw new CRM_Core_Exception('validation error');
-    }
-
-    $contribution = &$objects['contribution'];
+    $contribution = new CRM_Contribute_BAO_Contribution();
+    $contribution->id = $params['contribution_id'];
+    $contribution->fetch();
 
     $contributionStatuses = CRM_Core_PseudoConstant::get('CRM_Contribute_DAO_Contribution', 'contribution_status_id', [
       'labelColumn' => 'name',
       'flip' => 1,
     ]);
     $input['IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved'] = $params['IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved'] ?? NULL;
-    if ($statusId == $contributionStatuses['Cancelled']) {
-      $transaction = new CRM_Core_Transaction();
-      $baseIPN->cancelled($objects, $transaction, $input);
-      $transaction->commit();
-      return;
-    }
-    if ($statusId == $contributionStatuses['Failed']) {
-      $transaction = new CRM_Core_Transaction();
-      $baseIPN->failed($objects, $transaction, $input);
-      $transaction->commit();
-      return;
-    }
 
     // status is not pending
     if ($contribution->contribution_status_id != $contributionStatuses['Pending']) {
@@ -418,10 +359,10 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
     // @todo use the api - ie civicrm_api3('Contribution', 'completetransaction', $input);
     // as this method is not preferred / supported.
     CRM_Contribute_BAO_Contribution::completeOrder($input, [
-      'related_contact' => $ids['related_contact'] ?? NULL,
-      'participant' => !empty($objects['participant']) ? $objects['participant']->id : NULL,
+      'related_contact' => NULL,
+      'participant' => $params['component_id'],
       'contributionRecur' => NULL,
-    ], $objects);
+    ], ['contribution' => $contribution]);
 
     // reset template values before processing next transactions
     $template->clearTemplateVars();
@@ -449,11 +390,11 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
   public function submit($params) {
     $statusClasses = CRM_Event_PseudoConstant::participantStatusClass();
     if (isset($params['field'])) {
-      foreach ($params['field'] as $key => $value) {
+      foreach ($params['field'] as $participantID => $value) {
 
         //check for custom data
         $value['custom'] = CRM_Core_BAO_CustomField::postProcess($value,
-          $key,
+          $participantID,
           'Participant'
         );
         foreach (array_keys($value) as $fieldName) {
@@ -467,7 +408,7 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
           }
         }
 
-        $value['id'] = $key;
+        $value['id'] = $participantID;
 
         if (!empty($value['participant_role'])) {
           if (is_array($value['participant_role'])) {
@@ -483,9 +424,9 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
         $relatedStatusChange = FALSE;
         if (!empty($value['participant_status'])) {
           $value['status_id'] = $value['participant_status'];
-          $fromStatusId = $this->_fromStatusIds[$key] ?? NULL;
+          $fromStatusId = $this->_fromStatusIds[$participantID] ?? NULL;
           if (!$fromStatusId) {
-            $fromStatusId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Participant', $key, 'status_id');
+            $fromStatusId = CRM_Core_DAO::getFieldValue('CRM_Event_DAO_Participant', $participantID, 'status_id');
           }
 
           if ($fromStatusId != $value['status_id']) {
@@ -502,11 +443,11 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
 
         //need to trigger mails when we change status
         if ($statusChange) {
-          CRM_Event_BAO_Participant::transitionParticipants([$key], $value['status_id'], $fromStatusId);
+          CRM_Event_BAO_Participant::transitionParticipants([$participantID], $value['status_id'], $fromStatusId);
         }
-        if ($relatedStatusChange && $key && $value['status_id']) {
+        if ($relatedStatusChange && $participantID && $value['status_id']) {
           //update related contribution status, CRM-4395
-          self::updatePendingOnlineContribution($key, $value['status_id']);
+          self::updatePendingOnlineContribution((int) $participantID, $value['status_id']);
         }
       }
       CRM_Core_Session::setStatus(ts('The updates have been saved.'), ts('Saved'), 'success');
diff --git a/civicrm/CRM/Event/Form/Task/Register.php b/civicrm/CRM/Event/Form/Task/Register.php
new file mode 100644
index 0000000000000000000000000000000000000000..b13a5619db2486f586ca78c5b317e6f01641a239
--- /dev/null
+++ b/civicrm/CRM/Event/Form/Task/Register.php
@@ -0,0 +1,78 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ */
+
+/**
+ * This class provides the register functionality from a search context.
+ *
+ * Originally the functionality was all munged into the main Participant form.
+ *
+ * Ideally it would be entirely separated but for now this overrides the main form,
+ * just providing a better separation of the functionality for the search vs main form.
+ */
+class CRM_Event_Form_Task_Register extends CRM_Event_Form_Participant {
+
+
+  /**
+   * Are we operating in "single mode", i.e. adding / editing only
+   * one participant record, or is this a batch add operation
+   *
+   * ote the goal is to disentangle all the non-single stuff
+   * into this form and discontinue this param.
+   *
+   * @var bool
+   */
+  public $_single = FALSE;
+
+  /**
+   * Assign the url path to the template.
+   */
+  protected function assignUrlPath() {
+    //set the appropriate action
+    $context = $this->get('context');
+    $urlString = 'civicrm/contact/search';
+    $this->_action = CRM_Core_Action::BASIC;
+    switch ($context) {
+      case 'advanced':
+        $urlString = 'civicrm/contact/search/advanced';
+        $this->_action = CRM_Core_Action::ADVANCED;
+        break;
+
+      case 'builder':
+        $urlString = 'civicrm/contact/search/builder';
+        $this->_action = CRM_Core_Action::PROFILE;
+        break;
+
+      case 'basic':
+        $urlString = 'civicrm/contact/search/basic';
+        $this->_action = CRM_Core_Action::BASIC;
+        break;
+
+      case 'custom':
+        $urlString = 'civicrm/contact/search/custom';
+        $this->_action = CRM_Core_Action::COPY;
+        break;
+    }
+    CRM_Contact_Form_Task::preProcessCommon($this);
+
+    $this->_contactId = NULL;
+
+    //set ajax path, this used for custom data building
+    $this->assign('urlPath', $urlString);
+    $this->assign('urlPathVar', "_qf_Participant_display=true&qfKey={$this->controller->_key}");
+  }
+
+}
diff --git a/civicrm/CRM/Event/Form/Task/SearchTaskHookSample.php b/civicrm/CRM/Event/Form/Task/SearchTaskHookSample.php
deleted file mode 100644
index efc940e57437ebd083af69f2426cad692df59a9e..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Event/Form/Task/SearchTaskHookSample.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
- */
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- */
-
-/**
- * This class provides the functionality to save a search
- * Saved Searches are used for saving frequently used queries
- */
-class CRM_Event_Form_Task_SearchTaskHookSample extends CRM_Event_Form_Task {
-
-  /**
-   * Build all the data structures needed to build the form.
-   *
-   * @return void
-   */
-  public function preProcess() {
-    parent::preProcess();
-    $rows = [];
-    // display name and participation details of participants
-    $participantIDs = implode(',', $this->_participantIds);
-
-    $query = "
-     SELECT p.fee_amount as amount,
-            p.register_date as register_date,
-            p.source as source,
-            ct.display_name as display_name
-       FROM civicrm_participant p
- INNER JOIN civicrm_contact ct ON ( p.contact_id = ct.id )
-      WHERE p.id IN ( $participantIDs )";
-
-    $dao = CRM_Core_DAO::executeQuery($query);
-    while ($dao->fetch()) {
-      $rows[] = [
-        'display_name' => $dao->display_name,
-        'amount' => $dao->amount,
-        'register_date' => CRM_Utils_Date::customFormat($dao->register_date),
-        'source' => $dao->source,
-      ];
-    }
-    $this->assign('rows', $rows);
-  }
-
-  /**
-   * Build the form object.
-   *
-   * @return void
-   */
-  public function buildQuickForm() {
-    $this->addButtons([
-      [
-        'type' => 'done',
-        'name' => ts('Done'),
-        'isDefault' => TRUE,
-      ],
-    ]);
-  }
-
-}
diff --git a/civicrm/CRM/Event/Page/ManageEvent.php b/civicrm/CRM/Event/Page/ManageEvent.php
index 08dc44dfbba45c68d38820beb6b7a10b629fa524..f0d05726c551b996d2ee9e9361c5ab81cfee5d19 100644
--- a/civicrm/CRM/Event/Page/ManageEvent.php
+++ b/civicrm/CRM/Event/Page/ManageEvent.php
@@ -165,7 +165,7 @@ class CRM_Event_Page_ManageEvent extends CRM_Core_Page {
 
       // @fixme I don't understand the event permissions check here - can we just get rid of it?
       $permissions = CRM_Event_BAO_Event::getAllPermissions();
-      if (CRM_Core_Permission::check('administer CiviCRM') || !empty($permissions[CRM_Core_Permission::EDIT])) {
+      if (CRM_Core_Permission::check('administer CiviCRM data') || !empty($permissions[CRM_Core_Permission::EDIT])) {
         self::$_tabLinks[$cacheKey]['reminder']
           = [
             'title' => ts('Schedule Reminders'),
diff --git a/civicrm/CRM/Event/Page/Tab.php b/civicrm/CRM/Event/Page/Tab.php
index ab29c9ce35770ccf84dc786eea3c438ca0418a91..0ecd0f80631e3aa2b161a8ea791b0d1f15053392 100644
--- a/civicrm/CRM/Event/Page/Tab.php
+++ b/civicrm/CRM/Event/Page/Tab.php
@@ -287,7 +287,7 @@ class CRM_Event_Page_Tab extends CRM_Core_Page {
       );
       $controller->setEmbedded(TRUE);
       $controller->set('force', 1);
-      $controller->set('cid', $this->_contactId);
+      $controller->set('skip_cid', TRUE);
       $controller->set('participantId', $this->_id);
       $controller->set('context', 'contribution');
       $controller->process();
diff --git a/civicrm/CRM/Export/BAO/ExportProcessor.php b/civicrm/CRM/Export/BAO/ExportProcessor.php
index c1231fecb7147a47accc22f85cccd0d8f639d481..4e9581d1cf6716cf18ea9d329e943962a68fc0e8 100644
--- a/civicrm/CRM/Export/BAO/ExportProcessor.php
+++ b/civicrm/CRM/Export/BAO/ExportProcessor.php
@@ -639,6 +639,9 @@ class CRM_Export_BAO_ExportProcessor {
     $queryFields['world_region']['context'] = 'country';
     $queryFields['state_province']['context'] = 'province';
     $queryFields['contact_id'] = ['title' => ts('Contact ID'), 'type' => CRM_Utils_Type::T_INT];
+    $queryFields['tags']['type'] = CRM_Utils_Type::T_LONGTEXT;
+    $queryFields['groups']['type'] = CRM_Utils_Type::T_LONGTEXT;
+    $queryFields['notes']['type'] = CRM_Utils_Type::T_LONGTEXT;
     // Set the label to gender for gender_id as we it's ... magic (not in a good way).
     // In other places the query object offers e.g contribution_status & contribution_status_id
     $queryFields['gender_id']['title'] = ts('Gender');
@@ -803,7 +806,7 @@ class CRM_Export_BAO_ExportProcessor {
 
     // CRM-13982 - check if is deleted
     foreach ($params as $value) {
-      if ($value[0] == 'contact_is_deleted') {
+      if ($value[0] === 'contact_is_deleted') {
         unset($whereClauses['trash_clause']);
       }
     }
@@ -825,10 +828,10 @@ class CRM_Export_BAO_ExportProcessor {
     }
 
     if (empty($where)) {
-      $where = "WHERE " . implode(' AND ', $whereClauses);
+      $where = 'WHERE ' . implode(' AND ', $whereClauses);
     }
     else {
-      $where .= " AND " . implode(' AND ', $whereClauses);
+      $where .= ' AND ' . implode(' AND ', $whereClauses);
     }
 
     $groupBy = $this->getGroupBy($query);
@@ -1431,21 +1434,20 @@ class CRM_Export_BAO_ExportProcessor {
   public function getSqlColumnDefinition($fieldName, $columnName) {
 
     // early exit for master_id, CRM-12100
-    // in the DB it is an ID, but in the export, we retrive the display_name of the master record
-    // also for current_employer, CRM-16939
-    if ($columnName == 'master_id' || $columnName == 'current_employer') {
+    // in the DB it is an ID, but in the export, we retrieve the display_name of the master record
+    if ($columnName === 'master_id') {
       return "`$fieldName` varchar(128)";
     }
 
     $queryFields = $this->getQueryFields();
-    // @todo remove the enotice avoidance here, ensure all columns are declared.
+    // @todo remove the e-notice avoidance here, ensure all columns are declared.
     // tests will fail on the enotices until they all are & then all the 'else'
     // below can go.
     $fieldSpec = $queryFields[$columnName] ?? [];
-
+    $type = $fieldSpec['type'] ?? ($fieldSpec['data_type'] ?? '');
     // set the sql columns
-    if (isset($fieldSpec['type'])) {
-      switch ($fieldSpec['type']) {
+    if ($type) {
+      switch ($type) {
         case CRM_Utils_Type::T_INT:
         case CRM_Utils_Type::T_BOOLEAN:
           if (in_array(CRM_Utils_Array::value('data_type', $fieldSpec), ['Country', 'StateProvince', 'ContactReference'])) {
@@ -1454,11 +1456,22 @@ class CRM_Export_BAO_ExportProcessor {
           return "`$fieldName` varchar(16)";
 
         case CRM_Utils_Type::T_STRING:
-          if (isset($queryFields[$columnName]['maxlength'])) {
-            return "`$fieldName` varchar({$queryFields[$columnName]['maxlength']})";
+          if (isset($fieldSpec['maxlength'])) {
+            return "`$fieldName` varchar({$fieldSpec['maxlength']})";
           }
-          else {
-            return "`$fieldName` varchar(255)";
+          $dataType = $fieldSpec['data_type'] ?? '';
+          // set the sql columns for custom data
+          switch ($dataType) {
+            case 'String':
+              // May be option labels, which could be up to 512 characters
+              $length = max(512, CRM_Utils_Array::value('text_length', $fieldSpec));
+              return "`$fieldName` varchar($length)";
+
+            case 'Memo':
+              return "`$fieldName` text";
+
+            default:
+              return "`$fieldName` varchar(255)";
           }
 
         case CRM_Utils_Type::T_TEXT:
@@ -1481,47 +1494,10 @@ class CRM_Export_BAO_ExportProcessor {
       }
     }
     else {
-      if (substr($fieldName, -3, 3) == '_id') {
+      if (substr($fieldName, -3, 3) === '_id') {
         return "`$fieldName` varchar(255)";
       }
-      elseif (substr($fieldName, -5, 5) == '_note') {
-        return "`$fieldName` text";
-      }
-      else {
-        $changeFields = [
-          'groups',
-          'tags',
-          'notes',
-        ];
-
-        if (in_array($fieldName, $changeFields)) {
-          return "`$fieldName` text";
-        }
-        else {
-          // set the sql columns for custom data
-          if (isset($queryFields[$columnName]['data_type'])) {
-
-            switch ($queryFields[$columnName]['data_type']) {
-              case 'String':
-                // May be option labels, which could be up to 512 characters
-                $length = max(512, CRM_Utils_Array::value('text_length', $queryFields[$columnName]));
-                return "`$fieldName` varchar($length)";
-
-              case 'Link':
-                return "`$fieldName` varchar(255)";
-
-              case 'Memo':
-                return "`$fieldName` text";
-
-              default:
-                return "`$fieldName` varchar(255)";
-            }
-          }
-          else {
-            return "`$fieldName` text";
-          }
-        }
-      }
+      return "`$fieldName` text";
     }
   }
 
diff --git a/civicrm/CRM/Export/Controller/Standalone.php b/civicrm/CRM/Export/Controller/Standalone.php
index f4bb8ca534f640fb2ed049b1ad5c8d9b751287f4..2d3074eebdca7f2b0e0838074b3f94fac7024548 100644
--- a/civicrm/CRM/Export/Controller/Standalone.php
+++ b/civicrm/CRM/Export/Controller/Standalone.php
@@ -50,7 +50,7 @@ class CRM_Export_Controller_Standalone extends CRM_Core_Controller {
     // add all the actions
     $this->addActions();
     $dao = CRM_Core_DAO_AllCoreTables::getFullName($entity);
-    CRM_Utils_System::setTitle(ts('Export %1', [1 => $dao::getEntityTitle()]));
+    CRM_Utils_System::setTitle(ts('Export %1', [1 => $dao::getEntityTitle(TRUE)]));
   }
 
   /**
@@ -72,7 +72,7 @@ class CRM_Export_Controller_Standalone extends CRM_Core_Controller {
     $className = 'CRM_' . $this->getComponent($this->get('entity')) . '_Task';
     foreach ($className::tasks() as $taskId => $task) {
       $taskForm = (array) $task['class'];
-      if ($taskForm[0] == 'CRM_Export_Form_Select') {
+      if (strpos($taskForm[0], 'CRM_Export_Form_Select') === 0) {
         $values['task'] = $taskId;
       }
     }
diff --git a/civicrm/CRM/Export/Form/Map.php b/civicrm/CRM/Export/Form/Map.php
index a4f64d533f4d9acb364e53c5d80cae189edf6f0b..9e4e5fbaf1f5fc7233356e3e103e6818b3308c9c 100644
--- a/civicrm/CRM/Export/Form/Map.php
+++ b/civicrm/CRM/Export/Form/Map.php
@@ -27,6 +27,15 @@ class CRM_Export_Form_Map extends CRM_Core_Form {
    */
   protected $_mappingId;
 
+  /**
+   * Use the form name to create the tpl file name.
+   *
+   * @return string
+   */
+  public function getTemplateFileName() {
+    return 'CRM/Export/Form/Map.tpl';
+  }
+
   /**
    * Build the form object.
    */
diff --git a/civicrm/CRM/Export/Form/Select.php b/civicrm/CRM/Export/Form/Select.php
index 3570008e59782944381a96dcbe03ddc4d9c29db0..4772536ab763daa72364af9274741b74638960f5 100644
--- a/civicrm/CRM/Export/Form/Select.php
+++ b/civicrm/CRM/Export/Form/Select.php
@@ -52,6 +52,15 @@ class CRM_Export_Form_Select extends CRM_Core_Form_Task {
 
   public $_componentTable;
 
+  /**
+   * Use the form name to create the tpl file name.
+   *
+   * @return string
+   */
+  public function getTemplateFileName() {
+    return 'CRM/Export/Form/Select.tpl';
+  }
+
   /**
    * Build all the data structures needed to build the form.
    *
@@ -76,87 +85,31 @@ class CRM_Export_Form_Select extends CRM_Core_Form_Task {
     $this->_componentIds = [];
     $this->_componentClause = NULL;
 
-    // we need to determine component export
-    $components = CRM_Export_BAO_Export::getComponents();
-
     // FIXME: This should use a modified version of CRM_Contact_Form_Search::getModeValue but it doesn't have all the contexts
     // FIXME: Or better still, use CRM_Core_DAO_AllCoreTables::getBriefName($daoName) to get the $entityShortName
-    switch ($this->getQueryMode()) {
-      case CRM_Contact_BAO_Query::MODE_CONTRIBUTE:
-        $entityShortname = 'Contribute';
-        $entityDAOName = $entityShortname;
-        break;
-
-      case CRM_Contact_BAO_Query::MODE_MEMBER:
-        $entityShortname = 'Member';
-        $entityDAOName = 'Membership';
-        break;
-
-      case CRM_Contact_BAO_Query::MODE_EVENT:
-        $entityShortname = 'Event';
-        $entityDAOName = $entityShortname;
-        break;
-
-      case CRM_Contact_BAO_Query::MODE_PLEDGE:
-        $entityShortname = 'Pledge';
-        $entityDAOName = $entityShortname;
-        break;
-
-      case CRM_Contact_BAO_Query::MODE_CASE:
-        $entityShortname = 'Case';
-        $entityDAOName = $entityShortname;
-        break;
+    $entityShortname = $this->getEntityShortName();
 
-      case CRM_Contact_BAO_Query::MODE_GRANT:
-        $entityShortname = 'Grant';
-        $entityDAOName = $entityShortname;
-        break;
-
-      case CRM_Contact_BAO_Query::MODE_ACTIVITY:
-        $entityShortname = 'Activity';
-        $entityDAOName = $entityShortname;
-        break;
-
-      default:
-        $entityShortname = $this->getComponentName();
-        $entityDAOName = $this->controller->get('entity') ?? $entityShortname;
+    if (!in_array($entityShortname, ['Contact', 'Contribute', 'Member', 'Event', 'Pledge', 'Case', 'Grant', 'Activity'], TRUE)) {
+      // This is never reached - the exception here is just to clarify that entityShortName MUST be one of the above
+      // to save future refactorers & reviewers from asking that question.
+      throw new CRM_Core_Exception('Unreachable code');
     }
-
-    if (in_array($entityShortname, $components)) {
-      $this->_exportMode = constant('CRM_Export_Form_Select::' . strtoupper($entityShortname) . '_EXPORT');
-      $formTaskClassName = "CRM_{$entityShortname}_Form_Task";
-      $taskClassName = "CRM_{$entityShortname}_Task";
-      if (isset($formTaskClassName::$entityShortname)) {
-        $this::$entityShortname = $formTaskClassName::$entityShortname;
-        if (isset($formTaskClassName::$tableName)) {
-          $this::$tableName = $formTaskClassName::$tableName;
-        }
-      }
-      else {
-        $this::$entityShortname = $entityShortname;
-        $this::$tableName = CRM_Core_DAO_AllCoreTables::getTableForClass(CRM_Core_DAO_AllCoreTables::getFullName($entityDAOName));
+    $this->_exportMode = constant('CRM_Export_Form_Select::' . strtoupper($entityShortname) . '_EXPORT');
+    $formTaskClassName = "CRM_{$entityShortname}_Form_Task";
+    $taskClassName = "CRM_{$entityShortname}_Task";
+    if (isset($formTaskClassName::$entityShortname)) {
+      $this::$entityShortname = $formTaskClassName::$entityShortname;
+      if (isset($formTaskClassName::$tableName)) {
+        $this::$tableName = $formTaskClassName::$tableName;
       }
     }
-
-    // get the submitted values based on search
-    if ($this->_action == CRM_Core_Action::ADVANCED) {
-      $values = $this->controller->exportValues('Advanced');
-    }
-    elseif ($this->_action == CRM_Core_Action::PROFILE) {
-      $values = $this->controller->exportValues('Builder');
-    }
-    elseif ($this->_action == CRM_Core_Action::COPY) {
-      $values = $this->controller->exportValues('Custom');
-    }
     else {
-      if (in_array($entityShortname, $components) && $entityShortname !== 'Contact') {
-        $values = $this->controller->exportValues('Search');
-      }
-      else {
-        $values = $this->controller->exportValues('Basic');
-      }
+      $this::$entityShortname = $entityShortname;
+      $this::$tableName = CRM_Core_DAO_AllCoreTables::getTableForClass(CRM_Core_DAO_AllCoreTables::getFullName($this->getDAOName()));
     }
 
+    $values = $this->getSearchFormValues();
+
     $count = 0;
     $this->_matchingContacts = FALSE;
     if (CRM_Utils_Array::value('radio_ts', $values) == 'ts_sel') {
@@ -504,4 +457,70 @@ FROM   {$this->_componentTable}
     return $componentName[1];
   }
 
+  /**
+   * Get the DAO name for the given export.
+   *
+   * @return string
+   */
+  protected function getDAOName(): string {
+    switch ($this->getQueryMode()) {
+      case CRM_Contact_BAO_Query::MODE_CONTRIBUTE:
+        return 'Contribute';
+
+      case CRM_Contact_BAO_Query::MODE_MEMBER:
+        return 'Membership';
+
+      case CRM_Contact_BAO_Query::MODE_EVENT:
+        return 'Event';
+
+      case CRM_Contact_BAO_Query::MODE_PLEDGE:
+        return 'Pledge';
+
+      case CRM_Contact_BAO_Query::MODE_CASE:
+        return 'Case';
+
+      case CRM_Contact_BAO_Query::MODE_GRANT:
+        return 'Grant';
+
+      case CRM_Contact_BAO_Query::MODE_ACTIVITY:
+        return 'Activity';
+
+      default:
+        return $this->controller->get('entity') ?? $this->getComponentName();
+    }
+  }
+
+  /**
+   * Get the entity short name for a given export.
+   *
+   * @return string
+   */
+  protected function getEntityShortName(): string {
+    switch ($this->getQueryMode()) {
+      case CRM_Contact_BAO_Query::MODE_CONTRIBUTE:
+        return 'Contribute';
+
+      case CRM_Contact_BAO_Query::MODE_MEMBER:
+        return 'Member';
+
+      case CRM_Contact_BAO_Query::MODE_EVENT:
+        return 'Event';
+
+      case CRM_Contact_BAO_Query::MODE_PLEDGE:
+        return 'Pledge';
+
+      case CRM_Contact_BAO_Query::MODE_CASE:
+        return 'Case';
+
+      case CRM_Contact_BAO_Query::MODE_GRANT:
+        return 'Grant';
+
+      case CRM_Contact_BAO_Query::MODE_ACTIVITY:
+        return 'Activity';
+
+      default:
+        return $this->getComponentName();
+    }
+  }
+
 }
diff --git a/civicrm/CRM/Export/Form/Select/Case.php b/civicrm/CRM/Export/Form/Select/Case.php
index 3fd18998c6cadc5f3637f6a73b9eb1a61138896f..c310aa9a489eff40f18baac5f0361ef5792bdd1f 100644
--- a/civicrm/CRM/Export/Form/Select/Case.php
+++ b/civicrm/CRM/Export/Form/Select/Case.php
@@ -25,13 +25,4 @@ class CRM_Export_Form_Select_Case extends CRM_Export_Form_Select {
    */
   protected $queryMode = CRM_Contact_BAO_Query::MODE_CASE;
 
-  /**
-   * Use the form name to create the tpl file name.
-   *
-   * @return string
-   */
-  public function getTemplateFileName() {
-    return 'CRM/Export/Form/Select.tpl';
-  }
-
 }
diff --git a/civicrm/CRM/Financial/BAO/FinancialItem.php b/civicrm/CRM/Financial/BAO/FinancialItem.php
index fb5dca3d165535d4c2da780dbf23f0dc8b049a3d..d63db1dbb8cf55aca22b66e15efec7f1098a5faa 100644
--- a/civicrm/CRM/Financial/BAO/FinancialItem.php
+++ b/civicrm/CRM/Financial/BAO/FinancialItem.php
@@ -74,7 +74,7 @@ class CRM_Financial_BAO_FinancialItem extends CRM_Financial_DAO_FinancialItem {
       $itemStatus = array_search('Partially paid', $financialItemStatus);
     }
     $params = [
-      'transaction_date' => CRM_Utils_Date::isoToMysql($contribution->receive_date),
+      'transaction_date' => $contribution->receive_date,
       'contact_id' => $contribution->contact_id,
       'amount' => $lineItem->line_total,
       'currency' => $contribution->currency,
diff --git a/civicrm/CRM/Financial/BAO/FinancialTypeAccount.php b/civicrm/CRM/Financial/BAO/FinancialTypeAccount.php
index f7cb9652cb99e3e8b178719c7cf64d4e0f9a5bcd..248d2b4f6b8f0472757cb8d278658e2e42008834 100644
--- a/civicrm/CRM/Financial/BAO/FinancialTypeAccount.php
+++ b/civicrm/CRM/Financial/BAO/FinancialTypeAccount.php
@@ -52,14 +52,17 @@ class CRM_Financial_BAO_FinancialTypeAccount extends CRM_Financial_DAO_EntityFin
    * @param array $params
    *   Reference array contains the values submitted by the form.
    * @param array $ids
-   *   Reference array contains the id.
+   *   Reference array contains one possible value
+   *   - entityFinancialAccount.
    *
-   * @return object
+   * @return CRM_Financial_DAO_EntityFinancialAccount
+   *
+   * @throws \CRM_Core_Exception
    */
-  public static function add(&$params, &$ids = NULL) {
+  public static function add(&$params, $ids = NULL) {
     // action is taken depending upon the mode
     $financialTypeAccount = new CRM_Financial_DAO_EntityFinancialAccount();
-    if ($params['entity_table'] != 'civicrm_financial_type') {
+    if ($params['entity_table'] !== 'civicrm_financial_type') {
       $financialTypeAccount->entity_id = $params['entity_id'];
       $financialTypeAccount->entity_table = $params['entity_table'];
       $financialTypeAccount->find(TRUE);
@@ -71,6 +74,7 @@ class CRM_Financial_BAO_FinancialTypeAccount extends CRM_Financial_DAO_EntityFin
     $financialTypeAccount->copyValues($params);
     self::validateRelationship($financialTypeAccount);
     $financialTypeAccount->save();
+    unset(Civi::$statics['CRM_Core_PseudoConstant']['taxRates']);
     return $financialTypeAccount;
   }
 
@@ -80,6 +84,7 @@ class CRM_Financial_BAO_FinancialTypeAccount extends CRM_Financial_DAO_EntityFin
    * @param int $financialTypeAccountId
    * @param int $accountId
    *
+   * @throws \CRM_Core_Exception
    */
   public static function del($financialTypeAccountId, $accountId = NULL) {
     // check if financial type is present
@@ -102,6 +107,7 @@ class CRM_Financial_BAO_FinancialTypeAccount extends CRM_Financial_DAO_EntityFin
 
     foreach ($dependency as $name) {
       $daoString = 'CRM_' . $name[0] . '_DAO_' . $name[1];
+      /* @var \CRM_Core_DAO $dao */
       $dao = new $daoString();
       $dao->financial_type_id = $financialTypeId;
       if ($dao->find(TRUE)) {
@@ -111,7 +117,7 @@ class CRM_Financial_BAO_FinancialTypeAccount extends CRM_Financial_DAO_EntityFin
     }
 
     if ($check) {
-      if ($name[1] == 'PremiumsProduct' || $name[1] == 'Product') {
+      if ($name[1] === 'PremiumsProduct' || $name[1] === 'Product') {
         CRM_Core_Session::setStatus(ts('You cannot remove an account with a %1 relationship while the Financial Type is used for a Premium.', [1 => $relationValues[$financialTypeAccountId]]));
       }
       else {
@@ -136,6 +142,7 @@ class CRM_Financial_BAO_FinancialTypeAccount extends CRM_Financial_DAO_EntityFin
    *   Payment instrument value.
    *
    * @return null|int
+   * @throws \CiviCRM_API3_Exception
    */
   public static function getInstrumentFinancialAccount($paymentInstrumentValue) {
     if (!isset(\Civi::$statics[__CLASS__]['instrument_financial_accounts'][$paymentInstrumentValue])) {
@@ -249,7 +256,7 @@ class CRM_Financial_BAO_FinancialTypeAccount extends CRM_Financial_DAO_EntityFin
   /**
    * Validate account relationship with financial account type
    *
-   * @param obj $financialTypeAccount of CRM_Financial_DAO_EntityFinancialAccount
+   * @param CRM_Financial_DAO_EntityFinancialAccount $financialTypeAccount of CRM_Financial_DAO_EntityFinancialAccount
    *
    * @throws CRM_Core_Exception
    */
diff --git a/civicrm/CRM/Financial/BAO/Order.php b/civicrm/CRM/Financial/BAO/Order.php
index 43fa9cd2d72a7c81950994a9eee0865686cf614e..ffe8af8ff9737937e1ebfa2a6a836cb53a683db6 100644
--- a/civicrm/CRM/Financial/BAO/Order.php
+++ b/civicrm/CRM/Financial/BAO/Order.php
@@ -9,6 +9,8 @@
  +--------------------------------------------------------------------+
  */
 
+use Civi\Api4\PriceField;
+
 /**
  *
  * @package CRM
@@ -231,9 +233,15 @@ class CRM_Financial_BAO_Order {
     }
 
     foreach ($this->getPriceOptions() as $fieldID => $valueID) {
+      if (!isset($this->priceSetID)) {
+        $this->setPriceSetID(PriceField::get()->addSelect('price_set_id')->addWhere('id', '=', $fieldID)->execute()->first()['price_set_id']);
+      }
       $throwAwayArray = [];
       // @todo - still using getLine for now but better to bring it to this class & do a better job.
-      $lineItems[$valueID] = CRM_Price_BAO_PriceSet::getLine($params, $throwAwayArray, $this->getPriceSetID(), $this->getPriceFieldSpec($fieldID), $fieldID, 0)[1][$valueID];
+      $newLines = CRM_Price_BAO_PriceSet::getLine($params, $throwAwayArray, $this->getPriceSetID(), $this->getPriceFieldSpec($fieldID), $fieldID)[1];
+      foreach ($newLines as $newLine) {
+        $lineItems[$newLine['price_field_value_id']] = $newLine;
+      }
     }
 
     foreach ($lineItems as &$lineItem) {
@@ -261,7 +269,7 @@ class CRM_Financial_BAO_Order {
   }
 
   /**
-   * Get the total tax amount for the order.
+   * Get the total amount for the order.
    *
    * @return float
    *
@@ -275,6 +283,21 @@ class CRM_Financial_BAO_Order {
     return $amount;
   }
 
+  /**
+   * Get the total tax amount for the order.
+   *
+   * @return float
+   *
+   * @throws \CiviCRM_API3_Exception
+   */
+  public function getTotalAmount() :float {
+    $amount = 0.0;
+    foreach ($this->getLineItems() as $lineItem) {
+      $amount += $lineItem['line_total'] ?? 0.0;
+    }
+    return $amount;
+  }
+
   /**
    * Get the tax rate for the given financial type.
    *
diff --git a/civicrm/CRM/Financial/DAO/Currency.php b/civicrm/CRM/Financial/DAO/Currency.php
index f96650badc5908feafc6cc18b53711ebe3e8343e..868495d6d7821821a1d1360d84642d02a1a814a0 100644
--- a/civicrm/CRM/Financial/DAO/Currency.php
+++ b/civicrm/CRM/Financial/DAO/Currency.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/Currency.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:5501c59b453dedfb8bba1f2fab44d9ea)
+ * (GenCodeChecksum:0347ed61e0dc585d250a83f9fa162f2d)
  */
 
 /**
@@ -75,9 +75,12 @@ class CRM_Financial_DAO_Currency extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Currencies');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Currencies') : ts('Currency');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/DAO/EntityFinancialAccount.php b/civicrm/CRM/Financial/DAO/EntityFinancialAccount.php
index 973a99ca8330f6d3c97f13ad686f74cc1b50f66a..6474da9830646d7b2cb325adbae02b6a627434ca 100644
--- a/civicrm/CRM/Financial/DAO/EntityFinancialAccount.php
+++ b/civicrm/CRM/Financial/DAO/EntityFinancialAccount.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/EntityFinancialAccount.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c1d51696dd326b61f65fd064a355e7fb)
+ * (GenCodeChecksum:04ae90cfa08b3e1380f48c64e0bcc1ce)
  */
 
 /**
@@ -75,9 +75,12 @@ class CRM_Financial_DAO_EntityFinancialAccount extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Entity Financial Accounts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Entity Financial Accounts') : ts('Entity Financial Account');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/DAO/EntityFinancialTrxn.php b/civicrm/CRM/Financial/DAO/EntityFinancialTrxn.php
index 1f959ad6117bbc7d8bbd062f4322bba7bf48fd1e..4935cf9f2c3154e48ea17047149a78280a392b5f 100644
--- a/civicrm/CRM/Financial/DAO/EntityFinancialTrxn.php
+++ b/civicrm/CRM/Financial/DAO/EntityFinancialTrxn.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/EntityFinancialTrxn.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:12eb23afdf6c1208bdc01aa7db52770a)
+ * (GenCodeChecksum:bbf884307aab01daa88aa7f3c06c2624)
  */
 
 /**
@@ -71,9 +71,12 @@ class CRM_Financial_DAO_EntityFinancialTrxn extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Entity Financial Trxns');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Entity Financial Trxns') : ts('Entity Financial Trxn');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/DAO/FinancialAccount.php b/civicrm/CRM/Financial/DAO/FinancialAccount.php
index d8f161e9437bae30da0ce056bb6a33b0083f7049..30be03ce47cf1f310c7fa0384f1ec259b624a79d 100644
--- a/civicrm/CRM/Financial/DAO/FinancialAccount.php
+++ b/civicrm/CRM/Financial/DAO/FinancialAccount.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/FinancialAccount.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b9f200ff95d9186180eff484dcd12a57)
+ * (GenCodeChecksum:09d2e3d6a970fa2413b6f29ab1f580e0)
  */
 
 /**
@@ -145,9 +145,12 @@ class CRM_Financial_DAO_FinancialAccount extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Financial Accounts');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Financial Accounts') : ts('Financial Account');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/DAO/FinancialItem.php b/civicrm/CRM/Financial/DAO/FinancialItem.php
index a59dc38e6613ab5215b7e022fb3c045c1c9f9ec1..dd75f2405a5d95142f541d9e37c300814efcd3d0 100644
--- a/civicrm/CRM/Financial/DAO/FinancialItem.php
+++ b/civicrm/CRM/Financial/DAO/FinancialItem.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/FinancialItem.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8bb63ebee681c2eb4acbf8650b224dc2)
+ * (GenCodeChecksum:a70adfdd0e2248a7583c5c49ad0a5b85)
  */
 
 /**
@@ -115,9 +115,12 @@ class CRM_Financial_DAO_FinancialItem extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Financial Items');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Financial Items') : ts('Financial Item');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/DAO/FinancialTrxn.php b/civicrm/CRM/Financial/DAO/FinancialTrxn.php
index 157984607fb373e9c2c0244b3da40703bb73bb0e..e94ee652f48390634f733429fb4058d768c87735 100644
--- a/civicrm/CRM/Financial/DAO/FinancialTrxn.php
+++ b/civicrm/CRM/Financial/DAO/FinancialTrxn.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/FinancialTrxn.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:5a4324ffe222bf724ab9d4cde26eb4c2)
+ * (GenCodeChecksum:857c64b471d1872d98141aefa56aecb6)
  */
 
 /**
@@ -164,9 +164,12 @@ class CRM_Financial_DAO_FinancialTrxn extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Financial Trxns');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Financial Trxns') : ts('Financial Trxn');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/DAO/FinancialType.php b/civicrm/CRM/Financial/DAO/FinancialType.php
index cd99c56281eb7937e52c6d02eb95f591a7c8b343..d9b1ce7f58e422671a0b67c6948fde845ee7c794 100644
--- a/civicrm/CRM/Financial/DAO/FinancialType.php
+++ b/civicrm/CRM/Financial/DAO/FinancialType.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/FinancialType.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:024b000d94adcc65200c00d7cef5e624)
+ * (GenCodeChecksum:36875c58b3267bdc2def295713858868)
  */
 
 /**
@@ -82,9 +82,12 @@ class CRM_Financial_DAO_FinancialType extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Financial Types');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Financial Types') : ts('Financial Type');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/DAO/PaymentProcessor.php b/civicrm/CRM/Financial/DAO/PaymentProcessor.php
index 7f1e8334a9678b7b65ceac85d11ad821684a2f09..f882e0d0b174bb0c742be8894a3d7a97848af129 100644
--- a/civicrm/CRM/Financial/DAO/PaymentProcessor.php
+++ b/civicrm/CRM/Financial/DAO/PaymentProcessor.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/PaymentProcessor.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7e296728147d44cb68a9231c4995e461)
+ * (GenCodeChecksum:8277056355c9f16ae28f69ba3298730e)
  */
 
 /**
@@ -181,9 +181,12 @@ class CRM_Financial_DAO_PaymentProcessor extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Payment Processors');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Payment Processors') : ts('Payment Processor');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/DAO/PaymentProcessorType.php b/civicrm/CRM/Financial/DAO/PaymentProcessorType.php
index 597b8d27f0ff19374d9f8449bfcf63a81561477c..3b014458763329302cd3ea43ac79093396fc4b0d 100644
--- a/civicrm/CRM/Financial/DAO/PaymentProcessorType.php
+++ b/civicrm/CRM/Financial/DAO/PaymentProcessorType.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/PaymentProcessorType.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:624a9a001f451b6eb17930a9abcceb3e)
+ * (GenCodeChecksum:62dd4d3229f289de4afb3c5e3e39db66)
  */
 
 /**
@@ -175,9 +175,12 @@ class CRM_Financial_DAO_PaymentProcessorType extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Payment Processor Types');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Payment Processor Types') : ts('Payment Processor Type');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/DAO/PaymentToken.php b/civicrm/CRM/Financial/DAO/PaymentToken.php
index cb2498f0832ce707ce30376124dd732ba81670b0..1608dab55d72e644c1bd9e6f208cf73f42ccd427 100644
--- a/civicrm/CRM/Financial/DAO/PaymentToken.php
+++ b/civicrm/CRM/Financial/DAO/PaymentToken.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Financial/PaymentToken.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ce51f1e6eaf6b29f3adeb67828e85507)
+ * (GenCodeChecksum:2923b7966bbe25d435eb7b909d35541f)
  */
 
 /**
@@ -129,9 +129,12 @@ class CRM_Financial_DAO_PaymentToken extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Payment Tokens');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Payment Tokens') : ts('Payment Token');
   }
 
   /**
diff --git a/civicrm/CRM/Financial/Form/BatchTransaction.php b/civicrm/CRM/Financial/Form/BatchTransaction.php
index 408a84e729118d37b93e14580c91f1a9c0600dc7..ef90e96c026ad5536fbabb4a7e96297edda48fd6 100644
--- a/civicrm/CRM/Financial/Form/BatchTransaction.php
+++ b/civicrm/CRM/Financial/Form/BatchTransaction.php
@@ -75,7 +75,7 @@ class CRM_Financial_Form_BatchTransaction extends CRM_Contribute_Form_Search {
    */
   public function buildQuickForm() {
     if ($this->_batchStatus == 'Closed') {
-      $this->add('submit', 'export_batch', ts('Export Batch'));
+      $this->add('xbutton', 'export_batch', ts('Export Batch'), ['type' => 'submit']);
     }
 
     // do not build rest of form unless it is open/reopened batch
@@ -85,9 +85,9 @@ class CRM_Financial_Form_BatchTransaction extends CRM_Contribute_Form_Search {
 
     parent::buildQuickForm();
     if (CRM_Batch_BAO_Batch::checkBatchPermission('close', $this->_values['created_id'])) {
-      $this->add('submit', 'close_batch', ts('Close Batch'));
+      $this->add('xbutton', 'close_batch', ts('Close Batch'), ['type' => 'submit']);
       if (CRM_Batch_BAO_Batch::checkBatchPermission('export', $this->_values['created_id'])) {
-        $this->add('submit', 'export_batch', ts('Close & Export Batch'));
+        $this->add('xbutton', 'export_batch', ts('Close and Export Batch'), ['type' => 'submit']);
       }
     }
 
@@ -99,8 +99,9 @@ class CRM_Financial_Form_BatchTransaction extends CRM_Contribute_Form_Search {
       ts('Task'),
       ['' => ts('- actions -')] + ['Remove' => ts('Remove from Batch')]);
 
-    $this->add('submit', 'rSubmit', ts('Go'),
+    $this->add('xbutton', 'rSubmit', ts('Go'),
       [
+        'type' => 'submit',
         'class' => 'crm-form-submit',
         'id' => 'GoRemove',
       ]);
@@ -123,8 +124,9 @@ class CRM_Financial_Form_BatchTransaction extends CRM_Contribute_Form_Search {
       ts('Task'),
       ['' => ts('- actions -')] + ['Assign' => ts('Assign to Batch')]);
 
-    $this->add('submit', 'submit', ts('Go'),
+    $this->add('xbutton', 'submit', ts('Go'),
       [
+        'type' => 'submit',
         'class' => 'crm-form-submit',
         'id' => 'Go',
       ]);
diff --git a/civicrm/CRM/Financial/Form/Search.php b/civicrm/CRM/Financial/Form/Search.php
index 985d9ddfbb672383331ddf9247b5c97132193e14..069c6e0a9abdbf9a21f17a6e1ce0554df208d2c5 100644
--- a/civicrm/CRM/Financial/Form/Search.php
+++ b/civicrm/CRM/Financial/Form/Search.php
@@ -93,8 +93,9 @@ class CRM_Financial_Form_Search extends CRM_Core_Form {
       ts('Task'),
       ['' => ts('- actions -')] + $batchAction);
 
-    $this->add('submit', 'submit', ts('Go'),
+    $this->add('xbutton', 'submit', ts('Go'),
       [
+        'type' => 'submit',
         'class' => 'crm-form-submit',
         'id' => 'Go',
       ]);
diff --git a/civicrm/CRM/Friend/DAO/Friend.php b/civicrm/CRM/Friend/DAO/Friend.php
index 1513ab9dccc5c25e267fb8dd5a3fa27a69a31a9c..690419d0b962aa089b3a48ffc81b3a33183562ea 100644
--- a/civicrm/CRM/Friend/DAO/Friend.php
+++ b/civicrm/CRM/Friend/DAO/Friend.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Friend/Friend.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:3f1c976d43e312175e85da0427f5210d)
+ * (GenCodeChecksum:1452e2f2b01782f26a30e94bd6af3783)
  */
 
 /**
@@ -106,9 +106,12 @@ class CRM_Friend_DAO_Friend extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Friends');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Friends') : ts('Friend');
   }
 
   /**
diff --git a/civicrm/CRM/Grant/BAO/Grant.php b/civicrm/CRM/Grant/BAO/Grant.php
index d38aeb5c41b418a384ce37a5452e899516c12e05..e203d546f5585b0b371fe3a7441603de8d5eb630 100644
--- a/civicrm/CRM/Grant/BAO/Grant.php
+++ b/civicrm/CRM/Grant/BAO/Grant.php
@@ -25,8 +25,13 @@ class CRM_Grant_BAO_Grant extends CRM_Grant_DAO_Grant {
    */
   public static function getGrantSummary($admin = FALSE) {
     $query = "
-            SELECT status_id, count(id) as status_total
-            FROM civicrm_grant  GROUP BY status_id";
+      SELECT status_id, count(g.id) as status_total
+      FROM civicrm_grant g
+      JOIN civicrm_contact c
+        ON g.contact_id = c.id
+      WHERE c.is_deleted = 0
+      GROUP BY status_id
+    ";
 
     $dao = CRM_Core_DAO::executeQuery($query);
 
diff --git a/civicrm/CRM/Grant/BAO/Query.php b/civicrm/CRM/Grant/BAO/Query.php
index f34f8946121267aa64be6612e9806c3fdd04ac4b..2e814b2a775541a92b08ffdfb6f88d506cc8511f 100644
--- a/civicrm/CRM/Grant/BAO/Query.php
+++ b/civicrm/CRM/Grant/BAO/Query.php
@@ -15,12 +15,12 @@
 class CRM_Grant_BAO_Query extends CRM_Core_BAO_Query {
 
   /**
+   * Get grant fields.
+   *
    * @return array
    */
   public static function &getFields() {
-    $fields = [];
-    $fields = CRM_Grant_BAO_Grant::exportableFields();
-    return $fields;
+    return CRM_Grant_BAO_Grant::exportableFields();
   }
 
   /**
diff --git a/civicrm/CRM/Grant/Controller/Search.php b/civicrm/CRM/Grant/Controller/Search.php
index 166cb93e9fef96619e9babdb80c07d0eeef204f6..e68d6e91f87fa0cd4e0d5026324646403de460d3 100644
--- a/civicrm/CRM/Grant/Controller/Search.php
+++ b/civicrm/CRM/Grant/Controller/Search.php
@@ -28,6 +28,8 @@
  */
 class CRM_Grant_Controller_Search extends CRM_Core_Controller {
 
+  protected $entity = 'Grant';
+
   /**
    * Class constructor.
    *
@@ -45,8 +47,8 @@ class CRM_Grant_Controller_Search extends CRM_Core_Controller {
     $this->addPages($this->_stateMachine, $action);
 
     // add all the actions
-    $config = CRM_Core_Config::singleton();
     $this->addActions();
+    $this->set('entity', $this->entity);
   }
 
 }
diff --git a/civicrm/CRM/Grant/DAO/Grant.php b/civicrm/CRM/Grant/DAO/Grant.php
index 91b816359a758202611ac223750db3454c3777c7..05d6701011e6506707332bf75a0bb8fc7cfa60eb 100644
--- a/civicrm/CRM/Grant/DAO/Grant.php
+++ b/civicrm/CRM/Grant/DAO/Grant.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Grant/Grant.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a2e43b7f0fb8547daf5ed874bf6174c5)
+ * (GenCodeChecksum:91aecd5b45ba8c5cd6636bb95ddbbfee)
  */
 
 /**
@@ -152,9 +152,12 @@ class CRM_Grant_DAO_Grant extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Grants');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Grants') : ts('Grant');
   }
 
   /**
diff --git a/civicrm/CRM/Grant/Form/Task.php b/civicrm/CRM/Grant/Form/Task.php
index b983cec3d72afac8c84b7804bc115370af162b88..893077cfb76462b69fec4d1f6f3b37cc6767b345 100644
--- a/civicrm/CRM/Grant/Form/Task.php
+++ b/civicrm/CRM/Grant/Form/Task.php
@@ -34,19 +34,20 @@ class CRM_Grant_Form_Task extends CRM_Core_Form_Task {
   }
 
   /**
-   * @param CRM_Core_Form $form
+   * @param \CRM_Core_Form_Task $form
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function preProcessCommon(&$form) {
     $form->_grantIds = [];
 
-    $values = $form->controller->exportValues($form->get('searchFormName'));
+    $values = $form->getSearchFormValues();
 
     $form->_task = $values['task'];
     $tasks = CRM_Grant_Task::tasks();
     if (!array_key_exists($form->_task, $tasks)) {
       CRM_Core_Error::statusBounce(ts('You do not have permission to access this page.'));
     }
-    $form->assign('taskName', $tasks[$form->_task]);
 
     $ids = [];
     if ($values['radio_ts'] == 'ts_sel') {
diff --git a/civicrm/CRM/Grant/Form/Task/SearchTaskHookSample.php b/civicrm/CRM/Grant/Form/Task/SearchTaskHookSample.php
deleted file mode 100644
index 01ce981f45311fc0be590e8f1b059b1c564d7231..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Grant/Form/Task/SearchTaskHookSample.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
- */
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- */
-
-/**
- * This class provides the functionality to save a search
- * Saved Searches are used for saving frequently used queries
- */
-class CRM_Grant_Form_Task_SearchTaskHookSample extends CRM_Grant_Form_Task {
-
-  /**
-   * Build all the data structures needed to build the form.
-   *
-   * @return void
-   */
-  public function preProcess() {
-    parent::preProcess();
-    $rows = [];
-    // display name and grant details of all selectced contacts
-    $grantIDs = implode(',', $this->_grantIds);
-
-    $query = "
-    SELECT grt.decision_date  as decision_date,
-           grt.amount_total   as amount_total,
-           grt.amount_granted as amount_granted,
-           ct.display_name    as display_name
-      FROM civicrm_grant grt
-INNER JOIN civicrm_contact ct ON ( grt.contact_id = ct.id )
-     WHERE grt.id IN ( $grantIDs )";
-
-    $dao = CRM_Core_DAO::executeQuery($query);
-
-    while ($dao->fetch()) {
-      $rows[] = [
-        'display_name' => $dao->display_name,
-        'decision_date' => $dao->decision_date,
-        'amount_requested' => $dao->amount_total,
-        'amount_granted' => $dao->amount_granted,
-      ];
-    }
-    $this->assign('rows', $rows);
-  }
-
-  /**
-   * Build the form object.
-   *
-   * @return void
-   */
-  public function buildQuickForm() {
-    $this->addButtons([
-      [
-        'type' => 'done',
-        'name' => ts('Done'),
-        'isDefault' => TRUE,
-      ],
-    ]);
-  }
-
-}
diff --git a/civicrm/CRM/Grant/Page/DashBoard.php b/civicrm/CRM/Grant/Page/DashBoard.php
index 3389c4abb90365de814a1c22c2b57b8478f0c3b2..df53739b3c0c65e51ab6ff9b39ebdd41fa86d26c 100644
--- a/civicrm/CRM/Grant/Page/DashBoard.php
+++ b/civicrm/CRM/Grant/Page/DashBoard.php
@@ -27,7 +27,7 @@ class CRM_Grant_Page_DashBoard extends CRM_Core_Page {
    * @return void
    */
   public function preProcess() {
-    $admin = CRM_Core_Permission::check('administer CiviCRM');
+    $admin = CRM_Core_Permission::check('administer CiviCRM data');
 
     $grantSummary = CRM_Grant_BAO_Grant::getGrantSummary($admin);
 
diff --git a/civicrm/CRM/Group/Form/Edit.php b/civicrm/CRM/Group/Form/Edit.php
index e384dc36cc7fe3dd3313e43f3d4e6f426845c5ff..2fb7d2199d88eb6c672f455aa4cb49336b6b946d 100644
--- a/civicrm/CRM/Group/Form/Edit.php
+++ b/civicrm/CRM/Group/Form/Edit.php
@@ -137,14 +137,7 @@ class CRM_Group_Form_Edit extends CRM_Core_Form {
           'saved_search_id' => $this->_groupValues['saved_search_id'] ?? '',
         );
         if (isset($this->_groupValues['saved_search_id'])) {
-          $groupValues['mapping_id'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_SavedSearch',
-            $this->_groupValues['saved_search_id'],
-            'mapping_id'
-          );
-          $groupValues['search_custom_id'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_SavedSearch',
-            $this->_groupValues['saved_search_id'],
-            'search_custom_id'
-          );
+          $this->assign('editSmartGroupURL', CRM_Contact_BAO_SavedSearch::getEditSearchUrl($this->_groupValues['saved_search_id']));
         }
         if (!empty($this->_groupValues['created_id'])) {
           $groupValues['created_by'] = CRM_Core_DAO::getFieldValue("CRM_Contact_DAO_Contact", $this->_groupValues['created_id'], 'sort_name', 'id');
diff --git a/civicrm/CRM/Group/Form/Search.php b/civicrm/CRM/Group/Form/Search.php
index 819b061f21d61e1694ab53e4624a00804c6fd5b5..a56623fefc016011195a13864e0c2a7a53e21a91 100644
--- a/civicrm/CRM/Group/Form/Search.php
+++ b/civicrm/CRM/Group/Form/Search.php
@@ -40,6 +40,14 @@ class CRM_Group_Form_Search extends CRM_Core_Form {
       CRM_Core_DAO::getAttribute('CRM_Contact_DAO_Group', 'title')
     );
 
+    $optionTypes = [
+      '1' => ts('Smart Group'),
+      '2' => ts('Normal Group'),
+    ];
+    $this->add('select', 'saved_search', ts('Group Type'),
+      ['' => ts('- any -')] + $optionTypes
+    );
+
     $groupTypes = CRM_Core_OptionGroup::values('group_type', TRUE);
     $config = CRM_Core_Config::singleton();
     if ($config->userFramework == 'Joomla') {
diff --git a/civicrm/CRM/Group/Page/AJAX.php b/civicrm/CRM/Group/Page/AJAX.php
index b314d5cb6168562eea15a26845ad82a07fd9318e..9e6d809f37302404a9dcf591bc0ba09471bcd801 100644
--- a/civicrm/CRM/Group/Page/AJAX.php
+++ b/civicrm/CRM/Group/Page/AJAX.php
@@ -42,6 +42,7 @@ class CRM_Group_Page_AJAX {
         'status' => 'Integer',
         'parentsOnly' => 'Integer',
         'showOrgInfo' => 'Boolean',
+        'savedSearch' => 'Integer',
         // Ignore 'parent_id' as that case is handled above
       ];
       $params = CRM_Core_Page_AJAX::defaultSortAndPagerParams();
diff --git a/civicrm/CRM/Import/DataSource/CSV.php b/civicrm/CRM/Import/DataSource/CSV.php
index 9651e47888aecb9b023947367cc1e354d0a22153..48687237cb9e955386dc7cd511cf86e33ee5b5e7 100644
--- a/civicrm/CRM/Import/DataSource/CSV.php
+++ b/civicrm/CRM/Import/DataSource/CSV.php
@@ -58,7 +58,7 @@ class CRM_Import_DataSource_CSV extends CRM_Import_DataSource {
     }
     $uploadSize = round(($uploadFileSize / (1024 * 1024)), 2);
     $form->assign('uploadSize', $uploadSize);
-    $form->add('File', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
+    $form->add('File', 'uploadFile', ts('Import Data File'), NULL, TRUE);
     $form->setMaxFileSize($uploadFileSize);
     $form->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', [
       1 => $uploadSize,
@@ -129,10 +129,9 @@ class CRM_Import_DataSource_CSV extends CRM_Import_DataSource {
       throw new CRM_Core_Exception("$file is empty. Please upload a valid file.");
     }
 
-    $config = CRM_Core_Config::singleton();
     // support tab separated
-    if (strtolower($fieldSeparator) == 'tab' ||
-      strtolower($fieldSeparator) == '\t'
+    if (strtolower($fieldSeparator) === 'tab' ||
+      strtolower($fieldSeparator) === '\t'
     ) {
       $fieldSeparator = "\t";
     }
@@ -188,13 +187,11 @@ class CRM_Import_DataSource_CSV extends CRM_Import_DataSource {
     }
 
     if ($tableName) {
-      // Drop previous table if passed in and create new one.
-      $db->query("DROP TABLE IF EXISTS $tableName");
+      CRM_Core_DAO::executeQuery("DROP TABLE IF EXISTS $tableName");
     }
     $table = CRM_Utils_SQL_TempTable::build()->setDurable();
     $tableName = $table->getName();
-    // Do we still need this?
-    $db->query("DROP TABLE IF EXISTS $tableName");
+    CRM_Core_DAO::executeQuery("DROP TABLE IF EXISTS $tableName");
     $table->createWithColumns(implode(' text, ', $columns) . ' text');
 
     $numColumns = count($columns);
@@ -234,8 +231,7 @@ class CRM_Import_DataSource_CSV extends CRM_Import_DataSource {
       $count++;
 
       if ($count >= self::NUM_ROWS_TO_INSERT && !empty($sql)) {
-        $sql = "INSERT IGNORE INTO $tableName VALUES $sql";
-        $db->query($sql);
+        CRM_Core_DAO::executeQuery("INSERT IGNORE INTO $tableName VALUES $sql");
 
         $sql = NULL;
         $first = TRUE;
@@ -244,8 +240,7 @@ class CRM_Import_DataSource_CSV extends CRM_Import_DataSource {
     }
 
     if (!empty($sql)) {
-      $sql = "INSERT IGNORE INTO $tableName VALUES $sql";
-      $db->query($sql);
+      CRM_Core_DAO::executeQuery("INSERT IGNORE INTO $tableName VALUES $sql");
     }
 
     fclose($fd);
diff --git a/civicrm/CRM/Import/DataSource/SQL.php b/civicrm/CRM/Import/DataSource/SQL.php
index 26d3e09faa1a9d779cc8b394e7585718d03a5714..c1cbb61e1e4db6033223584f7b7c45fa064552af 100644
--- a/civicrm/CRM/Import/DataSource/SQL.php
+++ b/civicrm/CRM/Import/DataSource/SQL.php
@@ -49,7 +49,7 @@ class CRM_Import_DataSource_SQL extends CRM_Import_DataSource {
    */
   public function buildQuickForm(&$form) {
     $form->add('hidden', 'hidden_dataSource', 'CRM_Import_DataSource_SQL');
-    $form->add('textarea', 'sqlQuery', ts('Specify SQL Query'), 'rows=10 cols=45', TRUE);
+    $form->add('textarea', 'sqlQuery', ts('Specify SQL Query'), ['rows' => 10, 'cols' => 45], TRUE);
     $form->addFormRule(['CRM_Import_DataSource_SQL', 'formRule'], $form);
   }
 
diff --git a/civicrm/CRM/Import/Form/DataSource.php b/civicrm/CRM/Import/Form/DataSource.php
index 90e5cd71c73be5f701872de901335f5069472266..d06d6c56e998eb754e5ae68cc3a719ec2d714493 100644
--- a/civicrm/CRM/Import/Form/DataSource.php
+++ b/civicrm/CRM/Import/Form/DataSource.php
@@ -50,7 +50,7 @@ abstract class CRM_Import_Form_DataSource extends CRM_Core_Form {
 
     $this->assign('uploadSize', $uploadSize);
 
-    $this->add('File', 'uploadFile', ts('Import Data File'), 'size=30 maxlength=255', TRUE);
+    $this->add('File', 'uploadFile', ts('Import Data File'), NULL, TRUE);
     $this->setMaxFileSize($uploadFileSize);
     $this->addRule('uploadFile', ts('File size should be less than %1 MBytes (%2 bytes)', [
       1 => $uploadSize,
diff --git a/civicrm/CRM/Logging/Schema.php b/civicrm/CRM/Logging/Schema.php
index 25b63413d2540ca1d6ccc56afc690dce002e95cd..2d1d0e3037913ce003805aa1b1341654d8f61f50 100644
--- a/civicrm/CRM/Logging/Schema.php
+++ b/civicrm/CRM/Logging/Schema.php
@@ -441,10 +441,12 @@ AND    (TABLE_NAME LIKE 'log_civicrm_%' $nonStandardTableNameString )
     // should treat it as a modification.
     $this->resetSchemaCacheForTable("log_$table");
     $logTableSchema = $this->columnSpecsOf("log_$table");
-    foreach ($cols['ADD'] as $colKey => $col) {
-      if (array_key_exists($col, $logTableSchema)) {
-        $cols['MODIFY'][] = $col;
-        unset($cols['ADD'][$colKey]);
+    if (!empty($cols['ADD'])) {
+      foreach ($cols['ADD'] as $colKey => $col) {
+        if (array_key_exists($col, $logTableSchema)) {
+          $cols['MODIFY'][] = $col;
+          unset($cols['ADD'][$colKey]);
+        }
       }
     }
 
diff --git a/civicrm/CRM/Mailing/BAO/MailingJob.php b/civicrm/CRM/Mailing/BAO/MailingJob.php
index 4b1d5c6656a4d72ab074dbe8e5c45f570f7f47f1..228406bb99653bc7061edc53635c126afaa566f7 100644
--- a/civicrm/CRM/Mailing/BAO/MailingJob.php
+++ b/civicrm/CRM/Mailing/BAO/MailingJob.php
@@ -8,6 +8,7 @@
  | and copyright information, see https://civicrm.org/licensing       |
  +--------------------------------------------------------------------+
  */
+use Civi\Api4\ActivityContact;
 
 /**
  *
@@ -499,7 +500,7 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
       $swapLang = CRM_Utils_AutoClean::swap('global://dbLocale?getter', 'call://i18n/setLocale', $mailing->language);
     }
 
-    $job_date = CRM_Utils_Date::isoToMysql($this->scheduled_date);
+    $job_date = $this->scheduled_date;
     $fields = [];
 
     if (!empty($testParams)) {
@@ -596,7 +597,7 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
       $params[] = $field['contact_id'];
     }
 
-    $details = CRM_Utils_Token::getTokenDetails(
+    [$details] = CRM_Utils_Token::getTokenDetails(
       $params,
       $returnProperties,
       $skipOnHold, TRUE, NULL,
@@ -605,11 +606,10 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
       $this->id
     );
 
-    $config = CRM_Core_Config::singleton();
     foreach ($fields as $key => $field) {
       $contactID = $field['contact_id'];
-      if (!array_key_exists($contactID, $details[0])) {
-        $details[0][$contactID] = [];
+      if (!array_key_exists($contactID, $details)) {
+        $details[$contactID] = [];
       }
 
       // Compose the mailing.
@@ -622,7 +622,7 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
       $message = $mailing->compose(
         $this->id, $field['id'], $field['hash'],
         $field['contact_id'], $field['email'],
-        $recipient, FALSE, $details[0][$contactID], $attachments,
+        $recipient, FALSE, $details[$contactID], $attachments,
         FALSE, NULL, $replyToEmail
       );
       if (empty($message)) {
@@ -639,8 +639,8 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
 
       if ($mailing->sms_provider_id) {
         $provider = CRM_SMS_Provider::singleton(['mailing_id' => $mailing->id]);
-        $body = $provider->getMessage($message, $field['contact_id'], $details[0][$contactID]);
-        $headers = $provider->getRecipientDetails($field, $details[0][$contactID]);
+        $body = $provider->getMessage($message, $field['contact_id'], $details[$contactID]);
+        $headers = $provider->getRecipientDetails($field, $details[$contactID]);
       }
 
       // make $recipient actually be the *encoded* header, so as not to baffle Mail_RFC822, CRM-5743
@@ -985,14 +985,11 @@ AND    status IN ( 'Scheduled', 'Running', 'Paused' )
 
       $activity = [
         'source_contact_id' => $mailing->scheduled_id,
-        // CRM-9519
-        'target_contact_id' => array_unique($targetParams),
         'activity_type_id' => $activityTypeID,
         'source_record_id' => $this->mailing_id,
         'activity_date_time' => $job_date,
         'subject' => $mailing->subject,
         'status_id' => 'Completed',
-        'deleteActivityTarget' => FALSE,
         'campaign_id' => $mailing->campaign_id,
       ];
 
@@ -1010,36 +1007,37 @@ AND    civicrm_activity.source_record_id = %2
         2 => [$this->mailing_id, 'Integer'],
       ];
       $activityID = CRM_Core_DAO::singleValueQuery($query, $queryParams);
+      $targetRecordID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_ActivityContact', 'record_type_id', 'Activity Targets');
 
+      $activityTargets = [];
+      foreach ($targetParams as $id) {
+        $activityTargets[$id] = ['contact_id' => (int) $id];
+      }
       if ($activityID) {
         $activity['id'] = $activityID;
 
         // CRM-9519
         if (CRM_Core_BAO_Email::isMultipleBulkMail()) {
-          static $targetRecordID = NULL;
-          if (!$targetRecordID) {
-            $activityContacts = CRM_Activity_BAO_ActivityContact::buildOptions('record_type_id', 'validate');
-            $targetRecordID = CRM_Utils_Array::key('Activity Targets', $activityContacts);
-          }
-
           // make sure we don't attempt to duplicate the target activity
-          foreach ($activity['target_contact_id'] as $key => $targetID) {
+          // @todo - we don't have to do one contact at a time....
+          foreach ($activityTargets as $key => $target) {
             $sql = "
 SELECT id
 FROM   civicrm_activity_contact
 WHERE  activity_id = $activityID
-AND    contact_id = $targetID
+AND    contact_id = {$target['contact_id']}
 AND    record_type_id = $targetRecordID
 ";
             if (CRM_Core_DAO::singleValueQuery($sql)) {
-              unset($activity['target_contact_id'][$key]);
+              unset($activityTargets[$key]);
             }
           }
         }
       }
 
       try {
-        civicrm_api3('Activity', 'create', $activity);
+        $activity = civicrm_api3('Activity', 'create', $activity);
+        ActivityContact::save(FALSE)->setRecords($activityTargets)->setDefaults(['activity_id' => $activity['id'], 'record_type_id' => $targetRecordID])->execute();
       }
       catch (Exception $e) {
         $result = FALSE;
diff --git a/civicrm/CRM/Mailing/DAO/BouncePattern.php b/civicrm/CRM/Mailing/DAO/BouncePattern.php
index 43822bf7c5e3db2db3a8d8ae5cdb2734634fbe2a..8c74d99ecffa796f8035a1599146239fe2fdfbe2 100644
--- a/civicrm/CRM/Mailing/DAO/BouncePattern.php
+++ b/civicrm/CRM/Mailing/DAO/BouncePattern.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/BouncePattern.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:90abbaf8e68b5749a084a74d77dcc3b7)
+ * (GenCodeChecksum:65ffd17da4de88b093e578fc52d42800)
  */
 
 /**
@@ -59,9 +59,12 @@ class CRM_Mailing_DAO_BouncePattern extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Bounce Patterns');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Bounce Patterns') : ts('Bounce Pattern');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/DAO/BounceType.php b/civicrm/CRM/Mailing/DAO/BounceType.php
index a31f8324f4fe03a1a642eec0fb8ea9ee76540c23..6511adf6d2d74f93db92671e6448508447acbe2f 100644
--- a/civicrm/CRM/Mailing/DAO/BounceType.php
+++ b/civicrm/CRM/Mailing/DAO/BounceType.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/BounceType.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4e77659bd433033396e84b6de32c99af)
+ * (GenCodeChecksum:41a2f33a589d43ba388d36dcf8f9e54f)
  */
 
 /**
@@ -66,9 +66,12 @@ class CRM_Mailing_DAO_BounceType extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Bounce Types');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Bounce Types') : ts('Bounce Type');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/DAO/Mailing.php b/civicrm/CRM/Mailing/DAO/Mailing.php
index 084489593dcbe2cdb9ea9deac588616ac95eb37c..95b4563035c617c21ad96b89bfe2d2db55e34c9d 100644
--- a/civicrm/CRM/Mailing/DAO/Mailing.php
+++ b/civicrm/CRM/Mailing/DAO/Mailing.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Mailing.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6a9dc5aaff7aa7f5dcfe3f892255e357)
+ * (GenCodeChecksum:9cd784dc86cf4f54983f14440be05239)
  */
 
 /**
@@ -342,9 +342,12 @@ class CRM_Mailing_DAO_Mailing extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Mailings');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Mailings') : ts('Mailing');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/DAO/MailingAB.php b/civicrm/CRM/Mailing/DAO/MailingAB.php
index 0e2215e1fc5f7a80a0f2c98d130825cecc72892c..1932930dc26461cd39536df97975b73c74cd54c8 100644
--- a/civicrm/CRM/Mailing/DAO/MailingAB.php
+++ b/civicrm/CRM/Mailing/DAO/MailingAB.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/MailingAB.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:af0f7d34ddde7f3971aaac5abccfcd8c)
+ * (GenCodeChecksum:075e135a610dcb619ab3ddc8c23944e1)
  */
 
 /**
@@ -130,9 +130,12 @@ class CRM_Mailing_DAO_MailingAB extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Mailing ABs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Mailing ABs') : ts('Mailing AB');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/DAO/MailingComponent.php b/civicrm/CRM/Mailing/DAO/MailingComponent.php
index f1b81f15629d57afdabbb5028be4dce21039a2bc..b544c0ea2ef935aa70c3f0a496342d1f22a78656 100644
--- a/civicrm/CRM/Mailing/DAO/MailingComponent.php
+++ b/civicrm/CRM/Mailing/DAO/MailingComponent.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/MailingComponent.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ca95f8566048836c03e1dc58eb51ac11)
+ * (GenCodeChecksum:bb6ab1e7538409ecfa1e72a45bb287a1)
  */
 
 /**
@@ -92,9 +92,12 @@ class CRM_Mailing_DAO_MailingComponent extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Mailing Components');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Mailing Components') : ts('Mailing Component');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/DAO/MailingGroup.php b/civicrm/CRM/Mailing/DAO/MailingGroup.php
index 220bfd13cb08a8554f8d50942feb52ad73f01c80..0d3497c6cdebac5986e7a1959078503d6d029744 100644
--- a/civicrm/CRM/Mailing/DAO/MailingGroup.php
+++ b/civicrm/CRM/Mailing/DAO/MailingGroup.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/MailingGroup.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a253e806fcb595ede70c812a10c0dbba)
+ * (GenCodeChecksum:4ab3dccb8706ec8f03072118ff2e9c12)
  */
 
 /**
@@ -87,9 +87,12 @@ class CRM_Mailing_DAO_MailingGroup extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Mailing Groups');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Mailing Groups') : ts('Mailing Group');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/DAO/MailingJob.php b/civicrm/CRM/Mailing/DAO/MailingJob.php
index bde7e35f391efa21fb03a70a15fd96c8aeac78f9..edbd20cd5f9a0e9d6daa8d3fb8e7f6ab6c834730 100644
--- a/civicrm/CRM/Mailing/DAO/MailingJob.php
+++ b/civicrm/CRM/Mailing/DAO/MailingJob.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/MailingJob.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:0c6e76df20fe3579056c287aeed27cdb)
+ * (GenCodeChecksum:eb066e39ba2501608759e6ac3dfbcaaf)
  */
 
 /**
@@ -115,9 +115,12 @@ class CRM_Mailing_DAO_MailingJob extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Mailing Jobs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Mailing Jobs') : ts('Mailing Job');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/DAO/Recipients.php b/civicrm/CRM/Mailing/DAO/Recipients.php
index 1852c7ac022a6aeb4fa60c2207c1dc4c8179e58d..7e6bb43ab156baa1be3e9dc954454e6f87f89af6 100644
--- a/civicrm/CRM/Mailing/DAO/Recipients.php
+++ b/civicrm/CRM/Mailing/DAO/Recipients.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Recipients.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ebd2ec177861f8f82a4bc6bc8b33fd9b)
+ * (GenCodeChecksum:3fb8b7a18899cd7dba958e9e08a944a7)
  */
 
 /**
@@ -73,9 +73,12 @@ class CRM_Mailing_DAO_Recipients extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Recipientses');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Recipientses') : ts('Recipients');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/DAO/Spool.php b/civicrm/CRM/Mailing/DAO/Spool.php
index 6027afd1676cf9875d35a251c211c8fd107c66c8..6329553862b5b28fe832bd0148d302311c8adb4e 100644
--- a/civicrm/CRM/Mailing/DAO/Spool.php
+++ b/civicrm/CRM/Mailing/DAO/Spool.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Spool.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7bd4a9b64175915a43f602f4f9cfb721)
+ * (GenCodeChecksum:f2aa2d8c8ee3203bf674e6c193818dda)
  */
 
 /**
@@ -87,9 +87,12 @@ class CRM_Mailing_DAO_Spool extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Spools');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Spools') : ts('Spool');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/DAO/TrackableURL.php b/civicrm/CRM/Mailing/DAO/TrackableURL.php
index 3d39634397268e1e0df4006057af18566bc67a83..0452ac93ba61db22c6f3f88eda24d9b482ca1500 100644
--- a/civicrm/CRM/Mailing/DAO/TrackableURL.php
+++ b/civicrm/CRM/Mailing/DAO/TrackableURL.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/TrackableURL.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:74f858b4e9e666e05416be884002408b)
+ * (GenCodeChecksum:ac0ae37c12d442071e726deb75e8a7ba)
  */
 
 /**
@@ -59,9 +59,12 @@ class CRM_Mailing_DAO_TrackableURL extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Trackable URLs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Trackable URLs') : ts('Trackable URL');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/Bounce.php b/civicrm/CRM/Mailing/Event/DAO/Bounce.php
index 1cd4024fb4d6cad1d6d96f0cac121e030ef19b62..7252307252f73a254a35b1dff72e4f8481808407 100644
--- a/civicrm/CRM/Mailing/Event/DAO/Bounce.php
+++ b/civicrm/CRM/Mailing/Event/DAO/Bounce.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/Bounce.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8e0590dde97f57494203397255fd4604)
+ * (GenCodeChecksum:dc1c97304810848da9a9c4255456799f)
  */
 
 /**
@@ -73,9 +73,12 @@ class CRM_Mailing_Event_DAO_Bounce extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Bounces');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Bounces') : ts('Bounce');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/Confirm.php b/civicrm/CRM/Mailing/Event/DAO/Confirm.php
index 343430c1579dfc5b9c48305ad68394f05bf77676..3c757f302d5c6550569bb2b2dee140e1a740a10a 100644
--- a/civicrm/CRM/Mailing/Event/DAO/Confirm.php
+++ b/civicrm/CRM/Mailing/Event/DAO/Confirm.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/Confirm.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:827b011dc50d032e8b74d6d164314d83)
+ * (GenCodeChecksum:3d1dae89470e79336dab7506dd173499)
  */
 
 /**
@@ -59,9 +59,12 @@ class CRM_Mailing_Event_DAO_Confirm extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Confirms');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Confirms') : ts('Confirm');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/Delivered.php b/civicrm/CRM/Mailing/Event/DAO/Delivered.php
index 147d70fcf82fc642fe9d6d6947eaeacdce6249fd..93bb85e2d53471527ae2fea3e363805a0ececa2a 100644
--- a/civicrm/CRM/Mailing/Event/DAO/Delivered.php
+++ b/civicrm/CRM/Mailing/Event/DAO/Delivered.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/Delivered.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c983e11b4de5a1c4e6d9765eb7d12755)
+ * (GenCodeChecksum:6a81ffa6ed10a254979274ea5edbd855)
  */
 
 /**
@@ -59,9 +59,12 @@ class CRM_Mailing_Event_DAO_Delivered extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Delivereds');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Delivereds') : ts('Delivered');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/Forward.php b/civicrm/CRM/Mailing/Event/DAO/Forward.php
index ac1c8d89670b53ee6841f4354507a708a0937fac..6650dd0c0cb932206e94678ee0069ff68714f422 100644
--- a/civicrm/CRM/Mailing/Event/DAO/Forward.php
+++ b/civicrm/CRM/Mailing/Event/DAO/Forward.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/Forward.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:359e0b700860c29a1e809fd4acbf7598)
+ * (GenCodeChecksum:16bd96b998ed8316250158886d0dc7c8)
  */
 
 /**
@@ -66,9 +66,12 @@ class CRM_Mailing_Event_DAO_Forward extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Forwards');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Forwards') : ts('Forward');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/Opened.php b/civicrm/CRM/Mailing/Event/DAO/Opened.php
index cbd24372dfa0ba3c77d52f2f0364fedf853544e9..9ce62afcf5c28fa31abe22b3e1b69ec04c4c8eb0 100644
--- a/civicrm/CRM/Mailing/Event/DAO/Opened.php
+++ b/civicrm/CRM/Mailing/Event/DAO/Opened.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/Opened.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:dddc76ba8461f8b0c1f3c1cdccddd111)
+ * (GenCodeChecksum:d636f34b01a876a72874c4b86abacff4)
  */
 
 /**
@@ -59,9 +59,12 @@ class CRM_Mailing_Event_DAO_Opened extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Openeds');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Openeds') : ts('Opened');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/Queue.php b/civicrm/CRM/Mailing/Event/DAO/Queue.php
index 073ef521c99712886df7631bfb944d88ac07d5a4..4dd92f1047ee06731774056164f1b82e18477d28 100644
--- a/civicrm/CRM/Mailing/Event/DAO/Queue.php
+++ b/civicrm/CRM/Mailing/Event/DAO/Queue.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/Queue.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:091cb300f1b0a67dfaf40f988806e6cf)
+ * (GenCodeChecksum:f37d1a6e35b4f827ed7daf29b3005fad)
  */
 
 /**
@@ -80,9 +80,12 @@ class CRM_Mailing_Event_DAO_Queue extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Queues');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Queues') : ts('Queue');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/Reply.php b/civicrm/CRM/Mailing/Event/DAO/Reply.php
index 8fc31b3eb359e704d28f7b9a81d3ee077d5733e8..3c3cb9cff7820fb24720a786a859fc0aa3e95b61 100644
--- a/civicrm/CRM/Mailing/Event/DAO/Reply.php
+++ b/civicrm/CRM/Mailing/Event/DAO/Reply.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/Reply.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b1d572f3d42f6480dc98a2e6f9710fa3)
+ * (GenCodeChecksum:e4f80247fbee550b68997bd9f264dc66)
  */
 
 /**
@@ -59,9 +59,12 @@ class CRM_Mailing_Event_DAO_Reply extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Replies');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Replies') : ts('Reply');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/Subscribe.php b/civicrm/CRM/Mailing/Event/DAO/Subscribe.php
index ce577b24d76a5e7433fcd0c380168c323060c6c3..6659fcca1de2cc57120ff391a8f7540004a59651 100644
--- a/civicrm/CRM/Mailing/Event/DAO/Subscribe.php
+++ b/civicrm/CRM/Mailing/Event/DAO/Subscribe.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/Subscribe.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:9e1dec99f17dcccde7feeca30b880a85)
+ * (GenCodeChecksum:b5a2a60211ad6eb943a6aa0db5f88840)
  */
 
 /**
@@ -73,9 +73,12 @@ class CRM_Mailing_Event_DAO_Subscribe extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Subscribes');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Subscribes') : ts('Subscribe');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/TrackableURLOpen.php b/civicrm/CRM/Mailing/Event/DAO/TrackableURLOpen.php
index 88c84b0b920119c676e43600ec6530b58b9a6cbe..85f4b96810e10da76ffdb9f53259f1ffd67f252b 100644
--- a/civicrm/CRM/Mailing/Event/DAO/TrackableURLOpen.php
+++ b/civicrm/CRM/Mailing/Event/DAO/TrackableURLOpen.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/TrackableURLOpen.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:b543a83312f2069a45872939517aa480)
+ * (GenCodeChecksum:6e1eb0a358ed16c691ea25a741ce6f8c)
  */
 
 /**
@@ -66,9 +66,12 @@ class CRM_Mailing_Event_DAO_TrackableURLOpen extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Trackable URLOpens');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Trackable URLOpens') : ts('Trackable URLOpen');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Event/DAO/Unsubscribe.php b/civicrm/CRM/Mailing/Event/DAO/Unsubscribe.php
index e5a230b66dc76be60070e87969b3db4398cd89c4..71432c59ab116e4fe2f7493441ba7ca8bd698d1d 100644
--- a/civicrm/CRM/Mailing/Event/DAO/Unsubscribe.php
+++ b/civicrm/CRM/Mailing/Event/DAO/Unsubscribe.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Mailing/Event/Unsubscribe.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:2d080a63032c9dce0331a6ed4f6c3cd2)
+ * (GenCodeChecksum:48ace30af145c288185e356b721a22d1)
  */
 
 /**
@@ -66,9 +66,12 @@ class CRM_Mailing_Event_DAO_Unsubscribe extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Unsubscribes');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Unsubscribes') : ts('Unsubscribe');
   }
 
   /**
diff --git a/civicrm/CRM/Mailing/Form/Optout.php b/civicrm/CRM/Mailing/Form/Optout.php
index 8514612e81534510fa59783f771e96fa9945127e..e809d497b76f73e090b193bfd6a50dbab7d5e580 100644
--- a/civicrm/CRM/Mailing/Form/Optout.php
+++ b/civicrm/CRM/Mailing/Form/Optout.php
@@ -47,7 +47,7 @@ class CRM_Mailing_Form_Optout extends CRM_Core_Form {
 
   public function buildQuickForm() {
     CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
-    CRM_Utils_System::setTitle(ts('Please Confirm Your Opt Out'));
+    CRM_Utils_System::setTitle(ts('Opt Out Confirmation'));
 
     $this->add('text', 'email_confirm', ts('Verify email address to opt out:'));
     $this->addRule('email_confirm', ts('Email address is required to opt out.'), 'required');
@@ -89,7 +89,7 @@ class CRM_Mailing_Form_Optout extends CRM_Core_Form {
         CRM_Mailing_Event_BAO_Unsubscribe::send_unsub_response($queue_id, NULL, TRUE, $job_id);
       }
 
-      $statusMsg = ts('Email: %1 has been successfully opted out',
+      $statusMsg = ts('%1 opt out confirmed.',
         [1 => $values['email_confirm']]
       );
 
@@ -97,7 +97,7 @@ class CRM_Mailing_Form_Optout extends CRM_Core_Form {
     }
     elseif ($result == FALSE) {
       // Email address not verified
-      $statusMsg = ts('The email address: %1 you have entered does not match the email associated with this opt out request.',
+      $statusMsg = ts('%1 is not associated with this opt out request.',
         [1 => $values['email_confirm']]
       );
 
diff --git a/civicrm/CRM/Mailing/Form/Task.php b/civicrm/CRM/Mailing/Form/Task.php
index 4a84746aaaba6479e80500081dbbff1f98eb6a76..0b0402be93e7357ef4585d8416fe9666d4c4af65 100644
--- a/civicrm/CRM/Mailing/Form/Task.php
+++ b/civicrm/CRM/Mailing/Form/Task.php
@@ -29,14 +29,14 @@ class CRM_Mailing_Form_Task extends CRM_Core_Form_Task {
   }
 
   /**
-   * @param CRM_Core_Form $form
+   * @param \CRM_Core_Form_Task $form
+   *
+   * @throws \CRM_Core_Exception
    */
   public static function preProcessCommon(&$form) {
-    $values = $form->controller->exportValues($form->get('searchFormName'));
+    $values = $form->getSearchFormValues();
 
     $form->_task = $values['task'] ?? NULL;
-    $mailingTasks = CRM_Mailing_Task::tasks();
-    $form->assign('taskName', CRM_Utils_Array::value('task', $values));
 
     // ids are mailing event queue ids
     $ids = [];
diff --git a/civicrm/CRM/Mailing/Form/Unsubscribe.php b/civicrm/CRM/Mailing/Form/Unsubscribe.php
index 95a675965955cdc94a9d15d1de94864963300984..c63263ba0b9e73632fcb54a0be36cfab34dd67ab 100644
--- a/civicrm/CRM/Mailing/Form/Unsubscribe.php
+++ b/civicrm/CRM/Mailing/Form/Unsubscribe.php
@@ -61,7 +61,7 @@ class CRM_Mailing_Form_Unsubscribe extends CRM_Core_Form {
       }
     }
     if (!$groupExist) {
-      $statusMsg = ts('Email: %1 has been successfully unsubscribed from this Mailing List/Group.',
+      $statusMsg = ts('%1 has been unsubscribed.',
         [1 => $email]
       );
       CRM_Core_Session::setStatus($statusMsg, '', 'error');
@@ -72,7 +72,7 @@ class CRM_Mailing_Form_Unsubscribe extends CRM_Core_Form {
 
   public function buildQuickForm() {
     CRM_Utils_System::addHTMLHead('<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">');
-    CRM_Utils_System::setTitle(ts('Please Confirm Your Unsubscribe from this Mailing/Group'));
+    CRM_Utils_System::setTitle(ts('Unsubscribe Confirmation'));
 
     $this->add('text', 'email_confirm', ts('Verify email address to unsubscribe:'));
     $this->addRule('email_confirm', ts('Email address is required to unsubscribe.'), 'required');
@@ -114,7 +114,7 @@ class CRM_Mailing_Form_Unsubscribe extends CRM_Core_Form {
         CRM_Mailing_Event_BAO_Unsubscribe::send_unsub_response($queue_id, $groups, FALSE, $job_id);
       }
 
-      $statusMsg = ts('Email: %1 has been successfully unsubscribed from this Mailing List/Group.',
+      $statusMsg = ts('%1 is unsubscribed.',
         [1 => $values['email_confirm']]
       );
 
@@ -122,7 +122,7 @@ class CRM_Mailing_Form_Unsubscribe extends CRM_Core_Form {
     }
     elseif ($result == FALSE) {
       // Email address not verified
-      $statusMsg = ts('The email address: %1 you have entered does not match the email associated with this unsubscribe request.',
+      $statusMsg = ts('%1 is not associated with this unsubscribe request.',
         [1 => $values['email_confirm']]
       );
 
diff --git a/civicrm/CRM/Mailing/Page/Preview.php b/civicrm/CRM/Mailing/Page/Preview.php
index 4d7981481d4032ffd36b89b1ef16fde5afd0616a..565388b0231c3aa2f118b9b09503ca697f57ae32 100644
--- a/civicrm/CRM/Mailing/Page/Preview.php
+++ b/civicrm/CRM/Mailing/Page/Preview.php
@@ -60,15 +60,15 @@ class CRM_Mailing_Page_Preview extends CRM_Core_Page {
     $returnProperties = $mailing->getReturnProperties();
     $params = ['contact_id' => $session->get('userID')];
 
-    $details = CRM_Utils_Token::getTokenDetails($params,
+    [$details] = CRM_Utils_Token::getTokenDetails($params,
       $returnProperties,
       TRUE, TRUE, NULL,
       $mailing->getFlattenedTokens(),
       get_class($this)
     );
-    // $details[0] is an array of [ contactID => contactDetails ]
+    // $details is an array of [ contactID => contactDetails ]
     $mime = &$mailing->compose(NULL, NULL, NULL, $session->get('userID'), $fromEmail, $fromEmail,
-      TRUE, $details[0][$session->get('userID')], $attachments
+      TRUE, $details[$session->get('userID')], $attachments
     );
 
     if ($type == 'html') {
diff --git a/civicrm/CRM/Member/ActionMapping.php b/civicrm/CRM/Member/ActionMapping.php
index 56db7eef4148ed53f2f3f0e26e217e282e97d04d..e42add868298b81d1dac16546f3f3bb566667469 100644
--- a/civicrm/CRM/Member/ActionMapping.php
+++ b/civicrm/CRM/Member/ActionMapping.php
@@ -168,4 +168,12 @@ class CRM_Member_ActionMapping extends \Civi\ActionSchedule\Mapping {
     }
   }
 
+  /**
+   * Determine whether a schedule based on this mapping should
+   * send to additional contacts.
+   */
+  public function sendToAdditional($entityId): bool {
+    return TRUE;
+  }
+
 }
diff --git a/civicrm/CRM/Member/BAO/Membership.php b/civicrm/CRM/Member/BAO/Membership.php
index 1030eaae1c9beb702129cc844f5531357d9668c0..41fa61e50f2569aff31bf3f7fcc3be234dff142b 100644
--- a/civicrm/CRM/Member/BAO/Membership.php
+++ b/civicrm/CRM/Member/BAO/Membership.php
@@ -265,7 +265,7 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
       }
 
       $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($params['start_date'], $params['end_date'], $params['join_date'],
-        'today', $excludeIsAdmin, $params['membership_type_id'] ?? NULL, $params
+        'now', $excludeIsAdmin, $params['membership_type_id'] ?? NULL, $params
       );
       if (empty($calcStatus)) {
         throw new CRM_Core_Exception(ts("The membership cannot be saved because the status cannot be calculated for start_date: {$params['start_date']} end_date {$params['end_date']} join_date {$params['join_date']} as at " . date('Y-m-d H:i:s')));
@@ -282,7 +282,7 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
     else {
       // if membership allows related, default max_related to value in membership_type
       if (!array_key_exists('max_related', $params) && !empty($params['membership_type_id'])) {
-        $membershipType = CRM_Member_BAO_MembershipType::getMembershipTypeDetails($params['membership_type_id']);
+        $membershipType = CRM_Member_BAO_MembershipType::getMembershipType($params['membership_type_id']);
         if (isset($membershipType['relationship_type_id'])) {
           $params['max_related'] = $membershipType['max_related'] ?? NULL;
         }
@@ -439,7 +439,8 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
   public static function checkMembershipRelationship($membershipTypeID, $contactId, $action = CRM_Core_Action::ADD) {
     $contacts = [];
 
-    $membershipType = CRM_Member_BAO_MembershipType::getMembershipTypeDetails($membershipTypeID);
+    $membershipType = CRM_Member_BAO_MembershipType::getMembershipType($membershipTypeID);
+
     $relationships = [];
     if (isset($membershipType['relationship_type_id'])) {
       $relationships = CRM_Contact_BAO_Relationship::getRelationship($contactId,
@@ -462,11 +463,9 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership {
         CRM_Contact_BAO_RelationshipType::retrieve($relType, $relValues);
         // Check if contact's relationship type exists in membership type
         $relTypeDirs = [];
-        $relTypeIds = explode(CRM_Core_DAO::VALUE_SEPARATOR, $membershipType['relationship_type_id']);
-        $relDirections = explode(CRM_Core_DAO::VALUE_SEPARATOR, $membershipType['relationship_direction']);
         $bidirectional = FALSE;
-        foreach ($relTypeIds as $key => $value) {
-          $relTypeDirs[] = $value . '_' . $relDirections[$key];
+        foreach ($membershipType['relationship_type_id'] as $key => $value) {
+          $relTypeDirs[] = $value . '_' . $membershipType['relationship_direction'][$key];
           if (in_array($value, $relType) &&
             $relValues['name_a_b'] == $relValues['name_b_a']
           ) {
@@ -1126,14 +1125,14 @@ AND civicrm_membership.is_test = %2";
    *   Reference to the array.
    *   containing all values of
    *   the current membership
-   * @param string $changeToday
+   * @param string|null $changeToday
    *   In case today needs
    *   to be customised, null otherwise
    *
    * @throws \CRM_Core_Exception
    */
-  public static function fixMembershipStatusBeforeRenew(&$currentMembership, $changeToday) {
-    $today = NULL;
+  public static function fixMembershipStatusBeforeRenew(&$currentMembership, $changeToday = NULL) {
+    $today = 'now';
     if ($changeToday) {
       $today = CRM_Utils_Date::processDate($changeToday, NULL, FALSE, 'Y-m-d');
     }
@@ -1152,8 +1151,6 @@ AND civicrm_membership.is_test = %2";
       throw new CRM_Core_Exception(ts('Oops, it looks like there is no valid membership status corresponding to the membership start and end dates for this membership. Contact the site administrator for assistance.'));
     }
 
-    $currentMembership['today_date'] = $today;
-
     if ($status['id'] !== $currentMembership['status_id']) {
       $oldStatus = $currentMembership['status_id'];
       $memberDAO = new CRM_Member_DAO_Membership();
@@ -1161,9 +1158,6 @@ AND civicrm_membership.is_test = %2";
       $memberDAO->find(TRUE);
 
       $memberDAO->status_id = $status['id'];
-      $memberDAO->join_date = CRM_Utils_Date::isoToMysql($memberDAO->join_date);
-      $memberDAO->start_date = CRM_Utils_Date::isoToMysql($memberDAO->start_date);
-      $memberDAO->end_date = CRM_Utils_Date::isoToMysql($memberDAO->end_date);
       $memberDAO->save();
       CRM_Core_DAO::storeValues($memberDAO, $currentMembership);
 
@@ -1185,10 +1179,7 @@ AND civicrm_membership.is_test = %2";
           $currentMembership['end_date'],
           $format
         ),
-        'modified_date' => CRM_Utils_Date::customFormat(
-          $currentMembership['today_date'],
-          $format
-        ),
+        'modified_date' => date('Y-m-d H:i:s', strtotime($today)),
         'membership_type_id' => $currentMembership['membership_type_id'],
         'max_related' => $currentMembership['max_related'] ?? 0,
       ];
@@ -1316,25 +1307,10 @@ WHERE  civicrm_membership.contact_id = civicrm_contact.id
    * @param CRM_Core_DAO $dao
    *   Membership object.
    *
-   * @param bool $reset
-   *
-   * @return array|null
-   *   Membership details, if created.
-   *
    * @throws \CRM_Core_Exception
    * @throws \CiviCRM_API3_Exception
    */
-  public static function createRelatedMemberships($params, $dao, $reset = FALSE) {
-    // CRM-4213 check for loops, using static variable to record contacts already processed.
-    if (!isset(\Civi::$statics[__CLASS__]['related_contacts'])) {
-      \Civi::$statics[__CLASS__]['related_contacts'] = [];
-    }
-    if ($reset) {
-      // CRM-17723.
-      unset(\Civi::$statics[__CLASS__]['related_contacts']);
-      return FALSE;
-    }
-    $relatedContactIds = &\Civi::$statics[__CLASS__]['related_contacts'];
+  public static function createRelatedMemberships($params, $dao) {
 
     $membership = new CRM_Member_DAO_Membership();
     $membership->id = $dao->id;
@@ -1371,9 +1347,9 @@ WHERE  civicrm_membership.contact_id = civicrm_contact.id
     );
 
     // CRM-4213, CRM-19735 check for loops, using static variable to record contacts already processed.
-    // Remove repeated related contacts, which already inherited membership of this type.
-    $relatedContactIds[$membership->contact_id][$membership->membership_type_id] = TRUE;
+    // Remove repeated related contacts, which already inherited membership of this type$relatedContactIds[$membership->contact_id][$membership->membership_type_id] = TRUE;
     foreach ($allRelatedContacts as $cid => $status) {
+      // relatedContactIDs is always empty now - will remove next roud because of whitespace readability.
       if (empty($relatedContactIds[$cid]) || empty($relatedContactIds[$cid][$membership->membership_type_id])) {
         $relatedContactIds[$cid][$membership->membership_type_id] = TRUE;
 
@@ -1424,9 +1400,14 @@ WHERE  civicrm_membership.contact_id = civicrm_contact.id
         $relMembership = new CRM_Member_DAO_Membership();
         $relMembership->contact_id = $contactId;
         $relMembership->owner_membership_id = $membership->id;
+
         if ($relMembership->find(TRUE)) {
           $params['id'] = $relMembership->id;
         }
+        else {
+          unset($params['id']);
+        }
+
         $params['contact_id'] = $contactId;
         $params['owner_membership_id'] = $membership->id;
 
@@ -1470,7 +1451,9 @@ WHERE  civicrm_membership.contact_id = civicrm_contact.id
         $ids = [];
         if (($params['status_id'] == $deceasedStatusId) || ($params['status_id'] == $expiredStatusId)) {
           // related membership is not active so does not count towards maximum
-          CRM_Member_BAO_Membership::create($params);
+          if (!self::hasExistingInheritedMembership($params)) {
+            CRM_Member_BAO_Membership::create($params);
+          }
         }
         else {
           // related membership already exists, so this is just an update
@@ -1495,7 +1478,9 @@ WHERE  civicrm_membership.contact_id = civicrm_contact.id
         if ($numRelatedAvailable <= 0) {
           break;
         }
-        CRM_Member_BAO_Membership::create($params);
+        if (!self::hasExistingInheritedMembership($params)) {
+          CRM_Member_BAO_Membership::create($params);
+        }
         $numRelatedAvailable--;
       }
     }
@@ -1780,7 +1765,7 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
     $allStatus = CRM_Member_PseudoConstant::membershipStatus();
     $format = '%Y%m%d';
     $statusFormat = '%Y-%m-%d';
-    $membershipTypeDetails = CRM_Member_BAO_MembershipType::getMembershipTypeDetails($membershipTypeID);
+    $membershipTypeDetails = CRM_Member_BAO_MembershipType::getMembershipType($membershipTypeID);
     $dates = [];
     $ids = [];
 
@@ -1926,7 +1911,7 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
           CRM_Utils_Date::customFormat($dates['join_date'],
             $statusFormat
           ),
-          'today',
+          'now',
           TRUE,
           $membershipTypeID,
           $memParams
@@ -2092,6 +2077,58 @@ INNER JOIN  civicrm_contact contact ON ( contact.id = membership.contact_id AND
     return $count;
   }
 
+  /**
+   * Does the existing membership match the required membership.
+   *
+   * Check before updating that the params are not a match - this is part of avoiding
+   * a loop if we have already updated.
+   *
+   * https://issues.civicrm.org/jira/browse/CRM-4213
+   * @param array $params
+   *
+   * @param array $membership
+   *
+   * @return bool
+   */
+  protected static function matchesRequiredMembership($params, $membership) {
+    foreach (['start_date', 'end_date'] as $date) {
+      if (strtotime($params[$date]) !== strtotime($membership[$date])) {
+        return FALSE;
+      }
+      if ((int) $params['status_id'] !== (int) $membership['status_id']) {
+        return FALSE;
+      }
+      if ((int) $params['membership_type_id'] !== (int) $membership['membership_type_id']) {
+        return FALSE;
+      }
+    }
+    return TRUE;
+  }
+
+  /**
+   * Params of new membership.
+   *
+   * @param array $params
+   *
+   * @return bool
+   * @throws \CiviCRM_API3_Exception
+   */
+  protected static function hasExistingInheritedMembership($params) {
+    foreach (civicrm_api3('Membership', 'get', ['contact_id' => $params['contact_id']])['values'] as $membership) {
+      if (!empty($membership['owner_membership_id'])
+        && $membership['membership_type_id'] === $params['membership_type_id']
+        && (int) $params['owner_membership_id'] !== (int) $membership['owner_membership_id']
+      ) {
+        // Inheriting it from another contact, don't update here.
+        return TRUE;
+      }
+      if (self::matchesRequiredMembership($params, $membership)) {
+        return TRUE;
+      }
+    }
+    return FALSE;
+  }
+
   /**
    * Process price set and line items.
    *
@@ -2241,21 +2278,6 @@ WHERE {$whereClause}";
     while ($dao2->fetch()) {
       $processCount++;
 
-      // Put common parameters into array for easy access
-      $memberParams = [
-        'id' => $dao2->membership_id,
-        'status_id' => $dao2->status_id,
-        'contact_id' => $dao2->contact_id,
-        'membership_type_id' => $dao2->membership_type_id,
-        'membership_type' => $allMembershipTypes[$dao2->membership_type_id]['name'],
-        'join_date' => $dao2->join_date,
-        'start_date' => $dao2->start_date,
-        'end_date' => $dao2->end_date,
-        'source' => $dao2->source,
-        'skipStatusCal' => TRUE,
-        'skipRecentView' => TRUE,
-      ];
-
       // CRM-7248: added excludeIsAdmin param to the following fn call to prevent moving to admin statuses
       //get the membership status as per id.
       $newStatus = civicrm_api3('membership_status', 'calc',
@@ -2270,27 +2292,16 @@ WHERE {$whereClause}";
       if ($statusId &&
         $statusId != $dao2->status_id
       ) {
-        //take all params that need to save.
-        $memParams = $memberParams;
-        $memParams['status_id'] = $statusId;
-        $memParams['createActivity'] = TRUE;
-
-        // Unset columns which should remain unchanged from their current saved
-        // values. This avoids race condition in which these values may have
-        // been changed by other processes.
-        unset(
-          $memParams['contact_id'],
-          $memParams['membership_type_id'],
-          $memParams['membership_type'],
-          $memParams['join_date'],
-          $memParams['start_date'],
-          $memParams['end_date'],
-          $memParams['source']
-        );
-        //since there is change in status.
+        $memberParams = [
+          'id' => $dao2->membership_id,
+          'skipStatusCal' => TRUE,
+          'skipRecentView' => TRUE,
+          'status_id' => $statusId,
+          'createActivity' => TRUE,
+        ];
 
         //process member record.
-        civicrm_api3('membership', 'create', $memParams);
+        civicrm_api3('membership', 'create', $memberParams);
         $updateCount++;
       }
     }
@@ -2634,7 +2645,7 @@ WHERE {$whereClause}";
             $updates["start_date"] ?? $newMembership->start_date,
             $updates["end_date"] ?? $newMembership->end_date,
             $updates["join_date"] ?? $newMembership->join_date,
-            'today',
+            'now',
             FALSE,
             $newMembershipId,
             $newMembership
diff --git a/civicrm/CRM/Member/BAO/MembershipStatus.php b/civicrm/CRM/Member/BAO/MembershipStatus.php
index fa4a7665f8d594544887808cc21cdc21d290e246..dd3404405dcfe5055c25b088e271597147a80f80 100644
--- a/civicrm/CRM/Member/BAO/MembershipStatus.php
+++ b/civicrm/CRM/Member/BAO/MembershipStatus.php
@@ -16,19 +16,6 @@
  */
 class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus {
 
-  /**
-   * Static holder for the default LT.
-   * @var int
-   */
-  public static $_defaultMembershipStatus = NULL;
-
-  /**
-   * Class constructor.
-   */
-  public function __construct() {
-    parent::__construct();
-  }
-
   /**
    * Fetch object based on array of properties.
    *
@@ -68,26 +55,21 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus {
    * Takes an associative array and creates a membership Status object.
    *
    * @param array $params
-   *   (reference ) an assoc array of name/value pairs.
+   *   Array of name/value pairs.
    *
-   * @throws Exception
-   * @return CRM_Member_BAO_MembershipStatus
+   * @throws CRM_Core_Exception
+   * @return CRM_Member_DAO_MembershipStatus
    */
   public static function create($params) {
-    $ids = [];
-    if (!empty($params['id'])) {
-      $ids['membershipStatus'] = $params['id'];
-    }
-    else {
+    if (empty($params['id'])) {
       //don't allow duplicate names - if id not set
       $status = new CRM_Member_DAO_MembershipStatus();
       $status->name = $params['name'];
       if ($status->find(TRUE)) {
-        throw new Exception('A membership status with this name already exists.');
+        throw new CRM_Core_Exception('A membership status with this name already exists.');
       }
     }
-    $membershipStatusBAO = CRM_Member_BAO_MembershipStatus::add($params, $ids);
-    return $membershipStatusBAO;
+    return self::add($params);
   }
 
   /**
@@ -98,10 +80,12 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus {
    * @param array $ids
    *   Array contains the id - this param is deprecated.
    *
-   *
-   * @return object
+   * @return CRM_Member_DAO_MembershipStatus
    */
   public static function add(&$params, $ids = []) {
+    if (!empty($ids)) {
+      CRM_Core_Error::deprecatedFunctionWarning('ids is a deprecated parameter');
+    }
     $id = $params['id'] ?? $ids['membershipStatus'] ?? NULL;
     if (!$id) {
       CRM_Core_DAO::setCreateDefaults($params, self::getDefaults());
@@ -225,17 +209,17 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus {
    */
   public static function getMembershipStatusByDate(
     $startDate, $endDate, $joinDate,
-    $statusDate = 'today', $excludeIsAdmin = FALSE, $membershipTypeID = NULL, $membership = []
+    $statusDate = 'now', $excludeIsAdmin = FALSE, $membershipTypeID = NULL, $membership = []
   ) {
     $membershipDetails = [];
 
-    if (!$statusDate || $statusDate == 'today') {
-      $statusDate = date('Ymd');
-    }
-    else {
-      $statusDate = CRM_Utils_Date::customFormat($statusDate, '%Y%m%d');
+    if (!$statusDate || $statusDate === 'today') {
+      $statusDate = 'now';
+      CRM_Core_Error::deprecatedFunctionWarning('pass now rather than today in');
     }
 
+    $statusDate = date('Ymd', strtotime($statusDate));
+
     //fix for CRM-3570, if we have statuses with is_admin=1,
     //exclude these statuses from calculatation during import.
     $where = "is_active = 1";
diff --git a/civicrm/CRM/Member/BAO/MembershipType.php b/civicrm/CRM/Member/BAO/MembershipType.php
index 11593a8e44f7e0269e75bdfb03c8788cc87b2692..581f11d686a177c33dbe59af36cdb75e73f82433 100644
--- a/civicrm/CRM/Member/BAO/MembershipType.php
+++ b/civicrm/CRM/Member/BAO/MembershipType.php
@@ -635,7 +635,7 @@ class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType {
   }
 
   /**
-   * The function returns all the Organization for  all membershipTypes .
+   * The function returns all the Organization for all membershipTypes .
    *
    * @param int $membershipTypeId
    *
@@ -814,6 +814,8 @@ class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType {
    * Caching is by domain - if that hits any issues we should add a new function getDomainMembershipTypes
    * or similar rather than 'just add another param'! but this is closer to earlier behaviour so 'should' be OK.
    *
+   * @return array
+   *   List of membershipType details keyed by membershipTypeID
    * @throws \CiviCRM_API3_Exception
    */
   public static function getAllMembershipTypes() {
@@ -821,7 +823,7 @@ class CRM_Member_BAO_MembershipType extends CRM_Member_DAO_MembershipType {
     if (!Civi::cache('metadata')->has($cacheString)) {
       $types = civicrm_api3('MembershipType', 'get', ['options' => ['limit' => 0, 'sort' => 'weight']])['values'];
       $taxRates = CRM_Core_PseudoConstant::getTaxRates();
-      $keys = ['description', 'relationship_type_id', 'relationship_direction', 'max_related'];
+      $keys = ['description', 'relationship_type_id', 'relationship_direction', 'max_related', 'auto_renew'];
       // In order to avoid down-stream e-notices we undo api v3 filtering of NULL values. This is covered
       // in Unit tests & ideally we might switch to apiv4 but I would argue we should build caching
       // of metadata entities like this directly into apiv4.
diff --git a/civicrm/CRM/Member/Controller/Search.php b/civicrm/CRM/Member/Controller/Search.php
index 02ca8b7ff692bf13c036725a4e4fe59c29669567..b4cfb3301d43f9c7f84e6542212b86d6663a94c4 100644
--- a/civicrm/CRM/Member/Controller/Search.php
+++ b/civicrm/CRM/Member/Controller/Search.php
@@ -28,6 +28,8 @@
  */
 class CRM_Member_Controller_Search extends CRM_Core_Controller {
 
+  protected $entity = 'Membership';
+
   /**
    * Class constructor.
    *
@@ -45,8 +47,8 @@ class CRM_Member_Controller_Search extends CRM_Core_Controller {
     $this->addPages($this->_stateMachine, $action);
 
     // add all the actions
-    $config = CRM_Core_Config::singleton();
     $this->addActions();
+    $this->set('entity', $this->entity);
   }
 
 }
diff --git a/civicrm/CRM/Member/DAO/Membership.php b/civicrm/CRM/Member/DAO/Membership.php
index 384c69ae6b5857b66703fee8ea4ed20262dec189..86173b83afcc6b600e17bc5b54f71bb343291e0b 100644
--- a/civicrm/CRM/Member/DAO/Membership.php
+++ b/civicrm/CRM/Member/DAO/Membership.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Member/Membership.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:835c63ea0a55b78d6d115a7a6db5dde2)
+ * (GenCodeChecksum:d80be256fb175b763047883b8694559c)
  */
 
 /**
@@ -153,9 +153,12 @@ class CRM_Member_DAO_Membership extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Memberships');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Memberships') : ts('Membership');
   }
 
   /**
diff --git a/civicrm/CRM/Member/DAO/MembershipBlock.php b/civicrm/CRM/Member/DAO/MembershipBlock.php
index 91e65e6eeb2becf3e7d2174e8c64ed63aa0fa737..9bfff5263961424141d08bc2d8b2f4fc94accfda 100644
--- a/civicrm/CRM/Member/DAO/MembershipBlock.php
+++ b/civicrm/CRM/Member/DAO/MembershipBlock.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Member/MembershipBlock.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:8eb2f3a6c818d449da875421b54de619)
+ * (GenCodeChecksum:6a38472a1103f6f5de9e33fed620060d)
  */
 
 /**
@@ -131,9 +131,12 @@ class CRM_Member_DAO_MembershipBlock extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Membership Blocks');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Membership Blocks') : ts('Membership Block');
   }
 
   /**
diff --git a/civicrm/CRM/Member/DAO/MembershipLog.php b/civicrm/CRM/Member/DAO/MembershipLog.php
index bd0b4f7924e54ec306d9b02fa7035db8643b0bfd..1619acbedb592efdf8175890c038d6584f1d0ef3 100644
--- a/civicrm/CRM/Member/DAO/MembershipLog.php
+++ b/civicrm/CRM/Member/DAO/MembershipLog.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Member/MembershipLog.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:4d5744b433ca7bb5385b11945cc0fe10)
+ * (GenCodeChecksum:d1e55c6d7f0e93b21778fdd36dd6e022)
  */
 
 /**
@@ -101,9 +101,12 @@ class CRM_Member_DAO_MembershipLog extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Membership Logs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Membership Logs') : ts('Membership Log');
   }
 
   /**
diff --git a/civicrm/CRM/Member/DAO/MembershipPayment.php b/civicrm/CRM/Member/DAO/MembershipPayment.php
index ac386eee5571056a71d1515f946399cf504202a0..67e9bc60571425c81c260ea04e2515be0d289f55 100644
--- a/civicrm/CRM/Member/DAO/MembershipPayment.php
+++ b/civicrm/CRM/Member/DAO/MembershipPayment.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Member/MembershipPayment.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:39168603c262c909ebeee2ce821f0f0d)
+ * (GenCodeChecksum:e9764dc46ae261f8cad8ef1383063d61)
  */
 
 /**
@@ -59,9 +59,12 @@ class CRM_Member_DAO_MembershipPayment extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Membership Payments');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Membership Payments') : ts('Membership Payment');
   }
 
   /**
diff --git a/civicrm/CRM/Member/DAO/MembershipStatus.php b/civicrm/CRM/Member/DAO/MembershipStatus.php
index 5b780e4a5b9d21399a5f961b7a59ecd6ae7e7cfc..5857dca3cf5dafedbd4ca755d8db77efb6d8e9bf 100644
--- a/civicrm/CRM/Member/DAO/MembershipStatus.php
+++ b/civicrm/CRM/Member/DAO/MembershipStatus.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Member/MembershipStatus.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f0c470d5aca6e3696a0ad8345531f8b8)
+ * (GenCodeChecksum:6bdad135e9f0e94f085296d68ca59253)
  */
 
 /**
@@ -143,9 +143,12 @@ class CRM_Member_DAO_MembershipStatus extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Membership Statuses');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Membership Statuses') : ts('Membership Status');
   }
 
   /**
diff --git a/civicrm/CRM/Member/DAO/MembershipType.php b/civicrm/CRM/Member/DAO/MembershipType.php
index 4b1d6ce509eb7a4ff4eee81e0c9afe5c163b364d..d904024ac47769101b9ad32ab4b899466490d0cf 100644
--- a/civicrm/CRM/Member/DAO/MembershipType.php
+++ b/civicrm/CRM/Member/DAO/MembershipType.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Member/MembershipType.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:713057d2c1a6dcb6cbd6449b8934d28c)
+ * (GenCodeChecksum:db300e3a7f5ca29a1b6ca43e0885bcb5)
  */
 
 /**
@@ -181,9 +181,12 @@ class CRM_Member_DAO_MembershipType extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Membership Types');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Membership Types') : ts('Membership Type');
   }
 
   /**
@@ -376,6 +379,7 @@ class CRM_Member_DAO_MembershipType extends CRM_Core_DAO {
           'type' => CRM_Utils_Type::T_STRING,
           'title' => ts('Membership Type Plan'),
           'description' => ts('Rolling membership period starts on signup date. Fixed membership periods start on fixed_period_start_day.'),
+          'required' => TRUE,
           'maxlength' => 8,
           'size' => CRM_Utils_Type::EIGHT,
           'where' => 'civicrm_membership_type.period_type',
diff --git a/civicrm/CRM/Member/Export/Form/Map.php b/civicrm/CRM/Member/Export/Form/Map.php
new file mode 100644
index 0000000000000000000000000000000000000000..9456d43e3e2cf44905ab66de2130c43a7efafcb5
--- /dev/null
+++ b/civicrm/CRM/Member/Export/Form/Map.php
@@ -0,0 +1,23 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ */
+
+/**
+ * This class gets the name of the file to upload
+ */
+class CRM_Member_Export_Form_Map extends CRM_Export_Form_Map {
+
+}
diff --git a/civicrm/CRM/Member/Export/Form/Select.php b/civicrm/CRM/Member/Export/Form/Select.php
new file mode 100644
index 0000000000000000000000000000000000000000..f4cc4bacd01518bb088553473cbbbc19c5abc4c3
--- /dev/null
+++ b/civicrm/CRM/Member/Export/Form/Select.php
@@ -0,0 +1,23 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ */
+
+/**
+ * This class gets the name of the file to upload
+ */
+class CRM_Member_Export_Form_Select extends CRM_Export_Form_Select {
+
+}
diff --git a/civicrm/CRM/Member/Form/Membership.php b/civicrm/CRM/Member/Form/Membership.php
index 14c2f28caaf83ff4efa801705f0594e1a4a6f043..cedf8eed66aa06deb27b1d1770d7e9f079e47a13 100644
--- a/civicrm/CRM/Member/Form/Membership.php
+++ b/civicrm/CRM/Member/Form/Membership.php
@@ -225,7 +225,9 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
           $cMemTypes[] = $mem['membership_type_id'];
         }
         if (count($cMemTypes) > 0) {
-          $memberorgs = CRM_Member_BAO_MembershipType::getMemberOfContactByMemTypes($cMemTypes);
+          foreach ($cMemTypes as $memTypeID) {
+            $memberorgs[$memTypeID] = CRM_Member_BAO_MembershipType::getMembershipType($memTypeID)['member_of_contact_id'];
+          }
           $mems_by_org = [];
           foreach ($contactMemberships as $mem) {
             $mem['member_of_contact_id'] = $memberorgs[$mem['membership_type_id']] ?? NULL;
@@ -759,8 +761,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
           $endDate = CRM_Utils_Date::processDate($params['end_date']);
         }
 
-        $membershipDetails = CRM_Member_BAO_MembershipType::getMembershipTypeDetails($memType);
-
+        $membershipDetails = CRM_Member_BAO_MembershipType::getMembershipType($memType);
         if ($startDate && CRM_Utils_Array::value('period_type', $membershipDetails) === 'rolling') {
           if ($startDate < $joinDate) {
             $errors['start_date'] = ts('Start date must be the same or later than Member since.');
@@ -822,7 +823,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
           $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($startDate,
             $endDate,
             $joinDate,
-            'today',
+            'now',
             TRUE,
             $memType,
             $params
@@ -1058,7 +1059,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     $isTest = ($this->_mode === 'test') ? 1 : 0;
     $this->storeContactFields($this->_params);
     $this->beginPostProcess();
-    $joinDate = $startDate = $endDate = NULL;
+    $endDate = NULL;
     $membershipTypes = $membership = $calcDate = [];
     $membershipType = NULL;
     $paymentInstrumentID = $this->_paymentProcessor['object']->getPaymentInstrumentID();
@@ -1177,15 +1178,9 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
       $params['exclude_is_admin'] = TRUE;
     }
 
-    // process date params to mysql date format.
-    $dateTypes = [
-      'join_date' => 'joinDate',
-      'start_date' => 'startDate',
-      'end_date' => 'endDate',
-    ];
-    foreach ($dateTypes as $dateField => $dateVariable) {
-      $$dateVariable = CRM_Utils_Date::processDate($formValues[$dateField]);
-    }
+    $joinDate = $formValues['join_date'];
+    $startDate = $formValues['start_date'];
+    $endDate = $formValues['end_date'];
 
     $memTypeNumTerms = empty($termsByType) ? CRM_Utils_Array::value('num_terms', $formValues) : NULL;
 
@@ -1200,7 +1195,7 @@ class CRM_Member_Form_Membership extends CRM_Member_Form {
     }
 
     foreach ($calcDates as $memType => $calcDate) {
-      foreach (array_keys($dateTypes) as $d) {
+      foreach (['join_date', 'start_date', 'end_date'] as $d) {
         //first give priority to form values then calDates.
         $date = $formValues[$d] ?? NULL;
         if (!$date) {
diff --git a/civicrm/CRM/Member/Form/MembershipRenewal.php b/civicrm/CRM/Member/Form/MembershipRenewal.php
index 908e51adc9a4a40f8d4570dc55c8865bd02f9d29..33cdd982559274485e5bf948891234a81e524b65 100644
--- a/civicrm/CRM/Member/Form/MembershipRenewal.php
+++ b/civicrm/CRM/Member/Form/MembershipRenewal.php
@@ -78,13 +78,6 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
    */
   public $_context;
 
-  /**
-   * End date of renewed membership.
-   *
-   * @var string
-   */
-  protected $endDate = NULL;
-
   /**
    * Has an email been sent.
    *
@@ -137,10 +130,11 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
     $this->assign('formClass', 'membershiprenew');
     parent::preProcess();
 
-    $this->assign('endDate', CRM_Utils_Date::customFormat(CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership',
-      $this->_id, 'end_date'
-    )
-    ));
+    // @todo - we should store this as a property & re-use in setDefaults - for now that's a bigger change.
+    $currentMembership = civicrm_api3('Membership', 'getsingle', ['id' => $this->_id]);
+    CRM_Member_BAO_Membership::fixMembershipStatusBeforeRenew($currentMembership);
+
+    $this->assign('endDate', $currentMembership['end_date']);
     $this->assign('membershipStatus',
       CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipStatus',
         CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership',
@@ -495,7 +489,7 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
     $now = CRM_Utils_Date::getToday(NULL, 'YmdHis');
     $this->assign('receive_date', CRM_Utils_Array::value('receive_date', $this->_params, date('Y-m-d H:i:s')));
     $this->processBillingAddress();
-    list($userName) = CRM_Contact_BAO_Contact_Location::getEmailDetails(CRM_Core_Session::singleton()->get('userID'));
+
     $this->_params['total_amount'] = CRM_Utils_Array::value('total_amount', $this->_params,
       CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipType', $this->_memType, 'minimum_fee')
     );
@@ -572,9 +566,6 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
 
     $renewalDate = !empty($this->_params['renewal_date']) ? $renewalDate = $this->_params['renewal_date'] : NULL;
 
-    // check for test membership.
-    $isTestMembership = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_Membership', $this->_membershipId, 'is_test');
-
     // chk for renewal for multiple terms CRM-8750
     $numRenewTerms = 1;
     if (is_numeric(CRM_Utils_Array::value('num_terms', $this->_params))) {
@@ -589,35 +580,31 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
 
     $pending = ($this->_params['contribution_status_id'] == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending'));
 
-    $membership = $this->processMembership(
-      $this->_contactID, $this->_params['membership_type_id'][1], $isTestMembership,
-      $renewalDate, $customFieldsFormatted, $numRenewTerms, $this->_membershipId,
-      $pending,
-      $contributionRecurID, $this->_params['is_pay_later']);
-
-    $this->endDate = CRM_Utils_Date::processDate($membership->end_date);
-
-    $this->membershipTypeName = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipType', $membership->membership_type_id,
-      'name');
+    $membershipParams = [
+      'id' => $this->_membershipId,
+      'membership_type_id' => $this->_params['membership_type_id'][1],
+      'modified_id' => $this->_contactID,
+      'custom' => $customFieldsFormatted,
+      'membership_activity_status' => ($pending || $this->_params['is_pay_later']) ? 'Scheduled' : 'Completed',
+      // Since we are renewing, make status override false.
+      'is_override' => FALSE,
+    ];
+    if ($contributionRecurID) {
+      $membershipParams['contribution_recur_id'] = $contributionRecurID;
+    }
+    $membership = $this->processMembership($membershipParams, $renewalDate, $numRenewTerms, $pending);
 
     if (!empty($this->_params['record_contribution']) || $this->_mode) {
       // set the source
+      [$userName] = CRM_Contact_BAO_Contact_Location::getEmailDetails(CRM_Core_Session::singleton()->get('userID'));
+      $this->membershipTypeName = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipType', $membership->membership_type_id,
+        'name');
       $this->_params['contribution_source'] = "{$this->membershipTypeName} Membership: Offline membership renewal (by {$userName})";
 
       //create line items
-      $lineItem = [];
       $this->_params = $this->setPriceSetParameters($this->_params);
 
-      $order = new CRM_Financial_BAO_Order();
-      $order->setPriceSelectionFromUnfilteredInput($this->_params);
-      $order->setPriceSetID(self::getPriceSetID($this->_params));
-      $order->setOverrideTotalAmount($this->_params['total_amount']);
-      $order->setOverrideFinancialTypeID((int) $this->_params['financial_type_id']);
-
-      $this->_params['lineItems'][$this->_priceSetId] = $order->getLineItems();
-      // This is one of those weird & wonderful legacy params we aim to get rid of.
-      $this->_params['processPriceSet'] = TRUE;
-      $this->_params['tax_amount'] = $order->getTotalTaxAmount();
+      $this->_params = array_merge($this->_params, $this->getOrderParams());
 
       //assign contribution contact id to the field expected by recordMembershipContribution
       if ($this->_contributorContactID != $this->_contactID) {
@@ -731,26 +718,21 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
    * This is duplicated from the BAO class - on the basis that it's actually easier to divide & conquer when
    * it comes to clearing up really bad code.
    *
-   * @param int $contactID
-   * @param int $membershipTypeID
-   * @param bool $is_test
-   * @param string $changeToday
-   * @param $customFieldsFormatted
+   * @param array $memParams
+   * @param bool $changeToday
    * @param $numRenewTerms
-   * @param int $membershipID
-   * @param $pending
-   * @param int $contributionRecurID
-   * @param $isPayLater
+   * @param bool $pending
    *
    * @return CRM_Member_BAO_Membership
    * @throws \CRM_Core_Exception
    * @throws \CiviCRM_API3_Exception
    */
-  public function processMembership($contactID, $membershipTypeID, $is_test, $changeToday, $customFieldsFormatted, $numRenewTerms, $membershipID, $pending, $contributionRecurID, $isPayLater) {
+  public function processMembership($memParams, $changeToday, $numRenewTerms, $pending) {
     $allStatus = CRM_Member_PseudoConstant::membershipStatus();
     $ids = [];
-    $currentMembership = civicrm_api3('Membership', 'getsingle', ['id' => $membershipID]);
+    $currentMembership = civicrm_api3('Membership', 'getsingle', ['id' => $memParams['id']]);
 
+    $memParams['join_date'] = $currentMembership['join_date'];
     // Do NOT do anything.
     //1. membership with status : PENDING/CANCELLED (CRM-2395)
     //2. Paylater/IPN renew. CRM-4556.
@@ -759,44 +741,27 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
       // CRM-15475
       array_search('Cancelled', CRM_Member_PseudoConstant::membershipStatus(NULL, " name = 'Cancelled' ", 'name', FALSE, TRUE)),
     ])) {
-      $memParams = [
-        'id' => $currentMembership['id'],
+      $memParams = array_merge($memParams, [
         'status_id' => $currentMembership['status_id'],
         'start_date' => $currentMembership['start_date'],
         'end_date' => $currentMembership['end_date'],
-        'join_date' => $currentMembership['join_date'],
-        'membership_type_id' => $membershipTypeID,
-        'membership_activity_status' => ($pending || $isPayLater) ? 'Scheduled' : 'Completed',
-      ];
-      if ($contributionRecurID) {
-        $memParams['contribution_recur_id'] = $contributionRecurID;
-      }
+      ]);
       return CRM_Member_BAO_Membership::create($memParams);
     }
 
-    // Check and fix the membership if it is STALE
-    CRM_Member_BAO_Membership::fixMembershipStatusBeforeRenew($currentMembership, $changeToday);
-
     $isMembershipCurrent = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipStatus', $currentMembership['status_id'], 'is_current_member');
 
     // CRM-7297 Membership Upsell - calculate dates based on new membership type
     $dates = CRM_Member_BAO_MembershipType::getRenewalDatesForMembershipType($currentMembership['id'],
       $changeToday,
-      $membershipTypeID,
+      $memParams['membership_type_id'],
       $numRenewTerms
     );
-    $memParams = [
-      'membership_type_id' => $membershipTypeID,
+    $memParams = array_merge($memParams, [
       'end_date' => $dates['end_date'] ?? NULL,
-      'join_date' => $currentMembership['join_date'],
       'start_date' => $isMembershipCurrent ? $currentMembership['start_date'] : ($dates['start_date'] ?? NULL),
-      'id' => $currentMembership['id'],
-      'is_test' => $is_test,
-      // Since we are renewing, make status override false.
-      'is_override' => FALSE,
-      'modified_id' => $contactID,
       'log_start_date' => $dates['log_start_date'],
-    ];
+    ]);
 
     // Now Renew the membership
     if ($isMembershipCurrent) {
@@ -804,16 +769,8 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
       if (!empty($currentMembership['id'])) {
         $ids['membership'] = $currentMembership['id'];
       }
-      $memParams['membership_activity_status'] = ($pending || $isPayLater) ? 'Scheduled' : 'Completed';
     }
 
-    // Putting this in an IF is precautionary as it seems likely that it would be ignored if empty, but
-    // perhaps shouldn't be?
-    if ($contributionRecurID) {
-      $memParams['contribution_recur_id'] = $contributionRecurID;
-    }
-
-    $memParams['custom'] = $customFieldsFormatted;
     // @todo stop passing $ids (membership and userId may be set by this point)
     $membership = CRM_Member_BAO_Membership::create($memParams, $ids);
 
@@ -824,4 +781,27 @@ class CRM_Member_Form_MembershipRenewal extends CRM_Member_Form {
     return $membership;
   }
 
+  /**
+   * Get order related params.
+   *
+   * In practice these are contribution params but later they cann be used with the Order api.
+   *
+   * @return array
+   *
+   * @throws \CiviCRM_API3_Exception
+   */
+  protected function getOrderParams(): array {
+    $order = new CRM_Financial_BAO_Order();
+    $order->setPriceSelectionFromUnfilteredInput($this->_params);
+    $order->setPriceSetID(self::getPriceSetID($this->_params));
+    $order->setOverrideTotalAmount($this->_params['total_amount']);
+    $order->setOverrideFinancialTypeID((int) $this->_params['financial_type_id']);
+    return [
+      'lineItems' => [$this->_priceSetId => $order->getLineItems()],
+      // This is one of those weird & wonderful legacy params we aim to get rid of.
+      'processPriceSet' => TRUE,
+      'tax_amount' => $order->getTotalTaxAmount(),
+    ];
+  }
+
 }
diff --git a/civicrm/CRM/Member/Form/Search.php b/civicrm/CRM/Member/Form/Search.php
index fc0ba94de0b5726dfd686625ffaba02c2277f031..dd937142ff660f6c8752cd2ec7e52b3e541722e4 100644
--- a/civicrm/CRM/Member/Form/Search.php
+++ b/civicrm/CRM/Member/Form/Search.php
@@ -63,6 +63,9 @@ class CRM_Member_Form_Search extends CRM_Core_Form_Search {
    * @throws \CiviCRM_API3_Exception
    */
   public function preProcess() {
+    // SearchFormName is deprecated & to be removed - the replacement is for the task to
+    // call $this->form->getSearchFormValues()
+    // A couple of extensions use it.
     $this->set('searchFormName', 'Search');
 
     $this->_actionButtonName = $this->getButtonName('next', 'action');
diff --git a/civicrm/CRM/Member/Form/Task.php b/civicrm/CRM/Member/Form/Task.php
index 5f5791d01ab0f3019f7f4f976364c6f5c5485101..6718d6eaebf1562e55e69fca363a4ea8b58cf965 100644
--- a/civicrm/CRM/Member/Form/Task.php
+++ b/civicrm/CRM/Member/Form/Task.php
@@ -41,21 +41,20 @@ class CRM_Member_Form_Task extends CRM_Core_Form_Task {
   }
 
   /**
-   * @param CRM_Core_Form $form
+   * @param \CRM_Core_Form_Task $form
    *
    * @throws \CRM_Core_Exception
    */
   public static function preProcessCommon(&$form) {
     $form->_memberIds = [];
 
-    $values = $form->controller->exportValues($form->get('searchFormName'));
+    $values = $form->getSearchFormValues();
 
     $form->_task = $values['task'];
     $tasks = CRM_Member_Task::permissionedTaskTitles(CRM_Core_Permission::getPermission());
     if (!array_key_exists($form->_task, $tasks)) {
       CRM_Core_Error::statusBounce(ts('You do not have permission to access this page.'));
     }
-    $form->assign('taskName', $tasks[$form->_task]);
 
     $ids = [];
     if ($values['radio_ts'] === 'ts_sel') {
diff --git a/civicrm/CRM/Member/Form/Task/SearchTaskHookSample.php b/civicrm/CRM/Member/Form/Task/SearchTaskHookSample.php
deleted file mode 100644
index d73ffc549f0930fb556a4f7826fc2d2b6d5719a3..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Member/Form/Task/SearchTaskHookSample.php
+++ /dev/null
@@ -1,71 +0,0 @@
-<?php
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
- */
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- */
-
-/**
- * This class provides the functionality to save a search
- * Saved Searches are used for saving frequently used queries
- */
-class CRM_Member_Form_Task_SearchTaskHookSample extends CRM_Member_Form_Task {
-
-  /**
-   * Build all the data structures needed to build the form.
-   *
-   * @return void
-   */
-  public function preProcess() {
-    parent::preProcess();
-    $rows = [];
-    // display name and membership details of all selected contacts
-    $memberIDs = implode(',', $this->_memberIds);
-
-    $query = "
-    SELECT mem.start_date  as start_date,
-           mem.end_date    as end_date,
-           mem.source      as source,
-           ct.display_name as display_name
-FROM       civicrm_membership mem
-INNER JOIN civicrm_contact ct ON ( mem.contact_id = ct.id )
-WHERE      mem.id IN ( $memberIDs )";
-
-    $dao = CRM_Core_DAO::executeQuery($query);
-    while ($dao->fetch()) {
-      $rows[] = [
-        'display_name' => $dao->display_name,
-        'start_date' => CRM_Utils_Date::customFormat($dao->start_date),
-        'end_date' => CRM_Utils_Date::customFormat($dao->end_date),
-        'source' => $dao->source,
-      ];
-    }
-    $this->assign('rows', $rows);
-  }
-
-  /**
-   * Build the form object.
-   *
-   * @return void
-   */
-  public function buildQuickForm() {
-    $this->addButtons([
-      [
-        'type' => 'done',
-        'name' => ts('Done'),
-        'isDefault' => TRUE,
-      ],
-    ]);
-  }
-
-}
diff --git a/civicrm/CRM/Member/Import/Parser/Membership.php b/civicrm/CRM/Member/Import/Parser/Membership.php
index 50e75e19ee31a7f0fb1525daab4d05bac0ad5872..6c1deb8c267eefb4004d56a62cb5273c45cca66c 100644
--- a/civicrm/CRM/Member/Import/Parser/Membership.php
+++ b/civicrm/CRM/Member/Import/Parser/Membership.php
@@ -308,9 +308,6 @@ class CRM_Member_Import_Parser_Membership extends CRM_Member_Import_Parser {
               $params[$key] = $this->parsePseudoConstantField($val, $this->fieldMetadata[$key]);
               break;
 
-            case 'member_is_override':
-              $params[$key] = CRM_Utils_String::strtobool($val);
-              break;
           }
           if ($customFieldID = CRM_Core_BAO_CustomField::getKeyID($key)) {
             if ($customFields[$customFieldID]['data_type'] == 'Date') {
@@ -371,20 +368,9 @@ class CRM_Member_Import_Parser_Membership extends CRM_Member_Import_Parser {
               CRM_Price_BAO_LineItem::getLineItemArray($formatted, NULL, 'membership', $formatted['membership_type_id']);
             }
 
-            // @todo stop passing $ids array (and put details in $formatted if required)
-            $ids = [
-              'membership' => $formatValues['membership_id'],
-              'userId' => $session->get('userID'),
-            ];
-            $newMembership = CRM_Member_BAO_Membership::create($formatted, $ids, TRUE);
-            if (civicrm_error($newMembership)) {
-              array_unshift($values, $newMembership['is_error'] . ' for Membership ID ' . $formatValues['membership_id'] . '. Row was skipped.');
-              return CRM_Import_Parser::ERROR;
-            }
-            else {
-              $this->_newMemberships[] = $newMembership->id;
-              return CRM_Import_Parser::VALID;
-            }
+            $newMembership = civicrm_api3('Membership', 'create', $formatted);
+            $this->_newMemberships[] = $newMembership['id'];
+            return CRM_Import_Parser::VALID;
           }
           else {
             array_unshift($values, 'Matching Membership record not found for Membership ID ' . $formatValues['membership_id'] . '. Row was skipped.');
@@ -428,7 +414,7 @@ class CRM_Member_Import_Parser_Membership extends CRM_Member_Import_Parser {
             $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($startDate,
               $endDate,
               $joinDate,
-              'today',
+              'now',
               $excludeIsAdmin,
               $formatted['membership_type_id'],
               $formatted
@@ -518,7 +504,7 @@ class CRM_Member_Import_Parser_Membership extends CRM_Member_Import_Parser {
         $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($startDate,
           $endDate,
           $joinDate,
-          'today',
+          'now',
           $excludeIsAdmin,
           $formatted['membership_type_id'],
           $formatted
diff --git a/civicrm/CRM/Member/Page/Tab.php b/civicrm/CRM/Member/Page/Tab.php
index ec2300d0ba5d783486b7fc675551eda146760f80..584497abaa05f417d19f150f10d5a8b59355cff9 100644
--- a/civicrm/CRM/Member/Page/Tab.php
+++ b/civicrm/CRM/Member/Page/Tab.php
@@ -48,6 +48,23 @@ class CRM_Member_Page_Tab extends CRM_Core_Page {
     $permissions = [CRM_Core_Permission::VIEW];
     if (CRM_Core_Permission::check('edit memberships')) {
       $permissions[] = CRM_Core_Permission::EDIT;
+      $linkButtons['add_membership'] = [
+        'title' => ts('Add Membership'),
+        'url' => 'civicrm/contact/view/membership',
+        'qs' => "reset=1&action=add&cid={$this->_contactId}&context=membership",
+        'icon' => 'fa-plus-circle',
+        'accessKey' => 'N',
+      ];
+      if ($this->_accessContribution && CRM_Core_Config::isEnabledBackOfficeCreditCardPayments()) {
+        $linkButtons['creditcard_membership'] = [
+          'title' => ts('Submit Credit Card Membership'),
+          'url' => 'civicrm/contact/view/membership',
+          'qs' => "reset=1&action=add&cid={$this->_contactId}&context=membership&mode=live",
+          'icon' => 'fa-credit-card',
+          'accessKey' => 'C',
+        ];
+      }
+      $this->assign('linkButtons', $linkButtons ?? []);
     }
     if (CRM_Core_Permission::check('delete in CiviMember')) {
       $permissions[] = CRM_Core_Permission::DELETE;
@@ -317,10 +334,7 @@ class CRM_Member_Page_Tab extends CRM_Core_Page {
     $this->preProcess();
 
     // check if we can process credit card membership
-    $newCredit = CRM_Core_Config::isEnabledBackOfficeCreditCardPayments();
-    $this->assign('newCredit', $newCredit);
-
-    if ($newCredit) {
+    if (CRM_Core_Config::isEnabledBackOfficeCreditCardPayments()) {
       $this->_isPaymentProcessor = TRUE;
     }
     else {
@@ -590,7 +604,7 @@ class CRM_Member_Page_Tab extends CRM_Core_Page {
     $controller->setEmbedded(TRUE);
     $controller->reset();
     $controller->set('force', 1);
-    $controller->set('cid', $contactId);
+    $controller->set('skip_cid', TRUE);
     $controller->set('memberId', $membershipId);
     $controller->set('context', 'contribution');
     $controller->process();
diff --git a/civicrm/CRM/Member/Task.php b/civicrm/CRM/Member/Task.php
index 661f2a72fc00f3b1a29b7519b331edbdc245f1d2..5b298c1d1c843732cbe4f05eb5cac8074b59dbf9 100644
--- a/civicrm/CRM/Member/Task.php
+++ b/civicrm/CRM/Member/Task.php
@@ -40,78 +40,76 @@ class CRM_Member_Task extends CRM_Core_Task {
    *   the set of tasks for a group of contacts
    */
   public static function tasks() {
-    if (!self::$_tasks) {
-      self::$_tasks = [
-        self::TASK_DELETE => [
-          'title' => ts('Delete memberships'),
-          'class' => 'CRM_Member_Form_Task_Delete',
-          'result' => FALSE,
+    self::$_tasks = [
+      self::TASK_DELETE => [
+        'title' => ts('Delete memberships'),
+        'class' => 'CRM_Member_Form_Task_Delete',
+        'result' => FALSE,
+      ],
+      self::TASK_PRINT => [
+        'title' => ts('Print selected rows'),
+        'class' => 'CRM_Member_Form_Task_Print',
+        'result' => FALSE,
+      ],
+      self::TASK_EXPORT => [
+        'title' => ts('Export members'),
+        'class' => [
+          'CRM_Member_Export_Form_Select',
+          'CRM_Member_Export_Form_Map',
         ],
-        self::TASK_PRINT => [
-          'title' => ts('Print selected rows'),
-          'class' => 'CRM_Member_Form_Task_Print',
-          'result' => FALSE,
+        'result' => FALSE,
+      ],
+      self::TASK_EMAIL => [
+        'title' => ts('Email - send now (to %1 or less)', [
+          1 => Civi::settings()
+            ->get('simple_mail_limit'),
+        ]),
+        'class' => 'CRM_Member_Form_Task_Email',
+        'result' => TRUE,
+      ],
+      self::BATCH_UPDATE => [
+        'title' => ts('Update multiple memberships'),
+        'class' => [
+          'CRM_Member_Form_Task_PickProfile',
+          'CRM_Member_Form_Task_Batch',
         ],
-        self::TASK_EXPORT => [
-          'title' => ts('Export members'),
-          'class' => [
-            'CRM_Export_Form_Select',
-            'CRM_Export_Form_Map',
-          ],
-          'result' => FALSE,
+        'result' => TRUE,
+      ],
+      self::LABEL_MEMBERS => [
+        'title' => ts('Mailing labels - print'),
+        'class' => [
+          'CRM_Member_Form_Task_Label',
         ],
-        self::TASK_EMAIL => [
-          'title' => ts('Email - send now (to %1 or less)', [
-            1 => Civi::settings()
-              ->get('simple_mail_limit'),
-          ]),
-          'class' => 'CRM_Member_Form_Task_Email',
-          'result' => TRUE,
-        ],
-        self::BATCH_UPDATE => [
-          'title' => ts('Update multiple memberships'),
-          'class' => [
-            'CRM_Member_Form_Task_PickProfile',
-            'CRM_Member_Form_Task_Batch',
-          ],
-          'result' => TRUE,
-        ],
-        self::LABEL_MEMBERS => [
-          'title' => ts('Mailing labels - print'),
-          'class' => [
-            'CRM_Member_Form_Task_Label',
-          ],
-          'result' => TRUE,
-        ],
-        self::PDF_LETTER => [
-          'title' => ts('Print/merge document for memberships'),
-          'class' => 'CRM_Member_Form_Task_PDFLetter',
-          'result' => FALSE,
-        ],
-        self::SAVE_SEARCH => [
-          'title' => ts('Group - create smart group'),
-          'class' => 'CRM_Contact_Form_Task_SaveSearch',
-          'result' => TRUE,
-        ],
-        self::SAVE_SEARCH_UPDATE => [
-          'title' => ts('Group - update smart group'),
-          'class' => 'CRM_Contact_Form_Task_SaveSearch_Update',
-          'result' => TRUE,
-        ],
-      ];
-
-      //CRM-4418, check for delete
-      if (!CRM_Core_Permission::check('delete in CiviMember')) {
-        unset(self::$_tasks[self::TASK_DELETE]);
-      }
-      //CRM-12920 - check for edit permission
-      if (!CRM_Core_Permission::check('edit memberships')) {
-        unset(self::$_tasks[self::BATCH_UPDATE]);
-      }
+        'result' => TRUE,
+      ],
+      self::PDF_LETTER => [
+        'title' => ts('Print/merge document for memberships'),
+        'class' => 'CRM_Member_Form_Task_PDFLetter',
+        'result' => FALSE,
+      ],
+      self::SAVE_SEARCH => [
+        'title' => ts('Group - create smart group'),
+        'class' => 'CRM_Contact_Form_Task_SaveSearch',
+        'result' => TRUE,
+      ],
+      self::SAVE_SEARCH_UPDATE => [
+        'title' => ts('Group - update smart group'),
+        'class' => 'CRM_Contact_Form_Task_SaveSearch_Update',
+        'result' => TRUE,
+      ],
+    ];
 
-      parent::tasks();
+    //CRM-4418, check for delete
+    if (!CRM_Core_Permission::check('delete in CiviMember')) {
+      unset(self::$_tasks[self::TASK_DELETE]);
+    }
+    //CRM-12920 - check for edit permission
+    if (!CRM_Core_Permission::check('edit memberships')) {
+      unset(self::$_tasks[self::BATCH_UPDATE]);
     }
 
+    parent::tasks();
+
     return self::$_tasks;
   }
 
diff --git a/civicrm/CRM/PCP/BAO/PCP.php b/civicrm/CRM/PCP/BAO/PCP.php
index e71609eccd31abec138687a9913c977ea0fdd0b3..6fdd36d0275380d8eb62600bce4d631c9174aed5 100644
--- a/civicrm/CRM/PCP/BAO/PCP.php
+++ b/civicrm/CRM/PCP/BAO/PCP.php
@@ -88,8 +88,6 @@ WHERE  civicrm_pcp.contact_id = civicrm_contact.id
    *   array of Pcp if found
    */
   public static function getPcpDashboardInfo($contactId) {
-    $links = self::pcpLinks();
-
     $query = '
 SELECT pcp.*, block.is_tellfriend_enabled FROM civicrm_pcp pcp
 LEFT JOIN civicrm_pcp_block block ON block.id = pcp.pcp_block_id
@@ -98,13 +96,13 @@ WHERE pcp.is_active = 1
 ORDER BY page_type, page_id';
 
     $params = [1 => [$contactId, 'Integer']];
-
     $pcpInfoDao = CRM_Core_DAO::executeQuery($query, $params);
-    $pcpInfo = [];
-    $hide = $mask = array_sum(array_keys($links['all']));
-    $contactPCPPages = [];
 
+    $links = self::pcpLinks();
+    $hide = $mask = array_sum(array_keys($links['all']));
     $approved = CRM_Core_PseudoConstant::getKey('CRM_PCP_BAO_PCP', 'status_id', 'Approved');
+    $contactPCPPages = [];
+    $pcpInfo = [];
 
     while ($pcpInfoDao->fetch()) {
       $mask = $hide;
@@ -264,10 +262,13 @@ WHERE pcp.id = %1 AND cc.contribution_status_id = %2 AND cc.is_test = 0";
   /**
    * Get action links.
    *
+   * @param int $pcpId
+   *   Contains the pcp ID. Defaults to NULL for backwards compatibility.
+   *
    * @return array
    *   (reference) of action links
    */
-  public static function &pcpLinks() {
+  public static function &pcpLinks($pcpId = NULL) {
     if (!(self::$_pcpLinks)) {
       $deleteExtra = ts('Are you sure you want to delete this Personal Campaign Page?') . '\n' . ts('This action cannot be undone.');
 
@@ -326,6 +327,8 @@ WHERE pcp.id = %1 AND cc.contribution_status_id = %2 AND cc.is_test = 0";
           'title' => ts('Delete'),
         ],
       ];
+
+      CRM_Utils_Hook::links('pcp.user.actions', 'Pcp', $pcpId, self::$_pcpLinks);
     }
     return self::$_pcpLinks;
   }
diff --git a/civicrm/CRM/PCP/DAO/PCP.php b/civicrm/CRM/PCP/DAO/PCP.php
index eb565696754516f8e27286cbf045c7a7e826fa8e..bd3fedb7800fa0353ac3630e053c1988e00e7d9d 100644
--- a/civicrm/CRM/PCP/DAO/PCP.php
+++ b/civicrm/CRM/PCP/DAO/PCP.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/PCP/PCP.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:286225e46c4e2f3c12b17cd5f83b210d)
+ * (GenCodeChecksum:2232571099c216fb7a823556f5bd8328)
  */
 
 /**
@@ -138,9 +138,12 @@ class CRM_PCP_DAO_PCP extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('PCPs');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('PCPs') : ts('PCP');
   }
 
   /**
diff --git a/civicrm/CRM/PCP/DAO/PCPBlock.php b/civicrm/CRM/PCP/DAO/PCPBlock.php
index 74f5204bebd1689474013f8bbceada3d53e39dd0..711dc584c95971859b0ec2a695b62237c6dfe39c 100644
--- a/civicrm/CRM/PCP/DAO/PCPBlock.php
+++ b/civicrm/CRM/PCP/DAO/PCPBlock.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/PCP/PCPBlock.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:ea1b4158570c5a79356b1dc0ad80db6a)
+ * (GenCodeChecksum:2039aecf7902bf0fda7f91081778b1c8)
  */
 
 /**
@@ -129,9 +129,12 @@ class CRM_PCP_DAO_PCPBlock extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('PCPBlocks');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('PCPBlocks') : ts('PCPBlock');
   }
 
   /**
diff --git a/civicrm/CRM/PCP/Page/PCPInfo.php b/civicrm/CRM/PCP/Page/PCPInfo.php
index 437ef4d968e9ff62da9c30ef36dc5633b8a84101..38140ba235b12993c2be79b3211648b939607eea 100644
--- a/civicrm/CRM/PCP/Page/PCPInfo.php
+++ b/civicrm/CRM/PCP/Page/PCPInfo.php
@@ -141,7 +141,7 @@ class CRM_PCP_Page_PCPInfo extends CRM_Core_Page {
 
       $this->assign('owner', $owner);
 
-      $link = CRM_PCP_BAO_PCP::pcpLinks();
+      $link = CRM_PCP_BAO_PCP::pcpLinks($pcpInfo['id']);
 
       $hints = [
         CRM_Core_Action::UPDATE => ts('Change the content and appearance of your page'),
diff --git a/civicrm/CRM/Pledge/BAO/Pledge.php b/civicrm/CRM/Pledge/BAO/Pledge.php
index 31f8fbc3c4003ea78f2136fe9423f1e6ed1b8f9f..9bc13cda3129ec13397964d09e3972e705a993f5 100644
--- a/civicrm/CRM/Pledge/BAO/Pledge.php
+++ b/civicrm/CRM/Pledge/BAO/Pledge.php
@@ -587,13 +587,13 @@ GROUP BY  currency
     foreach ($fields as $key => $val) {
       $returnProperties[$val] = TRUE;
     }
-    $details = CRM_Utils_Token::getTokenDetails($ids,
+    [$details] = CRM_Utils_Token::getTokenDetails($ids,
       $returnProperties,
       TRUE, TRUE, NULL,
       $tokens,
       get_class($form)
     );
-    $form->assign('contact', $details[0][$params['contact_id']]);
+    $form->assign('contact', $details[$params['contact_id']]);
 
     // handle custom data.
     if (!empty($params['hidden_custom'])) {
diff --git a/civicrm/CRM/Pledge/Controller/Search.php b/civicrm/CRM/Pledge/Controller/Search.php
index 527375d07d0ba5da25f6985662969509460ad5eb..4b532f2053f88dc9cde85ab7ee2d3892aa34936c 100644
--- a/civicrm/CRM/Pledge/Controller/Search.php
+++ b/civicrm/CRM/Pledge/Controller/Search.php
@@ -27,6 +27,8 @@
  */
 class CRM_Pledge_Controller_Search extends CRM_Core_Controller {
 
+  protected $entity = 'Pledge';
+
   /**
    * Class constructor.
    *
@@ -44,8 +46,8 @@ class CRM_Pledge_Controller_Search extends CRM_Core_Controller {
     $this->addPages($this->_stateMachine, $action);
 
     // add all the actions
-    $config = CRM_Core_Config::singleton();
     $this->addActions();
+    $this->set('entity', $this->entity);
   }
 
 }
diff --git a/civicrm/CRM/Pledge/DAO/Pledge.php b/civicrm/CRM/Pledge/DAO/Pledge.php
index 5f5a7632ed42f0422aae8074942ad8065b08952c..2a2f80900d6868bc00240d0941a4cda342078f4a 100644
--- a/civicrm/CRM/Pledge/DAO/Pledge.php
+++ b/civicrm/CRM/Pledge/DAO/Pledge.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Pledge/Pledge.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:27003a5c2de79b60b4114bc92b65cc07)
+ * (GenCodeChecksum:0447b8be2ab956b77d0d6be123e0bdb4)
  */
 
 /**
@@ -206,9 +206,12 @@ class CRM_Pledge_DAO_Pledge extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Pledges');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Pledges') : ts('Pledge');
   }
 
   /**
diff --git a/civicrm/CRM/Pledge/DAO/PledgeBlock.php b/civicrm/CRM/Pledge/DAO/PledgeBlock.php
index 989b14383d7a69eec50cbc6f77f234a427ff31e2..111d085910e9398acecb31756b2f1c9b60fde297 100644
--- a/civicrm/CRM/Pledge/DAO/PledgeBlock.php
+++ b/civicrm/CRM/Pledge/DAO/PledgeBlock.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Pledge/PledgeBlock.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:bf3640355f445e127c25402500d79668)
+ * (GenCodeChecksum:2b02296af6d4e280950d483d222b20b9)
  */
 
 /**
@@ -117,9 +117,12 @@ class CRM_Pledge_DAO_PledgeBlock extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Pledge Blocks');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Pledge Blocks') : ts('Pledge Block');
   }
 
   /**
diff --git a/civicrm/CRM/Pledge/DAO/PledgePayment.php b/civicrm/CRM/Pledge/DAO/PledgePayment.php
index 234a5342b2f73204ab0f2e8b3c3c1bd56724c024..bb88db54a733cfbd2c533005a92c3e0d8f5a8f4b 100644
--- a/civicrm/CRM/Pledge/DAO/PledgePayment.php
+++ b/civicrm/CRM/Pledge/DAO/PledgePayment.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Pledge/PledgePayment.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:c47a2cbc83c672a8209bc5e725b2f81a)
+ * (GenCodeChecksum:b3b6719f4f4a8c441f271213ff7f52db)
  */
 
 /**
@@ -106,9 +106,12 @@ class CRM_Pledge_DAO_PledgePayment extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Pledge Payments');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Pledge Payments') : ts('Pledge Payment');
   }
 
   /**
diff --git a/civicrm/CRM/Pledge/Form/Task.php b/civicrm/CRM/Pledge/Form/Task.php
index 2dc623f2fc777b61ffeb4f8aef457990192807e1..12df902a9169ea1fbb03de84d507f3577b20a359 100644
--- a/civicrm/CRM/Pledge/Form/Task.php
+++ b/civicrm/CRM/Pledge/Form/Task.php
@@ -46,8 +46,6 @@ class CRM_Pledge_Form_Task extends CRM_Core_Form_Task {
     $values = $form->controller->exportValues('Search');
 
     $form->_task = $values['task'];
-    $pledgeTasks = CRM_Pledge_Task::tasks();
-    $form->assign('taskName', $pledgeTasks[$form->_task]);
 
     $ids = [];
     if ($values['radio_ts'] == 'ts_sel') {
diff --git a/civicrm/CRM/Pledge/Form/Task/SearchTaskHookSample.php b/civicrm/CRM/Pledge/Form/Task/SearchTaskHookSample.php
deleted file mode 100644
index 5af8bf1e5bd0cd8729d552583480808fb3074dd6..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Pledge/Form/Task/SearchTaskHookSample.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
- */
-
-/**
- *
- * @package CRM
- * @copyright CiviCRM LLC https://civicrm.org/licensing
- */
-
-/**
- * This class provides the functionality to save a search
- * Saved Searches are used for saving frequently used queries
- */
-class CRM_Pledge_Form_Task_SearchTaskHookSample extends CRM_Pledge_Form_Task {
-
-  /**
-   * Build all the data structures needed to build the form.
-   */
-  public function preProcess() {
-    parent::preProcess();
-    $rows = [];
-    // display name and pledge details of all selected contacts
-    $pledgeIDs = implode(',', $this->_pledgeIds);
-
-    $query = "
-    SELECT plg.amount      as amount,
-           plg.create_date as create_date,
-           ct.display_name as display_name
-      FROM civicrm_pledge plg
-INNER JOIN civicrm_contact ct ON ( plg.contact_id = ct.id )
-     WHERE plg.id IN ( $pledgeIDs )";
-
-    $dao = CRM_Core_DAO::executeQuery($query);
-    while ($dao->fetch()) {
-      $rows[] = [
-        'display_name' => $dao->display_name,
-        'amount' => $dao->amount,
-        'create_date' => CRM_Utils_Date::customFormat($dao->create_date),
-      ];
-    }
-    $this->assign('rows', $rows);
-  }
-
-  /**
-   * Build the form object.
-   */
-  public function buildQuickForm() {
-    $this->addButtons([
-        [
-          'type' => 'done',
-          'name' => ts('Done'),
-          'isDefault' => TRUE,
-        ],
-    ]);
-  }
-
-}
diff --git a/civicrm/CRM/Price/BAO/LineItem.php b/civicrm/CRM/Price/BAO/LineItem.php
index b25c02c37c51820ec9a1eee01733ebaa89b51838..dfaf89f0639daf6c6ed56dfb50b2f5a8f28c5a47 100644
--- a/civicrm/CRM/Price/BAO/LineItem.php
+++ b/civicrm/CRM/Price/BAO/LineItem.php
@@ -26,7 +26,7 @@ class CRM_Price_BAO_LineItem extends CRM_Price_DAO_LineItem {
    * @param array $params
    *   (reference) an assoc array of name/value pairs.
    *
-   * @return \CRM_Price_DAO_LineItem
+   * @return CRM_Price_BAO_LineItem
    *
    * @throws \CiviCRM_API3_Exception
    * @throws \Exception
@@ -35,11 +35,9 @@ class CRM_Price_BAO_LineItem extends CRM_Price_DAO_LineItem {
     $id = $params['id'] ?? NULL;
     if ($id) {
       CRM_Utils_Hook::pre('edit', 'LineItem', $id, $params);
-      $op = CRM_Core_Action::UPDATE;
     }
     else {
-      CRM_Utils_Hook::pre('create', 'LineItem', $params['entity_id'], $params);
-      $op = CRM_Core_Action::ADD;
+      CRM_Utils_Hook::pre('create', 'LineItem', $id, $params);
     }
 
     // unset entity table and entity id in $params
@@ -54,21 +52,18 @@ class CRM_Price_BAO_LineItem extends CRM_Price_DAO_LineItem {
         $params['unit_price'] = 0;
       }
     }
-    if (CRM_Financial_BAO_FinancialType::isACLFinancialTypeStatus() && !empty($params['check_permissions'])) {
-      if (empty($params['financial_type_id'])) {
-        throw new Exception('Mandatory key(s) missing from params array: financial_type_id');
-      }
-      CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($types, $op);
-      if (!in_array($params['financial_type_id'], array_keys($types))) {
-        throw new Exception('You do not have permission to create this line item');
-      }
+
+    $taxRates = CRM_Core_PseudoConstant::getTaxRates();
+    if (isset($params['financial_type_id'], $params['line_total'], $taxRates[$params['financial_type_id']])) {
+      $taxRate = $taxRates[$params['financial_type_id']];
+      $params['tax_amount'] = ($taxRate / 100) * $params['line_total'];
     }
 
     $lineItemBAO = new CRM_Price_BAO_LineItem();
     $lineItemBAO->copyValues($params);
 
     $return = $lineItemBAO->save();
-    if ($lineItemBAO->entity_table == 'civicrm_membership' && $lineItemBAO->contribution_id && $lineItemBAO->entity_id) {
+    if ($lineItemBAO->entity_table === 'civicrm_membership' && $lineItemBAO->contribution_id && $lineItemBAO->entity_id) {
       $membershipPaymentParams = [
         'membership_id' => $lineItemBAO->entity_id,
         'contribution_id' => $lineItemBAO->contribution_id,
diff --git a/civicrm/CRM/Price/BAO/PriceSet.php b/civicrm/CRM/Price/BAO/PriceSet.php
index d2c1643071a2aa24f8b65f24e6ff20f2071a0a2d..e12716861383e02f28b418e3eeda14fb9d29c76d 100644
--- a/civicrm/CRM/Price/BAO/PriceSet.php
+++ b/civicrm/CRM/Price/BAO/PriceSet.php
@@ -574,7 +574,7 @@ WHERE  id = %1";
         switch ($entityTable) {
           case 'civicrm_event':
             $entity = 'participant';
-            if (CRM_Utils_System::getClassName($form) == 'CRM_Event_Form_Participant') {
+            if (in_array(CRM_Utils_System::getClassName($form), ['CRM_Event_Form_Participant', 'CRM_Event_Form_Task_Register'])) {
               $entityId = $form->_id;
             }
             else {
@@ -673,7 +673,7 @@ WHERE  id = %1";
         continue;
       }
 
-      list($params, $lineItem) = self::getLine($params, $lineItem, $priceSetID, $field, $id, $totalPrice);
+      list($params, $lineItem) = self::getLine($params, $lineItem, $priceSetID, $field, $id);
     }
 
     $amount_level = [];
@@ -1234,16 +1234,20 @@ INNER JOIN  civicrm_price_set pset    ON ( pset.id = field.price_set_id )
   }
 
   /**
-   * @param $ids
+   * Return a count of priceFieldValueIDs that are memberships by organisation and membership type
+   *
+   * @param string $priceFieldValueIDs
+   *   Comma separated string of priceFieldValue IDs
    *
    * @return array
+   *   Returns an array of counts by membership organisation
    */
-  public static function getMembershipCount($ids) {
+  public static function getMembershipCount($priceFieldValueIDs) {
     $queryString = "
 SELECT       count( pfv.id ) AS count, mt.member_of_contact_id AS id
 FROM         civicrm_price_field_value pfv
 INNER JOIN    civicrm_membership_type mt ON mt.id = pfv.membership_type_id
-WHERE        pfv.id IN ( $ids )
+WHERE        pfv.id IN ( $priceFieldValueIDs )
 GROUP BY     mt.member_of_contact_id ";
 
     $crmDAO = CRM_Core_DAO::executeQuery($queryString);
@@ -1690,11 +1694,10 @@ WHERE     ct.id = cp.financial_type_id AND
    * @param int $priceSetID
    * @param array $field
    * @param int $id
-   * @param float $totalPrice
    *
    * @return array
    */
-  public static function getLine(&$params, &$lineItem, $priceSetID, $field, $id, $totalPrice): array {
+  public static function getLine(&$params, &$lineItem, $priceSetID, $field, $id): array {
     $totalTax = 0;
     switch ($field['html_type']) {
       case 'Text':
@@ -1714,7 +1717,6 @@ WHERE     ct.id = cp.financial_type_id AND
         if (!empty($field['options'][$optionValueId]['tax_rate'])) {
           $lineItem = self::setLineItem($field, $lineItem, $optionValueId, $totalTax);
         }
-        $totalPrice += $lineItem[$firstOption['id']]['line_total'] + CRM_Utils_Array::value('tax_amount', $lineItem[key($field['options'])]);
         break;
 
       case 'Radio':
@@ -1744,7 +1746,6 @@ WHERE     ct.id = cp.financial_type_id AND
             $lineItem[$optionValueId]['line_total'] = $lineItem[$optionValueId]['unit_price'] = CRM_Utils_Rule::cleanMoney($lineItem[$optionValueId]['line_total'] - $lineItem[$optionValueId]['tax_amount']);
           }
         }
-        $totalPrice += $lineItem[$optionValueId]['line_total'] + CRM_Utils_Array::value('tax_amount', $lineItem[$optionValueId]);
         break;
 
       case 'Select':
@@ -1755,7 +1756,6 @@ WHERE     ct.id = cp.financial_type_id AND
         if (!empty($field['options'][$optionValueId]['tax_rate'])) {
           $lineItem = self::setLineItem($field, $lineItem, $optionValueId, $totalTax);
         }
-        $totalPrice += $lineItem[$optionValueId]['line_total'] + CRM_Utils_Array::value('tax_amount', $lineItem[$optionValueId]);
         break;
 
       case 'CheckBox':
@@ -1765,7 +1765,6 @@ WHERE     ct.id = cp.financial_type_id AND
           if (!empty($field['options'][$optionId]['tax_rate'])) {
             $lineItem = self::setLineItem($field, $lineItem, $optionId, $totalTax);
           }
-          $totalPrice += $lineItem[$optionId]['line_total'] + CRM_Utils_Array::value('tax_amount', $lineItem[$optionId]);
         }
         break;
     }
diff --git a/civicrm/CRM/Price/DAO/LineItem.php b/civicrm/CRM/Price/DAO/LineItem.php
index 2ad0da2b2957c832bd1f7e75beadee464af8ab31..82cea2af7f512d1b3cd2966176db187513fe6d3e 100644
--- a/civicrm/CRM/Price/DAO/LineItem.php
+++ b/civicrm/CRM/Price/DAO/LineItem.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Price/LineItem.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7403b3615b0225350d893750a547061a)
+ * (GenCodeChecksum:c9962dd4253fbcf43073bf10fbb0ce86)
  */
 
 /**
@@ -138,9 +138,12 @@ class CRM_Price_DAO_LineItem extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Line Items');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Line Items') : ts('Line Item');
   }
 
   /**
@@ -235,6 +238,12 @@ class CRM_Price_DAO_LineItem extends CRM_Core_DAO {
           'bao' => 'CRM_Price_BAO_LineItem',
           'localizable' => 0,
           'FKClassName' => 'CRM_Price_DAO_PriceField',
+          'pseudoconstant' => [
+            'table' => 'civicrm_price_field',
+            'keyColumn' => 'id',
+            'labelColumn' => 'label',
+            'nameColumn' => 'name',
+          ],
           'add' => '1.7',
         ],
         'label' => [
@@ -340,12 +349,18 @@ class CRM_Price_DAO_LineItem extends CRM_Core_DAO {
           'bao' => 'CRM_Price_BAO_LineItem',
           'localizable' => 0,
           'FKClassName' => 'CRM_Price_DAO_PriceFieldValue',
+          'pseudoconstant' => [
+            'table' => 'civicrm_price_field_value',
+            'keyColumn' => 'id',
+            'labelColumn' => 'label',
+            'nameColumn' => 'name',
+          ],
           'add' => '3.3',
         ],
         'financial_type_id' => [
           'name' => 'financial_type_id',
           'type' => CRM_Utils_Type::T_INT,
-          'title' => ts('Financial Type'),
+          'title' => ts('Financial Type ID'),
           'description' => ts('FK to Financial Type.'),
           'where' => 'civicrm_line_item.financial_type_id',
           'default' => 'NULL',
@@ -356,6 +371,7 @@ class CRM_Price_DAO_LineItem extends CRM_Core_DAO {
           'FKClassName' => 'CRM_Financial_DAO_FinancialType',
           'html' => [
             'type' => 'Select',
+            'label' => ts("Financial Type"),
           ],
           'pseudoconstant' => [
             'table' => 'civicrm_financial_type',
diff --git a/civicrm/CRM/Price/DAO/PriceField.php b/civicrm/CRM/Price/DAO/PriceField.php
index e14f60999bfe2a6297e858f5b9d80d48b781b181..2f5d0d653ae9dc9139a445fb941b0b060334e8be 100644
--- a/civicrm/CRM/Price/DAO/PriceField.php
+++ b/civicrm/CRM/Price/DAO/PriceField.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Price/PriceField.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:1492c6421f1c3cb49dcab88bc411075c)
+ * (GenCodeChecksum:fdebc45a7d5c35abb0c9c480dbf201b2)
  */
 
 /**
@@ -157,9 +157,12 @@ class CRM_Price_DAO_PriceField extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Price Fields');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Price Fields') : ts('Price Field');
   }
 
   /**
diff --git a/civicrm/CRM/Price/DAO/PriceFieldValue.php b/civicrm/CRM/Price/DAO/PriceFieldValue.php
index c7c8e0913e40b12bf692fa82ba8d990383b35068..2057dd655d566bd7a4f6fb56afa4bac4883ebea2 100644
--- a/civicrm/CRM/Price/DAO/PriceFieldValue.php
+++ b/civicrm/CRM/Price/DAO/PriceFieldValue.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Price/PriceFieldValue.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:a1acc613daec86c6049e545af5fc7fd1)
+ * (GenCodeChecksum:16987d2cc463a2d9290339ad37070f16)
  */
 
 /**
@@ -166,9 +166,12 @@ class CRM_Price_DAO_PriceFieldValue extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Price Field Values');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Price Field Values') : ts('Price Field Value');
   }
 
   /**
diff --git a/civicrm/CRM/Price/DAO/PriceSet.php b/civicrm/CRM/Price/DAO/PriceSet.php
index 1dd84351706af0cc2ba0050d707cdb5ffdd8f307..3c62426ff712a2d68b923194868348a700469192 100644
--- a/civicrm/CRM/Price/DAO/PriceSet.php
+++ b/civicrm/CRM/Price/DAO/PriceSet.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Price/PriceSet.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:52d1fb1b25eaa8f1c157012bfec0eaae)
+ * (GenCodeChecksum:98eebd80f22712ce0809cec244b6f92a)
  */
 
 /**
@@ -117,7 +117,7 @@ class CRM_Price_DAO_PriceSet extends CRM_Core_DAO {
   /**
    * Minimum Amount required for this set.
    *
-   * @var int
+   * @var float
    */
   public $min_amount;
 
@@ -131,9 +131,12 @@ class CRM_Price_DAO_PriceSet extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Price Sets');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Price Sets') : ts('Price Set');
   }
 
   /**
@@ -379,11 +382,15 @@ class CRM_Price_DAO_PriceSet extends CRM_Core_DAO {
         ],
         'min_amount' => [
           'name' => 'min_amount',
-          'type' => CRM_Utils_Type::T_INT,
+          'type' => CRM_Utils_Type::T_MONEY,
           'title' => ts('Minimum Amount'),
           'description' => ts('Minimum Amount required for this set.'),
+          'precision' => [
+            20,
+            2,
+          ],
           'where' => 'civicrm_price_set.min_amount',
-          'default' => '0',
+          'default' => '0.0',
           'table_name' => 'civicrm_price_set',
           'entity' => 'PriceSet',
           'bao' => 'CRM_Price_BAO_PriceSet',
diff --git a/civicrm/CRM/Price/DAO/PriceSetEntity.php b/civicrm/CRM/Price/DAO/PriceSetEntity.php
index 78e479a53a754dd5d0b21e970a826ef93e9f10fc..4b1d3749a55dba7d1a84b0000bfa37974338a7a5 100644
--- a/civicrm/CRM/Price/DAO/PriceSetEntity.php
+++ b/civicrm/CRM/Price/DAO/PriceSetEntity.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Price/PriceSetEntity.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:f2d6aeda95e4bde969d5ccebe9f26791)
+ * (GenCodeChecksum:0284d1a184dd635d93dd170e94451e86)
  */
 
 /**
@@ -68,9 +68,12 @@ class CRM_Price_DAO_PriceSetEntity extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Price Set Entities');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Price Set Entities') : ts('Price Set Entity');
   }
 
   /**
diff --git a/civicrm/CRM/Price/Form/Field.php b/civicrm/CRM/Price/Form/Field.php
index 571ab77be16ee7158efc542d658b88fa9d98a4c6..96aaf3b55854961d0c8737820e073966b87d6b08 100644
--- a/civicrm/CRM/Price/Form/Field.php
+++ b/civicrm/CRM/Price/Form/Field.php
@@ -77,6 +77,13 @@ class CRM_Price_Form_Field extends CRM_Core_Form {
    */
   protected $_useForMember;
 
+  /**
+   * Set the price Set Id (only used in tests)
+   */
+  public function setPriceSetId($priceSetId) {
+    $this->_sid = $priceSetId;
+  }
+
   /**
    * Set variables up before form is built.
    */
@@ -174,7 +181,7 @@ class CRM_Price_Form_Field extends CRM_Core_Form {
     $this->add('text', 'label', ts('Field Label'), CRM_Core_DAO::getAttribute('CRM_Price_DAO_PriceField', 'label'), TRUE);
 
     // html_type
-    $javascript = 'onchange="option_html_type(this.form)";';
+    $javascript = ['onchange' => 'option_html_type(this.form);'];
 
     $htmlTypes = CRM_Price_BAO_PriceField::htmlTypes();
 
@@ -376,10 +383,13 @@ class CRM_Price_Form_Field extends CRM_Core_Form {
     if ($this->_action & CRM_Core_Action::VIEW) {
       $this->freeze();
       $url = CRM_Utils_System::url('civicrm/admin/price/field', 'reset=1&action=browse&sid=' . $this->_sid);
-      $this->addElement('button',
+      $this->addElement('xbutton',
         'done',
         ts('Done'),
-        ['onclick' => "location.href='$url'"]
+        [
+          'type' => 'button',
+          'onclick' => "location.href='$url'",
+        ]
       );
     }
   }
@@ -546,12 +556,12 @@ class CRM_Price_Form_Field extends CRM_Core_Form {
             $foundDuplicate = FALSE;
             $orgIds = [];
             foreach ($memTypesIDS as $key => $val) {
-              $org = CRM_Member_BAO_MembershipType::getMembershipTypeOrganization($val);
-              if (in_array($org[$val], $orgIds)) {
+              $memTypeDetails = CRM_Member_BAO_MembershipType::getMembershipType($val);
+              if (in_array($memTypeDetails['member_of_contact_id'], $orgIds)) {
                 $foundDuplicate = TRUE;
                 break;
               }
-              $orgIds[$val] = $org[$val];
+              $orgIds[$val] = $memTypeDetails['member_of_contact_id'];
 
             }
             if ($foundDuplicate) {
@@ -563,7 +573,7 @@ class CRM_Price_Form_Field extends CRM_Core_Form {
           $foundAutorenew = FALSE;
           foreach ($memTypesIDS as $key => $val) {
             // see if any price field option values in this price field are for memberships with autorenew
-            $memTypeDetails = CRM_Member_BAO_MembershipType::getMembershipTypeDetails($val);
+            $memTypeDetails = CRM_Member_BAO_MembershipType::getMembershipType($val);
             if (!empty($memTypeDetails['auto_renew'])) {
               $foundAutorenew = TRUE;
               break;
@@ -641,7 +651,29 @@ class CRM_Price_Form_Field extends CRM_Core_Form {
   public function postProcess() {
     // store the submitted values in an array
     $params = $this->controller->exportValues('Field');
+    $params['id'] = $this->getEntityId();
+    $priceField = $this->submit($params);
+    if (!is_a($priceField, 'CRM_Core_Error')) {
+      // Required by extensions implementing the postProcess hook (to get the ID of new entities)
+      $this->setEntityId($priceField->id);
+      CRM_Core_Session::setStatus(ts('Price Field \'%1\' has been saved.', [1 => $priceField->label]), ts('Saved'), 'success');
+    }
+    $buttonName = $this->controller->getButtonName();
+    $session = CRM_Core_Session::singleton();
+    if ($buttonName == $this->getButtonName('next', 'new')) {
+      CRM_Core_Session::setStatus(ts(' You can add another price set field.'), '', 'info');
+      $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/price/field', 'reset=1&action=add&sid=' . $this->_sid));
+    }
+    else {
+      $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/price/field', 'reset=1&action=browse&sid=' . $this->_sid));
+    }
+  }
+
+  public function submit($params) {
     $params['price'] = CRM_Utils_Rule::cleanMoney($params['price']);
+    foreach ($params['option_amount'] as $key => $amount) {
+      $params['option_amount'][$key] = CRM_Utils_Rule::cleanMoney($amount);
+    }
 
     $params['is_display_amounts'] = CRM_Utils_Array::value('is_display_amounts', $params, FALSE);
     $params['is_required'] = CRM_Utils_Array::value('is_required', $params, FALSE);
@@ -683,26 +715,10 @@ class CRM_Price_Form_Field extends CRM_Core_Form {
       $params['option_visibility_id'] = [1 => CRM_Utils_Array::value('visibility_id', $params)];
     }
 
-    $params['id'] = $this->getEntityId();
-
     $params['membership_num_terms'] = (!empty($params['membership_type_id'])) ? CRM_Utils_Array::value('membership_num_terms', $params, 1) : NULL;
 
     $priceField = CRM_Price_BAO_PriceField::create($params);
-
-    if (!is_a($priceField, 'CRM_Core_Error')) {
-      // Required by extensions implementing the postProcess hook (to get the ID of new entities)
-      $this->setEntityId($priceField->id);
-      CRM_Core_Session::setStatus(ts('Price Field \'%1\' has been saved.', [1 => $priceField->label]), ts('Saved'), 'success');
-    }
-    $buttonName = $this->controller->getButtonName();
-    $session = CRM_Core_Session::singleton();
-    if ($buttonName == $this->getButtonName('next', 'new')) {
-      CRM_Core_Session::setStatus(ts(' You can add another price set field.'), '', 'info');
-      $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/price/field', 'reset=1&action=add&sid=' . $this->_sid));
-    }
-    else {
-      $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/price/field', 'reset=1&action=browse&sid=' . $this->_sid));
-    }
+    return $priceField;
   }
 
 }
diff --git a/civicrm/CRM/Price/Form/Option.php b/civicrm/CRM/Price/Form/Option.php
index e5f7fc1aaac8bd9a1688e819f10a8492060a58e9..5aa3b3687b141c430a2c138eda6c997c3c45129e 100644
--- a/civicrm/CRM/Price/Form/Option.php
+++ b/civicrm/CRM/Price/Form/Option.php
@@ -75,7 +75,7 @@ class CRM_Price_Form_Option extends CRM_Core_Form {
 
       // fix the display of the monetary value, CRM-4038
       foreach ($this->_moneyFields as $field) {
-        $defaults[$field] = CRM_Utils_Money::format(CRM_Utils_Array::value($field, $defaults), NULL, '%a');
+        $defaults[$field] = isset($defaults[$field]) ? CRM_Utils_Money::formatLocaleNumericRoundedByOptionalPrecision($defaults[$field], 9) : '';
       }
     }
 
@@ -326,7 +326,6 @@ class CRM_Price_Form_Option extends CRM_Core_Form {
       return NULL;
     }
     else {
-      $params = $ids = [];
       $params = $this->controller->exportValues('Option');
       $fieldLabel = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceField', $this->_fid, 'label');
 
diff --git a/civicrm/CRM/Profile/Form.php b/civicrm/CRM/Profile/Form.php
index 8d8f46cd881fd97464027f1e7475434d0a3c5e5a..c6594fd4bd97ae2c3ffcb3851f39836f608d1f9f 100644
--- a/civicrm/CRM/Profile/Form.php
+++ b/civicrm/CRM/Profile/Form.php
@@ -904,9 +904,13 @@ class CRM_Profile_Form extends CRM_Core_Form {
 
     if ($this->_context == 'dialog') {
       $this->addElement(
-        'submit',
+        'xbutton',
         $this->_duplicateButtonName,
-        ts('Save Matching Contact')
+        ts('Save Matching Contact'),
+        [
+          'type' => 'submit',
+          'class' => 'crm-button',
+        ]
       );
     }
   }
diff --git a/civicrm/CRM/Profile/Form/Edit.php b/civicrm/CRM/Profile/Form/Edit.php
index 7564dc37fc280614971c140e895fd706ebbcc6bf..b2cfc16bf4477b5cb2ece554fffe62cf017824ab 100644
--- a/civicrm/CRM/Profile/Form/Edit.php
+++ b/civicrm/CRM/Profile/Form/Edit.php
@@ -209,7 +209,11 @@ SELECT module,is_reserved
 
     if (($this->_multiRecord & CRM_Core_Action::DELETE) && $this->_recordExists) {
       $this->_deleteButtonName = $this->getButtonName('upload', 'delete');
-      $this->addElement('submit', $this->_deleteButtonName, ts('Delete'));
+      $this->addElement('xbutton', $this->_deleteButtonName, ts('Delete'), [
+        'type' => 'submit',
+        'value' => 1,
+        'class' => 'crm-button',
+      ]);
 
       return;
     }
diff --git a/civicrm/CRM/Profile/Page/Dynamic.php b/civicrm/CRM/Profile/Page/Dynamic.php
index 67f7edf0d508da8bf61ad99b64d6ea93efc51349..7ce7eeef62bb2bb7d03554cb11457771d41d3c2f 100644
--- a/civicrm/CRM/Profile/Page/Dynamic.php
+++ b/civicrm/CRM/Profile/Page/Dynamic.php
@@ -9,6 +9,8 @@
  +--------------------------------------------------------------------+
  */
 
+use Civi\Api4\Email;
+
 /**
  *
  * @package CRM
@@ -78,6 +80,13 @@ class CRM_Profile_Page_Dynamic extends CRM_Core_Page {
 
   protected $_recordId = NULL;
 
+  /**
+   * Should the primary email be converted into a link, if emailabe.
+   *
+   * @var bool
+   */
+  protected $isShowEmailTaskLink = FALSE;
+
   /**
    *
    * fetch multirecord as well as non-multirecord fields
@@ -97,15 +106,18 @@ class CRM_Profile_Page_Dynamic extends CRM_Core_Page {
    * @param bool $skipPermission
    * @param null $profileIds
    *
-   * @return \CRM_Profile_Page_Dynamic
+   * @param bool $isShowEmailTaskLink
+   *
+   * @throws \CRM_Core_Exception
    */
-  public function __construct($id, $gid, $restrict, $skipPermission = FALSE, $profileIds = NULL) {
+  public function __construct($id, $gid, $restrict, $skipPermission = FALSE, $profileIds = NULL, $isShowEmailTaskLink = FALSE) {
     parent::__construct();
 
     $this->_id = $id;
     $this->_gid = $gid;
     $this->_restrict = $restrict;
     $this->_skipPermission = $skipPermission;
+    $this->isShowEmailTaskLink = $isShowEmailTaskLink;
 
     if (!array_key_exists('multiRecord', $_GET)) {
       $this->set('multiRecord', NULL);
@@ -315,6 +327,11 @@ class CRM_Profile_Page_Dynamic extends CRM_Core_Page {
         $labels[$index] = preg_replace('/\s+|\W+/', '_', $name);
       }
 
+      if ($this->isShowEmailTaskLink) {
+        foreach ($this->getEmailFields($fields) as $fieldName) {
+          $values[$fields[$fieldName]['title']] = $this->getLinkedEmail($values[$fields[$fieldName]['title']]);
+        }
+      }
       foreach ($values as $title => $value) {
         $profileFields[$labels[$title]] = [
           'label' => $title,
@@ -416,4 +433,47 @@ class CRM_Profile_Page_Dynamic extends CRM_Core_Page {
     return $fileName ? $fileName : parent::overrideExtraTemplateFileName();
   }
 
+  /**
+   * Get the email field as a task link, if not on hold or set to do_not_email.
+   *
+   * @param string $email
+   *
+   * @return string
+   * @throws \API_Exception
+   * @throws \Civi\API\Exception\UnauthorizedException
+   */
+  protected function getLinkedEmail($email): string {
+    if (!$email) {
+      return '';
+    }
+    $emailID = Email::get()->setOrderBy(['is_primary' => 'DESC'])->setWhere([['contact_id', '=', $this->_id], ['email', '=', $email], ['on_hold', '=', FALSE], ['contact.is_deceased', '=', FALSE], ['contact.is_deleted', '=', FALSE], ['contact.do_not_email', '=', FALSE]])->execute()->first()['id'];
+    if (!$emailID) {
+      return $email;
+    }
+    $emailPopupUrl = CRM_Utils_System::url('civicrm/activity/email/add', [
+      'action' => 'add',
+      'reset' => '1',
+      'email_id' => $emailID,
+    ], TRUE);
+
+    return '<a class="crm-popup" href="' . $emailPopupUrl . '">' . $email . '</a>';
+  }
+
+  /**
+   * Get the email fields from within the fields array.
+   *
+   * @param array $fields
+   */
+  protected function getEmailFields(array $fields): array {
+    $emailFields = [];
+    foreach (array_keys($fields) as $fieldName) {
+      if (substr($fieldName, 0, 6) === 'email-'
+          && (is_numeric(substr($fieldName, 6)) || substr($fieldName, 6) ===
+        'Primary')) {
+        $emailFields[] = $fieldName;
+      }
+    }
+    return $emailFields;
+  }
+
 }
diff --git a/civicrm/CRM/Profile/Page/MultipleRecordFieldsListing.php b/civicrm/CRM/Profile/Page/MultipleRecordFieldsListing.php
index 1311d85c3ee6a33a67358cbe73c878af05862d57..a6c92afc62a30a140afef0b4b25c14919080bb05 100644
--- a/civicrm/CRM/Profile/Page/MultipleRecordFieldsListing.php
+++ b/civicrm/CRM/Profile/Page/MultipleRecordFieldsListing.php
@@ -341,8 +341,6 @@ class CRM_Profile_Page_MultipleRecordFieldsListing extends CRM_Core_Page_Basic {
 
                   case 'Radio':
                   case 'Select':
-                  case 'Select Country':
-                  case 'Select State/Province':
                     $editable = TRUE;
                     $fieldAttributes['data-type'] = $spec['data_type'] == 'Boolean' ? 'boolean' : 'select';
                     if (!$spec['is_required']) {
@@ -408,7 +406,7 @@ class CRM_Profile_Page_MultipleRecordFieldsListing extends CRM_Core_Page_Basic {
 
     $headers = [];
     if (!empty($fieldIDs)) {
-      $fields = ['Radio', 'Select', 'Select Country', 'Select State/Province'];
+      $fields = ['Radio', 'Select'];
       foreach ($fieldIDs as $fieldID) {
         if ($this->_pageViewType == 'profileDataView') {
           $headers[$fieldID] = $customGroupInfo[$fieldID]['fieldLabel'];
diff --git a/civicrm/CRM/Profile/Page/View.php b/civicrm/CRM/Profile/Page/View.php
index 54f563d4e9e441a930ab64a98fb5b09946217434..185980e8ed6f2a44630ab11ca54795ac0752655e 100644
--- a/civicrm/CRM/Profile/Page/View.php
+++ b/civicrm/CRM/Profile/Page/View.php
@@ -35,6 +35,13 @@ class CRM_Profile_Page_View extends CRM_Core_Page {
    */
   protected $_gid;
 
+  /**
+   * Should the primary email be converted into a link, if emailabe.
+   *
+   * @var bool
+   */
+  protected $isShowEmailTaskLink = FALSE;
+
   /**
    * Heart of the viewing process. The runner gets all the meta data for
    * the contact and calls the appropriate type of page to view.
@@ -44,6 +51,7 @@ class CRM_Profile_Page_View extends CRM_Core_Page {
     $this->_id = CRM_Utils_Request::retrieve('id', 'Positive',
       $this, FALSE
     );
+    $this->isShowEmailTaskLink = CRM_Utils_Request::retrieve('is_show_email_task', 'Positive', $this);
     if (!$this->_id) {
       $session = CRM_Core_Session::singleton();
       $this->_id = $session->get('userID');
@@ -77,7 +85,7 @@ class CRM_Profile_Page_View extends CRM_Core_Page {
 
     $anyContent = TRUE;
     if ($this->_gid) {
-      $page = new CRM_Profile_Page_Dynamic($this->_id, $this->_gid, 'Profile', FALSE, $profileIds);
+      $page = new CRM_Profile_Page_Dynamic($this->_id, $this->_gid, 'Profile', FALSE, $profileIds, $this->isShowEmailTaskLink);
       $profileGroup = [];
       $profileGroup['title'] = NULL;
       $profileGroup['content'] = $page->run();
diff --git a/civicrm/CRM/Queue/DAO/QueueItem.php b/civicrm/CRM/Queue/DAO/QueueItem.php
index a78b613e154da0ef032542f9c076e6c499e226e8..7ee05fcafa74fd8aa95a81cae682925dc0664642 100644
--- a/civicrm/CRM/Queue/DAO/QueueItem.php
+++ b/civicrm/CRM/Queue/DAO/QueueItem.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Queue/QueueItem.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:7e484400a7f8cf682b9c85e8b10c7bc7)
+ * (GenCodeChecksum:32350e9450942f29e7785ceaaed7a1b9)
  */
 
 /**
@@ -78,9 +78,12 @@ class CRM_Queue_DAO_QueueItem extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Queue Items');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Queue Items') : ts('Queue Item');
   }
 
   /**
diff --git a/civicrm/CRM/Report/DAO/ReportInstance.php b/civicrm/CRM/Report/DAO/ReportInstance.php
index 08a380c76fd3e548f7e3646ab57cf092d3a68010..f4ab9447035f9c368c4bd67dfed00b9f4a25f43a 100644
--- a/civicrm/CRM/Report/DAO/ReportInstance.php
+++ b/civicrm/CRM/Report/DAO/ReportInstance.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/Report/ReportInstance.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:d0c9e5593f161f18e7979012c4c13724)
+ * (GenCodeChecksum:9c05a0739ee0b8250fdc0418b5fb247d)
  */
 
 /**
@@ -192,9 +192,12 @@ class CRM_Report_DAO_ReportInstance extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Reports');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Reports') : ts('Report');
   }
 
   /**
diff --git a/civicrm/CRM/Report/Form.php b/civicrm/CRM/Report/Form.php
index aaf8bb15fd2f57656f0eba86adc208ed8541e427..1099be3bb0eca5c04c7c70a92eab408603647cc9 100644
--- a/civicrm/CRM/Report/Form.php
+++ b/civicrm/CRM/Report/Form.php
@@ -1535,7 +1535,7 @@ class CRM_Report_Form extends CRM_Core_Form {
     if (!empty($this->_charts)) {
       $this->addElement('select', "charts", ts('Chart'), $this->_charts);
       $this->assign('charts', $this->_charts);
-      $this->addElement('submit', $this->_chartButtonName, ts('View'));
+      $this->addElement('xbutton', $this->_chartButtonName, ts('View'), ['type' => 'submit']);
     }
   }
 
@@ -1660,7 +1660,10 @@ class CRM_Report_Form extends CRM_Core_Form {
       $this->assign('group', TRUE);
     }
 
-    $this->addElement('submit', $this->_groupButtonName, '', ['style' => 'display: none;']);
+    $this->addElement('xbutton', $this->_groupButtonName, '', [
+      'type' => 'submit',
+      'style' => 'display: none;',
+    ]);
 
     $this->addChartOptions();
     $showResultsLabel = $this->getResultsLabel();
diff --git a/civicrm/CRM/Report/Form/Event/ParticipantListing.php b/civicrm/CRM/Report/Form/Event/ParticipantListing.php
index faefeac943a7db44acecc51e84d92377aa15a55f..7bd68693a0dc51de50536ebf0c7bb783bd9c1c2c 100644
--- a/civicrm/CRM/Report/Form/Event/ParticipantListing.php
+++ b/civicrm/CRM/Report/Form/Event/ParticipantListing.php
@@ -723,7 +723,7 @@ ORDER BY  cv.label
 
         $rows[$rowNum]['civicrm_contact_sort_name_linked'] = "<a title='$contactTitle' href=$url>$displayName</a>";
         // Add a "View" link to the participant record if this isn't a CSV/PDF/printed document.
-        if ($this->_outputMode !== 'csv' && $this->_outputMode !== 'pdf' && $this->_outputMode !== 'print') {
+        if (empty($this->getOutputMode())) {
           $rows[$rowNum]['civicrm_contact_sort_name_linked'] .=
             "<span style='float: right;'><a title='$participantTitle' href=$viewUrl>" .
             ts('View') . "</a></span>";
diff --git a/civicrm/CRM/Report/Form/Instance.php b/civicrm/CRM/Report/Form/Instance.php
index 76d6e2c9f875d95369f3928f99690fc891f0da65..97744f694438e1ff4103668ece2a1bb23a79379b 100644
--- a/civicrm/CRM/Report/Form/Instance.php
+++ b/civicrm/CRM/Report/Form/Instance.php
@@ -187,7 +187,7 @@ class CRM_Report_Form_Instance {
    */
   public static function setDefaultValues(&$form, &$defaults) {
     // we should not build form elements in dashlet mode.
-    if ($form->_section) {
+    if (!empty($form->_section)) {
       return;
     }
 
diff --git a/civicrm/CRM/Report/Form/Member/ContributionDetail.php b/civicrm/CRM/Report/Form/Member/ContributionDetail.php
index 69dd87b8c872d31c48c90ec00e5c9107f9df38fe..882e80d903faadf357a340afbb08cdfe0ce7c28e 100644
--- a/civicrm/CRM/Report/Form/Member/ContributionDetail.php
+++ b/civicrm/CRM/Report/Form/Member/ContributionDetail.php
@@ -22,6 +22,9 @@ class CRM_Report_Form_Member_ContributionDetail extends CRM_Report_Form {
     'Contribution',
     'Membership',
     'Contact',
+    'Individual',
+    'Household',
+    'Organization',
   ];
 
   /**
diff --git a/civicrm/CRM/SMS/DAO/Provider.php b/civicrm/CRM/SMS/DAO/Provider.php
index 3aa49ab0a6da3128f2b2fca659004cfdc6946ac8..afdd808359ac7b9a2dc278a37c1fe3eb9e7f4fed 100644
--- a/civicrm/CRM/SMS/DAO/Provider.php
+++ b/civicrm/CRM/SMS/DAO/Provider.php
@@ -6,7 +6,7 @@
  *
  * Generated from xml/schema/CRM/SMS/Provider.xml
  * DO NOT EDIT.  Generated by CRM_Core_CodeGen
- * (GenCodeChecksum:6ecda65bd52b36e04764cec8ee81e1b8)
+ * (GenCodeChecksum:478e0d0caeb2d2a81068db6ad2db67aa)
  */
 
 /**
@@ -107,9 +107,12 @@ class CRM_SMS_DAO_Provider extends CRM_Core_DAO {
 
   /**
    * Returns localized title of this entity.
+   *
+   * @param bool $plural
+   *   Whether to return the plural version of the title.
    */
-  public static function getEntityTitle() {
-    return ts('Providers');
+  public static function getEntityTitle($plural = FALSE) {
+    return $plural ? ts('Providers') : ts('Provider');
   }
 
   /**
diff --git a/civicrm/CRM/SMS/Form/Provider.php b/civicrm/CRM/SMS/Form/Provider.php
index 68e64de811b8c3c83a2e1e3c7655e673a280d3ef..a9daf14057a7d54d7644ddd0bae664be9d695ac8 100644
--- a/civicrm/CRM/SMS/Form/Provider.php
+++ b/civicrm/CRM/SMS/Form/Provider.php
@@ -70,7 +70,7 @@ class CRM_SMS_Form_Provider extends CRM_Core_Form {
     $providerNames = CRM_Core_OptionGroup::values('sms_provider_name', FALSE, FALSE, FALSE, NULL, 'label');
     $apiTypes = CRM_Core_OptionGroup::values('sms_api_type', FALSE, FALSE, FALSE, NULL, 'label');
 
-    $this->add('select', 'name', ts('Name'), ['' => '- select -'] + $providerNames, TRUE);
+    $this->add('select', 'name', ts('Name'), $providerNames, TRUE, ['placeholder' => TRUE]);
 
     $this->add('text', 'title', ts('Title'),
       $attributes['title'], TRUE
@@ -94,7 +94,7 @@ class CRM_SMS_Form_Provider extends CRM_Core_Form {
     $this->add('text', 'api_url', ts('API Url'), $attributes['api_url'], TRUE);
 
     $this->add('textarea', 'api_params', ts('API Parameters'),
-      "cols=50 rows=6", TRUE
+      ['cols' => 50, 'rows' => 6], TRUE
     );
 
     $this->add('checkbox', 'is_active', ts('Is this provider active?'));
diff --git a/civicrm/CRM/UF/Form/Field.php b/civicrm/CRM/UF/Form/Field.php
index 4bfcb214af81150eddebdc9b685c6a948d8218f7..997962cd40b1f77cd35c80b4f1167b66310712b0 100644
--- a/civicrm/CRM/UF/Form/Field.php
+++ b/civicrm/CRM/UF/Form/Field.php
@@ -467,8 +467,11 @@ class CRM_UF_Form_Field extends CRM_Core_Form {
     // if view mode pls freeze it with the done button.
     if ($this->_action & CRM_Core_Action::VIEW) {
       $this->freeze();
-      $this->addElement('button', 'done', ts('Done'),
-        ['onclick' => "location.href='civicrm/admin/uf/group/field?reset=1&action=browse&gid=" . $this->_gid . "'"]
+      $this->addElement('xbutton', 'done', ts('Done'),
+        [
+          'type' => 'button',
+          'onclick' => "location.href='civicrm/admin/uf/group/field?reset=1&action=browse&gid=" . $this->_gid . "'",
+        ]
       );
     }
 
diff --git a/civicrm/CRM/UF/Form/Group.php b/civicrm/CRM/UF/Form/Group.php
index a9fef4dc8fef3722bc6db7a0ab440bb258fa02a2..5a4d3dd570a5e70c57dcd27212e2bd10ad002db7 100644
--- a/civicrm/CRM/UF/Form/Group.php
+++ b/civicrm/CRM/UF/Form/Group.php
@@ -231,7 +231,10 @@ class CRM_UF_Form_Group extends CRM_Core_Form {
     // views are implemented as frozen form
     if ($this->_action & CRM_Core_Action::VIEW) {
       $this->freeze();
-      $this->addElement('button', 'done', ts('Done'), ['onclick' => "location.href='civicrm/admin/uf/group?reset=1&action=browse'"]);
+      $this->addElement('xbutton', 'done', ts('Done'), [
+        'type' => 'button',
+        'onclick' => "location.href='civicrm/admin/uf/group?reset=1&action=browse'",
+      ]);
     }
 
     $this->addFormRule(['CRM_UF_Form_Group', 'formRule'], $this);
diff --git a/civicrm/CRM/UF/Form/Inline/Preview.php b/civicrm/CRM/UF/Form/Inline/Preview.php
index 49f1adbd97c3086be84fd06794478e0b9147d2e4..b604fe8a64f2fe8fbbbbc20d483d21ec216839d4 100644
--- a/civicrm/CRM/UF/Form/Inline/Preview.php
+++ b/civicrm/CRM/UF/Form/Inline/Preview.php
@@ -29,7 +29,7 @@ class CRM_UF_Form_Inline_Preview extends CRM_UF_Form_AbstractPreview {
     // Inline forms don't get menu-level permission checks
     $checkPermission = [
       [
-        'administer CiviCRM',
+        'administer CiviCRM data',
         'manage event profiles',
       ],
     ];
diff --git a/civicrm/CRM/Upgrade/Incremental/Base.php b/civicrm/CRM/Upgrade/Incremental/Base.php
index 3f5393dc0c2b142e9212b09b6a9a918cb4f6c521..a7c5ee6e4e7f4ca7af818a7a5222d082975adaa8 100644
--- a/civicrm/CRM/Upgrade/Incremental/Base.php
+++ b/civicrm/CRM/Upgrade/Incremental/Base.php
@@ -136,10 +136,11 @@ class CRM_Upgrade_Incremental_Base {
    * @param string $properties
    * @param bool $localizable is this a field that should be localized
    * @param string|null $version CiviCRM version to use if rebuilding multilingual schema
+   * @param bool $triggerRebuild should we trigger the rebuild of the multilingual schema
    *
    * @return bool
    */
-  public static function addColumn($ctx, $table, $column, $properties, $localizable = FALSE, $version = NULL) {
+  public static function addColumn($ctx, $table, $column, $properties, $localizable = FALSE, $version = NULL, $triggerRebuild = TRUE) {
     $locales = CRM_Core_I18n::getMultilingual();
     $queries = [];
     if (!CRM_Core_BAO_SchemaHandler::checkIfFieldExists($table, $column, FALSE)) {
@@ -162,7 +163,7 @@ class CRM_Upgrade_Incremental_Base {
         CRM_Core_DAO::executeQuery($query, [], TRUE, NULL, FALSE, FALSE);
       }
     }
-    if ($locales) {
+    if ($locales && $triggerRebuild) {
       CRM_Core_I18n_Schema::rebuildMultilingualSchema($locales, $version, TRUE);
     }
     return TRUE;
diff --git a/civicrm/CRM/Upgrade/Incremental/php/FiveThirtyOne.php b/civicrm/CRM/Upgrade/Incremental/php/FiveThirtyOne.php
new file mode 100644
index 0000000000000000000000000000000000000000..42b905011c0dc34ab97c21dfdce1ae4d22da57d4
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/php/FiveThirtyOne.php
@@ -0,0 +1,196 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Upgrade logic for FiveThirtyOne */
+class CRM_Upgrade_Incremental_php_FiveThirtyOne extends CRM_Upgrade_Incremental_Base {
+
+  /**
+   * Compute any messages which should be displayed beforeupgrade.
+   *
+   * Note: This function is called iteratively for each upcoming
+   * revision to the database.
+   *
+   * @param string $preUpgradeMessage
+   * @param string $rev
+   *   a version number, e.g. '4.4.alpha1', '4.4.beta3', '4.4.0'.
+   * @param null $currentVer
+   */
+  public function setPreUpgradeMessage(&$preUpgradeMessage, $rev, $currentVer = NULL) {
+    // Example: Generate a pre-upgrade message.
+    // if ($rev == '5.12.34') {
+    //   $preUpgradeMessage .= '<p>' . ts('A new permission, "%1", has been added. This permission is now used to control access to the Manage Tags screen.', array(1 => ts('manage tags'))) . '</p>';
+    // }
+  }
+
+  /**
+   * Compute any messages which should be displayed after upgrade.
+   *
+   * @param string $postUpgradeMessage
+   *   alterable.
+   * @param string $rev
+   *   an intermediate version; note that setPostUpgradeMessage is called repeatedly with different $revs.
+   */
+  public function setPostUpgradeMessage(&$postUpgradeMessage, $rev) {
+    // Example: Generate a post-upgrade message.
+    // if ($rev == '5.12.34') {
+    //   $postUpgradeMessage .= '<br /><br />' . ts("By default, CiviCRM now disables the ability to import directly from SQL. To use this feature, you must explicitly grant permission 'import SQL datasource'.");
+    // }
+  }
+
+  /*
+   * Important! All upgrade functions MUST add a 'runSql' task.
+   * Uncomment and use the following template for a new upgrade version
+   * (change the x in the function name):
+   */
+
+  /**
+   * Upgrade function.
+   *
+   * @param string $rev
+   */
+  public function upgrade_5_31_alpha1($rev) {
+    $this->addTask('Expand internal civicrm group title field to be 255 in length', 'grouptitlefieldExpand');
+    $this->addTask('Add in optional public title group table', 'addColumn', 'civicrm_group', 'frontend_title', "varchar(255)   DEFAULT NULL COMMENT 'Alternative public title for this Group.'", TRUE, '5.31.alpha1', FALSE);
+    $this->addTask('Add in optional public description group table', 'addColumn', 'civicrm_group', 'frontend_description', "text   DEFAULT NULL COMMENT 'Alternative public description of the group.'", TRUE, '5.31.alpha1');
+    $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
+    $this->addTask('Remove Eway Single Currency Payment Processor type if not used or install the new extension for it', 'enableEwaySingleExtension');
+    $this->addTask('dev/core#1486 Remove FKs from ACL Cache tables', 'removeFKsFromACLCacheTables');
+    $this->addTask('Activate core extension "Greenwich"', 'installGreenwich');
+    $this->addTask('Add is_non_case_email_skipped column to civicrm_mail_settings', 'addColumn',
+      'civicrm_mail_settings', 'is_non_case_email_skipped', "TINYINT DEFAULT 0 NOT NULL COMMENT 'Skip emails which do not have a Case ID or Case hash'");
+    $this->addTask('Add is_contact_creation_disabled_if_no_match column to civicrm_mail_settings', 'addColumn',
+      'civicrm_mail_settings', 'is_contact_creation_disabled_if_no_match', "TINYINT DEFAULT 0 NOT NULL COMMENT 'If this option is enabled, CiviCRM will not create new contacts when filing emails'");
+  }
+
+  public function upgrade_5_31_beta2($rev) {
+    $this->addTask('Restore null-ity of "civicrm_group.title" field', 'groupTitleRestore');
+    $this->addTask(ts('Upgrade DB to %1: SQL', [1 => $rev]), 'runSql', $rev);
+  }
+
+  public static function enableEwaySingleExtension(CRM_Queue_TaskContext $ctx) {
+    $eWAYPaymentProcessorType = CRM_Core_DAO::singleValueQuery("SELECT id FROM civicrm_payment_processor_type WHERE class_name = 'Payment_eWAY'");
+    if ($eWAYPaymentProcessorType) {
+      $ewayPaymentProcessorCount = CRM_Core_DAO::singleValueQuery("SELECT count(id) FROM civicrm_payment_processor WHERE payment_processor_type_id = %1", [1 => [$eWAYPaymentProcessorType, 'Positive']]);
+      if ($ewayPaymentProcessorCount) {
+        $insert = CRM_Utils_SQL_Insert::into('civicrm_extension')->row([
+          'type' => 'module',
+          'full_name' => 'ewaysingle',
+          'name' => 'eway Single currency extension',
+          'label' => 'eway Single currency extension',
+          'file' => 'ewaysingle',
+          'schema_version' => NULL,
+          'is_active' => 1,
+        ]);
+        CRM_Core_DAO::executeQuery($insert->usingReplace()->toSQL());
+        $managedEntity = CRM_Utils_SQL_Insert::into('civicrm_managed')->row([
+          'name' => 'eWAY',
+          'module' => 'ewaysingle',
+          'entity_type' => 'PaymentProcessorType',
+          'entity_id' => $eWAYPaymentProcessorType,
+          'cleanup' => NULL,
+        ]);
+        CRM_Core_DAO::executeQuery($managedEntity->usingReplace()->toSQL());
+      }
+      else {
+        CRM_Core_DAO::executeQuery("DELETE FROM civicrm_payment_processor_type WHERE id = %1", [1 => [$eWAYPaymentProcessorType, 'Positive']]);
+      }
+    }
+    return TRUE;
+  }
+
+  public static function removeFKsFromACLCacheTables(CRM_Queue_TaskContext $ctx) {
+    CRM_Core_BAO_SchemaHandler::safeRemoveFK('civicrm_acl_contact_cache', 'FK_civicrm_acl_contact_cache_contact_id');
+    CRM_Core_BAO_SchemaHandler::safeRemoveFK('civicrm_acl_cache', 'FK_civicrm_acl_cache_contact_id');
+    CRM_Core_BAO_SchemaHandler::createIndexes(['civicrm_acl_cache' => ['contact_id']]);
+    return TRUE;
+  }
+
+  /**
+   * Install greenwich extensions.
+   *
+   * This feature is restructured as a core extension - which is primarily a code cleanup step.
+   *
+   * @param \CRM_Queue_TaskContext $ctx
+   *
+   * @return bool
+   *
+   * @throws \CRM_Core_Exception
+   */
+  public static function installGreenwich(CRM_Queue_TaskContext $ctx) {
+    // Install via direct SQL manipulation. Note that:
+    // (1) This extension has no activation logic.
+    // (2) On new installs, the extension is activated purely via default SQL INSERT.
+    // (3) Caches are flushed at the end of the upgrade.
+    // ($) Over long term, upgrade steps are more reliable in SQL. API/BAO sometimes don't work mid-upgrade.
+    $insert = CRM_Utils_SQL_Insert::into('civicrm_extension')->row([
+      'type' => 'module',
+      'full_name' => 'greenwich',
+      'name' => 'Theme: Greenwich',
+      'label' => 'Theme: Greenwich',
+      'file' => 'greenwich',
+      'schema_version' => NULL,
+      'is_active' => 1,
+    ]);
+    CRM_Core_DAO::executeQuery($insert->usingReplace()->toSQL());
+
+    return TRUE;
+  }
+
+  /**
+   * Expands the length of the civicrm_group.title field in the database to be 255.
+   *
+   * @param \CRM_Queue_TaskContext $ctx
+   *
+   * @return bool
+   */
+  public static function grouptitlefieldExpand(CRM_Queue_TaskContext $ctx) {
+    $locales = CRM_Core_I18n::getMultilingual();
+    $queries = [];
+    if ($locales) {
+      foreach ($locales as $locale) {
+        $queries[] = "ALTER TABLE civicrm_group CHANGE `title_{$locale}` `title_{$locale}` varchar(255) NOT NULL COMMENT 'Name of Group.'";
+      }
+    }
+    else {
+      $queries[] = "ALTER TABLE civicrm_group CHANGE `title` `title` varchar(255) NOT NULL COMMENT 'Name of Group.'";
+    }
+    foreach ($queries as $query) {
+      CRM_Core_DAO::executeQuery($query, [], TRUE, NULL, FALSE, FALSE);
+    }
+    return TRUE;
+  }
+
+  /**
+   * The prior task grouptitlefieldExpand went a bit too far in making the `title` NOT NULL.
+   *
+   * @link https://lab.civicrm.org/dev/translation/-/issues/58
+   * @param \CRM_Queue_TaskContext $ctx
+   * @return bool
+   */
+  public static function groupTitleRestore(CRM_Queue_TaskContext $ctx) {
+    $locales = CRM_Core_I18n::getMultilingual();
+    $queries = [];
+    if ($locales) {
+      foreach ($locales as $locale) {
+        $queries[] = "ALTER TABLE civicrm_group CHANGE `title_{$locale}` `title_{$locale}` varchar(255) DEFAULT NULL COMMENT 'Name of Group.'";
+      }
+    }
+    else {
+      $queries[] = "ALTER TABLE civicrm_group CHANGE `title` `title` varchar(255) DEFAULT NULL COMMENT 'Name of Group.'";
+    }
+    foreach ($queries as $query) {
+      CRM_Core_DAO::executeQuery($query, [], TRUE, NULL, FALSE, FALSE);
+    }
+    return TRUE;
+  }
+
+}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.30.0.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.30.0.mysql.tpl
deleted file mode 100644
index 110936b376fb54981eacb41cc27a8588a17a66ec..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Upgrade/Incremental/sql/5.30.0.mysql.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{* file to handle db changes in 5.30.0 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.30.1.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.30.1.mysql.tpl
deleted file mode 100644
index 20f875dd0af4f0dfacabc17eaff5d311d174e2c2..0000000000000000000000000000000000000000
--- a/civicrm/CRM/Upgrade/Incremental/sql/5.30.1.mysql.tpl
+++ /dev/null
@@ -1 +0,0 @@
-{* file to handle db changes in 5.30.1 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.31.0.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.31.0.mysql.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..a83b47a8ded2224991e56323b3609f7e87f042a0
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.31.0.mysql.tpl
@@ -0,0 +1 @@
+{* file to handle db changes in 5.31.0 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.31.alpha1.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.31.alpha1.mysql.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..68d45857c9a3bbee10276f19368612482e355a40
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.31.alpha1.mysql.tpl
@@ -0,0 +1,45 @@
+{* file to handle db changes in 5.31.alpha1 during upgrade *}
+
+{* Remove Country & State special select fields *}
+UPDATE civicrm_custom_field SET html_type = 'Select'
+WHERE html_type IN ('Select Country', 'Select State/Province');
+
+{* make period_type required - it already is so the update is precautionary *}
+UPDATE civicrm_membership_type SET period_type = 'rolling' WHERE period_type IS NULL;
+ALTER TABLE civicrm_membership_type MODIFY `period_type` varchar(8) NOT NULL COMMENT 'Rolling membership period starts on signup date. Fixed membership periods start on fixed_period_start_day.';
+
+{* dev/core#2027 Add missing sub-divisions for Northern Ireland and Wales *}
+SET @UKCountryId = (SELECT id FROM civicrm_country cc WHERE cc.name = 'United Kingdom');
+INSERT IGNORE INTO civicrm_state_province (country_id, abbreviation, name) VALUES
+(@UKCountryId, "ANN", "Antrim and Newtownabbey"),
+(@UKCountryId, "AND", "Ards and North Down"),
+(@UKCountryId, "ABC", "Armagh City, Banbridge and Craigavon"),
+(@UKCountryId, "BFS", "Belfast"),
+(@UKCountryId, "CCG", "Causeway Coast and Glens"),
+(@UKCountryId, "DRS", "Derry City and Strabane"),
+(@UKCountryId, "FMO", "Fermanagh and Omagh"),
+(@UKCountryId, "LBC", "Lisburn and Castlereagh"),
+(@UKCountryId, "MEA", "Mid and East Antrim"),
+(@UKCountryId, "MUL", "Mid Ulster"),
+(@UKCountryId, "NMD", "Newry, Mourne and Down"),
+(@UKCountryId, "BGW", "Blaenau Gwent"),
+(@UKCountryId, "BGE", "Bridgend"),
+(@UKCountryId, "CAY", "Caerphilly"),
+(@UKCountryId, "CRF", "Cardiff"),
+(@UKCountryId, "CRF", "Carmarthenshire"),
+(@UKCountryId, "CGN", "Ceredigion"),
+(@UKCountryId, "CWY", "Conwy"),
+(@UKCountryId, "DEN", "Denbighshire"),
+(@UKCountryId, "FLN", "Flintshire"),
+(@UKCountryId, "AGY", "Isle of Anglesey"),
+(@UKCountryId, "MTY", "Merthyr Tydfil"),
+(@UKCountryId, "NTL", "Neath Port Talbot"),
+(@UKCountryId, "NWP", "Newport"),
+(@UKCountryId, "PEM", "Pembrokeshire"),
+(@UKCountryId, "RCT", "Rhondda, Cynon, Taff"),
+(@UKCountryId, "SWA", "Swansea"),
+(@UKCountryId, "TOF", "Torfaen"),
+(@UKCountryId, "VGL", "Vale of Glamorgan, The"),
+(@UKCountryId, "WRX", "Wrexham");
+
+ALTER TABLE civicrm_price_set MODIFY COLUMN `min_amount` decimal(20,2) DEFAULT '0.00' COMMENT 'Minimum Amount required for this set.';
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.31.beta1.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.31.beta1.mysql.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..c549cd347e3a4e7f941f9738c25ca879a74f1378
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.31.beta1.mysql.tpl
@@ -0,0 +1 @@
+{* file to handle db changes in 5.31.beta1 during upgrade *}
diff --git a/civicrm/CRM/Upgrade/Incremental/sql/5.31.beta2.mysql.tpl b/civicrm/CRM/Upgrade/Incremental/sql/5.31.beta2.mysql.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..33384db1727ed085008db3576e8cd334894144b6
--- /dev/null
+++ b/civicrm/CRM/Upgrade/Incremental/sql/5.31.beta2.mysql.tpl
@@ -0,0 +1 @@
+{* file to handle db changes in 5.31.beta2 during upgrade *}
diff --git a/civicrm/CRM/Utils/API/HTMLInputCoder.php b/civicrm/CRM/Utils/API/HTMLInputCoder.php
index fa5de2b9643defb793ab88509ec44e33770f81a7..50634d22bc8d3de08eb44da2143df2551c2bc82e 100644
--- a/civicrm/CRM/Utils/API/HTMLInputCoder.php
+++ b/civicrm/CRM/Utils/API/HTMLInputCoder.php
@@ -109,6 +109,8 @@ class CRM_Utils_API_HTMLInputCoder extends CRM_Utils_API_AbstractFieldCoder {
         'header',
         // https://lab.civicrm.org/dev/core/issues/1286
         'footer',
+        // SavedSearch entity
+        'api_params',
       ];
       $custom = CRM_Core_DAO::executeQuery('SELECT id FROM civicrm_custom_field WHERE html_type = "RichTextEditor"');
       while ($custom->fetch()) {
diff --git a/civicrm/CRM/Utils/Check.php b/civicrm/CRM/Utils/Check.php
index 1e4d9f7df707bee0cd99aa5e5944f0ea89299cd7..290de63123d491eb0782ff272e8cf99719b05276 100644
--- a/civicrm/CRM/Utils/Check.php
+++ b/civicrm/CRM/Utils/Check.php
@@ -64,7 +64,7 @@ class CRM_Utils_Check {
    * Display daily system status alerts (admin only).
    */
   public function showPeriodicAlerts() {
-    if (CRM_Core_Permission::check('administer CiviCRM')) {
+    if (CRM_Core_Permission::check('administer CiviCRM system')) {
       $session = CRM_Core_Session::singleton();
       if ($session->timer('check_' . __CLASS__, self::CHECK_TIMER)) {
 
diff --git a/civicrm/CRM/Utils/Check/Component/Env.php b/civicrm/CRM/Utils/Check/Component/Env.php
index 7c57df65fd6e778e9f11bccfc9f95bfb05956d02..29e0a2fd6a8561b628f812abcb54fab30ad14cc0 100644
--- a/civicrm/CRM/Utils/Check/Component/Env.php
+++ b/civicrm/CRM/Utils/Check/Component/Env.php
@@ -600,20 +600,6 @@ class CRM_Utils_Check_Component_Env extends CRM_Utils_Check_Component {
       return $messages;
     }
 
-    if (!$remotes) {
-      // CRM-13141 There may not be any compatible extensions available for the requested CiviCRM version + CMS. If so, $extdir is empty so just return a notice.
-      $messages[] = new CRM_Utils_Check_Message(
-        __FUNCTION__,
-        ts('There are currently no extensions on the CiviCRM public extension directory which are compatible with version %1. If you want to install an extension which is not marked as compatible, you may be able to download and install extensions manually (depending on access to your web server).', [
-          1 => CRM_Utils_System::majorVersion(),
-        ]) . '<br />' . CRM_Utils_System::docURL2('sysadmin/customize/extensions/#installing-a-new-extension'),
-        ts('No Extensions Available for this Version'),
-        \Psr\Log\LogLevel::NOTICE,
-        'fa-plug'
-      );
-      return $messages;
-    }
-
     $keys = array_keys($manager->getStatuses());
     sort($keys);
     $updates = $errors = $okextensions = [];
diff --git a/civicrm/CRM/Utils/Hook.php b/civicrm/CRM/Utils/Hook.php
index 381b69f8f68521ce164e56ebf4fe05589a8130a8..a987971774b41dc02e2bf2a00254168dff9d95a5 100644
--- a/civicrm/CRM/Utils/Hook.php
+++ b/civicrm/CRM/Utils/Hook.php
@@ -421,6 +421,22 @@ abstract class CRM_Utils_Hook {
     return self::singleton()->invoke(['op', 'objectName', 'objectId', 'links', 'mask', 'values'], $op, $objectName, $objectId, $links, $mask, $values, 'civicrm_links');
   }
 
+  /**
+   * Alter the contents of a resource bundle (ie a collection of JS/CSS/etc).
+   *
+   * TIP: $bundle->add*() and $bundle->filter() should be useful for
+   * adding/removing/updating items.
+   *
+   * @param CRM_Core_Resources_Bundle $bundle
+   * @return null
+   * @see CRM_Core_Resources_CollectionInterface::add()
+   * @see CRM_Core_Resources_CollectionInterface::filter()
+   */
+  public static function alterBundle($bundle) {
+    return self::singleton()
+      ->invoke(['bundle'], $bundle, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_alterBundle');
+  }
+
   /**
    * This hook is invoked during the CiviCRM form preProcess phase.
    *
@@ -809,23 +825,6 @@ abstract class CRM_Utils_Hook {
     );
   }
 
-  /**
-   * This hook is called when rendering the tabs for a contact (q=civicrm/contact/view)c
-   *
-   * @param array $tabs
-   *   The array of tabs that will be displayed.
-   * @param int $contactID
-   *   The contactID for whom the dashboard is being rendered.
-   *
-   * @return null
-   * @deprecated Use tabset() instead.
-   */
-  public static function tabs(&$tabs, $contactID) {
-    return self::singleton()->invoke(['tabs', 'contactID'], $tabs, $contactID,
-      self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_tabs'
-    );
-  }
-
   /**
    * This hook is called when rendering the tabs used for events and potentially
    * contribution pages, etc.
@@ -1271,6 +1270,28 @@ abstract class CRM_Utils_Hook {
       ->invoke(['caseTypes'], $caseTypes, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_caseTypes');
   }
 
+  /**
+   * This hook is called when getting case email subject patterns.
+   *
+   * All emails related to cases have case hash/id in the subject, e.g:
+   * [case #ab12efg] Magic moment
+   * [case #1234] Magic is here
+   *
+   * Using this hook you can replace/enrich default list with some other
+   * patterns, e.g. include case type categories (see CiviCase extension) like:
+   * [(case|project|policy initiative) #hash]
+   * [(case|project|policy initiative) #id]
+   *
+   * @param array $subjectPatterns
+   *   Cases related email subject regexp patterns.
+   *
+   * @return mixed
+   */
+  public static function caseEmailSubjectPatterns(&$subjectPatterns) {
+    return self::singleton()
+      ->invoke(['caseEmailSubjectPatterns'], $subjectPatterns, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, self::$_nullObject, 'civicrm_caseEmailSubjectPatterns');
+  }
+
   /**
    * This hook is called soon after the CRM_Core_Config object has ben initialized.
    * You can use this hook to modify the config object and hence behavior of CiviCRM dynamically.
diff --git a/civicrm/CRM/Utils/Mail/CaseMail.php b/civicrm/CRM/Utils/Mail/CaseMail.php
new file mode 100644
index 0000000000000000000000000000000000000000..8b644ea65890848ffdace54bf42743183e19c7be
--- /dev/null
+++ b/civicrm/CRM/Utils/Mail/CaseMail.php
@@ -0,0 +1,127 @@
+<?php
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ */
+
+/**
+ * Class CRM_Utils_Mail_CaseMail.
+ */
+class CRM_Utils_Mail_CaseMail {
+
+  /**
+   * A word that is used for cases by default (in email subject).
+   *
+   * @var string
+   */
+  private $caseLabel = 'case';
+
+  /**
+   * Default cases related email subject regexp patterns.
+   *
+   * All emails related to cases have case hash/id in the subject, e.g:
+   * [case #ab12efg] Magic moment
+   * [case #1234] Magic is here
+   * This variable is defined in constructor.
+   *
+   * @var array|string[]
+   */
+  private $subjectPatterns = [];
+
+  /**
+   * Cases related email subject regexp patterns extended by hooks.
+   *
+   * @var array|string[]
+   */
+  private $subjectPatternsHooked = [];
+
+  /**
+   * CRM_Utils_Mail_CaseMail constructor.
+   */
+  public function __construct() {
+    $this->subjectPatterns = [
+      '/\[' . $this->caseLabel . ' #([0-9a-f]{7})\]/i',
+      '/\[' . $this->caseLabel . ' #(\d+)\]/i',
+    ];
+  }
+
+  /**
+   * Checks if email is related to cases.
+   *
+   * @param string $subject
+   *   Email subject.
+   *
+   * @return bool
+   *   TRUE if email subject contains case ID or case hash, FALSE otherwise.
+   */
+  public function isCaseEmail ($subject) {
+    $subject = trim($subject);
+    $patterns = $this->getSubjectPatterns();
+    $res = FALSE;
+
+    for ($i = 0; !$res && $i < count($patterns); $i++) {
+      $res = preg_match($patterns[$i], $subject) === 1;
+    }
+
+    return $res;
+  }
+
+  /**
+   * Returns cases related email subject patterns.
+   *
+   * These patterns could be used to check if email is related to cases.
+   *
+   * @return array|string[]
+   */
+  public function getSubjectPatterns() {
+    // Allow others to change patterns using hook.
+    if (empty($this->subjectPatternsHooked)) {
+      $patterns = $this->subjectPatterns;
+      CRM_Utils_Hook::caseEmailSubjectPatterns($patterns);
+      $this->subjectPatternsHooked = $patterns;
+    }
+
+    return !empty($this->subjectPatternsHooked)
+      ? $this->subjectPatternsHooked
+      : $this->subjectPatterns;
+  }
+
+  /**
+   * Returns value of some class property.
+   *
+   * @param string $name
+   *   Property name.
+   *
+   * @return mixed|null
+   *   Property value or null if property does not exist.
+   */
+  public function get($name) {
+    return $this->{$name} ?? NULL;
+  }
+
+  /**
+   * Sets value of some class property.
+   *
+   * @param string $name
+   *   Property name.
+   * @param mixed $value
+   *   New property value.
+   */
+  public function set($name, $value) {
+    if (isset($this->{$name})) {
+      $this->{$name} = $value;
+    }
+  }
+
+}
diff --git a/civicrm/CRM/Utils/Mail/EmailProcessor.php b/civicrm/CRM/Utils/Mail/EmailProcessor.php
index a8be02ce0ac02946a493c804388edcb99db5cd52..fe24b02e02721bb1989e7b1f907d46794bc0a177 100644
--- a/civicrm/CRM/Utils/Mail/EmailProcessor.php
+++ b/civicrm/CRM/Utils/Mail/EmailProcessor.php
@@ -157,7 +157,7 @@ class CRM_Utils_Mail_EmailProcessor {
     try {
       $store = CRM_Mailing_MailStore::getStore($dao->name);
     }
-    catch (Exception$e) {
+    catch (Exception $e) {
       $message = ts('Could not connect to MailStore for ') . $dao->username . '@' . $dao->server . '<p>';
       $message .= ts('Error message: ');
       $message .= '<pre>' . $e->getMessage() . '</pre><p>';
@@ -224,9 +224,19 @@ class CRM_Utils_Mail_EmailProcessor {
 
         // preseve backward compatibility
         if ($usedfor == 0 || $is_create_activities) {
+          // Mail account may have 'Skip emails which do not have a Case ID
+          // or Case hash' option, if its enabled and email is not related
+          // to cases - then we need to put email to ignored folder.
+          $caseMailUtils = new CRM_Utils_Mail_CaseMail();
+          if (!empty($dao->is_non_case_email_skipped) && !$caseMailUtils->isCaseEmail($mail->subject)) {
+            $store->markIgnored($key);
+            continue;
+          }
+
           // if its the activities that needs to be processed ..
           try {
-            $mailParams = CRM_Utils_Mail_Incoming::parseMailingObject($mail);
+            $createContact = !($dao->is_contact_creation_disabled_if_no_match ?? FALSE);
+            $mailParams = CRM_Utils_Mail_Incoming::parseMailingObject($mail, $createContact, FALSE);
           }
           catch (Exception $e) {
             echo $e->getMessage();
@@ -241,6 +251,7 @@ class CRM_Utils_Mail_EmailProcessor {
           if (!empty($dao->activity_status)) {
             $params['status_id'] = $dao->activity_status;
           }
+
           $result = civicrm_api('activity', 'create', $params);
 
           if ($result['is_error']) {
diff --git a/civicrm/CRM/Utils/Mail/Incoming.php b/civicrm/CRM/Utils/Mail/Incoming.php
index 1e2da042236bb3d28b59d7025bd3c2dfd5736439..a11961081250ef2988a6e0ff9fdcfc1ea7d0b544 100644
--- a/civicrm/CRM/Utils/Mail/Incoming.php
+++ b/civicrm/CRM/Utils/Mail/Incoming.php
@@ -322,10 +322,12 @@ class CRM_Utils_Mail_Incoming {
 
   /**
    * @param $mail
+   * @param $createContact
+   * @param $requireContact
    *
    * @return array
    */
-  public static function parseMailingObject(&$mail) {
+  public static function parseMailingObject(&$mail, $createContact = TRUE, $requireContact = TRUE) {
 
     $config = CRM_Core_Config::singleton();
 
@@ -342,18 +344,18 @@ class CRM_Utils_Mail_Incoming {
     }
 
     $params['from'] = [];
-    self::parseAddress($mail->from, $field, $params['from'], $mail);
+    self::parseAddress($mail->from, $field, $params['from'], $mail, $createContact);
 
     // we definitely need a contact id for the from address
     // if we dont have one, skip this email
-    if (empty($params['from']['id'])) {
+    if ($requireContact && empty($params['from']['id'])) {
       return NULL;
     }
 
     $emailFields = ['to', 'cc', 'bcc'];
     foreach ($emailFields as $field) {
       $value = $mail->$field;
-      self::parseAddresses($value, $field, $params, $mail);
+      self::parseAddresses($value, $field, $params, $mail, $createContact);
     }
 
     // define other parameters
@@ -396,8 +398,9 @@ class CRM_Utils_Mail_Incoming {
    * @param array $params
    * @param $subParam
    * @param $mail
+   * @param $createContact
    */
-  public static function parseAddress(&$address, &$params, &$subParam, &$mail) {
+  public static function parseAddress(&$address, &$params, &$subParam, &$mail, $createContact = TRUE) {
     // CRM-9484
     if (empty($address->email)) {
       return;
@@ -408,7 +411,7 @@ class CRM_Utils_Mail_Incoming {
 
     $contactID = self::getContactID($subParam['email'],
       $subParam['name'],
-      TRUE,
+      $createContact,
       $mail
     );
     $subParam['id'] = $contactID ? $contactID : NULL;
@@ -419,13 +422,14 @@ class CRM_Utils_Mail_Incoming {
    * @param $token
    * @param array $params
    * @param $mail
+   * @param $createContact
    */
-  public static function parseAddresses(&$addresses, $token, &$params, &$mail) {
+  public static function parseAddresses(&$addresses, $token, &$params, &$mail, $createContact = TRUE) {
     $params[$token] = [];
 
     foreach ($addresses as $address) {
       $subParam = [];
-      self::parseAddress($address, $params, $subParam, $mail);
+      self::parseAddress($address, $params, $subParam, $mail, $createContact);
       $params[$token][] = $subParam;
     }
   }
diff --git a/civicrm/CRM/Utils/Money.php b/civicrm/CRM/Utils/Money.php
index 9da7a98fe9abcc4bca197eba8e9ae21f9fc9c433..c99a792167c766901f6d58c1cefdf53dfdf40f90 100644
--- a/civicrm/CRM/Utils/Money.php
+++ b/civicrm/CRM/Utils/Money.php
@@ -17,6 +17,7 @@
 
 use Brick\Money\Money;
 use Brick\Money\Context\DefaultContext;
+use Brick\Money\Context\CustomContext;
 use Brick\Math\RoundingMode;
 
 /**
@@ -201,7 +202,15 @@ class CRM_Utils_Money {
    * @return string
    */
   protected static function formatLocaleNumericRounded($amount, $numberOfPlaces) {
-    return self::formatLocaleNumeric(round($amount, $numberOfPlaces));
+    if (!extension_loaded('intl')) {
+      self::missingIntlNotice();
+      return self::formatNumericByFormat($amount, '%!.' . $numberOfPlaces . 'i');
+    }
+    $money = Money::of($amount, CRM_Core_Config::singleton()->defaultCurrency, new CustomContext($numberOfPlaces), RoundingMode::CEILING);
+    $formatter = new \NumberFormatter(CRM_Core_I18n::getLocale(), NumberFormatter::CURRENCY);
+    $formatter->setSymbol(\NumberFormatter::CURRENCY_SYMBOL, '');
+    $formatter->setAttribute(\NumberFormatter::MIN_FRACTION_DIGITS, $numberOfPlaces);
+    return $money->formatWith($formatter);
   }
 
   /**
@@ -216,7 +225,42 @@ class CRM_Utils_Money {
    *   Formatted amount.
    */
   public static function formatLocaleNumericRoundedByCurrency($amount, $currency) {
-    $amount = self::formatLocaleNumericRounded($amount, self::getCurrencyPrecision($currency));
+    return self::formatLocaleNumericRoundedByPrecision($amount, self::getCurrencyPrecision($currency));
+  }
+
+  /**
+   * Format money for display (just numeric part) according to the current locale with rounding to the supplied precision.
+   *
+   * This handles both rounding & replacement of the currency separators for the locale.
+   *
+   * @param string $amount
+   * @param int $precision
+   *
+   * @return string
+   *   Formatted amount.
+   */
+  public static function formatLocaleNumericRoundedByPrecision($amount, $precision) {
+    $amount = self::formatLocaleNumericRounded($amount, $precision);
+    return self::replaceCurrencySeparators($amount);
+  }
+
+  /**
+   * Format money for display with rounding to the supplied precision but without padding.
+   *
+   * If the string is shorter than the precision trailing zeros are not added to reach the precision
+   * beyond the 2 required for normally currency formatting.
+   *
+   * This handles both rounding & replacement of the currency separators for the locale.
+   *
+   * @param string $amount
+   * @param int $precision
+   *
+   * @return string
+   *   Formatted amount.
+   */
+  public static function formatLocaleNumericRoundedByOptionalPrecision($amount, $precision) {
+    $decimalPlaces = strlen(substr($amount, strpos($amount, '.') + 1));
+    $amount = self::formatLocaleNumericRounded($amount, $precision > $decimalPlaces ? $decimalPlaces : $precision);
     return self::replaceCurrencySeparators($amount);
   }
 
@@ -271,4 +315,11 @@ class CRM_Utils_Money {
     return $amount;
   }
 
+  /**
+   * Emits a notice indicating we have fallen back to a less accurate way of formatting money due to missing intl extension
+   */
+  public static function missingIntlNotice() {
+    CRM_Core_Session::singleton()->setStatus(ts('As this system does not include the PHP intl extension, CiviCRM has fallen back onto a slightly less accurate and deprecated method to format money'), ts('Missing PHP INTL extension'));
+  }
+
 }
diff --git a/civicrm/CRM/Utils/System/Backdrop.php b/civicrm/CRM/Utils/System/Backdrop.php
index 83b66078cd1c013fc4f5c14e40b2b0cbde544a56..93342e256f36d9035463f88d0d289a46108360ed 100644
--- a/civicrm/CRM/Utils/System/Backdrop.php
+++ b/civicrm/CRM/Utils/System/Backdrop.php
@@ -524,7 +524,9 @@ AND    u.status = 1
     }
     // load Backdrop bootstrap
     chdir($cmsPath);
-    define('BACKDROP_ROOT', $cmsPath);
+    if (!defined('BACKDROP_ROOT')) {
+      define('BACKDROP_ROOT', $cmsPath);
+    }
 
     // For Backdrop multi-site CRM-11313
     if ($realPath && strpos($realPath, 'sites/all/modules/') === FALSE) {
diff --git a/civicrm/CRM/Utils/System/Drupal8.php b/civicrm/CRM/Utils/System/Drupal8.php
index 78479501e3ab79599f79ef9af85660070e571ea7..85d0468296e910987fdfd9d19abcaa810015245e 100644
--- a/civicrm/CRM/Utils/System/Drupal8.php
+++ b/civicrm/CRM/Utils/System/Drupal8.php
@@ -34,7 +34,7 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
     }
 
     /** @var \Drupal\user\Entity\User $account */
-    $account = entity_create('user');
+    $account = \Drupal::entityTypeManager()->getStorage('user')->create();
     $account->setUsername($params['cms_name'])->setEmail($params[$mail]);
 
     // Allow user to set password only if they are an admin or if
@@ -49,7 +49,7 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
     if ($user_register_conf != 'visitors' && !$user->hasPermission('administer users')) {
       $account->block();
     }
-    elseif (!$verify_mail_conf) {
+    elseif ($verify_mail_conf) {
       $account->activate();
     }
 
@@ -98,7 +98,7 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
     }
 
     // If this is a user creating their own account, login them in!
-    if ($account->isActive() && $user->isAnonymous()) {
+    if (!$verify_mail_conf && $account->isActive() && $user->isAnonymous()) {
       \user_login_finalize($account);
     }
 
@@ -109,7 +109,7 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
    * @inheritDoc
    */
   public function updateCMSName($ufID, $email) {
-    $user = entity_load('user', $ufID);
+    $user = \Drupal::entityTypeManager()->getStorage('user')->load($ufID);
     if ($user && $user->getEmail() != $email) {
       $user->setEmail($email);
 
@@ -134,7 +134,7 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
     if (!empty($params['name'])) {
       $name = $params['name'];
 
-      $user = entity_create('user');
+      $user = \Drupal::entityTypeManager()->getStorage('user')->create();
       $user->setUsername($name);
 
       // This checks for both username uniqueness and validity.
@@ -152,7 +152,7 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
     if (!empty($params['mail'])) {
       $mail = $params['mail'];
 
-      $user = entity_create('user');
+      $user = \Drupal::entityTypeManager()->getStorage('user')->create();
       $user->setEmail($mail);
 
       // This checks for both email uniqueness.
@@ -172,7 +172,7 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
    */
   public function getLoginURL($destination = '') {
     $query = $destination ? ['destination' => $destination] : [];
-    return \Drupal::url('user.login', [], ['query' => $query]);
+    return \Drupal\Core\Url::fromRoute('user.login', [], ['query' => $query])->toString();
   }
 
   /**
@@ -430,7 +430,7 @@ class CRM_Utils_System_Drupal8 extends CRM_Utils_System_DrupalBase {
     CRM_Utils_Hook::config($config);
 
     if ($loadUser) {
-      if (!empty($params['uid']) && $username = \Drupal\user\Entity\User::load($params['uid'])->getUsername()) {
+      if (!empty($params['uid']) && $username = \Drupal\user\Entity\User::load($params['uid'])->getAccountName()) {
         $this->loadUser($username);
       }
       elseif (!empty($params['name']) && !empty($params['pass']) && \Drupal::service('user.auth')->authenticate($params['name'], $params['pass'])) {
diff --git a/civicrm/CRM/Utils/System/DrupalBase.php b/civicrm/CRM/Utils/System/DrupalBase.php
index aeef820d20fde883262d4ed4d11e9cd1bf3c47bc..9234c87d75fce66ae9c93a288e6b6d423c7b8747 100644
--- a/civicrm/CRM/Utils/System/DrupalBase.php
+++ b/civicrm/CRM/Utils/System/DrupalBase.php
@@ -660,7 +660,8 @@ abstract class CRM_Utils_System_DrupalBase extends CRM_Utils_System_Base {
 
     // Get the menu for above URL.
     $item = CRM_Core_Menu::get($path);
-    return !empty($item['is_public']);
+    // In case the URL is not a civicrm page (a drupal page) we set the FE theme to TRUE - covering the corner case
+    return (empty($item) || !empty($item['is_public']));
   }
 
   /**
diff --git a/civicrm/CRM/Utils/Token.php b/civicrm/CRM/Utils/Token.php
index 850a2516ac740961965fb3f131888c86b873dee8..6cc3365cae923f45c612100375405dec2d1d156a 100644
--- a/civicrm/CRM/Utils/Token.php
+++ b/civicrm/CRM/Utils/Token.php
@@ -1160,11 +1160,11 @@ class CRM_Utils_Token {
    *   Extra params.
    * @param array $tokens
    *   The list of tokens we've extracted from the content.
-   * @param null $className
-   * @param int $jobID
+   * @param string|null $className
+   * @param int|null $jobID
    *   The mailing list jobID - this is a legacy param.
    *
-   * @return array
+   * @return array - e.g [[1 => ['first_name' => 'bob'...], 34 => ['first_name' => 'fred'...]]]
    */
   public static function getTokenDetails(
     $contactIDs,
@@ -1227,8 +1227,7 @@ class CRM_Utils_Token {
       }
     }
 
-    $details = CRM_Contact_BAO_Query::apiQuery($params, $returnProperties, NULL, NULL, 0, count($contactIDs), TRUE, FALSE, TRUE, CRM_Contact_BAO_Query::MODE_CONTACTS, NULL, TRUE);
-    $contactDetails = &$details[0];
+    [$contactDetails] = CRM_Contact_BAO_Query::apiQuery($params, $returnProperties, NULL, NULL, 0, count($contactIDs), TRUE, FALSE, TRUE, CRM_Contact_BAO_Query::MODE_CONTACTS, NULL, TRUE);
 
     foreach ($contactIDs as $contactID) {
       if (array_key_exists($contactID, $contactDetails)) {
@@ -1270,7 +1269,7 @@ class CRM_Utils_Token {
       $tokens,
       $className
     );
-    return $details;
+    return [$contactDetails];
   }
 
   /**
diff --git a/civicrm/Civi/ActionSchedule/Mapping.php b/civicrm/Civi/ActionSchedule/Mapping.php
index f6c1450d5644dc197e38f860bac0c16f68645e64..fc0e667b4d85ebe92e3ff710c4e04dc934c95fd6 100644
--- a/civicrm/Civi/ActionSchedule/Mapping.php
+++ b/civicrm/Civi/ActionSchedule/Mapping.php
@@ -337,4 +337,10 @@ abstract class Mapping implements MappingInterface {
     return FALSE;
   }
 
+  /**
+   * Determine whether a schedule based on this mapping should
+   * send to additional contacts.
+   */
+  abstract public function sendToAdditional($entityId): bool;
+
 }
diff --git a/civicrm/Civi/ActionSchedule/MappingInterface.php b/civicrm/Civi/ActionSchedule/MappingInterface.php
index 3dcd04fea133f840c8ee3e7eb6fd38735d1f5dd5..f551fc11c1968a303968e18fd02cd35387252dcf 100644
--- a/civicrm/Civi/ActionSchedule/MappingInterface.php
+++ b/civicrm/Civi/ActionSchedule/MappingInterface.php
@@ -139,4 +139,10 @@ interface MappingInterface {
    */
   public function resetOnTriggerDateChange($schedule);
 
+  /**
+   * Determine whether a schedule based on this mapping should
+   * send to additional contacts.
+   */
+  public function sendToAdditional($entityId): bool;
+
 }
diff --git a/civicrm/Civi/ActionSchedule/RecipientBuilder.php b/civicrm/Civi/ActionSchedule/RecipientBuilder.php
index c8a32dd97e3756e8125fb2e31b881a12f0fe4b0d..c52f64adbb6549278a2c6a0dd83b8a945442243a 100644
--- a/civicrm/Civi/ActionSchedule/RecipientBuilder.php
+++ b/civicrm/Civi/ActionSchedule/RecipientBuilder.php
@@ -138,7 +138,7 @@ class RecipientBuilder {
   public function build() {
     $this->buildRelFirstPass();
 
-    if ($this->prepareAddlFilter('c.id') && $this->notTemplate()) {
+    if ($this->prepareAddlFilter('c.id') && $this->mapping->sendToAdditional($this->actionSchedule->entity_value)) {
       $this->buildAddlFirstPass();
     }
 
@@ -146,7 +146,7 @@ class RecipientBuilder {
       $this->buildRelRepeatPass();
     }
 
-    if ($this->actionSchedule->is_repeat && $this->prepareAddlFilter('c.id')) {
+    if ($this->actionSchedule->is_repeat && $this->prepareAddlFilter('c.id') && $this->mapping->sendToAdditional($this->actionSchedule->entity_value)) {
       $this->buildAddlRepeatPass();
     }
   }
@@ -603,25 +603,4 @@ reminder.action_schedule_id = {$this->actionSchedule->id}";
     return $this->mapping->resetOnTriggerDateChange($this->actionSchedule);
   }
 
-  /**
-   * Confirm this object isn't attached to a template.
-   * Returns TRUE if this action schedule isn't attached to a template.
-   * Templates are (currently) unique to events, so we only evaluate those.
-   *
-   * @return bool;
-   */
-  private function notTemplate() {
-    if ($this->mapping->getEntity() === 'civicrm_participant') {
-      $entityId = $this->actionSchedule->entity_value;
-      $query = new \CRM_Utils_SQL_Select('civicrm_event e');
-      $sql = $query
-        ->select('is_template')
-        ->where("e.id = {$entityId}")
-        ->toSQL();
-      $dao = \CRM_Core_DAO::executeQuery($sql);
-      return !(bool) $dao->fetchValue();
-    }
-    return TRUE;
-  }
-
 }
diff --git a/civicrm/Civi/Angular/Manager.php b/civicrm/Civi/Angular/Manager.php
index 4b21537d3fba5b0446152f54c12e8cbcf250b547..a763cf9e716dfa048731474dcbea2b1dd8bba8b0 100644
--- a/civicrm/Civi/Angular/Manager.php
+++ b/civicrm/Civi/Angular/Manager.php
@@ -53,6 +53,20 @@ class Manager {
     $this->cache = $cache ? $cache : new \CRM_Utils_Cache_ArrayCache([]);
   }
 
+  /**
+   * Clear out any runtime-cached metadata.
+   *
+   * This is useful if, eg, you have recently added or destroyed Angular modules.
+   *
+   * @return static
+   */
+  public function clear() {
+    $this->cache->clear();
+    $this->modules = NULL;
+    $this->changeSets = NULL;
+    return $this;
+  }
+
   /**
    * Get a list of AngularJS modules which should be autoloaded.
    *
diff --git a/civicrm/Civi/Api4/Action/Entity/Get.php b/civicrm/Civi/Api4/Action/Entity/Get.php
index 044105e4e5a639afd7395a160301dff0e1d3d31f..3b8484e16f1a7b0978577ddd4ce718a9092d27f9 100644
--- a/civicrm/Civi/Api4/Action/Entity/Get.php
+++ b/civicrm/Civi/Api4/Action/Entity/Get.php
@@ -20,6 +20,7 @@
 namespace Civi\Api4\Action\Entity;
 
 use Civi\Api4\CustomGroup;
+use Civi\Api4\Service\Schema\Joinable\CustomGroupJoinable;
 
 /**
  * Get the names & docblocks of all APIv4 entities.
@@ -91,10 +92,12 @@ class Get extends \Civi\Api4\Generic\BasicGetAction {
       ->execute();
     foreach ($customEntities as $customEntity) {
       $fieldName = 'Custom_' . $customEntity['name'];
+      $baseEntity = '\Civi\Api4\\' . CustomGroupJoinable::getEntityFromExtends($customEntity['extends']);
       $entities[$fieldName] = [
         'name' => $fieldName,
         'title' => $customEntity['title'],
-        'description' => 'Custom group - extends ' . $customEntity['extends'],
+        'title_plural' => $customEntity['title'],
+        'description' => ts('Custom group for %1', [1 => $baseEntity::getInfo()['title_plural']]),
         'see' => [
           'https://docs.civicrm.org/user/en/latest/organising-your-data/creating-custom-fields/#multiple-record-fieldsets',
           '\\Civi\\Api4\\CustomGroup',
diff --git a/civicrm/Civi/Api4/Entity.php b/civicrm/Civi/Api4/Entity.php
index 49f39859ecc6b090f4326dc14a5f784aa9b5e9bd..8a3b7771b9ab241f2e2fa77f068c775c136d34af 100644
--- a/civicrm/Civi/Api4/Entity.php
+++ b/civicrm/Civi/Api4/Entity.php
@@ -50,7 +50,11 @@ class Entity extends Generic\AbstractEntity {
         ],
         [
           'name' => 'title',
-          'description' => 'Localized title',
+          'description' => 'Localized title (singular)',
+        ],
+        [
+          'name' => 'title_plural',
+          'description' => 'Localized title (plural)',
         ],
         [
           'name' => 'type',
diff --git a/civicrm/Civi/Api4/Generic/AbstractAction.php b/civicrm/Civi/Api4/Generic/AbstractAction.php
index fa995ce0d8d4acf2e7728940e85d1d824a928af6..8ac54c577438864ae38e76e4818ecbdff80391cc 100644
--- a/civicrm/Civi/Api4/Generic/AbstractAction.php
+++ b/civicrm/Civi/Api4/Generic/AbstractAction.php
@@ -496,7 +496,7 @@ abstract class AbstractAction implements \ArrayAccess {
         if ($field) {
           $optionFields[$fieldName] = [
             'val' => $record[$expr],
-            'name' => empty($field['custom_field_id']) ? $field['name'] : 'custom_' . $field['custom_field_id'],
+            'field' => $field,
             'suffix' => substr($expr, $suffix + 1),
             'depends' => $field['input_attrs']['controlField'] ?? NULL,
           ];
@@ -506,11 +506,11 @@ abstract class AbstractAction implements \ArrayAccess {
     }
     // Sort option lookups by dependency, so e.g. country_id is processed first, then state_province_id, then county_id
     uasort($optionFields, function ($a, $b) {
-      return $a['name'] === $b['depends'] ? -1 : 1;
+      return $a['field']['name'] === $b['depends'] ? -1 : 1;
     });
     // Replace pseudoconstants. Note this is a reverse lookup as we are evaluating input not output.
     foreach ($optionFields as $fieldName => $info) {
-      $options = FormattingUtil::getPseudoconstantList($this->_entityName, $info['name'], $info['suffix'], $record, 'create');
+      $options = FormattingUtil::getPseudoconstantList($info['field'], $info['suffix'], $record, 'create');
       $record[$fieldName] = FormattingUtil::replacePseudoconstant($options, $info['val'], TRUE);
     }
   }
diff --git a/civicrm/Civi/Api4/Generic/AbstractEntity.php b/civicrm/Civi/Api4/Generic/AbstractEntity.php
index 269bcc31b3c9bcb12bfaeadaf26a9539cd1d7252..d777526f0d60213123e0c7585415e70db27287a5 100644
--- a/civicrm/Civi/Api4/Generic/AbstractEntity.php
+++ b/civicrm/Civi/Api4/Generic/AbstractEntity.php
@@ -81,9 +81,11 @@ abstract class AbstractEntity {
   /**
    * Overridable function to return a localized title for this entity.
    *
+   * @param bool $plural
+   *   Whether to return a plural title.
    * @return string
    */
-  protected static function getEntityTitle() {
+  protected static function getEntityTitle($plural = FALSE) {
     return static::getEntityName();
   }
 
@@ -121,6 +123,7 @@ abstract class AbstractEntity {
     $info = [
       'name' => static::getEntityName(),
       'title' => static::getEntityTitle(),
+      'title_plural' => static::getEntityTitle(TRUE),
       'type' => self::stripNamespace(get_parent_class(static::class)),
     ];
     $reflection = new \ReflectionClass(static::class);
diff --git a/civicrm/Civi/Api4/Generic/DAOEntity.php b/civicrm/Civi/Api4/Generic/DAOEntity.php
index a7c47ee2e9a15e91f6626007b7f129e5c0511840..c27aac4ce0c33562f687784058465ecb264712e2 100644
--- a/civicrm/Civi/Api4/Generic/DAOEntity.php
+++ b/civicrm/Civi/Api4/Generic/DAOEntity.php
@@ -91,12 +91,14 @@ abstract class DAOEntity extends AbstractEntity {
   }
 
   /**
+   * @param bool $plural
+   *   Whether to return a plural title.
    * @return string
    */
-  protected static function getEntityTitle() {
+  protected static function getEntityTitle($plural = FALSE) {
     $name = static::getEntityName();
     $dao = \CRM_Core_DAO_AllCoreTables::getFullName($name);
-    return $dao ? $dao::getEntityTitle() : $name;
+    return $dao ? $dao::getEntityTitle($plural) : $name;
   }
 
   /**
diff --git a/civicrm/Civi/Api4/Generic/Traits/DAOActionTrait.php b/civicrm/Civi/Api4/Generic/Traits/DAOActionTrait.php
index 6497168a3d955be5ce00096d08a354572dce548b..b7b4c2d3ac09d86ecf15458bec7ae578abc8226d 100644
--- a/civicrm/Civi/Api4/Generic/Traits/DAOActionTrait.php
+++ b/civicrm/Civi/Api4/Generic/Traits/DAOActionTrait.php
@@ -13,6 +13,7 @@
 namespace Civi\Api4\Generic\Traits;
 
 use Civi\Api4\CustomField;
+use Civi\Api4\Service\Schema\Joinable\CustomGroupJoinable;
 use Civi\Api4\Utils\FormattingUtil;
 
 /**
@@ -109,7 +110,6 @@ trait DAOActionTrait {
     $oddballs = [
       'EntityTag' => 'add',
       'GroupContact' => 'add',
-      'Website' => 'add',
     ];
     $method = $oddballs[$this->getEntityName()] ?? 'create';
     if (!method_exists($baoName, $method)) {
@@ -134,7 +134,7 @@ trait DAOActionTrait {
       }
 
       if ($this->getEntityName() === 'Address') {
-        $createResult = $baoName::add($item, $this->fixAddress);
+        $createResult = $baoName::$method($item, $this->fixAddress);
       }
       elseif (method_exists($baoName, $method)) {
         $createResult = $baoName::$method($item);
@@ -178,7 +178,7 @@ trait DAOActionTrait {
       if (NULL !== $value) {
 
         if ($field['suffix']) {
-          $options = FormattingUtil::getPseudoconstantList($this->getEntityName(), 'custom_' . $field['id'], $field['suffix'], $params, $this->getActionName());
+          $options = FormattingUtil::getPseudoconstantList($field, $field['suffix'], $params, $this->getActionName());
           $value = FormattingUtil::replacePseudoconstant($options, $value, TRUE);
         }
 
@@ -210,24 +210,33 @@ trait DAOActionTrait {
   /**
    * Gets field info needed to save custom data
    *
-   * @param string $name
+   * @param string $fieldExpr
    *   Field identifier with possible suffix, e.g. MyCustomGroup.MyField1:label
    * @return array|NULL
    */
-  protected function getCustomFieldInfo($name) {
-    if (strpos($name, '.') === FALSE) {
+  protected function getCustomFieldInfo(string $fieldExpr) {
+    if (strpos($fieldExpr, '.') === FALSE) {
       return NULL;
     }
-    list($groupName, $fieldName) = explode('.', $name);
+    list($groupName, $fieldName) = explode('.', $fieldExpr);
     list($fieldName, $suffix) = array_pad(explode(':', $fieldName), 2, NULL);
-    if (empty(\Civi::$statics['APIv4_Custom_Fields'][$groupName])) {
-      \Civi::$statics['APIv4_Custom_Fields'][$groupName] = (array) CustomField::get(FALSE)
+    $cacheKey = "APIv4_Custom_Fields-$groupName";
+    $info = \Civi::cache('metadata')->get($cacheKey);
+    if (!isset($info[$fieldName])) {
+      $info = [];
+      $fields = CustomField::get(FALSE)
         ->addSelect('id', 'name', 'html_type', 'custom_group.extends')
         ->addWhere('custom_group.name', '=', $groupName)
         ->execute()->indexBy('name');
+      foreach ($fields as $name => $field) {
+        $field['custom_field_id'] = $field['id'];
+        $field['name'] = $groupName . '.' . $name;
+        $field['entity'] = CustomGroupJoinable::getEntityFromExtends($field['custom_group.extends']);
+        $info[$name] = $field;
+      }
+      \Civi::cache('metadata')->set($cacheKey, $info);
     }
-    $info = \Civi::$statics['APIv4_Custom_Fields'][$groupName][$fieldName] ?? NULL;
-    return $info ? ['suffix' => $suffix] + $info : NULL;
+    return isset($info[$fieldName]) ? ['suffix' => $suffix] + $info[$fieldName] : NULL;
   }
 
   /**
diff --git a/civicrm/Civi/Api4/LineItem.php b/civicrm/Civi/Api4/LineItem.php
new file mode 100644
index 0000000000000000000000000000000000000000..c630346a4b25e90100514e37c36df423f665d065
--- /dev/null
+++ b/civicrm/Civi/Api4/LineItem.php
@@ -0,0 +1,28 @@
+<?php
+
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ *
+ * @package CRM
+ * @copyright CiviCRM LLC https://civicrm.org/licensing
+ */
+
+namespace Civi\Api4;
+
+/**
+ * LineItem entity.
+ *
+ * @package Civi\Api4
+ */
+class LineItem extends Generic\DAOEntity {
+
+}
diff --git a/civicrm/Civi/Api4/LocBlock.php b/civicrm/Civi/Api4/LocBlock.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b0ac77de9a15fa0ad186f3d13ed5ac23a662202
--- /dev/null
+++ b/civicrm/Civi/Api4/LocBlock.php
@@ -0,0 +1,22 @@
+<?php
+
+/*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+ */
+
+namespace Civi\Api4;
+
+/**
+ * ContributionPage entity.
+ *
+ * @package Civi\Api4
+ */
+class LocBlock extends Generic\DAOEntity {
+
+}
diff --git a/civicrm/Civi/Api4/Query/Api4SelectQuery.php b/civicrm/Civi/Api4/Query/Api4SelectQuery.php
index e4f8ceb187fcd6d37715c9b92cbb2cee4d403d77..a1654769af00edc965a77e5263f174ddccf67a1c 100644
--- a/civicrm/Civi/Api4/Query/Api4SelectQuery.php
+++ b/civicrm/Civi/Api4/Query/Api4SelectQuery.php
@@ -138,7 +138,7 @@ class Api4SelectQuery {
       }
       $results[] = $result;
     }
-    FormattingUtil::formatOutputValues($results, $this->apiFieldSpec, $this->getEntity());
+    FormattingUtil::formatOutputValues($results, $this->apiFieldSpec, $this->getEntity(), 'get', $this->selectAliases);
     return $results;
   }
 
@@ -275,7 +275,7 @@ class Api4SelectQuery {
       $suffix = strstr($item, ':');
       if ($suffix && $expr->getType() === 'SqlField') {
         $field = $this->getField($item);
-        $options = FormattingUtil::getPseudoconstantList($field['entity'], $field['name'], substr($suffix, 1));
+        $options = FormattingUtil::getPseudoconstantList($field, substr($suffix, 1));
         if ($options) {
           asort($options);
           $column = "FIELD($column,'" . implode("','", array_keys($options)) . "')";
diff --git a/civicrm/Civi/Api4/Query/SqlExpression.php b/civicrm/Civi/Api4/Query/SqlExpression.php
index 2759d3baff0a72b28302685f7f119815dc81cc79..bce3d47144da3938a007f248ec7e7267891f07bc 100644
--- a/civicrm/Civi/Api4/Query/SqlExpression.php
+++ b/civicrm/Civi/Api4/Query/SqlExpression.php
@@ -37,6 +37,14 @@ abstract class SqlExpression {
    */
   public $expr = '';
 
+  /**
+   * Whether or not pseudoconstant suffixes should be evaluated during output.
+   *
+   * @var bool
+   * @see \Civi\Api4\Utils\FormattingUtil::formatOutputValues
+   */
+  public $supportsExpansion = FALSE;
+
   /**
    * SqlFunction constructor.
    * @param string $expr
diff --git a/civicrm/Civi/Api4/Query/SqlField.php b/civicrm/Civi/Api4/Query/SqlField.php
index 67f1c206a6ff73dc2ce09aebe158bb49c265c6b8..b6f69f4d5fb0744df03265abd522fa3b9c1796b5 100644
--- a/civicrm/Civi/Api4/Query/SqlField.php
+++ b/civicrm/Civi/Api4/Query/SqlField.php
@@ -16,6 +16,8 @@ namespace Civi\Api4\Query;
  */
 class SqlField extends SqlExpression {
 
+  public $supportsExpansion = TRUE;
+
   protected function initialize() {
     if ($this->alias && $this->alias !== $this->expr) {
       throw new \API_Exception("Aliasing field names is not allowed, only expressions can have an alias.");
diff --git a/civicrm/Civi/Api4/Query/SqlFunction.php b/civicrm/Civi/Api4/Query/SqlFunction.php
index dbc245f7bfc40dfd5e3ed0c5e6dbc74a47614b75..ef5d7747f259a5b5252f137a4e1dd08a1d808e3a 100644
--- a/civicrm/Civi/Api4/Query/SqlFunction.php
+++ b/civicrm/Civi/Api4/Query/SqlFunction.php
@@ -18,8 +18,14 @@ namespace Civi\Api4\Query;
  */
 abstract class SqlFunction extends SqlExpression {
 
+  /**
+   * @var array
+   */
   protected static $params = [];
 
+  /**
+   * @var array[]
+   */
   protected $args = [];
 
   /**
@@ -40,17 +46,22 @@ abstract class SqlFunction extends SqlExpression {
    */
   protected function initialize() {
     $arg = trim(substr($this->expr, strpos($this->expr, '(') + 1, -1));
-    foreach ($this->getParams() as $param) {
+    foreach ($this->getParams() as $idx => $param) {
       $prefix = $this->captureKeyword($param['prefix'], $arg);
+      $this->args[$idx] = [
+        'prefix' => $prefix,
+        'expr' => [],
+        'suffix' => NULL,
+      ];
       if ($param['expr'] && isset($prefix) || in_array('', $param['prefix']) || !$param['optional']) {
-        $this->captureExpressions($arg, $param['expr'], $param['must_be'], $param['cant_be']);
-        $this->captureKeyword($param['suffix'], $arg);
+        $this->args[$idx]['expr'] = $this->captureExpressions($arg, $param['expr'], $param['must_be'], $param['cant_be']);
+        $this->args[$idx]['suffix'] = $this->captureKeyword($param['suffix'], $arg);
       }
     }
   }
 
   /**
-   * Shift a keyword off the beginning of the argument string and into the argument array.
+   * Shift a keyword off the beginning of the argument string and return it.
    *
    * @param array $keywords
    *   Whitelist of keywords
@@ -60,7 +71,6 @@ abstract class SqlFunction extends SqlExpression {
   private function captureKeyword($keywords, &$arg) {
     foreach (array_filter($keywords) as $key) {
       if (strpos($arg, $key . ' ') === 0) {
-        $this->args[] = $key;
         $arg = ltrim(substr($arg, strlen($key)));
         return $key;
       }
@@ -69,35 +79,34 @@ abstract class SqlFunction extends SqlExpression {
   }
 
   /**
-   * Shifts 0 or more expressions off the argument string and into the argument array
+   * Shifts 0 or more expressions off the argument string and returns them
    *
    * @param string $arg
    * @param int $limit
    * @param array $mustBe
    * @param array $cantBe
+   * @return array
    * @throws \API_Exception
    */
   private function captureExpressions(&$arg, $limit, $mustBe, $cantBe) {
-    $captured = 0;
+    $captured = [];
     $arg = ltrim($arg);
     while ($arg) {
       $item = $this->captureExpression($arg);
       $arg = ltrim(substr($arg, strlen($item)));
       $expr = SqlExpression::convert($item, FALSE, $mustBe, $cantBe);
       $this->fields = array_merge($this->fields, $expr->getFields());
-      if ($captured) {
-        $this->args[] = ',';
-      }
-      $this->args[] = $expr;
+      $captured[] = $expr;
       $captured++;
       // Keep going if we have a comma indicating another expression follows
-      if ($captured < $limit && substr($arg, 0, 1) === ',') {
+      if (count($captured) < $limit && substr($arg, 0, 1) === ',') {
         $arg = ltrim(substr($arg, 1));
       }
       else {
-        return;
+        break;
       }
     }
+    return $captured;
   }
 
   /**
@@ -147,20 +156,50 @@ abstract class SqlFunction extends SqlExpression {
     return $item;
   }
 
+  /**
+   * Render the expression for insertion into the sql query
+   *
+   * @param array $fieldList
+   * @return string
+   */
   public function render(array $fieldList): string {
-    $output = $this->getName() . '(';
+    $output = '';
+    $params = $this->getParams();
     foreach ($this->args as $index => $arg) {
-      if ($index && $arg !== ',') {
-        $output .= ' ';
-      }
-      if (is_object($arg)) {
-        $output .= $arg->render($fieldList);
+      $rendered = $this->renderArg($arg, $params[$index], $fieldList);
+      if (strlen($rendered)) {
+        $output .= (strlen($output) ? ' ' : '') . $rendered;
       }
-      else {
-        $output .= $arg;
+    }
+    return $this->getName() . '(' . $output . ')';
+  }
+
+  /**
+   * @param array $arg
+   * @param array $param
+   * @param array $fieldList
+   * @return string
+   */
+  private function renderArg($arg, $param, $fieldList): string {
+    // Supply api_default
+    if (!isset($arg['prefix']) && !isset($arg['suffix']) && empty($arg['expr']) && !empty($param['api_default'])) {
+      $arg = [
+        'prefix' => $param['api_default']['prefix'] ?? reset($param['prefix']),
+        'expr' => array_map([parent::class, 'convert'], $param['api_default']['expr'] ?? []),
+        'suffix' => $param['api_default']['suffix'] ?? reset($param['suffix']),
+      ];
+    }
+    $rendered = $arg['prefix'] ?? '';
+    foreach ($arg['expr'] ?? [] as $idx => $expr) {
+      if (strlen($rendered) || $idx) {
+        $rendered .= $idx ? ', ' : ' ';
       }
+      $rendered .= $expr->render($fieldList);
+    }
+    if (isset($arg['suffix'])) {
+      $rendered .= (strlen($rendered) ? ' ' : '') . $arg['suffix'];
     }
-    return $output . ')';
+    return $rendered;
   }
 
   /**
@@ -194,11 +233,20 @@ abstract class SqlFunction extends SqlExpression {
         'optional' => FALSE,
         'must_be' => [],
         'cant_be' => ['SqlWild'],
+        'api_default' => NULL,
       ];
     }
     return $params;
   }
 
+  /**
+   * Get the arguments passed to this sql function instance.
+   * @return array[]
+   */
+  public function getArgs(): array {
+    return $this->args;
+  }
+
   /**
    * @return string
    */
diff --git a/civicrm/Civi/Api4/Query/SqlFunctionCOUNT.php b/civicrm/Civi/Api4/Query/SqlFunctionCOUNT.php
index f149108a8d9e665902937b93209e5507155942a2..2ab3d661630f9da57e8944502ddfb8f70e854c60 100644
--- a/civicrm/Civi/Api4/Query/SqlFunctionCOUNT.php
+++ b/civicrm/Civi/Api4/Query/SqlFunctionCOUNT.php
@@ -27,6 +27,17 @@ class SqlFunctionCOUNT extends SqlFunction {
     ],
   ];
 
+  /**
+   * Reformat result as array if using default separator
+   *
+   * @see \Civi\Api4\Utils\FormattingUtil::formatOutputValues
+   * @param string $value
+   * @return string|array
+   */
+  public function formatOutputValue($value) {
+    return (int) $value;
+  }
+
   /**
    * @return string
    */
diff --git a/civicrm/Civi/Api4/Query/SqlFunctionGREATEST.php b/civicrm/Civi/Api4/Query/SqlFunctionGREATEST.php
index 755ab2815112005b743315f702436f6dd1203ed8..5ce1b496a78ea00aae4b7140c5a5716b9695f776 100644
--- a/civicrm/Civi/Api4/Query/SqlFunctionGREATEST.php
+++ b/civicrm/Civi/Api4/Query/SqlFunctionGREATEST.php
@@ -16,6 +16,8 @@ namespace Civi\Api4\Query;
  */
 class SqlFunctionGREATEST extends SqlFunction {
 
+  public $supportsExpansion = TRUE;
+
   protected static $category = self::CATEGORY_COMPARISON;
 
   protected static $params = [
diff --git a/civicrm/Civi/Api4/Query/SqlFunctionGROUP_CONCAT.php b/civicrm/Civi/Api4/Query/SqlFunctionGROUP_CONCAT.php
index 869bd077bfea47280a749f8535af1b51c2756c32..b683f15a72362e68dc250a296a6f5200031afcb4 100644
--- a/civicrm/Civi/Api4/Query/SqlFunctionGROUP_CONCAT.php
+++ b/civicrm/Civi/Api4/Query/SqlFunctionGROUP_CONCAT.php
@@ -16,6 +16,8 @@ namespace Civi\Api4\Query;
  */
 class SqlFunctionGROUP_CONCAT extends SqlFunction {
 
+  public $supportsExpansion = TRUE;
+
   protected static $category = self::CATEGORY_AGGREGATE;
 
   protected static $params = [
@@ -37,9 +39,28 @@ class SqlFunctionGROUP_CONCAT extends SqlFunction {
       'expr' => 1,
       'must_be' => ['SqlString'],
       'optional' => TRUE,
+      // @see self::formatOutput()
+      'api_default' => [
+        'expr' => ['"' . \CRM_Core_DAO::VALUE_SEPARATOR . '"'],
+      ],
     ],
   ];
 
+  /**
+   * Reformat result as array if using default separator
+   *
+   * @see \Civi\Api4\Utils\FormattingUtil::formatOutputValues
+   * @param string $value
+   * @return string|array
+   */
+  public function formatOutputValue($value) {
+    $exprArgs = $this->getArgs();
+    if (!$exprArgs[2]['prefix']) {
+      $value = explode(\CRM_Core_DAO::VALUE_SEPARATOR, $value);
+    }
+    return $value;
+  }
+
   /**
    * @return string
    */
diff --git a/civicrm/Civi/Api4/Query/SqlFunctionLEAST.php b/civicrm/Civi/Api4/Query/SqlFunctionLEAST.php
index ea246a820da7e63803bffdff3e794da006fc973d..b0f315a98822c8423be15c632cdf8d5b62450040 100644
--- a/civicrm/Civi/Api4/Query/SqlFunctionLEAST.php
+++ b/civicrm/Civi/Api4/Query/SqlFunctionLEAST.php
@@ -16,6 +16,8 @@ namespace Civi\Api4\Query;
  */
 class SqlFunctionLEAST extends SqlFunction {
 
+  public $supportsExpansion = TRUE;
+
   protected static $category = self::CATEGORY_COMPARISON;
 
   protected static $params = [
diff --git a/civicrm/Civi/Api4/Query/SqlFunctionMAX.php b/civicrm/Civi/Api4/Query/SqlFunctionMAX.php
index 2116ec19f3744691019088c0e94e0a189376104e..c783d2cab712332f205ef60704364a691c135678 100644
--- a/civicrm/Civi/Api4/Query/SqlFunctionMAX.php
+++ b/civicrm/Civi/Api4/Query/SqlFunctionMAX.php
@@ -16,6 +16,8 @@ namespace Civi\Api4\Query;
  */
 class SqlFunctionMAX extends SqlFunction {
 
+  public $supportsExpansion = TRUE;
+
   protected static $category = self::CATEGORY_AGGREGATE;
 
   protected static $params = [
diff --git a/civicrm/Civi/Api4/Query/SqlFunctionMIN.php b/civicrm/Civi/Api4/Query/SqlFunctionMIN.php
index e8d4c56ebb3a13e6cc8246542ff0cc2632a171ae..f5fe4e86bd5793158142d0817b6796da128ce8da 100644
--- a/civicrm/Civi/Api4/Query/SqlFunctionMIN.php
+++ b/civicrm/Civi/Api4/Query/SqlFunctionMIN.php
@@ -16,6 +16,8 @@ namespace Civi\Api4\Query;
  */
 class SqlFunctionMIN extends SqlFunction {
 
+  public $supportsExpansion = TRUE;
+
   protected static $category = self::CATEGORY_AGGREGATE;
 
   protected static $params = [
diff --git a/civicrm/Civi/Api4/Query/SqlFunctionNULLIF.php b/civicrm/Civi/Api4/Query/SqlFunctionNULLIF.php
index 846981c736b1f9508036f1947273161cc72d1731..53ec601bcce27e032b6888fe2f40ffaa08dfc067 100644
--- a/civicrm/Civi/Api4/Query/SqlFunctionNULLIF.php
+++ b/civicrm/Civi/Api4/Query/SqlFunctionNULLIF.php
@@ -16,6 +16,8 @@ namespace Civi\Api4\Query;
  */
 class SqlFunctionNULLIF extends SqlFunction {
 
+  public $supportsExpansion = TRUE;
+
   protected static $category = self::CATEGORY_COMPARISON;
 
   protected static $params = [
diff --git a/civicrm/Civi/Api4/Service/Schema/Joinable/CustomGroupJoinable.php b/civicrm/Civi/Api4/Service/Schema/Joinable/CustomGroupJoinable.php
index a8ed4042b0622fc35bde551b6e19167f65534476..510ff78826c662b13252afb11472199af178a53d 100644
--- a/civicrm/Civi/Api4/Service/Schema/Joinable/CustomGroupJoinable.php
+++ b/civicrm/Civi/Api4/Service/Schema/Joinable/CustomGroupJoinable.php
@@ -56,16 +56,19 @@ class CustomGroupJoinable extends Joinable {
    * @inheritDoc
    */
   public function getEntityFields() {
-    if (!$this->entityFields) {
+    $cacheKey = 'APIv4_CustomGroupJoinable-' . $this->getTargetTable();
+    $entityFields = (array) \Civi::cache('metadata')->get($cacheKey);
+    if (!$entityFields) {
       $fields = CustomField::get(FALSE)
         ->setSelect(['custom_group.name', 'custom_group.extends', 'custom_group.table_name', '*'])
         ->addWhere('custom_group.table_name', '=', $this->getTargetTable())
         ->execute();
       foreach ($fields as $field) {
-        $this->entityFields[] = \Civi\Api4\Service\Spec\SpecFormatter::arrayToField($field, $this->getEntityFromExtends($field['custom_group.extends']));
+        $entityFields[] = \Civi\Api4\Service\Spec\SpecFormatter::arrayToField($field, self::getEntityFromExtends($field['custom_group.extends']));
       }
+      \Civi::cache('metadata')->set($cacheKey, $entityFields);
     }
-    return $this->entityFields;
+    return $entityFields;
   }
 
   /**
@@ -102,7 +105,7 @@ class CustomGroupJoinable extends Joinable {
    * @throws \API_Exception
    * @throws \Civi\API\Exception\UnauthorizedException
    */
-  private function getEntityFromExtends($extends) {
+  public static function getEntityFromExtends($extends) {
     if (strpos($extends, 'Participant') === 0) {
       return 'Participant';
     }
diff --git a/civicrm/Civi/Api4/Service/Schema/Joinable/Joinable.php b/civicrm/Civi/Api4/Service/Schema/Joinable/Joinable.php
index 0375fa0c2a05e1438ee42a0df73278e52061d83b..8e6d4e71168017dd010d240798f2547a69ae9472 100644
--- a/civicrm/Civi/Api4/Service/Schema/Joinable/Joinable.php
+++ b/civicrm/Civi/Api4/Service/Schema/Joinable/Joinable.php
@@ -78,11 +78,6 @@ class Joinable {
    */
   protected $entity;
 
-  /**
-   * @var array
-   */
-  protected $entityFields;
-
   /**
    * @param $targetTable
    * @param $targetColumn
@@ -268,15 +263,14 @@ class Joinable {
    * @return \Civi\Api4\Service\Spec\FieldSpec[]
    */
   public function getEntityFields() {
-    if (!$this->entityFields) {
-      $bao = AllCoreTables::getClassForTable($this->getTargetTable());
-      if ($bao) {
-        foreach ($bao::fields() as $field) {
-          $this->entityFields[] = \Civi\Api4\Service\Spec\SpecFormatter::arrayToField($field, $this->getEntity());
-        }
+    $entityFields = [];
+    $bao = AllCoreTables::getClassForTable($this->getTargetTable());
+    if ($bao) {
+      foreach ($bao::getSupportedFields() as $field) {
+        $entityFields[] = \Civi\Api4\Service\Spec\SpecFormatter::arrayToField($field, $this->getEntity());
       }
     }
-    return $this->entityFields;
+    return $entityFields;
   }
 
   /**
diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/AddressCreationSpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/AddressCreationSpecProvider.php
index 1b29d79350bca3a78589099c8727d16cda200b4c..b929cb9da5161d88988d6b541268ff79ea14f90a 100644
--- a/civicrm/Civi/Api4/Service/Spec/Provider/AddressCreationSpecProvider.php
+++ b/civicrm/Civi/Api4/Service/Spec/Provider/AddressCreationSpecProvider.php
@@ -27,7 +27,6 @@ class AddressCreationSpecProvider implements Generic\SpecProviderInterface {
    * @param \Civi\Api4\Service\Spec\RequestSpec $spec
    */
   public function modifySpec(RequestSpec $spec) {
-    $spec->getFieldByName('contact_id')->setRequired(TRUE);
     $spec->getFieldByName('location_type_id')->setRequired(TRUE);
   }
 
diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/EmailCreationSpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/EmailCreationSpecProvider.php
index a7b0dd8a7ef80af502f0f2c7888f68c354ec2012..8bbb299b450871f03245cb88902e0bc8f9c785c2 100644
--- a/civicrm/Civi/Api4/Service/Spec/Provider/EmailCreationSpecProvider.php
+++ b/civicrm/Civi/Api4/Service/Spec/Provider/EmailCreationSpecProvider.php
@@ -27,7 +27,6 @@ class EmailCreationSpecProvider implements Generic\SpecProviderInterface {
    * @inheritDoc
    */
   public function modifySpec(RequestSpec $spec) {
-    $spec->getFieldByName('contact_id')->setRequired(TRUE);
     $spec->getFieldByName('email')->setRequired(TRUE);
     $spec->getFieldByName('on_hold')->setRequired(FALSE);
     $spec->getFieldByName('is_bulkmail')->setRequired(FALSE);
diff --git a/civicrm/Civi/Api4/Service/Spec/Provider/PhoneCreationSpecProvider.php b/civicrm/Civi/Api4/Service/Spec/Provider/PhoneCreationSpecProvider.php
index 27aef02c9afc39a36d233c2fd4669e4a6ca0110b..4faecb1c5539d23b0e39a4775a7a5d7ccae37568 100644
--- a/civicrm/Civi/Api4/Service/Spec/Provider/PhoneCreationSpecProvider.php
+++ b/civicrm/Civi/Api4/Service/Spec/Provider/PhoneCreationSpecProvider.php
@@ -27,7 +27,6 @@ class PhoneCreationSpecProvider implements Generic\SpecProviderInterface {
    * @inheritDoc
    */
   public function modifySpec(RequestSpec $spec) {
-    $spec->getFieldByName('contact_id')->setRequired(TRUE);
     $spec->getFieldByName('phone')->setRequired(TRUE);
   }
 
diff --git a/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php b/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php
index 23209a4e242cb5b063f8196c6f0f9aa9146614dc..9e00ba09f59cadadeab394d66f1ea5a12f6bb1dc 100644
--- a/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php
+++ b/civicrm/Civi/Api4/Service/Spec/SpecFormatter.php
@@ -143,8 +143,6 @@ class SpecFormatter {
     unset($inputAttrs['type']);
 
     $map = [
-      'Select State/Province' => 'Select',
-      'Select Country' => 'Select',
       'Select Date' => 'Date',
       'Link' => 'Url',
     ];
diff --git a/civicrm/Civi/Api4/Utils/FormattingUtil.php b/civicrm/Civi/Api4/Utils/FormattingUtil.php
index 900df21ccfe8f30a2f649c98f34f578380aa2c22..82e1f770059e2d468cf367d56b1ce53afcc2712f 100644
--- a/civicrm/Civi/Api4/Utils/FormattingUtil.php
+++ b/civicrm/Civi/Api4/Utils/FormattingUtil.php
@@ -19,6 +19,8 @@
 
 namespace Civi\Api4\Utils;
 
+use Civi\Api4\Query\SqlExpression;
+
 require_once 'api/v3/utils.php';
 
 class FormattingUtil {
@@ -88,7 +90,7 @@ class FormattingUtil {
     // Evaluate pseudoconstant suffix
     $suffix = strpos($fieldName, ':');
     if ($suffix) {
-      $options = self::getPseudoconstantList($fieldSpec['entity'], $fieldSpec['name'], substr($fieldName, $suffix + 1), $action);
+      $options = self::getPseudoconstantList($fieldSpec, substr($fieldName, $suffix + 1), $action);
       $value = self::replacePseudoconstant($options, $value, TRUE);
       return;
     }
@@ -134,39 +136,47 @@ class FormattingUtil {
    * @param array $fields
    * @param string $entity
    * @param string $action
+   * @param array $selectAliases
    * @throws \API_Exception
    * @throws \CRM_Core_Exception
    */
-  public static function formatOutputValues(&$results, $fields, $entity, $action = 'get') {
+  public static function formatOutputValues(&$results, $fields, $entity, $action = 'get', $selectAliases = []) {
     $fieldOptions = [];
     foreach ($results as &$result) {
       $contactTypePaths = [];
-      foreach ($result as $fieldExpr => $value) {
-        $field = $fields[$fieldExpr] ?? NULL;
-        $dataType = $field['data_type'] ?? ($fieldExpr == 'id' ? 'Integer' : NULL);
-        if ($field) {
-          // Evaluate pseudoconstant suffixes
-          $suffix = strrpos($fieldExpr, ':');
-          if ($suffix) {
-            $fieldName = empty($field['custom_field_id']) ? $field['name'] : 'custom_' . $field['custom_field_id'];
-            $fieldOptions[$fieldExpr] = $fieldOptions[$fieldExpr] ?? self::getPseudoconstantList($field['entity'], $fieldName, substr($fieldExpr, $suffix + 1), $result, $action);
-            $dataType = NULL;
-          }
-          if (!empty($field['serialize'])) {
-            if (is_string($value)) {
-              $value = \CRM_Core_DAO::unSerializeField($value, $field['serialize']);
-            }
-          }
-          if (isset($fieldOptions[$fieldExpr])) {
-            $value = self::replacePseudoconstant($fieldOptions[$fieldExpr], $value);
+      foreach ($result as $key => $value) {
+        $fieldExpr = SqlExpression::convert($selectAliases[$key] ?? $key);
+        $fieldName = \CRM_Utils_Array::first($fieldExpr->getFields());
+        $field = $fieldName && isset($fields[$fieldName]) ? $fields[$fieldName] : NULL;
+        $dataType = $field['data_type'] ?? ($fieldName == 'id' ? 'Integer' : NULL);
+        // If Sql Function e.g. GROUP_CONCAT or COUNT wants to do its own formatting, apply and skip dataType conversion
+        if (method_exists($fieldExpr, 'formatOutputValue') && is_string($value)) {
+          $result[$key] = $value = $fieldExpr->formatOutputValue($value);
+          $dataType = NULL;
+        }
+        if (!$field) {
+          continue;
+        }
+        // Evaluate pseudoconstant suffixes
+        $suffix = strrpos($fieldName, ':');
+        if ($suffix) {
+          $fieldOptions[$fieldName] = $fieldOptions[$fieldName] ?? self::getPseudoconstantList($field, substr($fieldName, $suffix + 1), $result, $action);
+          $dataType = NULL;
+        }
+        if ($fieldExpr->supportsExpansion) {
+          if (!empty($field['serialize']) && is_string($value)) {
+            $value = \CRM_Core_DAO::unSerializeField($value, $field['serialize']);
           }
-          // Keep track of contact types for self::contactFieldsToRemove
-          if ($value && isset($field['entity']) && $field['entity'] === 'Contact' && $field['name'] === 'contact_type') {
-            $prefix = strrpos($fieldExpr, '.');
-            $contactTypePaths[$prefix ? substr($fieldExpr, 0, $prefix + 1) : ''] = $value;
+          if (isset($fieldOptions[$fieldName])) {
+            $value = self::replacePseudoconstant($fieldOptions[$fieldName], $value);
           }
         }
-        $result[$fieldExpr] = self::convertDataType($value, $dataType);
+        // Keep track of contact types for self::contactFieldsToRemove
+        if ($value && isset($field['entity']) && $field['entity'] === 'Contact' && $field['name'] === 'contact_type') {
+          $prefix = strrpos($fieldName, '.');
+          $contactTypePaths[$prefix ? substr($fieldName, 0, $prefix + 1) : ''] = $value;
+        }
+        $result[$key] = self::convertDataType($value, $dataType);
       }
       // Remove inapplicable contact fields
       foreach ($contactTypePaths as $prefix => $contactType) {
@@ -178,9 +188,7 @@ class FormattingUtil {
   /**
    * Retrieves pseudoconstant option list for a field.
    *
-   * @param string $entity
-   *   Name of api entity
-   * @param string $fieldName
+   * @param array $field
    * @param string $valueType
    *   name|label|abbr from self::$pseudoConstantContexts
    * @param array $params
@@ -189,27 +197,28 @@ class FormattingUtil {
    * @return array
    * @throws \API_Exception
    */
-  public static function getPseudoconstantList($entity, $fieldName, $valueType, $params = [], $action = 'get') {
+  public static function getPseudoconstantList($field, $valueType, $params = [], $action = 'get') {
     $context = self::$pseudoConstantContexts[$valueType] ?? NULL;
     // For create actions, only unique identifiers can be used.
     // For get actions any valid suffix is ok.
     if (($action === 'create' && !$context) || !in_array($valueType, self::$pseudoConstantSuffixes, TRUE)) {
       throw new \API_Exception('Illegal expression');
     }
-    $baoName = $context ? CoreUtil::getBAOFromApiName($entity) : NULL;
+    $baoName = $context ? CoreUtil::getBAOFromApiName($field['entity']) : NULL;
     // Use BAO::buildOptions if possible
     if ($baoName) {
+      $fieldName = empty($field['custom_field_id']) ? $field['name'] : 'custom_' . $field['custom_field_id'];
       $options = $baoName::buildOptions($fieldName, $context, $params);
     }
     // Fallback for option lists that exist in the api but not the BAO
     if (!isset($options) || $options === FALSE) {
-      $options = civicrm_api4($entity, 'getFields', ['action' => $action, 'loadOptions' => ['id', $valueType], 'where' => [['name', '=', $fieldName]]])[0]['options'] ?? NULL;
+      $options = civicrm_api4($field['entity'], 'getFields', ['action' => $action, 'loadOptions' => ['id', $valueType], 'where' => [['name', '=', $field['name']]]])[0]['options'] ?? NULL;
       $options = $options ? array_column($options, $valueType, 'id') : $options;
     }
     if (is_array($options)) {
       return $options;
     }
-    throw new \API_Exception("No option list found for '$fieldName'");
+    throw new \API_Exception("No option list found for '{$field['name']}'");
   }
 
   /**
diff --git a/civicrm/Civi/Core/Container.php b/civicrm/Civi/Core/Container.php
index 5b96e40ef08e2588e0f1c3a641f0e1bc3bd002ad..28b210e2b07433c703873769782af907a181e898 100644
--- a/civicrm/Civi/Core/Container.php
+++ b/civicrm/Civi/Core/Container.php
@@ -56,7 +56,7 @@ class Container {
     $cacheMode = defined('CIVICRM_CONTAINER_CACHE') ? CIVICRM_CONTAINER_CACHE : 'auto';
 
     // In pre-installation environments, don't bother with caching.
-    if (!defined('CIVICRM_DSN') || $cacheMode === 'never' || \CRM_Utils_System::isInUpgradeMode()) {
+    if (!defined('CIVICRM_DSN') || defined('CIVICRM_TEST') || CIVICRM_UF === 'UnitTests' || $cacheMode === 'never' || \CRM_Utils_System::isInUpgradeMode()) {
       $containerBuilder = $this->createContainer();
       $containerBuilder->compile();
       return $containerBuilder;
@@ -206,8 +206,17 @@ class Container {
       []
     ))->setPublic(TRUE);
 
+    $container->setDefinition('bundle.bootstrap3', new Definition('CRM_Core_Resources_Bundle', ['bootstrap3']))
+      ->setFactory('CRM_Core_Resources_Common::createBootstrap3Bundle')->setPublic(TRUE);
+
+    $container->setDefinition('bundle.coreStyles', new Definition('CRM_Core_Resources_Bundle', ['coreStyles']))
+      ->setFactory('CRM_Core_Resources_Common::createStyleBundle')->setPublic(TRUE);
+
+    $container->setDefinition('bundle.coreResources', new Definition('CRM_Core_Resources_Bundle', ['coreResources']))
+      ->setFactory('CRM_Core_Resources_Common::createFullBundle')->setPublic(TRUE);
+
     $container->setDefinition('pear_mail', new Definition('Mail'))
-      ->setFactory('CRM_Utils_Mail::createMailer');
+      ->setFactory('CRM_Utils_Mail::createMailer')->setPublic(TRUE);
 
     if (empty(\Civi::$statics[__CLASS__]['boot'])) {
       throw new \RuntimeException('Cannot initialize container. Boot services are undefined.');
@@ -230,13 +239,18 @@ class Container {
       ))
         ->setFactory([$class, 'singleton'])->setPublic(TRUE);
     }
-    $container->setAlias('cache.short', 'cache.default');
+    $container->setAlias('cache.short', 'cache.default')->setPublic(TRUE);
 
     $container->setDefinition('resources', new Definition(
       'CRM_Core_Resources',
       [new Reference('service_container')]
     ))->setFactory([new Reference(self::SELF), 'createResources'])->setPublic(TRUE);
 
+    $container->setDefinition('resources.js_strings', new Definition(
+      'CRM_Core_Resources_Strings',
+      [new Reference('cache.js_strings')]
+    ))->setPublic(TRUE);
+
     $container->setDefinition('prevnext', new Definition(
       'CRM_Core_PrevNextCache_Interface',
       [new Reference('service_container')]
@@ -450,7 +464,7 @@ class Container {
     $sys = \CRM_Extension_System::singleton();
     return new \CRM_Core_Resources(
       $sys->getMapper(),
-      $container->get('cache.js_strings'),
+      new \CRM_Core_Resources_Strings($container->get('cache.js_strings')),
       \CRM_Core_Config::isUpgradeMode() ? NULL : 'resCacheCode'
     );
   }
diff --git a/civicrm/Civi/Payment/PropertyBag.php b/civicrm/Civi/Payment/PropertyBag.php
index 49a4ea4e8c9975f9c5392638c098b2033a7dc78a..73179edb78cecf0ee70e4602d73440241e4e2cd4 100644
--- a/civicrm/Civi/Payment/PropertyBag.php
+++ b/civicrm/Civi/Payment/PropertyBag.php
@@ -417,14 +417,26 @@ class PropertyBag implements \ArrayAccess {
   }
 
   /**
-   * Get the monetary amount.
+   * Set the monetary amount.
+   *
+   * - We expect to be called with a string amount with optional decimals using
+   *   a '.' as the decimal point (not a ',').
+   *
+   * - We're ok with floats/ints being passed in, too, but we'll cast them to a
+   *   string.
+   *
+   * - Negatives are fine.
+   *
+   * @see https://github.com/civicrm/civicrm-core/pull/18219
+   *
+   * @param string|float|int $value
+   * @param string $label
    */
   public function setAmount($value, $label = 'default') {
     if (!is_numeric($value)) {
       throw new \InvalidArgumentException("setAmount requires a numeric amount value");
     }
-
-    return $this->set('amount', $label, \CRM_Utils_Money::format($value, NULL, NULL, TRUE));
+    return $this->set('amount', $label, filter_var($value, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
   }
 
   /**
diff --git a/civicrm/Civi/Test/Api3TestTrait.php b/civicrm/Civi/Test/Api3TestTrait.php
index ed3557babe9622f3f507d4d54f38c29cd6f20531..176564a686632b143e64d2566f2f243615f92b9b 100644
--- a/civicrm/Civi/Test/Api3TestTrait.php
+++ b/civicrm/Civi/Test/Api3TestTrait.php
@@ -260,7 +260,6 @@ trait Api3TestTrait {
   public function callAPISuccessGetValue($entity, $params, $type = NULL) {
     $params += [
       'version' => $this->_apiversion,
-      'debug' => 1,
     ];
     $result = $this->civicrm_api($entity, 'getvalue', $params);
     if (is_array($result) && (!empty($result['is_error']) || isset($result['values']))) {
@@ -405,6 +404,9 @@ trait Api3TestTrait {
         $v3Params['option_group.name'] = $v3Params['option_group_id'];
         unset($v3Params['option_group_id']);
       }
+      if (isset($field['pseudoconstant'], $v3Params[$name]) && $field['type'] === \CRM_Utils_Type::T_INT && !is_numeric($v3Params[$name])) {
+        $v3Params[$name] = \CRM_Core_PseudoConstant::getKey(\CRM_Core_DAO_AllCoreTables::getFullName($v3Entity), $name, $v3Params[$name]);
+      }
     }
 
     switch ($v3Action) {
diff --git a/civicrm/Civi/Test/ContactTestTrait.php b/civicrm/Civi/Test/ContactTestTrait.php
index 26991ea8cfdf44cf4135a97122fea5785e9fc8f0..065c6bccb7e6289aaaaac010a87f6ef02e7643af 100644
--- a/civicrm/Civi/Test/ContactTestTrait.php
+++ b/civicrm/Civi/Test/ContactTestTrait.php
@@ -74,7 +74,7 @@ trait ContactTestTrait {
    * @return int
    *   id of Individual created
    *
-   * @throws \CRM_Core_Exception
+   * @throws \CiviCRM_API3_Exception
    */
   public function individualCreate($params = [], $seq = 0, $random = FALSE) {
     $params = array_merge($this->sampleContact('Individual', $seq, $random), $params);
diff --git a/civicrm/Civi/Test/Schema.php b/civicrm/Civi/Test/Schema.php
index adca28b1b48aaab692db73ecd7b1bf91b1e164bc..28519131896aae3f827035d3ad113bd0c46169bd 100644
--- a/civicrm/Civi/Test/Schema.php
+++ b/civicrm/Civi/Test/Schema.php
@@ -26,8 +26,10 @@ class Schema {
     );
     $tables = $pdo->query($query);
     $result = [];
-    foreach ($tables as $table) {
-      $result[] = $table['TABLE_NAME'] ?? $table['table_name'];
+    if (!empty($tables)) {
+      foreach ($tables as $table) {
+        $result[] = $table['TABLE_NAME'] ?? $table['table_name'];
+      }
     }
     return $result;
   }
diff --git a/civicrm/Civi/Token/TokenCompatSubscriber.php b/civicrm/Civi/Token/TokenCompatSubscriber.php
index c4a07af5595c81771897e0c3d0a486bd9d2d53c5..bdfaa5994eb58ec665b56cb51a8b3566527a760d 100644
--- a/civicrm/Civi/Token/TokenCompatSubscriber.php
+++ b/civicrm/Civi/Token/TokenCompatSubscriber.php
@@ -58,7 +58,7 @@ class TokenCompatSubscriber implements EventSubscriberInterface {
         $params = [
           ['contact_id', '=', $contactId, 0, 0],
         ];
-        list($contact, $_) = \CRM_Contact_BAO_Query::apiQuery($params);
+        [$contact] = \CRM_Contact_BAO_Query::apiQuery($params);
         //CRM-4524
         $contact = reset($contact);
         if (!$contact || is_a($contact, 'CRM_Core_Error')) {
diff --git a/civicrm/ang/api4Explorer/Clause.html b/civicrm/ang/api4Explorer/Clause.html
index 96698212f4cad6277417382a4247dabbd337b8a3..66d4022af2de93dea206f403a21c37f610a2e935 100644
--- a/civicrm/ang/api4Explorer/Clause.html
+++ b/civicrm/ang/api4Explorer/Clause.html
@@ -1,41 +1,45 @@
-<legend>{{ data.label || ts('%1 group', {1: $ctrl.conjunctions[data.op]}) }}</legend>
-<div class="btn-group btn-group-xs" ng-if="data.groupParent">
-  <button class="btn btn-danger-outline" ng-click="$ctrl.removeGroup()" title="{{:: ts('Remove group') }}">
+<legend>
+  {{ $ctrl.label || ts('%1 group', {1: $ctrl.conjunctions[$ctrl.op]}) }}
+  <span class="crm-marker" ng-if=":: $ctrl.isRequired"> *</span>
+</legend>
+<div class="btn-group btn-group-xs" ng-if=":: $ctrl.hasParent">
+  <button class="btn btn-danger-outline" ng-click="$ctrl.deleteGroup()" title="{{:: ts('Remove group') }}">
     <i class="crm-i fa-trash" aria-hidden="true"></i>
   </button>
 </div>
-<div class="api4-clause-group-sortable" ng-model="data.clauses" ui-sortable="$ctrl.sortOptions">
-  <div class="api4-input form-inline clearfix" ng-repeat="(index, clause) in data.clauses" ng-class="{hiddenElement: index &lt; (data.skip || 0)}">
-    <div ng-if="index &gt;= (data.skip || 0)">
+<div class="api4-clause-group-sortable" ng-model="$ctrl.clauses" ui-sortable="$ctrl.sortOptions">
+  <div class="api4-input form-inline clearfix" ng-repeat="(index, clause) in $ctrl.clauses" ng-class="{hiddenElement: index &lt; ($ctrl.skip || 0)}">
+    <div ng-if="index &gt;= ($ctrl.skip || 0)">
       <div class="api4-clause-badge" title="{{:: ts('Drag to reposition') }}">
         <span class="badge badge-info">
-          <span ng-if="index === (data.skip || 0) && !data.groupParent">{{ data.label }}</span>
-          <span ng-if="index &gt; (data.skip || 0) || data.groupParent">{{ $ctrl.conjunctions[data.op] }}</span>
+          <span ng-if="index === ($ctrl.skip || 0) && !$ctrl.hasParent">{{ $ctrl.label }}</span>
+          <span ng-if="index &gt; ($ctrl.skip || 0) || $ctrl.hasParent">{{ $ctrl.conjunctions[$ctrl.op] }}</span>
           <i class="crm-i fa-arrows" aria-hidden="true"></i>
         </span>
       </div>
       <div ng-if="!$ctrl.conjunctions[clause[0]]" class="api4-input-group">
-        <input class="collapsible-optgroups form-control" ng-model="clause[0]" crm-ui-select="{data: data.fields, allowClear: true, placeholder: 'Field'}" />
+        <input class="collapsible-optgroups form-control" ng-model="clause[0]" crm-ui-select="{data: $ctrl.fields, allowClear: true, placeholder: 'Field'}" />
         <select class="form-control api4-operator" ng-model="clause[1]" ng-options="o for o in $ctrl.operators" ></select>
-        <input class="form-control" ng-model="clause[2]" api4-exp-value="{field: clause[0], op: clause[1], format: data.format}" />
+        <input class="form-control" ng-model="clause[2]" api4-exp-value="{field: clause[0], op: clause[1], format: $ctrl.format}" />
       </div>
-      <fieldset class="clearfix" ng-if="$ctrl.conjunctions[clause[0]]" crm-api4-clause="{format: data.format, clauses: clause[1], op: clause[0], fields: data.fields, groupParent: data.clauses, groupIndex: index}">
+      <fieldset class="clearfix" ng-if="$ctrl.conjunctions[clause[0]]">
+        <crm-api4-clause clauses="clause[1]" format="{{ $ctrl.format }}" op="{{ clause[0] }}" fields="$ctrl.fields" delete-group="$ctrl.deleteRow(index)" ></crm-api4-clause>
       </fieldset>
     </div>
   </div>
 </div>
 <div class="api4-input form-inline">
   <div class="api4-clause-badge">
-    <div class="btn-group btn-group-xs" title="{{ data.groupParent ? ts('Add a subgroup of clauses') : ts('Add a group of clauses') }}">
+    <div class="btn-group btn-group-xs" title="{{ $ctrl.hasParent ? ts('Add a subgroup of clauses') : ts('Add a group of clauses') }}">
       <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-        {{ $ctrl.conjunctions[data.op] }} <span class="caret"></span>
+        {{ $ctrl.conjunctions[$ctrl.op] }} <span class="caret"></span>
       </button>
       <ul class="dropdown-menu api4-add-where-group-menu">
-        <li ng-repeat="(con, label) in $ctrl.conjunctions" ng-show="data.op !== con">
+        <li ng-repeat="(con, label) in $ctrl.conjunctions" ng-show="$ctrl.op !== con">
           <a href ng-click="$ctrl.addGroup(con)">{{ label }}</a>
         </li>
       </ul>
     </div>
   </div>
-  <input class="collapsible-optgroups form-control" ng-model="$ctrl.newClause" ng-change="$ctrl.addClause()" title="Add a single clause" crm-ui-select="{data: data.fields, placeholder: 'Add clause'}" />
+  <input class="collapsible-optgroups form-control" ng-model="$ctrl.newClause" ng-change="$ctrl.addClause()" title="Add a single clause" crm-ui-select="{data: $ctrl.fields, placeholder: 'Add clause'}" />
 </div>
diff --git a/civicrm/ang/api4Explorer/Explorer.html b/civicrm/ang/api4Explorer/Explorer.html
index b32196dfd55c26e0c72d61ee6e413fadcdfea82b..3dfb253a053ee0aba91c8b747527841906c97a5d 100644
--- a/civicrm/ang/api4Explorer/Explorer.html
+++ b/civicrm/ang/api4Explorer/Explorer.html
@@ -5,15 +5,6 @@
     {{:: ts('CiviCRM APIv4') }}{{ entity ? (' (' + entity + '::' + action + ')') : '' }}
   </h1>
 
-  <!--This warning will show if bootstrap is unavailable. Normally it will be hidden by the bootstrap .collapse class.-->
-  <div class="messages warning no-popup collapse">
-    <p>
-      <i class="crm-i fa-exclamation-triangle" aria-hidden="true"></i>
-      <strong>{{:: ts('Bootstrap theme not found.') }}</strong>
-    </p>
-    <p>{{:: ts('This screen may not work correctly without a bootstrap-based theme such as Shoreditch installed.') }}</p>
-  </div>
-
   <div class="api4-explorer-row">
       <form name="api4-explorer" class="panel panel-default explorer-params-panel">
         <div class="panel-heading">
@@ -78,7 +69,8 @@
                   </select>
                   <a href class="crm-hover-button" title="Clear" ng-click="clearParam('join', $index)"><i class="crm-i fa-times"></i></a>
                 </div>
-                <fieldset class="api4-clause-fieldset" crm-api4-clause="{skip: 3, clauses: params.join[$index], op: 'AND', label: 'On', fields: fieldsAndJoins, format: 'plain'}">
+                <fieldset class="api4-clause-fieldset">
+                  <crm-api4-clause clauses="params.join[$index]" format="plain" skip="3" op="AND" label="On" fields="fieldsAndJoins" ></crm-api4-clause>
                 </fieldset>
               </fieldset>
             </div>
@@ -105,7 +97,8 @@
             <textarea class="form-control" type="{{:: param.type[0] === 'int' && param.type.length === 1 ? 'number' : 'text' }}" id="api4-param-{{:: name }}" ng-model="params[name]">
             </textarea>
           </div>
-          <fieldset ng-if="::availableParams.where" class="api4-clause-fieldset" ng-mouseenter="help('where', availableParams.where)" ng-mouseleave="help()" crm-api4-clause="{type: 'where', clauses: params.where, required: availableParams.where.required, op: 'AND', label: 'Where', fields: fieldsAndJoins}">
+          <fieldset ng-if="::availableParams.where" class="api4-clause-fieldset" ng-mouseenter="help('where', availableParams.where)" ng-mouseleave="help()">
+            <crm-api4-clause clauses="params.where" is-required="availableParams.where.required" op="AND" label="Where" fields="fieldsAndJoins" ></crm-api4-clause>
           </fieldset>
           <fieldset ng-repeat="name in ['values', 'defaults']" ng-if="::availableParams[name]" ng-mouseenter="help(name, availableParams[name])" ng-mouseleave="help()">
             <legend>{{:: name }}<span class="crm-marker" ng-if="::availableParams[name].required"> *</span></legend>
@@ -130,7 +123,8 @@
               <input class="collapsible-optgroups form-control huge" ng-model="controls.groupBy" crm-ui-select="{data: fieldsAndJoinsAndFunctions}" placeholder="Add groupBy" />
             </div>
           </fieldset>
-          <fieldset ng-if="::availableParams.having" class="api4-clause-fieldset" ng-mouseenter="help('having', availableParams.having)" ng-mouseleave="help()" crm-api4-clause="{clauses: params.having, required: availableParams.having.required, op: 'AND', label: 'Having', fields: havingOptions}">
+          <fieldset ng-if="::availableParams.having" class="api4-clause-fieldset" ng-mouseenter="help('having', availableParams.having)" ng-mouseleave="help()">
+            <crm-api4-clause clauses="params.having" is-required="availableParams.having.required" op="AND" label="Having" fields="havingOptions" ></crm-api4-clause>
           </fieldset>
           <fieldset ng-if="::availableParams.orderBy" ng-mouseenter="help('orderBy', availableParams.orderBy)" ng-mouseleave="help()">
             <legend>orderBy<span class="crm-marker" ng-if="::availableParams.orderBy.required"> *</span></legend>
diff --git a/civicrm/ang/api4Explorer/Explorer.js b/civicrm/ang/api4Explorer/Explorer.js
index 41750691c61c750370d9a06e2caa3b461a386f6f..a9741dadc45ab8be22048e0a017510508dd5643f 100644
--- a/civicrm/ang/api4Explorer/Explorer.js
+++ b/civicrm/ang/api4Explorer/Explorer.js
@@ -791,7 +791,7 @@
           $scope.debug = debugFormat(resp.data);
           $scope.result = [
             formatMeta(resp.data),
-            prettyPrintOne('(' + resp.data.values.length + ') ' + _.escape(JSON.stringify(resp.data.values, null, 2)), 'js', 1)
+            prettyPrintOne((_.isArray(resp.data.values) ? '(' + resp.data.values.length + ') ' : '') + _.escape(JSON.stringify(resp.data.values, null, 2)), 'js', 1)
           ];
         }, function(resp) {
           $scope.loading = false;
@@ -1024,75 +1024,86 @@
     };
   });
 
-  angular.module('api4Explorer').directive('crmApi4Clause', function() {
-    return {
-      scope: {
-        data: '<crmApi4Clause'
-      },
-      templateUrl: '~/api4Explorer/Clause.html',
-      controller: function ($scope, $element, $timeout) {
-        var ts = $scope.ts = CRM.ts(),
-          ctrl = $scope.$ctrl = this;
-        this.conjunctions = {AND: ts('And'), OR: ts('Or'), NOT: ts('Not')};
-        this.operators = CRM.vars.api4.operators;
-        this.sortOptions = {
-          axis: 'y',
-          connectWith: '.api4-clause-group-sortable',
-          containment: $element.closest('.api4-clause-fieldset'),
-          over: onSortOver,
-          start: onSort,
-          stop: onSort
-        };
+  angular.module('api4Explorer').component('crmApi4Clause', {
+    bindings: {
+      fields: '<',
+      clauses: '<',
+      format: '@',
+      op: '@',
+      skip: '<',
+      isRequired: '<',
+      label: '@',
+      deleteGroup: '&'
+    },
+    templateUrl: '~/api4Explorer/Clause.html',
+    controller: function ($scope, $element, $timeout) {
+      var ts = $scope.ts = CRM.ts(),
+        ctrl = this;
+      this.conjunctions = {AND: ts('And'), OR: ts('Or'), NOT: ts('Not')};
+      this.operators = CRM.vars.api4.operators;
+      this.sortOptions = {
+        axis: 'y',
+        connectWith: '.api4-clause-group-sortable',
+        containment: $element.closest('.api4-clause-fieldset'),
+        over: onSortOver,
+        start: onSort,
+        stop: onSort
+      };
 
-        this.addGroup = function(op) {
-          $scope.data.clauses.push([op, []]);
-        };
+      this.$onInit = function() {
+        ctrl.hasParent = !!$element.attr('delete-group');
+      };
 
-        this.removeGroup = function() {
-          $scope.data.groupParent.splice($scope.data.groupIndex, 1);
-        };
+      this.addGroup = function(op) {
+        ctrl.clauses.push([op, []]);
+      };
+
+      function onSort(event, ui) {
+        $($element).closest('.api4-clause-fieldset').toggleClass('api4-sorting', event.type === 'sortstart');
+        $('.api4-input.form-inline').css('margin-left', '');
+      }
 
-        function onSort(event, ui) {
-          $($element).closest('.api4-clause-fieldset').toggleClass('api4-sorting', event.type === 'sortstart');
-          $('.api4-input.form-inline').css('margin-left', '');
+      // Indent clause while dragging between nested groups
+      function onSortOver(event, ui) {
+        var offset = 0;
+        if (ui.sender) {
+          offset = $(ui.placeholder).offset().left - $(ui.sender).offset().left;
         }
+        $('.api4-input.form-inline.ui-sortable-helper').css('margin-left', '' + offset + 'px');
+      }
 
-        // Indent clause while dragging between nested groups
-        function onSortOver(event, ui) {
-          var offset = 0;
-          if (ui.sender) {
-            offset = $(ui.placeholder).offset().left - $(ui.sender).offset().left;
+      this.addClause = function() {
+        $timeout(function() {
+          if (ctrl.newClause) {
+            if (ctrl.skip && ctrl.clauses.length < ctrl.skip) {
+              ctrl.clauses.push(null);
+            }
+            ctrl.clauses.push([ctrl.newClause, '=', '']);
+            ctrl.newClause = null;
           }
-          $('.api4-input.form-inline.ui-sortable-helper').css('margin-left', '' + offset + 'px');
+        });
+      };
+
+      this.deleteRow = function(index) {
+        ctrl.clauses.splice(index, 1);
+      };
+
+      // Remove empty values
+      this.changeClauseField = function(clause, index) {
+        if (clause[0] === '') {
+          ctrl.deleteRow(index);
         }
+      };
 
-        this.addClause = function() {
-          $timeout(function() {
-            if (ctrl.newClause) {
-              $scope.data.clauses.push([ctrl.newClause, '=', '']);
-              ctrl.newClause = null;
-            }
-          });
-        };
-        $scope.$watch('data.clauses', function(values) {
-          // Iterate in reverse order so index doesn't get out-of-sync during splice
-          _.forEachRight(values, function(clause, index) {
-            // Remove empty values
-            if (index >= ($scope.data.skip  || 0)) {
-              if (typeof clause !== 'undefined' && !clause[0]) {
-                values.splice(index, 1);
-              }
-              // Add/remove value if operator allows for one
-              else if (typeof clause[1] === 'string' && _.contains(clause[1], 'NULL')) {
-                clause.length = 2;
-              } else if (typeof clause[1] === 'string' && clause.length === 2) {
-                clause.push('');
-              }
-            }
-          });
-        }, true);
-      }
-    };
+      // Add/remove value if operator allows for one
+      this.changeClauseOperator = function(clause) {
+        if (_.contains(clause[1], 'NULL')) {
+          clause.length = 2;
+        } else if (clause.length === 2) {
+          clause.push('');
+        }
+      };
+    }
   });
 
   angular.module('api4Explorer').directive('api4ExpValue', function($routeParams, crmApi4) {
diff --git a/civicrm/ang/crmApp.js b/civicrm/ang/crmApp.js
index c7bb81e29bc9ad1a090e9a020b0f4ad189885156..e3baceb971a6618ba84bcea245725811ffdbaba1 100644
--- a/civicrm/ang/crmApp.js
+++ b/civicrm/ang/crmApp.js
@@ -3,6 +3,12 @@
   // crmApp should not provide any significant services, and no other
   // modules should depend on it.
   var crmApp = angular.module('crmApp', CRM.angular.modules);
+
+  // dev/core#1818 use angular 1.5 default of # instead of 1.6+ default of #!
+  crmApp.config(['$locationProvider', function($locationProvider) {
+    $locationProvider.hashPrefix("");
+  }]);
+
   crmApp.config(['$routeProvider',
     function($routeProvider) {
 
diff --git a/civicrm/ang/crmMailingAB/EditCtrl/report.html b/civicrm/ang/crmMailingAB/EditCtrl/report.html
index 18380923c1eeb28c1ab05bcb5d9e7bff04fa8b49..5e97ae964a5b9ef7a7436bc68346289e14ffa551 100644
--- a/civicrm/ang/crmMailingAB/EditCtrl/report.html
+++ b/civicrm/ang/crmMailingAB/EditCtrl/report.html
@@ -83,7 +83,7 @@
           class="crm-hover-button action-item"
           ng-href="{{statUrl(am.mailing, statType, 'report')}}"
           title="{{ts('Reports for \'%1\'', {1: statType.title})}}"
-          crm-icon="clipboard"
+          crm-icon="fa-clipboard"
           ></a>
       </td>
       <td ng-show="abtest.ab.status == 'Testing'"></td>
diff --git a/civicrm/ang/crmUi.js b/civicrm/ang/crmUi.js
index c6ba58b1464ef6d156cf5e3875a573b955a9f289..355939c2dcf71ec855ac2fdaadc0c26d73c7db47 100644
--- a/civicrm/ang/crmUi.js
+++ b/civicrm/ang/crmUi.js
@@ -908,7 +908,7 @@
     })
 
     // Example for Font Awesome: <button crm-icon="fa-check">Save</button>
-    // Example for jQuery UI (deprecated): <button crm-icon="check">Save</button>
+    // Example for jQuery UI (deprecated): <button crm-icon="fa-check">Save</button>
     .directive('crmIcon', function() {
       return {
         restrict: 'EA',
diff --git a/civicrm/api/v3/Activity.php b/civicrm/api/v3/Activity.php
index 8898fb22155d6391452d7d0407fbcddfe4078809..422ebff5905d98b3345d749f4f96a67eed860c4f 100644
--- a/civicrm/api/v3/Activity.php
+++ b/civicrm/api/v3/Activity.php
@@ -95,20 +95,6 @@ function civicrm_api3_activity_create($params) {
     }
   }
 
-  $deleteActivityAssignment = FALSE;
-  if (isset($params['assignee_contact_id'])) {
-    $deleteActivityAssignment = TRUE;
-  }
-
-  $deleteActivityTarget = FALSE;
-  if (isset($params['target_contact_id'])) {
-    $deleteActivityTarget = TRUE;
-  }
-
-  // this should all be handled at the BAO layer
-  $params['deleteActivityAssignment'] = CRM_Utils_Array::value('deleteActivityAssignment', $params, $deleteActivityAssignment);
-  $params['deleteActivityTarget'] = CRM_Utils_Array::value('deleteActivityTarget', $params, $deleteActivityTarget);
-
   if ($case_id && $createRevision) {
     // This is very similar to the copy-to-case action.
     if (!CRM_Utils_Array::crmIsEmptyArray($oldActivityValues['target_contact'])) {
diff --git a/civicrm/api/v3/Address.php b/civicrm/api/v3/Address.php
index 0417091a89a4d632d453d2b330259a894390815e..f7988a249ae096f934698d5a02f2b43fd9f3c89d 100644
--- a/civicrm/api/v3/Address.php
+++ b/civicrm/api/v3/Address.php
@@ -68,7 +68,7 @@ function civicrm_api3_address_create($params) {
    * Create array for BAO (expects address params in as an
    * element in array 'address'
    */
-  $addressBAO = CRM_Core_BAO_Address::add($params, $params['fix_address']);
+  $addressBAO = CRM_Core_BAO_Address::create($params, $params['fix_address']);
   if (empty($addressBAO)) {
     return civicrm_api3_create_error("Address is not created or updated ");
   }
diff --git a/civicrm/api/v3/Contribution.php b/civicrm/api/v3/Contribution.php
index 1e70afa7ecbf040adebe95d88a3caed218f5dc82..7a4da8e57ac9526615e6be2c77351f31e42192a8 100644
--- a/civicrm/api/v3/Contribution.php
+++ b/civicrm/api/v3/Contribution.php
@@ -471,29 +471,30 @@ function _civicrm_api3_contribution_sendconfirmation_spec(&$params) {
  * @throws \Exception
  */
 function civicrm_api3_contribution_completetransaction($params) {
-  $input = $ids = [];
-  if (isset($params['payment_processor_id'])) {
-    $input['payment_processor_id'] = $params['payment_processor_id'];
-  }
   $contribution = new CRM_Contribute_BAO_Contribution();
   $contribution->id = $params['id'];
   if (!$contribution->find(TRUE)) {
     throw new API_Exception('A valid contribution ID is required', 'invalid_data');
   }
-
-  if (!$contribution->loadRelatedObjects($input, $ids, TRUE)) {
-    throw new API_Exception('failed to load related objects');
-  }
-  elseif ($contribution->contribution_status_id == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed')) {
+  if ($contribution->contribution_status_id == CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed')) {
     throw new API_Exception(ts('Contribution already completed'), 'contribution_completed');
   }
-  $input['trxn_id'] = $params['trxn_id'] ?? $contribution->trxn_id;
 
-  if (!empty($params['fee_amount'])) {
-    $input['fee_amount'] = $params['fee_amount'];
+  $params['trxn_id'] = $params['trxn_id'] ?? $contribution->trxn_id;
+
+  $passThroughParams = [
+    'fee_amount',
+    'payment_processor_id',
+    'trxn_id',
+  ];
+  $input = array_intersect_key($params, array_fill_keys($passThroughParams, NULL));
+
+  $ids = [];
+  if (!$contribution->loadRelatedObjects(['payment_processor_id' => $input['payment_processor_id'] ?? NULL], $ids, TRUE)) {
+    throw new API_Exception('failed to load related objects');
   }
-  return _ipn_process_transaction($params, $contribution, $input, $ids);
 
+  return _ipn_process_transaction($params, $contribution, $input, $ids);
 }
 
 /**
@@ -576,7 +577,6 @@ function _civicrm_api3_contribution_completetransaction_spec(&$params) {
  * @throws API_Exception
  */
 function civicrm_api3_contribution_repeattransaction($params) {
-  $input = $ids = [];
   civicrm_api3_verify_one_mandatory($params, NULL, ['contribution_recur_id', 'original_contribution_id']);
   if (empty($params['original_contribution_id'])) {
     //  CRM-19873 call with test mode.
@@ -602,34 +602,31 @@ function civicrm_api3_contribution_repeattransaction($params) {
     );
   }
 
-  $input['payment_processor_id'] = civicrm_api3('contributionRecur', 'getvalue', [
+  $params['payment_processor_id'] = civicrm_api3('contributionRecur', 'getvalue', [
     'return' => 'payment_processor_id',
     'id' => $contribution->contribution_recur_id,
   ]);
-  try {
-    if (!$contribution->loadRelatedObjects($input, $ids, TRUE)) {
-      throw new API_Exception('failed to load related objects');
-    }
 
-    unset($contribution->id, $contribution->receive_date, $contribution->invoice_id);
-    $contribution->receive_date = $params['receive_date'];
-
-    $passThroughParams = [
-      'trxn_id',
-      'total_amount',
-      'campaign_id',
-      'fee_amount',
-      'financial_type_id',
-      'contribution_status_id',
-      'membership_id',
-    ];
-    $input = array_intersect_key($params, array_fill_keys($passThroughParams, NULL));
+  $passThroughParams = [
+    'trxn_id',
+    'total_amount',
+    'campaign_id',
+    'fee_amount',
+    'financial_type_id',
+    'contribution_status_id',
+    'membership_id',
+    'payment_processor_id',
+  ];
+  $input = array_intersect_key($params, array_fill_keys($passThroughParams, NULL));
 
-    return _ipn_process_transaction($params, $contribution, $input, $ids);
-  }
-  catch (Exception $e) {
-    throw new API_Exception('failed to load related objects' . $e->getMessage() . "\n" . $e->getTraceAsString());
+  $ids = [];
+  if (!$contribution->loadRelatedObjects(['payment_processor_id' => $input['payment_processor_id']], $ids, TRUE)) {
+    throw new API_Exception('failed to load related objects');
   }
+  unset($contribution->id, $contribution->receive_date, $contribution->invoice_id);
+  $contribution->receive_date = $params['receive_date'];
+
+  return _ipn_process_transaction($params, $contribution, $input, $ids);
 }
 
 /**
diff --git a/civicrm/api/v3/CustomField.php b/civicrm/api/v3/CustomField.php
index a9b664b0b59ac2a90952c4614aee5edabd361733..ecfe665fddaeed5624b8a80065ced93ead91b4ca 100644
--- a/civicrm/api/v3/CustomField.php
+++ b/civicrm/api/v3/CustomField.php
@@ -31,9 +31,11 @@
 function civicrm_api3_custom_field_create($params) {
 
   // Legacy handling for old way of naming serialized fields
-  if (!empty($params['html_type']) && ($params['html_type'] == 'CheckBox' || strpos($params['html_type'], 'Multi-') === 0)) {
-    $params['serialize'] = 1;
-    $params['html_type'] = str_replace('Multi-', '', $params['html_type']);
+  if (!empty($params['html_type'])) {
+    if ($params['html_type'] == 'CheckBox' || strpos($params['html_type'], 'Multi-') === 0) {
+      $params['serialize'] = 1;
+    }
+    $params['html_type'] = str_replace(['Multi-Select', 'Select Country', 'Select State/Province'], 'Select', $params['html_type']);
   }
 
   // Array created for passing options in params.
@@ -131,7 +133,14 @@ function civicrm_api3_custom_field_get($params) {
     if (!in_array('serialize', $params['return'])) {
       $params['return'][] = 'serialize';
     }
+    if (!in_array('data_type', $params['return'])) {
+      $params['return'][] = 'data_type';
+    }
   }
+  $legacyDataTypes = [
+    'Select State/Province' => 'StateProvince',
+    'Select Country' => 'Country',
+  ];
   if ($handleLegacy && !empty($params['html_type'])) {
     $serializedTypes = ['CheckBox', 'Multi-Select', 'Multi-Select Country', 'Multi-Select State/Province'];
     if (is_string($params['html_type'])) {
@@ -142,12 +151,16 @@ function civicrm_api3_custom_field_get($params) {
       elseif (!in_array($params['html_type'], $serializedTypes)) {
         $params['serialize'] = 0;
       }
+      if (isset($legacyDataTypes[$params['html_type']])) {
+        $params['data_type'] = $legacyDataTypes[$params['html_type']];
+        unset($params['html_type']);
+      }
     }
     elseif (is_array($params['html_type']) && !empty($params['html_type']['IN'])) {
       $excludeNonSerialized = !array_diff($params['html_type']['IN'], $serializedTypes);
       $onlyNonSerialized = !array_intersect($params['html_type']['IN'], $serializedTypes);
       $params['html_type']['IN'] = array_map(function($val) {
-        return str_replace('Multi-Select', 'Select', $val);
+        return str_replace(['Multi-Select', 'Select Country', 'Select State/Province'], 'Select', $val);
       }, $params['html_type']['IN']);
       if ($excludeNonSerialized) {
         $params['serialize'] = 1;
@@ -160,10 +173,15 @@ function civicrm_api3_custom_field_get($params) {
 
   $results = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params);
 
-  if ($handleLegacy && !empty($results['values']) && is_array($results['values']) && !isset($params['serialize'])) {
-    foreach ($results['values'] as $id => $result) {
-      if (!empty($result['serialize']) && !empty($result['html_type'])) {
-        $results['values'][$id]['html_type'] = str_replace('Select', 'Multi-Select', $result['html_type']);
+  if ($handleLegacy && !empty($results['values']) && is_array($results['values'])) {
+    foreach ($results['values'] as $id => &$result) {
+      if (!empty($result['html_type'])) {
+        if (in_array($result['data_type'], $legacyDataTypes)) {
+          $result['html_type'] = array_search($result['data_type'], $legacyDataTypes);
+        }
+        if (!empty($result['serialize'])) {
+          $result['html_type'] = str_replace('Select', 'Multi-Select', $result['html_type']);
+        }
       }
     }
   }
diff --git a/civicrm/api/v3/LineItem.php b/civicrm/api/v3/LineItem.php
index 6e3690388fea25950caca5a77483c31ad8b11c29..b255dc1d06a188a45a5ead175d5b98af0001bf43 100644
--- a/civicrm/api/v3/LineItem.php
+++ b/civicrm/api/v3/LineItem.php
@@ -26,16 +26,11 @@
  *
  * @return array
  *   api result array
+ *
+ * @throws \API_Exception
+ * @throws \Civi\API\Exception\UnauthorizedException
  */
 function civicrm_api3_line_item_create($params) {
-  // @todo the following line is not really appropriate for the api. The BAO should
-  // do the work.
-  $taxRates = CRM_Core_PseudoConstant::getTaxRates();
-  if (isset($params['financial_type_id']) && array_key_exists($params['financial_type_id'], $taxRates)) {
-    $taxRate = $taxRates[$params['financial_type_id']];
-    $taxAmount = CRM_Contribute_BAO_Contribution_Utils::calculateTaxAmount($params['line_total'], $taxRate);
-    $params['tax_amount'] = round($taxAmount['tax_amount'], 2);
-  }
   return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params, 'LineItem');
 }
 
diff --git a/civicrm/api/v3/Mailing.php b/civicrm/api/v3/Mailing.php
index 756cf75ab823b438455be3ec686c011aa7969b62..653fdcd2b2a95762f9b086cd587dab8aa5c4cc51 100644
--- a/civicrm/api/v3/Mailing.php
+++ b/civicrm/api/v3/Mailing.php
@@ -567,8 +567,8 @@ function civicrm_api3_mailing_preview($params) {
     $details = $details[0][0] ?? NULL;
   }
   else {
-    $details = CRM_Utils_Token::getTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens());
-    $details = $details[0][$contactID];
+    [$details] = CRM_Utils_Token::getTokenDetails($mailingParams, $returnProperties, TRUE, TRUE, NULL, $mailing->getFlattenedTokens());
+    $details = $details[$contactID];
   }
 
   $mime = $mailing->compose(NULL, NULL, NULL, $contactID, $fromEmail, $fromEmail,
diff --git a/civicrm/api/v3/MembershipStatus.php b/civicrm/api/v3/MembershipStatus.php
index f49c269435f894e729b2aad37a95f5b9cab172d6..906d9f364340e31b489400d9a270cdca6140abfc 100644
--- a/civicrm/api/v3/MembershipStatus.php
+++ b/civicrm/api/v3/MembershipStatus.php
@@ -150,7 +150,7 @@ SELECT start_date, end_date, join_date, membership_type_id
   $dao = CRM_Core_DAO::executeQuery($query, $params);
   if ($dao->fetch()) {
     $membershipTypeID = empty($membershipParams['membership_type_id']) ? $dao->membership_type_id : $membershipParams['membership_type_id'];
-    $result = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dao->start_date, $dao->end_date, $dao->join_date, 'today', CRM_Utils_Array::value('ignore_admin_only', $membershipParams), $membershipTypeID, $membershipParams);
+    $result = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dao->start_date, $dao->end_date, $dao->join_date, 'now', CRM_Utils_Array::value('ignore_admin_only', $membershipParams), $membershipTypeID, $membershipParams);
     //make is error zero only when valid status found.
     if (!empty($result['id'])) {
       $result['is_error'] = 0;
diff --git a/civicrm/bin/ContributionProcessor.php b/civicrm/bin/ContributionProcessor.php
index a3a22d632cbe76a59e2306160bf1d2d20a34b9a4..a6c7bee51d019b71bfd2f7d83fd9ee79a607771d 100644
--- a/civicrm/bin/ContributionProcessor.php
+++ b/civicrm/bin/ContributionProcessor.php
@@ -353,7 +353,7 @@ class CiviContributeProcessor {
         $params += $transaction;
       }
 
-      CRM_Contribute_BAO_Contribution_Utils::_fillCommonParams($params, $type);
+      self::_fillCommonParams($params, $type);
 
       return $params;
     }
@@ -383,7 +383,7 @@ class CiviContributeProcessor {
         $params += $transaction;
       }
 
-      CRM_Contribute_BAO_Contribution_Utils::_fillCommonParams($params, $type);
+      self::_fillCommonParams($params, $type);
 
       return $params;
     }
@@ -457,6 +457,78 @@ class CiviContributeProcessor {
     return TRUE;
   }
 
+  /**
+   * @param array $params
+   * @param string $type
+   *
+   * @return bool
+   */
+  public static function _fillCommonParams(&$params, $type = 'paypal') {
+    if (array_key_exists('transaction', $params)) {
+      $transaction = &$params['transaction'];
+    }
+    else {
+      $transaction = &$params;
+    }
+
+    $params['contact_type'] = 'Individual';
+
+    $billingLocTypeId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_LocationType', 'Billing', 'id', 'name');
+    if (!$billingLocTypeId) {
+      $billingLocTypeId = 1;
+    }
+    if (!CRM_Utils_System::isNull($params['address'])) {
+      $params['address'][1]['is_primary'] = 1;
+      $params['address'][1]['location_type_id'] = $billingLocTypeId;
+    }
+    if (!CRM_Utils_System::isNull($params['email'])) {
+      $params['email'] = [
+        1 => [
+          'email' => $params['email'],
+          'location_type_id' => $billingLocTypeId,
+        ],
+      ];
+    }
+
+    if (isset($transaction['trxn_id'])) {
+      // set error message if transaction has already been processed.
+      $contribution = new CRM_Contribute_DAO_Contribution();
+      $contribution->trxn_id = $transaction['trxn_id'];
+      if ($contribution->find(TRUE)) {
+        $params['error'][] = ts('transaction already processed.');
+      }
+    }
+    else {
+      // generate a new transaction id, if not already exist
+      $transaction['trxn_id'] = md5(uniqid(rand(), TRUE));
+    }
+
+    if (!isset($transaction['financial_type_id'])) {
+      $contributionTypes = array_keys(CRM_Contribute_PseudoConstant::financialType());
+      $transaction['financial_type_id'] = $contributionTypes[0];
+    }
+
+    if (($type == 'paypal') && (!isset($transaction['net_amount']))) {
+      $transaction['net_amount'] = $transaction['total_amount'] - CRM_Utils_Array::value('fee_amount', $transaction, 0);
+    }
+
+    if (!isset($transaction['invoice_id'])) {
+      $transaction['invoice_id'] = $transaction['trxn_id'];
+    }
+
+    $source = ts('ContributionProcessor: %1 API',
+      [1 => ucfirst($type)]
+    );
+    if (isset($transaction['source'])) {
+      $transaction['source'] = $source . ':: ' . $transaction['source'];
+    }
+    else {
+      $transaction['source'] = $source;
+    }
+
+    return TRUE;
+  }
+
 }
 
 // bootstrap the environment and run the processor
diff --git a/civicrm/bin/regen.sh b/civicrm/bin/regen.sh
index 6cf3eb54c643405a95347d7142a1947a8673150d..42cb64cdc35d9d99e74cd1259fdb96b67197aff5 100755
--- a/civicrm/bin/regen.sh
+++ b/civicrm/bin/regen.sh
@@ -47,7 +47,7 @@ php GenerateData.php
 
 ## Prune local data
 $MYSQLCMD -e "DROP TABLE IF EXISTS civicrm_install_canary; DELETE FROM civicrm_cache; DELETE FROM civicrm_setting;"
-$MYSQLCMD -e "DELETE FROM civicrm_extension WHERE full_name NOT IN ('sequentialcreditnotes', 'eventcart', 'search', 'flexmailer', 'financialacls');"
+$MYSQLCMD -e "DELETE FROM civicrm_extension WHERE full_name NOT IN ('sequentialcreditnotes', 'eventcart', 'greenwich', 'search', 'flexmailer', 'financialacls');"
 TABLENAMES=$( echo "show tables like 'civicrm_%'" | $MYSQLCMD | grep ^civicrm_ | xargs )
 
 cd $CIVISOURCEDIR/sql
diff --git a/civicrm/bower_components/angular-mocks/.composer-downloads/angular-mocks-f6200e65f802695e672eba66b582c642.json b/civicrm/bower_components/angular-mocks/.composer-downloads/angular-mocks-f6200e65f802695e672eba66b582c642.json
index f3fa6e5a2087bc330f60ac9750f206595a5b8105..be929f0d4baa215e87da31e872de6dc9c339cf1a 100644
--- a/civicrm/bower_components/angular-mocks/.composer-downloads/angular-mocks-f6200e65f802695e672eba66b582c642.json
+++ b/civicrm/bower_components/angular-mocks/.composer-downloads/angular-mocks-f6200e65f802695e672eba66b582c642.json
@@ -1,6 +1,6 @@
 {
     "name": "civicrm/civicrm-core:angular-mocks",
-    "url": "https://github.com/angular/bower-angular-mocks/archive/v1.5.11.zip",
-    "checksum": "77f429f3cb5ac4ca022e69d7dddcd201f874abc08ad485281a8330fa9458f2ca",
+    "url": "https://github.com/angular/bower-angular-mocks/archive/v1.8.0.zip",
+    "checksum": "ca12cc3f98334ebd10f8c44c80afea814f9418b810cab58a6ebc7d556fed79ce",
     "ignore": null
 }
\ No newline at end of file
diff --git a/civicrm/bower_components/angular-mocks/angular-mocks.js b/civicrm/bower_components/angular-mocks/angular-mocks.js
index 25f89b5cffcd00a015ff50a485d59de888b8f9c5..c6e637da8d65b5c53a80ee1f3477eaabdeef3041 100644
--- a/civicrm/bower_components/angular-mocks/angular-mocks.js
+++ b/civicrm/bower_components/angular-mocks/angular-mocks.js
@@ -1,12 +1,61 @@
 /**
- * @license AngularJS v1.5.11
- * (c) 2010-2017 Google, Inc. http://angularjs.org
+ * @license AngularJS v1.8.0
+ * (c) 2010-2020 Google, Inc. http://angularjs.org
  * License: MIT
  */
 (function(window, angular) {
 
 'use strict';
 
+/* global routeToRegExp: true */
+
+/**
+ * @param {string} path - The path to parse. (It is assumed to have query and hash stripped off.)
+ * @param {Object} opts - Options.
+ * @return {Object} - An object containing an array of path parameter names (`keys`) and a regular
+ *     expression (`regexp`) that can be used to identify a matching URL and extract the path
+ *     parameter values.
+ *
+ * @description
+ * Parses the given path, extracting path parameter names and a regular expression to match URLs.
+ *
+ * Originally inspired by `pathRexp` in `visionmedia/express/lib/utils.js`.
+ */
+function routeToRegExp(path, opts) {
+  var keys = [];
+
+  var pattern = path
+    .replace(/([().])/g, '\\$1')
+    .replace(/(\/)?:(\w+)(\*\?|[?*])?/g, function(_, slash, key, option) {
+      var optional = option === '?' || option === '*?';
+      var star = option === '*' || option === '*?';
+      keys.push({name: key, optional: optional});
+      slash = slash || '';
+      return (
+        (optional ? '(?:' + slash : slash + '(?:') +
+        (star ? '(.+?)' : '([^/]+)') +
+        (optional ? '?)?' : ')')
+      );
+    })
+    .replace(/([/$*])/g, '\\$1');
+
+  if (opts.ignoreTrailingSlashes) {
+    pattern = pattern.replace(/\/+$/, '') + '/*';
+  }
+
+  return {
+    keys: keys,
+    regexp: new RegExp(
+      '^' + pattern + '(?:[?#]|$)',
+      opts.caseInsensitiveMatch ? 'i' : ''
+    )
+  };
+}
+
+'use strict';
+
+/* global routeToRegExp: false */
+
 /**
  * @ngdoc object
  * @name angular.mock
@@ -31,23 +80,27 @@ angular.mock = {};
  * that there are several helper methods available which can be used in tests.
  */
 angular.mock.$BrowserProvider = function() {
-  this.$get = function() {
-    return new angular.mock.$Browser();
-  };
+  this.$get = [
+    '$log', '$$taskTrackerFactory',
+    function($log, $$taskTrackerFactory) {
+      return new angular.mock.$Browser($log, $$taskTrackerFactory);
+    }
+  ];
 };
 
-angular.mock.$Browser = function() {
+angular.mock.$Browser = function($log, $$taskTrackerFactory) {
   var self = this;
+  var taskTracker = $$taskTrackerFactory($log);
 
   this.isMock = true;
   self.$$url = 'http://server/';
   self.$$lastUrl = self.$$url; // used by url polling fn
   self.pollFns = [];
 
-  // TODO(vojta): remove this temporary api
-  self.$$completeOutstandingRequest = angular.noop;
-  self.$$incOutstandingRequestCount = angular.noop;
-
+  // Task-tracking API
+  self.$$completeOutstandingRequest = taskTracker.completeTask;
+  self.$$incOutstandingRequestCount = taskTracker.incTaskCount;
+  self.notifyWhenNoOutstandingRequests = taskTracker.notifyWhenNoPendingTasks;
 
   // register url polling fn
 
@@ -71,11 +124,22 @@ angular.mock.$Browser = function() {
   self.deferredFns = [];
   self.deferredNextId = 0;
 
-  self.defer = function(fn, delay) {
+  self.defer = function(fn, delay, taskType) {
+    var timeoutId = self.deferredNextId++;
+
     delay = delay || 0;
-    self.deferredFns.push({time:(self.defer.now + delay), fn:fn, id: self.deferredNextId});
-    self.deferredFns.sort(function(a, b) { return a.time - b.time;});
-    return self.deferredNextId++;
+    taskType = taskType || taskTracker.DEFAULT_TASK_TYPE;
+
+    taskTracker.incTaskCount(taskType);
+    self.deferredFns.push({
+      id: timeoutId,
+      type: taskType,
+      time: (self.defer.now + delay),
+      fn: fn
+    });
+    self.deferredFns.sort(function(a, b) { return a.time - b.time; });
+
+    return timeoutId;
   };
 
 
@@ -89,14 +153,15 @@ angular.mock.$Browser = function() {
 
 
   self.defer.cancel = function(deferId) {
-    var fnIndex;
+    var taskIndex;
 
-    angular.forEach(self.deferredFns, function(fn, index) {
-      if (fn.id === deferId) fnIndex = index;
+    angular.forEach(self.deferredFns, function(task, index) {
+      if (task.id === deferId) taskIndex = index;
     });
 
-    if (angular.isDefined(fnIndex)) {
-      self.deferredFns.splice(fnIndex, 1);
+    if (angular.isDefined(taskIndex)) {
+      var task = self.deferredFns.splice(taskIndex, 1)[0];
+      taskTracker.completeTask(angular.noop, task.type);
       return true;
     }
 
@@ -110,6 +175,8 @@ angular.mock.$Browser = function() {
    * @description
    * Flushes all pending requests and executes the defer callbacks.
    *
+   * See {@link ngMock.$flushPendingsTasks} for more info.
+   *
    * @param {number=} number of milliseconds to flush. See {@link #defer.now}
    */
   self.defer.flush = function(delay) {
@@ -118,26 +185,76 @@ angular.mock.$Browser = function() {
     if (angular.isDefined(delay)) {
       // A delay was passed so compute the next time
       nextTime = self.defer.now + delay;
+    } else if (self.deferredFns.length) {
+      // No delay was passed so set the next time so that it clears the deferred queue
+      nextTime = self.deferredFns[self.deferredFns.length - 1].time;
     } else {
-      if (self.deferredFns.length) {
-        // No delay was passed so set the next time so that it clears the deferred queue
-        nextTime = self.deferredFns[self.deferredFns.length - 1].time;
-      } else {
-        // No delay passed, but there are no deferred tasks so flush - indicates an error!
-        throw new Error('No deferred tasks to be flushed');
-      }
+      // No delay passed, but there are no deferred tasks so flush - indicates an error!
+      throw new Error('No deferred tasks to be flushed');
     }
 
     while (self.deferredFns.length && self.deferredFns[0].time <= nextTime) {
       // Increment the time and call the next deferred function
       self.defer.now = self.deferredFns[0].time;
-      self.deferredFns.shift().fn();
+      var task = self.deferredFns.shift();
+      taskTracker.completeTask(task.fn, task.type);
     }
 
     // Ensure that the current time is correct
     self.defer.now = nextTime;
   };
 
+  /**
+   * @name $browser#defer.getPendingTasks
+   *
+   * @description
+   * Returns the currently pending tasks that need to be flushed.
+   * You can request a specific type of tasks only, by specifying a `taskType`.
+   *
+   * @param {string=} taskType - The type tasks to return.
+   */
+  self.defer.getPendingTasks = function(taskType) {
+    return !taskType
+        ? self.deferredFns
+        : self.deferredFns.filter(function(task) { return task.type === taskType; });
+  };
+
+  /**
+   * @name $browser#defer.formatPendingTasks
+   *
+   * @description
+   * Formats each task in a list of pending tasks as a string, suitable for use in error messages.
+   *
+   * @param {Array<Object>} pendingTasks - A list of task objects.
+   * @return {Array<string>} A list of stringified tasks.
+   */
+  self.defer.formatPendingTasks = function(pendingTasks) {
+    return pendingTasks.map(function(task) {
+      return '{id: ' + task.id + ', type: ' + task.type + ', time: ' + task.time + '}';
+    });
+  };
+
+  /**
+   * @name $browser#defer.verifyNoPendingTasks
+   *
+   * @description
+   * Verifies that there are no pending tasks that need to be flushed.
+   * You can check for a specific type of tasks only, by specifying a `taskType`.
+   *
+   * See {@link $verifyNoPendingTasks} for more info.
+   *
+   * @param {string=} taskType - The type tasks to check for.
+   */
+  self.defer.verifyNoPendingTasks = function(taskType) {
+    var pendingTasks = self.defer.getPendingTasks(taskType);
+
+    if (pendingTasks.length) {
+      var formattedTasks = self.defer.formatPendingTasks(pendingTasks).join('\n  ');
+      throw new Error('Deferred tasks to flush (' + pendingTasks.length + '):\n  ' +
+          formattedTasks);
+    }
+  };
+
   self.$$baseHref = '/';
   self.baseHref = function() {
     return this.$$baseHref;
@@ -162,7 +279,8 @@ angular.mock.$Browser.prototype = {
       state = null;
     }
     if (url) {
-      this.$$url = url;
+      // The `$browser` service trims empty hashes; simulate it.
+      this.$$url = url.replace(/#$/, '');
       // Native pushState serializes & copies the object; simulate it.
       this.$$state = angular.copy(state);
       return this;
@@ -173,13 +291,85 @@ angular.mock.$Browser.prototype = {
 
   state: function() {
     return this.$$state;
-  },
-
-  notifyWhenNoOutstandingRequests: function(fn) {
-    fn();
   }
 };
 
+/**
+ * @ngdoc service
+ * @name $flushPendingTasks
+ *
+ * @description
+ * Flushes all currently pending tasks and executes the corresponding callbacks.
+ *
+ * Optionally, you can also pass a `delay` argument to only flush tasks that are scheduled to be
+ * executed within `delay` milliseconds. Currently, `delay` only applies to timeouts, since all
+ * other tasks have a delay of 0 (i.e. they are scheduled to be executed as soon as possible, but
+ * still asynchronously).
+ *
+ * If no delay is specified, it uses a delay such that all currently pending tasks are flushed.
+ *
+ * The types of tasks that are flushed include:
+ *
+ * - Pending timeouts (via {@link $timeout}).
+ * - Pending tasks scheduled via {@link ng.$rootScope.Scope#$applyAsync $applyAsync}.
+ * - Pending tasks scheduled via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}.
+ *   These include tasks scheduled via `$evalAsync()` indirectly (such as {@link $q} promises).
+ *
+ * <div class="alert alert-info">
+ *   Periodic tasks scheduled via {@link $interval} use a different queue and are not flushed by
+ *   `$flushPendingTasks()`. Use {@link ngMock.$interval#flush $interval.flush(millis)} instead.
+ * </div>
+ *
+ * @param {number=} delay - The number of milliseconds to flush.
+ */
+angular.mock.$FlushPendingTasksProvider = function() {
+  this.$get = [
+    '$browser',
+    function($browser) {
+      return function $flushPendingTasks(delay) {
+        return $browser.defer.flush(delay);
+      };
+    }
+  ];
+};
+
+/**
+ * @ngdoc service
+ * @name $verifyNoPendingTasks
+ *
+ * @description
+ * Verifies that there are no pending tasks that need to be flushed. It throws an error if there are
+ * still pending tasks.
+ *
+ * You can check for a specific type of tasks only, by specifying a `taskType`.
+ *
+ * Available task types:
+ *
+ * - `$timeout`: Pending timeouts (via {@link $timeout}).
+ * - `$http`: Pending HTTP requests (via {@link $http}).
+ * - `$route`: In-progress route transitions (via {@link $route}).
+ * - `$applyAsync`: Pending tasks scheduled via {@link ng.$rootScope.Scope#$applyAsync $applyAsync}.
+ * - `$evalAsync`: Pending tasks scheduled via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}.
+ *   These include tasks scheduled via `$evalAsync()` indirectly (such as {@link $q} promises).
+ *
+ * <div class="alert alert-info">
+ *   Periodic tasks scheduled via {@link $interval} use a different queue and are not taken into
+ *   account by `$verifyNoPendingTasks()`. There is currently no way to verify that there are no
+ *   pending {@link $interval} tasks.
+ * </div>
+ *
+ * @param {string=} taskType - The type of tasks to check for.
+ */
+angular.mock.$VerifyNoPendingTasksProvider = function() {
+  this.$get = [
+    '$browser',
+    function($browser) {
+      return function $verifyNoPendingTasks(taskType) {
+        return $browser.defer.verifyNoPendingTasks(taskType);
+      };
+    }
+  ];
+};
 
 /**
  * @ngdoc provider
@@ -448,62 +638,40 @@ angular.mock.$LogProvider = function() {
  * @returns {promise} A promise which will be notified on each iteration.
  */
 angular.mock.$IntervalProvider = function() {
-  this.$get = ['$browser', '$rootScope', '$q', '$$q',
-       function($browser,   $rootScope,   $q,   $$q) {
+  this.$get = ['$browser', '$$intervalFactory',
+       function($browser,   $$intervalFactory) {
     var repeatFns = [],
         nextRepeatId = 0,
-        now = 0;
-
-    var $interval = function(fn, delay, count, invokeApply) {
-      var hasParams = arguments.length > 4,
-          args = hasParams ? Array.prototype.slice.call(arguments, 4) : [],
-          iteration = 0,
-          skipApply = (angular.isDefined(invokeApply) && !invokeApply),
-          deferred = (skipApply ? $$q : $q).defer(),
-          promise = deferred.promise;
-
-      count = (angular.isDefined(count)) ? count : 0;
-      promise.then(null, null, (!hasParams) ? fn : function() {
-        fn.apply(null, args);
-      });
-
-      promise.$$intervalId = nextRepeatId;
-
-      function tick() {
-        deferred.notify(iteration++);
-
-        if (count > 0 && iteration >= count) {
-          var fnIndex;
-          deferred.resolve(iteration);
-
-          angular.forEach(repeatFns, function(fn, index) {
-            if (fn.id === promise.$$intervalId) fnIndex = index;
+        now = 0,
+        setIntervalFn = function(tick, delay, deferred, skipApply) {
+          var id = nextRepeatId++;
+          var fn = !skipApply ? tick : function() {
+            tick();
+            $browser.defer.flush();
+          };
+
+          repeatFns.push({
+            nextTime: (now + (delay || 0)),
+            delay: delay || 1,
+            fn: fn,
+            id: id,
+            deferred: deferred
           });
+          repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime; });
 
-          if (angular.isDefined(fnIndex)) {
-            repeatFns.splice(fnIndex, 1);
+          return id;
+        },
+        clearIntervalFn = function(id) {
+          for (var fnIndex = repeatFns.length - 1; fnIndex >= 0; fnIndex--) {
+            if (repeatFns[fnIndex].id === id) {
+              repeatFns.splice(fnIndex, 1);
+              break;
+            }
           }
-        }
-
-        if (skipApply) {
-          $browser.defer.flush();
-        } else {
-          $rootScope.$apply();
-        }
-      }
+        };
 
-      repeatFns.push({
-        nextTime:(now + delay),
-        delay: delay,
-        fn: tick,
-        id: nextRepeatId,
-        deferred: deferred
-      });
-      repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;});
+    var $interval = $$intervalFactory(setIntervalFn, clearIntervalFn);
 
-      nextRepeatId++;
-      return promise;
-    };
     /**
      * @ngdoc method
      * @name $interval#cancel
@@ -516,16 +684,15 @@ angular.mock.$IntervalProvider = function() {
      */
     $interval.cancel = function(promise) {
       if (!promise) return false;
-      var fnIndex;
-
-      angular.forEach(repeatFns, function(fn, index) {
-        if (fn.id === promise.$$intervalId) fnIndex = index;
-      });
 
-      if (angular.isDefined(fnIndex)) {
-        repeatFns[fnIndex].deferred.reject('canceled');
-        repeatFns.splice(fnIndex, 1);
-        return true;
+      for (var fnIndex = repeatFns.length - 1; fnIndex >= 0; fnIndex--) {
+        if (repeatFns[fnIndex].id === promise.$$intervalId) {
+          var deferred = repeatFns[fnIndex].deferred;
+          deferred.promise.then(undefined, function() {});
+          deferred.reject('canceled');
+          repeatFns.splice(fnIndex, 1);
+          return true;
+        }
       }
 
       return false;
@@ -538,15 +705,21 @@ angular.mock.$IntervalProvider = function() {
      *
      * Runs interval tasks scheduled to be run in the next `millis` milliseconds.
      *
-     * @param {number=} millis maximum timeout amount to flush up until.
+     * @param {number} millis maximum timeout amount to flush up until.
      *
      * @return {number} The amount of time moved forward.
      */
     $interval.flush = function(millis) {
+      var before = now;
       now += millis;
       while (repeatFns.length && repeatFns[0].nextTime <= now) {
         var task = repeatFns[0];
         task.fn();
+        if (task.nextTime === before) {
+          // this can only happen the first time
+          // a zero-delay interval gets triggered
+          task.nextTime++;
+        }
         task.nextTime += task.delay;
         repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;});
       }
@@ -778,6 +951,7 @@ angular.mock.TzDate.prototype = Date.prototype;
  * You need to require the `ngAnimateMock` module in your test suite for instance `beforeEach(module('ngAnimateMock'))`
  */
 angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
+  .info({ angularVersion: '1.8.0' })
 
   .config(['$provide', function($provide) {
 
@@ -943,7 +1117,7 @@ angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
  *
  * *NOTE*: This is not an injectable instance, just a globally available function.
  *
- * Method for serializing common angular objects (scope, elements, etc..) into strings.
+ * Method for serializing common AngularJS objects (scope, elements, etc..) into strings.
  * It is useful for logging objects to the console when debugging.
  *
  * @param {*} object - any object to turn into string.
@@ -1025,7 +1199,7 @@ angular.mock.dump = function(object) {
  * This mock implementation can be used to respond with static or dynamic responses via the
  * `expect` and `when` apis and their shortcuts (`expectGET`, `whenPOST`, etc).
  *
- * When an Angular application needs some data from a server, it calls the $http service, which
+ * When an AngularJS application needs some data from a server, it calls the $http service, which
  * sends the request to a real server using $httpBackend service. With dependency injection, it is
  * easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify
  * the requests and respond with some testing data without sending a request to a real server.
@@ -1120,6 +1294,8 @@ angular.mock.dump = function(object) {
     $http.get('/auth.py').then(function(response) {
       authToken = response.headers('A-Token');
       $scope.user = response.data;
+    }).catch(function() {
+      $scope.status = 'Failed...';
     });
 
     $scope.saveMessage = function(message) {
@@ -1128,7 +1304,7 @@ angular.mock.dump = function(object) {
 
       $http.post('/add-msg.py', message, { headers: headers } ).then(function(response) {
         $scope.status = '';
-      })['catch'](function() {
+      }).catch(function() {
         $scope.status = 'Failed...';
       });
     };
@@ -1261,7 +1437,7 @@ angular.mock.dump = function(object) {
  * ## Matching route requests
  *
  * For extra convenience, `whenRoute` and `expectRoute` shortcuts are available. These methods offer colon
- * delimited matching of the url path, ignoring the query string. This allows declarations
+ * delimited matching of the url path, ignoring the query string and trailing slashes. This allows declarations
  * similar to how application routes are configured with `$routeProvider`. Because these methods convert
  * the definition url to regex, declaration order is important. Combined with query parameter parsing,
  * the following is possible:
@@ -1301,9 +1477,8 @@ angular.mock.dump = function(object) {
       });
   ```
  */
-angular.mock.$HttpBackendProvider = function() {
-  this.$get = ['$rootScope', '$timeout', createHttpBackendMock];
-};
+angular.mock.$httpBackendDecorator =
+  ['$rootScope', '$timeout', '$delegate', createHttpBackendMock];
 
 /**
  * General factory function for $httpBackend mock.
@@ -1322,17 +1497,21 @@ angular.mock.$HttpBackendProvider = function() {
 function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
   var definitions = [],
       expectations = [],
+      matchLatestDefinition = false,
       responses = [],
       responsesPush = angular.bind(responses, responses.push),
-      copy = angular.copy;
+      copy = angular.copy,
+      // We cache the original backend so that if both ngMock and ngMockE2E override the
+      // service the ngMockE2E version can pass through to the real backend
+      originalHttpBackend = $delegate.$$originalHttpBackend || $delegate;
 
   function createResponse(status, data, headers, statusText) {
     if (angular.isFunction(status)) return status;
 
     return function() {
       return angular.isNumber(status)
-          ? [status, data, headers, statusText]
-          : [200, status, data, headers];
+          ? [status, data, headers, statusText, 'complete']
+          : [200, status, data, headers, 'complete'];
     };
   }
 
@@ -1355,42 +1534,56 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
     function wrapResponse(wrapped) {
       if (!$browser && timeout) {
         if (timeout.then) {
-          timeout.then(handleTimeout);
+          timeout.then(function() {
+            handlePrematureEnd(angular.isDefined(timeout.$$timeoutId) ? 'timeout' : 'abort');
+          });
         } else {
-          $timeout(handleTimeout, timeout);
+          $timeout(function() {
+            handlePrematureEnd('timeout');
+          }, timeout);
         }
       }
 
+      handleResponse.description = method + ' ' + url;
       return handleResponse;
 
       function handleResponse() {
         var response = wrapped.response(method, url, data, headers, wrapped.params(url));
         xhr.$$respHeaders = response[2];
         callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(),
-                 copy(response[3] || ''));
+                 copy(response[3] || ''), copy(response[4]));
       }
 
-      function handleTimeout() {
+      function handlePrematureEnd(reason) {
         for (var i = 0, ii = responses.length; i < ii; i++) {
           if (responses[i] === handleResponse) {
             responses.splice(i, 1);
-            callback(-1, undefined, '');
+            callback(-1, undefined, '', undefined, reason);
             break;
           }
         }
       }
     }
 
+    function createFatalError(message) {
+      var error = new Error(message);
+      // In addition to being converted to a rejection, these errors also need to be passed to
+      // the $exceptionHandler and be rethrown (so that the test fails).
+      error.$$passToExceptionHandler = true;
+      return error;
+    }
+
     if (expectation && expectation.match(method, url)) {
       if (!expectation.matchData(data)) {
-        throw new Error('Expected ' + expectation + ' with different data\n' +
-            'EXPECTED: ' + prettyPrint(expectation.data) + '\nGOT:      ' + data);
+        throw createFatalError('Expected ' + expectation + ' with different data\n' +
+          'EXPECTED: ' + prettyPrint(expectation.data) + '\n' +
+          'GOT:      ' + data);
       }
 
       if (!expectation.matchHeaders(headers)) {
-        throw new Error('Expected ' + expectation + ' with different headers\n' +
-                        'EXPECTED: ' + prettyPrint(expectation.headers) + '\nGOT:      ' +
-                        prettyPrint(headers));
+        throw createFatalError('Expected ' + expectation + ' with different headers\n' +
+          'EXPECTED: ' + prettyPrint(expectation.headers) + '\n' +
+          'GOT:      ' + prettyPrint(headers));
       }
 
       expectations.shift();
@@ -1402,22 +1595,26 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
       wasExpected = true;
     }
 
-    var i = -1, definition;
-    while ((definition = definitions[++i])) {
+    var i = matchLatestDefinition ? definitions.length : -1, definition;
+
+    while ((definition = definitions[matchLatestDefinition ? --i : ++i])) {
       if (definition.match(method, url, data, headers || {})) {
         if (definition.response) {
           // if $browser specified, we do auto flush all requests
           ($browser ? $browser.defer : responsesPush)(wrapResponse(definition));
         } else if (definition.passThrough) {
-          $delegate(method, url, data, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers);
-        } else throw new Error('No response defined !');
+          originalHttpBackend(method, url, data, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers);
+        } else throw createFatalError('No response defined !');
         return;
       }
     }
-    throw wasExpected ?
-        new Error('No response defined !') :
-        new Error('Unexpected request: ' + method + ' ' + url + '\n' +
-                  (expectation ? 'Expected ' + expectation : 'No more request expected'));
+
+    if (wasExpected) {
+      throw createFatalError('No response defined !');
+    }
+
+    throw createFatalError('Unexpected request: ' + method + ' ' + url + '\n' +
+      (expectation ? 'Expected ' + expectation : 'No more request expected'));
   }
 
   /**
@@ -1427,7 +1624,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * Creates a new backend definition.
    *
    * @param {string} method HTTP method.
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
    *   and returns true if the url matches the current definition.
    * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
    *   data string and returns true if the data is as expected.
@@ -1445,10 +1642,14 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    *      ```
    *    – The respond method takes a set of static data to be returned or a function that can
    *    return an array containing response status (number), response data (Array|Object|string),
-   *    response headers (Object), and the text for the status (string). The respond method returns
-   *    the `requestHandler` object for possible overrides.
+   *    response headers (Object), HTTP status text (string), and XMLHttpRequest status (string:
+   *    `complete`, `error`, `timeout` or `abort`). The respond method returns the `requestHandler`
+   *    object for possible overrides.
    */
   $httpBackend.when = function(method, url, data, headers, keys) {
+
+    assertArgDefined(arguments, 1, 'url');
+
     var definition = new MockHttpExpectation(method, url, data, headers, keys),
         chain = {
           respond: function(status, data, headers, statusText) {
@@ -1470,15 +1671,57 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
     return chain;
   };
 
+  /**
+   * @ngdoc method
+   * @name  $httpBackend#matchLatestDefinitionEnabled
+   * @description
+   * This method can be used to change which mocked responses `$httpBackend` returns, when defining
+   * them with {@link ngMock.$httpBackend#when $httpBackend.when()} (and shortcut methods).
+   * By default, `$httpBackend` returns the first definition that matches. When setting
+   * `$http.matchLatestDefinitionEnabled(true)`, it will use the last response that matches, i.e. the
+   * one that was added last.
+   *
+   * ```js
+   * hb.when('GET', '/url1').respond(200, 'content', {});
+   * hb.when('GET', '/url1').respond(201, 'another', {});
+   * hb('GET', '/url1'); // receives "content"
+   *
+   * $http.matchLatestDefinitionEnabled(true)
+   * hb('GET', '/url1'); // receives "another"
+   *
+   * hb.when('GET', '/url1').respond(201, 'onemore', {});
+   * hb('GET', '/url1'); // receives "onemore"
+   * ```
+   *
+   * This is useful if a you have a default response that is overriden inside specific tests.
+   *
+   * Note that different from config methods on providers, `matchLatestDefinitionEnabled()` can be changed
+   * even when the application is already running.
+   *
+   * @param  {Boolean=} value value to set, either `true` or `false`. Default is `false`.
+   *                          If omitted, it will return the current value.
+   * @return {$httpBackend|Boolean} self when used as a setter, and the current value when used
+   *                                as a getter
+   */
+  $httpBackend.matchLatestDefinitionEnabled = function(value) {
+    if (angular.isDefined(value)) {
+      matchLatestDefinition = value;
+      return this;
+    } else {
+      return matchLatestDefinition;
+    }
+  };
+
   /**
    * @ngdoc method
    * @name $httpBackend#whenGET
    * @description
    * Creates a new backend definition for GET requests. For more info see `when()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
    *   and returns true if the url matches the current definition.
-   * @param {(Object|function(Object))=} headers HTTP headers.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current definition.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    * request is handled. You can save this object for later use and invoke `respond` again in
@@ -1491,9 +1734,10 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new backend definition for HEAD requests. For more info see `when()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
    *   and returns true if the url matches the current definition.
-   * @param {(Object|function(Object))=} headers HTTP headers.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current definition.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    * request is handled. You can save this object for later use and invoke `respond` again in
@@ -1506,9 +1750,10 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new backend definition for DELETE requests. For more info see `when()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
    *   and returns true if the url matches the current definition.
-   * @param {(Object|function(Object))=} headers HTTP headers.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current definition.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    * request is handled. You can save this object for later use and invoke `respond` again in
@@ -1521,11 +1766,12 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new backend definition for POST requests. For more info see `when()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
    *   and returns true if the url matches the current definition.
    * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
    *   data string and returns true if the data is as expected.
-   * @param {(Object|function(Object))=} headers HTTP headers.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current definition.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    * request is handled. You can save this object for later use and invoke `respond` again in
@@ -1538,11 +1784,12 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new backend definition for PUT requests.  For more info see `when()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
    *   and returns true if the url matches the current definition.
    * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
    *   data string and returns true if the data is as expected.
-   * @param {(Object|function(Object))=} headers HTTP headers.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current definition.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    * request is handled. You can save this object for later use and invoke `respond` again in
@@ -1555,7 +1802,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new backend definition for JSONP requests. For more info see `when()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
    *   and returns true if the url matches the current definition.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
@@ -1574,42 +1821,13 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @param {string} url HTTP url string that supports colon param matching.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    * request is handled. You can save this object for later use and invoke `respond` again in
-   * order to change how a matched request is handled. See #when for more info.
+   * order to change how a matched request is handled.
+   * See {@link ngMock.$httpBackend#when `when`} for more info.
    */
   $httpBackend.whenRoute = function(method, url) {
-    var pathObj = parseRoute(url);
-    return $httpBackend.when(method, pathObj.regexp, undefined, undefined, pathObj.keys);
-  };
-
-  function parseRoute(url) {
-    var ret = {
-      regexp: url
-    },
-    keys = ret.keys = [];
-
-    if (!url || !angular.isString(url)) return ret;
-
-    url = url
-      .replace(/([().])/g, '\\$1')
-      .replace(/(\/)?:(\w+)([?*])?/g, function(_, slash, key, option) {
-        var optional = option === '?' ? option : null;
-        var star = option === '*' ? option : null;
-        keys.push({ name: key, optional: !!optional });
-        slash = slash || '';
-        return ''
-          + (optional ? '' : slash)
-          + '(?:'
-          + (optional ? slash : '')
-          + (star && '(.+?)' || '([^/]+)')
-          + (optional || '')
-          + ')'
-          + (optional || '');
-      })
-      .replace(/([/$*])/g, '\\$1');
-
-    ret.regexp = new RegExp('^' + url, 'i');
-    return ret;
-  }
+    var parsed = parseRouteUrl(url);
+    return $httpBackend.when(method, parsed.regexp, undefined, undefined, parsed.keys);
+  };
 
   /**
    * @ngdoc method
@@ -1618,7 +1836,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * Creates a new request expectation.
    *
    * @param {string} method HTTP method.
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
    *   and returns true if the url matches the current definition.
    * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
    *  receives data string and returns true if the data is as expected, or Object if request body
@@ -1631,16 +1849,20 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    *  order to change how a matched request is handled.
    *
    *  - respond –
-   *    ```
-   *    { function([status,] data[, headers, statusText])
-   *    | function(function(method, url, data, headers, params)}
-   *    ```
+   *      ```js
+   *      {function([status,] data[, headers, statusText])
+   *      | function(function(method, url, data, headers, params)}
+   *      ```
    *    – The respond method takes a set of static data to be returned or a function that can
    *    return an array containing response status (number), response data (Array|Object|string),
-   *    response headers (Object), and the text for the status (string). The respond method returns
-   *    the `requestHandler` object for possible overrides.
+   *    response headers (Object), HTTP status text (string), and XMLHttpRequest status (string:
+   *    `complete`, `error`, `timeout` or `abort`). The respond method returns the `requestHandler`
+   *    object for possible overrides.
    */
   $httpBackend.expect = function(method, url, data, headers, keys) {
+
+    assertArgDefined(arguments, 1, 'url');
+
     var expectation = new MockHttpExpectation(method, url, data, headers, keys),
         chain = {
           respond: function(status, data, headers, statusText) {
@@ -1659,9 +1881,10 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new request expectation for GET requests. For more info see `expect()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
-   *   and returns true if the url matches the current definition.
-   * @param {Object=} headers HTTP headers.
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
+   *   and returns true if the url matches the current expectation.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current expectation.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    * request is handled. You can save this object for later use and invoke `respond` again in
@@ -1674,9 +1897,10 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new request expectation for HEAD requests. For more info see `expect()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
-   *   and returns true if the url matches the current definition.
-   * @param {Object=} headers HTTP headers.
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
+   *   and returns true if the url matches the current expectation.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current expectation.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    *   request is handled. You can save this object for later use and invoke `respond` again in
@@ -1689,9 +1913,10 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new request expectation for DELETE requests. For more info see `expect()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
-   *   and returns true if the url matches the current definition.
-   * @param {Object=} headers HTTP headers.
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
+   *   and returns true if the url matches the current expectation.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current expectation.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    *   request is handled. You can save this object for later use and invoke `respond` again in
@@ -1704,12 +1929,13 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new request expectation for POST requests. For more info see `expect()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
-   *   and returns true if the url matches the current definition.
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
+   *   and returns true if the url matches the current expectation.
    * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
    *  receives data string and returns true if the data is as expected, or Object if request body
    *  is in JSON format.
-   * @param {Object=} headers HTTP headers.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current expectation.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    *   request is handled. You can save this object for later use and invoke `respond` again in
@@ -1722,12 +1948,13 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new request expectation for PUT requests. For more info see `expect()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
-   *   and returns true if the url matches the current definition.
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
+   *   and returns true if the url matches the current expectation.
    * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
    *  receives data string and returns true if the data is as expected, or Object if request body
    *  is in JSON format.
-   * @param {Object=} headers HTTP headers.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current expectation.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    *   request is handled. You can save this object for later use and invoke `respond` again in
@@ -1740,12 +1967,13 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new request expectation for PATCH requests. For more info see `expect()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
-   *   and returns true if the url matches the current definition.
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
+   *   and returns true if the url matches the current expectation.
    * @param {(string|RegExp|function(string)|Object)=} data HTTP request body or function that
    *  receives data string and returns true if the data is as expected, or Object if request body
    *  is in JSON format.
-   * @param {Object=} headers HTTP headers.
+   * @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
+   *   object and returns true if the headers match the current expectation.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    *   request is handled. You can save this object for later use and invoke `respond` again in
@@ -1758,8 +1986,8 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @description
    * Creates a new request expectation for JSONP requests. For more info see `expect()`.
    *
-   * @param {string|RegExp|function(string)} url HTTP url or function that receives an url
-   *   and returns true if the url matches the current definition.
+   * @param {string|RegExp|function(string)=} url HTTP url or function that receives an url
+   *   and returns true if the url matches the current expectation.
    * @param {(Array)=} keys Array of keys to assign to regex matches in request url described above.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    *   request is handled. You can save this object for later use and invoke `respond` again in
@@ -1777,11 +2005,12 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    * @param {string} url HTTP url string that supports colon param matching.
    * @returns {requestHandler} Returns an object with `respond` method that controls how a matched
    * request is handled. You can save this object for later use and invoke `respond` again in
-   * order to change how a matched request is handled. See #expect for more info.
+   * order to change how a matched request is handled.
+   * See {@link ngMock.$httpBackend#expect `expect`} for more info.
    */
   $httpBackend.expectRoute = function(method, url) {
-    var pathObj = parseRoute(url);
-    return $httpBackend.expect(method, pathObj.regexp, undefined, undefined, pathObj.keys);
+    var parsed = parseRouteUrl(url);
+    return $httpBackend.expect(method, parsed.regexp, undefined, undefined, parsed.keys);
   };
 
 
@@ -1858,9 +2087,12 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
    *   afterEach($httpBackend.verifyNoOutstandingRequest);
    * ```
    */
-  $httpBackend.verifyNoOutstandingRequest = function() {
+  $httpBackend.verifyNoOutstandingRequest = function(digest) {
+    if (digest !== false) $rootScope.$digest();
     if (responses.length) {
-      throw new Error('Unflushed requests: ' + responses.length);
+      var unflushedDescriptions = responses.map(function(res) { return res.description; });
+      throw new Error('Unflushed requests: ' + responses.length + '\n  ' +
+                      unflushedDescriptions.join('\n  '));
     }
   };
 
@@ -1878,127 +2110,166 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
     responses.length = 0;
   };
 
+  $httpBackend.$$originalHttpBackend = originalHttpBackend;
+
   return $httpBackend;
 
 
   function createShortMethods(prefix) {
     angular.forEach(['GET', 'DELETE', 'JSONP', 'HEAD'], function(method) {
      $httpBackend[prefix + method] = function(url, headers, keys) {
+        assertArgDefined(arguments, 0, 'url');
+
+        // Change url to `null` if `undefined` to stop it throwing an exception further down
+        if (angular.isUndefined(url)) url = null;
+
        return $httpBackend[prefix](method, url, undefined, headers, keys);
      };
     });
 
     angular.forEach(['PUT', 'POST', 'PATCH'], function(method) {
       $httpBackend[prefix + method] = function(url, data, headers, keys) {
+        assertArgDefined(arguments, 0, 'url');
+
+        // Change url to `null` if `undefined` to stop it throwing an exception further down
+        if (angular.isUndefined(url)) url = null;
+
         return $httpBackend[prefix](method, url, data, headers, keys);
       };
     });
   }
-}
-
-function MockHttpExpectation(method, url, data, headers, keys) {
 
-  function getUrlParams(u) {
-    var params = u.slice(u.indexOf('?') + 1).split('&');
-    return params.sort();
+  function parseRouteUrl(url) {
+    var strippedUrl = stripQueryAndHash(url);
+    var parseOptions = {caseInsensitiveMatch: true, ignoreTrailingSlashes: true};
+    return routeToRegExp(strippedUrl, parseOptions);
   }
+}
 
-  function compareUrl(u) {
-    return (url.slice(0, url.indexOf('?')) === u.slice(0, u.indexOf('?')) &&
-      getUrlParams(url).join() === getUrlParams(u).join());
+function assertArgDefined(args, index, name) {
+  if (args.length > index && angular.isUndefined(args[index])) {
+    throw new Error('Undefined argument `' + name + '`; the argument is provided but not defined');
   }
+}
+
+function stripQueryAndHash(url) {
+  return url.replace(/[?#].*$/, '');
+}
+
+function MockHttpExpectation(expectedMethod, expectedUrl, expectedData, expectedHeaders,
+                             expectedKeys) {
 
-  this.data = data;
-  this.headers = headers;
+  this.data = expectedData;
+  this.headers = expectedHeaders;
 
-  this.match = function(m, u, d, h) {
-    if (method !== m) return false;
-    if (!this.matchUrl(u)) return false;
-    if (angular.isDefined(d) && !this.matchData(d)) return false;
-    if (angular.isDefined(h) && !this.matchHeaders(h)) return false;
+  this.match = function(method, url, data, headers) {
+    if (expectedMethod !== method) return false;
+    if (!this.matchUrl(url)) return false;
+    if (angular.isDefined(data) && !this.matchData(data)) return false;
+    if (angular.isDefined(headers) && !this.matchHeaders(headers)) return false;
     return true;
   };
 
-  this.matchUrl = function(u) {
-    if (!url) return true;
-    if (angular.isFunction(url.test)) return url.test(u);
-    if (angular.isFunction(url)) return url(u);
-    return (url === u || compareUrl(u));
+  this.matchUrl = function(url) {
+    if (!expectedUrl) return true;
+    if (angular.isFunction(expectedUrl.test)) return expectedUrl.test(url);
+    if (angular.isFunction(expectedUrl)) return expectedUrl(url);
+    return (expectedUrl === url || compareUrlWithQuery(url));
   };
 
-  this.matchHeaders = function(h) {
-    if (angular.isUndefined(headers)) return true;
-    if (angular.isFunction(headers)) return headers(h);
-    return angular.equals(headers, h);
+  this.matchHeaders = function(headers) {
+    if (angular.isUndefined(expectedHeaders)) return true;
+    if (angular.isFunction(expectedHeaders)) return expectedHeaders(headers);
+    return angular.equals(expectedHeaders, headers);
   };
 
-  this.matchData = function(d) {
-    if (angular.isUndefined(data)) return true;
-    if (data && angular.isFunction(data.test)) return data.test(d);
-    if (data && angular.isFunction(data)) return data(d);
-    if (data && !angular.isString(data)) {
-      return angular.equals(angular.fromJson(angular.toJson(data)), angular.fromJson(d));
+  this.matchData = function(data) {
+    if (angular.isUndefined(expectedData)) return true;
+    if (expectedData && angular.isFunction(expectedData.test)) return expectedData.test(data);
+    if (expectedData && angular.isFunction(expectedData)) return expectedData(data);
+    if (expectedData && !angular.isString(expectedData)) {
+      return angular.equals(angular.fromJson(angular.toJson(expectedData)), angular.fromJson(data));
     }
     // eslint-disable-next-line eqeqeq
-    return data == d;
+    return expectedData == data;
   };
 
   this.toString = function() {
-    return method + ' ' + url;
+    return expectedMethod + ' ' + expectedUrl;
   };
 
-  this.params = function(u) {
-    return angular.extend(parseQuery(), pathParams());
+  this.params = function(url) {
+    var queryStr = url.indexOf('?') === -1 ? '' : url.substring(url.indexOf('?') + 1);
+    var strippedUrl = stripQueryAndHash(url);
 
-    function pathParams() {
-      var keyObj = {};
-      if (!url || !angular.isFunction(url.test) || !keys || keys.length === 0) return keyObj;
+    return angular.extend(extractParamsFromQuery(queryStr), extractParamsFromPath(strippedUrl));
+  };
 
-      var m = url.exec(u);
-      if (!m) return keyObj;
-      for (var i = 1, len = m.length; i < len; ++i) {
-        var key = keys[i - 1];
-        var val = m[i];
-        if (key && val) {
-          keyObj[key.name || key] = val;
-        }
-      }
+  function compareUrlWithQuery(url) {
+    var urlWithQueryRe = /^([^?]*)\?(.*)$/;
+
+    var expectedMatch = urlWithQueryRe.exec(expectedUrl);
+    var actualMatch = urlWithQueryRe.exec(url);
+
+    return !!(expectedMatch && actualMatch) &&
+      (expectedMatch[1] === actualMatch[1]) &&
+      (normalizeQuery(expectedMatch[2]) === normalizeQuery(actualMatch[2]));
+  }
+
+  function normalizeQuery(queryStr) {
+    return queryStr.split('&').sort().join('&');
+  }
+
+  function extractParamsFromPath(strippedUrl) {
+    var keyObj = {};
+
+    if (!expectedUrl || !angular.isFunction(expectedUrl.test) ||
+        !expectedKeys || !expectedKeys.length) return keyObj;
+
+    var match = expectedUrl.exec(strippedUrl);
+    if (!match) return keyObj;
 
-      return keyObj;
+    for (var i = 1, len = match.length; i < len; ++i) {
+      var key = expectedKeys[i - 1];
+      var val = match[i];
+      if (key && val) {
+        keyObj[key.name || key] = val;
+      }
     }
 
-    function parseQuery() {
-      var obj = {}, key_value, key,
-          queryStr = u.indexOf('?') > -1
-          ? u.substring(u.indexOf('?') + 1)
-          : '';
-
-      angular.forEach(queryStr.split('&'), function(keyValue) {
-        if (keyValue) {
-          key_value = keyValue.replace(/\+/g,'%20').split('=');
-          key = tryDecodeURIComponent(key_value[0]);
-          if (angular.isDefined(key)) {
-            var val = angular.isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
-            if (!hasOwnProperty.call(obj, key)) {
-              obj[key] = val;
-            } else if (angular.isArray(obj[key])) {
-              obj[key].push(val);
-            } else {
-              obj[key] = [obj[key],val];
-            }
-          }
+    return keyObj;
+  }
+
+  function extractParamsFromQuery(queryStr) {
+    var obj = {},
+        keyValuePairs = queryStr.split('&').
+            filter(angular.identity).  // Ignore empty segments.
+            map(function(keyValue) { return keyValue.replace(/\+/g, '%20').split('='); });
+
+    angular.forEach(keyValuePairs, function(pair) {
+      var key = tryDecodeURIComponent(pair[0]);
+      if (angular.isDefined(key)) {
+        var val = angular.isDefined(pair[1]) ? tryDecodeURIComponent(pair[1]) : true;
+        if (!hasOwnProperty.call(obj, key)) {
+          obj[key] = val;
+        } else if (angular.isArray(obj[key])) {
+          obj[key].push(val);
+        } else {
+          obj[key] = [obj[key], val];
         }
-      });
-      return obj;
-    }
-    function tryDecodeURIComponent(value) {
-      try {
-        return decodeURIComponent(value);
-      } catch (e) {
-        // Ignore any invalid uri component
       }
+    });
+
+    return obj;
+  }
+
+  function tryDecodeURIComponent(value) {
+    try {
+      return decodeURIComponent(value);
+    } catch (e) {
+      // Ignore any invalid uri component
     }
-  };
+  }
 }
 
 function createMockXhr() {
@@ -2032,13 +2303,13 @@ function MockXhr() {
     var header = this.$$respHeaders[name];
     if (header) return header;
 
-    name = angular.lowercase(name);
+    name = angular.$$lowercase(name);
     header = this.$$respHeaders[name];
     if (header) return header;
 
     header = undefined;
     angular.forEach(this.$$respHeaders, function(headerVal, headerName) {
-      if (!header && angular.lowercase(headerName) === name) header = headerVal;
+      if (!header && angular.$$lowercase(headerName) === name) header = headerVal;
     });
     return header;
   };
@@ -2052,10 +2323,14 @@ function MockXhr() {
     return lines.join('\n');
   };
 
-  this.abort = angular.noop;
+  this.abort = function() {
+    if (isFunction(this.onabort)) {
+      this.onabort();
+    }
+  };
 
   // This section simulates the events on a real XHR object (and the upload object)
-  // When we are testing $httpBackend (inside the angular project) we make partial use of this
+  // When we are testing $httpBackend (inside the AngularJS project) we make partial use of this
   // but store the events directly ourselves on `$$events`, instead of going through the `addEventListener`
   this.$$events = {};
   this.addEventListener = function(name, listener) {
@@ -2084,39 +2359,86 @@ angular.mock.$TimeoutDecorator = ['$delegate', '$browser', function($delegate, $
   /**
    * @ngdoc method
    * @name $timeout#flush
+   *
+   * @deprecated
+   * sinceVersion="1.7.3"
+   *
+   * This method flushes all types of tasks (not only timeouts), which is unintuitive.
+   * It is recommended to use {@link ngMock.$flushPendingTasks} instead.
+   *
    * @description
    *
    * Flushes the queue of pending tasks.
    *
+   * _This method is essentially an alias of {@link ngMock.$flushPendingTasks}._
+   *
+   * <div class="alert alert-warning">
+   *   For historical reasons, this method will also flush non-`$timeout` pending tasks, such as
+   *   {@link $q} promises and tasks scheduled via
+   *   {@link ng.$rootScope.Scope#$applyAsync $applyAsync} and
+   *   {@link ng.$rootScope.Scope#$evalAsync $evalAsync}.
+   * </div>
+   *
    * @param {number=} delay maximum timeout amount to flush up until
    */
   $delegate.flush = function(delay) {
+    // For historical reasons, `$timeout.flush()` flushes all types of pending tasks.
+    // Keep the same behavior for backwards compatibility (and because it doesn't make sense to
+    // selectively flush scheduled events out of order).
     $browser.defer.flush(delay);
   };
 
   /**
    * @ngdoc method
    * @name $timeout#verifyNoPendingTasks
+   *
+   * @deprecated
+   * sinceVersion="1.7.3"
+   *
+   * This method takes all types of tasks (not only timeouts) into account, which is unintuitive.
+   * It is recommended to use {@link ngMock.$verifyNoPendingTasks} instead, which additionally
+   * allows checking for timeouts only (with `$verifyNoPendingTasks('$timeout')`).
+   *
    * @description
    *
-   * Verifies that there are no pending tasks that need to be flushed.
+   * Verifies that there are no pending tasks that need to be flushed. It throws an error if there
+   * are still pending tasks.
+   *
+   * _This method is essentially an alias of {@link ngMock.$verifyNoPendingTasks} (called with no
+   * arguments)._
+   *
+   * <div class="alert alert-warning">
+   *   <p>
+   *     For historical reasons, this method will also verify non-`$timeout` pending tasks, such as
+   *     pending {@link $http} requests, in-progress {@link $route} transitions, unresolved
+   *     {@link $q} promises and tasks scheduled via
+   *     {@link ng.$rootScope.Scope#$applyAsync $applyAsync} and
+   *     {@link ng.$rootScope.Scope#$evalAsync $evalAsync}.
+   *   </p>
+   *   <p>
+   *     It is recommended to use {@link ngMock.$verifyNoPendingTasks} instead, which additionally
+   *     supports verifying a specific type of tasks. For example, you can verify there are no
+   *     pending timeouts with `$verifyNoPendingTasks('$timeout')`.
+   *   </p>
+   * </div>
    */
   $delegate.verifyNoPendingTasks = function() {
-    if ($browser.deferredFns.length) {
-      throw new Error('Deferred tasks to flush (' + $browser.deferredFns.length + '): ' +
-          formatPendingTasksAsString($browser.deferredFns));
+    // For historical reasons, `$timeout.verifyNoPendingTasks()` takes all types of pending tasks
+    // into account. Keep the same behavior for backwards compatibility.
+    var pendingTasks = $browser.defer.getPendingTasks();
+
+    if (pendingTasks.length) {
+      var formattedTasks = $browser.defer.formatPendingTasks(pendingTasks).join('\n  ');
+      var hasPendingTimeout = pendingTasks.some(function(task) { return task.type === '$timeout'; });
+      var extraMessage = hasPendingTimeout ? '' : '\n\nNone of the pending tasks are timeouts. ' +
+          'If you only want to verify pending timeouts, use ' +
+          '`$verifyNoPendingTasks(\'$timeout\')` instead.';
+
+      throw new Error('Deferred tasks to flush (' + pendingTasks.length + '):\n  ' +
+          formattedTasks + extraMessage);
     }
   };
 
-  function formatPendingTasksAsString(tasks) {
-    var result = [];
-    angular.forEach(tasks, function(task) {
-      result.push('{id: ' + task.id + ', time: ' + task.time + '}');
-    });
-
-    return result.join(', ');
-  }
-
   return $delegate;
 }];
 
@@ -2166,11 +2488,6 @@ angular.mock.$RootElementProvider = function() {
  * A decorator for {@link ng.$controller} with additional `bindings` parameter, useful when testing
  * controllers of directives that use {@link $compile#-bindtocontroller- `bindToController`}.
  *
- * Depending on the value of
- * {@link ng.$compileProvider#preAssignBindingsEnabled `preAssignBindingsEnabled()`}, the properties
- * will be bound before or after invoking the constructor.
- *
- *
  * ## Example
  *
  * ```js
@@ -2216,8 +2533,6 @@ angular.mock.$RootElementProvider = function() {
  *
  *    * check if a controller with given name is registered via `$controllerProvider`
  *    * check if evaluating the string on the current scope returns a constructor
- *    * if $controllerProvider#allowGlobals, check `window[constructor]` on the global
- *      `window` object (not recommended)
  *
  *    The string can use the `controller as property` syntax, where the controller instance is published
  *    as the specified property on the `scope`; the `scope` must be injected into `locals` param for this
@@ -2228,22 +2543,13 @@ angular.mock.$RootElementProvider = function() {
  *                           the `bindToController` feature and simplify certain kinds of tests.
  * @return {Object} Instance of given controller.
  */
-function createControllerDecorator(compileProvider) {
+function createControllerDecorator() {
   angular.mock.$ControllerDecorator = ['$delegate', function($delegate) {
     return function(expression, locals, later, ident) {
       if (later && typeof later === 'object') {
-        var preAssignBindingsEnabled = compileProvider.preAssignBindingsEnabled();
-
         var instantiate = $delegate(expression, locals, true, ident);
-        if (preAssignBindingsEnabled) {
-          angular.extend(instantiate.instance, later);
-        }
-
         var instance = instantiate();
-        if (!preAssignBindingsEnabled || instance !== instantiate.instance) {
-          angular.extend(instance, later);
-        }
-
+        angular.extend(instance, later);
         return instance;
       }
       return $delegate(expression, locals, later, ident);
@@ -2314,15 +2620,10 @@ angular.mock.$ComponentControllerProvider = ['$compileProvider',
  * @packageName angular-mocks
  * @description
  *
- * # ngMock
- *
- * The `ngMock` module provides support to inject and mock Angular services into unit tests.
- * In addition, ngMock also extends various core ng services such that they can be
+ * The `ngMock` module provides support to inject and mock AngularJS services into unit tests.
+ * In addition, ngMock also extends various core AngularJS services such that they can be
  * inspected and controlled in a synchronous manner within test code.
  *
- *
- * <div doc-module-components="ngMock"></div>
- *
  * @installation
  *
  *  First, download the file:
@@ -2358,15 +2659,17 @@ angular.module('ngMock', ['ng']).provider({
   $exceptionHandler: angular.mock.$ExceptionHandlerProvider,
   $log: angular.mock.$LogProvider,
   $interval: angular.mock.$IntervalProvider,
-  $httpBackend: angular.mock.$HttpBackendProvider,
   $rootElement: angular.mock.$RootElementProvider,
-  $componentController: angular.mock.$ComponentControllerProvider
+  $componentController: angular.mock.$ComponentControllerProvider,
+  $flushPendingTasks: angular.mock.$FlushPendingTasksProvider,
+  $verifyNoPendingTasks: angular.mock.$VerifyNoPendingTasksProvider
 }).config(['$provide', '$compileProvider', function($provide, $compileProvider) {
   $provide.decorator('$timeout', angular.mock.$TimeoutDecorator);
   $provide.decorator('$$rAF', angular.mock.$RAFDecorator);
   $provide.decorator('$rootScope', angular.mock.$RootScopeDecorator);
   $provide.decorator('$controller', createControllerDecorator($compileProvider));
-}]);
+  $provide.decorator('$httpBackend', angular.mock.$httpBackendDecorator);
+}]).info({ angularVersion: '1.8.0' });
 
 /**
  * @ngdoc module
@@ -2375,14 +2678,13 @@ angular.module('ngMock', ['ng']).provider({
  * @packageName angular-mocks
  * @description
  *
- * The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing.
+ * The `ngMockE2E` is an AngularJS module which contains mocks suitable for end-to-end testing.
  * Currently there is only one mock present in this module -
  * the {@link ngMockE2E.$httpBackend e2e $httpBackend} mock.
  */
 angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
-  $provide.value('$httpBackend', angular.injector(['ng']).get('$httpBackend'));
   $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
-}]);
+}]).info({ angularVersion: '1.8.0' });
 
 /**
  * @ngdoc service
@@ -2429,14 +2731,14 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  *       phones.push(phone);
  *       return [200, phone, {}];
  *     });
- *     $httpBackend.whenGET(/^\/templates\//).passThrough(); // Requests for templare are handled by the real server
+ *     $httpBackend.whenGET(/^\/templates\//).passThrough(); // Requests for templates are handled by the real server
  *     //...
  *   });
  * ```
  *
  * Afterwards, bootstrap your app with this new module.
  *
- * ## Example
+ * @example
  * <example name="httpbackend-e2e-testing" module="myAppE2E" deps="angular-mocks.js">
  * <file name="app.js">
  *   var myApp = angular.module('myApp', []);
@@ -2507,7 +2809,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  * Creates a new backend definition.
  *
  * @param {string} method HTTP method.
- * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+ * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
  *   and returns true if the url matches the current definition.
  * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
  *   data string and returns true if the data is as expected.
@@ -2540,7 +2842,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  * @description
  * Creates a new backend definition for GET requests. For more info see `when()`.
  *
- * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+ * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
  *   and returns true if the url matches the current definition.
  * @param {(Object|function(Object))=} headers HTTP headers.
  * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
@@ -2557,7 +2859,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  * @description
  * Creates a new backend definition for HEAD requests. For more info see `when()`.
  *
- * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+ * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
  *   and returns true if the url matches the current definition.
  * @param {(Object|function(Object))=} headers HTTP headers.
  * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
@@ -2574,7 +2876,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  * @description
  * Creates a new backend definition for DELETE requests. For more info see `when()`.
  *
- * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+ * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
  *   and returns true if the url matches the current definition.
  * @param {(Object|function(Object))=} headers HTTP headers.
  * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
@@ -2591,7 +2893,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  * @description
  * Creates a new backend definition for POST requests. For more info see `when()`.
  *
- * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+ * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
  *   and returns true if the url matches the current definition.
  * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
  *   data string and returns true if the data is as expected.
@@ -2610,7 +2912,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  * @description
  * Creates a new backend definition for PUT requests.  For more info see `when()`.
  *
- * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+ * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
  *   and returns true if the url matches the current definition.
  * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
  *   data string and returns true if the data is as expected.
@@ -2629,7 +2931,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  * @description
  * Creates a new backend definition for PATCH requests.  For more info see `when()`.
  *
- * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+ * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
  *   and returns true if the url matches the current definition.
  * @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
  *   data string and returns true if the data is as expected.
@@ -2648,7 +2950,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  * @description
  * Creates a new backend definition for JSONP requests. For more info see `when()`.
  *
- * @param {string|RegExp|function(string)} url HTTP url or function that receives a url
+ * @param {string|RegExp|function(string)=} url HTTP url or function that receives a url
  *   and returns true if the url matches the current definition.
  * @param {(Array)=} keys Array of keys to assign to regex matches in request url described on
  *   {@link ngMock.$httpBackend $httpBackend mock}.
@@ -2669,6 +2971,39 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
  *   control how a matched request is handled. You can save this object for later use and invoke
  *   `respond` or `passThrough` again in order to change how a matched request is handled.
  */
+/**
+ * @ngdoc method
+ * @name  $httpBackend#matchLatestDefinitionEnabled
+ * @module ngMockE2E
+ * @description
+ * This method can be used to change which mocked responses `$httpBackend` returns, when defining
+ * them with {@link ngMock.$httpBackend#when $httpBackend.when()} (and shortcut methods).
+ * By default, `$httpBackend` returns the first definition that matches. When setting
+ * `$http.matchLatestDefinitionEnabled(true)`, it will use the last response that matches, i.e. the
+ * one that was added last.
+ *
+ * ```js
+ * hb.when('GET', '/url1').respond(200, 'content', {});
+ * hb.when('GET', '/url1').respond(201, 'another', {});
+ * hb('GET', '/url1'); // receives "content"
+ *
+ * $http.matchLatestDefinitionEnabled(true)
+ * hb('GET', '/url1'); // receives "another"
+ *
+ * hb.when('GET', '/url1').respond(201, 'onemore', {});
+ * hb('GET', '/url1'); // receives "onemore"
+ * ```
+ *
+ * This is useful if a you have a default response that is overriden inside specific tests.
+ *
+ * Note that different from config methods on providers, `matchLatestDefinitionEnabled()` can be changed
+ * even when the application is already running.
+ *
+ * @param  {Boolean=} value value to set, either `true` or `false`. Default is `false`.
+ *                          If omitted, it will return the current value.
+ * @return {$httpBackend|Boolean} self when used as a setter, and the current value when used
+ *                                as a getter
+ */
 angular.mock.e2e = {};
 angular.mock.e2e.$httpBackendDecorator =
   ['$rootScope', '$timeout', '$delegate', '$browser', createHttpBackendMock];
@@ -2946,12 +3281,6 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
       delete fn.$inject;
     });
 
-    angular.forEach(currentSpec.$modules, function(module) {
-      if (module && module.$$hashKey) {
-        module.$$hashKey = undefined;
-      }
-    });
-
     currentSpec.$injector = null;
     currentSpec.$modules = null;
     currentSpec.$providerInjector = null;
@@ -3166,5 +3495,263 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
   }
 })(window.jasmine || window.mocha);
 
+'use strict';
+
+(function() {
+  /**
+   * @ngdoc function
+   * @name browserTrigger
+   * @description
+   *
+   * This is a global (window) function that is only available when the {@link ngMock} module is
+   * included.
+   *
+   * It can be used to trigger a native browser event on an element, which is useful for unit testing.
+   *
+   *
+   * @param {Object} element Either a wrapped jQuery/jqLite node or a DOMElement
+   * @param {string=} eventType Optional event type. If none is specified, the function tries
+   *                            to determine the right event type for the element, e.g. `change` for
+   *                            `input[text]`.
+   * @param {Object=} eventData An optional object which contains additional event data that is used
+   *                            when creating the event:
+   *
+   *  - `bubbles`: [Event.bubbles](https://developer.mozilla.org/docs/Web/API/Event/bubbles).
+   *    Not applicable to all events.
+   *
+   *  - `cancelable`: [Event.cancelable](https://developer.mozilla.org/docs/Web/API/Event/cancelable).
+   *    Not applicable to all events.
+   *
+   *  - `charcode`: [charCode](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/charcode)
+   *    for keyboard events (keydown, keypress, and keyup).
+   *
+   *  - `data`: [data](https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent/data) for
+   *    [CompositionEvents](https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent).
+   *
+   *  - `elapsedTime`: the elapsedTime for
+   *    [TransitionEvent](https://developer.mozilla.org/docs/Web/API/TransitionEvent)
+   *    and [AnimationEvent](https://developer.mozilla.org/docs/Web/API/AnimationEvent).
+   *
+   *  - `keycode`: [keyCode](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/keycode)
+   *    for keyboard events (keydown, keypress, and keyup).
+   *
+   *  - `keys`: an array of possible modifier keys (ctrl, alt, shift, meta) for
+   *    [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent) and
+   *    keyboard events (keydown, keypress, and keyup).
+   *
+   *  - `relatedTarget`: the
+   *    [relatedTarget](https://developer.mozilla.org/docs/Web/API/MouseEvent/relatedTarget)
+   *    for [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent).
+   *
+   *  - `which`: [which](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/which)
+   *    for keyboard events (keydown, keypress, and keyup).
+   *
+   *  - `x`: x-coordinates for [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent)
+   *    and [TouchEvent](https://developer.mozilla.org/docs/Web/API/TouchEvent).
+   *
+   *  - `y`: y-coordinates for [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent)
+   *    and [TouchEvent](https://developer.mozilla.org/docs/Web/API/TouchEvent).
+   *
+   */
+  window.browserTrigger = function browserTrigger(element, eventType, eventData) {
+    if (element && !element.nodeName) element = element[0];
+    if (!element) return;
+
+    eventData = eventData || {};
+    var relatedTarget = eventData.relatedTarget || element;
+    var keys = eventData.keys;
+    var x = eventData.x;
+    var y = eventData.y;
+
+    var inputType = (element.type) ? element.type.toLowerCase() : null,
+        nodeName = element.nodeName.toLowerCase();
+    if (!eventType) {
+      eventType = {
+        'text':            'change',
+        'textarea':        'change',
+        'hidden':          'change',
+        'password':        'change',
+        'button':          'click',
+        'submit':          'click',
+        'reset':           'click',
+        'image':           'click',
+        'checkbox':        'click',
+        'radio':           'click',
+        'select-one':      'change',
+        'select-multiple': 'change',
+        '_default_':       'click'
+      }[inputType || '_default_'];
+    }
+
+    if (nodeName === 'option') {
+      element.parentNode.value = element.value;
+      element = element.parentNode;
+      eventType = 'change';
+    }
+
+    keys = keys || [];
+    function pressed(key) {
+      return keys.indexOf(key) !== -1;
+    }
+
+    var evnt;
+    if (/transitionend/.test(eventType)) {
+      if (window.WebKitTransitionEvent) {
+        evnt = new window.WebKitTransitionEvent(eventType, eventData);
+        evnt.initEvent(eventType, eventData.bubbles, true);
+      } else {
+        try {
+          evnt = new window.TransitionEvent(eventType, eventData);
+        } catch (e) {
+          evnt = window.document.createEvent('TransitionEvent');
+          evnt.initTransitionEvent(eventType, eventData.bubbles, null, null, eventData.elapsedTime || 0);
+        }
+      }
+    } else if (/animationend/.test(eventType)) {
+      if (window.WebKitAnimationEvent) {
+        evnt = new window.WebKitAnimationEvent(eventType, eventData);
+        evnt.initEvent(eventType, eventData.bubbles, true);
+      } else {
+        try {
+          evnt = new window.AnimationEvent(eventType, eventData);
+        } catch (e) {
+          evnt = window.document.createEvent('AnimationEvent');
+          evnt.initAnimationEvent(eventType, eventData.bubbles, null, null, eventData.elapsedTime || 0);
+        }
+      }
+    } else if (/touch/.test(eventType) && supportsTouchEvents()) {
+      evnt = createTouchEvent(element, eventType, x, y);
+    } else if (/key/.test(eventType)) {
+      evnt = window.document.createEvent('Events');
+      evnt.initEvent(eventType, eventData.bubbles, eventData.cancelable);
+      evnt.view = window;
+      evnt.ctrlKey = pressed('ctrl');
+      evnt.altKey = pressed('alt');
+      evnt.shiftKey = pressed('shift');
+      evnt.metaKey = pressed('meta');
+      evnt.keyCode = eventData.keyCode;
+      evnt.charCode = eventData.charCode;
+      evnt.which = eventData.which;
+    } else if (/composition/.test(eventType)) {
+      try {
+        evnt = new window.CompositionEvent(eventType, {
+          data: eventData.data
+        });
+      } catch (e) {
+        // Support: IE9+
+        evnt = window.document.createEvent('CompositionEvent', {});
+        evnt.initCompositionEvent(
+          eventType,
+          eventData.bubbles,
+          eventData.cancelable,
+          window,
+          eventData.data,
+          null
+        );
+      }
+
+    } else {
+      evnt = window.document.createEvent('MouseEvents');
+      x = x || 0;
+      y = y || 0;
+      evnt.initMouseEvent(eventType, true, true, window, 0, x, y, x, y, pressed('ctrl'),
+          pressed('alt'), pressed('shift'), pressed('meta'), 0, relatedTarget);
+    }
+
+    /* we're unable to change the timeStamp value directly so this
+     * is only here to allow for testing where the timeStamp value is
+     * read */
+    evnt.$manualTimeStamp = eventData.timeStamp;
+
+    if (!evnt) return;
+
+    if (!eventData.bubbles || supportsEventBubblingInDetachedTree() || isAttachedToDocument(element)) {
+      return element.dispatchEvent(evnt);
+    } else {
+      triggerForPath(element, evnt);
+    }
+  };
+
+  function supportsTouchEvents() {
+    if ('_cached' in supportsTouchEvents) {
+      return supportsTouchEvents._cached;
+    }
+    if (!window.document.createTouch || !window.document.createTouchList) {
+      supportsTouchEvents._cached = false;
+      return false;
+    }
+    try {
+      window.document.createEvent('TouchEvent');
+    } catch (e) {
+      supportsTouchEvents._cached = false;
+      return false;
+    }
+    supportsTouchEvents._cached = true;
+    return true;
+  }
+
+  function createTouchEvent(element, eventType, x, y) {
+    var evnt = new window.Event(eventType);
+    x = x || 0;
+    y = y || 0;
+
+    var touch = window.document.createTouch(window, element, Date.now(), x, y, x, y);
+    var touches = window.document.createTouchList(touch);
+
+    evnt.touches = touches;
+
+    return evnt;
+  }
+
+  function supportsEventBubblingInDetachedTree() {
+    if ('_cached' in supportsEventBubblingInDetachedTree) {
+      return supportsEventBubblingInDetachedTree._cached;
+    }
+    supportsEventBubblingInDetachedTree._cached = false;
+    var doc = window.document;
+    if (doc) {
+      var parent = doc.createElement('div'),
+          child = parent.cloneNode();
+      parent.appendChild(child);
+      parent.addEventListener('e', function() {
+        supportsEventBubblingInDetachedTree._cached = true;
+      });
+      var evnt = window.document.createEvent('Events');
+      evnt.initEvent('e', true, true);
+      child.dispatchEvent(evnt);
+    }
+    return supportsEventBubblingInDetachedTree._cached;
+  }
+
+  function triggerForPath(element, evnt) {
+    var stop = false;
+
+    var _stopPropagation = evnt.stopPropagation;
+    evnt.stopPropagation = function() {
+      stop = true;
+      _stopPropagation.apply(evnt, arguments);
+    };
+    patchEventTargetForBubbling(evnt, element);
+    do {
+      element.dispatchEvent(evnt);
+      // eslint-disable-next-line no-unmodified-loop-condition
+    } while (!stop && (element = element.parentNode));
+  }
+
+  function patchEventTargetForBubbling(event, target) {
+    event._target = target;
+    Object.defineProperty(event, 'target', {get: function() { return this._target;}});
+  }
+
+  function isAttachedToDocument(element) {
+    while ((element = element.parentNode)) {
+        if (element === window) {
+            return true;
+        }
+    }
+    return false;
+  }
+})();
+
 
 })(window, window.angular);
diff --git a/civicrm/bower_components/angular-mocks/bower.json b/civicrm/bower_components/angular-mocks/bower.json
index 9c1957264e9ff06f4b1ab4b4247b2f9595f02c99..b5af5d5f8824bb05451edc2b6dc1732a51502ffa 100644
--- a/civicrm/bower_components/angular-mocks/bower.json
+++ b/civicrm/bower_components/angular-mocks/bower.json
@@ -1,10 +1,10 @@
 {
   "name": "angular-mocks",
-  "version": "1.5.11",
+  "version": "1.8.0",
   "license": "MIT",
   "main": "./angular-mocks.js",
   "ignore": [],
   "dependencies": {
-    "angular": "1.5.11"
+    "angular": "1.8.0"
   }
 }
diff --git a/civicrm/bower_components/angular-mocks/package.json b/civicrm/bower_components/angular-mocks/package.json
index 7fb4f428e81e70232c17d3ab6891448785350f37..386715c1e0ce29bfb7ef29e1f5fc1cc8afc4c012 100644
--- a/civicrm/bower_components/angular-mocks/package.json
+++ b/civicrm/bower_components/angular-mocks/package.json
@@ -1,6 +1,6 @@
 {
   "name": "angular-mocks",
-  "version": "1.5.11",
+  "version": "1.8.0",
   "description": "AngularJS mocks for testing",
   "main": "angular-mocks.js",
   "scripts": {
diff --git a/civicrm/bower_components/angular-route/.composer-downloads/angular-route-e3ac2d15fca8a7bc6c303335035b7ec6.json b/civicrm/bower_components/angular-route/.composer-downloads/angular-route-e3ac2d15fca8a7bc6c303335035b7ec6.json
index f509791f83b2b20048a9f642ed1d1c1ee5297f8a..8e4dfe61e68fbf6c4ffbbcc81aca92b8df2da7c4 100644
--- a/civicrm/bower_components/angular-route/.composer-downloads/angular-route-e3ac2d15fca8a7bc6c303335035b7ec6.json
+++ b/civicrm/bower_components/angular-route/.composer-downloads/angular-route-e3ac2d15fca8a7bc6c303335035b7ec6.json
@@ -1,6 +1,6 @@
 {
     "name": "civicrm/civicrm-core:angular-route",
-    "url": "https://github.com/angular/bower-angular-route/archive/v1.5.11.zip",
-    "checksum": "b8e307b6a1a650f09b2c1856e7c39047f6a09c4ef22158f75e77f9874bf213c0",
+    "url": "https://github.com/angular/bower-angular-route/archive/v1.8.0.zip",
+    "checksum": "d984acd9c97144b3337bac3043cc430f3967dae477225ea057474b524575602a",
     "ignore": null
 }
\ No newline at end of file
diff --git a/civicrm/bower_components/angular-route/angular-route.js b/civicrm/bower_components/angular-route/angular-route.js
index 835d86337882c597c8a6ab23c3ff2be581fe84ae..09b82d355b4597f30cc4fe331a748e39b9913d89 100644
--- a/civicrm/bower_components/angular-route/angular-route.js
+++ b/civicrm/bower_components/angular-route/angular-route.js
@@ -1,6 +1,6 @@
 /**
- * @license AngularJS v1.5.11
- * (c) 2010-2017 Google, Inc. http://angularjs.org
+ * @license AngularJS v1.8.0
+ * (c) 2010-2020 Google, Inc. http://angularjs.org
  * License: MIT
  */
 (function(window, angular) {'use strict';
@@ -32,32 +32,84 @@ function shallowCopy(src, dst) {
   return dst || src;
 }
 
+/* global routeToRegExp: true */
+
+/**
+ * @param {string} path - The path to parse. (It is assumed to have query and hash stripped off.)
+ * @param {Object} opts - Options.
+ * @return {Object} - An object containing an array of path parameter names (`keys`) and a regular
+ *     expression (`regexp`) that can be used to identify a matching URL and extract the path
+ *     parameter values.
+ *
+ * @description
+ * Parses the given path, extracting path parameter names and a regular expression to match URLs.
+ *
+ * Originally inspired by `pathRexp` in `visionmedia/express/lib/utils.js`.
+ */
+function routeToRegExp(path, opts) {
+  var keys = [];
+
+  var pattern = path
+    .replace(/([().])/g, '\\$1')
+    .replace(/(\/)?:(\w+)(\*\?|[?*])?/g, function(_, slash, key, option) {
+      var optional = option === '?' || option === '*?';
+      var star = option === '*' || option === '*?';
+      keys.push({name: key, optional: optional});
+      slash = slash || '';
+      return (
+        (optional ? '(?:' + slash : slash + '(?:') +
+        (star ? '(.+?)' : '([^/]+)') +
+        (optional ? '?)?' : ')')
+      );
+    })
+    .replace(/([/$*])/g, '\\$1');
+
+  if (opts.ignoreTrailingSlashes) {
+    pattern = pattern.replace(/\/+$/, '') + '/*';
+  }
+
+  return {
+    keys: keys,
+    regexp: new RegExp(
+      '^' + pattern + '(?:[?#]|$)',
+      opts.caseInsensitiveMatch ? 'i' : ''
+    )
+  };
+}
+
+/* global routeToRegExp: false */
 /* global shallowCopy: false */
 
-// There are necessary for `shallowCopy()` (included via `src/shallowCopy.js`).
+// `isArray` and `isObject` are necessary for `shallowCopy()` (included via `src/shallowCopy.js`).
 // They are initialized inside the `$RouteProvider`, to ensure `window.angular` is available.
 var isArray;
 var isObject;
+var isDefined;
+var noop;
 
 /**
  * @ngdoc module
  * @name ngRoute
  * @description
  *
- * # ngRoute
- *
- * The `ngRoute` module provides routing and deeplinking services and directives for angular apps.
+ * The `ngRoute` module provides routing and deeplinking services and directives for AngularJS apps.
  *
  * ## Example
- * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
+ * See {@link ngRoute.$route#examples $route} for an example of configuring and using `ngRoute`.
  *
- *
- * <div doc-module-components="ngRoute"></div>
  */
- /* global -ngRouteModule */
-var ngRouteModule = angular.module('ngRoute', ['ng']).
-                        provider('$route', $RouteProvider),
-    $routeMinErr = angular.$$minErr('ngRoute');
+/* global -ngRouteModule */
+var ngRouteModule = angular.
+  module('ngRoute', []).
+  info({ angularVersion: '1.8.0' }).
+  provider('$route', $RouteProvider).
+  // Ensure `$route` will be instantiated in time to capture the initial `$locationChangeSuccess`
+  // event (unless explicitly disabled). This is necessary in case `ngView` is included in an
+  // asynchronously loaded template.
+  run(instantiateRoute);
+var $routeMinErr = angular.$$minErr('ngRoute');
+var isEagerInstantiationEnabled;
+
 
 /**
  * @ngdoc provider
@@ -69,7 +121,7 @@ var ngRouteModule = angular.module('ngRoute', ['ng']).
  * Used for configuring routes.
  *
  * ## Example
- * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
+ * See {@link ngRoute.$route#examples $route} for an example of configuring and using `ngRoute`.
  *
  * ## Dependencies
  * Requires the {@link ngRoute `ngRoute`} module to be installed.
@@ -77,6 +129,8 @@ var ngRouteModule = angular.module('ngRoute', ['ng']).
 function $RouteProvider() {
   isArray = angular.isArray;
   isObject = angular.isObject;
+  isDefined = angular.isDefined;
+  noop = angular.noop;
 
   function inherit(parent, extra) {
     return angular.extend(Object.create(parent), extra);
@@ -113,12 +167,12 @@ function $RouteProvider() {
    *
    *    Object properties:
    *
-   *    - `controller` – `{(string|function()=}` – Controller fn that should be associated with
+   *    - `controller` – `{(string|Function)=}` – Controller fn that should be associated with
    *      newly created scope or the name of a {@link angular.Module#controller registered
    *      controller} if passed as a string.
    *    - `controllerAs` – `{string=}` – An identifier name for a reference to the controller.
    *      If present, the controller will be published to scope under the `controllerAs` name.
-   *    - `template` – `{string=|function()=}` – html template as a string or a function that
+   *    - `template` – `{(string|Function)=}` – html template as a string or a function that
    *      returns an html template as a string which should be used by {@link
    *      ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.
    *      This property takes precedence over `templateUrl`.
@@ -128,7 +182,9 @@ function $RouteProvider() {
    *      - `{Array.<Object>}` - route parameters extracted from the current
    *        `$location.path()` by applying the current route
    *
-   *    - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html
+   *      One of `template` or `templateUrl` is required.
+   *
+   *    - `templateUrl` – `{(string|Function)=}` – path or function that returns a path to an html
    *      template that should be used by {@link ngRoute.directive:ngView ngView}.
    *
    *      If `templateUrl` is a function, it will be called with the following parameters:
@@ -136,7 +192,9 @@ function $RouteProvider() {
    *      - `{Array.<Object>}` - route parameters extracted from the current
    *        `$location.path()` by applying the current route
    *
-   *    - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should
+   *      One of `templateUrl` or `template` is required.
+   *
+   *    - `resolve` - `{Object.<string, Function>=}` - An optional map of dependencies which should
    *      be injected into the controller. If any of these dependencies are promises, the router
    *      will wait for them all to be resolved or one to be rejected before the controller is
    *      instantiated.
@@ -156,7 +214,7 @@ function $RouteProvider() {
    *      The map object is:
    *
    *      - `key` – `{string}`: a name of a dependency to be injected into the controller.
-   *      - `factory` - `{string|function}`: If `string` then it is an alias for a service.
+   *      - `factory` - `{string|Function}`: If `string` then it is an alias for a service.
    *        Otherwise if function, then it is {@link auto.$injector#invoke injected}
    *        and the return value is treated as the dependency. If the result is a promise, it is
    *        resolved before its value is injected into the controller. Be aware that
@@ -166,7 +224,7 @@ function $RouteProvider() {
    *    - `resolveAs` - `{string=}` - The name under which the `resolve` map will be available on
    *      the scope of the route. If omitted, defaults to `$resolve`.
    *
-   *    - `redirectTo` – `{(string|function())=}` – value to update
+   *    - `redirectTo` – `{(string|Function)=}` – value to update
    *      {@link ng.$location $location} path with and trigger route redirection.
    *
    *      If `redirectTo` is a function, it will be called with the following parameters:
@@ -177,13 +235,48 @@ function $RouteProvider() {
    *      - `{Object}` - current `$location.search()`
    *
    *      The custom `redirectTo` function is expected to return a string which will be used
-   *      to update `$location.path()` and `$location.search()`.
+   *      to update `$location.url()`. If the function throws an error, no further processing will
+   *      take place and the {@link ngRoute.$route#$routeChangeError $routeChangeError} event will
+   *      be fired.
+   *
+   *      Routes that specify `redirectTo` will not have their controllers, template functions
+   *      or resolves called, the `$location` will be changed to the redirect url and route
+   *      processing will stop. The exception to this is if the `redirectTo` is a function that
+   *      returns `undefined`. In this case the route transition occurs as though there was no
+   *      redirection.
+   *
+   *    - `resolveRedirectTo` – `{Function=}` – a function that will (eventually) return the value
+   *      to update {@link ng.$location $location} URL with and trigger route redirection. In
+   *      contrast to `redirectTo`, dependencies can be injected into `resolveRedirectTo` and the
+   *      return value can be either a string or a promise that will be resolved to a string.
+   *
+   *      Similar to `redirectTo`, if the return value is `undefined` (or a promise that gets
+   *      resolved to `undefined`), no redirection takes place and the route transition occurs as
+   *      though there was no redirection.
+   *
+   *      If the function throws an error or the returned promise gets rejected, no further
+   *      processing will take place and the
+   *      {@link ngRoute.$route#$routeChangeError $routeChangeError} event will be fired.
+   *
+   *      `redirectTo` takes precedence over `resolveRedirectTo`, so specifying both on the same
+   *      route definition, will cause the latter to be ignored.
+   *
+   *    - `[reloadOnUrl=true]` - `{boolean=}` - reload route when any part of the URL changes
+   *      (including the path) even if the new URL maps to the same route.
+   *
+   *      If the option is set to `false` and the URL in the browser changes, but the new URL maps
+   *      to the same route, then a `$routeUpdate` event is broadcasted on the root scope (without
+   *      reloading the route).
    *
    *    - `[reloadOnSearch=true]` - `{boolean=}` - reload route when only `$location.search()`
    *      or `$location.hash()` changes.
    *
-   *      If the option is set to `false` and url in the browser changes, then
-   *      `$routeUpdate` event is broadcasted on the root scope.
+   *      If the option is set to `false` and the URL in the browser changes, then a `$routeUpdate`
+   *      event is broadcasted on the root scope (without reloading the route).
+   *
+   *      <div class="alert alert-warning">
+   *        **Note:** This option has no effect if `reloadOnUrl` is set to `false`.
+   *      </div>
    *
    *    - `[caseInsensitiveMatch=false]` - `{boolean=}` - match routes without being case sensitive
    *
@@ -198,6 +291,9 @@ function $RouteProvider() {
   this.when = function(path, route) {
     //copy original route object to preserve params inherited from proto chain
     var routeCopy = shallowCopy(route);
+    if (angular.isUndefined(routeCopy.reloadOnUrl)) {
+      routeCopy.reloadOnUrl = true;
+    }
     if (angular.isUndefined(routeCopy.reloadOnSearch)) {
       routeCopy.reloadOnSearch = true;
     }
@@ -206,7 +302,8 @@ function $RouteProvider() {
     }
     routes[path] = angular.extend(
       routeCopy,
-      path && pathRegExp(path, routeCopy)
+      {originalPath: path},
+      path && routeToRegExp(path, routeCopy)
     );
 
     // create redirection for trailing slashes
@@ -216,8 +313,8 @@ function $RouteProvider() {
             : path + '/';
 
       routes[redirectPath] = angular.extend(
-        {redirectTo: path},
-        pathRegExp(redirectPath, routeCopy)
+        {originalPath: path, redirectTo: path},
+        routeToRegExp(redirectPath, routeCopy)
       );
     }
 
@@ -235,47 +332,6 @@ function $RouteProvider() {
    */
   this.caseInsensitiveMatch = false;
 
-   /**
-    * @param path {string} path
-    * @param opts {Object} options
-    * @return {?Object}
-    *
-    * @description
-    * Normalizes the given path, returning a regular expression
-    * and the original path.
-    *
-    * Inspired by pathRexp in visionmedia/express/lib/utils.js.
-    */
-  function pathRegExp(path, opts) {
-    var insensitive = opts.caseInsensitiveMatch,
-        ret = {
-          originalPath: path,
-          regexp: path
-        },
-        keys = ret.keys = [];
-
-    path = path
-      .replace(/([().])/g, '\\$1')
-      .replace(/(\/)?:(\w+)(\*\?|[?*])?/g, function(_, slash, key, option) {
-        var optional = (option === '?' || option === '*?') ? '?' : null;
-        var star = (option === '*' || option === '*?') ? '*' : null;
-        keys.push({ name: key, optional: !!optional });
-        slash = slash || '';
-        return ''
-          + (optional ? '' : slash)
-          + '(?:'
-          + (optional ? slash : '')
-          + (star && '(.+?)' || '([^/]+)')
-          + (optional || '')
-          + ')'
-          + (optional || '');
-      })
-      .replace(/([/$*])/g, '\\$1');
-
-    ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');
-    return ret;
-  }
-
   /**
    * @ngdoc method
    * @name $routeProvider#otherwise
@@ -296,6 +352,47 @@ function $RouteProvider() {
     return this;
   };
 
+  /**
+   * @ngdoc method
+   * @name $routeProvider#eagerInstantiationEnabled
+   * @kind function
+   *
+   * @description
+   * Call this method as a setter to enable/disable eager instantiation of the
+   * {@link ngRoute.$route $route} service upon application bootstrap. You can also call it as a
+   * getter (i.e. without any arguments) to get the current value of the
+   * `eagerInstantiationEnabled` flag.
+   *
+   * Instantiating `$route` early is necessary for capturing the initial
+   * {@link ng.$location#$locationChangeStart $locationChangeStart} event and navigating to the
+   * appropriate route. Usually, `$route` is instantiated in time by the
+   * {@link ngRoute.ngView ngView} directive. Yet, in cases where `ngView` is included in an
+   * asynchronously loaded template (e.g. in another directive's template), the directive factory
+   * might not be called soon enough for `$route` to be instantiated _before_ the initial
+   * `$locationChangeSuccess` event is fired. Eager instantiation ensures that `$route` is always
+   * instantiated in time, regardless of when `ngView` will be loaded.
+   *
+   * The default value is true.
+   *
+   * **Note**:<br />
+   * You may want to disable the default behavior when unit-testing modules that depend on
+   * `ngRoute`, in order to avoid an unexpected request for the default route's template.
+   *
+   * @param {boolean=} enabled - If provided, update the internal `eagerInstantiationEnabled` flag.
+   *
+   * @returns {*} The current value of the `eagerInstantiationEnabled` flag if used as a getter or
+   *     itself (for chaining) if used as a setter.
+   */
+  isEagerInstantiationEnabled = true;
+  this.eagerInstantiationEnabled = function eagerInstantiationEnabled(enabled) {
+    if (isDefined(enabled)) {
+      isEagerInstantiationEnabled = enabled;
+      return this;
+    }
+
+    return isEagerInstantiationEnabled;
+  };
+
 
   this.$get = ['$rootScope',
                '$location',
@@ -304,7 +401,8 @@ function $RouteProvider() {
                '$injector',
                '$templateRequest',
                '$sce',
-      function($rootScope, $location, $routeParams, $q, $injector, $templateRequest, $sce) {
+               '$browser',
+      function($rootScope, $location, $routeParams, $q, $injector, $templateRequest, $sce, $browser) {
 
     /**
      * @ngdoc service
@@ -483,12 +581,14 @@ function $RouteProvider() {
      * @name $route#$routeChangeError
      * @eventType broadcast on root scope
      * @description
-     * Broadcasted if any of the resolve promises are rejected.
+     * Broadcasted if a redirection function fails or any redirection or resolve promises are
+     * rejected.
      *
      * @param {Object} angularEvent Synthetic event object
      * @param {Route} current Current route information.
      * @param {Route} previous Previous route information.
-     * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.
+     * @param {Route} rejection The thrown error or the rejection reason of the promise. Usually
+     * the rejection reason is the error that caused the promise to get rejected.
      */
 
     /**
@@ -496,8 +596,9 @@ function $RouteProvider() {
      * @name $route#$routeUpdate
      * @eventType broadcast on root scope
      * @description
-     * The `reloadOnSearch` property has been set to false, and we are reusing the same
-     * instance of the Controller.
+     * Broadcasted if the same instance of a route (including template, controller instance,
+     * resolved dependencies, etc.) is being reused. This can happen if either `reloadOnSearch` or
+     * `reloadOnUrl` has been set to `false`.
      *
      * @param {Object} angularEvent Synthetic event object
      * @param {Route} current Current/previous route information.
@@ -557,7 +658,7 @@ function $RouteProvider() {
               // interpolate modifies newParams, only query params are left
               $location.search(newParams);
             } else {
-              throw $routeMinErr('norout', 'Tried updating route when with no current route');
+              throw $routeMinErr('norout', 'Tried updating route with no current route');
             }
           }
         };
@@ -605,9 +706,7 @@ function $RouteProvider() {
       var lastRoute = $route.current;
 
       preparedRoute = parseRoute();
-      preparedRouteIsUpdateOnly = preparedRoute && lastRoute && preparedRoute.$$route === lastRoute.$$route
-          && angular.equals(preparedRoute.pathParams, lastRoute.pathParams)
-          && !preparedRoute.reloadOnSearch && !forceReload;
+      preparedRouteIsUpdateOnly = isNavigationUpdateOnly(preparedRoute, lastRoute);
 
       if (!preparedRouteIsUpdateOnly && (lastRoute || preparedRoute)) {
         if ($rootScope.$broadcast('$routeChangeStart', preparedRoute, lastRoute).defaultPrevented) {
@@ -629,37 +728,112 @@ function $RouteProvider() {
       } else if (nextRoute || lastRoute) {
         forceReload = false;
         $route.current = nextRoute;
-        if (nextRoute) {
-          if (nextRoute.redirectTo) {
-            if (angular.isString(nextRoute.redirectTo)) {
-              $location.path(interpolate(nextRoute.redirectTo, nextRoute.params)).search(nextRoute.params)
-                       .replace();
-            } else {
-              $location.url(nextRoute.redirectTo(nextRoute.pathParams, $location.path(), $location.search()))
-                       .replace();
-            }
-          }
-        }
 
-        $q.when(nextRoute).
-          then(resolveLocals).
-          then(function(locals) {
-            // after route change
-            if (nextRoute === $route.current) {
-              if (nextRoute) {
-                nextRoute.locals = locals;
-                angular.copy(nextRoute.params, $routeParams);
-              }
-              $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute);
-            }
-          }, function(error) {
+        var nextRoutePromise = $q.resolve(nextRoute);
+
+        $browser.$$incOutstandingRequestCount('$route');
+
+        nextRoutePromise.
+          then(getRedirectionData).
+          then(handlePossibleRedirection).
+          then(function(keepProcessingRoute) {
+            return keepProcessingRoute && nextRoutePromise.
+              then(resolveLocals).
+              then(function(locals) {
+                // after route change
+                if (nextRoute === $route.current) {
+                  if (nextRoute) {
+                    nextRoute.locals = locals;
+                    angular.copy(nextRoute.params, $routeParams);
+                  }
+                  $rootScope.$broadcast('$routeChangeSuccess', nextRoute, lastRoute);
+                }
+              });
+          }).catch(function(error) {
             if (nextRoute === $route.current) {
               $rootScope.$broadcast('$routeChangeError', nextRoute, lastRoute, error);
             }
+          }).finally(function() {
+            // Because `commitRoute()` is called from a `$rootScope.$evalAsync` block (see
+            // `$locationWatch`), this `$$completeOutstandingRequest()` call will not cause
+            // `outstandingRequestCount` to hit zero.  This is important in case we are redirecting
+            // to a new route which also requires some asynchronous work.
+
+            $browser.$$completeOutstandingRequest(noop, '$route');
           });
       }
     }
 
+    function getRedirectionData(route) {
+      var data = {
+        route: route,
+        hasRedirection: false
+      };
+
+      if (route) {
+        if (route.redirectTo) {
+          if (angular.isString(route.redirectTo)) {
+            data.path = interpolate(route.redirectTo, route.params);
+            data.search = route.params;
+            data.hasRedirection = true;
+          } else {
+            var oldPath = $location.path();
+            var oldSearch = $location.search();
+            var newUrl = route.redirectTo(route.pathParams, oldPath, oldSearch);
+
+            if (angular.isDefined(newUrl)) {
+              data.url = newUrl;
+              data.hasRedirection = true;
+            }
+          }
+        } else if (route.resolveRedirectTo) {
+          return $q.
+            resolve($injector.invoke(route.resolveRedirectTo)).
+            then(function(newUrl) {
+              if (angular.isDefined(newUrl)) {
+                data.url = newUrl;
+                data.hasRedirection = true;
+              }
+
+              return data;
+            });
+        }
+      }
+
+      return data;
+    }
+
+    function handlePossibleRedirection(data) {
+      var keepProcessingRoute = true;
+
+      if (data.route !== $route.current) {
+        keepProcessingRoute = false;
+      } else if (data.hasRedirection) {
+        var oldUrl = $location.url();
+        var newUrl = data.url;
+
+        if (newUrl) {
+          $location.
+            url(newUrl).
+            replace();
+        } else {
+          newUrl = $location.
+            path(data.path).
+            search(data.search).
+            replace().
+            url();
+        }
+
+        if (newUrl !== oldUrl) {
+          // Exit out and don't process current next value,
+          // wait for next location change from redirect
+          keepProcessingRoute = false;
+        }
+      }
+
+      return keepProcessingRoute;
+    }
+
     function resolveLocals(route) {
       if (route) {
         var locals = angular.extend({}, route.resolve);
@@ -676,7 +850,6 @@ function $RouteProvider() {
       }
     }
 
-
     function getTemplateFor(route) {
       var template, templateUrl;
       if (angular.isDefined(template = route.template)) {
@@ -695,7 +868,6 @@ function $RouteProvider() {
       return template;
     }
 
-
     /**
      * @returns {Object} the current active route, by matching it against the URL
      */
@@ -714,6 +886,29 @@ function $RouteProvider() {
       return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});
     }
 
+    /**
+     * @param {Object} newRoute - The new route configuration (as returned by `parseRoute()`).
+     * @param {Object} oldRoute - The previous route configuration (as returned by `parseRoute()`).
+     * @returns {boolean} Whether this is an "update-only" navigation, i.e. the URL maps to the same
+     *                    route and it can be reused (based on the config and the type of change).
+     */
+    function isNavigationUpdateOnly(newRoute, oldRoute) {
+      // IF this is not a forced reload
+      return !forceReload
+          // AND both `newRoute`/`oldRoute` are defined
+          && newRoute && oldRoute
+          // AND they map to the same Route Definition Object
+          && (newRoute.$$route === oldRoute.$$route)
+          // AND `reloadOnUrl` is disabled
+          && (!newRoute.reloadOnUrl
+              // OR `reloadOnSearch` is disabled
+              || (!newRoute.reloadOnSearch
+                  // AND both routes have the same path params
+                  && angular.equals(newRoute.pathParams, oldRoute.pathParams)
+              )
+          );
+    }
+
     /**
      * @returns {string} interpolation of the redirect path with the parameters
      */
@@ -735,6 +930,14 @@ function $RouteProvider() {
   }];
 }
 
+instantiateRoute.$inject = ['$injector'];
+function instantiateRoute($injector) {
+  if (isEagerInstantiationEnabled) {
+    // Instantiate `$route`
+    $injector.get('$route');
+  }
+}
+
 ngRouteModule.provider('$routeParams', $RouteParamsProvider);
 
 
@@ -786,7 +989,6 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory);
  * @restrict ECA
  *
  * @description
- * # Overview
  * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by
  * including the rendered template of the current route into the main layout (`index.html`) file.
  * Every time the current route changes, the included view changes with it according to the
@@ -802,13 +1004,6 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory);
  *
  * The enter and leave animation occur concurrently.
  *
- * @knownIssue If `ngView` is contained in an asynchronously loaded template (e.g. in another
- *             directive's templateUrl or in a template loaded using `ngInclude`), then you need to
- *             make sure that `$route` is instantiated in time to capture the initial
- *             `$locationChangeStart` event and load the appropriate view. One way to achieve this
- *             is to have it as a dependency in a `.run` block:
- *             `myModule.run(['$route', function() {}]);`
- *
  * @scope
  * @priority 400
  * @param {string=} onload Expression to evaluate whenever the view updates.
diff --git a/civicrm/bower_components/angular-route/angular-route.min.js b/civicrm/bower_components/angular-route/angular-route.min.js
index 3d38b601f0688dcb8d14f86b81348663d7665f95..567eb157755207025aa2505e09674e9644c94998 100644
--- a/civicrm/bower_components/angular-route/angular-route.min.js
+++ b/civicrm/bower_components/angular-route/angular-route.min.js
@@ -1,16 +1,17 @@
 /*
- AngularJS v1.5.11
- (c) 2010-2017 Google, Inc. http://angularjs.org
+ AngularJS v1.8.0
+ (c) 2010-2020 Google, Inc. http://angularjs.org
  License: MIT
 */
-(function(E,d){'use strict';function y(t,l,g){return{restrict:"ECA",terminal:!0,priority:400,transclude:"element",link:function(b,e,a,c,k){function p(){m&&(g.cancel(m),m=null);h&&(h.$destroy(),h=null);n&&(m=g.leave(n),m.done(function(b){!1!==b&&(m=null)}),n=null)}function B(){var a=t.current&&t.current.locals;if(d.isDefined(a&&a.$template)){var a=b.$new(),c=t.current;n=k(a,function(a){g.enter(a,null,n||e).done(function(a){!1===a||!d.isDefined(A)||A&&!b.$eval(A)||l()});p()});h=c.scope=a;h.$emit("$viewContentLoaded");
-h.$eval(s)}else p()}var h,n,m,A=a.autoscroll,s=a.onload||"";b.$on("$routeChangeSuccess",B);B()}}}function w(d,l,g){return{restrict:"ECA",priority:-400,link:function(b,e){var a=g.current,c=a.locals;e.html(c.$template);var k=d(e.contents());if(a.controller){c.$scope=b;var p=l(a.controller,c);a.controllerAs&&(b[a.controllerAs]=p);e.data("$ngControllerController",p);e.children().data("$ngControllerController",p)}b[a.resolveAs||"$resolve"]=c;k(b)}}}var x,C,s=d.module("ngRoute",["ng"]).provider("$route",
-function(){function t(b,e){return d.extend(Object.create(b),e)}function l(b,d){var a=d.caseInsensitiveMatch,c={originalPath:b,regexp:b},g=c.keys=[];b=b.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)(\*\?|[?*])?/g,function(b,a,d,c){b="?"===c||"*?"===c?"?":null;c="*"===c||"*?"===c?"*":null;g.push({name:d,optional:!!b});a=a||"";return""+(b?"":a)+"(?:"+(b?a:"")+(c&&"(.+?)"||"([^/]+)")+(b||"")+")"+(b||"")}).replace(/([/$*])/g,"\\$1");c.regexp=new RegExp("^"+b+"$",a?"i":"");return c}x=d.isArray;C=d.isObject;
-var g={};this.when=function(b,e){var a;a=void 0;if(x(e)){a=a||[];for(var c=0,k=e.length;c<k;c++)a[c]=e[c]}else if(C(e))for(c in a=a||{},e)if("$"!==c.charAt(0)||"$"!==c.charAt(1))a[c]=e[c];a=a||e;d.isUndefined(a.reloadOnSearch)&&(a.reloadOnSearch=!0);d.isUndefined(a.caseInsensitiveMatch)&&(a.caseInsensitiveMatch=this.caseInsensitiveMatch);g[b]=d.extend(a,b&&l(b,a));b&&(c="/"===b[b.length-1]?b.substr(0,b.length-1):b+"/",g[c]=d.extend({redirectTo:b},l(c,a)));return this};this.caseInsensitiveMatch=!1;
-this.otherwise=function(b){"string"===typeof b&&(b={redirectTo:b});this.when(null,b);return this};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce",function(b,e,a,c,k,p,l){function h(a){var f=v.current;(x=(r=y())&&f&&r.$$route===f.$$route&&d.equals(r.pathParams,f.pathParams)&&!r.reloadOnSearch&&!z)||!f&&!r||b.$broadcast("$routeChangeStart",r,f).defaultPrevented&&a&&a.preventDefault()}function n(){var u=v.current,f=r;if(x)u.params=f.params,d.copy(u.params,
-a),b.$broadcast("$routeUpdate",u);else if(f||u)z=!1,(v.current=f)&&f.redirectTo&&(d.isString(f.redirectTo)?e.path(w(f.redirectTo,f.params)).search(f.params).replace():e.url(f.redirectTo(f.pathParams,e.path(),e.search())).replace()),c.when(f).then(m).then(function(c){f===v.current&&(f&&(f.locals=c,d.copy(f.params,a)),b.$broadcast("$routeChangeSuccess",f,u))},function(a){f===v.current&&b.$broadcast("$routeChangeError",f,u,a)})}function m(a){if(a){var b=d.extend({},a.resolve);d.forEach(b,function(a,
-c){b[c]=d.isString(a)?k.get(a):k.invoke(a,null,null,c)});a=s(a);d.isDefined(a)&&(b.$template=a);return c.all(b)}}function s(a){var b,c;d.isDefined(b=a.template)?d.isFunction(b)&&(b=b(a.params)):d.isDefined(c=a.templateUrl)&&(d.isFunction(c)&&(c=c(a.params)),d.isDefined(c)&&(a.loadedTemplateUrl=l.valueOf(c),b=p(c)));return b}function y(){var a,b;d.forEach(g,function(c,g){var q;if(q=!b){var h=e.path();q=c.keys;var l={};if(c.regexp)if(h=c.regexp.exec(h)){for(var k=1,p=h.length;k<p;++k){var m=q[k-1],
-n=h[k];m&&n&&(l[m.name]=n)}q=l}else q=null;else q=null;q=a=q}q&&(b=t(c,{params:d.extend({},e.search(),a),pathParams:a}),b.$$route=c)});return b||g[null]&&t(g[null],{params:{},pathParams:{}})}function w(a,b){var c=[];d.forEach((a||"").split(":"),function(a,d){if(0===d)c.push(a);else{var e=a.match(/(\w+)(?:[?*])?(.*)/),g=e[1];c.push(b[g]);c.push(e[2]||"");delete b[g]}});return c.join("")}var z=!1,r,x,v={routes:g,reload:function(){z=!0;var a={defaultPrevented:!1,preventDefault:function(){this.defaultPrevented=
-!0;z=!1}};b.$evalAsync(function(){h(a);a.defaultPrevented||n()})},updateParams:function(a){if(this.current&&this.current.$$route)a=d.extend({},this.current.params,a),e.path(w(this.current.$$route.originalPath,a)),e.search(a);else throw D("norout");}};b.$on("$locationChangeStart",h);b.$on("$locationChangeSuccess",n);return v}]}),D=d.$$minErr("ngRoute");s.provider("$routeParams",function(){this.$get=function(){return{}}});s.directive("ngView",y);s.directive("ngView",w);y.$inject=["$route","$anchorScroll",
-"$animate"];w.$inject=["$compile","$controller","$route"]})(window,window.angular);
+(function(I,b){'use strict';function z(b,h){var d=[],c=b.replace(/([().])/g,"\\$1").replace(/(\/)?:(\w+)(\*\?|[?*])?/g,function(b,c,h,k){b="?"===k||"*?"===k;k="*"===k||"*?"===k;d.push({name:h,optional:b});c=c||"";return(b?"(?:"+c:c+"(?:")+(k?"(.+?)":"([^/]+)")+(b?"?)?":")")}).replace(/([/$*])/g,"\\$1");h.ignoreTrailingSlashes&&(c=c.replace(/\/+$/,"")+"/*");return{keys:d,regexp:new RegExp("^"+c+"(?:[?#]|$)",h.caseInsensitiveMatch?"i":"")}}function A(b){p&&b.get("$route")}function v(u,h,d){return{restrict:"ECA",
+terminal:!0,priority:400,transclude:"element",link:function(c,f,g,l,k){function q(){r&&(d.cancel(r),r=null);m&&(m.$destroy(),m=null);s&&(r=d.leave(s),r.done(function(b){!1!==b&&(r=null)}),s=null)}function C(){var g=u.current&&u.current.locals;if(b.isDefined(g&&g.$template)){var g=c.$new(),l=u.current;s=k(g,function(g){d.enter(g,null,s||f).done(function(d){!1===d||!b.isDefined(w)||w&&!c.$eval(w)||h()});q()});m=l.scope=g;m.$emit("$viewContentLoaded");m.$eval(p)}else q()}var m,s,r,w=g.autoscroll,p=g.onload||
+"";c.$on("$routeChangeSuccess",C);C()}}}function x(b,h,d){return{restrict:"ECA",priority:-400,link:function(c,f){var g=d.current,l=g.locals;f.html(l.$template);var k=b(f.contents());if(g.controller){l.$scope=c;var q=h(g.controller,l);g.controllerAs&&(c[g.controllerAs]=q);f.data("$ngControllerController",q);f.children().data("$ngControllerController",q)}c[g.resolveAs||"$resolve"]=l;k(c)}}}var D,E,F,G,y=b.module("ngRoute",[]).info({angularVersion:"1.8.0"}).provider("$route",function(){function u(d,
+c){return b.extend(Object.create(d),c)}D=b.isArray;E=b.isObject;F=b.isDefined;G=b.noop;var h={};this.when=function(d,c){var f;f=void 0;if(D(c)){f=f||[];for(var g=0,l=c.length;g<l;g++)f[g]=c[g]}else if(E(c))for(g in f=f||{},c)if("$"!==g.charAt(0)||"$"!==g.charAt(1))f[g]=c[g];f=f||c;b.isUndefined(f.reloadOnUrl)&&(f.reloadOnUrl=!0);b.isUndefined(f.reloadOnSearch)&&(f.reloadOnSearch=!0);b.isUndefined(f.caseInsensitiveMatch)&&(f.caseInsensitiveMatch=this.caseInsensitiveMatch);h[d]=b.extend(f,{originalPath:d},
+d&&z(d,f));d&&(g="/"===d[d.length-1]?d.substr(0,d.length-1):d+"/",h[g]=b.extend({originalPath:d,redirectTo:d},z(g,f)));return this};this.caseInsensitiveMatch=!1;this.otherwise=function(b){"string"===typeof b&&(b={redirectTo:b});this.when(null,b);return this};p=!0;this.eagerInstantiationEnabled=function(b){return F(b)?(p=b,this):p};this.$get=["$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce","$browser",function(d,c,f,g,l,k,q,p){function m(a){var e=t.current;n=A();(x=
+!B&&n&&e&&n.$$route===e.$$route&&(!n.reloadOnUrl||!n.reloadOnSearch&&b.equals(n.pathParams,e.pathParams)))||!e&&!n||d.$broadcast("$routeChangeStart",n,e).defaultPrevented&&a&&a.preventDefault()}function s(){var a=t.current,e=n;if(x)a.params=e.params,b.copy(a.params,f),d.$broadcast("$routeUpdate",a);else if(e||a){B=!1;t.current=e;var c=g.resolve(e);p.$$incOutstandingRequestCount("$route");c.then(r).then(w).then(function(g){return g&&c.then(y).then(function(c){e===t.current&&(e&&(e.locals=c,b.copy(e.params,
+f)),d.$broadcast("$routeChangeSuccess",e,a))})}).catch(function(b){e===t.current&&d.$broadcast("$routeChangeError",e,a,b)}).finally(function(){p.$$completeOutstandingRequest(G,"$route")})}}function r(a){var e={route:a,hasRedirection:!1};if(a)if(a.redirectTo)if(b.isString(a.redirectTo))e.path=v(a.redirectTo,a.params),e.search=a.params,e.hasRedirection=!0;else{var d=c.path(),f=c.search();a=a.redirectTo(a.pathParams,d,f);b.isDefined(a)&&(e.url=a,e.hasRedirection=!0)}else if(a.resolveRedirectTo)return g.resolve(l.invoke(a.resolveRedirectTo)).then(function(a){b.isDefined(a)&&
+(e.url=a,e.hasRedirection=!0);return e});return e}function w(a){var b=!0;if(a.route!==t.current)b=!1;else if(a.hasRedirection){var g=c.url(),d=a.url;d?c.url(d).replace():d=c.path(a.path).search(a.search).replace().url();d!==g&&(b=!1)}return b}function y(a){if(a){var e=b.extend({},a.resolve);b.forEach(e,function(a,c){e[c]=b.isString(a)?l.get(a):l.invoke(a,null,null,c)});a=z(a);b.isDefined(a)&&(e.$template=a);return g.all(e)}}function z(a){var e,c;b.isDefined(e=a.template)?b.isFunction(e)&&(e=e(a.params)):
+b.isDefined(c=a.templateUrl)&&(b.isFunction(c)&&(c=c(a.params)),b.isDefined(c)&&(a.loadedTemplateUrl=q.valueOf(c),e=k(c)));return e}function A(){var a,e;b.forEach(h,function(d,g){var f;if(f=!e){var h=c.path();f=d.keys;var l={};if(d.regexp)if(h=d.regexp.exec(h)){for(var k=1,p=h.length;k<p;++k){var m=f[k-1],n=h[k];m&&n&&(l[m.name]=n)}f=l}else f=null;else f=null;f=a=f}f&&(e=u(d,{params:b.extend({},c.search(),a),pathParams:a}),e.$$route=d)});return e||h[null]&&u(h[null],{params:{},pathParams:{}})}function v(a,
+c){var d=[];b.forEach((a||"").split(":"),function(a,b){if(0===b)d.push(a);else{var f=a.match(/(\w+)(?:[?*])?(.*)/),g=f[1];d.push(c[g]);d.push(f[2]||"");delete c[g]}});return d.join("")}var B=!1,n,x,t={routes:h,reload:function(){B=!0;var a={defaultPrevented:!1,preventDefault:function(){this.defaultPrevented=!0;B=!1}};d.$evalAsync(function(){m(a);a.defaultPrevented||s()})},updateParams:function(a){if(this.current&&this.current.$$route)a=b.extend({},this.current.params,a),c.path(v(this.current.$$route.originalPath,
+a)),c.search(a);else throw H("norout");}};d.$on("$locationChangeStart",m);d.$on("$locationChangeSuccess",s);return t}]}).run(A),H=b.$$minErr("ngRoute"),p;A.$inject=["$injector"];y.provider("$routeParams",function(){this.$get=function(){return{}}});y.directive("ngView",v);y.directive("ngView",x);v.$inject=["$route","$anchorScroll","$animate"];x.$inject=["$compile","$controller","$route"]})(window,window.angular);
 //# sourceMappingURL=angular-route.min.js.map
diff --git a/civicrm/bower_components/angular-route/angular-route.min.js.map b/civicrm/bower_components/angular-route/angular-route.min.js.map
index f2ee70f2d6d021f1f4682456c4e6c8a9e7909284..abb456d57639a602840e14e108376d16f4db75cf 100644
--- a/civicrm/bower_components/angular-route/angular-route.min.js.map
+++ b/civicrm/bower_components/angular-route/angular-route.min.js.map
@@ -1,8 +1,8 @@
 {
 "version":3,
 "file":"angular-route.min.js",
-"lineCount":15,
-"mappings":"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",
+"lineCount":16,
+"mappings":"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",
 "sources":["angular-route.js"],
-"names":["window","angular","ngViewFactory","$route","$anchorScroll","$animate","restrict","terminal","priority","transclude","link","scope","$element","attr","ctrl","$transclude","cleanupLastView","previousLeaveAnimation","cancel","currentScope","$destroy","currentElement","leave","done","response","update","locals","current","isDefined","$template","newScope","$new","clone","enter","onNgViewEnter","autoScrollExp","$eval","$emit","onloadExp","autoscroll","onload","$on","ngViewFillContentFactory","$compile","$controller","html","contents","controller","$scope","controllerAs","data","children","resolveAs","isArray","isObject","ngRouteModule","module","provider","$RouteProvider","inherit","parent","extra","extend","Object","create","pathRegExp","path","opts","insensitive","caseInsensitiveMatch","ret","originalPath","regexp","keys","replace","_","slash","key","option","optional","star","push","name","RegExp","routes","when","this.when","route","routeCopy","dst","i","ii","length","charAt","isUndefined","reloadOnSearch","redirectPath","substr","redirectTo","otherwise","this.otherwise","params","$get","$rootScope","$location","$routeParams","$q","$injector","$templateRequest","$sce","prepareRoute","$locationEvent","lastRoute","preparedRouteIsUpdateOnly","preparedRoute","parseRoute","$$route","equals","pathParams","forceReload","$broadcast","defaultPrevented","preventDefault","commitRoute","nextRoute","copy","isString","interpolate","search","url","then","resolveLocals","error","resolve","forEach","value","get","invoke","template","getTemplateFor","all","templateUrl","isFunction","loadedTemplateUrl","valueOf","match","m","exec","on","len","val","string","result","split","segment","segmentMatch","join","reload","fakeLocationEvent","fakePreventDefault","$evalAsync","updateParams","newParams","$routeMinErr","$$minErr","$RouteParamsProvider","this.$get","directive","$inject"]
+"names":["window","angular","routeToRegExp","path","opts","keys","pattern","replace","_","slash","key","option","optional","star","push","name","ignoreTrailingSlashes","regexp","RegExp","caseInsensitiveMatch","instantiateRoute","$injector","isEagerInstantiationEnabled","get","ngViewFactory","$route","$anchorScroll","$animate","restrict","terminal","priority","transclude","link","scope","$element","attr","ctrl","$transclude","cleanupLastView","previousLeaveAnimation","cancel","currentScope","$destroy","currentElement","leave","done","response","update","locals","current","isDefined","$template","newScope","$new","clone","enter","onNgViewEnter","autoScrollExp","$eval","$emit","onloadExp","autoscroll","onload","$on","ngViewFillContentFactory","$compile","$controller","html","contents","controller","$scope","controllerAs","data","children","resolveAs","isArray","isObject","noop","ngRouteModule","module","info","angularVersion","provider","$RouteProvider","inherit","parent","extra","extend","Object","create","routes","when","this.when","route","routeCopy","dst","i","ii","length","charAt","isUndefined","reloadOnUrl","reloadOnSearch","originalPath","redirectPath","substr","redirectTo","otherwise","this.otherwise","params","eagerInstantiationEnabled","this.eagerInstantiationEnabled","enabled","$get","$rootScope","$location","$routeParams","$q","$templateRequest","$sce","$browser","prepareRoute","$locationEvent","lastRoute","preparedRoute","parseRoute","preparedRouteIsUpdateOnly","forceReload","$$route","equals","pathParams","$broadcast","defaultPrevented","preventDefault","commitRoute","nextRoute","copy","nextRoutePromise","resolve","$$incOutstandingRequestCount","then","getRedirectionData","handlePossibleRedirection","keepProcessingRoute","resolveLocals","catch","error","finally","$$completeOutstandingRequest","hasRedirection","isString","interpolate","search","oldPath","oldSearch","newUrl","url","resolveRedirectTo","invoke","oldUrl","forEach","value","template","getTemplateFor","all","templateUrl","isFunction","loadedTemplateUrl","valueOf","match","m","exec","on","len","val","string","result","split","segment","segmentMatch","join","reload","fakeLocationEvent","fakePreventDefault","$evalAsync","updateParams","newParams","$routeMinErr","run","$$minErr","$inject","$RouteParamsProvider","this.$get","directive"]
 }
diff --git a/civicrm/bower_components/angular-route/bower.json b/civicrm/bower_components/angular-route/bower.json
index 41841a9ce981b260440ffafb00e98212f86aac96..936583818db226168249da6cfe3ca0e03b3249d0 100644
--- a/civicrm/bower_components/angular-route/bower.json
+++ b/civicrm/bower_components/angular-route/bower.json
@@ -1,10 +1,10 @@
 {
   "name": "angular-route",
-  "version": "1.5.11",
+  "version": "1.8.0",
   "license": "MIT",
   "main": "./angular-route.js",
   "ignore": [],
   "dependencies": {
-    "angular": "1.5.11"
+    "angular": "1.8.0"
   }
 }
diff --git a/civicrm/bower_components/angular-route/package.json b/civicrm/bower_components/angular-route/package.json
index ad9038f227bf826533a139bc4f5c17a48ce079dd..3dcf4cf7a4ec70b8cc4837e54910984bc3e7fa37 100644
--- a/civicrm/bower_components/angular-route/package.json
+++ b/civicrm/bower_components/angular-route/package.json
@@ -1,6 +1,6 @@
 {
   "name": "angular-route",
-  "version": "1.5.11",
+  "version": "1.8.0",
   "description": "AngularJS router module",
   "main": "index.js",
   "scripts": {
diff --git a/civicrm/bower_components/angular-sanitize/.composer-downloads/angular-sanitize-2e0dffb0d66d69809f64b5824d8df7ec.json b/civicrm/bower_components/angular-sanitize/.composer-downloads/angular-sanitize-2e0dffb0d66d69809f64b5824d8df7ec.json
index 77d8b2b91be24c49344b4977ecd0e8e9c29a3724..581282338f4b396ecf4cb74f5f327bc09e65f004 100644
--- a/civicrm/bower_components/angular-sanitize/.composer-downloads/angular-sanitize-2e0dffb0d66d69809f64b5824d8df7ec.json
+++ b/civicrm/bower_components/angular-sanitize/.composer-downloads/angular-sanitize-2e0dffb0d66d69809f64b5824d8df7ec.json
@@ -1,6 +1,6 @@
 {
     "name": "civicrm/civicrm-core:angular-sanitize",
-    "url": "https://github.com/angular/bower-angular-sanitize/archive/v1.5.11.zip",
-    "checksum": "adc8684ea4bc8a11c51ab1c1ff3a92aa7a2b5f1eaf7f51a054fd1758b3a78df0",
+    "url": "https://github.com/angular/bower-angular-sanitize/archive/v1.8.0.zip",
+    "checksum": "a8a4a4c51c9136d9435506e6da0157eb6f0561067c17926ff27c200b74c1e307",
     "ignore": null
 }
\ No newline at end of file
diff --git a/civicrm/bower_components/angular-sanitize/angular-sanitize.js b/civicrm/bower_components/angular-sanitize/angular-sanitize.js
index 471d359dd848ba88304b8ebfa336a87df2b32778..87d18362e1aeb6f6abbb9ebd4b4318d86a44a68d 100644
--- a/civicrm/bower_components/angular-sanitize/angular-sanitize.js
+++ b/civicrm/bower_components/angular-sanitize/angular-sanitize.js
@@ -1,6 +1,6 @@
 /**
- * @license AngularJS v1.5.11
- * (c) 2010-2017 Google, Inc. http://angularjs.org
+ * @license AngularJS v1.8.0
+ * (c) 2010-2020 Google, Inc. http://angularjs.org
  * License: MIT
  */
 (function(window, angular) {'use strict';
@@ -20,9 +20,11 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize');
 var bind;
 var extend;
 var forEach;
+var isArray;
 var isDefined;
 var lowercase;
 var noop;
+var nodeContains;
 var htmlParser;
 var htmlSanitizeWriter;
 
@@ -31,13 +33,8 @@ var htmlSanitizeWriter;
  * @name ngSanitize
  * @description
  *
- * # ngSanitize
- *
  * The `ngSanitize` module provides functionality to sanitize HTML.
  *
- *
- * <div doc-module-components="ngSanitize"></div>
- *
  * See {@link ngSanitize.$sanitize `$sanitize`} for usage.
  */
 
@@ -50,12 +47,11 @@ var htmlSanitizeWriter;
  *   Sanitizes an html string by stripping all potentially dangerous tokens.
  *
  *   The input is sanitized by parsing the HTML into tokens. All safe tokens (from a whitelist) are
- *   then serialized back to properly escaped html string. This means that no unsafe input can make
+ *   then serialized back to a properly escaped HTML string. This means that no unsafe input can make
  *   it into the returned string.
  *
  *   The whitelist for URL sanitization of attribute values is configured using the functions
- *   `aHrefSanitizationWhitelist` and `imgSrcSanitizationWhitelist` of {@link ng.$compileProvider
- *   `$compileProvider`}.
+ *   `aHrefSanitizationWhitelist` and `imgSrcSanitizationWhitelist` of {@link $compileProvider}.
  *
  *   The input may also contain SVG markup if this is enabled via {@link $sanitizeProvider}.
  *
@@ -154,9 +150,11 @@ var htmlSanitizeWriter;
  * Creates and configures {@link $sanitize} instance.
  */
 function $SanitizeProvider() {
+  var hasBeenInstantiated = false;
   var svgEnabled = false;
 
   this.$get = ['$$sanitizeUri', function($$sanitizeUri) {
+    hasBeenInstantiated = true;
     if (svgEnabled) {
       extend(validElements, svgElements);
     }
@@ -197,7 +195,7 @@ function $SanitizeProvider() {
    * </div>
    *
    * @param {boolean=} flag Enable or disable SVG support in the sanitizer.
-   * @returns {boolean|ng.$sanitizeProvider} Returns the currently configured value if called
+   * @returns {boolean|$sanitizeProvider} Returns the currently configured value if called
    *    without an argument or self for chaining otherwise.
    */
   this.enableSvg = function(enableSvg) {
@@ -209,6 +207,105 @@ function $SanitizeProvider() {
     }
   };
 
+
+  /**
+   * @ngdoc method
+   * @name $sanitizeProvider#addValidElements
+   * @kind function
+   *
+   * @description
+   * Extends the built-in lists of valid HTML/SVG elements, i.e. elements that are considered safe
+   * and are not stripped off during sanitization. You can extend the following lists of elements:
+   *
+   * - `htmlElements`: A list of elements (tag names) to extend the current list of safe HTML
+   *   elements. HTML elements considered safe will not be removed during sanitization. All other
+   *   elements will be stripped off.
+   *
+   * - `htmlVoidElements`: This is similar to `htmlElements`, but marks the elements as
+   *   "void elements" (similar to HTML
+   *   [void elements](https://rawgit.com/w3c/html/html5.1-2/single-page.html#void-elements)). These
+   *   elements have no end tag and cannot have content.
+   *
+   * - `svgElements`: This is similar to `htmlElements`, but for SVG elements. This list is only
+   *   taken into account if SVG is {@link ngSanitize.$sanitizeProvider#enableSvg enabled} for
+   *   `$sanitize`.
+   *
+   * <div class="alert alert-info">
+   *   This method must be called during the {@link angular.Module#config config} phase. Once the
+   *   `$sanitize` service has been instantiated, this method has no effect.
+   * </div>
+   *
+   * <div class="alert alert-warning">
+   *   Keep in mind that extending the built-in lists of elements may expose your app to XSS or
+   *   other vulnerabilities. Be very mindful of the elements you add.
+   * </div>
+   *
+   * @param {Array<String>|Object} elements - A list of valid HTML elements or an object with one or
+   *   more of the following properties:
+   *   - **htmlElements** - `{Array<String>}` - A list of elements to extend the current list of
+   *     HTML elements.
+   *   - **htmlVoidElements** - `{Array<String>}` - A list of elements to extend the current list of
+   *     void HTML elements; i.e. elements that do not have an end tag.
+   *   - **svgElements** - `{Array<String>}` - A list of elements to extend the current list of SVG
+   *     elements. The list of SVG elements is only taken into account if SVG is
+   *     {@link ngSanitize.$sanitizeProvider#enableSvg enabled} for `$sanitize`.
+   *
+   * Passing an array (`[...]`) is equivalent to passing `{htmlElements: [...]}`.
+   *
+   * @return {$sanitizeProvider} Returns self for chaining.
+   */
+  this.addValidElements = function(elements) {
+    if (!hasBeenInstantiated) {
+      if (isArray(elements)) {
+        elements = {htmlElements: elements};
+      }
+
+      addElementsTo(svgElements, elements.svgElements);
+      addElementsTo(voidElements, elements.htmlVoidElements);
+      addElementsTo(validElements, elements.htmlVoidElements);
+      addElementsTo(validElements, elements.htmlElements);
+    }
+
+    return this;
+  };
+
+
+  /**
+   * @ngdoc method
+   * @name $sanitizeProvider#addValidAttrs
+   * @kind function
+   *
+   * @description
+   * Extends the built-in list of valid attributes, i.e. attributes that are considered safe and are
+   * not stripped off during sanitization.
+   *
+   * **Note**:
+   * The new attributes will not be treated as URI attributes, which means their values will not be
+   * sanitized as URIs using `$compileProvider`'s
+   * {@link ng.$compileProvider#aHrefSanitizationWhitelist aHrefSanitizationWhitelist} and
+   * {@link ng.$compileProvider#imgSrcSanitizationWhitelist imgSrcSanitizationWhitelist}.
+   *
+   * <div class="alert alert-info">
+   *   This method must be called during the {@link angular.Module#config config} phase. Once the
+   *   `$sanitize` service has been instantiated, this method has no effect.
+   * </div>
+   *
+   * <div class="alert alert-warning">
+   *   Keep in mind that extending the built-in list of attributes may expose your app to XSS or
+   *   other vulnerabilities. Be very mindful of the attributes you add.
+   * </div>
+   *
+   * @param {Array<String>} attrs - A list of valid attributes.
+   *
+   * @returns {$sanitizeProvider} Returns self for chaining.
+   */
+  this.addValidAttrs = function(attrs) {
+    if (!hasBeenInstantiated) {
+      extend(validAttrs, arrayToMap(attrs, true));
+    }
+    return this;
+  };
+
   //////////////////////////////////////////////////////////////////////////////////////////////////
   // Private stuff
   //////////////////////////////////////////////////////////////////////////////////////////////////
@@ -216,13 +313,19 @@ function $SanitizeProvider() {
   bind = angular.bind;
   extend = angular.extend;
   forEach = angular.forEach;
+  isArray = angular.isArray;
   isDefined = angular.isDefined;
-  lowercase = angular.lowercase;
+  lowercase = angular.$$lowercase;
   noop = angular.noop;
 
   htmlParser = htmlParserImpl;
   htmlSanitizeWriter = htmlSanitizeWriterImpl;
 
+  nodeContains = window.Node.prototype.contains || /** @this */ function(arg) {
+    // eslint-disable-next-line no-bitwise
+    return !!(this.compareDocumentPosition(arg) & 16);
+  };
+
   // Regular Expressions for parsing tags and attributes
   var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
     // Match everything outside of normal chars and " (quote character)
@@ -235,23 +338,23 @@ function $SanitizeProvider() {
 
   // Safe Void Elements - HTML5
   // http://dev.w3.org/html5/spec/Overview.html#void-elements
-  var voidElements = toMap('area,br,col,hr,img,wbr');
+  var voidElements = stringToMap('area,br,col,hr,img,wbr');
 
   // Elements that you can, intentionally, leave open (and which close themselves)
   // http://dev.w3.org/html5/spec/Overview.html#optional-tags
-  var optionalEndTagBlockElements = toMap('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr'),
-      optionalEndTagInlineElements = toMap('rp,rt'),
+  var optionalEndTagBlockElements = stringToMap('colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr'),
+      optionalEndTagInlineElements = stringToMap('rp,rt'),
       optionalEndTagElements = extend({},
                                               optionalEndTagInlineElements,
                                               optionalEndTagBlockElements);
 
   // Safe Block Elements - HTML5
-  var blockElements = extend({}, optionalEndTagBlockElements, toMap('address,article,' +
+  var blockElements = extend({}, optionalEndTagBlockElements, stringToMap('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,section,table,ul'));
 
   // Inline Elements - HTML5
-  var inlineElements = extend({}, optionalEndTagInlineElements, toMap('a,abbr,acronym,b,' +
+  var inlineElements = extend({}, optionalEndTagInlineElements, stringToMap('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'));
 
@@ -259,12 +362,12 @@ function $SanitizeProvider() {
   // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Elements
   // Note: the elements animate,animateColor,animateMotion,animateTransform,set are intentionally omitted.
   // They can potentially allow for arbitrary javascript to be executed. See #11290
-  var svgElements = toMap('circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,' +
+  var svgElements = stringToMap('circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,' +
           'hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,' +
           'radialGradient,rect,stop,svg,switch,text,title,tspan');
 
   // Blocked Elements (will be stripped)
-  var blockedElements = toMap('script,style');
+  var blockedElements = stringToMap('script,style');
 
   var validElements = extend({},
                                      voidElements,
@@ -273,9 +376,9 @@ function $SanitizeProvider() {
                                      optionalEndTagElements);
 
   //Attributes that have href and hence need to be sanitized
-  var uriAttrs = toMap('background,cite,href,longdesc,src,xlink:href');
+  var uriAttrs = stringToMap('background,cite,href,longdesc,src,xlink:href,xml:base');
 
-  var htmlAttrs = toMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +
+  var htmlAttrs = stringToMap('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,tabindex,target,title,type,' +
@@ -283,7 +386,7 @@ function $SanitizeProvider() {
 
   // SVG attributes (without "id" and "name" attributes)
   // https://wiki.whatwg.org/wiki/Sanitization_rules#svg_Attributes
-  var svgAttrs = toMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +
+  var svgAttrs = stringToMap('accent-height,accumulate,additive,alphabetic,arabic-form,ascent,' +
       'baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,' +
       'cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,' +
       'font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,' +
@@ -304,35 +407,96 @@ function $SanitizeProvider() {
                                   svgAttrs,
                                   htmlAttrs);
 
-  function toMap(str, lowercaseKeys) {
-    var obj = {}, items = str.split(','), i;
+  function stringToMap(str, lowercaseKeys) {
+    return arrayToMap(str.split(','), lowercaseKeys);
+  }
+
+  function arrayToMap(items, lowercaseKeys) {
+    var obj = {}, i;
     for (i = 0; i < items.length; i++) {
       obj[lowercaseKeys ? lowercase(items[i]) : items[i]] = true;
     }
     return obj;
   }
 
-  var inertBodyElement;
-  (function(window) {
-    var doc;
-    if (window.document && window.document.implementation) {
-      doc = window.document.implementation.createHTMLDocument('inert');
+  function addElementsTo(elementsMap, newElements) {
+    if (newElements && newElements.length) {
+      extend(elementsMap, arrayToMap(newElements));
+    }
+  }
+
+  /**
+   * Create an inert document that contains the dirty HTML that needs sanitizing
+   * Depending upon browser support we use one of three strategies for doing this.
+   * Support: Safari 10.x -> XHR strategy
+   * Support: Firefox -> DomParser strategy
+   */
+  var getInertBodyElement /* function(html: string): HTMLBodyElement */ = (function(window, document) {
+    var inertDocument;
+    if (document && document.implementation) {
+      inertDocument = document.implementation.createHTMLDocument('inert');
     } else {
       throw $sanitizeMinErr('noinert', 'Can\'t create an inert html document');
     }
-    var docElement = doc.documentElement || doc.getDocumentElement();
-    var bodyElements = docElement.getElementsByTagName('body');
+    var inertBodyElement = (inertDocument.documentElement || inertDocument.getDocumentElement()).querySelector('body');
 
-    // usually there should be only one body element in the document, but IE doesn't have any, so we need to create one
-    if (bodyElements.length === 1) {
-      inertBodyElement = bodyElements[0];
+    // Check for the Safari 10.1 bug - which allows JS to run inside the SVG G element
+    inertBodyElement.innerHTML = '<svg><g onload="this.parentNode.remove()"></g></svg>';
+    if (!inertBodyElement.querySelector('svg')) {
+      return getInertBodyElement_XHR;
     } else {
-      var html = doc.createElement('html');
-      inertBodyElement = doc.createElement('body');
-      html.appendChild(inertBodyElement);
-      doc.appendChild(html);
+      // Check for the Firefox bug - which prevents the inner img JS from being sanitized
+      inertBodyElement.innerHTML = '<svg><p><style><img src="</style><img src=x onerror=alert(1)//">';
+      if (inertBodyElement.querySelector('svg img')) {
+        return getInertBodyElement_DOMParser;
+      } else {
+        return getInertBodyElement_InertDocument;
+      }
+    }
+
+    function getInertBodyElement_XHR(html) {
+      // We add this dummy element to ensure that the rest of the content is parsed as expected
+      // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the `<head>` tag.
+      html = '<remove></remove>' + html;
+      try {
+        html = encodeURI(html);
+      } catch (e) {
+        return undefined;
+      }
+      var xhr = new window.XMLHttpRequest();
+      xhr.responseType = 'document';
+      xhr.open('GET', 'data:text/html;charset=utf-8,' + html, false);
+      xhr.send(null);
+      var body = xhr.response.body;
+      body.firstChild.remove();
+      return body;
     }
-  })(window);
+
+    function getInertBodyElement_DOMParser(html) {
+      // We add this dummy element to ensure that the rest of the content is parsed as expected
+      // e.g. leading whitespace is maintained and tags like `<meta>` do not get hoisted to the `<head>` tag.
+      html = '<remove></remove>' + html;
+      try {
+        var body = new window.DOMParser().parseFromString(html, 'text/html').body;
+        body.firstChild.remove();
+        return body;
+      } catch (e) {
+        return undefined;
+      }
+    }
+
+    function getInertBodyElement_InertDocument(html) {
+      inertBodyElement.innerHTML = html;
+
+      // Support: IE 9-11 only
+      // strip custom-namespaced attributes on IE<=11
+      if (document.documentMode) {
+        stripCustomNsAttrs(inertBodyElement);
+      }
+
+      return inertBodyElement;
+    }
+  })(window, window.document);
 
   /**
    * @example
@@ -352,7 +516,9 @@ function $SanitizeProvider() {
     } else if (typeof html !== 'string') {
       html = '' + html;
     }
-    inertBodyElement.innerHTML = html;
+
+    var inertBodyElement = getInertBodyElement(html);
+    if (!inertBodyElement) return '';
 
     //mXSS protection
     var mXSSAttempts = 5;
@@ -362,12 +528,9 @@ function $SanitizeProvider() {
       }
       mXSSAttempts--;
 
-      // strip custom-namespaced attributes on IE<=11
-      if (window.document.documentMode) {
-        stripCustomNsAttrs(inertBodyElement);
-      }
-      html = inertBodyElement.innerHTML; //trigger mXSS
-      inertBodyElement.innerHTML = html;
+      // trigger mXSS if it is going to happen by reading and writing the innerHTML
+      html = inertBodyElement.innerHTML;
+      inertBodyElement = getInertBodyElement(html);
     } while (html !== inertBodyElement.innerHTML);
 
     var node = inertBodyElement.firstChild;
@@ -383,16 +546,16 @@ function $SanitizeProvider() {
 
       var nextNode;
       if (!(nextNode = node.firstChild)) {
-      if (node.nodeType === 1) {
+        if (node.nodeType === 1) {
           handler.end(node.nodeName.toLowerCase());
         }
-        nextNode = node.nextSibling;
+        nextNode = getNonDescendant('nextSibling', node);
         if (!nextNode) {
           while (nextNode == null) {
-            node = node.parentNode;
+            node = getNonDescendant('parentNode', node);
             if (node === inertBodyElement) break;
-            nextNode = node.nextSibling;
-          if (node.nodeType === 1) {
+            nextNode = getNonDescendant('nextSibling', node);
+            if (node.nodeType === 1) {
               handler.end(node.nodeName.toLowerCase());
             }
           }
@@ -523,8 +686,17 @@ function $SanitizeProvider() {
         stripCustomNsAttrs(nextNode);
       }
 
-      node = node.nextSibling;
+      node = getNonDescendant('nextSibling', node);
+    }
+  }
+
+  function getNonDescendant(propName, node) {
+    // An element is clobbered if its `propName` property points to one of its descendants
+    var nextNode = node[propName];
+    if (nextNode && nodeContains.call(node, nextNode)) {
+      throw $sanitizeMinErr('elclob', 'Failed to sanitize html because the element is clobbered: {0}', node.outerHTML || node.outerText);
     }
+    return nextNode;
   }
 }
 
@@ -537,7 +709,9 @@ function sanitizeText(chars) {
 
 
 // define ngSanitize module and register $sanitize service
-angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
+angular.module('ngSanitize', [])
+  .provider('$sanitize', $SanitizeProvider)
+  .info({ angularVersion: '1.8.0' });
 
 /**
  * @ngdoc filter
@@ -545,13 +719,13 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
  * @kind function
  *
  * @description
- * Finds links in text input and turns them into html links. Supports `http/https/ftp/mailto` and
+ * Finds links in text input and turns them into html links. Supports `http/https/ftp/sftp/mailto` and
  * plain email address links.
  *
  * Requires the {@link ngSanitize `ngSanitize`} module to be installed.
  *
  * @param {string} text Input text.
- * @param {string} target Window (`_blank|_self|_parent|_top`) or named frame to open links in.
+ * @param {string} [target] Window (`_blank|_self|_parent|_top`) or named frame to open links in.
  * @param {object|function(url)} [attributes] Add custom attributes to the link element.
  *
  *    Can be one of:
@@ -668,7 +842,7 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
  */
 angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
   var LINKY_URL_REGEXP =
-        /((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,
+        /((s?ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,
       MAILTO_REGEXP = /^mailto:/i;
 
   var linkyMinErr = angular.$$minErr('linky');
diff --git a/civicrm/bower_components/angular-sanitize/angular-sanitize.min.js b/civicrm/bower_components/angular-sanitize/angular-sanitize.min.js
index 5e84766493cc3656097a94a18e27a955823a92ec..42f78b842e9bf3740a817c5529482eb143796d48 100644
--- a/civicrm/bower_components/angular-sanitize/angular-sanitize.min.js
+++ b/civicrm/bower_components/angular-sanitize/angular-sanitize.min.js
@@ -1,16 +1,18 @@
 /*
- AngularJS v1.5.11
- (c) 2010-2017 Google, Inc. http://angularjs.org
+ AngularJS v1.8.0
+ (c) 2010-2020 Google, Inc. http://angularjs.org
  License: MIT
 */
-(function(s,g){'use strict';function H(g){var l=[];t(l,A).chars(g);return l.join("")}var B=g.$$minErr("$sanitize"),C,l,D,E,q,A,F,t;g.module("ngSanitize",[]).provider("$sanitize",function(){function k(a,e){var b={},c=a.split(","),h;for(h=0;h<c.length;h++)b[e?q(c[h]):c[h]]=!0;return b}function I(a){for(var e={},b=0,c=a.length;b<c;b++){var h=a[b];e[h.name]=h.value}return e}function G(a){return a.replace(/&/g,"&amp;").replace(J,function(a){var b=a.charCodeAt(0);a=a.charCodeAt(1);return"&#"+(1024*(b-55296)+
-(a-56320)+65536)+";"}).replace(K,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function x(a){for(;a;){if(a.nodeType===s.Node.ELEMENT_NODE)for(var e=a.attributes,b=0,c=e.length;b<c;b++){var h=e[b],d=h.name.toLowerCase();if("xmlns:ns1"===d||0===d.lastIndexOf("ns1:",0))a.removeAttributeNode(h),b--,c--}(e=a.firstChild)&&x(e);a=a.nextSibling}}var u=!1;this.$get=["$$sanitizeUri",function(a){u&&l(v,w);return function(e){var b=[];F(e,t(b,function(b,h){return!/^unsafe:/.test(a(b,
-h))}));return b.join("")}}];this.enableSvg=function(a){return E(a)?(u=a,this):u};C=g.bind;l=g.extend;D=g.forEach;E=g.isDefined;q=g.lowercase;A=g.noop;F=function(a,e){null===a||void 0===a?a="":"string"!==typeof a&&(a=""+a);f.innerHTML=a;var b=5;do{if(0===b)throw B("uinput");b--;s.document.documentMode&&x(f);a=f.innerHTML;f.innerHTML=a}while(a!==f.innerHTML);for(b=f.firstChild;b;){switch(b.nodeType){case 1:e.start(b.nodeName.toLowerCase(),I(b.attributes));break;case 3:e.chars(b.textContent)}var c;if(!(c=
-b.firstChild)&&(1===b.nodeType&&e.end(b.nodeName.toLowerCase()),c=b.nextSibling,!c))for(;null==c;){b=b.parentNode;if(b===f)break;c=b.nextSibling;1===b.nodeType&&e.end(b.nodeName.toLowerCase())}b=c}for(;b=f.firstChild;)f.removeChild(b)};t=function(a,e){var b=!1,c=C(a,a.push);return{start:function(a,d){a=q(a);!b&&z[a]&&(b=a);b||!0!==v[a]||(c("<"),c(a),D(d,function(b,d){var f=q(d),g="img"===a&&"src"===f||"background"===f;!0!==m[f]||!0===n[f]&&!e(b,g)||(c(" "),c(d),c('="'),c(G(b)),c('"'))}),c(">"))},
-end:function(a){a=q(a);b||!0!==v[a]||!0===y[a]||(c("</"),c(a),c(">"));a==b&&(b=!1)},chars:function(a){b||c(G(a))}}};var J=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,K=/([^#-~ |!])/g,y=k("area,br,col,hr,img,wbr"),d=k("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),r=k("rp,rt"),p=l({},r,d),d=l({},d,k("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,section,table,ul")),r=l({},r,k("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")),
-w=k("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan"),z=k("script,style"),v=l({},y,d,r,p),n=k("background,cite,href,longdesc,src,xlink:href"),p=k("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,tabindex,target,title,type,valign,value,vspace,width"),
-r=k("accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan",
-!0),m=l({},n,r,p),f;(function(a){if(a.document&&a.document.implementation)a=a.document.implementation.createHTMLDocument("inert");else throw B("noinert");var e=(a.documentElement||a.getDocumentElement()).getElementsByTagName("body");1===e.length?f=e[0]:(e=a.createElement("html"),f=a.createElement("body"),e.appendChild(f),a.appendChild(e))})(s)});g.module("ngSanitize").filter("linky",["$sanitize",function(k){var l=/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,
-q=/^mailto:/i,x=g.$$minErr("linky"),u=g.isDefined,s=g.isFunction,t=g.isObject,y=g.isString;return function(d,g,p){function w(a){a&&m.push(H(a))}function z(a,b){var c,d=v(a);m.push("<a ");for(c in d)m.push(c+'="'+d[c]+'" ');!u(g)||"target"in d||m.push('target="',g,'" ');m.push('href="',a.replace(/"/g,"&quot;"),'">');w(b);m.push("</a>")}if(null==d||""===d)return d;if(!y(d))throw x("notstring",d);for(var v=s(p)?p:t(p)?function(){return p}:function(){return{}},n=d,m=[],f,a;d=n.match(l);)f=d[0],d[2]||
-d[4]||(f=(d[3]?"http://":"mailto:")+f),a=d.index,w(n.substr(0,a)),z(f,d[0].replace(q,"")),n=n.substring(a+d[0].length);w(n);return k(m.join(""))}}])})(window,window.angular);
+(function(s,c){'use strict';function P(c){var h=[];C(h,E).chars(c);return h.join("")}var D=c.$$minErr("$sanitize"),F,h,G,H,I,q,E,J,K,C;c.module("ngSanitize",[]).provider("$sanitize",function(){function f(a,e){return B(a.split(","),e)}function B(a,e){var d={},b;for(b=0;b<a.length;b++)d[e?q(a[b]):a[b]]=!0;return d}function t(a,e){e&&e.length&&h(a,B(e))}function Q(a){for(var e={},d=0,b=a.length;d<b;d++){var k=a[d];e[k.name]=k.value}return e}function L(a){return a.replace(/&/g,"&amp;").replace(z,function(a){var d=
+a.charCodeAt(0);a=a.charCodeAt(1);return"&#"+(1024*(d-55296)+(a-56320)+65536)+";"}).replace(u,function(a){return"&#"+a.charCodeAt(0)+";"}).replace(/</g,"&lt;").replace(/>/g,"&gt;")}function A(a){for(;a;){if(a.nodeType===s.Node.ELEMENT_NODE)for(var e=a.attributes,d=0,b=e.length;d<b;d++){var k=e[d],g=k.name.toLowerCase();if("xmlns:ns1"===g||0===g.lastIndexOf("ns1:",0))a.removeAttributeNode(k),d--,b--}(e=a.firstChild)&&A(e);a=v("nextSibling",a)}}function v(a,e){var d=e[a];if(d&&J.call(e,d))throw D("elclob",
+e.outerHTML||e.outerText);return d}var y=!1,g=!1;this.$get=["$$sanitizeUri",function(a){y=!0;g&&h(m,l);return function(e){var d=[];K(e,C(d,function(b,d){return!/^unsafe:/.test(a(b,d))}));return d.join("")}}];this.enableSvg=function(a){return I(a)?(g=a,this):g};this.addValidElements=function(a){y||(H(a)&&(a={htmlElements:a}),t(l,a.svgElements),t(r,a.htmlVoidElements),t(m,a.htmlVoidElements),t(m,a.htmlElements));return this};this.addValidAttrs=function(a){y||h(M,B(a,!0));return this};F=c.bind;h=c.extend;
+G=c.forEach;H=c.isArray;I=c.isDefined;q=c.$$lowercase;E=c.noop;K=function(a,e){null===a||void 0===a?a="":"string"!==typeof a&&(a=""+a);var d=N(a);if(!d)return"";var b=5;do{if(0===b)throw D("uinput");b--;a=d.innerHTML;d=N(a)}while(a!==d.innerHTML);for(b=d.firstChild;b;){switch(b.nodeType){case 1:e.start(b.nodeName.toLowerCase(),Q(b.attributes));break;case 3:e.chars(b.textContent)}var k;if(!(k=b.firstChild)&&(1===b.nodeType&&e.end(b.nodeName.toLowerCase()),k=v("nextSibling",b),!k))for(;null==k;){b=
+v("parentNode",b);if(b===d)break;k=v("nextSibling",b);1===b.nodeType&&e.end(b.nodeName.toLowerCase())}b=k}for(;b=d.firstChild;)d.removeChild(b)};C=function(a,e){var d=!1,b=F(a,a.push);return{start:function(a,g){a=q(a);!d&&w[a]&&(d=a);d||!0!==m[a]||(b("<"),b(a),G(g,function(d,g){var c=q(g),f="img"===a&&"src"===c||"background"===c;!0!==M[c]||!0===O[c]&&!e(d,f)||(b(" "),b(g),b('="'),b(L(d)),b('"'))}),b(">"))},end:function(a){a=q(a);d||!0!==m[a]||!0===r[a]||(b("</"),b(a),b(">"));a==d&&(d=!1)},chars:function(a){d||
+b(L(a))}}};J=s.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)};var z=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,u=/([^#-~ |!])/g,r=f("area,br,col,hr,img,wbr"),x=f("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"),p=f("rp,rt"),n=h({},p,x),x=h({},x,f("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,section,table,ul")),p=h({},p,f("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")),
+l=f("circle,defs,desc,ellipse,font-face,font-face-name,font-face-src,g,glyph,hkern,image,linearGradient,line,marker,metadata,missing-glyph,mpath,path,polygon,polyline,radialGradient,rect,stop,svg,switch,text,title,tspan"),w=f("script,style"),m=h({},r,x,p,n),O=f("background,cite,href,longdesc,src,xlink:href,xml:base"),n=f("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,tabindex,target,title,type,valign,value,vspace,width"),
+p=f("accent-height,accumulate,additive,alphabetic,arabic-form,ascent,baseProfile,bbox,begin,by,calcMode,cap-height,class,color,color-rendering,content,cx,cy,d,dx,dy,descent,display,dur,end,fill,fill-rule,font-family,font-size,font-stretch,font-style,font-variant,font-weight,from,fx,fy,g1,g2,glyph-name,gradientUnits,hanging,height,horiz-adv-x,horiz-origin-x,ideographic,k,keyPoints,keySplines,keyTimes,lang,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mathematical,max,min,offset,opacity,orient,origin,overline-position,overline-thickness,panose-1,path,pathLength,points,preserveAspectRatio,r,refX,refY,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,rotate,rx,ry,slope,stemh,stemv,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,systemLanguage,target,text-anchor,to,transform,type,u1,u2,underline-position,underline-thickness,unicode,unicode-range,units-per-em,values,version,viewBox,visibility,width,widths,x,x-height,x1,x2,xlink:actuate,xlink:arcrole,xlink:role,xlink:show,xlink:title,xlink:type,xml:base,xml:lang,xml:space,xmlns,xmlns:xlink,y,y1,y2,zoomAndPan",
+!0),M=h({},O,p,n),N=function(a,e){function d(b){b="<remove></remove>"+b;try{var d=(new a.DOMParser).parseFromString(b,"text/html").body;d.firstChild.remove();return d}catch(e){}}function b(a){c.innerHTML=a;e.documentMode&&A(c);return c}var g;if(e&&e.implementation)g=e.implementation.createHTMLDocument("inert");else throw D("noinert");var c=(g.documentElement||g.getDocumentElement()).querySelector("body");c.innerHTML='<svg><g onload="this.parentNode.remove()"></g></svg>';return c.querySelector("svg")?
+(c.innerHTML='<svg><p><style><img src="</style><img src=x onerror=alert(1)//">',c.querySelector("svg img")?d:b):function(b){b="<remove></remove>"+b;try{b=encodeURI(b)}catch(d){return}var e=new a.XMLHttpRequest;e.responseType="document";e.open("GET","data:text/html;charset=utf-8,"+b,!1);e.send(null);b=e.response.body;b.firstChild.remove();return b}}(s,s.document)}).info({angularVersion:"1.8.0"});c.module("ngSanitize").filter("linky",["$sanitize",function(f){var h=/((s?ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"\u201d\u2019]/i,
+t=/^mailto:/i,q=c.$$minErr("linky"),s=c.isDefined,A=c.isFunction,v=c.isObject,y=c.isString;return function(c,z,u){function r(c){c&&l.push(P(c))}function x(c,g){var f,a=p(c);l.push("<a ");for(f in a)l.push(f+'="'+a[f]+'" ');!s(z)||"target"in a||l.push('target="',z,'" ');l.push('href="',c.replace(/"/g,"&quot;"),'">');r(g);l.push("</a>")}if(null==c||""===c)return c;if(!y(c))throw q("notstring",c);for(var p=A(u)?u:v(u)?function(){return u}:function(){return{}},n=c,l=[],w,m;c=n.match(h);)w=c[0],c[2]||
+c[4]||(w=(c[3]?"http://":"mailto:")+w),m=c.index,r(n.substr(0,m)),x(w,c[0].replace(t,"")),n=n.substring(m+c[0].length);r(n);return f(l.join(""))}}])})(window,window.angular);
 //# sourceMappingURL=angular-sanitize.min.js.map
diff --git a/civicrm/bower_components/angular-sanitize/angular-sanitize.min.js.map b/civicrm/bower_components/angular-sanitize/angular-sanitize.min.js.map
index b5fec514612be38bcf565df4c0f6b5f43e8a212e..133f378a53afe39515b4bf6141bc971c7dddeb93 100644
--- a/civicrm/bower_components/angular-sanitize/angular-sanitize.min.js.map
+++ b/civicrm/bower_components/angular-sanitize/angular-sanitize.min.js.map
@@ -1,8 +1,8 @@
 {
 "version":3,
 "file":"angular-sanitize.min.js",
-"lineCount":15,
-"mappings":"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",
+"lineCount":17,
+"mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkB,CAyrB3BC,QAASA,EAAY,CAACC,CAAD,CAAQ,CAC3B,IAAIC,EAAM,EACGC,EAAAC,CAAmBF,CAAnBE,CAAwBC,CAAxBD,CACbH,MAAA,CAAaA,CAAb,CACA,OAAOC,EAAAI,KAAA,CAAS,EAAT,CAJoB,CA5qB7B,IAAIC,EAAkBR,CAAAS,SAAA,CAAiB,WAAjB,CAAtB,CACIC,CADJ,CAEIC,CAFJ,CAGIC,CAHJ,CAIIC,CAJJ,CAKIC,CALJ,CAMIC,CANJ,CAOIT,CAPJ,CAQIU,CARJ,CASIC,CATJ,CAUIb,CA2qBJJ,EAAAkB,OAAA,CAAe,YAAf,CAA6B,EAA7B,CAAAC,SAAA,CACY,WADZ,CAhjBAC,QAA0B,EAAG,CAkQ3BC,QAASA,EAAW,CAACC,CAAD,CAAMC,CAAN,CAAqB,CACvC,MAAOC,EAAA,CAAWF,CAAAG,MAAA,CAAU,GAAV,CAAX,CAA2BF,CAA3B,CADgC,CAIzCC,QAASA,EAAU,CAACE,CAAD,CAAQH,CAAR,CAAuB,CAAA,IACpCI,EAAM,EAD8B,CAC1BC,CACd,KAAKA,CAAL,CAAS,CAAT,CAAYA,CAAZ,CAAgBF,CAAAG,OAAhB,CAA8BD,CAAA,EAA9B,CACED,CAAA,CAAIJ,CAAA,CAAgBR,CAAA,CAAUW,CAAA,CAAME,CAAN,CAAV,CAAhB,CAAsCF,CAAA,CAAME,CAAN,CAA1C,CAAA,CAAsD,CAAA,CAExD,OAAOD,EALiC,CAQ1CG,QAASA,EAAa,CAACC,CAAD,CAAcC,CAAd,CAA2B,CAC3CA,CAAJ,EAAmBA,CAAAH,OAAnB,EACElB,CAAA,CAAOoB,CAAP,CAAoBP,CAAA,CAAWQ,CAAX,CAApB,CAF6C,CAsJjDC,QAASA,EAAS,CAACC,CAAD,CAAQ,CAExB,IADA,IAAIC,EAAM,EAAV,CACSP,EAAI,CADb,CACgBQ,EAAKF,CAAAL,OAArB,CAAmCD,CAAnC,CAAuCQ,CAAvC,CAA2CR,CAAA,EAA3C,CAAgD,CAC9C,IAAIS,EAAOH,CAAA,CAAMN,CAAN,CACXO,EAAA,CAAIE,CAAAC,KAAJ,CAAA,CAAiBD,CAAAE,MAF6B,CAIhD,MAAOJ,EANiB,CAiB1BK,QAASA,EAAc,CAACD,CAAD,CAAQ,CAC7B,MAAOA,EAAAE,QAAA,CACG,IADH,CACS,OADT,CAAAA,QAAA,CAEGC,CAFH,CAE0B,QAAQ,CAACH,CAAD,CAAQ,CAC7C,IAAII;AAAKJ,CAAAK,WAAA,CAAiB,CAAjB,CACLC,EAAAA,CAAMN,CAAAK,WAAA,CAAiB,CAAjB,CACV,OAAO,IAAP,EAAgC,IAAhC,EAAiBD,CAAjB,CAAsB,KAAtB,GAA0CE,CAA1C,CAAgD,KAAhD,EAA0D,KAA1D,EAAqE,GAHxB,CAF1C,CAAAJ,QAAA,CAOGK,CAPH,CAO4B,QAAQ,CAACP,CAAD,CAAQ,CAC/C,MAAO,IAAP,CAAcA,CAAAK,WAAA,CAAiB,CAAjB,CAAd,CAAoC,GADW,CAP5C,CAAAH,QAAA,CAUG,IAVH,CAUS,MAVT,CAAAA,QAAA,CAWG,IAXH,CAWS,MAXT,CADsB,CAgF/BM,QAASA,EAAkB,CAACC,CAAD,CAAO,CAChC,IAAA,CAAOA,CAAP,CAAA,CAAa,CACX,GAAIA,CAAAC,SAAJ,GAAsBlD,CAAAmD,KAAAC,aAAtB,CAEE,IADA,IAAIjB,EAAQc,CAAAI,WAAZ,CACSxB,EAAI,CADb,CACgByB,EAAInB,CAAAL,OAApB,CAAkCD,CAAlC,CAAsCyB,CAAtC,CAAyCzB,CAAA,EAAzC,CAA8C,CAC5C,IAAI0B,EAAWpB,CAAA,CAAMN,CAAN,CAAf,CACI2B,EAAWD,CAAAhB,KAAAkB,YAAA,EACf,IAAiB,WAAjB,GAAID,CAAJ,EAAoE,CAApE,GAAgCA,CAAAE,YAAA,CAAqB,MAArB,CAA6B,CAA7B,CAAhC,CACET,CAAAU,oBAAA,CAAyBJ,CAAzB,CAEA,CADA1B,CAAA,EACA,CAAAyB,CAAA,EAN0C,CAYhD,CADIM,CACJ,CADeX,CAAAY,WACf,GACEb,CAAA,CAAmBY,CAAnB,CAGFX,EAAA,CAAOa,CAAA,CAAiB,aAAjB,CAAgCb,CAAhC,CAnBI,CADmB,CAwBlCa,QAASA,EAAgB,CAACC,CAAD,CAAWd,CAAX,CAAiB,CAExC,IAAIW,EAAWX,CAAA,CAAKc,CAAL,CACf,IAAIH,CAAJ,EAAgB3C,CAAA+C,KAAA,CAAkBf,CAAlB,CAAwBW,CAAxB,CAAhB,CACE,KAAMnD,EAAA,CAAgB,QAAhB;AAA2FwC,CAAAgB,UAA3F,EAA6GhB,CAAAiB,UAA7G,CAAN,CAEF,MAAON,EANiC,CA5hB1C,IAAIO,EAAsB,CAAA,CAA1B,CACIC,EAAa,CAAA,CAEjB,KAAAC,KAAA,CAAY,CAAC,eAAD,CAAkB,QAAQ,CAACC,CAAD,CAAgB,CACpDH,CAAA,CAAsB,CAAA,CAClBC,EAAJ,EACExD,CAAA,CAAO2D,CAAP,CAAsBC,CAAtB,CAEF,OAAO,SAAQ,CAACC,CAAD,CAAO,CACpB,IAAIrE,EAAM,EACVc,EAAA,CAAWuD,CAAX,CAAiBpE,CAAA,CAAmBD,CAAnB,CAAwB,QAAQ,CAACsE,CAAD,CAAMC,CAAN,CAAe,CAC9D,MAAO,CAAC,UAAAC,KAAA,CAAgBN,CAAA,CAAcI,CAAd,CAAmBC,CAAnB,CAAhB,CADsD,CAA/C,CAAjB,CAGA,OAAOvE,EAAAI,KAAA,CAAS,EAAT,CALa,CAL8B,CAA1C,CA6CZ,KAAAqE,UAAA,CAAiBC,QAAQ,CAACD,CAAD,CAAY,CACnC,MAAI9D,EAAA,CAAU8D,CAAV,CAAJ,EACET,CACO,CADMS,CACN,CAAA,IAFT,EAIST,CAL0B,CAwDrC,KAAAW,iBAAA,CAAwBC,QAAQ,CAACC,CAAD,CAAW,CACpCd,CAAL,GACMrD,CAAA,CAAQmE,CAAR,CAOJ,GANEA,CAMF,CANa,CAACC,aAAcD,CAAf,CAMb,EAHAlD,CAAA,CAAcyC,CAAd,CAA2BS,CAAAT,YAA3B,CAGA,CAFAzC,CAAA,CAAcoD,CAAd,CAA4BF,CAAAG,iBAA5B,CAEA,CADArD,CAAA,CAAcwC,CAAd,CAA6BU,CAAAG,iBAA7B,CACA,CAAArD,CAAA,CAAcwC,CAAd,CAA6BU,CAAAC,aAA7B,CARF,CAWA,OAAO,KAZkC,CA6C3C,KAAAG,cAAA,CAAqBC,QAAQ,CAACnD,CAAD,CAAQ,CAC9BgC,CAAL,EACEvD,CAAA,CAAO2E,CAAP,CAAmB9D,CAAA,CAAWU,CAAX,CAAkB,CAAA,CAAlB,CAAnB,CAEF,OAAO,KAJ4B,CAWrCxB,EAAA,CAAOV,CAAAU,KACPC,EAAA,CAASX,CAAAW,OACTC;CAAA,CAAUZ,CAAAY,QACVC,EAAA,CAAUb,CAAAa,QACVC,EAAA,CAAYd,CAAAc,UACZC,EAAA,CAAYf,CAAAuF,YACZjF,EAAA,CAAON,CAAAM,KAEPW,EAAA,CAgMAuE,QAAuB,CAAChB,CAAD,CAAOiB,CAAP,CAAgB,CACxB,IAAb,GAAIjB,CAAJ,EAA8BkB,IAAAA,EAA9B,GAAqBlB,CAArB,CACEA,CADF,CACS,EADT,CAE2B,QAF3B,GAEW,MAAOA,EAFlB,GAGEA,CAHF,CAGS,EAHT,CAGcA,CAHd,CAMA,KAAImB,EAAmBC,CAAA,CAAoBpB,CAApB,CACvB,IAAKmB,CAAAA,CAAL,CAAuB,MAAO,EAG9B,KAAIE,EAAe,CACnB,GAAG,CACD,GAAqB,CAArB,GAAIA,CAAJ,CACE,KAAMrF,EAAA,CAAgB,QAAhB,CAAN,CAEFqF,CAAA,EAGArB,EAAA,CAAOmB,CAAAG,UACPH,EAAA,CAAmBC,CAAA,CAAoBpB,CAApB,CARlB,CAAH,MASSA,CATT,GASkBmB,CAAAG,UATlB,CAYA,KADI9C,CACJ,CADW2C,CAAA/B,WACX,CAAOZ,CAAP,CAAA,CAAa,CACX,OAAQA,CAAAC,SAAR,EACE,KAAK,CAAL,CACEwC,CAAAM,MAAA,CAAc/C,CAAAgD,SAAAxC,YAAA,EAAd,CAA2CvB,CAAA,CAAUe,CAAAI,WAAV,CAA3C,CACA,MACF,MAAK,CAAL,CACEqC,CAAAvF,MAAA,CAAc8C,CAAAiD,YAAd,CALJ,CASA,IAAItC,CACJ,IAAM,EAAAA,CAAA,CAAWX,CAAAY,WAAX,CAAN,GACwB,CAIjBD,GAJDX,CAAAC,SAICU,EAHH8B,CAAAS,IAAA,CAAYlD,CAAAgD,SAAAxC,YAAA,EAAZ,CAGGG,CADLA,CACKA,CADME,CAAA,CAAiB,aAAjB,CAAgCb,CAAhC,CACNW,CAAAA,CAAAA,CALP,EAMI,IAAA,CAAmB,IAAnB,EAAOA,CAAP,CAAA,CAAyB,CACvBX,CAAA;AAAOa,CAAA,CAAiB,YAAjB,CAA+Bb,CAA/B,CACP,IAAIA,CAAJ,GAAa2C,CAAb,CAA+B,KAC/BhC,EAAA,CAAWE,CAAA,CAAiB,aAAjB,CAAgCb,CAAhC,CACW,EAAtB,GAAIA,CAAAC,SAAJ,EACEwC,CAAAS,IAAA,CAAYlD,CAAAgD,SAAAxC,YAAA,EAAZ,CALqB,CAU7BR,CAAA,CAAOW,CA3BI,CA8Bb,IAAA,CAAQX,CAAR,CAAe2C,CAAA/B,WAAf,CAAA,CACE+B,CAAAQ,YAAA,CAA6BnD,CAA7B,CAvDmC,CA/LvC5C,EAAA,CAoSAgG,QAA+B,CAACjG,CAAD,CAAMkG,CAAN,CAAoB,CACjD,IAAIC,EAAuB,CAAA,CAA3B,CACIC,EAAM7F,CAAA,CAAKP,CAAL,CAAUA,CAAAqG,KAAV,CACV,OAAO,CACLT,MAAOA,QAAQ,CAACU,CAAD,CAAMvE,CAAN,CAAa,CAC1BuE,CAAA,CAAM1F,CAAA,CAAU0F,CAAV,CACDH,EAAAA,CAAL,EAA6BI,CAAA,CAAgBD,CAAhB,CAA7B,GACEH,CADF,CACyBG,CADzB,CAGKH,EAAL,EAAoD,CAAA,CAApD,GAA6BhC,CAAA,CAAcmC,CAAd,CAA7B,GACEF,CAAA,CAAI,GAAJ,CAcA,CAbAA,CAAA,CAAIE,CAAJ,CAaA,CAZA7F,CAAA,CAAQsB,CAAR,CAAe,QAAQ,CAACK,CAAD,CAAQoE,CAAR,CAAa,CAClC,IAAIC,EAAO7F,CAAA,CAAU4F,CAAV,CAAX,CACIjC,EAAmB,KAAnBA,GAAW+B,CAAX/B,EAAqC,KAArCA,GAA4BkC,CAA5BlC,EAAyD,YAAzDA,GAAgDkC,CAC3B,EAAA,CAAzB,GAAItB,CAAA,CAAWsB,CAAX,CAAJ,EACsB,CAAA,CADtB,GACGC,CAAA,CAASD,CAAT,CADH,EAC8B,CAAAP,CAAA,CAAa9D,CAAb,CAAoBmC,CAApB,CAD9B,GAEE6B,CAAA,CAAI,GAAJ,CAIA,CAHAA,CAAA,CAAII,CAAJ,CAGA,CAFAJ,CAAA,CAAI,IAAJ,CAEA,CADAA,CAAA,CAAI/D,CAAA,CAAeD,CAAf,CAAJ,CACA,CAAAgE,CAAA,CAAI,GAAJ,CANF,CAHkC,CAApC,CAYA,CAAAA,CAAA,CAAI,GAAJ,CAfF,CAL0B,CADvB,CAwBLL,IAAKA,QAAQ,CAACO,CAAD,CAAM,CACjBA,CAAA,CAAM1F,CAAA,CAAU0F,CAAV,CACDH,EAAL,EAAoD,CAAA,CAApD,GAA6BhC,CAAA,CAAcmC,CAAd,CAA7B,EAAkF,CAAA,CAAlF,GAA4DvB,CAAA,CAAauB,CAAb,CAA5D,GACEF,CAAA,CAAI,IAAJ,CAEA,CADAA,CAAA,CAAIE,CAAJ,CACA,CAAAF,CAAA,CAAI,GAAJ,CAHF,CAMIE,EAAJ,EAAWH,CAAX,GACEA,CADF,CACyB,CAAA,CADzB,CARiB,CAxBd,CAoCLpG,MAAOA,QAAQ,CAACA,CAAD,CAAQ,CAChBoG,CAAL;AACEC,CAAA,CAAI/D,CAAA,CAAetC,CAAf,CAAJ,CAFmB,CApClB,CAH0C,CAlSnDc,EAAA,CAAejB,CAAAmD,KAAA4D,UAAAC,SAAf,EAA8D,QAAQ,CAACC,CAAD,CAAM,CAE1E,MAAO,CAAG,EAAA,IAAAC,wBAAA,CAA6BD,CAA7B,CAAA,CAAoC,EAApC,CAFgE,CA5KjD,KAkLvBtE,EAAwB,iCAlLD,CAoLzBI,EAA0B,cApLD,CA6LvBoC,EAAe7D,CAAA,CAAY,wBAAZ,CA7LQ,CAiMvB6F,EAA8B7F,CAAA,CAAY,gDAAZ,CAjMP,CAkMvB8F,EAA+B9F,CAAA,CAAY,OAAZ,CAlMR,CAmMvB+F,EAAyBzG,CAAA,CAAO,EAAP,CACewG,CADf,CAEeD,CAFf,CAnMF,CAwMvBG,EAAgB1G,CAAA,CAAO,EAAP,CAAWuG,CAAX,CAAwC7F,CAAA,CAAY,qKAAZ,CAAxC,CAxMO,CA6MvBiG,EAAiB3G,CAAA,CAAO,EAAP,CAAWwG,CAAX,CAAyC9F,CAAA,CAAY,2JAAZ,CAAzC,CA7MM;AAqNvBkD,EAAclD,CAAA,CAAY,wNAAZ,CArNS,CA0NvBqF,EAAkBrF,CAAA,CAAY,cAAZ,CA1NK,CA4NvBiD,EAAgB3D,CAAA,CAAO,EAAP,CACeuE,CADf,CAEemC,CAFf,CAGeC,CAHf,CAIeF,CAJf,CA5NO,CAmOvBP,EAAWxF,CAAA,CAAY,uDAAZ,CAnOY,CAqOvBkG,EAAYlG,CAAA,CAAY,kTAAZ,CArOW;AA6OvBmG,EAAWnG,CAAA,CAAY,guCAAZ;AAcoE,CAAA,CAdpE,CA7OY,CA6PvBiE,EAAa3E,CAAA,CAAO,EAAP,CACekG,CADf,CAEeW,CAFf,CAGeD,CAHf,CA7PU,CA0RvB3B,EAAqE,QAAQ,CAAC7F,CAAD,CAAS0H,CAAT,CAAmB,CAyClGC,QAASA,EAA6B,CAAClD,CAAD,CAAO,CAG3CA,CAAA,CAAO,mBAAP,CAA6BA,CAC7B,IAAI,CACF,IAAImD,EAAOC,CAAA,IAAI7H,CAAA8H,UAAJD,iBAAA,CAAuCpD,CAAvC,CAA6C,WAA7C,CAAAmD,KACXA,EAAA/D,WAAAkE,OAAA,EACA,OAAOH,EAHL,CAIF,MAAOI,CAAP,CAAU,EAR+B,CAa7CC,QAASA,EAAiC,CAACxD,CAAD,CAAO,CAC/CmB,CAAAG,UAAA,CAA6BtB,CAIzBiD,EAAAQ,aAAJ,EACElF,CAAA,CAAmB4C,CAAnB,CAGF,OAAOA,EATwC,CArDjD,IAAIuC,CACJ,IAAIT,CAAJ,EAAgBA,CAAAU,eAAhB,CACED,CAAA,CAAgBT,CAAAU,eAAAC,mBAAA,CAA2C,OAA3C,CADlB,KAGE,MAAM5H,EAAA,CAAgB,SAAhB,CAAN,CAEF,IAAImF,EAAmB0C,CAACH,CAAAI,gBAADD,EAAkCH,CAAAK,mBAAA,EAAlCF,eAAA,CAAoF,MAApF,CAGvB1C,EAAAG,UAAA,CAA6B,sDAC7B,OAAKH,EAAA0C,cAAA,CAA+B,KAA/B,CAAL;CAIE1C,CAAAG,UACA,CAD6B,kEAC7B,CAAIH,CAAA0C,cAAA,CAA+B,SAA/B,CAAJ,CACSX,CADT,CAGSM,CARX,EAYAQ,QAAgC,CAAChE,CAAD,CAAO,CAGrCA,CAAA,CAAO,mBAAP,CAA6BA,CAC7B,IAAI,CACFA,CAAA,CAAOiE,SAAA,CAAUjE,CAAV,CADL,CAEF,MAAOuD,CAAP,CAAU,CACV,MADU,CAGZ,IAAIW,EAAM,IAAI3I,CAAA4I,eACdD,EAAAE,aAAA,CAAmB,UACnBF,EAAAG,KAAA,CAAS,KAAT,CAAgB,+BAAhB,CAAkDrE,CAAlD,CAAwD,CAAA,CAAxD,CACAkE,EAAAI,KAAA,CAAS,IAAT,CACInB,EAAAA,CAAOe,CAAAK,SAAApB,KACXA,EAAA/D,WAAAkE,OAAA,EACA,OAAOH,EAf8B,CAvB2D,CAA5B,CAiErE5H,CAjEqE,CAiE7DA,CAAA0H,SAjE6D,CA1R7C,CAgjB7B,CAAAuB,KAAA,CAEQ,CAAEC,eAAgB,OAAlB,CAFR,CAmIAjJ,EAAAkB,OAAA,CAAe,YAAf,CAAAgI,OAAA,CAAoC,OAApC,CAA6C,CAAC,WAAD,CAAc,QAAQ,CAACC,CAAD,CAAY,CAAA,IACzEC,EACE,2FAFuE;AAGzEC,EAAgB,WAHyD,CAKzEC,EAActJ,CAAAS,SAAA,CAAiB,OAAjB,CAL2D,CAMzEK,EAAYd,CAAAc,UAN6D,CAOzEyI,EAAavJ,CAAAuJ,WAP4D,CAQzEC,EAAWxJ,CAAAwJ,SAR8D,CASzEC,EAAWzJ,CAAAyJ,SAEf,OAAO,SAAQ,CAACC,CAAD,CAAOC,CAAP,CAAevG,CAAf,CAA2B,CA6BxCwG,QAASA,EAAO,CAACF,CAAD,CAAO,CAChBA,CAAL,EAGAlF,CAAAgC,KAAA,CAAUvG,CAAA,CAAayJ,CAAb,CAAV,CAJqB,CAOvBG,QAASA,EAAO,CAACC,CAAD,CAAMJ,CAAN,CAAY,CAAA,IACtB/C,CADsB,CACjBoD,EAAiBC,CAAA,CAAaF,CAAb,CAC1BtF,EAAAgC,KAAA,CAAU,KAAV,CAEA,KAAKG,CAAL,GAAYoD,EAAZ,CACEvF,CAAAgC,KAAA,CAAUG,CAAV,CAAgB,IAAhB,CAAuBoD,CAAA,CAAepD,CAAf,CAAvB,CAA6C,IAA7C,CAGE,EAAA7F,CAAA,CAAU6I,CAAV,CAAJ,EAA2B,QAA3B,EAAuCI,EAAvC,EACEvF,CAAAgC,KAAA,CAAU,UAAV,CACUmD,CADV,CAEU,IAFV,CAIFnF,EAAAgC,KAAA,CAAU,QAAV,CACUsD,CAAArH,QAAA,CAAY,IAAZ,CAAkB,QAAlB,CADV,CAEU,IAFV,CAGAmH,EAAA,CAAQF,CAAR,CACAlF,EAAAgC,KAAA,CAAU,MAAV,CAjB0B,CAnC5B,GAAY,IAAZ,EAAIkD,CAAJ,EAA6B,EAA7B,GAAoBA,CAApB,CAAiC,MAAOA,EACxC,IAAK,CAAAD,CAAA,CAASC,CAAT,CAAL,CAAqB,KAAMJ,EAAA,CAAY,WAAZ,CAA8DI,CAA9D,CAAN,CAYrB,IAVA,IAAIM,EACFT,CAAA,CAAWnG,CAAX,CAAA,CAAyBA,CAAzB,CACAoG,CAAA,CAASpG,CAAT,CAAA,CAAuB6G,QAA4B,EAAG,CAAC,MAAO7G,EAAR,CAAtD,CACA8G,QAAiC,EAAG,CAAC,MAAO,EAAR,CAHtC,CAMIC,EAAMT,CANV,CAOIlF,EAAO,EAPX,CAQIsF,CARJ,CASIlI,CACJ,CAAQwI,CAAR,CAAgBD,CAAAC,MAAA,CAAUhB,CAAV,CAAhB,CAAA,CAEEU,CAQA,CARMM,CAAA,CAAM,CAAN,CAQN,CANKA,CAAA,CAAM,CAAN,CAML;AANkBA,CAAA,CAAM,CAAN,CAMlB,GALEN,CAKF,EALSM,CAAA,CAAM,CAAN,CAAA,CAAW,SAAX,CAAuB,SAKhC,EAL6CN,CAK7C,EAHAlI,CAGA,CAHIwI,CAAAC,MAGJ,CAFAT,CAAA,CAAQO,CAAAG,OAAA,CAAW,CAAX,CAAc1I,CAAd,CAAR,CAEA,CADAiI,CAAA,CAAQC,CAAR,CAAaM,CAAA,CAAM,CAAN,CAAA3H,QAAA,CAAiB4G,CAAjB,CAAgC,EAAhC,CAAb,CACA,CAAAc,CAAA,CAAMA,CAAAI,UAAA,CAAc3I,CAAd,CAAkBwI,CAAA,CAAM,CAAN,CAAAvI,OAAlB,CAER+H,EAAA,CAAQO,CAAR,CACA,OAAOhB,EAAA,CAAU3E,CAAAjE,KAAA,CAAU,EAAV,CAAV,CA3BiC,CAXmC,CAAlC,CAA7C,CAr0B2B,CAA1B,CAAD,CA24BGR,MA34BH,CA24BWA,MAAAC,QA34BX;",
 "sources":["angular-sanitize.js"],
-"names":["window","angular","sanitizeText","chars","buf","htmlSanitizeWriter","writer","noop","join","$sanitizeMinErr","$$minErr","bind","extend","forEach","isDefined","lowercase","htmlParser","module","provider","$SanitizeProvider","toMap","str","lowercaseKeys","obj","items","split","i","length","attrToMap","attrs","map","ii","attr","name","value","encodeEntities","replace","SURROGATE_PAIR_REGEXP","hi","charCodeAt","low","NON_ALPHANUMERIC_REGEXP","stripCustomNsAttrs","node","nodeType","Node","ELEMENT_NODE","attributes","l","attrNode","attrName","toLowerCase","lastIndexOf","removeAttributeNode","nextNode","firstChild","nextSibling","svgEnabled","$get","$$sanitizeUri","validElements","svgElements","html","uri","isImage","test","enableSvg","this.enableSvg","htmlParserImpl","handler","undefined","inertBodyElement","innerHTML","mXSSAttempts","document","documentMode","start","nodeName","textContent","end","parentNode","removeChild","htmlSanitizeWriterImpl","uriValidator","ignoreCurrentElement","out","push","tag","blockedElements","key","lkey","validAttrs","uriAttrs","voidElements","optionalEndTagBlockElements","optionalEndTagInlineElements","optionalEndTagElements","blockElements","inlineElements","htmlAttrs","svgAttrs","implementation","doc","createHTMLDocument","bodyElements","getElementsByTagName","documentElement","getDocumentElement","createElement","appendChild","filter","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","linkyMinErr","isFunction","isObject","isString","text","target","addText","addLink","url","linkAttributes","attributesFn","getAttributesObject","getEmptyAttributesObject","raw","match","index","substr","substring"]
+"names":["window","angular","sanitizeText","chars","buf","htmlSanitizeWriter","writer","noop","join","$sanitizeMinErr","$$minErr","bind","extend","forEach","isArray","isDefined","lowercase","nodeContains","htmlParser","module","provider","$SanitizeProvider","stringToMap","str","lowercaseKeys","arrayToMap","split","items","obj","i","length","addElementsTo","elementsMap","newElements","attrToMap","attrs","map","ii","attr","name","value","encodeEntities","replace","SURROGATE_PAIR_REGEXP","hi","charCodeAt","low","NON_ALPHANUMERIC_REGEXP","stripCustomNsAttrs","node","nodeType","Node","ELEMENT_NODE","attributes","l","attrNode","attrName","toLowerCase","lastIndexOf","removeAttributeNode","nextNode","firstChild","getNonDescendant","propName","call","outerHTML","outerText","hasBeenInstantiated","svgEnabled","$get","$$sanitizeUri","validElements","svgElements","html","uri","isImage","test","enableSvg","this.enableSvg","addValidElements","this.addValidElements","elements","htmlElements","voidElements","htmlVoidElements","addValidAttrs","this.addValidAttrs","validAttrs","$$lowercase","htmlParserImpl","handler","undefined","inertBodyElement","getInertBodyElement","mXSSAttempts","innerHTML","start","nodeName","textContent","end","removeChild","htmlSanitizeWriterImpl","uriValidator","ignoreCurrentElement","out","push","tag","blockedElements","key","lkey","uriAttrs","prototype","contains","arg","compareDocumentPosition","optionalEndTagBlockElements","optionalEndTagInlineElements","optionalEndTagElements","blockElements","inlineElements","htmlAttrs","svgAttrs","document","getInertBodyElement_DOMParser","body","parseFromString","DOMParser","remove","e","getInertBodyElement_InertDocument","documentMode","inertDocument","implementation","createHTMLDocument","querySelector","documentElement","getDocumentElement","getInertBodyElement_XHR","encodeURI","xhr","XMLHttpRequest","responseType","open","send","response","info","angularVersion","filter","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","linkyMinErr","isFunction","isObject","isString","text","target","addText","addLink","url","linkAttributes","attributesFn","getAttributesObject","getEmptyAttributesObject","raw","match","index","substr","substring"]
 }
diff --git a/civicrm/bower_components/angular-sanitize/bower.json b/civicrm/bower_components/angular-sanitize/bower.json
index 3066c24ee3c976f69cd890057b9a33422522d34d..d72cde18f47b297f04a430dfa3312ef1246558ad 100644
--- a/civicrm/bower_components/angular-sanitize/bower.json
+++ b/civicrm/bower_components/angular-sanitize/bower.json
@@ -1,10 +1,10 @@
 {
   "name": "angular-sanitize",
-  "version": "1.5.11",
+  "version": "1.8.0",
   "license": "MIT",
   "main": "./angular-sanitize.js",
   "ignore": [],
   "dependencies": {
-    "angular": "1.5.11"
+    "angular": "1.8.0"
   }
 }
diff --git a/civicrm/bower_components/angular-sanitize/package.json b/civicrm/bower_components/angular-sanitize/package.json
index 101a5abfd0fb9a466ace718ea8597df63b36725c..bd497d16c03b255fec3beeed53bf119b25c27771 100644
--- a/civicrm/bower_components/angular-sanitize/package.json
+++ b/civicrm/bower_components/angular-sanitize/package.json
@@ -1,6 +1,6 @@
 {
   "name": "angular-sanitize",
-  "version": "1.5.11",
+  "version": "1.8.0",
   "description": "AngularJS module for sanitizing HTML",
   "main": "index.js",
   "scripts": {
diff --git a/civicrm/bower_components/angular/.composer-downloads/angular-d18b8624a0f5f721da7b82365fc562dd.json b/civicrm/bower_components/angular/.composer-downloads/angular-d18b8624a0f5f721da7b82365fc562dd.json
index 4fbd5d117d2b72466e6b03490217a5aea9ec00a0..6ed88e281a7b5ed6967bfca15401ac63be8be944 100644
--- a/civicrm/bower_components/angular/.composer-downloads/angular-d18b8624a0f5f721da7b82365fc562dd.json
+++ b/civicrm/bower_components/angular/.composer-downloads/angular-d18b8624a0f5f721da7b82365fc562dd.json
@@ -1,6 +1,6 @@
 {
     "name": "civicrm/civicrm-core:angular",
-    "url": "https://github.com/angular/bower-angular/archive/v1.5.11.zip",
-    "checksum": "ce8ecba711e2d10f58e8f969f96fb3d2a69a974c22a7ef6afa63bfb75b6bcece",
+    "url": "https://github.com/angular/bower-angular/archive/v1.8.0.zip",
+    "checksum": "617fdfafe25c88dd133e18deab2307c219505923cc80cda6c6e604c25aa89090",
     "ignore": null
 }
\ No newline at end of file
diff --git a/civicrm/bower_components/angular/angular-csp.css b/civicrm/bower_components/angular/angular-csp.css
index f3cd926cb36c6704458bd75d717fe0b00f581262..5e3a079cb1c06cd67985e59faa5c4ab920ee65e6 100644
--- a/civicrm/bower_components/angular/angular-csp.css
+++ b/civicrm/bower_components/angular/angular-csp.css
@@ -2,8 +2,12 @@
 
 @charset "UTF-8";
 
-[ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],
-.ng-cloak, .x-ng-cloak,
+[ng\:cloak],
+[ng-cloak],
+[data-ng-cloak],
+[x-ng-cloak],
+.ng-cloak,
+.x-ng-cloak,
 .ng-hide:not(.ng-hide-animate) {
   display: none !important;
 }
diff --git a/civicrm/bower_components/angular/angular.js b/civicrm/bower_components/angular/angular.js
index 88116c9653d5a76772d38f56337e172699a36a8f..5de5618431428aaaf5509f75b3a6b7ac909ab7e5 100644
--- a/civicrm/bower_components/angular/angular.js
+++ b/civicrm/bower_components/angular/angular.js
@@ -1,15 +1,76 @@
 /**
- * @license AngularJS v1.5.11
- * (c) 2010-2017 Google, Inc. http://angularjs.org
+ * @license AngularJS v1.8.0
+ * (c) 2010-2020 Google, Inc. http://angularjs.org
  * License: MIT
  */
 (function(window) {'use strict';
 
+/* exported
+  minErrConfig,
+  errorHandlingConfig,
+  isValidObjectMaxDepth
+*/
+
+var minErrConfig = {
+  objectMaxDepth: 5,
+  urlErrorParamsEnabled: true
+};
+
+/**
+ * @ngdoc function
+ * @name angular.errorHandlingConfig
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Configure several aspects of error handling in AngularJS if used as a setter or return the
+ * current configuration if used as a getter. The following options are supported:
+ *
+ * - **objectMaxDepth**: The maximum depth to which objects are traversed when stringified for error messages.
+ *
+ * Omitted or undefined options will leave the corresponding configuration values unchanged.
+ *
+ * @param {Object=} config - The configuration object. May only contain the options that need to be
+ *     updated. Supported keys:
+ *
+ * * `objectMaxDepth`  **{Number}** - The max depth for stringifying objects. Setting to a
+ *   non-positive or non-numeric value, removes the max depth limit.
+ *   Default: 5
+ *
+ * * `urlErrorParamsEnabled`  **{Boolean}** - Specifies whether the generated error url will
+ *   contain the parameters of the thrown error. Disabling the parameters can be useful if the
+ *   generated error url is very long.
+ *
+ *   Default: true. When used without argument, it returns the current value.
+ */
+function errorHandlingConfig(config) {
+  if (isObject(config)) {
+    if (isDefined(config.objectMaxDepth)) {
+      minErrConfig.objectMaxDepth = isValidObjectMaxDepth(config.objectMaxDepth) ? config.objectMaxDepth : NaN;
+    }
+    if (isDefined(config.urlErrorParamsEnabled) && isBoolean(config.urlErrorParamsEnabled)) {
+      minErrConfig.urlErrorParamsEnabled = config.urlErrorParamsEnabled;
+    }
+  } else {
+    return minErrConfig;
+  }
+}
+
+/**
+ * @private
+ * @param {Number} maxDepth
+ * @return {boolean}
+ */
+function isValidObjectMaxDepth(maxDepth) {
+  return isNumber(maxDepth) && maxDepth > 0;
+}
+
+
 /**
  * @description
  *
  * This object provides a utility for producing rich Error messages within
- * Angular. It can be called as follows:
+ * AngularJS. It can be called as follows:
  *
  * var exampleMinErr = minErr('example');
  * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);
@@ -26,7 +87,7 @@
  * Since data will be parsed statically during a build step, some restrictions
  * are applied with respect to how minErr instances are created and called.
  * Instances should have names of the form namespaceMinErr for a minErr created
- * using minErr('namespace') . Error codes, namespaces and template strings
+ * using minErr('namespace'). Error codes, namespaces and template strings
  * should all be static strings, not variables or general expressions.
  *
  * @param {string} module The namespace to use for the new minErr instance.
@@ -37,32 +98,41 @@
 
 function minErr(module, ErrorConstructor) {
   ErrorConstructor = ErrorConstructor || Error;
-  return function() {
-    var SKIP_INDEXES = 2;
 
-    var templateArgs = arguments,
-      code = templateArgs[0],
+  var url = 'https://errors.angularjs.org/1.8.0/';
+  var regex = url.replace('.', '\\.') + '[\\s\\S]*';
+  var errRegExp = new RegExp(regex, 'g');
+
+  return function() {
+    var code = arguments[0],
+      template = arguments[1],
       message = '[' + (module ? module + ':' : '') + code + '] ',
-      template = templateArgs[1],
+      templateArgs = sliceArgs(arguments, 2).map(function(arg) {
+        return toDebugString(arg, minErrConfig.objectMaxDepth);
+      }),
       paramPrefix, i;
 
+    // A minErr message has two parts: the message itself and the url that contains the
+    // encoded message.
+    // The message's parameters can contain other error messages which also include error urls.
+    // To prevent the messages from getting too long, we strip the error urls from the parameters.
+
     message += template.replace(/\{\d+\}/g, function(match) {
-      var index = +match.slice(1, -1),
-        shiftedIndex = index + SKIP_INDEXES;
+      var index = +match.slice(1, -1);
 
-      if (shiftedIndex < templateArgs.length) {
-        return toDebugString(templateArgs[shiftedIndex]);
+      if (index < templateArgs.length) {
+        return templateArgs[index].replace(errRegExp, '');
       }
 
       return match;
     });
 
-    message += '\nhttp://errors.angularjs.org/1.5.11/' +
-      (module ? module + '/' : '') + code;
+    message += '\n' + url + (module ? module + '/' : '') + code;
 
-    for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
-      message += paramPrefix + 'p' + (i - SKIP_INDEXES) + '=' +
-        encodeURIComponent(toDebugString(templateArgs[i]));
+    if (minErrConfig.urlErrorParamsEnabled) {
+      for (i = 0, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
+        message += paramPrefix + 'p' + i + '=' + encodeURIComponent(templateArgs[i]);
+      }
     }
 
     return new ErrorConstructor(message);
@@ -79,6 +149,9 @@ function minErr(module, ErrorConstructor) {
   splice,
   push,
   toString,
+  minErrConfig,
+  errorHandlingConfig,
+  isValidObjectMaxDepth,
   ngMinErr,
   angularModule,
   uid,
@@ -87,8 +160,6 @@ function minErr(module, ErrorConstructor) {
 
   lowercase,
   uppercase,
-  manualLowercase,
-  manualUppercase,
   nodeName_,
   isArrayLike,
   forEach,
@@ -111,6 +182,7 @@ function minErr(module, ErrorConstructor) {
   isNumber,
   isNumberNaN,
   isDate,
+  isError,
   isArray,
   isFunction,
   isRegExp,
@@ -128,6 +200,7 @@ function minErr(module, ErrorConstructor) {
   includes,
   arrayRemove,
   copy,
+  simpleCompare,
   equals,
   csp,
   jq,
@@ -139,6 +212,7 @@ function minErr(module, ErrorConstructor) {
   fromJson,
   convertTimezoneToLocal,
   timezoneToOffset,
+  addDateMinutes,
   startingTag,
   tryDecodeURIComponent,
   parseKeyValue,
@@ -157,6 +231,8 @@ function minErr(module, ErrorConstructor) {
   getBlockNodes,
   hasOwnProperty,
   createMap,
+  stringify,
+  UNSAFE_restoreLegacyJqLiteXHTMLReplacement,
 
   NODE_TYPE_ELEMENT,
   NODE_TYPE_ATTRIBUTE,
@@ -175,13 +251,11 @@ function minErr(module, ErrorConstructor) {
  * @installation
  * @description
  *
- * # ng (core module)
  * The ng module is loaded by default when an AngularJS application is started. The module itself
  * contains the essential components for an AngularJS application to function. The table below
  * lists a high level breakdown of each of the services/factories, filters, directives and testing
  * components available within this core module.
  *
- * <div doc-module-components="ng"></div>
  */
 
 var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/;
@@ -190,35 +264,26 @@ var REGEX_STRING_REGEXP = /^\/(.+)\/([a-z]*)$/;
 // This is used so that it's possible for internal tests to create mock ValidityStates.
 var VALIDITY_STATE_PROPERTY = 'validity';
 
+
 var hasOwnProperty = Object.prototype.hasOwnProperty;
 
+/**
+ * @private
+ *
+ * @description Converts the specified string to lowercase.
+ * @param {string} string String to be converted to lowercase.
+ * @returns {string} Lowercased string.
+ */
 var lowercase = function(string) {return isString(string) ? string.toLowerCase() : string;};
-var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;};
-
-
-var manualLowercase = function(s) {
-  /* eslint-disable no-bitwise */
-  return isString(s)
-      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})
-      : s;
-  /* eslint-enable */
-};
-var manualUppercase = function(s) {
-  /* eslint-disable no-bitwise */
-  return isString(s)
-      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
-      : s;
-  /* eslint-enable */
-};
 
-
-// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish
-// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods
-// with correct but slower alternatives. See https://github.com/angular/angular.js/issues/11387
-if ('i' !== 'I'.toLowerCase()) {
-  lowercase = manualLowercase;
-  uppercase = manualUppercase;
-}
+/**
+ * @private
+ *
+ * @description Converts the specified string to uppercase.
+ * @param {string} string String to be converted to uppercase.
+ * @returns {string} Uppercased string.
+ */
+var uppercase = function(string) {return isString(string) ? string.toUpperCase() : string;};
 
 
 var
@@ -237,6 +302,7 @@ var
     angularModule,
     uid               = 0;
 
+// Support: IE 9-11 only
 /**
  * documentMode is an IE-only property
  * http://msdn.microsoft.com/en-us/library/ie/cc196988(v=vs.85).aspx
@@ -267,8 +333,7 @@ function isArrayLike(obj) {
 
   // NodeList objects (with `item` method) and
   // other objects with suitable length characteristics are array-like
-  return isNumber(length) &&
-    (length >= 0 && ((length - 1) in obj || obj instanceof Array) || typeof obj.item === 'function');
+  return isNumber(length) && (length >= 0 && (length - 1) in obj || typeof obj.item === 'function');
 
 }
 
@@ -312,9 +377,7 @@ function forEach(obj, iterator, context) {
   if (obj) {
     if (isFunction(obj)) {
       for (key in obj) {
-        // Need to check if hasOwnProperty exists,
-        // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
-        if (key !== 'prototype' && key !== 'length' && key !== 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {
+        if (key !== 'prototype' && key !== 'length' && key !== 'name' && obj.hasOwnProperty(key)) {
           iterator.call(context, obj[key], key, obj);
         }
       }
@@ -419,8 +482,10 @@ function baseExtend(dst, objs, deep) {
         } else if (isElement(src)) {
           dst[key] = src.clone();
         } else {
-          if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {};
-          baseExtend(dst[key], [src], true);
+          if (key !== '__proto__') {
+            if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {};
+            baseExtend(dst[key], [src], true);
+          }
         }
       } else {
         dst[key] = src;
@@ -469,6 +534,22 @@ function extend(dst) {
 * Unlike {@link angular.extend extend()}, `merge()` recursively descends into object properties of source
 * objects, performing a deep copy.
 *
+* @deprecated
+* sinceVersion="1.6.5"
+* This function is deprecated, but will not be removed in the 1.x lifecycle.
+* There are edge cases (see {@link angular.merge#known-issues known issues}) that are not
+* supported by this function. We suggest using another, similar library for all-purpose merging,
+* such as [lodash's merge()](https://lodash.com/docs/4.17.4#merge).
+*
+* @knownIssue
+* This is a list of (known) object types that are not handled correctly by this function:
+* - [`Blob`](https://developer.mozilla.org/docs/Web/API/Blob)
+* - [`MediaStream`](https://developer.mozilla.org/docs/Web/API/MediaStream)
+* - [`CanvasGradient`](https://developer.mozilla.org/docs/Web/API/CanvasGradient)
+* - AngularJS {@link $rootScope.Scope scopes};
+*
+* `angular.merge` also does not support merging objects with circular references.
+*
 * @param {Object} dst Destination object.
 * @param {...Object} src Source object(s).
 * @returns {Object} Reference to `dst`.
@@ -671,12 +752,32 @@ function isDate(value) {
  * @kind function
  *
  * @description
- * Determines if a reference is an `Array`. Alias of Array.isArray.
+ * Determines if a reference is an `Array`.
  *
  * @param {*} value Reference to check.
  * @returns {boolean} True if `value` is an `Array`.
  */
-var isArray = Array.isArray;
+function isArray(arr) {
+  return Array.isArray(arr) || arr instanceof Array;
+}
+
+/**
+ * @description
+ * Determines if a reference is an `Error`.
+ * Loosely based on https://www.npmjs.com/package/iserror
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is an `Error`.
+ */
+function isError(value) {
+  var tag = toString.call(value);
+  switch (tag) {
+    case '[object Error]': return true;
+    case '[object Exception]': return true;
+    case '[object DOMException]': return true;
+    default: return value instanceof Error;
+  }
+}
 
 /**
  * @ngdoc function
@@ -826,7 +927,9 @@ function arrayRemove(array, value) {
  * @kind function
  *
  * @description
- * Creates a deep copy of `source`, which should be an object or an array.
+ * Creates a deep copy of `source`, which should be an object or an array. This functions is used
+ * internally, mostly in the change-detection code. It is not intended as an all-purpose copy
+ * function, and has several limitations (see below).
  *
  * * If no destination is supplied, a copy of the object or array is created.
  * * If a destination is provided, all of its elements (for arrays) or properties (for objects)
@@ -835,15 +938,35 @@ function arrayRemove(array, value) {
  * * If `source` is identical to `destination` an exception will be thrown.
  *
  * <br />
+ *
  * <div class="alert alert-warning">
  *   Only enumerable properties are taken into account. Non-enumerable properties (both on `source`
  *   and on `destination`) will be ignored.
  * </div>
  *
- * @param {*} source The source that will be used to make a copy.
- *                   Can be any type, including primitives, `null`, and `undefined`.
- * @param {(Object|Array)=} destination Destination into which the source is copied. If
- *     provided, must be of the same type as `source`.
+ * <div class="alert alert-warning">
+ *   `angular.copy` does not check if destination and source are of the same type. It's the
+ *   developer's responsibility to make sure they are compatible.
+ * </div>
+ *
+ * @knownIssue
+ * This is a non-exhaustive list of object types / features that are not handled correctly by
+ * `angular.copy`. Note that since this functions is used by the change detection code, this
+ * means binding or watching objects of these types (or that include these types) might not work
+ * correctly.
+ * - [`File`](https://developer.mozilla.org/docs/Web/API/File)
+ * - [`Map`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map)
+ * - [`ImageData`](https://developer.mozilla.org/docs/Web/API/ImageData)
+ * - [`MediaStream`](https://developer.mozilla.org/docs/Web/API/MediaStream)
+ * - [`Set`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Set)
+ * - [`WeakMap`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/WeakMap)
+ * - [`getter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get)/
+ *   [`setter`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set)
+ *
+ * @param {*} source The source that will be used to make a copy. Can be any type, including
+ *     primitives, `null`, and `undefined`.
+ * @param {(Object|Array)=} destination Destination into which the source is copied. If provided,
+ *     must be of the same type as `source`.
  * @returns {*} The copy or updated `destination`, if `destination` was specified.
  *
  * @example
@@ -859,7 +982,7 @@ function arrayRemove(array, value) {
           <button ng-click="update(user)">SAVE</button>
         </form>
         <pre>form = {{user | json}}</pre>
-        <pre>master = {{master | json}}</pre>
+        <pre>leader = {{leader | json}}</pre>
       </div>
     </file>
     <file name="script.js">
@@ -867,16 +990,16 @@ function arrayRemove(array, value) {
       angular.
         module('copyExample', []).
         controller('ExampleController', ['$scope', function($scope) {
-          $scope.master = {};
+          $scope.leader = {};
 
           $scope.reset = function() {
             // Example with 1 argument
-            $scope.user = angular.copy($scope.master);
+            $scope.user = angular.copy($scope.leader);
           };
 
           $scope.update = function(user) {
             // Example with 2 arguments
-            angular.copy(user, $scope.master);
+            angular.copy(user, $scope.leader);
           };
 
           $scope.reset();
@@ -884,9 +1007,10 @@ function arrayRemove(array, value) {
     </file>
   </example>
  */
-function copy(source, destination) {
+function copy(source, destination, maxDepth) {
   var stackSource = [];
   var stackDest = [];
+  maxDepth = isValidObjectMaxDepth(maxDepth) ? maxDepth : NaN;
 
   if (destination) {
     if (isTypedArray(destination) || isArrayBuffer(destination)) {
@@ -909,35 +1033,39 @@ function copy(source, destination) {
 
     stackSource.push(source);
     stackDest.push(destination);
-    return copyRecurse(source, destination);
+    return copyRecurse(source, destination, maxDepth);
   }
 
-  return copyElement(source);
+  return copyElement(source, maxDepth);
 
-  function copyRecurse(source, destination) {
+  function copyRecurse(source, destination, maxDepth) {
+    maxDepth--;
+    if (maxDepth < 0) {
+      return '...';
+    }
     var h = destination.$$hashKey;
     var key;
     if (isArray(source)) {
       for (var i = 0, ii = source.length; i < ii; i++) {
-        destination.push(copyElement(source[i]));
+        destination.push(copyElement(source[i], maxDepth));
       }
     } else if (isBlankObject(source)) {
       // createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty
       for (key in source) {
-        destination[key] = copyElement(source[key]);
+        destination[key] = copyElement(source[key], maxDepth);
       }
     } else if (source && typeof source.hasOwnProperty === 'function') {
       // Slow path, which must rely on hasOwnProperty
       for (key in source) {
         if (source.hasOwnProperty(key)) {
-          destination[key] = copyElement(source[key]);
+          destination[key] = copyElement(source[key], maxDepth);
         }
       }
     } else {
       // Slowest path --- hasOwnProperty can't be called as a method
       for (key in source) {
         if (hasOwnProperty.call(source, key)) {
-          destination[key] = copyElement(source[key]);
+          destination[key] = copyElement(source[key], maxDepth);
         }
       }
     }
@@ -945,7 +1073,7 @@ function copy(source, destination) {
     return destination;
   }
 
-  function copyElement(source) {
+  function copyElement(source, maxDepth) {
     // Simple values
     if (!isObject(source)) {
       return source;
@@ -974,7 +1102,7 @@ function copy(source, destination) {
     stackDest.push(destination);
 
     return needsRecurse
-      ? copyRecurse(source, destination)
+      ? copyRecurse(source, destination, maxDepth)
       : destination;
   }
 
@@ -1025,6 +1153,10 @@ function copy(source, destination) {
 }
 
 
+// eslint-disable-next-line no-self-compare
+function simpleCompare(a, b) { return a === b || (a !== a && b !== b); }
+
+
 /**
  * @ngdoc function
  * @name angular.equals
@@ -1105,7 +1237,7 @@ function equals(o1, o2) {
       }
     } else if (isDate(o1)) {
       if (!isDate(o2)) return false;
-      return equals(o1.getTime(), o2.getTime());
+      return simpleCompare(o1.getTime(), o2.getTime());
     } else if (isRegExp(o1)) {
       if (!isRegExp(o2)) return false;
       return o1.toString() === o2.toString();
@@ -1178,7 +1310,7 @@ var csp = function() {
  * used to force either jqLite by leaving ng-jq blank or setting the name of
  * the jquery variable under window (eg. jQuery).
  *
- * Since angular looks for this directive when it is loaded (doesn't wait for the
+ * Since AngularJS looks for this directive when it is loaded (doesn't wait for the
  * DOMContentLoaded event), it must be placed on an element that comes before the script
  * which loads angular. Also, only the first instance of `ng-jq` will be used and all
  * others ignored.
@@ -1291,7 +1423,7 @@ function toJsonReplacer(key, value) {
  *
  * @description
  * Serializes input into a JSON-formatted string. Properties with leading $$ characters will be
- * stripped since angular uses this notation internally.
+ * stripped since AngularJS uses this notation internally.
  *
  * @param {Object|Array|Date|string|number|boolean} obj Input to be serialized into JSON.
  * @param {boolean|number} [pretty=2] If set to true, the JSON output will contain newlines and whitespace.
@@ -1349,6 +1481,7 @@ function fromJson(json) {
 
 var ALL_COLONS = /:/g;
 function timezoneToOffset(timezone, fallback) {
+  // Support: IE 9-11 only, Edge 13-15+
   // IE/Edge do not "understand" colon (`:`) in timezone
   timezone = timezone.replace(ALL_COLONS, '');
   var requestedTimezoneOffset = Date.parse('Jan 01, 1970 00:00:00 ' + timezone) / 60000;
@@ -1375,13 +1508,8 @@ function convertTimezoneToLocal(date, timezone, reverse) {
  * @returns {string} Returns the string representation of the element.
  */
 function startingTag(element) {
-  element = jqLite(element).clone();
-  try {
-    // turns out IE does not let you set .html() on elements which
-    // are not allowed to have children. So we just ignore it.
-    element.empty();
-  } catch (e) { /* empty */ }
-  var elemHtml = jqLite('<div>').append(element).html();
+  element = jqLite(element).clone().empty();
+  var elemHtml = jqLite('<div></div>').append(element).html();
   try {
     return element[0].nodeType === NODE_TYPE_TEXT ? lowercase(elemHtml) :
         elemHtml.
@@ -1484,7 +1612,7 @@ function encodeUriSegment(val) {
  * This method is intended for encoding *key* or *value* parts of query component. We need a custom
  * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
  * encoded per http://tools.ietf.org/html/rfc3986:
- *    query       = *( pchar / "/" / "?" )
+ *    query         = *( pchar / "/" / "?" )
  *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
  *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
  *    pct-encoded   = "%" HEXDIG HEXDIG
@@ -1516,33 +1644,51 @@ function getNgAttribute(element, ngAttr) {
 
 function allowAutoBootstrap(document) {
   var script = document.currentScript;
-  var src = script && script.getAttribute('src');
 
-  if (!src) {
+  if (!script) {
+    // Support: IE 9-11 only
+    // IE does not have `document.currentScript`
     return true;
   }
 
-  var link = document.createElement('a');
-  link.href = src;
-
-  if (document.location.origin === link.origin) {
-    // Same-origin resources are always allowed, even for non-whitelisted schemes.
-    return true;
+  // If the `currentScript` property has been clobbered just return false, since this indicates a probable attack
+  if (!(script instanceof window.HTMLScriptElement || script instanceof window.SVGScriptElement)) {
+    return false;
   }
-  // Disabled bootstrapping unless angular.js was loaded from a known scheme used on the web.
-  // This is to prevent angular.js bundled with browser extensions from being used to bypass the
-  // content security policy in web pages and other browser extensions.
-  switch (link.protocol) {
-    case 'http:':
-    case 'https:':
-    case 'ftp:':
-    case 'blob:':
-    case 'file:':
-    case 'data:':
+
+  var attributes = script.attributes;
+  var srcs = [attributes.getNamedItem('src'), attributes.getNamedItem('href'), attributes.getNamedItem('xlink:href')];
+
+  return srcs.every(function(src) {
+    if (!src) {
       return true;
-    default:
+    }
+    if (!src.value) {
       return false;
-  }
+    }
+
+    var link = document.createElement('a');
+    link.href = src.value;
+
+    if (document.location.origin === link.origin) {
+      // Same-origin resources are always allowed, even for non-whitelisted schemes.
+      return true;
+    }
+    // Disabled bootstrapping unless angular.js was loaded from a known scheme used on the web.
+    // This is to prevent angular.js bundled with browser extensions from being used to bypass the
+    // content security policy in web pages and other browser extensions.
+    switch (link.protocol) {
+      case 'http:':
+      case 'https:':
+      case 'ftp:':
+      case 'blob:':
+      case 'file:':
+      case 'data:':
+        return true;
+      default:
+        return false;
+    }
+  });
 }
 
 // Cached as it has to run during loading so that document.currentScript is available.
@@ -1589,6 +1735,10 @@ var isAutoBootstrapAllowed = allowAutoBootstrap(window.document);
  * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`
  * would not be resolved to `3`.
  *
+ * @example
+ *
+ * ### Simple Usage
+ *
  * `ngApp` is the easiest, and most common way to bootstrap an application.
  *
  <example module="ngAppDemo" name="ng-app">
@@ -1605,6 +1755,10 @@ var isAutoBootstrapAllowed = allowAutoBootstrap(window.document);
    </file>
  </example>
  *
+ * @example
+ *
+ * ### With `ngStrictDi`
+ *
  * Using `ngStrictDi`, you would see something like this:
  *
  <example ng-app-included="true" name="strict-di">
@@ -1707,7 +1861,7 @@ function angularInit(element, bootstrap) {
   });
   if (appElement) {
     if (!isAutoBootstrapAllowed) {
-      window.console.error('Angular: disabling automatic bootstrap. <script> protocol indicates ' +
+      window.console.error('AngularJS: disabling automatic bootstrap. <script> protocol indicates ' +
           'an extension, document.location.href does not match.');
       return;
     }
@@ -1721,14 +1875,14 @@ function angularInit(element, bootstrap) {
  * @name angular.bootstrap
  * @module ng
  * @description
- * Use this function to manually start up angular application.
+ * Use this function to manually start up AngularJS application.
  *
  * For more information, see the {@link guide/bootstrap Bootstrap guide}.
  *
- * Angular will detect if it has been loaded into the browser more than once and only allow the
+ * AngularJS will detect if it has been loaded into the browser more than once and only allow the
  * first loaded script to be bootstrapped and will report a warning to the browser console for
  * each of the subsequent scripts. This prevents strange results in applications, where otherwise
- * multiple instances of Angular try to work on the DOM.
+ * multiple instances of AngularJS try to work on the DOM.
  *
  * <div class="alert alert-warning">
  * **Note:** Protractor based end-to-end tests cannot use this function to bootstrap manually.
@@ -1762,7 +1916,7 @@ function angularInit(element, bootstrap) {
  * </html>
  * ```
  *
- * @param {DOMElement} element DOM element which is the root of angular application.
+ * @param {DOMElement} element DOM element which is the root of AngularJS application.
  * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.
  *     Each item in the array should be the name of a predefined module or a (DI annotated)
  *     function that will be invoked by the injector as a `config` block.
@@ -1862,9 +2016,9 @@ function reloadWithDebugInfo() {
  * @name angular.getTestability
  * @module ng
  * @description
- * Get the testability service for the instance of Angular on the given
+ * Get the testability service for the instance of AngularJS on the given
  * element.
- * @param {DOMElement} element DOM element which is the root of angular application.
+ * @param {DOMElement} element DOM element which is the root of AngularJS application.
  */
 function getTestability(rootElement) {
   var injector = angular.element(rootElement).injector();
@@ -1898,43 +2052,63 @@ function bindJQuery() {
                                  window[jqName];   // use jQuery specified by `ngJq`
 
   // Use jQuery if it exists with proper functionality, otherwise default to us.
-  // Angular 1.2+ requires jQuery 1.7+ for on()/off() support.
-  // Angular 1.3+ technically requires at least jQuery 2.1+ but it may work with older
+  // AngularJS 1.2+ requires jQuery 1.7+ for on()/off() support.
+  // AngularJS 1.3+ technically requires at least jQuery 2.1+ but it may work with older
   // versions. It will not work for sure with jQuery <1.7, though.
   if (jQuery && jQuery.fn.on) {
     jqLite = jQuery;
     extend(jQuery.fn, {
       scope: JQLitePrototype.scope,
       isolateScope: JQLitePrototype.isolateScope,
-      controller: JQLitePrototype.controller,
+      controller: /** @type {?} */ (JQLitePrototype).controller,
       injector: JQLitePrototype.injector,
       inheritedData: JQLitePrototype.inheritedData
     });
-
-    // All nodes removed from the DOM via various jQuery APIs like .remove()
-    // are passed through jQuery.cleanData. Monkey-patch this method to fire
-    // the $destroy event on all removed nodes.
-    originalCleanData = jQuery.cleanData;
-    jQuery.cleanData = function(elems) {
-      var events;
-      for (var i = 0, elem; (elem = elems[i]) != null; i++) {
-        events = jQuery._data(elem, 'events');
-        if (events && events.$destroy) {
-          jQuery(elem).triggerHandler('$destroy');
-        }
-      }
-      originalCleanData(elems);
-    };
   } else {
     jqLite = JQLite;
   }
 
+  // All nodes removed from the DOM via various jqLite/jQuery APIs like .remove()
+  // are passed through jqLite/jQuery.cleanData. Monkey-patch this method to fire
+  // the $destroy event on all removed nodes.
+  originalCleanData = jqLite.cleanData;
+  jqLite.cleanData = function(elems) {
+    var events;
+    for (var i = 0, elem; (elem = elems[i]) != null; i++) {
+      events = (jqLite._data(elem) || {}).events;
+      if (events && events.$destroy) {
+        jqLite(elem).triggerHandler('$destroy');
+      }
+    }
+    originalCleanData(elems);
+  };
+
   angular.element = jqLite;
 
   // Prevent double-proxying.
   bindJQueryFired = true;
 }
 
+/**
+ * @ngdoc function
+ * @name angular.UNSAFE_restoreLegacyJqLiteXHTMLReplacement
+ * @module ng
+ * @kind function
+ *
+ * @description
+ * Restores the pre-1.8 behavior of jqLite that turns XHTML-like strings like
+ * `<div /><span />` to `<div></div><span></span>` instead of `<div><span></span></div>`.
+ * The new behavior is a security fix. Thus, if you need to call this function, please try to adjust
+ * your code for this change and remove your use of this function as soon as possible.
+
+ * Note that this only patches jqLite. If you use jQuery 3.5.0 or newer, please read the
+ * [jQuery 3.5 upgrade guide](https://jquery.com/upgrade-guide/3.5/) for more details
+ * about the workarounds.
+ */
+function UNSAFE_restoreLegacyJqLiteXHTMLReplacement() {
+  JQLite.legacyXHTMLReplacement = true;
+}
+
 /**
  * throw error if the argument is falsy.
  */
@@ -2032,6 +2206,27 @@ function createMap() {
   return Object.create(null);
 }
 
+function stringify(value) {
+  if (value == null) { // null || undefined
+    return '';
+  }
+  switch (typeof value) {
+    case 'string':
+      break;
+    case 'number':
+      value = '' + value;
+      break;
+    default:
+      if (hasCustomToString(value) && !isArray(value) && !isDate(value)) {
+        value = value.toString();
+      } else {
+        value = toJson(value);
+      }
+  }
+
+  return value;
+}
+
 var NODE_TYPE_ELEMENT = 1;
 var NODE_TYPE_ATTRIBUTE = 2;
 var NODE_TYPE_TEXT = 3;
@@ -2045,7 +2240,7 @@ var NODE_TYPE_DOCUMENT_FRAGMENT = 11;
  * @module ng
  * @description
  *
- * Interface for configuring angular {@link angular.module modules}.
+ * Interface for configuring AngularJS {@link angular.module modules}.
  */
 
 function setupModuleLoader(window) {
@@ -2072,9 +2267,9 @@ function setupModuleLoader(window) {
      * @module ng
      * @description
      *
-     * The `angular.module` is a global place for creating, registering and retrieving Angular
+     * The `angular.module` is a global place for creating, registering and retrieving AngularJS
      * modules.
-     * All modules (angular core or 3rd party) that should be available to an application must be
+     * All modules (AngularJS core or 3rd party) that should be available to an application must be
      * registered using this mechanism.
      *
      * Passing one argument retrieves an existing {@link angular.Module},
@@ -2118,6 +2313,9 @@ function setupModuleLoader(window) {
      * @returns {angular.Module} new module with the {@link angular.Module} api.
      */
     return function module(name, requires, configFn) {
+
+      var info = {};
+
       var assertNotHasOwnProperty = function(name, context) {
         if (name === 'hasOwnProperty') {
           throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
@@ -2153,6 +2351,45 @@ function setupModuleLoader(window) {
           _configBlocks: configBlocks,
           _runBlocks: runBlocks,
 
+          /**
+           * @ngdoc method
+           * @name angular.Module#info
+           * @module ng
+           *
+           * @param {Object=} info Information about the module
+           * @returns {Object|Module} The current info object for this module if called as a getter,
+           *                          or `this` if called as a setter.
+           *
+           * @description
+           * Read and write custom information about this module.
+           * For example you could put the version of the module in here.
+           *
+           * ```js
+           * angular.module('myModule', []).info({ version: '1.0.0' });
+           * ```
+           *
+           * The version could then be read back out by accessing the module elsewhere:
+           *
+           * ```
+           * var version = angular.module('myModule').info().version;
+           * ```
+           *
+           * You can also retrieve this information during runtime via the
+           * {@link $injector#modules `$injector.modules`} property:
+           *
+           * ```js
+           * var version = $injector.modules['myModule'].info().version;
+           * ```
+           */
+          info: function(value) {
+            if (isDefined(value)) {
+              if (!isObject(value)) throw ngMinErr('aobj', 'Argument \'{0}\' must be an object', 'value');
+              info = value;
+              return this;
+            }
+            return info;
+          },
+
           /**
            * @ngdoc property
            * @name angular.Module#requires
@@ -2242,7 +2479,7 @@ function setupModuleLoader(window) {
            * @description
            * See {@link auto.$provide#decorator $provide.decorator()}.
            */
-          decorator: invokeLaterAndSetModuleName('$provide', 'decorator'),
+          decorator: invokeLaterAndSetModuleName('$provide', 'decorator', configBlocks),
 
           /**
            * @ngdoc method
@@ -2282,13 +2519,13 @@ function setupModuleLoader(window) {
            * @ngdoc method
            * @name angular.Module#filter
            * @module ng
-           * @param {string} name Filter name - this must be a valid angular expression identifier
+           * @param {string} name Filter name - this must be a valid AngularJS expression identifier
            * @param {Function} filterFactory Factory function for creating new instance of filter.
            * @description
            * See {@link ng.$filterProvider#register $filterProvider.register()}.
            *
            * <div class="alert alert-warning">
-           * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.
+           * **Note:** Filter names must be valid AngularJS {@link expression} identifiers, such as `uppercase` or `orderBy`.
            * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace
            * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores
            * (`myapp_subsection_filterx`).
@@ -2325,7 +2562,8 @@ function setupModuleLoader(window) {
            * @ngdoc method
            * @name angular.Module#component
            * @module ng
-           * @param {string} name Name of the component in camel-case (i.e. myComp which will match as my-comp)
+           * @param {string|Object} name Name of the component in camelCase (i.e. `myComp` which will match `<my-comp>`),
+           *    or an object map of components where the keys are the names and the values are the component definition objects.
            * @param {Object} options Component definition object (a simplified
            *    {@link ng.$compile#directive-definition-object directive definition object})
            *
@@ -2341,7 +2579,13 @@ function setupModuleLoader(window) {
            * @param {Function} configFn Execute this function on module load. Useful for service
            *    configuration.
            * @description
-           * Use this method to register work which needs to be performed on module loading.
+           * Use this method to configure services by injecting their
+           * {@link angular.Module#provider `providers`}, e.g. for adding routes to the
+           * {@link ngRoute.$routeProvider $routeProvider}.
+           *
+           * Note that you can only inject {@link angular.Module#provider `providers`} and
+           * {@link angular.Module#constant `constants`} into this function.
+           *
            * For more about how to configure services, see
            * {@link providers#provider-recipe Provider Recipe}.
            */
@@ -2388,10 +2632,11 @@ function setupModuleLoader(window) {
          * @param {string} method
          * @returns {angular.Module}
          */
-        function invokeLaterAndSetModuleName(provider, method) {
+        function invokeLaterAndSetModuleName(provider, method, queue) {
+          if (!queue) queue = invokeQueue;
           return function(recipeName, factoryFunction) {
             if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name;
-            invokeQueue.push([provider, method, arguments]);
+            queue.push([provider, method, arguments]);
             return moduleInstance;
           };
         }
@@ -2428,11 +2673,19 @@ function shallowCopy(src, dst) {
   return dst || src;
 }
 
-/* global toDebugString: true */
+/* exported toDebugString */
 
-function serializeObject(obj) {
+function serializeObject(obj, maxDepth) {
   var seen = [];
 
+  // There is no direct way to stringify object until reaching a specific depth
+  // and a very deep object can cause a performance issue, so we copy the object
+  // based on this specific depth and then stringify it.
+  if (isValidObjectMaxDepth(maxDepth)) {
+    // This file is also included in `angular-loader`, so `copy()` might not always be available in
+    // the closure. Therefore, it is lazily retrieved as `angular.copy()` when needed.
+    obj = angular.copy(obj, null, maxDepth);
+  }
   return JSON.stringify(obj, function(key, val) {
     val = toJsonReplacer(key, val);
     if (isObject(val)) {
@@ -2445,13 +2698,13 @@ function serializeObject(obj) {
   });
 }
 
-function toDebugString(obj) {
+function toDebugString(obj, maxDepth) {
   if (typeof obj === 'function') {
     return obj.toString().replace(/ \{[\s\S]*$/, '');
   } else if (isUndefined(obj)) {
     return 'undefined';
   } else if (typeof obj !== 'string') {
-    return serializeObject(obj);
+    return serializeObject(obj, maxDepth);
   }
   return obj;
 }
@@ -2463,7 +2716,7 @@ function toDebugString(obj) {
 
   htmlAnchorDirective,
   inputDirective,
-  inputDirective,
+  hiddenInputBrowserCacheDirective,
   formDirective,
   scriptDirective,
   selectDirective,
@@ -2484,6 +2737,7 @@ function toDebugString(obj) {
   ngInitDirective,
   ngNonBindableDirective,
   ngPluralizeDirective,
+  ngRefDirective,
   ngRepeatDirective,
   ngShowDirective,
   ngStyleDirective,
@@ -2520,12 +2774,13 @@ function toDebugString(obj) {
   $ControllerProvider,
   $DateProvider,
   $DocumentProvider,
+  $$IsDocumentHiddenProvider,
   $ExceptionHandlerProvider,
   $FilterProvider,
   $$ForceReflowProvider,
   $InterpolateProvider,
+  $$IntervalFactoryProvider,
   $IntervalProvider,
-  $$HashMapProvider,
   $HttpProvider,
   $HttpParamSerializerProvider,
   $HttpParamSerializerJQLikeProvider,
@@ -2534,6 +2789,7 @@ function toDebugString(obj) {
   $jsonpCallbacksProvider,
   $LocationProvider,
   $LogProvider,
+  $$MapProvider,
   $ParseProvider,
   $RootScopeProvider,
   $QProvider,
@@ -2542,6 +2798,7 @@ function toDebugString(obj) {
   $SceProvider,
   $SceDelegateProvider,
   $SnifferProvider,
+  $$TaskTrackerFactoryProvider,
   $TemplateCacheProvider,
   $TemplateRequestProvider,
   $$TestabilityProvider,
@@ -2571,16 +2828,17 @@ function toDebugString(obj) {
 var version = {
   // These placeholder strings will be replaced by grunt's `build` task.
   // They need to be double- or single-quoted.
-  full: '1.5.11',
+  full: '1.8.0',
   major: 1,
-  minor: 5,
-  dot: 11,
-  codeName: 'princely-quest'
+  minor: 8,
+  dot: 0,
+  codeName: 'nested-vaccination'
 };
 
 
 function publishExternalAPI(angular) {
   extend(angular, {
+    'errorHandlingConfig': errorHandlingConfig,
     'bootstrap': bootstrap,
     'copy': copy,
     'extend': extend,
@@ -2604,13 +2862,17 @@ function publishExternalAPI(angular) {
     'isArray': isArray,
     'version': version,
     'isDate': isDate,
-    'lowercase': lowercase,
-    'uppercase': uppercase,
     'callbacks': {$$counter: 0},
     'getTestability': getTestability,
+    'reloadWithDebugInfo': reloadWithDebugInfo,
+    'UNSAFE_restoreLegacyJqLiteXHTMLReplacement': UNSAFE_restoreLegacyJqLiteXHTMLReplacement,
     '$$minErr': minErr,
     '$$csp': csp,
-    'reloadWithDebugInfo': reloadWithDebugInfo
+    '$$encodeUriSegment': encodeUriSegment,
+    '$$encodeUriQuery': encodeUriQuery,
+    '$$lowercase': lowercase,
+    '$$stringify': stringify,
+    '$$uppercase': uppercase
   });
 
   angularModule = setupModuleLoader(window);
@@ -2645,6 +2907,7 @@ function publishExternalAPI(angular) {
             ngInit: ngInitDirective,
             ngNonBindable: ngNonBindableDirective,
             ngPluralize: ngPluralizeDirective,
+            ngRef: ngRefDirective,
             ngRepeat: ngRepeatDirective,
             ngShow: ngShowDirective,
             ngStyle: ngStyleDirective,
@@ -2668,7 +2931,8 @@ function publishExternalAPI(angular) {
             ngModelOptions: ngModelOptionsDirective
         }).
         directive({
-          ngInclude: ngIncludeFillContentDirective
+          ngInclude: ngIncludeFillContentDirective,
+          input: hiddenInputBrowserCacheDirective
         }).
         directive(ngAttributeAliasDirectives).
         directive(ngEventDirectives);
@@ -2684,11 +2948,13 @@ function publishExternalAPI(angular) {
         $cacheFactory: $CacheFactoryProvider,
         $controller: $ControllerProvider,
         $document: $DocumentProvider,
+        $$isDocumentHidden: $$IsDocumentHiddenProvider,
         $exceptionHandler: $ExceptionHandlerProvider,
         $filter: $FilterProvider,
         $$forceReflow: $$ForceReflowProvider,
         $interpolate: $InterpolateProvider,
         $interval: $IntervalProvider,
+        $$intervalFactory: $$IntervalFactoryProvider,
         $http: $HttpProvider,
         $httpParamSerializer: $HttpParamSerializerProvider,
         $httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider,
@@ -2704,6 +2970,7 @@ function publishExternalAPI(angular) {
         $sce: $SceProvider,
         $sceDelegate: $SceDelegateProvider,
         $sniffer: $SnifferProvider,
+        $$taskTrackerFactory: $$TaskTrackerFactoryProvider,
         $templateCache: $TemplateCacheProvider,
         $templateRequest: $TemplateRequestProvider,
         $$testability: $$TestabilityProvider,
@@ -2711,11 +2978,12 @@ function publishExternalAPI(angular) {
         $window: $WindowProvider,
         $$rAF: $$RAFProvider,
         $$jqLite: $$jqLiteProvider,
-        $$HashMap: $$HashMapProvider,
+        $$Map: $$MapProvider,
         $$cookieReader: $$CookieReaderProvider
       });
     }
-  ]);
+  ])
+  .info({ angularVersion: '1.8.0' });
 }
 
 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
@@ -2729,9 +2997,8 @@ function publishExternalAPI(angular) {
  *     Or gives undesired access to variables likes document or window?    *
  * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
 
-/* global JQLitePrototype: true,
-  addEventListenerFn: true,
-  removeEventListenerFn: true,
+/* global
+  JQLitePrototype: true,
   BOOLEAN_ATTR: true,
   ALIASED_ATTR: true
 */
@@ -2751,31 +3018,32 @@ function publishExternalAPI(angular) {
  *
  * If jQuery is available, `angular.element` is an alias for the
  * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`
- * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or **jqLite**.
+ * delegates to AngularJS's built-in subset of jQuery, called "jQuery lite" or **jqLite**.
  *
  * jqLite is a tiny, API-compatible subset of jQuery that allows
- * Angular to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most
+ * AngularJS to manipulate the DOM in a cross-browser compatible way. jqLite implements only the most
  * commonly needed functionality with the goal of having a very small footprint.
  *
  * To use `jQuery`, simply ensure it is loaded before the `angular.js` file. You can also use the
  * {@link ngJq `ngJq`} directive to specify that jqlite should be used over jQuery, or to use a
  * specific version of jQuery if multiple versions exist on the page.
  *
- * <div class="alert alert-info">**Note:** All element references in Angular are always wrapped with jQuery or
+ * <div class="alert alert-info">**Note:** All element references in AngularJS are always wrapped with jQuery or
  * jqLite (such as the element argument in a directive's compile / link function). They are never raw DOM references.</div>
  *
  * <div class="alert alert-warning">**Note:** Keep in mind that this function will not find elements
  * by tag name / CSS selector. For lookups by tag name, try instead `angular.element(document).find(...)`
  * or `$document.find()`, or use the standard DOM APIs, e.g. `document.querySelectorAll()`.</div>
  *
- * ## Angular's jqLite
+ * ## AngularJS's jqLite
  * jqLite provides only the following jQuery methods:
  *
  * - [`addClass()`](http://api.jquery.com/addClass/) - Does not support a function as first argument
  * - [`after()`](http://api.jquery.com/after/)
- * - [`append()`](http://api.jquery.com/append/)
+ * - [`append()`](http://api.jquery.com/append/) - Contrary to jQuery, this doesn't clone elements
+ *   so will not work correctly when invoked on a jqLite object containing more than one DOM node
  * - [`attr()`](http://api.jquery.com/attr/) - Does not support functions as parameters
- * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData
+ * - [`bind()`](http://api.jquery.com/bind/) (_deprecated_, use [`on()`](http://api.jquery.com/on/)) - Does not support namespaces, selectors or eventData
  * - [`children()`](http://api.jquery.com/children/) - Does not support selectors
  * - [`clone()`](http://api.jquery.com/clone/)
  * - [`contents()`](http://api.jquery.com/contents/)
@@ -2795,7 +3063,7 @@ function publishExternalAPI(angular) {
  * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors
  * - [`prepend()`](http://api.jquery.com/prepend/)
  * - [`prop()`](http://api.jquery.com/prop/)
- * - [`ready()`](http://api.jquery.com/ready/)
+ * - [`ready()`](http://api.jquery.com/ready/) (_deprecated_, use `angular.element(callback)` instead of `angular.element(document).ready(callback)`)
  * - [`remove()`](http://api.jquery.com/remove/)
  * - [`removeAttr()`](http://api.jquery.com/removeAttr/) - Does not support multiple attributes
  * - [`removeClass()`](http://api.jquery.com/removeClass/) - Does not support a function as first argument
@@ -2804,12 +3072,22 @@ function publishExternalAPI(angular) {
  * - [`text()`](http://api.jquery.com/text/)
  * - [`toggleClass()`](http://api.jquery.com/toggleClass/) - Does not support a function as first argument
  * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers
- * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces or event object as parameter
+ * - [`unbind()`](http://api.jquery.com/unbind/) (_deprecated_, use [`off()`](http://api.jquery.com/off/)) - Does not support namespaces or event object as parameter
  * - [`val()`](http://api.jquery.com/val/)
  * - [`wrap()`](http://api.jquery.com/wrap/)
  *
+ * jqLite also provides a method restoring pre-1.8 insecure treatment of XHTML-like tags.
+ * This legacy behavior turns input like `<div /><span />` to `<div></div><span></span>`
+ * instead of `<div><span></span></div>` like version 1.8 & newer do. To restore it, invoke:
+ * ```js
+ * angular.UNSAFE_restoreLegacyJqLiteXHTMLReplacement();
+ * ```
+ * Note that this only patches jqLite. If you use jQuery 3.5.0 or newer, please read the
+ * [jQuery 3.5 upgrade guide](https://jquery.com/upgrade-guide/3.5/) for more details
+ * about the workarounds.
+ *
  * ## jQuery/jqLite Extras
- * Angular also provides the following additional methods and events to both jQuery and jqLite:
+ * AngularJS also provides the following additional methods and events to both jQuery and jqLite:
  *
  * ### Events
  * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event
@@ -2842,13 +3120,7 @@ function publishExternalAPI(angular) {
 JQLite.expando = 'ng339';
 
 var jqCache = JQLite.cache = {},
-    jqId = 1,
-    addEventListenerFn = function(element, type, fn) {
-      element.addEventListener(type, fn, false);
-    },
-    removeEventListenerFn = function(element, type, fn) {
-      element.removeEventListener(type, fn, false);
-    };
+    jqId = 1;
 
 /*
  * !!! This is an undocumented "private" function !!!
@@ -2861,22 +3133,31 @@ JQLite._data = function(node) {
 function jqNextId() { return ++jqId; }
 
 
-var SPECIAL_CHARS_REGEXP = /([:\-_]+(.))/g;
-var MOZ_HACK_REGEXP = /^moz([A-Z])/;
+var DASH_LOWERCASE_REGEXP = /-([a-z])/g;
+var MS_HACK_REGEXP = /^-ms-/;
 var MOUSE_EVENT_MAP = { mouseleave: 'mouseout', mouseenter: 'mouseover' };
 var jqLiteMinErr = minErr('jqLite');
 
 /**
- * Converts snake_case to camelCase.
- * Also there is special case for Moz prefix starting with upper case letter.
+ * Converts kebab-case to camelCase.
+ * There is also a special case for the ms prefix starting with a lowercase letter.
  * @param name Name to normalize
  */
-function camelCase(name) {
-  return name.
-    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
-      return offset ? letter.toUpperCase() : letter;
-    }).
-    replace(MOZ_HACK_REGEXP, 'Moz$1');
+function cssKebabToCamel(name) {
+    return kebabToCamel(name.replace(MS_HACK_REGEXP, 'ms-'));
+}
+
+function fnCamelCaseReplace(all, letter) {
+  return letter.toUpperCase();
+}
+
+/**
+ * Converts kebab-case to camelCase.
+ * @param name Name to normalize
+ */
+function kebabToCamel(name) {
+  return name
+    .replace(DASH_LOWERCASE_REGEXP, fnCamelCaseReplace);
 }
 
 var SINGLE_TAG_REGEXP = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/;
@@ -2884,20 +3165,36 @@ var HTML_REGEXP = /<|&#?\w+;/;
 var TAG_NAME_REGEXP = /<([\w:-]+)/;
 var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi;
 
+// Table parts need to be wrapped with `<table>` or they're
+// stripped to their contents when put in a div.
+// XHTML parsers do not magically insert elements in the
+// same way that tag soup parsers do, so we cannot shorten
+// this by omitting <tbody> or other required elements.
 var wrapMap = {
-  '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, '', '']
+  thead: ['table'],
+  col: ['colgroup', 'table'],
+  tr: ['tbody', 'table'],
+  td: ['tr', 'tbody', 'table']
 };
 
-wrapMap.optgroup = wrapMap.option;
 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
 wrapMap.th = wrapMap.td;
 
+// Support: IE <10 only
+// IE 9 requires an option wrapper & it needs to have the whole table structure
+// set up in advance; assigning `"<td></td>"` to `tr.innerHTML` doesn't work, etc.
+var wrapMapIE9 = {
+  option: [1, '<select multiple="multiple">', '</select>'],
+  _default: [0, '', '']
+};
+
+for (var key in wrapMap) {
+  var wrapMapValueClosing = wrapMap[key];
+  var wrapMapValue = wrapMapValueClosing.slice().reverse();
+  wrapMapIE9[key] = [wrapMapValue.length, '<' + wrapMapValue.join('><') + '>', '</' + wrapMapValueClosing.join('></') + '>'];
+}
+
+wrapMapIE9.optgroup = wrapMapIE9.option;
 
 function jqLiteIsTextNode(html) {
   return !HTML_REGEXP.test(html);
@@ -2917,14 +3214,8 @@ function jqLiteHasData(node) {
   return false;
 }
 
-function jqLiteCleanData(nodes) {
-  for (var i = 0, ii = nodes.length; i < ii; i++) {
-    jqLiteRemoveData(nodes[i]);
-  }
-}
-
 function jqLiteBuildFragment(html, context) {
-  var tmp, tag, wrap,
+  var tmp, tag, wrap, finalHtml,
       fragment = context.createDocumentFragment(),
       nodes = [], i;
 
@@ -2935,13 +3226,30 @@ function jqLiteBuildFragment(html, context) {
     // Convert html into DOM nodes
     tmp = fragment.appendChild(context.createElement('div'));
     tag = (TAG_NAME_REGEXP.exec(html) || ['', ''])[1].toLowerCase();
-    wrap = wrapMap[tag] || wrapMap._default;
-    tmp.innerHTML = wrap[1] + html.replace(XHTML_TAG_REGEXP, '<$1></$2>') + wrap[2];
+    finalHtml = JQLite.legacyXHTMLReplacement ?
+      html.replace(XHTML_TAG_REGEXP, '<$1></$2>') :
+      html;
 
-    // Descend through wrappers to the right content
-    i = wrap[0];
-    while (i--) {
-      tmp = tmp.lastChild;
+    if (msie < 10) {
+      wrap = wrapMapIE9[tag] || wrapMapIE9._default;
+      tmp.innerHTML = wrap[1] + finalHtml + wrap[2];
+
+      // Descend through wrappers to the right content
+      i = wrap[0];
+      while (i--) {
+        tmp = tmp.firstChild;
+      }
+    } else {
+      wrap = wrapMap[tag] || [];
+
+      // Create wrappers & descend into them
+      i = wrap.length;
+      while (--i > -1) {
+        tmp.appendChild(window.document.createElement(wrap[i]));
+        tmp = tmp.firstChild;
+      }
+
+      tmp.innerHTML = finalHtml;
     }
 
     nodes = concat(nodes, tmp.childNodes);
@@ -3013,6 +3321,8 @@ function JQLite(element) {
 
   if (argIsString) {
     jqLiteAddNodes(this, jqLiteParseHTML(element));
+  } else if (isFunction(element)) {
+    jqLiteReady(element);
   } else {
     jqLiteAddNodes(this, element);
   }
@@ -3023,13 +3333,32 @@ function jqLiteClone(element) {
 }
 
 function jqLiteDealoc(element, onlyDescendants) {
-  if (!onlyDescendants) jqLiteRemoveData(element);
+  if (!onlyDescendants && jqLiteAcceptsData(element)) jqLite.cleanData([element]);
 
   if (element.querySelectorAll) {
-    var descendants = element.querySelectorAll('*');
-    for (var i = 0, l = descendants.length; i < l; i++) {
-      jqLiteRemoveData(descendants[i]);
-    }
+    jqLite.cleanData(element.querySelectorAll('*'));
+  }
+}
+
+function isEmptyObject(obj) {
+  var name;
+
+  for (name in obj) {
+    return false;
+  }
+  return true;
+}
+
+function removeIfEmptyData(element) {
+  var expandoId = element.ng339;
+  var expandoStore = expandoId && jqCache[expandoId];
+
+  var events = expandoStore && expandoStore.events;
+  var data = expandoStore && expandoStore.data;
+
+  if ((!data || isEmptyObject(data)) && (!events || isEmptyObject(events))) {
+    delete jqCache[expandoId];
+    element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it
   }
 }
 
@@ -3045,7 +3374,7 @@ function jqLiteOff(element, type, fn, unsupported) {
   if (!type) {
     for (type in events) {
       if (type !== '$destroy') {
-        removeEventListenerFn(element, type, handle);
+        element.removeEventListener(type, handle);
       }
       delete events[type];
     }
@@ -3057,7 +3386,7 @@ function jqLiteOff(element, type, fn, unsupported) {
         arrayRemove(listenerFns || [], fn);
       }
       if (!(isDefined(fn) && listenerFns && listenerFns.length > 0)) {
-        removeEventListenerFn(element, type, handle);
+        element.removeEventListener(type, handle);
         delete events[type];
       }
     };
@@ -3069,6 +3398,8 @@ function jqLiteOff(element, type, fn, unsupported) {
       }
     });
   }
+
+  removeIfEmptyData(element);
 }
 
 function jqLiteRemoveData(element, name) {
@@ -3078,17 +3409,11 @@ function jqLiteRemoveData(element, name) {
   if (expandoStore) {
     if (name) {
       delete expandoStore.data[name];
-      return;
+    } else {
+      expandoStore.data = {};
     }
 
-    if (expandoStore.handle) {
-      if (expandoStore.events.$destroy) {
-        expandoStore.handle({}, '$destroy');
-      }
-      jqLiteOff(element);
-    }
-    delete jqCache[expandoId];
-    element.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it
+    removeIfEmptyData(element);
   }
 }
 
@@ -3108,6 +3433,7 @@ function jqLiteExpandoStore(element, createIfNecessary) {
 
 function jqLiteData(element, key, value) {
   if (jqLiteAcceptsData(element)) {
+    var prop;
 
     var isSimpleSetter = isDefined(value);
     var isSimpleGetter = !isSimpleSetter && key && !isObject(key);
@@ -3116,16 +3442,18 @@ function jqLiteData(element, key, value) {
     var data = expandoStore && expandoStore.data;
 
     if (isSimpleSetter) { // data('key', value)
-      data[key] = value;
+      data[kebabToCamel(key)] = value;
     } else {
       if (massGetter) {  // data()
         return data;
       } else {
         if (isSimpleGetter) { // data('key')
           // don't force creation of expandoStore if it doesn't exist yet
-          return data && data[key];
+          return data && data[kebabToCamel(key)];
         } else { // mass-setter: data({key1: val1, key2: val2})
-          extend(data, key);
+          for (prop in key) {
+            data[kebabToCamel(prop)] = key[prop];
+          }
         }
       }
     }
@@ -3140,13 +3468,18 @@ function jqLiteHasClass(element, selector) {
 
 function jqLiteRemoveClass(element, cssClasses) {
   if (cssClasses && element.setAttribute) {
+    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')
+                            .replace(/[\n\t]/g, ' ');
+    var newClasses = existingClasses;
+
     forEach(cssClasses.split(' '), function(cssClass) {
-      element.setAttribute('class', trim(
-          (' ' + (element.getAttribute('class') || '') + ' ')
-          .replace(/[\n\t]/g, ' ')
-          .replace(' ' + trim(cssClass) + ' ', ' '))
-      );
+      cssClass = trim(cssClass);
+      newClasses = newClasses.replace(' ' + cssClass + ' ', ' ');
     });
+
+    if (newClasses !== existingClasses) {
+      element.setAttribute('class', trim(newClasses));
+    }
   }
 }
 
@@ -3154,15 +3487,18 @@ function jqLiteAddClass(element, cssClasses) {
   if (cssClasses && element.setAttribute) {
     var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')
                             .replace(/[\n\t]/g, ' ');
+    var newClasses = existingClasses;
 
     forEach(cssClasses.split(' '), function(cssClass) {
       cssClass = trim(cssClass);
-      if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
-        existingClasses += cssClass + ' ';
+      if (newClasses.indexOf(' ' + cssClass + ' ') === -1) {
+        newClasses += cssClass + ' ';
       }
     });
 
-    element.setAttribute('class', trim(existingClasses));
+    if (newClasses !== existingClasses) {
+      element.setAttribute('class', trim(newClasses));
+    }
   }
 }
 
@@ -3244,29 +3580,32 @@ function jqLiteDocumentLoaded(action, win) {
   }
 }
 
+function jqLiteReady(fn) {
+  function trigger() {
+    window.document.removeEventListener('DOMContentLoaded', trigger);
+    window.removeEventListener('load', trigger);
+    fn();
+  }
+
+  // check if document is already loaded
+  if (window.document.readyState === 'complete') {
+    window.setTimeout(fn);
+  } else {
+    // We can not use jqLite since we are not done loading and jQuery could be loaded later.
+
+    // Works for modern browsers and IE9
+    window.document.addEventListener('DOMContentLoaded', trigger);
+
+    // Fallback to window.onload for others
+    window.addEventListener('load', trigger);
+  }
+}
+
 //////////////////////////////////////////
 // Functions which are declared directly.
 //////////////////////////////////////////
 var JQLitePrototype = JQLite.prototype = {
-  ready: function(fn) {
-    var fired = false;
-
-    function trigger() {
-      if (fired) return;
-      fired = true;
-      fn();
-    }
-
-    // check if document is already loaded
-    if (window.document.readyState === 'complete') {
-      window.setTimeout(trigger);
-    } else {
-      this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9
-      // we can not use jqLite since we are not done loading and jQuery could be loaded later.
-      // eslint-disable-next-line new-cap
-      JQLite(window).on('load', trigger); // fallback to window.onload for others
-    }
-  },
+  ready: jqLiteReady,
   toString: function() {
     var value = [];
     forEach(this, function(e) { value.push('' + e);});
@@ -3301,7 +3640,8 @@ var ALIASED_ATTR = {
   'ngMaxlength': 'maxlength',
   'ngMin': 'min',
   'ngMax': 'max',
-  'ngPattern': 'pattern'
+  'ngPattern': 'pattern',
+  'ngStep': 'step'
 };
 
 function getBooleanAttrName(element, name) {
@@ -3320,7 +3660,12 @@ forEach({
   data: jqLiteData,
   removeData: jqLiteRemoveData,
   hasData: jqLiteHasData,
-  cleanData: jqLiteCleanData
+  cleanData: function jqLiteCleanData(nodes) {
+    for (var i = 0, ii = nodes.length; i < ii; i++) {
+      jqLiteRemoveData(nodes[i]);
+      jqLiteOff(nodes[i]);
+    }
+  }
 }, function(fn, name) {
   JQLite[name] = fn;
 });
@@ -3352,7 +3697,7 @@ forEach({
   hasClass: jqLiteHasClass,
 
   css: function(element, name, value) {
-    name = camelCase(name);
+    name = cssKebabToCamel(name);
 
     if (isDefined(value)) {
       element.style[name] = value;
@@ -3362,33 +3707,33 @@ forEach({
   },
 
   attr: function(element, name, value) {
+    var ret;
     var nodeType = element.nodeType;
-    if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT) {
+    if (nodeType === NODE_TYPE_TEXT || nodeType === NODE_TYPE_ATTRIBUTE || nodeType === NODE_TYPE_COMMENT ||
+      !element.getAttribute) {
       return;
     }
+
     var lowercasedName = lowercase(name);
-    if (BOOLEAN_ATTR[lowercasedName]) {
-      if (isDefined(value)) {
-        if (value) {
-          element[name] = true;
-          element.setAttribute(name, lowercasedName);
-        } else {
-          element[name] = false;
-          element.removeAttribute(lowercasedName);
-        }
+    var isBooleanAttr = BOOLEAN_ATTR[lowercasedName];
+
+    if (isDefined(value)) {
+      // setter
+
+      if (value === null || (value === false && isBooleanAttr)) {
+        element.removeAttribute(name);
       } else {
-        return (element[name] ||
-                 (element.attributes.getNamedItem(name) || noop).specified)
-               ? lowercasedName
-               : undefined;
-      }
-    } else if (isDefined(value)) {
-      element.setAttribute(name, value);
-    } else if (element.getAttribute) {
-      // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code
-      // some elements (e.g. Document) don't have get attribute, so return undefined
-      var ret = element.getAttribute(name, 2);
-      // normalize non-existing attributes to undefined (as jQuery)
+        element.setAttribute(name, isBooleanAttr ? lowercasedName : value);
+      }
+    } else {
+      // getter
+
+      ret = element.getAttribute(name);
+
+      if (isBooleanAttr && ret !== null) {
+        ret = lowercasedName;
+      }
+      // Normalize non-existing attributes to undefined (as jQuery).
       return ret === null ? undefined : ret;
     }
   },
@@ -3423,7 +3768,7 @@ forEach({
             result.push(option.value || option.text);
           }
         });
-        return result.length === 0 ? null : result;
+        return result;
       }
       return element.value;
     }
@@ -3593,7 +3938,7 @@ forEach({
         eventFns = events[type] = [];
         eventFns.specialHandlerWrapper = specialHandlerWrapper;
         if (type !== '$destroy' && !noEventListener) {
-          addEventListenerFn(element, type, handle);
+          element.addEventListener(type, handle);
         }
       }
 
@@ -3848,50 +4193,74 @@ function hashKey(obj, nextUidFn) {
   return key;
 }
 
-/**
- * HashMap which can use objects as keys
- */
-function HashMap(array, isolatedUid) {
-  if (isolatedUid) {
-    var uid = 0;
-    this.nextUid = function() {
-      return ++uid;
-    };
-  }
-  forEach(array, this.put, this);
+// A minimal ES2015 Map implementation.
+// Should be bug/feature equivalent to the native implementations of supported browsers
+// (for the features required in Angular).
+// See https://kangax.github.io/compat-table/es6/#test-Map
+var nanKey = Object.create(null);
+function NgMapShim() {
+  this._keys = [];
+  this._values = [];
+  this._lastKey = NaN;
+  this._lastIndex = -1;
 }
-HashMap.prototype = {
-  /**
-   * Store key value pair
-   * @param key key to store can be any type
-   * @param value value to store can be any type
-   */
-  put: function(key, value) {
-    this[hashKey(key, this.nextUid)] = value;
+NgMapShim.prototype = {
+  _idx: function(key) {
+    if (key !== this._lastKey) {
+      this._lastKey = key;
+      this._lastIndex = this._keys.indexOf(key);
+    }
+    return this._lastIndex;
+  },
+  _transformKey: function(key) {
+    return isNumberNaN(key) ? nanKey : key;
   },
-
-  /**
-   * @param key
-   * @returns {Object} the value for the key
-   */
   get: function(key) {
-    return this[hashKey(key, this.nextUid)];
+    key = this._transformKey(key);
+    var idx = this._idx(key);
+    if (idx !== -1) {
+      return this._values[idx];
+    }
   },
+  has: function(key) {
+    key = this._transformKey(key);
+    var idx = this._idx(key);
+    return idx !== -1;
+  },
+  set: function(key, value) {
+    key = this._transformKey(key);
+    var idx = this._idx(key);
+    if (idx === -1) {
+      idx = this._lastIndex = this._keys.length;
+    }
+    this._keys[idx] = key;
+    this._values[idx] = value;
 
-  /**
-   * Remove the key/value pair
-   * @param key
-   */
-  remove: function(key) {
-    var value = this[key = hashKey(key, this.nextUid)];
-    delete this[key];
-    return value;
+    // Support: IE11
+    // Do not `return this` to simulate the partial IE11 implementation
+  },
+  delete: function(key) {
+    key = this._transformKey(key);
+    var idx = this._idx(key);
+    if (idx === -1) {
+      return false;
+    }
+    this._keys.splice(idx, 1);
+    this._values.splice(idx, 1);
+    this._lastKey = NaN;
+    this._lastIndex = -1;
+    return true;
   }
 };
 
-var $$HashMapProvider = [/** @this */function() {
+// For now, always use `NgMapShim`, even if `window.Map` is available. Some native implementations
+// are still buggy (often in subtle ways) and can cause hard-to-debug failures. When native `Map`
+// implementations get more stable, we can reconsider switching to `window.Map` (when available).
+var NgMap = NgMapShim;
+
+var $$MapProvider = [/** @this */function() {
   this.$get = [function() {
-    return HashMap;
+    return NgMap;
   }];
 }];
 
@@ -3925,8 +4294,8 @@ var $$HashMapProvider = [/** @this */function() {
  *   });
  * ```
  *
- * Sometimes you want to get access to the injector of a currently running Angular app
- * from outside Angular. Perhaps, you want to inject and compile some markup after the
+ * Sometimes you want to get access to the injector of a currently running AngularJS app
+ * from outside AngularJS. Perhaps, you want to inject and compile some markup after the
  * application has been bootstrapped. You can do this using the extra `injector()` added
  * to JQuery/jqLite elements. See {@link angular.element}.
  *
@@ -3966,11 +4335,7 @@ var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
 var $injectorMinErr = minErr('$injector');
 
 function stringifyFn(fn) {
-  // Support: Chrome 50-51 only
-  // Creating a new string by adding `' '` at the end, to hack around some bug in Chrome v50/51
-  // (See https://github.com/angular/angular.js/issues/14487.)
-  // TODO (gkalpak): Remove workaround when Chrome v52 is released
-  return Function.prototype.toString.call(fn) + ' ';
+  return Function.prototype.toString.call(fn);
 }
 
 function extractArgs(fn) {
@@ -4046,7 +4411,7 @@ function annotate(fn, strictDi, name) {
  *   })).toBe($injector);
  * ```
  *
- * # Injection Function Annotation
+ * ## Injection Function Annotation
  *
  * JavaScript does not have annotations, and annotations are needed for dependency injection. The
  * following are all valid ways of annotating function with injection arguments and are equivalent.
@@ -4064,7 +4429,7 @@ function annotate(fn, strictDi, name) {
  *   $injector.invoke(['serviceA', function(serviceA){}]);
  * ```
  *
- * ## Inference
+ * ### Inference
  *
  * In JavaScript calling `toString()` on a function returns the function definition. The definition
  * can then be parsed and the function arguments can be extracted. This method of discovering
@@ -4072,13 +4437,35 @@ function annotate(fn, strictDi, name) {
  * *NOTE:* This does not work with minification, and obfuscation tools since these tools change the
  * argument names.
  *
- * ## `$inject` Annotation
+ * ### `$inject` Annotation
  * By adding an `$inject` property onto a function the injection parameters can be specified.
  *
- * ## Inline
+ * ### Inline
  * As an array of injection names, where the last item in the array is the function to call.
  */
 
+/**
+ * @ngdoc property
+ * @name $injector#modules
+ * @type {Object}
+ * @description
+ * A hash containing all the modules that have been loaded into the
+ * $injector.
+ *
+ * You can use this property to find out information about a module via the
+ * {@link angular.Module#info `myModule.info(...)`} method.
+ *
+ * For example:
+ *
+ * ```
+ * var info = $injector.modules['ngAnimate'].info();
+ * ```
+ *
+ * **Do not use this property to attempt to modify the modules after the application
+ * has been bootstrapped.**
+ */
+
+
 /**
  * @ngdoc method
  * @name $injector#get
@@ -4141,7 +4528,7 @@ function annotate(fn, strictDi, name) {
  * function is invoked. There are three ways in which the function can be annotated with the needed
  * dependencies.
  *
- * # Argument names
+ * #### Argument names
  *
  * The simplest form is to extract the dependencies from the arguments of the function. This is done
  * by converting the function into a string using `toString()` method and extracting the argument
@@ -4161,7 +4548,7 @@ function annotate(fn, strictDi, name) {
  * This method does not work with code minification / obfuscation. For this reason the following
  * annotation strategies are supported.
  *
- * # The `$inject` property
+ * #### The `$inject` property
  *
  * If a function has an `$inject` property and its value is an array of strings, then the strings
  * represent names of services to be injected into the function.
@@ -4177,7 +4564,7 @@ function annotate(fn, strictDi, name) {
  *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
  * ```
  *
- * # The array notation
+ * #### The array notation
  *
  * It is often desirable to inline Injected functions and that's when setting the `$inject` property
  * is very inconvenient. In these situations using the array notation to specify the dependencies in
@@ -4214,7 +4601,45 @@ function annotate(fn, strictDi, name) {
  *
  * @returns {Array.<string>} The names of the services which the function requires.
  */
-
+/**
+ * @ngdoc method
+ * @name $injector#loadNewModules
+ *
+ * @description
+ *
+ * **This is a dangerous API, which you use at your own risk!**
+ *
+ * Add the specified modules to the current injector.
+ *
+ * This method will add each of the injectables to the injector and execute all of the config and run
+ * blocks for each module passed to the method.
+ *
+ * If a module has already been loaded into the injector then it will not be loaded again.
+ *
+ * * The application developer is responsible for loading the code containing the modules; and for
+ * ensuring that lazy scripts are not downloaded and executed more often that desired.
+ * * Previously compiled HTML will not be affected by newly loaded directives, filters and components.
+ * * Modules cannot be unloaded.
+ *
+ * You can use {@link $injector#modules `$injector.modules`} to check whether a module has been loaded
+ * into the injector, which may indicate whether the script has been executed already.
+ *
+ * @example
+ * Here is an example of loading a bundle of modules, with a utility method called `getScript`:
+ *
+ * ```javascript
+ * app.factory('loadModule', function($injector) {
+ *   return function loadModule(moduleName, bundleUrl) {
+ *     return getScript(bundleUrl).then(function() { $injector.loadNewModules([moduleName]); });
+ *   };
+ * })
+ * ```
+ *
+ * @param {Array<String|Function|Array>=} mods an array of modules to load into the application.
+ *     Each item in the array should be the name of a predefined module or a (DI annotated)
+ *     function that will be invoked by the injector as a `config` block.
+ *     See: {@link angular.module modules}
+ */
 
 
 /**
@@ -4227,7 +4652,7 @@ function annotate(fn, strictDi, name) {
  * with the {@link auto.$injector $injector}. Many of these functions are also exposed on
  * {@link angular.Module}.
  *
- * An Angular **service** is a singleton object created by a **service factory**.  These **service
+ * An AngularJS **service** is a singleton object created by a **service factory**.  These **service
  * factories** are functions which, in turn, are created by a **service provider**.
  * The **service providers** are constructor functions. When instantiated they must contain a
  * property called `$get`, which holds the **service factory** function.
@@ -4279,6 +4704,9 @@ function annotate(fn, strictDi, name) {
  * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the
  * console or not.
  *
+ * It is possible to inject other providers into the provider function,
+ * but the injected provider must have been defined before the one that requires it.
+ *
  * @param {string} name The name of the instance. NOTE: the provider will be available under `name +
                         'Provider'` key.
  * @param {(Object|function())} provider If the provider is:
@@ -4455,7 +4883,7 @@ function annotate(fn, strictDi, name) {
  *
  * Value services are similar to constant services, except that they cannot be injected into a
  * module configuration function (see {@link angular.Module#config}) but they can be overridden by
- * an Angular {@link auto.$provide#decorator decorator}.
+ * an AngularJS {@link auto.$provide#decorator decorator}.
  *
  * @param {string} name The name of the instance.
  * @param {*} value The value.
@@ -4486,7 +4914,7 @@ function annotate(fn, strictDi, name) {
  *
  * But unlike {@link auto.$provide#value value}, a constant can be
  * injected into a module configuration function (see {@link angular.Module#config}) and it cannot
- * be overridden by an Angular {@link auto.$provide#decorator decorator}.
+ * be overridden by an AngularJS {@link auto.$provide#decorator decorator}.
  *
  * @param {string} name The name of the constant.
  * @param {*} value The constant value.
@@ -4544,7 +4972,7 @@ function createInjector(modulesToLoad, strictDi) {
   var INSTANTIATING = {},
       providerSuffix = 'Provider',
       path = [],
-      loadedModules = new HashMap([], true),
+      loadedModules = new NgMap(),
       providerCache = {
         $provide: {
             provider: supportObject(provider),
@@ -4572,11 +5000,17 @@ function createInjector(modulesToLoad, strictDi) {
       instanceInjector = protoInstanceInjector;
 
   providerCache['$injector' + providerSuffix] = { $get: valueFn(protoInstanceInjector) };
+  instanceInjector.modules = providerInjector.modules = createMap();
   var runBlocks = loadModules(modulesToLoad);
   instanceInjector = protoInstanceInjector.get('$injector');
   instanceInjector.strictDi = strictDi;
   forEach(runBlocks, function(fn) { if (fn) instanceInjector.invoke(fn); });
 
+  instanceInjector.loadNewModules = function(mods) {
+    forEach(loadModules(mods), function(fn) { if (fn) instanceInjector.invoke(fn); });
+  };
+
+
   return instanceInjector;
 
   ////////////////////////////////////
@@ -4652,7 +5086,7 @@ function createInjector(modulesToLoad, strictDi) {
     var runBlocks = [], moduleFn;
     forEach(modulesToLoad, function(module) {
       if (loadedModules.get(module)) return;
-      loadedModules.put(module, true);
+      loadedModules.set(module, true);
 
       function runInvokeQueue(queue) {
         var i, ii;
@@ -4667,6 +5101,7 @@ function createInjector(modulesToLoad, strictDi) {
       try {
         if (isString(module)) {
           moduleFn = angularModule(module);
+          instanceInjector.modules[module] = moduleFn;
           runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);
           runInvokeQueue(moduleFn._invokeQueue);
           runInvokeQueue(moduleFn._configBlocks);
@@ -4744,14 +5179,16 @@ function createInjector(modulesToLoad, strictDi) {
     }
 
     function isClass(func) {
+      // Support: IE 9-11 only
       // IE 9-11 do not support classes and IE9 leaks with the code below.
-      if (msie <= 11) {
+      if (msie || typeof func !== 'function') {
         return false;
       }
-      // Support: Edge 12-13 only
-      // See: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/6156135/
-      return typeof func === 'function'
-        && /^(?:class\b|constructor\()/.test(stringifyFn(func));
+      var result = func.$$ngIsClass;
+      if (!isBoolean(result)) {
+        result = func.$$ngIsClass = /^class\b/.test(stringifyFn(func));
+      }
+      return result;
     }
 
     function invoke(fn, self, locals, serviceName) {
@@ -5134,7 +5571,7 @@ var $$CoreAnimateJsProvider = /** @this */ function() {
 // this is prefixed with Core since it conflicts with
 // the animateQueueProvider defined in ngAnimate/animateQueue.js
 var $$CoreAnimateQueueProvider = /** @this */ function() {
-  var postDigestQueue = new HashMap();
+  var postDigestQueue = new NgMap();
   var postDigestElements = [];
 
   this.$get = ['$$AnimateRunner', '$rootScope',
@@ -5213,7 +5650,7 @@ var $$CoreAnimateQueueProvider = /** @this */ function() {
               jqLiteRemoveClass(elm, toRemove);
             }
           });
-          postDigestQueue.remove(element);
+          postDigestQueue.delete(element);
         }
       });
       postDigestElements.length = 0;
@@ -5228,7 +5665,7 @@ var $$CoreAnimateQueueProvider = /** @this */ function() {
 
       if (classesAdded || classesRemoved) {
 
-        postDigestQueue.put(element, data);
+        postDigestQueue.set(element, data);
         postDigestElements.push(element);
 
         if (postDigestElements.length === 1) {
@@ -5253,6 +5690,8 @@ var $$CoreAnimateQueueProvider = /** @this */ function() {
  */
 var $AnimateProvider = ['$provide', /** @this */ function($provide) {
   var provider = this;
+  var classNameFilter = null;
+  var customFilter = null;
 
   this.$$registeredAnimations = Object.create(null);
 
@@ -5305,6 +5744,51 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
     $provide.factory(key, factory);
   };
 
+  /**
+   * @ngdoc method
+   * @name $animateProvider#customFilter
+   *
+   * @description
+   * Sets and/or returns the custom filter function that is used to "filter" animations, i.e.
+   * determine if an animation is allowed or not. When no filter is specified (the default), no
+   * animation will be blocked. Setting the `customFilter` value will only allow animations for
+   * which the filter function's return value is truthy.
+   *
+   * This allows to easily create arbitrarily complex rules for filtering animations, such as
+   * allowing specific events only, or enabling animations on specific subtrees of the DOM, etc.
+   * Filtering animations can also boost performance for low-powered devices, as well as
+   * applications containing a lot of structural operations.
+   *
+   * <div class="alert alert-success">
+   *   **Best Practice:**
+   *   Keep the filtering function as lean as possible, because it will be called for each DOM
+   *   action (e.g. insertion, removal, class change) performed by "animation-aware" directives.
+   *   See {@link guide/animations#which-directives-support-animations- here} for a list of built-in
+   *   directives that support animations.
+   *   Performing computationally expensive or time-consuming operations on each call of the
+   *   filtering function can make your animations sluggish.
+   * </div>
+   *
+   * **Note:** If present, `customFilter` will be checked before
+   * {@link $animateProvider#classNameFilter classNameFilter}.
+   *
+   * @param {Function=} filterFn - The filter function which will be used to filter all animations.
+   *   If a falsy value is returned, no animation will be performed. The function will be called
+   *   with the following arguments:
+   *   - **node** `{DOMElement}` - The DOM element to be animated.
+   *   - **event** `{String}` - The name of the animation event (e.g. `enter`, `leave`, `addClass`
+   *     etc).
+   *   - **options** `{Object}` - A collection of options/styles used for the animation.
+   * @return {Function} The current filter function or `null` if there is none set.
+   */
+  this.customFilter = function(filterFn) {
+    if (arguments.length === 1) {
+      customFilter = isFunction(filterFn) ? filterFn : null;
+    }
+
+    return customFilter;
+  };
+
   /**
    * @ngdoc method
    * @name $animateProvider#classNameFilter
@@ -5316,21 +5800,26 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
    * When setting the `classNameFilter` value, animations will only be performed on elements
    * that successfully match the filter expression. This in turn can boost performance
    * for low-powered devices as well as applications containing a lot of structural operations.
+   *
+   * **Note:** If present, `classNameFilter` will be checked after
+   * {@link $animateProvider#customFilter customFilter}. If `customFilter` is present and returns
+   * false, `classNameFilter` will not be checked.
+   *
    * @param {RegExp=} expression The className expression which will be checked against all animations
    * @return {RegExp} The current CSS className expression value. If null then there is no expression value
    */
   this.classNameFilter = function(expression) {
     if (arguments.length === 1) {
-      this.$$classNameFilter = (expression instanceof RegExp) ? expression : null;
-      if (this.$$classNameFilter) {
-        var reservedRegex = new RegExp('(\\s+|\\/)' + NG_ANIMATE_CLASSNAME + '(\\s+|\\/)');
-        if (reservedRegex.test(this.$$classNameFilter.toString())) {
-          throw $animateMinErr('nongcls','$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME);
-
+      classNameFilter = (expression instanceof RegExp) ? expression : null;
+      if (classNameFilter) {
+        var reservedRegex = new RegExp('[(\\s|\\/)]' + NG_ANIMATE_CLASSNAME + '[(\\s|\\/)]');
+        if (reservedRegex.test(classNameFilter.toString())) {
+          classNameFilter = null;
+          throw $animateMinErr('nongcls', '$animateProvider.classNameFilter(regex) prohibits accepting a regex value which matches/contains the "{0}" CSS class.', NG_ANIMATE_CLASSNAME);
         }
       }
     }
-    return this.$$classNameFilter;
+    return classNameFilter;
   };
 
   this.$get = ['$$animateQueue', function($$animateQueue) {
@@ -5391,14 +5880,39 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        * );
        * ```
        *
+       * <div class="alert alert-warning">
+       * **Note**: Generally, the events that are fired correspond 1:1 to `$animate` method names,
+       * e.g. {@link ng.$animate#addClass addClass()} will fire `addClass`, and {@link ng.ngClass}
+       * will fire `addClass` if classes are added, and `removeClass` if classes are removed.
+       * However, there are two exceptions:
+       *
+       * <ul>
+       *   <li>if both an {@link ng.$animate#addClass addClass()} and a
+       *   {@link ng.$animate#removeClass removeClass()} action are performed during the same
+       *   animation, the event fired will be `setClass`. This is true even for `ngClass`.</li>
+       *   <li>an {@link ng.$animate#animate animate()} call that adds and removes classes will fire
+       *   the `setClass` event, but if it either removes or adds classes,
+       *   it will fire `animate` instead.</li>
+       * </ul>
+       *
+       * </div>
+       *
        * @param {string} event the animation event that will be captured (e.g. enter, leave, move, addClass, removeClass, etc...)
        * @param {DOMElement} container the container element that will capture each of the animation events that are fired on itself
        *     as well as among its children
-       * @param {Function} callback the callback function that will be fired when the listener is triggered
+       * @param {Function} callback the callback function that will be fired when the listener is triggered.
        *
        * The arguments present in the callback function are:
        * * `element` - The captured DOM element that the animation was fired on.
        * * `phase` - The phase of the animation. The two possible phases are **start** (when the animation starts) and **close** (when it ends).
+       * * `data` - an object with these properties:
+       *     * addClass - `{string|null}` - space-separated CSS classes to add to the element
+       *     * removeClass - `{string|null}` - space-separated CSS classes to remove from the element
+       *     * from - `{Object|null}` - CSS properties & values at the beginning of the animation
+       *     * to - `{Object|null}` - CSS properties & values at the end of the animation
+       *
+       * Note that the callback does not trigger a scope digest. Wrap your call into a
+       * {@link $rootScope.Scope#$apply scope.$apply} to propagate changes to the scope.
        */
       on: $$animateQueue.on,
 
@@ -5438,7 +5952,7 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        * @name $animate#pin
        * @kind function
        * @description Associates the provided element with a host parent element to allow the element to be animated even if it exists
-       *    outside of the DOM structure of the Angular application. By doing so, any animation triggered via `$animate` can be issued on the
+       *    outside of the DOM structure of the AngularJS application. By doing so, any animation triggered via `$animate` can be issued on the
        *    element despite being outside the realm of the application or within another application. Say for example if the application
        *    was bootstrapped on an element that is somewhere inside of the `<body>` tag, but we wanted to allow for an element to be situated
        *    as a direct child of `document.body`, then this can be achieved by pinning the element via `$animate.pin(element)`. Keep in mind
@@ -5486,13 +6000,77 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        * @ngdoc method
        * @name $animate#cancel
        * @kind function
-       * @description Cancels the provided animation.
+       * @description Cancels the provided animation and applies the end state of the animation.
+       * Note that this does not cancel the underlying operation, e.g. the setting of classes or
+       * adding the element to the DOM.
        *
-       * @param {Promise} animationPromise The animation promise that is returned when an animation is started.
+       * @param {animationRunner} animationRunner An animation runner returned by an $animate function.
+       *
+       * @example
+        <example module="animationExample" deps="angular-animate.js" animations="true" name="animate-cancel">
+          <file name="app.js">
+            angular.module('animationExample', ['ngAnimate']).component('cancelExample', {
+              templateUrl: 'template.html',
+              controller: function($element, $animate) {
+                this.runner = null;
+
+                this.addClass = function() {
+                  this.runner = $animate.addClass($element.find('div'), 'red');
+                  var ctrl = this;
+                  this.runner.finally(function() {
+                    ctrl.runner = null;
+                  });
+                };
+
+                this.removeClass = function() {
+                  this.runner = $animate.removeClass($element.find('div'), 'red');
+                  var ctrl = this;
+                  this.runner.finally(function() {
+                    ctrl.runner = null;
+                  });
+                };
+
+                this.cancel = function() {
+                  $animate.cancel(this.runner);
+                };
+              }
+            });
+          </file>
+          <file name="template.html">
+            <p>
+              <button id="add" ng-click="$ctrl.addClass()">Add</button>
+              <button ng-click="$ctrl.removeClass()">Remove</button>
+              <br>
+              <button id="cancel" ng-click="$ctrl.cancel()" ng-disabled="!$ctrl.runner">Cancel</button>
+              <br>
+              <div id="target">CSS-Animated Text</div>
+            </p>
+          </file>
+          <file name="index.html">
+            <cancel-example></cancel-example>
+          </file>
+          <file name="style.css">
+            .red-add, .red-remove {
+              transition: all 4s cubic-bezier(0.250, 0.460, 0.450, 0.940);
+            }
+
+            .red,
+            .red-add.red-add-active {
+              color: #FF0000;
+              font-size: 40px;
+            }
+
+            .red-remove.red-remove-active {
+              font-size: 10px;
+              color: black;
+            }
+
+          </file>
+        </example>
        */
       cancel: function(runner) {
-        if (runner.end) {
-          runner.end();
+        if (runner.cancel) {
+          runner.cancel();
         }
       },
 
@@ -5518,7 +6096,7 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element
        *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`
        *
-       * @return {Promise} the animation callback promise
+       * @return {Runner} the animation runner
        */
       enter: function(element, parent, after, options) {
         parent = parent && jqLite(parent);
@@ -5550,7 +6128,7 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element
        *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`
        *
-       * @return {Promise} the animation callback promise
+       * @return {Runner} the animation runner
        */
       move: function(element, parent, after, options) {
         parent = parent && jqLite(parent);
@@ -5577,7 +6155,7 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element
        *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`
        *
-       * @return {Promise} the animation callback promise
+       * @return {Runner} the animation runner
        */
       leave: function(element, options) {
         return $$animateQueue.push(element, 'leave', prepareAnimateOptions(options), function() {
@@ -5602,12 +6180,11 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        * @param {object=} options an optional collection of options/styles that will be applied to the element.
        *   The object can have the following properties:
        *
-       *   - **addClass** - `{string}` - space-separated CSS classes to add to element
-       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`
        *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element
+       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`
        *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`
        *
-       * @return {Promise} the animation callback promise
+       * @return {Runner} animationRunner the animation runner
        */
       addClass: function(element, className, options) {
         options = prepareAnimateOptions(options);
@@ -5634,10 +6211,9 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        *
        *   - **addClass** - `{string}` - space-separated CSS classes to add to element
        *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`
-       *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element
        *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`
        *
-       * @return {Promise} the animation callback promise
+       * @return {Runner} the animation runner
        */
       removeClass: function(element, className, options) {
         options = prepareAnimateOptions(options);
@@ -5664,11 +6240,11 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        *   The object can have the following properties:
        *
        *   - **addClass** - `{string}` - space-separated CSS classes to add to element
-       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`
        *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element
+       *   - **from** - `{Object}` - CSS properties & values at the beginning of animation. Must have matching `to`
        *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`
        *
-       * @return {Promise} the animation callback promise
+       * @return {Runner} the animation runner
        */
       setClass: function(element, add, remove, options) {
         options = prepareAnimateOptions(options);
@@ -5715,7 +6291,7 @@ var $AnimateProvider = ['$provide', /** @this */ function($provide) {
        *   - **removeClass** - `{string}` - space-separated CSS classes to remove from element
        *   - **to** - `{Object}` - CSS properties & values at end of animation. Must have matching `from`
        *
-       * @return {Promise} the animation callback promise
+       * @return {Runner} the animation runner
        */
       animate: function(element, from, to, className, options) {
         options = prepareAnimateOptions(options);
@@ -5762,8 +6338,8 @@ var $$AnimateAsyncRunFactoryProvider = /** @this */ function() {
 };
 
 var $$AnimateRunnerFactoryProvider = /** @this */ function() {
-  this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$document', '$timeout',
-       function($q,   $sniffer,   $$animateAsyncRun,   $document,   $timeout) {
+  this.$get = ['$q', '$sniffer', '$$animateAsyncRun', '$$isDocumentHidden', '$timeout',
+       function($q,   $sniffer,   $$animateAsyncRun,   $$isDocumentHidden,   $timeout) {
 
     var INITIAL_STATE = 0;
     var DONE_PENDING_STATE = 1;
@@ -5815,11 +6391,7 @@ var $$AnimateRunnerFactoryProvider = /** @this */ function() {
 
       this._doneCallbacks = [];
       this._tick = function(fn) {
-        var doc = $document[0];
-
-        // the document may not be ready or attached
-        // to the module for some internal tests
-        if (doc && doc.hidden) {
+        if ($$isDocumentHidden()) {
           timeoutTick(fn);
         } else {
           rafTick(fn);
@@ -5996,7 +6568,16 @@ var $CoreAnimateCssProvider = function() {
   }];
 };
 
-/* global stripHash: true */
+/* global getHash: true, stripHash: false */
+
+function getHash(url) {
+  var index = url.indexOf('#');
+  return index === -1 ? '' : url.substr(index);
+}
+
+function trimEmptyHash(url) {
+  return url.replace(/#$/, '');
+}
 
 /**
  * ! This is a private undocumented service !
@@ -6019,62 +6600,27 @@ var $CoreAnimateCssProvider = function() {
  * @param {object} $log window.console or an object with the same interface.
  * @param {object} $sniffer $sniffer service
  */
-function Browser(window, document, $log, $sniffer) {
+function Browser(window, document, $log, $sniffer, $$taskTrackerFactory) {
   var self = this,
       location = window.location,
       history = window.history,
       setTimeout = window.setTimeout,
       clearTimeout = window.clearTimeout,
-      pendingDeferIds = {};
+      pendingDeferIds = {},
+      taskTracker = $$taskTrackerFactory($log);
 
   self.isMock = false;
 
-  var outstandingRequestCount = 0;
-  var outstandingRequestCallbacks = [];
+  //////////////////////////////////////////////////////////////
+  // Task-tracking API
+  //////////////////////////////////////////////////////////////
 
   // TODO(vojta): remove this temporary api
-  self.$$completeOutstandingRequest = completeOutstandingRequest;
-  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };
-
-  /**
-   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`
-   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.
-   */
-  function completeOutstandingRequest(fn) {
-    try {
-      fn.apply(null, sliceArgs(arguments, 1));
-    } finally {
-      outstandingRequestCount--;
-      if (outstandingRequestCount === 0) {
-        while (outstandingRequestCallbacks.length) {
-          try {
-            outstandingRequestCallbacks.pop()();
-          } catch (e) {
-            $log.error(e);
-          }
-        }
-      }
-    }
-  }
-
-  function getHash(url) {
-    var index = url.indexOf('#');
-    return index === -1 ? '' : url.substr(index);
-  }
+  self.$$completeOutstandingRequest = taskTracker.completeTask;
+  self.$$incOutstandingRequestCount = taskTracker.incTaskCount;
 
-  /**
-   * @private
-   * Note: this method is used only by scenario runner
-   * TODO(vojta): prefix this method with $$ ?
-   * @param {function()} callback Function that will be called when no outstanding request
-   */
-  self.notifyWhenNoOutstandingRequests = function(callback) {
-    if (outstandingRequestCount === 0) {
-      callback();
-    } else {
-      outstandingRequestCallbacks.push(callback);
-    }
-  };
+  // TODO(vojta): prefix this method with $$ ?
+  self.notifyWhenNoOutstandingRequests = taskTracker.notifyWhenNoPendingTasks;
 
   //////////////////////////////////////////////////////////////
   // URL API
@@ -6093,27 +6639,27 @@ function Browser(window, document, $log, $sniffer) {
       };
 
   cacheState();
-  lastHistoryState = cachedState;
 
   /**
    * @name $browser#url
    *
    * @description
    * GETTER:
-   * Without any argument, this method just returns current value of location.href.
+   * Without any argument, this method just returns current value of `location.href` (with a
+   * trailing `#` stripped of if the hash is empty).
    *
    * SETTER:
    * With at least one argument, this method sets url to new value.
-   * If html5 history api supported, pushState/replaceState is used, otherwise
-   * location.href/location.replace is used.
-   * Returns its own instance to allow chaining
+   * If html5 history api supported, `pushState`/`replaceState` is used, otherwise
+   * `location.href`/`location.replace` is used.
+   * Returns its own instance to allow chaining.
    *
-   * NOTE: this api is intended for use only by the $location service. Please use the
+   * NOTE: this api is intended for use only by the `$location` service. Please use the
    * {@link ng.$location $location service} to change url.
    *
    * @param {string} url New url (when used as setter)
    * @param {boolean=} replace Should new url replace current history record?
-   * @param {object=} state object to use with pushState/replaceState
+   * @param {object=} state State object to use with `pushState`/`replaceState`
    */
   self.url = function(url, replace, state) {
     // In modern browsers `history.state` is `null` by default; treating it separately
@@ -6131,6 +6677,9 @@ function Browser(window, document, $log, $sniffer) {
     if (url) {
       var sameState = lastHistoryState === state;
 
+      // Normalize the inputted URL
+      url = urlResolve(url).href;
+
       // Don't change anything if previous and current URLs and states match. This also prevents
       // IE<10 from getting into redirect loop when in LocationHashbangInHtml5Url mode.
       // See https://github.com/angular/angular.js/commit/ffb2701
@@ -6147,8 +6696,6 @@ function Browser(window, document, $log, $sniffer) {
       if ($sniffer.history && (!sameBase || !sameState)) {
         history[replace ? 'replaceState' : 'pushState'](state, '', url);
         cacheState();
-        // Do the assignment again so that those two variables are referentially identical.
-        lastHistoryState = cachedState;
       } else {
         if (!sameBase) {
           pendingLocation = url;
@@ -6173,8 +6720,7 @@ function Browser(window, document, $log, $sniffer) {
       // - pendingLocation is needed as browsers don't allow to read out
       //   the new location.href if a reload happened or if there is a bug like in iOS 9 (see
       //   https://openradar.appspot.com/22186109).
-      // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
-      return pendingLocation || location.href.replace(/%27/g,'\'');
+      return trimEmptyHash(pendingLocation || location.href);
     }
   };
 
@@ -6197,8 +6743,7 @@ function Browser(window, document, $log, $sniffer) {
 
   function cacheStateAndFireUrlChange() {
     pendingLocation = null;
-    cacheState();
-    fireUrlChange();
+    fireStateOrUrlChange();
   }
 
   // This variable should be used *only* inside the cacheState function.
@@ -6212,11 +6757,16 @@ function Browser(window, document, $log, $sniffer) {
     if (equals(cachedState, lastCachedState)) {
       cachedState = lastCachedState;
     }
+
     lastCachedState = cachedState;
+    lastHistoryState = cachedState;
   }
 
-  function fireUrlChange() {
-    if (lastBrowserUrl === self.url() && lastHistoryState === cachedState) {
+  function fireStateOrUrlChange() {
+    var prevLastHistoryState = lastHistoryState;
+    cacheState();
+
+    if (lastBrowserUrl === self.url() && prevLastHistoryState === cachedState) {
       return;
     }
 
@@ -6233,7 +6783,7 @@ function Browser(window, document, $log, $sniffer) {
    * @description
    * Register callback function that will be called, when url changes.
    *
-   * It's only called when the url is changed from outside of angular:
+   * It's only called when the url is changed from outside of AngularJS:
    * - user types different url into address bar
    * - user clicks on history (forward/back) button
    * - user clicks on a link
@@ -6243,7 +6793,7 @@ function Browser(window, document, $log, $sniffer) {
    * The listener gets called with new url as parameter.
    *
    * NOTE: this api is intended for use only by the $location service. Please use the
-   * {@link ng.$location $location service} to monitor url changes in angular apps.
+   * {@link ng.$location $location service} to monitor url changes in AngularJS apps.
    *
    * @param {function(string)} listener Listener function to be called when url changes.
    * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.
@@ -6251,8 +6801,8 @@ function Browser(window, document, $log, $sniffer) {
   self.onUrlChange = function(callback) {
     // TODO(vojta): refactor to use node's syntax for events
     if (!urlChangeInit) {
-      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)
-      // don't fire popstate when user change the address bar and don't fire hashchange when url
+      // We listen on both (hashchange/popstate) when available, as some browsers don't
+      // fire popstate when user changes the address bar and don't fire hashchange when url
       // changed by push/replaceState
 
       // html5 history api - popstate event
@@ -6278,11 +6828,11 @@ function Browser(window, document, $log, $sniffer) {
   };
 
   /**
-   * Checks whether the url has changed outside of Angular.
+   * Checks whether the url has changed outside of AngularJS.
    * Needs to be exported to be able to check for changes that have been done in sync,
    * as hashchange/popstate events fire in async.
    */
-  self.$$checkUrlChange = fireUrlChange;
+  self.$$checkUrlChange = fireStateOrUrlChange;
 
   //////////////////////////////////////////////////////////////
   // Misc API
@@ -6305,7 +6855,8 @@ function Browser(window, document, $log, $sniffer) {
   /**
    * @name $browser#defer
    * @param {function()} fn A function, who's execution should be deferred.
-   * @param {number=} [delay=0] of milliseconds to defer the function execution.
+   * @param {number=} [delay=0] Number of milliseconds to defer the function execution.
+   * @param {string=} [taskType=DEFAULT_TASK_TYPE] The type of task that is deferred.
    * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.
    *
    * @description
@@ -6316,14 +6867,19 @@ function Browser(window, document, $log, $sniffer) {
    * via `$browser.defer.flush()`.
    *
    */
-  self.defer = function(fn, delay) {
+  self.defer = function(fn, delay, taskType) {
     var timeoutId;
-    outstandingRequestCount++;
+
+    delay = delay || 0;
+    taskType = taskType || taskTracker.DEFAULT_TASK_TYPE;
+
+    taskTracker.incTaskCount(taskType);
     timeoutId = setTimeout(function() {
       delete pendingDeferIds[timeoutId];
-      completeOutstandingRequest(fn);
-    }, delay || 0);
-    pendingDeferIds[timeoutId] = true;
+      taskTracker.completeTask(fn, taskType);
+    }, delay);
+    pendingDeferIds[timeoutId] = taskType;
+
     return timeoutId;
   };
 
@@ -6339,10 +6895,11 @@ function Browser(window, document, $log, $sniffer) {
    *                    canceled.
    */
   self.defer.cancel = function(deferId) {
-    if (pendingDeferIds[deferId]) {
+    if (pendingDeferIds.hasOwnProperty(deferId)) {
+      var taskType = pendingDeferIds[deferId];
       delete pendingDeferIds[deferId];
       clearTimeout(deferId);
-      completeOutstandingRequest(noop);
+      taskTracker.completeTask(noop, taskType);
       return true;
     }
     return false;
@@ -6352,10 +6909,10 @@ function Browser(window, document, $log, $sniffer) {
 
 /** @this */
 function $BrowserProvider() {
-  this.$get = ['$window', '$log', '$sniffer', '$document',
-      function($window, $log, $sniffer, $document) {
-        return new Browser($window, $document, $log, $sniffer);
-      }];
+  this.$get = ['$window', '$log', '$sniffer', '$document', '$$taskTrackerFactory',
+       function($window,   $log,   $sniffer,   $document,   $$taskTrackerFactory) {
+    return new Browser($window, $document, $log, $sniffer, $$taskTrackerFactory);
+  }];
 }
 
 /**
@@ -6464,8 +7021,8 @@ function $CacheFactoryProvider() {
        *
        * @description
        * A cache object used to store and retrieve data, primarily used by
-       * {@link $http $http} and the {@link ng.directive:script script} directive to cache
-       * templates and other data.
+       * {@link $templateRequest $templateRequest} and the {@link ng.directive:script script}
+       * directive to cache templates and other data.
        *
        * ```js
        *  angular.module('superCache')
@@ -6718,9 +7275,12 @@ function $CacheFactoryProvider() {
  * @this
  *
  * @description
+ * `$templateCache` is a {@link $cacheFactory.Cache Cache object} created by the
+ * {@link ng.$cacheFactory $cacheFactory}.
+ *
  * The first time a template is used, it is loaded in the template cache for quick retrieval. You
- * can load templates directly into the cache in a `script` tag, or by consuming the
- * `$templateCache` service directly.
+ * can load templates directly into the cache in a `script` tag, by using {@link $templateRequest},
+ * or by consuming the `$templateCache` service directly.
  *
  * Adding via the `script` tag:
  *
@@ -6731,8 +7291,8 @@ function $CacheFactoryProvider() {
  * ```
  *
  * **Note:** the `script` tag containing the template does not need to be included in the `head` of
- * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE,
- * element with ng-app attribute), otherwise the template will be ignored.
+ * the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (e.g.
+ * element with {@link ngApp} attribute), otherwise the template will be ignored.
  *
  * Adding via the `$templateCache` service:
  *
@@ -6755,8 +7315,6 @@ function $CacheFactoryProvider() {
  * $templateCache.get('templateId.html')
  * ```
  *
- * See {@link ng.$cacheFactory $cacheFactory}.
- *
  */
 function $TemplateCacheProvider() {
   this.$get = ['$cacheFactory', function($cacheFactory) {
@@ -6884,7 +7442,7 @@ function $TemplateCacheProvider() {
  * ```
  *
  * ### Life-cycle hooks
- * Directive controllers can provide the following methods that are called by Angular at points in the life-cycle of the
+ * Directive controllers can provide the following methods that are called by AngularJS at points in the life-cycle of the
  * directive:
  * * `$onInit()` - Called on each controller after all the controllers on an element have been constructed and
  *   had their bindings initialized (and before the pre &amp; post linking functions for the directives on
@@ -6892,12 +7450,13 @@ function $TemplateCacheProvider() {
  * * `$onChanges(changesObj)` - Called whenever one-way (`<`) or interpolation (`@`) bindings are updated. The
  *   `changesObj` is a hash whose keys are the names of the bound properties that have changed, and the values are an
  *   object of the form `{ currentValue, previousValue, isFirstChange() }`. Use this hook to trigger updates within a
- *   component such as cloning the bound value to prevent accidental mutation of the outer value.
+ *   component such as cloning the bound value to prevent accidental mutation of the outer value. Note that this will
+ *   also be called when your bindings are initialized.
  * * `$doCheck()` - Called on each turn of the digest cycle. Provides an opportunity to detect and act on
  *   changes. Any actions that you wish to take in response to the changes that you detect must be
  *   invoked from this hook; implementing this has no effect on when `$onChanges` is called. For example, this hook
  *   could be useful if you wish to perform a deep equality check, or to check a Date object, changes to which would not
- *   be detected by Angular's change detector and thus not trigger `$onChanges`. This hook is invoked with no arguments;
+ *   be detected by AngularJS's change detector and thus not trigger `$onChanges`. This hook is invoked with no arguments;
  *   if detecting changes, you must store the previous value(s) for comparison to the current values.
  * * `$onDestroy()` - Called on a controller when its containing scope is destroyed. Use this hook for releasing
  *   external resources, watches and event handlers. Note that components have their `$onDestroy()` hooks called in
@@ -6909,18 +7468,18 @@ function $TemplateCacheProvider() {
  *   they are waiting for their template to load asynchronously and their own compilation and linking has been
  *   suspended until that occurs.
  *
- * #### Comparison with Angular 2 life-cycle hooks
- * Angular 2 also uses life-cycle hooks for its components. While the Angular 1 life-cycle hooks are similar there are
- * some differences that you should be aware of, especially when it comes to moving your code from Angular 1 to Angular 2:
+ * #### Comparison with life-cycle hooks in the new Angular
+ * The new Angular also uses life-cycle hooks for its components. While the AngularJS life-cycle hooks are similar there are
+ * some differences that you should be aware of, especially when it comes to moving your code from AngularJS to Angular:
  *
- * * Angular 1 hooks are prefixed with `$`, such as `$onInit`. Angular 2 hooks are prefixed with `ng`, such as `ngOnInit`.
- * * Angular 1 hooks can be defined on the controller prototype or added to the controller inside its constructor.
- *   In Angular 2 you can only define hooks on the prototype of the Component class.
- * * Due to the differences in change-detection, you may get many more calls to `$doCheck` in Angular 1 than you would to
- *   `ngDoCheck` in Angular 2
+ * * AngularJS hooks are prefixed with `$`, such as `$onInit`. Angular hooks are prefixed with `ng`, such as `ngOnInit`.
+ * * AngularJS hooks can be defined on the controller prototype or added to the controller inside its constructor.
+ *   In Angular you can only define hooks on the prototype of the Component class.
+ * * Due to the differences in change-detection, you may get many more calls to `$doCheck` in AngularJS than you would to
+ *   `ngDoCheck` in Angular.
  * * Changes to the model inside `$doCheck` will trigger new turns of the digest loop, which will cause the changes to be
  *   propagated throughout the application.
- *   Angular 2 does not allow the `ngDoCheck` hook to trigger a change outside of the component. It will either throw an
+ *   Angular does not allow the `ngDoCheck` hook to trigger a change outside of the component. It will either throw an
  *   error or do nothing depending upon the state of `enableProdMode()`.
  *
  * #### Life-cycle hook examples
@@ -6968,7 +7527,7 @@ function $TemplateCacheProvider() {
  *
  * This example show how you might use `$doCheck` to trigger changes in your component's inputs even if the
  * actual identity of the component doesn't change. (Be aware that cloning and deep equality checks on large
- * arrays or objects can have a negative impact on your application performance)
+ * arrays or objects can have a negative impact on your application performance.)
  *
  * <example name="doCheckArrayExample" module="do-check-module">
  *   <file name="index.html">
@@ -7040,10 +7599,12 @@ function $TemplateCacheProvider() {
  * the directive's element. If multiple directives on the same element request a new scope,
  * only one new scope is created.
  *
- * * **`{...}` (an object hash):** A new "isolate" scope is created for the directive's element. The
- * 'isolate' scope differs from normal scope in that it does not prototypically inherit from its parent
- * scope. This is useful when creating reusable components, which should not accidentally read or modify
- * data in the parent scope.
+ * * **`{...}` (an object hash):** A new "isolate" scope is created for the directive's template.
+ * The 'isolate' scope differs from normal scope in that it does not prototypically
+ * inherit from its parent scope. This is useful when creating reusable components, which should not
+ * accidentally read or modify data in the parent scope. Note that an isolate scope
+ * directive without a `template` or `templateUrl` will not apply the isolate scope
+ * to its children elements.
  *
  * The 'isolate' scope object hash defines a set of local scope properties derived from attributes on the
  * directive's element. These local properties are useful for aliasing values for templates. The keys in
@@ -7064,21 +7625,22 @@ function $TemplateCacheProvider() {
  *   name. Given `<my-component my-attr="parentModel">` and the isolate scope definition `scope: {
  *   localModel: '=myAttr' }`, the property `localModel` on the directive's scope will reflect the
  *   value of `parentModel` on the parent scope. Changes to `parentModel` will be reflected in
- *   `localModel` and vice versa. Optional attributes should be marked as such with a question mark:
- *   `=?` or `=?attr`. If the binding expression is non-assignable, or if the attribute isn't
- *   optional and doesn't exist, an exception ({@link error/$compile/nonassign `$compile:nonassign`})
- *   will be thrown upon discovering changes to the local value, since it will be impossible to sync
- *   them back to the parent scope. By default, the {@link ng.$rootScope.Scope#$watch `$watch`}
+ *   `localModel` and vice versa. If the binding expression is non-assignable, or if the attribute
+ *   isn't  optional and doesn't exist, an exception
+ *   ({@link error/$compile/nonassign `$compile:nonassign`}) will be thrown upon discovering changes
+ *   to the local value, since it will be impossible to sync them back to the parent scope.
+ *
+ *   By default, the {@link ng.$rootScope.Scope#$watch `$watch`}
  *   method is used for tracking changes, and the equality check is based on object identity.
  *   However, if an object literal or an array literal is passed as the binding expression, the
  *   equality check is done by value (using the {@link angular.equals} function). It's also possible
  *   to watch the evaluated value shallowly with {@link ng.$rootScope.Scope#$watchCollection
- *   `$watchCollection`}: use `=*` or `=*attr` (`=*?` or `=*?attr` if the attribute is optional).
+ *   `$watchCollection`}: use `=*` or `=*attr`
  *
   * * `<` or `<attr` - set up a one-way (one-directional) binding between a local scope property and an
  *   expression passed via the attribute `attr`. The expression is evaluated in the context of the
  *   parent scope. If no `attr` name is specified then the attribute name is assumed to be the same as the
- *   local name. You can also make the binding optional by adding `?`: `<?` or `<?attr`.
+ *   local name.
  *
  *   For example, given `<my-component my-attr="parentModel">` and directive definition of
  *   `scope: { localModel:'<myAttr' }`, then the isolated scope property `localModel` will reflect the
@@ -7099,6 +7661,11 @@ function $TemplateCacheProvider() {
  *   One-way binding is useful if you do not plan to propagate changes to your isolated scope bindings
  *   back to the parent. However, it does not make this completely impossible.
  *
+ *   By default, the {@link ng.$rootScope.Scope#$watch `$watch`}
+ *   method is used for tracking changes, and the equality check is based on object identity.
+ *   It's also possible to watch the evaluated value shallowly with
+ *   {@link ng.$rootScope.Scope#$watchCollection `$watchCollection`}: use `<*` or `<*attr`
+ *
  * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope. If
  *   no `attr` name is specified then the attribute name is assumed to be the same as the local name.
  *   Given `<my-component my-attr="count = count + value">` and the isolate scope definition `scope: {
@@ -7108,6 +7675,36 @@ function $TemplateCacheProvider() {
  *   and values into the expression wrapper fn. For example, if the expression is `increment(amount)`
  *   then we can specify the amount value by calling the `localFn` as `localFn({amount: 22})`.
  *
+ * All 4 kinds of bindings (`@`, `=`, `<`, and `&`) can be made optional by adding `?` to the expression.
+ * The marker must come after the mode and before the attribute name.
+ * See the {@link error/$compile/iscp Invalid Isolate Scope Definition error} for definition examples.
+ * This is useful to refine the interface directives provide.
+ * One subtle difference between optional and non-optional happens **when the binding attribute is not
+ * set**:
+ * - the binding is optional: the property will not be defined
+ * - the binding is not optional: the property is defined
+ *
+ * ```js
+ *app.directive('testDir', function() {
+    return {
+      scope: {
+        notoptional: '=',
+        optional: '=?',
+      },
+      bindToController: true,
+      controller: function() {
+        this.$onInit = function() {
+          console.log(this.hasOwnProperty('notoptional')) // true
+          console.log(this.hasOwnProperty('optional')) // false
+        }
+      }
+    }
+  })
+ *```
+ *
+ *
+ * ##### Combining directives with different scope defintions
+ *
  * In general it's possible to apply more than one directive to one element, but there might be limitations
  * depending on the type of scope required by the directives. The following points will help explain these limitations.
  * For simplicity only two directives are taken into account, but it is also applicable for several directives:
@@ -7135,12 +7732,6 @@ function $TemplateCacheProvider() {
  * `$onInit`, which is called after all the controllers on an element have been constructed and had their bindings
  * initialized.
  *
- * <div class="alert alert-warning">
- * **Deprecation warning:** although bindings for non-ES6 class controllers are currently
- * bound to `this` before the controller constructor is called, this use is now deprecated. Please place initialization
- * code that relies upon bindings inside a `$onInit` method on the controller, instead.
- * </div>
- *
  * It is also possible to set `bindToController` to an object hash with the same format as the `scope` property.
  * This will set up the scope bindings to the controller directly. Note that `scope` can still be used
  * to define which kind of scope is created. By default, no scope is created. Use `scope: {}` to create an isolate
@@ -7259,7 +7850,7 @@ function $TemplateCacheProvider() {
  * would result in the whole app "stalling" until all templates are loaded asynchronously - even in the
  * case when only one deeply nested directive has `templateUrl`.
  *
- * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache}
+ * Template loading is asynchronous even if the template has been preloaded into the {@link $templateCache}.
  *
  * You can specify `templateUrl` as a string representing the URL or as a function which takes two
  * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns
@@ -7267,8 +7858,12 @@ function $TemplateCacheProvider() {
  * $sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.
  *
  *
- * #### `replace` ([*DEPRECATED*!], will be removed in next major release - i.e. v2.0)
- * specify what the template should replace. Defaults to `false`.
+ * #### `replace`
+ * <div class="alert alert-danger">
+ * **Note:** `replace` is deprecated in AngularJS and has been removed in the new Angular (v2+).
+ * </div>
+ *
+ * Specifies what the template should replace. Defaults to `false`.
  *
  * * `true` - the template will replace the directive's element.
  * * `false` - the template will replace the contents of the directive's element.
@@ -7316,7 +7911,7 @@ function $TemplateCacheProvider() {
  * own templates or compile functions. Compiling these directives results in an infinite loop and
  * stack overflow errors.
  *
- * This can be avoided by manually using $compile in the postLink function to imperatively compile
+ * This can be avoided by manually using `$compile` in the postLink function to imperatively compile
  * a directive's template instead of relying on automatic template compilation via `template` or
  * `templateUrl` declaration or manual compilation inside the compile function.
  * </div>
@@ -7420,17 +8015,17 @@ function $TemplateCacheProvider() {
  *
  * * `true` - transclude the content (i.e. the child nodes) of the directive's element.
  * * `'element'` - transclude the whole of the directive's element including any directives on this
- *   element that defined at a lower priority than this directive. When used, the `template`
+ *   element that are defined at a lower priority than this directive. When used, the `template`
  *   property is ignored.
  * * **`{...}` (an object hash):** - map elements of the content onto transclusion "slots" in the template.
  *
- * **Mult-slot transclusion** is declared by providing an object for the `transclude` property.
+ * **Multi-slot transclusion** is declared by providing an object for the `transclude` property.
  *
  * This object is a map where the keys are the name of the slot to fill and the value is an element selector
  * used to match the HTML to the slot. The element selector should be in normalized form (e.g. `myElement`)
  * and will match the standard element variants (e.g. `my-element`, `my:element`, `data-my-element`, etc).
  *
- * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}
+ * For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}.
  *
  * If the element selector is prefixed with a `?` then that slot is optional.
  *
@@ -7455,7 +8050,7 @@ function $TemplateCacheProvider() {
  * </div>
  *
  * If you want to manually control the insertion and removal of the transcluded content in your directive
- * then you must use this transclude function. When you call a transclude function it returns a a jqLite/JQuery
+ * then you must use this transclude function. When you call a transclude function it returns a jqLite/JQuery
  * object that contains the compiled DOM, which is linked to the correct transclusion scope.
  *
  * When you call a transclusion function you can pass in a **clone attach function**. This function accepts
@@ -7540,8 +8135,8 @@ function $TemplateCacheProvider() {
  * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the
  * `link()` or `compile()` functions. It has a variety of uses.
  *
- * * *Accessing normalized attribute names:* Directives like 'ngBind' can be expressed in many ways:
- *   'ng:bind', `data-ng-bind`, or 'x-ng-bind'. The attributes object allows for normalized access
+ * * *Accessing normalized attribute names:* Directives like `ngBind` can be expressed in many ways:
+ *   `ng:bind`, `data-ng-bind`, or `x-ng-bind`. The attributes object allows for normalized access
  *   to the attributes.
  *
  * * *Directive inter-communication:* All directives share the same instance of the attributes
@@ -7582,25 +8177,24 @@ function $TemplateCacheProvider() {
    <file name="index.html">
     <script>
       angular.module('compileExample', [], function($compileProvider) {
-        // configure new 'compile' directive by passing a directive
-        // factory function. The factory function injects the '$compile'
+        // Configure new 'compile' directive by passing a directive
+        // factory function. The factory function injects '$compile'.
         $compileProvider.directive('compile', function($compile) {
-          // directive factory creates a link function
+          // The directive factory creates a link function.
           return function(scope, element, attrs) {
             scope.$watch(
               function(scope) {
-                 // watch the 'compile' expression for changes
+                // Watch the 'compile' expression for changes.
                 return scope.$eval(attrs.compile);
               },
               function(value) {
-                // when the 'compile' expression changes
-                // assign it into the current DOM
+                // When the 'compile' expression changes
+                // assign it into the current DOM.
                 element.html(value);
 
-                // compile the new DOM and link it to the current
-                // scope.
-                // NOTE: we only compile .childNodes so that
-                // we don't get into infinite loop compiling ourselves
+                // Compile the new DOM and link it to the current scope.
+                // NOTE: we only compile '.childNodes' so that we
+                // don't get into an infinite loop compiling ourselves.
                 $compile(element.contents())(scope);
               }
             );
@@ -7608,7 +8202,7 @@ function $TemplateCacheProvider() {
         });
       })
       .controller('GreeterController', ['$scope', function($scope) {
-        $scope.name = 'Angular';
+        $scope.name = 'AngularJS';
         $scope.html = 'Hello {{name}}';
       }]);
     </script>
@@ -7622,11 +8216,11 @@ function $TemplateCacheProvider() {
      it('should auto compile', function() {
        var textarea = $('textarea');
        var output = $('div[compile]');
-       // The initial state reads 'Hello Angular'.
-       expect(output.getText()).toBe('Hello Angular');
+       // The initial state reads 'Hello AngularJS'.
+       expect(output.getText()).toBe('Hello AngularJS');
        textarea.clear();
        textarea.sendKeys('{{name}}!');
-       expect(output.getText()).toBe('Angular!');
+       expect(output.getText()).toBe('AngularJS!');
      });
    </file>
  </example>
@@ -7673,40 +8267,42 @@ function $TemplateCacheProvider() {
  *        }
  *        ```
  *      * `futureParentElement` - defines the parent to which the `cloneAttachFn` will add
- *        the cloned elements; only needed for transcludes that are allowed to contain non html
- *        elements (e.g. SVG elements). See also the directive.controller property.
+ *        the cloned elements; only needed for transcludes that are allowed to contain non HTML
+ *        elements (e.g. SVG elements). See also the `directive.controller` property.
  *
  * Calling the linking function returns the element of the template. It is either the original
  * element passed in, or the clone of the element if the `cloneAttachFn` is provided.
  *
- * After linking the view is not updated until after a call to $digest which typically is done by
- * Angular automatically.
+ * After linking the view is not updated until after a call to `$digest`, which typically is done by
+ * AngularJS automatically.
  *
  * If you need access to the bound view, there are two ways to do it:
  *
  * - If you are not asking the linking function to clone the template, create the DOM element(s)
  *   before you send them to the compiler and keep this reference around.
  *   ```js
- *     var element = $compile('<p>{{total}}</p>')(scope);
+ *     var element = angular.element('<p>{{total}}</p>');
+ *     $compile(element)(scope);
  *   ```
  *
  * - if on the other hand, you need the element to be cloned, the view reference from the original
  *   example would not point to the clone, but rather to the original template that was cloned. In
- *   this case, you can access the clone via the cloneAttachFn:
+ *   this case, you can access the clone either via the `cloneAttachFn` or the value returned by the
+ *   linking function:
  *   ```js
- *     var templateElement = angular.element('<p>{{total}}</p>'),
- *         scope = ....;
- *
+ *     var templateElement = angular.element('<p>{{total}}</p>');
  *     var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {
- *       //attach the clone to DOM document at the right place
+ *       // Attach the clone to DOM document at the right place.
  *     });
  *
- *     //now we have reference to the cloned DOM via `clonedElement`
+ *     // Now we have reference to the cloned DOM via `clonedElement`.
+ *     // NOTE: The `clonedElement` returned by the linking function is the same as the
+ *     //       `clonedElement` passed to `cloneAttachFn`.
  *   ```
  *
  *
  * For information on how the compiler works, see the
- * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.
+ * {@link guide/compiler AngularJS HTML Compiler} section of the Developer Guide.
  *
  * @knownIssue
  *
@@ -7716,75 +8312,448 @@ function $TemplateCacheProvider() {
    compiled again. This is an undesired effect and can lead to misbehaving directives, performance issues,
    and memory leaks. Refer to the Compiler Guide {@link guide/compiler#double-compilation-and-how-to-avoid-it
    section on double compilation} for an in-depth explanation and ways to avoid it.
- *
- */
 
-var $compileMinErr = minErr('$compile');
+ * @knownIssue
 
-function UNINITIALIZED_VALUE() {}
-var _UNINITIALIZED_VALUE = new UNINITIALIZED_VALUE();
+   ### Issues with `replace: true`
+ *
+ * <div class="alert alert-danger">
+ *   **Note**: {@link $compile#-replace- `replace: true`} is deprecated and not recommended to use,
+ *   mainly due to the issues listed here. It has been completely removed in the new Angular.
+ * </div>
+ *
+ * #### Attribute values are not merged
+ *
+ * When a `replace` directive encounters the same attribute on the original and the replace node,
+ * it will simply deduplicate the attribute and join the values with a space or with a `;` in case of
+ * the `style` attribute.
+ * ```html
+ * Original Node: <span class="original" style="color: red;"></span>
+ * Replace Template: <span class="replaced" style="background: blue;"></span>
+ * Result: <span class="original replaced" style="color: red; background: blue;"></span>
+ * ```
+ *
+ * That means attributes that contain AngularJS expressions will not be merged correctly, e.g.
+ * {@link ngShow} or {@link ngClass} will cause a {@link $parse} error:
+ *
+ * ```html
+ * Original Node: <span ng-class="{'something': something}" ng-show="!condition"></span>
+ * Replace Template: <span ng-class="{'else': else}" ng-show="otherCondition"></span>
+ * Result: <span ng-class="{'something': something} {'else': else}" ng-show="!condition otherCondition"></span>
+ * ```
+ *
+ * See issue [#5695](https://github.com/angular/angular.js/issues/5695).
+ *
+ * #### Directives are not deduplicated before compilation
+ *
+ * When the original node and the replace template declare the same directive(s), they will be
+ * {@link guide/compiler#double-compilation-and-how-to-avoid-it compiled twice} because the compiler
+ * does not deduplicate them. In many cases, this is not noticeable, but e.g. {@link ngModel} will
+ * attach `$formatters` and `$parsers` twice.
+ *
+ * See issue [#2573](https://github.com/angular/angular.js/issues/2573).
+ *
+ * #### `transclude: element` in the replace template root can have unexpected effects
+ *
+ * When the replace template has a directive at the root node that uses
+ * {@link $compile#-transclude- `transclude: element`}, e.g.
+ * {@link ngIf} or {@link ngRepeat}, the DOM structure or scope inheritance can be incorrect.
+ * See the following issues:
+ *
+ * - Incorrect scope on replaced element:
+ * [#9837](https://github.com/angular/angular.js/issues/9837)
+ * - Different DOM between `template` and `templateUrl`:
+ * [#10612](https://github.com/angular/angular.js/issues/14326)
+ *
+ */
 
 /**
- * @ngdoc provider
- * @name $compileProvider
+ * @ngdoc directive
+ * @name ngProp
+ * @restrict A
+ * @element ANY
+ *
+ * @usage
+ *
+ * ```html
+ * <ANY ng-prop-propname="expression">
+ * </ANY>
+ * ```
+ *
+ * or with uppercase letters in property (e.g. "propName"):
+ *
+ *
+ * ```html
+ * <ANY ng-prop-prop_name="expression">
+ * </ANY>
+ * ```
+ *
  *
  * @description
- */
-$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];
-/** @this */
-function $CompileProvider($provide, $$sanitizeUriProvider) {
-  var hasDirectives = {},
-      Suffix = 'Directive',
-      COMMENT_DIRECTIVE_REGEXP = /^\s*directive:\s*([\w-]+)\s+(.*)$/,
-      CLASS_DIRECTIVE_REGEXP = /(([\w-]+)(?::([^;]+))?;?)/,
-      ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'),
-      REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/;
-
-  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes
-  // The assumption is that future DOM event attribute names will begin with
-  // 'on' and be composed of only English letters.
-  var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;
-  var bindingCache = createMap();
-
-  function parseIsolateBindings(scope, directiveName, isController) {
-    var LOCAL_REGEXP = /^\s*([@&<]|=(\*?))(\??)\s*([\w$]*)\s*$/;
-
-    var bindings = createMap();
-
-    forEach(scope, function(definition, scopeName) {
-      if (definition in bindingCache) {
-        bindings[scopeName] = bindingCache[definition];
-        return;
-      }
-      var match = definition.match(LOCAL_REGEXP);
-
-      if (!match) {
-        throw $compileMinErr('iscp',
-            'Invalid {3} for directive \'{0}\'.' +
-            ' Definition: {... {1}: \'{2}\' ...}',
-            directiveName, scopeName, definition,
-            (isController ? 'controller bindings definition' :
-            'isolate scope definition'));
-      }
-
-      bindings[scopeName] = {
-        mode: match[1][0],
-        collection: match[2] === '*',
-        optional: match[3] === '?',
-        attrName: match[4] || scopeName
-      };
-      if (match[4]) {
-        bindingCache[definition] = bindings[scopeName];
-      }
-    });
-
-    return bindings;
-  }
-
-  function parseDirectiveBindings(directive, directiveName) {
-    var bindings = {
-      isolateScope: null,
-      bindToController: null
+ * The `ngProp` directive binds an expression to a DOM element property.
+ * `ngProp` allows writing to arbitrary properties by including
+ * the property name in the attribute, e.g. `ng-prop-value="'my value'"` binds 'my value' to
+ * the `value` property.
+ *
+ * Usually, it's not necessary to write to properties in AngularJS, as the built-in directives
+ * handle the most common use cases (instead of the above example, you would use {@link ngValue}).
+ *
+ * However, [custom elements](https://developer.mozilla.org/docs/Web/Web_Components/Using_custom_elements)
+ * often use custom properties to hold data, and `ngProp` can be used to provide input to these
+ * custom elements.
+ *
+ * ## Binding to camelCase properties
+ *
+ * Since HTML attributes are case-insensitive, camelCase properties like `innerHTML` must be escaped.
+ * AngularJS uses the underscore (_) in front of a character to indicate that it is uppercase, so
+ * `innerHTML`  must be written as `ng-prop-inner_h_t_m_l="expression"` (Note that this is just an
+ * example, and for binding HTML {@link ngBindHtml} should be used.
+ *
+ * ## Security
+ *
+ * Binding expressions to arbitrary properties poses a security risk, as  properties like `innerHTML`
+ * can insert potentially dangerous HTML into the application, e.g. script tags that execute
+ * malicious code.
+ * For this reason, `ngProp` applies Strict Contextual Escaping with the {@link ng.$sce $sce service}.
+ * This means vulnerable properties require their content to be "trusted", based on the
+ * context of the property. For example, the `innerHTML` is in the `HTML` context, and the
+ * `iframe.src` property is in the `RESOURCE_URL` context, which requires that values written to
+ * this property are trusted as a `RESOURCE_URL`.
+ *
+ * This can be set explicitly by calling $sce.trustAs(type, value) on the value that is
+ * trusted before passing it to the `ng-prop-*` directive. There are exist shorthand methods for
+ * each context type in the form of {@link ng.$sce#trustAsResourceUrl $sce.trustAsResourceUrl()} et al.
+ *
+ * In some cases you can also rely upon automatic sanitization of untrusted values - see below.
+ *
+ * Based on the context, other options may exist to mark a value as trusted / configure the behavior
+ * of {@link ng.$sce}. For example, to restrict the `RESOURCE_URL` context to specific origins, use
+ * the {@link $sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist()}
+ * and {@link $sceDelegateProvider#resourceUrlBlacklist resourceUrlBlacklist()}.
+ *
+ * {@link ng.$sce#what-trusted-context-types-are-supported- Find out more about the different context types}.
+ *
+ * ### HTML Sanitization
+ *
+ * By default, `$sce` will throw an error if it detects untrusted HTML content, and will not bind the
+ * content.
+ * However, if you include the {@link ngSanitize ngSanitize module}, it will try to sanitize the
+ * potentially dangerous HTML, e.g. strip non-whitelisted tags and attributes when binding to
+ * `innerHTML`.
+ *
+ * @example
+ * ### Binding to different contexts
+ *
+ * <example name="ngProp" module="exampleNgProp">
+ *   <file name="app.js">
+ *     angular.module('exampleNgProp', [])
+ *       .component('main', {
+ *         templateUrl: 'main.html',
+ *         controller: function($sce) {
+ *           this.safeContent = '<strong>Safe content</strong>';
+ *           this.unsafeContent = '<button onclick="alert(\'Hello XSS!\')">Click for XSS</button>';
+ *           this.trustedUnsafeContent = $sce.trustAsHtml(this.unsafeContent);
+ *         }
+ *       });
+ *   </file>
+ *   <file name="main.html">
+ *     <div>
+ *       <div class="prop-unit">
+ *         Binding to a property without security context:
+ *         <div class="prop-binding" ng-prop-inner_text="$ctrl.safeContent"></div>
+ *         <span class="prop-note">innerText</span> (safeContent)
+ *       </div>
+ *
+ *       <div class="prop-unit">
+ *         "Safe" content that requires a security context will throw because the contents could potentially be dangerous ...
+ *         <div class="prop-binding" ng-prop-inner_h_t_m_l="$ctrl.safeContent"></div>
+ *         <span class="prop-note">innerHTML</span> (safeContent)
+ *       </div>
+ *
+ *       <div class="prop-unit">
+ *         ... so that actually dangerous content cannot be executed:
+ *         <div class="prop-binding" ng-prop-inner_h_t_m_l="$ctrl.unsafeContent"></div>
+ *         <span class="prop-note">innerHTML</span> (unsafeContent)
+ *       </div>
+ *
+ *       <div class="prop-unit">
+ *         ... but unsafe Content that has been trusted explicitly works - only do this if you are 100% sure!
+ *         <div class="prop-binding" ng-prop-inner_h_t_m_l="$ctrl.trustedUnsafeContent"></div>
+ *         <span class="prop-note">innerHTML</span> (trustedUnsafeContent)
+ *       </div>
+ *     </div>
+ *   </file>
+ *   <file name="index.html">
+ *     <main></main>
+ *   </file>
+ *   <file name="styles.css">
+ *     .prop-unit {
+ *       margin-bottom: 10px;
+ *     }
+ *
+ *     .prop-binding {
+ *       min-height: 30px;
+ *       border: 1px solid blue;
+ *     }
+ *
+ *     .prop-note {
+ *       font-family: Monospace;
+ *     }
+ *   </file>
+ * </example>
+ *
+ *
+ * @example
+ * ### Binding to innerHTML with ngSanitize
+ *
+ * <example name="ngProp" module="exampleNgProp" deps="angular-sanitize.js">
+ *   <file name="app.js">
+ *     angular.module('exampleNgProp', ['ngSanitize'])
+ *       .component('main', {
+ *         templateUrl: 'main.html',
+ *         controller: function($sce) {
+ *           this.safeContent = '<strong>Safe content</strong>';
+ *           this.unsafeContent = '<button onclick="alert(\'Hello XSS!\')">Click for XSS</button>';
+ *           this.trustedUnsafeContent = $sce.trustAsHtml(this.unsafeContent);
+ *         }
+ *       });
+ *   </file>
+ *   <file name="main.html">
+ *     <div>
+ *       <div class="prop-unit">
+ *         "Safe" content will be sanitized ...
+ *         <div class="prop-binding" ng-prop-inner_h_t_m_l="$ctrl.safeContent"></div>
+ *         <span class="prop-note">innerHTML</span> (safeContent)
+ *       </div>
+ *
+ *       <div class="prop-unit">
+ *         ... as will dangerous content:
+ *         <div class="prop-binding" ng-prop-inner_h_t_m_l="$ctrl.unsafeContent"></div>
+ *         <span class="prop-note">innerHTML</span> (unsafeContent)
+ *       </div>
+ *
+ *       <div class="prop-unit">
+ *         ... and content that has been trusted explicitly works the same as without ngSanitize:
+ *         <div class="prop-binding" ng-prop-inner_h_t_m_l="$ctrl.trustedUnsafeContent"></div>
+ *         <span class="prop-note">innerHTML</span> (trustedUnsafeContent)
+ *       </div>
+ *     </div>
+ *   </file>
+ *   <file name="index.html">
+ *     <main></main>
+ *   </file>
+ *   <file name="styles.css">
+ *     .prop-unit {
+ *       margin-bottom: 10px;
+ *     }
+ *
+ *     .prop-binding {
+ *       min-height: 30px;
+ *       border: 1px solid blue;
+ *     }
+ *
+ *     .prop-note {
+ *       font-family: Monospace;
+ *     }
+ *   </file>
+ * </example>
+ *
+ */
+
+/** @ngdoc directive
+ * @name ngOn
+ * @restrict A
+ * @element ANY
+ *
+ * @usage
+ *
+ * ```html
+ * <ANY ng-on-eventname="expression">
+ * </ANY>
+ * ```
+ *
+ * or with uppercase letters in property (e.g. "eventName"):
+ *
+ *
+ * ```html
+ * <ANY ng-on-event_name="expression">
+ * </ANY>
+ * ```
+ *
+ * @description
+ * The `ngOn` directive adds an event listener to a DOM element via
+ * {@link angular.element angular.element().on()}, and evaluates an expression when the event is
+ * fired.
+ * `ngOn` allows adding listeners for arbitrary events by including
+ * the event name in the attribute, e.g. `ng-on-drop="onDrop()"` executes the 'onDrop()' expression
+ * when the `drop` event is fired.
+ *
+ * AngularJS provides specific directives for many events, such as {@link ngClick}, so in most
+ * cases it is not necessary to use `ngOn`. However, AngularJS does not support all events
+ * (e.g. the `drop` event in the example above), and new events might be introduced in later DOM
+ * standards.
+ *
+ * Another use-case for `ngOn` is listening to
+ * [custom events](https://developer.mozilla.org/docs/Web/Guide/Events/Creating_and_triggering_events)
+ * fired by
+ * [custom elements](https://developer.mozilla.org/docs/Web/Web_Components/Using_custom_elements).
+ *
+ * ## Binding to camelCase properties
+ *
+ * Since HTML attributes are case-insensitive, camelCase properties like `myEvent` must be escaped.
+ * AngularJS uses the underscore (_) in front of a character to indicate that it is uppercase, so
+ * `myEvent` must be written as `ng-on-my_event="expression"`.
+ *
+ * @example
+ * ### Bind to built-in DOM events
+ *
+ * <example name="ngOn" module="exampleNgOn">
+ *   <file name="app.js">
+ *     angular.module('exampleNgOn', [])
+ *       .component('main', {
+ *         templateUrl: 'main.html',
+ *         controller: function() {
+ *           this.clickCount = 0;
+ *           this.mouseoverCount = 0;
+ *
+ *           this.loadingState = 0;
+ *         }
+ *       });
+ *   </file>
+ *   <file name="main.html">
+ *     <div>
+ *       This is equivalent to `ngClick` and `ngMouseover`:<br>
+ *       <button
+ *         ng-on-click="$ctrl.clickCount = $ctrl.clickCount + 1"
+ *         ng-on-mouseover="$ctrl.mouseoverCount = $ctrl.mouseoverCount + 1">Click or mouseover</button><br>
+ *       clickCount: {{$ctrl.clickCount}}<br>
+ *       mouseover: {{$ctrl.mouseoverCount}}
+ *
+ *       <hr>
+ *
+ *       For the `error` and `load` event on images no built-in AngularJS directives exist:<br>
+ *       <img src="thisimagedoesnotexist.png" ng-on-error="$ctrl.loadingState = -1" ng-on-load="$ctrl.loadingState = 1"><br>
+ *       <div ng-switch="$ctrl.loadingState">
+ *         <span ng-switch-when="0">Image is loading</span>
+ *         <span ng-switch-when="-1">Image load error</span>
+ *         <span ng-switch-when="1">Image loaded successfully</span>
+ *       </div>
+ *     </div>
+ *   </file>
+ *   <file name="index.html">
+ *     <main></main>
+ *   </file>
+ * </example>
+ *
+ *
+ * @example
+ * ### Bind to custom DOM events
+ *
+ * <example name="ngOnCustom" module="exampleNgOn">
+ *   <file name="app.js">
+ *     angular.module('exampleNgOn', [])
+ *       .component('main', {
+ *         templateUrl: 'main.html',
+ *         controller: function() {
+ *           this.eventLog = '';
+ *
+ *           this.listener = function($event) {
+ *             this.eventLog = 'Event with type "' + $event.type + '" fired at ' + $event.detail;
+ *           };
+ *         }
+ *       })
+ *       .component('childComponent', {
+ *         templateUrl: 'child.html',
+ *         controller: function($element) {
+ *           this.fireEvent = function() {
+ *             var event = new CustomEvent('customtype', { detail: new Date()});
+ *
+ *             $element[0].dispatchEvent(event);
+ *           };
+ *         }
+ *       });
+ *   </file>
+ *   <file name="main.html">
+ *     <child-component ng-on-customtype="$ctrl.listener($event)"></child-component><br>
+ *     <span>Event log: {{$ctrl.eventLog}}</span>
+ *   </file>
+ *   <file name="child.html">
+      <button ng-click="$ctrl.fireEvent()">Fire custom event</button>
+ *   </file>
+ *   <file name="index.html">
+ *     <main></main>
+ *   </file>
+ * </example>
+ */
+
+var $compileMinErr = minErr('$compile');
+
+function UNINITIALIZED_VALUE() {}
+var _UNINITIALIZED_VALUE = new UNINITIALIZED_VALUE();
+
+/**
+ * @ngdoc provider
+ * @name $compileProvider
+ *
+ * @description
+ */
+$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];
+/** @this */
+function $CompileProvider($provide, $$sanitizeUriProvider) {
+  var hasDirectives = {},
+      Suffix = 'Directive',
+      COMMENT_DIRECTIVE_REGEXP = /^\s*directive:\s*([\w-]+)\s+(.*)$/,
+      CLASS_DIRECTIVE_REGEXP = /(([\w-]+)(?::([^;]+))?;?)/,
+      ALL_OR_NOTHING_ATTRS = makeMap('ngSrc,ngSrcset,src,srcset'),
+      REQUIRE_PREFIX_REGEXP = /^(?:(\^\^?)?(\?)?(\^\^?)?)?/;
+
+  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes
+  // The assumption is that future DOM event attribute names will begin with
+  // 'on' and be composed of only English letters.
+  var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;
+  var bindingCache = createMap();
+
+  function parseIsolateBindings(scope, directiveName, isController) {
+    var LOCAL_REGEXP = /^([@&]|[=<](\*?))(\??)\s*([\w$]*)$/;
+
+    var bindings = createMap();
+
+    forEach(scope, function(definition, scopeName) {
+      definition = definition.trim();
+
+      if (definition in bindingCache) {
+        bindings[scopeName] = bindingCache[definition];
+        return;
+      }
+      var match = definition.match(LOCAL_REGEXP);
+
+      if (!match) {
+        throw $compileMinErr('iscp',
+            'Invalid {3} for directive \'{0}\'.' +
+            ' Definition: {... {1}: \'{2}\' ...}',
+            directiveName, scopeName, definition,
+            (isController ? 'controller bindings definition' :
+            'isolate scope definition'));
+      }
+
+      bindings[scopeName] = {
+        mode: match[1][0],
+        collection: match[2] === '*',
+        optional: match[3] === '?',
+        attrName: match[4] || scopeName
+      };
+      if (match[4]) {
+        bindingCache[definition] = bindings[scopeName];
+      }
+    });
+
+    return bindings;
+  }
+
+  function parseDirectiveBindings(directive, directiveName) {
+    var bindings = {
+      isolateScope: null,
+      bindToController: null
     };
     if (isObject(directive.scope)) {
       if (directive.bindToController === true) {
@@ -7854,9 +8823,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
    * @description
    * Register a new directive with the compiler.
    *
-   * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which
-   *    will match as <code>ng-bind</code>), or an object map of directives where the keys are the
-   *    names and the values are the factories.
+   * @param {string|Object} name Name of the directive in camel-case (i.e. `ngBind` which will match
+   *    as `ng-bind`), or an object map of directives where the keys are the names and the values
+   *    are the factories.
    * @param {Function|Array} directiveFactory An injectable directive factory function. See the
    *    {@link guide/directive directive guide} and the {@link $compile compile API} for more info.
    * @returns {ng.$compileProvider} Self for chaining.
@@ -7905,7 +8874,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
    * @ngdoc method
    * @name $compileProvider#component
    * @module ng
-   * @param {string} name Name of the component in camelCase (i.e. `myComp` which will match `<my-comp>`)
+   * @param {string|Object} name Name of the component in camelCase (i.e. `myComp` which will match `<my-comp>`),
+   *    or an object map of components where the keys are the names and the values are the component definition objects.
    * @param {Object} options Component definition object (a simplified
    *    {@link ng.$compile#directive-definition-object directive definition object}),
    *    with the following properties (all optional):
@@ -7988,6 +8958,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
    * See also {@link ng.$compileProvider#directive $compileProvider.directive()}.
    */
   this.component = function registerComponent(name, options) {
+    if (!isString(name)) {
+      forEach(name, reverseParams(bind(this, registerComponent)));
+      return this;
+    }
+
     var controller = options.controller || function() {};
 
     function factory($injector) {
@@ -8024,7 +8999,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
 
     // TODO(pete) remove the following `forEach` before we release 1.6.0
     // The component-router@0.2.0 looks for the annotations on the controller constructor
-    // Nothing in Angular looks for annotations on the factory function but we can't remove
+    // Nothing in AngularJS looks for annotations on the factory function but we can't remove
     // it from 1.5.x yet.
 
     // Copy any annotation properties (starting with $) over to the factory and controller constructor functions
@@ -8117,7 +9092,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
    * binding information and a reference to the current scope on to DOM elements.
    * If enabled, the compiler will add the following to DOM elements that have been bound to the scope
    * * `ng-binding` CSS class
+   * * `ng-scope` and `ng-isolated-scope` CSS classes
    * * `$binding` data property containing an array of the binding expressions
+   * * Data properties used by the {@link angular.element#methods `scope()`/`isolateScope()` methods} to return
+   *   the element's scope.
+   * * Placeholder comments will contain information about what directive and binding caused the placeholder.
+   *   E.g. `<!-- ngIf: shouldShow() -->`.
    *
    * You may want to disable this in production for a significant performance boost. See
    * {@link guide/production#disabling-debug-data Disabling Debug Data} for more.
@@ -8135,34 +9115,33 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
 
   /**
    * @ngdoc method
-   * @name  $compileProvider#preAssignBindingsEnabled
+   * @name  $compileProvider#strictComponentBindingsEnabled
    *
-   * @param {boolean=} enabled update the preAssignBindingsEnabled state if provided, otherwise just return the
-   * current preAssignBindingsEnabled state
+   * @param {boolean=} enabled update the strictComponentBindingsEnabled state if provided,
+   * otherwise return the current strictComponentBindingsEnabled state.
    * @returns {*} current value if used as getter or itself (chaining) if used as setter
    *
    * @kind function
    *
    * @description
-   * Call this method to enable/disable whether directive controllers are assigned bindings before
-   * calling the controller's constructor.
-   * If enabled (true), the compiler assigns the value of each of the bindings to the
-   * properties of the controller object before the constructor of this object is called.
-   *
-   * If disabled (false), the compiler calls the constructor first before assigning bindings.
-   *
-   * The default value is true in Angular 1.5.x but will switch to false in Angular 1.6.x.
+   * Call this method to enable / disable the strict component bindings check. If enabled, the
+   * compiler will enforce that all scope / controller bindings of a
+   * {@link $compileProvider#directive directive} / {@link $compileProvider#component component}
+   * that are not set as optional with `?`, must be provided when the directive is instantiated.
+   * If not provided, the compiler will throw the
+   * {@link error/$compile/missingattr $compile:missingattr error}.
+   *
+   * The default value is false.
    */
-  var preAssignBindingsEnabled = true;
-  this.preAssignBindingsEnabled = function(enabled) {
+  var strictComponentBindingsEnabled = false;
+  this.strictComponentBindingsEnabled = function(enabled) {
     if (isDefined(enabled)) {
-      preAssignBindingsEnabled = enabled;
+      strictComponentBindingsEnabled = enabled;
       return this;
     }
-    return preAssignBindingsEnabled;
+    return strictComponentBindingsEnabled;
   };
 
-
   var TTL = 10;
   /**
    * @ngdoc method
@@ -8249,11 +9228,96 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
     return cssClassDirectivesEnabledConfig;
   };
 
+
+  /**
+   * The security context of DOM Properties.
+   * @private
+   */
+  var PROP_CONTEXTS = createMap();
+
+  /**
+   * @ngdoc method
+   * @name $compileProvider#addPropertySecurityContext
+   * @description
+   *
+   * Defines the security context for DOM properties bound by ng-prop-*.
+   *
+   * @param {string} elementName The element name or '*' to match any element.
+   * @param {string} propertyName The DOM property name.
+   * @param {string} ctx The {@link $sce} security context in which this value is safe for use, e.g. `$sce.URL`
+   * @returns {object} `this` for chaining
+   */
+  this.addPropertySecurityContext = function(elementName, propertyName, ctx) {
+    var key = (elementName.toLowerCase() + '|' + propertyName.toLowerCase());
+
+    if (key in PROP_CONTEXTS && PROP_CONTEXTS[key] !== ctx) {
+      throw $compileMinErr('ctxoverride', 'Property context \'{0}.{1}\' already set to \'{2}\', cannot override to \'{3}\'.', elementName, propertyName, PROP_CONTEXTS[key], ctx);
+    }
+
+    PROP_CONTEXTS[key] = ctx;
+    return this;
+  };
+
+  /* Default property contexts.
+   *
+   * Copy of https://github.com/angular/angular/blob/6.0.6/packages/compiler/src/schema/dom_security_schema.ts#L31-L58
+   * Changing:
+   * - SecurityContext.* => SCE_CONTEXTS/$sce.*
+   * - STYLE => CSS
+   * - various URL => MEDIA_URL
+   * - *|formAction, form|action URL => RESOURCE_URL (like the attribute)
+   */
+  (function registerNativePropertyContexts() {
+    function registerContext(ctx, values) {
+      forEach(values, function(v) { PROP_CONTEXTS[v.toLowerCase()] = ctx; });
+    }
+
+    registerContext(SCE_CONTEXTS.HTML, [
+      'iframe|srcdoc',
+      '*|innerHTML',
+      '*|outerHTML'
+    ]);
+    registerContext(SCE_CONTEXTS.CSS, ['*|style']);
+    registerContext(SCE_CONTEXTS.URL, [
+      'area|href',       'area|ping',
+      'a|href',          'a|ping',
+      'blockquote|cite',
+      'body|background',
+      'del|cite',
+      'input|src',
+      'ins|cite',
+      'q|cite'
+    ]);
+    registerContext(SCE_CONTEXTS.MEDIA_URL, [
+      'audio|src',
+      'img|src',    'img|srcset',
+      'source|src', 'source|srcset',
+      'track|src',
+      'video|src',  'video|poster'
+    ]);
+    registerContext(SCE_CONTEXTS.RESOURCE_URL, [
+      '*|formAction',
+      'applet|code',      'applet|codebase',
+      'base|href',
+      'embed|src',
+      'frame|src',
+      'form|action',
+      'head|profile',
+      'html|manifest',
+      'iframe|src',
+      'link|href',
+      'media|src',
+      'object|codebase',  'object|data',
+      'script|src'
+    ]);
+  })();
+
+
   this.$get = [
             '$injector', '$interpolate', '$exceptionHandler', '$templateRequest', '$parse',
-            '$controller', '$rootScope', '$sce', '$animate', '$$sanitizeUri',
+            '$controller', '$rootScope', '$sce', '$animate',
     function($injector,   $interpolate,   $exceptionHandler,   $templateRequest,   $parse,
-             $controller,   $rootScope,   $sce,   $animate,   $$sanitizeUri) {
+             $controller,   $rootScope,   $sce,   $animate) {
 
     var SIMPLE_ATTR_NAME = /^\w/;
     var specialAttrHolder = window.document.createElement('div');
@@ -8278,19 +9342,15 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
         }
         // We must run this hook in an apply since the $$postDigest runs outside apply
         $rootScope.$apply(function() {
-          var errors = [];
           for (var i = 0, ii = onChangesQueue.length; i < ii; ++i) {
             try {
               onChangesQueue[i]();
             } catch (e) {
-              errors.push(e);
+              $exceptionHandler(e);
             }
           }
           // Reset the queue to trigger a new schedule next time there is a change
           onChangesQueue = undefined;
-          if (errors.length) {
-            throw errors;
-          }
         });
       } finally {
         onChangesTtl++;
@@ -8298,6 +9358,57 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
     }
 
 
+    function sanitizeSrcset(value, invokeType) {
+      if (!value) {
+        return value;
+      }
+      if (!isString(value)) {
+        throw $compileMinErr('srcset', 'Can\'t pass trusted values to `{0}`: "{1}"', invokeType, value.toString());
+      }
+
+      // Such values are a bit too complex to handle automatically inside $sce.
+      // Instead, we sanitize each of the URIs individually, which works, even dynamically.
+
+      // It's not possible to work around this using `$sce.trustAsMediaUrl`.
+      // If you want to programmatically set explicitly trusted unsafe URLs, you should use
+      // `$sce.trustAsHtml` on the whole `img` tag and inject it into the DOM using the
+      // `ng-bind-html` directive.
+
+      var result = '';
+
+      // first check if there are spaces because it's not the same pattern
+      var trimmedSrcset = trim(value);
+      //                (   999x   ,|   999w   ,|   ,|,   )
+      var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/;
+      var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/;
+
+      // split srcset into tuple of uri and descriptor except for the last item
+      var rawUris = trimmedSrcset.split(pattern);
+
+      // for each tuples
+      var nbrUrisWith2parts = Math.floor(rawUris.length / 2);
+      for (var i = 0; i < nbrUrisWith2parts; i++) {
+        var innerIdx = i * 2;
+        // sanitize the uri
+        result += $sce.getTrustedMediaUrl(trim(rawUris[innerIdx]));
+        // add the descriptor
+        result += ' ' + trim(rawUris[innerIdx + 1]);
+      }
+
+      // split the last item into uri and descriptor
+      var lastTuple = trim(rawUris[i * 2]).split(/\s/);
+
+      // sanitize the last uri
+      result += $sce.getTrustedMediaUrl(trim(lastTuple[0]));
+
+      // and add the last descriptor if any
+      if (lastTuple.length === 2) {
+        result += (' ' + trim(lastTuple[1]));
+      }
+      return result;
+    }
+
+
     function Attributes(element, attributesToCopy) {
       if (attributesToCopy) {
         var keys = Object.keys(attributesToCopy);
@@ -8402,8 +9513,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
        */
       $set: function(key, value, writeAttr, attrName) {
         // TODO: decide whether or not to throw an error if "class"
-        //is set through this function since it may cause $updateClass to
-        //become unstable.
+        // is set through this function since it may cause $updateClass to
+        // become unstable.
 
         var node = this.$$element[0],
             booleanKey = getBooleanAttrName(node, key),
@@ -8433,44 +9544,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
 
         nodeName = nodeName_(this.$$element);
 
-        if ((nodeName === 'a' && (key === 'href' || key === 'xlinkHref')) ||
-            (nodeName === 'img' && key === 'src')) {
-          // sanitize a[href] and img[src] values
-          this[key] = value = $$sanitizeUri(value, key === 'src');
-        } else if (nodeName === 'img' && key === 'srcset' && isDefined(value)) {
-          // sanitize img[srcset] values
-          var result = '';
-
-          // first check if there are spaces because it's not the same pattern
-          var trimmedSrcset = trim(value);
-          //                (   999x   ,|   999w   ,|   ,|,   )
-          var srcPattern = /(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/;
-          var pattern = /\s/.test(trimmedSrcset) ? srcPattern : /(,)/;
-
-          // split srcset into tuple of uri and descriptor except for the last item
-          var rawUris = trimmedSrcset.split(pattern);
-
-          // for each tuples
-          var nbrUrisWith2parts = Math.floor(rawUris.length / 2);
-          for (var i = 0; i < nbrUrisWith2parts; i++) {
-            var innerIdx = i * 2;
-            // sanitize the uri
-            result += $$sanitizeUri(trim(rawUris[innerIdx]), true);
-            // add the descriptor
-            result += (' ' + trim(rawUris[innerIdx + 1]));
-          }
-
-          // split the last item into uri and descriptor
-          var lastTuple = trim(rawUris[i * 2]).split(/\s/);
-
-          // sanitize the last uri
-          result += $$sanitizeUri(trim(lastTuple[0]), true);
-
-          // and add the last descriptor if any
-          if (lastTuple.length === 2) {
-            result += (' ' + trim(lastTuple[1]));
-          }
-          this[key] = value = result;
+        // Sanitize img[srcset] values.
+        if (nodeName === 'img' && key === 'srcset') {
+          this[key] = value = sanitizeSrcset(value, '$set(\'srcset\', value)');
         }
 
         if (writeAttr !== false) {
@@ -8478,7 +9554,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
             this.$$element.removeAttr(attrName);
           } else {
             if (SIMPLE_ATTR_NAME.test(attrName)) {
-              this.$$element.attr(attrName, value);
+              // jQuery skips special boolean attrs treatment in XML nodes for
+              // historical reasons and hence AngularJS cannot freely call
+              // `.attr(attrName, false) with such attributes. To avoid issues
+              // in XHTML, call `removeAttr` in such cases instead.
+              // See https://github.com/jquery/jquery/issues/4249
+              if (booleanKey && value === false) {
+                this.$$element.removeAttr(attrName);
+              } else {
+                this.$$element.attr(attrName, value);
+              }
             } else {
               setSpecialAttr(this.$$element[0], attrName, value);
             }
@@ -8567,7 +9652,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
             : function denormalizeTemplate(template) {
               return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol);
         },
-        NG_ATTR_BINDING = /^ngAttr[A-Z]/;
+        NG_PREFIX_BINDING = /^ng(Attr|Prop|On)([A-Z].*)$/;
     var MULTI_ELEMENT_DIR_RE = /^(.+)Start$/;
 
     compile.$$addBindingInfo = debugInfoEnabled ? function $$addBindingInfo($element, binding) {
@@ -8615,25 +9700,15 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
         // modify it.
         $compileNodes = jqLite($compileNodes);
       }
-
-      var NOT_EMPTY = /\S+/;
-
-      // We can not compile top level text elements since text nodes can be merged and we will
-      // not be able to attach scope data to them, so we will wrap them in <span>
-      for (var i = 0, len = $compileNodes.length; i < len; i++) {
-        var domNode = $compileNodes[i];
-
-        if (domNode.nodeType === NODE_TYPE_TEXT && domNode.nodeValue.match(NOT_EMPTY) /* non-empty */) {
-          jqLiteWrapNode(domNode, $compileNodes[i] = window.document.createElement('span'));
-        }
-      }
-
       var compositeLinkFn =
               compileNodes($compileNodes, transcludeFn, $compileNodes,
                            maxPriority, ignoreDirective, previousCompileContext);
       compile.$$addScopeClass($compileNodes);
       var namespace = null;
       return function publicLinkFn(scope, cloneConnectFn, options) {
+        if (!$compileNodes) {
+          throw $compileMinErr('multilink', 'This element has already been linked.');
+        }
         assertArg(scope, 'scope');
 
         if (previousCompileContext && previousCompileContext.needsNewScope) {
@@ -8668,7 +9743,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
           // for call to the link function.
           // Note: This will already clone the nodes...
           $linkNode = jqLite(
-            wrapTemplate(namespace, jqLite('<div>').append($compileNodes).html())
+            wrapTemplate(namespace, jqLite('<div></div>').append($compileNodes).html())
           );
         } else if (cloneConnectFn) {
           // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart
@@ -8688,6 +9763,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
 
         if (cloneConnectFn) cloneConnectFn($linkNode, scope);
         if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn);
+
+        if (!cloneConnectFn) {
+          $compileNodes = compositeLinkFn = null;
+        }
         return $linkNode;
       };
     }
@@ -8720,12 +9799,23 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
     function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,
                             previousCompileContext) {
       var linkFns = [],
+          // `nodeList` can be either an element's `.childNodes` (live NodeList)
+          // or a jqLite/jQuery collection or an array
+          notLiveList = isArray(nodeList) || (nodeList instanceof jqLite),
           attrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound, nodeLinkFnFound;
 
+
       for (var i = 0; i < nodeList.length; i++) {
         attrs = new Attributes();
 
-        // we must always refer to nodeList[i] since the nodes can be replaced underneath us.
+        // Support: IE 11 only
+        // Workaround for #11781 and #14924
+        if (msie === 11) {
+          mergeConsecutiveTextNodes(nodeList, i, notLiveList);
+        }
+
+        // We must always refer to `nodeList[i]` hereafter,
+        // since the nodes can be replaced underneath us.
         directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,
                                         ignoreDirective);
 
@@ -8816,10 +9906,36 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
       }
     }
 
-    function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {
-      function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {
+    function mergeConsecutiveTextNodes(nodeList, idx, notLiveList) {
+      var node = nodeList[idx];
+      var parent = node.parentNode;
+      var sibling;
 
-        if (!transcludedScope) {
+      if (node.nodeType !== NODE_TYPE_TEXT) {
+        return;
+      }
+
+      while (true) {
+        sibling = parent ? node.nextSibling : nodeList[idx + 1];
+        if (!sibling || sibling.nodeType !== NODE_TYPE_TEXT) {
+          break;
+        }
+
+        node.nodeValue = node.nodeValue + sibling.nodeValue;
+
+        if (sibling.parentNode) {
+          sibling.parentNode.removeChild(sibling);
+        }
+        if (notLiveList && sibling === nodeList[idx + 1]) {
+          nodeList.splice(idx + 1, 1);
+        }
+      }
+    }
+
+    function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {
+      function boundTranscludeFn(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {
+
+        if (!transcludedScope) {
           transcludedScope = scope.$new(false, containingScope);
           transcludedScope.$$transcluded = true;
         }
@@ -8872,43 +9988,66 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
               directiveNormalize(nodeName), 'E', maxPriority, ignoreDirective);
 
           // iterate over the attributes
-          for (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,
+          for (var attr, name, nName, value, ngPrefixMatch, nAttrs = node.attributes,
                    j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
             var attrStartName = false;
             var attrEndName = false;
 
+            var isNgAttr = false, isNgProp = false, isNgEvent = false;
+            var multiElementMatch;
+
             attr = nAttrs[j];
             name = attr.name;
-            value = trim(attr.value);
+            value = attr.value;
+
+            nName = directiveNormalize(name.toLowerCase());
+
+            // Support ng-attr-*, ng-prop-* and ng-on-*
+            if ((ngPrefixMatch = nName.match(NG_PREFIX_BINDING))) {
+              isNgAttr = ngPrefixMatch[1] === 'Attr';
+              isNgProp = ngPrefixMatch[1] === 'Prop';
+              isNgEvent = ngPrefixMatch[1] === 'On';
 
-            // support ngAttr attribute binding
-            ngAttrName = directiveNormalize(name);
-            isNgAttr = NG_ATTR_BINDING.test(ngAttrName);
-            if (isNgAttr) {
+              // Normalize the non-prefixed name
               name = name.replace(PREFIX_REGEXP, '')
-                .substr(8).replace(/_(.)/g, function(match, letter) {
+                .toLowerCase()
+                .substr(4 + ngPrefixMatch[1].length).replace(/_(.)/g, function(match, letter) {
                   return letter.toUpperCase();
                 });
-            }
 
-            var multiElementMatch = ngAttrName.match(MULTI_ELEMENT_DIR_RE);
-            if (multiElementMatch && directiveIsMultiElement(multiElementMatch[1])) {
+            // Support *-start / *-end multi element directives
+            } else if ((multiElementMatch = nName.match(MULTI_ELEMENT_DIR_RE)) && directiveIsMultiElement(multiElementMatch[1])) {
               attrStartName = name;
               attrEndName = name.substr(0, name.length - 5) + 'end';
               name = name.substr(0, name.length - 6);
             }
 
-            nName = directiveNormalize(name.toLowerCase());
-            attrsMap[nName] = name;
-            if (isNgAttr || !attrs.hasOwnProperty(nName)) {
+            if (isNgProp || isNgEvent) {
+              attrs[nName] = value;
+              attrsMap[nName] = attr.name;
+
+              if (isNgProp) {
+                addPropertyDirective(node, directives, nName, name);
+              } else {
+                addEventDirective(directives, nName, name);
+              }
+            } else {
+              // Update nName for cases where a prefix was removed
+              // NOTE: the .toLowerCase() is unnecessary and causes https://github.com/angular/angular.js/issues/16624 for ng-attr-*
+              nName = directiveNormalize(name.toLowerCase());
+              attrsMap[nName] = name;
+
+              if (isNgAttr || !attrs.hasOwnProperty(nName)) {
                 attrs[nName] = value;
                 if (getBooleanAttrName(node, nName)) {
                   attrs[nName] = true; // presence means true
                 }
+              }
+
+              addAttrInterpolateDirective(node, directives, value, nName, isNgAttr);
+              addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,
+                            attrEndName);
             }
-            addAttrInterpolateDirective(node, directives, value, nName, isNgAttr);
-            addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,
-                          attrEndName);
           }
 
           if (nodeName === 'input' && node.getAttribute('type') === 'hidden') {
@@ -8935,13 +10074,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
           }
           break;
         case NODE_TYPE_TEXT: /* Text Node */
-          if (msie === 11) {
-            // Workaround for #11781
-            while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) {
-              node.nodeValue = node.nodeValue + node.nextSibling.nodeValue;
-              node.parentNode.removeChild(node.nextSibling);
-            }
-          }
           addTextInterpolateDirective(directives, node.nodeValue);
           break;
         case NODE_TYPE_COMMENT: /* Comment */
@@ -9188,17 +10320,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
             compileNode = $compileNode[0];
             replaceWith(jqCollection, sliceArgs($template), compileNode);
 
-            // Support: Chrome < 50
-            // https://github.com/angular/angular.js/issues/14041
-
-            // In the versions of V8 prior to Chrome 50, the document fragment that is created
-            // in the `replaceWith` function is improperly garbage collected despite still
-            // being referenced by the `parentNode` property of all of the child nodes.  By adding
-            // a reference to the fragment via a different property, we can avoid that incorrect
-            // behavior.
-            // TODO: remove this line after Chrome 50 has been released
-            $template[0].$$parentNode = $template[0].parentNode;
-
             childTranscludeFn = compilationGenerator(mightHaveMultipleTransclusionError, $template, transcludeFn, terminalPriority,
                                         replaceDirective && replaceDirective.name, {
                                           // Don't pass in:
@@ -9214,13 +10335,13 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
 
             var slots = createMap();
 
-            $template = jqLite(jqLiteClone(compileNode)).contents();
-
-            if (isObject(directiveValue)) {
+            if (!isObject(directiveValue)) {
+              $template = jqLite(jqLiteClone(compileNode)).contents();
+            } else {
 
               // We have transclusion slots,
               // collect them up, compile them and store their transclusion functions
-              $template = [];
+              $template = window.document.createDocumentFragment();
 
               var slotMap = createMap();
               var filledSlots = createMap();
@@ -9248,10 +10369,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
                 var slotName = slotMap[directiveNormalize(nodeName_(node))];
                 if (slotName) {
                   filledSlots[slotName] = true;
-                  slots[slotName] = slots[slotName] || [];
-                  slots[slotName].push(node);
+                  slots[slotName] = slots[slotName] || window.document.createDocumentFragment();
+                  slots[slotName].appendChild(node);
                 } else {
-                  $template.push(node);
+                  $template.appendChild(node);
                 }
               });
 
@@ -9265,9 +10386,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
               for (var slotName in slots) {
                 if (slots[slotName]) {
                   // Only define a transclusion function if the slot was filled
-                  slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slots[slotName], transcludeFn);
+                  var slotCompileNodes = jqLite(slots[slotName].childNodes);
+                  slots[slotName] = compilationGenerator(mightHaveMultipleTransclusionError, slotCompileNodes, transcludeFn);
                 }
               }
+
+              $template = jqLite($template.childNodes);
             }
 
             $compileNode.empty(); // clear contents
@@ -9458,33 +10582,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
           var controller = elementControllers[name];
           var bindings = controllerDirective.$$bindings.bindToController;
 
-          if (preAssignBindingsEnabled) {
-            if (bindings) {
-              controller.bindingInfo =
-                initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);
-            } else {
-              controller.bindingInfo = {};
-            }
-
-            var controllerResult = controller();
-            if (controllerResult !== controller.instance) {
-              // If the controller constructor has a return value, overwrite the instance
-              // from setupControllers
-              controller.instance = controllerResult;
-              $element.data('$' + controllerDirective.name + 'Controller', controllerResult);
-              if (controller.bindingInfo.removeWatches) {
-                controller.bindingInfo.removeWatches();
-              }
-              controller.bindingInfo =
-                initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);
-            }
-          } else {
-            controller.instance = controller();
-            $element.data('$' + controllerDirective.name + 'Controller', controller.instance);
-            controller.bindingInfo =
-              initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);
+          controller.instance = controller();
+          $element.data('$' + controllerDirective.name + 'Controller', controller.instance);
+          controller.bindingInfo =
+            initializeDirectiveBindings(controllerScope, attrs, controller.instance, bindings, controllerDirective);
           }
-        }
 
         // Bind the required controllers to the controller, if `require` is an object and `bindToController` is truthy
         forEach(controllerDirectives, function(controllerDirective, name) {
@@ -9625,7 +10727,14 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
 
         if (!value) {
           var dataName = '$' + name + 'Controller';
-          value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName);
+
+          if (inheritType === '^^' && $element[0] && $element[0].nodeType === NODE_TYPE_DOCUMENT) {
+            // inheritedData() uses the documentElement when it finds the document, so we would
+            // require from the element itself.
+            value = null;
+          } else {
+            value = inheritType ? $element.inheritedData(dataName) : $element.data(dataName);
+          }
         }
 
         if (!value && !optional) {
@@ -9768,7 +10877,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
       forEach(dst, function(value, key) {
         if (key.charAt(0) !== '$') {
           if (src[key] && src[key] !== value) {
-            value += (key === 'style' ? ';' : ' ') + src[key];
+            if (value.length) {
+              value += (key === 'style' ? ';' : ' ') + src[key];
+            } else {
+              value = src[key];
+            }
           }
           dst.$set(key, value, true, srcAttr[key]);
         }
@@ -9887,6 +11000,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
               childBoundTranscludeFn);
           }
           linkQueue = null;
+        }).catch(function(error) {
+          if (isError(error)) {
+            $exceptionHandler(error);
+          }
         });
 
       return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {
@@ -9974,28 +11091,95 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
     }
 
 
-    function getTrustedContext(node, attrNormalizedName) {
+    function getTrustedAttrContext(nodeName, attrNormalizedName) {
       if (attrNormalizedName === 'srcdoc') {
         return $sce.HTML;
       }
-      var tag = nodeName_(node);
-      // All tags with src attributes require a RESOURCE_URL value, except for
-      // img and various html5 media tags.
+      // All nodes with src attributes require a RESOURCE_URL value, except for
+      // img and various html5 media nodes, which require the MEDIA_URL context.
       if (attrNormalizedName === 'src' || attrNormalizedName === 'ngSrc') {
-        if (['img', 'video', 'audio', 'source', 'track'].indexOf(tag) === -1) {
+        if (['img', 'video', 'audio', 'source', 'track'].indexOf(nodeName) === -1) {
           return $sce.RESOURCE_URL;
         }
-      // maction[xlink:href] can source SVG.  It's not limited to <maction>.
-      } else if (attrNormalizedName === 'xlinkHref' ||
-          (tag === 'form' && attrNormalizedName === 'action')
+        return $sce.MEDIA_URL;
+      } else if (attrNormalizedName === 'xlinkHref') {
+        // Some xlink:href are okay, most aren't
+        if (nodeName === 'image') return $sce.MEDIA_URL;
+        if (nodeName === 'a') return $sce.URL;
+        return $sce.RESOURCE_URL;
+      } else if (
+          // Formaction
+          (nodeName === 'form' && attrNormalizedName === 'action') ||
+          // If relative URLs can go where they are not expected to, then
+          // all sorts of trust issues can arise.
+          (nodeName === 'base' && attrNormalizedName === 'href') ||
+          // links can be stylesheets or imports, which can run script in the current origin
+          (nodeName === 'link' && attrNormalizedName === 'href')
       ) {
         return $sce.RESOURCE_URL;
+      } else if (nodeName === 'a' && (attrNormalizedName === 'href' ||
+                                 attrNormalizedName === 'ngHref')) {
+        return $sce.URL;
+      }
+    }
+
+    function getTrustedPropContext(nodeName, propNormalizedName) {
+      var prop = propNormalizedName.toLowerCase();
+      return PROP_CONTEXTS[nodeName + '|' + prop] || PROP_CONTEXTS['*|' + prop];
+    }
+
+    function sanitizeSrcsetPropertyValue(value) {
+      return sanitizeSrcset($sce.valueOf(value), 'ng-prop-srcset');
+    }
+    function addPropertyDirective(node, directives, attrName, propName) {
+      if (EVENT_HANDLER_ATTR_REGEXP.test(propName)) {
+        throw $compileMinErr('nodomevents', 'Property bindings for HTML DOM event properties are disallowed');
+      }
+
+      var nodeName = nodeName_(node);
+      var trustedContext = getTrustedPropContext(nodeName, propName);
+
+      var sanitizer = identity;
+      // Sanitize img[srcset] + source[srcset] values.
+      if (propName === 'srcset' && (nodeName === 'img' || nodeName === 'source')) {
+        sanitizer = sanitizeSrcsetPropertyValue;
+      } else if (trustedContext) {
+        sanitizer = $sce.getTrusted.bind($sce, trustedContext);
       }
+
+      directives.push({
+        priority: 100,
+        compile: function ngPropCompileFn(_, attr) {
+          var ngPropGetter = $parse(attr[attrName]);
+          var ngPropWatch = $parse(attr[attrName], function sceValueOf(val) {
+            // Unwrap the value to compare the actual inner safe value, not the wrapper object.
+            return $sce.valueOf(val);
+          });
+
+          return {
+            pre: function ngPropPreLinkFn(scope, $element) {
+              function applyPropValue() {
+                var propValue = ngPropGetter(scope);
+                $element[0][propName] = sanitizer(propValue);
+              }
+
+              applyPropValue();
+              scope.$watch(ngPropWatch, applyPropValue);
+            }
+          };
+        }
+      });
     }
 
+    function addEventDirective(directives, attrName, eventName) {
+      directives.push(
+        createEventDirective($parse, $rootScope, $exceptionHandler, attrName, eventName, /*forceAsync=*/false)
+      );
+    }
 
     function addAttrInterpolateDirective(node, directives, value, name, isNgAttr) {
-      var trustedContext = getTrustedContext(node, name);
+      var nodeName = nodeName_(node);
+      var trustedContext = getTrustedAttrContext(nodeName, name);
       var mustHaveExpression = !isNgAttr;
       var allOrNothing = ALL_OR_NOTHING_ATTRS[name] || isNgAttr;
 
@@ -10004,12 +11188,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
       // no interpolation found -> ignore
       if (!interpolateFn) return;
 
-      if (name === 'multiple' && nodeName_(node) === 'select') {
+      if (name === 'multiple' && nodeName === 'select') {
         throw $compileMinErr('selmulti',
             'Binding to the \'multiple\' attribute is not supported. Element: {0}',
             startingTag(node));
       }
 
+      if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {
+        throw $compileMinErr('nodomevents', 'Interpolations for HTML DOM event attributes are disallowed');
+      }
+
       directives.push({
         priority: 100,
         compile: function() {
@@ -10017,12 +11205,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
               pre: function attrInterpolatePreLinkFn(scope, element, attr) {
                 var $$observers = (attr.$$observers || (attr.$$observers = createMap()));
 
-                if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {
-                  throw $compileMinErr('nodomevents',
-                      'Interpolations for HTML DOM event attributes are disallowed.  Please use the ' +
-                          'ng- versions (such as ng-click instead of onclick) instead.');
-                }
-
                 // If the attribute has changed since last $interpolate()ed
                 var newValue = attr[name];
                 if (newValue !== value) {
@@ -10120,7 +11302,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
       }
 
       if (jqLite.hasData(firstElementToRemove)) {
-        // Copy over user data (that includes Angular's $scope etc.). Don't copy private
+        // Copy over user data (that includes AngularJS's $scope etc.). Don't copy private
         // data here because there's no public interface in jQuery to do that and copying over
         // event listeners (which is the main use of private data) wouldn't work anyway.
         jqLite.data(newNode, jqLite.data(firstElementToRemove));
@@ -10155,12 +11337,20 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
       }
     }
 
+    function strictBindingsCheck(attrName, directiveName) {
+      if (strictComponentBindingsEnabled) {
+        throw $compileMinErr('missingattr',
+          'Attribute \'{0}\' of \'{1}\' is non-optional and must be set!',
+          attrName, directiveName);
+      }
+    }
 
     // Set up $watches for isolate scope and controller bindings.
     function initializeDirectiveBindings(scope, attrs, destination, bindings, directive) {
       var removeWatchCollection = [];
       var initialChanges = {};
       var changes;
+
       forEach(bindings, function initializeBinding(definition, scopeName) {
         var attrName = definition.attrName,
         optional = definition.optional,
@@ -10172,7 +11362,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
 
           case '@':
             if (!optional && !hasOwnProperty.call(attrs, attrName)) {
+              strictBindingsCheck(attrName, directive.name);
               destination[scopeName] = attrs[attrName] = undefined;
+
             }
             removeWatch = attrs.$observe(attrName, function(value) {
               if (isString(value) || isBoolean(value)) {
@@ -10188,7 +11380,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
               // the value is there for use in the link fn
               destination[scopeName] = $interpolate(lastValue)(scope);
             } else if (isBoolean(lastValue)) {
-              // If the attributes is one of the BOOLEAN_ATTR then Angular will have converted
+              // If the attributes is one of the BOOLEAN_ATTR then AngularJS will have converted
               // the value to boolean rather than a string, so we special case this situation
               destination[scopeName] = lastValue;
             }
@@ -10199,6 +11391,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
           case '=':
             if (!hasOwnProperty.call(attrs, attrName)) {
               if (optional) break;
+              strictBindingsCheck(attrName, directive.name);
               attrs[attrName] = undefined;
             }
             if (optional && !attrs[attrName]) break;
@@ -10207,8 +11400,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
             if (parentGet.literal) {
               compare = equals;
             } else {
-              // eslint-disable-next-line no-self-compare
-              compare = function simpleCompare(a, b) { return a === b || (a !== a && b !== b); };
+              compare = simpleCompare;
             }
             parentSet = parentGet.assign || function() {
               // reset the change, or we will throw this exception on every $digest
@@ -10244,31 +11436,35 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
           case '<':
             if (!hasOwnProperty.call(attrs, attrName)) {
               if (optional) break;
+              strictBindingsCheck(attrName, directive.name);
               attrs[attrName] = undefined;
             }
             if (optional && !attrs[attrName]) break;
 
             parentGet = $parse(attrs[attrName]);
-            var deepWatch = parentGet.literal;
+            var isLiteral = parentGet.literal;
 
             var initialValue = destination[scopeName] = parentGet(scope);
             initialChanges[scopeName] = new SimpleChange(_UNINITIALIZED_VALUE, destination[scopeName]);
 
-            removeWatch = scope.$watch(parentGet, function parentValueWatchAction(newValue, oldValue) {
+            removeWatch = scope[definition.collection ? '$watchCollection' : '$watch'](parentGet, function parentValueWatchAction(newValue, oldValue) {
               if (oldValue === newValue) {
-                if (oldValue === initialValue || (deepWatch && equals(oldValue, initialValue))) {
+                if (oldValue === initialValue || (isLiteral && equals(oldValue, initialValue))) {
                   return;
                 }
                 oldValue = initialValue;
               }
               recordChanges(scopeName, newValue, oldValue);
               destination[scopeName] = newValue;
-            }, deepWatch);
+            });
 
             removeWatchCollection.push(removeWatch);
             break;
 
           case '&':
+            if (!optional && !hasOwnProperty.call(attrs, attrName)) {
+              strictBindingsCheck(attrName, directive.name);
+            }
             // Don't assign Object.prototype method to scope
             parentGet = attrs.hasOwnProperty(attrName) ? $parse(attrs[attrName]) : noop;
 
@@ -10283,9 +11479,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
       });
 
       function recordChanges(key, currentValue, previousValue) {
-        if (isFunction(destination.$onChanges) && currentValue !== previousValue &&
-            // eslint-disable-next-line no-self-compare
-            (currentValue === currentValue || previousValue === previousValue)) {
+        if (isFunction(destination.$onChanges) && !simpleCompare(currentValue, previousValue)) {
           // If we have not already scheduled the top level onChangesQueue handler then do so now
           if (!onChangesQueue) {
             scope.$$postDigest(flushOnChangesQueue);
@@ -10331,12 +11525,18 @@ SimpleChange.prototype.isFirstChange = function() { return this.previousValue ==
 
 
 var PREFIX_REGEXP = /^((?:x|data)[:\-_])/i;
+var SPECIAL_CHARS_REGEXP = /[:\-_]+(.)/g;
+
 /**
  * Converts all accepted directives format into proper directive name.
  * @param name Name to normalize
  */
 function directiveNormalize(name) {
-  return camelCase(name.replace(PREFIX_REGEXP, ''));
+  return name
+    .replace(PREFIX_REGEXP, '')
+    .replace(SPECIAL_CHARS_REGEXP, function(_, letter, offset) {
+      return offset ? letter.toUpperCase() : letter;
+    });
 }
 
 /**
@@ -10346,7 +11546,7 @@ function directiveNormalize(name) {
  * @description
  * A shared object between directive compile / linking functions which contains normalized DOM
  * element attributes. The values reflect current binding state `{{ }}`. The normalization is
- * needed since all of these are treated as equivalent in Angular:
+ * needed since all of these are treated as equivalent in AngularJS:
  *
  * ```
  *    <span ng:bind="a" ng-bind="a" data-ng-bind="a" x-ng-bind="a">
@@ -10452,15 +11652,14 @@ function identifierForController(controller, ident) {
  * @this
  *
  * @description
- * The {@link ng.$controller $controller service} is used by Angular to create new
+ * The {@link ng.$controller $controller service} is used by AngularJS to create new
  * controllers.
  *
  * This provider allows controller registration via the
  * {@link ng.$controllerProvider#register register} method.
  */
 function $ControllerProvider() {
-  var controllers = {},
-      globals = false;
+  var controllers = {};
 
   /**
    * @ngdoc method
@@ -10488,23 +11687,7 @@ function $ControllerProvider() {
     }
   };
 
-  /**
-   * @ngdoc method
-   * @name $controllerProvider#allowGlobals
-   *
-   * @deprecated
-   * sinceVersion="v1.3.0"
-   * removeVersion="v1.7.0"
-   * This method of finding controllers has been deprecated.
-   *
-   * @description If called, allows `$controller` to find controller constructors on `window`   *
-   */
-  this.allowGlobals = function() {
-    globals = true;
-  };
-
-
-  this.$get = ['$injector', '$window', function($injector, $window) {
+  this.$get = ['$injector', function($injector) {
 
     /**
      * @ngdoc service
@@ -10517,8 +11700,6 @@ function $ControllerProvider() {
      *
      *    * check if a controller with given name is registered via `$controllerProvider`
      *    * check if evaluating the string on the current scope returns a constructor
-     *    * if $controllerProvider#allowGlobals, check `window[constructor]` on the global
-     *      `window` object (not recommended)
      *
      *    The string can use the `controller as property` syntax, where the controller instance is published
      *    as the specified property on the `scope`; the `scope` must be injected into `locals` param for this
@@ -10558,8 +11739,7 @@ function $ControllerProvider() {
         identifier = identifier || match[3];
         expression = controllers.hasOwnProperty(constructor)
             ? controllers[constructor]
-            : getter(locals.$scope, constructor, true) ||
-                (globals ? getter($window, constructor, true) : undefined);
+            : getter(locals.$scope, constructor, true);
 
         if (!expression) {
           throw $controllerMinErr('ctrlreg',
@@ -10657,6 +11837,33 @@ function $DocumentProvider() {
   }];
 }
 
+
+/**
+ * @private
+ * @this
+ * Listens for document visibility change and makes the current status accessible.
+ */
+function $$IsDocumentHiddenProvider() {
+  this.$get = ['$document', '$rootScope', function($document, $rootScope) {
+    var doc = $document[0];
+    var hidden = doc && doc.hidden;
+
+    $document.on('visibilitychange', changeListener);
+
+    $rootScope.$on('$destroy', function() {
+      $document.off('visibilitychange', changeListener);
+    });
+
+    function changeListener() {
+      hidden = doc.hidden;
+    }
+
+    return function() {
+      return hidden;
+    };
+  }];
+}
+
 /**
  * @ngdoc service
  * @name $exceptionHandler
@@ -10664,7 +11871,7 @@ function $DocumentProvider() {
  * @this
  *
  * @description
- * Any uncaught exception in angular expressions is delegated to this service.
+ * Any uncaught exception in AngularJS expressions is delegated to this service.
  * The default implementation simply delegates to `$log.error` which logs it into
  * the browser console.
  *
@@ -10741,11 +11948,6 @@ var JSON_ENDS = {
 };
 var JSON_PROTECTION_PREFIX = /^\)]\}',?\n/;
 var $httpMinErr = minErr('$http');
-var $httpMinErrLegacyFn = function(method) {
-  return function() {
-    throw $httpMinErr('legacy', 'The method `{0}` on the promise returned from `$http` has been disabled.', method);
-  };
-};
 
 function serializeValue(v) {
   if (isObject(v)) {
@@ -10771,14 +11973,14 @@ function $HttpParamSerializerProvider() {
    * * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D` (stringified and encoded representation of an object)
    *
    * Note that serializer will sort the request parameters alphabetically.
-   * */
+   */
 
   this.$get = function() {
     return function ngParamSerializer(params) {
       if (!params) return '';
       var parts = [];
       forEachSorted(params, function(value, key) {
-        if (value === null || isUndefined(value)) return;
+        if (value === null || isUndefined(value) || isFunction(value)) return;
         if (isArray(value)) {
           forEach(value, function(v) {
             parts.push(encodeUriQuery(key)  + '=' + encodeUriQuery(serializeValue(v)));
@@ -10838,7 +12040,7 @@ function $HttpParamSerializerJQLikeProvider() {
    * });
    * ```
    *
-   * */
+   */
   this.$get = function() {
     return function jQueryLikeParamSerializer(params) {
       if (!params) return '';
@@ -10847,7 +12049,6 @@ function $HttpParamSerializerJQLikeProvider() {
       return parts.join('&');
 
       function serialize(toSerialize, prefix, topLevel) {
-        if (toSerialize === null || isUndefined(toSerialize)) return;
         if (isArray(toSerialize)) {
           forEach(toSerialize, function(value, index) {
             serialize(value, prefix + '[' + (isObject(value) ? index : '') + ']');
@@ -10860,7 +12061,11 @@ function $HttpParamSerializerJQLikeProvider() {
                 (topLevel ? '' : ']'));
           });
         } else {
-          parts.push(encodeUriQuery(prefix) + '=' + encodeUriQuery(serializeValue(toSerialize)));
+          if (isFunction(toSerialize)) {
+            toSerialize = toSerialize();
+          }
+          parts.push(encodeUriQuery(prefix) + '=' +
+              (toSerialize == null ? '' : encodeUriQuery(serializeValue(toSerialize))));
         }
       }
     };
@@ -10874,8 +12079,18 @@ function defaultHttpResponseTransform(data, headers) {
 
     if (tempData) {
       var contentType = headers('Content-Type');
-      if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) {
-        data = fromJson(tempData);
+      var hasJsonContentType = contentType && (contentType.indexOf(APPLICATION_JSON) === 0);
+
+      if (hasJsonContentType || isJsonLike(tempData)) {
+        try {
+          data = fromJson(tempData);
+        } catch (e) {
+          if (!hasJsonContentType) {
+            return data;
+          }
+          throw $httpMinErr('baddata', 'Data must be a valid JSON object. Received: "{0}". ' +
+          'Parse error: "{1}"', data, e);
+        }
       }
     }
   }
@@ -10985,7 +12200,7 @@ function isSuccess(status) {
  *
  * @description
  * Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service.
- * */
+ */
 function $HttpProvider() {
   /**
    * @ngdoc property
@@ -10998,12 +12213,6 @@ function $HttpProvider() {
    * {@link ng.$cacheFactory `$cacheFactory`} to enable or disable caching of HTTP responses
    * by default. See {@link $http#caching $http Caching} for more information.
    *
-   * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.
-   * Defaults value is `'XSRF-TOKEN'`.
-   *
-   * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the
-   * XSRF token. Defaults value is `'X-XSRF-TOKEN'`.
-   *
    * - **`defaults.headers`** - {Object} - Default headers for all $http requests.
    * Refer to {@link ng.$http#setting-http-headers $http} for documentation on
    * setting default headers.
@@ -11012,13 +12221,40 @@ function $HttpProvider() {
    *     - **`defaults.headers.put`**
    *     - **`defaults.headers.patch`**
    *
+   * - **`defaults.jsonpCallbackParam`** - `{string}` - the name of the query parameter that passes the name of the
+   * callback in a JSONP request. The value of this parameter will be replaced with the expression generated by the
+   * {@link $jsonpCallbacks} service. Defaults to `'callback'`.
    *
    * - **`defaults.paramSerializer`** - `{string|function(Object<string,string>):string}` - A function
    *  used to the prepare string representation of request parameters (specified as an object).
    *  If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}.
    *  Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}.
    *
-   **/
+   * - **`defaults.transformRequest`** -
+   * `{Array<function(data, headersGetter)>|function(data, headersGetter)}` -
+   * An array of functions (or a single function) which are applied to the request data.
+   * By default, this is an array with one request transformation function:
+   *
+   *   - If the `data` property of the request configuration object contains an object, serialize it
+   *     into JSON format.
+   *
+   * - **`defaults.transformResponse`** -
+   * `{Array<function(data, headersGetter, status)>|function(data, headersGetter, status)}` -
+   * An array of functions (or a single function) which are applied to the response data. By default,
+   * this is an array which applies one response transformation function that does two things:
+   *
+   *  - If XSRF prefix is detected, strip it
+   *    (see {@link ng.$http#security-considerations Security Considerations in the $http docs}).
+   *  - If the `Content-Type` is `application/json` or the response looks like JSON,
+   *    deserialize it using a JSON parser.
+   *
+   * - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.
+   * Defaults value is `'XSRF-TOKEN'`.
+   *
+   * - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the
+   * XSRF token. Defaults value is `'X-XSRF-TOKEN'`.
+   *
+   */
   var defaults = this.defaults = {
     // transform incoming response data
     transformResponse: [defaultHttpResponseTransform],
@@ -11041,7 +12277,9 @@ function $HttpProvider() {
     xsrfCookieName: 'XSRF-TOKEN',
     xsrfHeaderName: 'X-XSRF-TOKEN',
 
-    paramSerializer: '$httpParamSerializer'
+    paramSerializer: '$httpParamSerializer',
+
+    jsonpCallbackParam: 'callback'
   };
 
   var useApplyAsync = false;
@@ -11063,7 +12301,7 @@ function $HttpProvider() {
    *
    * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.
    *    otherwise, returns the current configured value.
-   **/
+   */
   this.useApplyAsync = function(value) {
     if (isDefined(value)) {
       useApplyAsync = !!value;
@@ -11072,35 +12310,6 @@ function $HttpProvider() {
     return useApplyAsync;
   };
 
-  var useLegacyPromise = true;
-  /**
-   * @ngdoc method
-   * @name $httpProvider#useLegacyPromiseExtensions
-   * @description
-   *
-   * @deprecated
-   * sinceVersion="v1.4.4"
-   * removeVersion="v1.6.0"
-   * This method will be removed in v1.6.0 along with the legacy promise methods.
-   *
-   * Configure `$http` service to return promises without the shorthand methods `success` and `error`.
-   * This should be used to make sure that applications work without these methods.
-   *
-   * Defaults to true. If no value is specified, returns the current configured value.
-   *
-   * @param {boolean=} value If true, `$http` will return a promise with the deprecated legacy `success` and `error` methods.
-   *
-   * @returns {boolean|Object} If a value is specified, returns the $httpProvider for chaining.
-   *    otherwise, returns the current configured value.
-   **/
-  this.useLegacyPromiseExtensions = function(value) {
-    if (isDefined(value)) {
-      useLegacyPromise = !!value;
-      return this;
-    }
-    return useLegacyPromise;
-  };
-
   /**
    * @ngdoc property
    * @name $httpProvider#interceptors
@@ -11113,11 +12322,53 @@ function $HttpProvider() {
    * array, on request, but reverse order, on response.
    *
    * {@link ng.$http#interceptors Interceptors detailed info}
-   **/
+   */
   var interceptorFactories = this.interceptors = [];
 
-  this.$get = ['$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector',
-      function($httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector) {
+  /**
+   * @ngdoc property
+   * @name $httpProvider#xsrfWhitelistedOrigins
+   * @description
+   *
+   * Array containing URLs whose origins are trusted to receive the XSRF token. See the
+   * {@link ng.$http#security-considerations Security Considerations} sections for more details on
+   * XSRF.
+   *
+   * **Note:** An "origin" consists of the [URI scheme](https://en.wikipedia.org/wiki/URI_scheme),
+   * the [hostname](https://en.wikipedia.org/wiki/Hostname) and the
+   * [port number](https://en.wikipedia.org/wiki/Port_(computer_networking). For `http:` and
+   * `https:`, the port number can be omitted if using th default ports (80 and 443 respectively).
+   * Examples: `http://example.com`, `https://api.example.com:9876`
+   *
+   * <div class="alert alert-warning">
+   *   It is not possible to whitelist specific URLs/paths. The `path`, `query` and `fragment` parts
+   *   of a URL will be ignored. For example, `https://foo.com/path/bar?query=baz#fragment` will be
+   *   treated as `https://foo.com`, meaning that **all** requests to URLs starting with
+   *   `https://foo.com/` will include the XSRF token.
+   * </div>
+   *
+   * @example
+   *
+   * ```js
+   * // App served from `https://example.com/`.
+   * angular.
+   *   module('xsrfWhitelistedOriginsExample', []).
+   *   config(['$httpProvider', function($httpProvider) {
+   *     $httpProvider.xsrfWhitelistedOrigins.push('https://api.example.com');
+   *   }]).
+   *   run(['$http', function($http) {
+   *     // The XSRF token will be sent.
+   *     $http.get('https://api.example.com/preferences').then(...);
+   *
+   *     // The XSRF token will NOT be sent.
+   *     $http.get('https://stats.example.com/activity').then(...);
+   *   }]);
+   * ```
+   */
+  var xsrfWhitelistedOrigins = this.xsrfWhitelistedOrigins = [];
+
+  this.$get = ['$browser', '$httpBackend', '$$cookieReader', '$cacheFactory', '$rootScope', '$q', '$injector', '$sce',
+      function($browser, $httpBackend, $$cookieReader, $cacheFactory, $rootScope, $q, $injector, $sce) {
 
     var defaultCache = $cacheFactory('$http');
 
@@ -11139,6 +12390,11 @@ function $HttpProvider() {
           ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));
     });
 
+    /**
+     * A function to check request URLs against a list of allowed origins.
+     */
+    var urlIsAllowedOrigin = urlIsAllowedOriginFactory(xsrfWhitelistedOrigins);
+
     /**
      * @ngdoc service
      * @kind function
@@ -11150,7 +12406,7 @@ function $HttpProvider() {
      * @requires $injector
      *
      * @description
-     * The `$http` service is a core Angular service that facilitates communication with the remote
+     * The `$http` service is a core AngularJS service that facilitates communication with the remote
      * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)
      * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).
      *
@@ -11167,7 +12423,9 @@ function $HttpProvider() {
      *
      * ## General usage
      * The `$http` service is a function which takes a single argument — a {@link $http#usage configuration object} —
-     * that is used to generate an HTTP request and returns  a {@link ng.$q promise}.
+     * that is used to generate an HTTP request and returns  a {@link ng.$q promise} that is
+     * resolved (request success) or rejected (request failure) with a
+     * {@link ng.$http#$http-returns response} object.
      *
      * ```js
      *   // Simple GET request example:
@@ -11183,23 +12441,6 @@ function $HttpProvider() {
      *     });
      * ```
      *
-     * The response object has these properties:
-     *
-     *   - **data** – `{string|Object}` – The response body transformed with the transform
-     *     functions.
-     *   - **status** – `{number}` – HTTP status code of the response.
-     *   - **headers** – `{function([headerName])}` – Header getter function.
-     *   - **config** – `{Object}` – The configuration object that was used to generate the request.
-     *   - **statusText** – `{string}` – HTTP status text of the response.
-     *
-     * A response status code between 200 and 299 is considered a success status and will result in
-     * the success callback being called. Any response status code outside of that range is
-     * considered an error status and will result in the error callback being called.
-     * Also, status codes less than -1 are normalized to zero. -1 usually means the request was
-     * aborted, e.g. using a `config.timeout`.
-     * Note that if the response is a redirect, XMLHttpRequest will transparently follow it, meaning
-     * that the outcome (success or error) will be determined by the final response status code.
-     *
      *
      * ## Shortcut methods
      *
@@ -11234,15 +12475,6 @@ function $HttpProvider() {
      * $httpBackend.flush();
      * ```
      *
-     * ## Deprecation Notice
-     * <div class="alert alert-danger">
-     *   The `$http` legacy promise methods `success` and `error` have been deprecated and will be
-     *   removed in v1.6.0.
-     *   Use the standard `then` method instead.
-     *   If {@link $httpProvider#useLegacyPromiseExtensions `$httpProvider.useLegacyPromiseExtensions`} is set to
-     *   `false` then these methods will throw {@link $http:legacy `$http/legacy`} error.
-     * </div>
-     *
      * ## Setting HTTP Headers
      *
      * The $http service will automatically add certain HTTP headers to all requests. These defaults
@@ -11297,7 +12529,7 @@ function $HttpProvider() {
      * which allows you to `push` or `unshift` a new transformation function into the transformation chain.
      *
      * <div class="alert alert-warning">
-     * **Note:** Angular does not make a copy of the `data` parameter before it is passed into the `transformRequest` pipeline.
+     * **Note:** AngularJS does not make a copy of the `data` parameter before it is passed into the `transformRequest` pipeline.
      * That means changes to the properties of `data` are not local to the transform function (since Javascript passes objects by reference).
      * For example, when calling `$http.get(url, $scope.myObject)`, modifications to the object's properties in a transformRequest
      * function will be reflected on the scope and in any templates where the object is data-bound.
@@ -11314,17 +12546,20 @@ function $HttpProvider() {
      * You can augment or replace the default transformations by modifying these properties by adding to or
      * replacing the array.
      *
-     * Angular provides the following default transformations:
+     * AngularJS provides the following default transformations:
      *
-     * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`):
+     * Request transformations (`$httpProvider.defaults.transformRequest` and `$http.defaults.transformRequest`) is
+     * an array with one function that does the following:
      *
      * - If the `data` property of the request configuration object contains an object, serialize it
      *   into JSON format.
      *
-     * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`):
+     * Response transformations (`$httpProvider.defaults.transformResponse` and `$http.defaults.transformResponse`) is
+     * an array with one function that does the following:
      *
      *  - If XSRF prefix is detected, strip it (see Security Considerations section below).
-     *  - If JSON response is detected, deserialize it using a JSON parser.
+     *  - If the `Content-Type` is `application/json` or the response looks like JSON,
+   *      deserialize it using a JSON parser.
      *
      *
      * ### Overriding the Default Transformations Per Request
@@ -11484,7 +12719,7 @@ function $HttpProvider() {
      * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)
      * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)
      *
-     * Both server and the client must cooperate in order to eliminate these threats. Angular comes
+     * Both server and the client must cooperate in order to eliminate these threats. AngularJS comes
      * pre-configured with strategies that address these issues, but for this to work backend server
      * cooperation is required.
      *
@@ -11494,7 +12729,7 @@ function $HttpProvider() {
      * allows third party website to turn your JSON resource URL into
      * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To
      * counter this your server can prefix all JSON requests with following string `")]}',\n"`.
-     * Angular will automatically strip the prefix before processing it as JSON.
+     * AngularJS will automatically strip the prefix before processing it as JSON.
      *
      * For example if your server needs to return:
      * ```js
@@ -11507,40 +12742,58 @@ function $HttpProvider() {
      * ['one','two']
      * ```
      *
-     * Angular will strip the prefix, before processing the JSON.
+     * AngularJS will strip the prefix, before processing the JSON.
      *
      *
      * ### Cross Site Request Forgery (XSRF) Protection
      *
      * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is an attack technique by
      * which the attacker can trick an authenticated user into unknowingly executing actions on your
-     * website. Angular provides a mechanism to counter XSRF. When performing XHR requests, the
+     * website. AngularJS provides a mechanism to counter XSRF. When performing XHR requests, the
      * $http service reads a token from a cookie (by default, `XSRF-TOKEN`) and sets it as an HTTP
-     * header (`X-XSRF-TOKEN`). Since only JavaScript that runs on your domain could read the
-     * cookie, your server can be assured that the XHR came from JavaScript running on your domain.
-     * The header will not be set for cross-domain requests.
+     * header (by default `X-XSRF-TOKEN`). Since only JavaScript that runs on your domain could read
+     * the cookie, your server can be assured that the XHR came from JavaScript running on your
+     * domain.
      *
      * To take advantage of this, your server needs to set a token in a JavaScript readable session
      * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the
-     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure
-     * that only JavaScript running on your domain could have sent the request. The token must be
-     * unique for each user and must be verifiable by the server (to prevent the JavaScript from
+     * server can verify that the cookie matches the `X-XSRF-TOKEN` HTTP header, and therefore be
+     * sure that only JavaScript running on your domain could have sent the request. The token must
+     * be unique for each user and must be verifiable by the server (to prevent the JavaScript from
      * making up its own tokens). We recommend that the token is a digest of your site's
      * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography&#41;)
      * for added security.
      *
-     * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName
-     * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,
-     * or the per-request config object.
+     * The header will &mdash; by default &mdash; **not** be set for cross-domain requests. This
+     * prevents unauthorized servers (e.g. malicious or compromised 3rd-party APIs) from gaining
+     * access to your users' XSRF tokens and exposing them to Cross Site Request Forgery. If you
+     * want to, you can whitelist additional origins to also receive the XSRF token, by adding them
+     * to {@link ng.$httpProvider#xsrfWhitelistedOrigins xsrfWhitelistedOrigins}. This might be
+     * useful, for example, if your application, served from `example.com`, needs to access your API
+     * at `api.example.com`.
+     * See {@link ng.$httpProvider#xsrfWhitelistedOrigins $httpProvider.xsrfWhitelistedOrigins} for
+     * more details.
+     *
+     * <div class="alert alert-danger">
+     *   **Warning**<br />
+     *   Only whitelist origins that you have control over and make sure you understand the
+     *   implications of doing so.
+     * </div>
+     *
+     * The name of the cookie and the header can be specified using the `xsrfCookieName` and
+     * `xsrfHeaderName` properties of either `$httpProvider.defaults` at config-time,
+     * `$http.defaults` at run-time, or the per-request config object.
+     *
+     * In order to prevent collisions in environments where multiple AngularJS apps share the
+     * same domain or subdomain, we recommend that each application uses a unique cookie name.
      *
-     * In order to prevent collisions in environments where multiple Angular apps share the
-     * same domain or subdomain, we recommend that each application uses unique cookie name.
      *
      * @param {object} config Object describing the request to be made and how it should be
      *    processed. The object has following properties:
      *
      *    - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)
-     *    - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.
+     *    - **url** – `{string|TrustedObject}` – Absolute or relative URL of the resource that is being requested;
+     *      or an object created by a call to `$sce.trustAsResourceUrl(url)`.
      *    - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be serialized
      *      with the `paramSerializer` and appended as GET parameters.
      *    - **data** – `{string|Object}` – Data to be sent as the request message data.
@@ -11579,14 +12832,44 @@ function $HttpProvider() {
      *      See {@link $http#caching $http Caching} for more information.
      *    - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}
      *      that should abort the request when resolved.
+     *
+     *      A numerical timeout or a promise returned from {@link ng.$timeout $timeout}, will set
+     *      the `xhrStatus` in the {@link $http#$http-returns response} to "timeout", and any other
+     *      resolved promise will set it to "abort", following standard XMLHttpRequest behavior.
+     *
      *    - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the
      *      XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)
      *      for more information.
      *    - **responseType** - `{string}` - see
      *      [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype).
      *
-     * @returns {HttpPromise} Returns a {@link ng.$q `Promise}` that will be resolved to a response object
-     *                        when the request succeeds or fails.
+     * @returns {HttpPromise} A {@link ng.$q `Promise}` that will be resolved (request success)
+     *   or rejected (request failure) with a response object.
+     *
+     *   The response object has these properties:
+     *
+     *   - **data** – `{string|Object}` – The response body transformed with
+     *     the transform functions.
+     *   - **status** – `{number}` – HTTP status code of the response.
+     *   - **headers** – `{function([headerName])}` – Header getter function.
+     *   - **config** – `{Object}` – The configuration object that was used
+     *     to generate the request.
+     *   - **statusText** – `{string}` – HTTP status text of the response.
+     *   - **xhrStatus** – `{string}` – Status of the XMLHttpRequest
+     *     (`complete`, `error`, `timeout` or `abort`).
+     *
+     *
+     *   A response status code between 200 and 299 is considered a success status
+     *   and will result in the success callback being called. Any response status
+     *   code outside of that range is considered an error status and will result
+     *   in the error callback being called.
+     *   Also, status codes less than -1 are normalized to zero. -1 usually means
+     *   the request was aborted, e.g. using a `config.timeout`. More information
+     *   about the status might be available in the `xhrStatus` property.
+     *
+     *   Note that if the response is a redirect, XMLHttpRequest will transparently
+     *   follow it, meaning that the outcome (success or error) will be determined
+     *   by the final response status code.
      *
      *
      * @property {Array.<Object>} pendingRequests Array of config objects for currently pending
@@ -11606,11 +12889,11 @@ function $HttpProvider() {
     <button id="samplegetbtn" ng-click="updateModel('GET', 'http-hello.html')">Sample GET</button>
     <button id="samplejsonpbtn"
       ng-click="updateModel('JSONP',
-                    'https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')">
+                    'https://angularjs.org/greet.php?name=Super%20Hero')">
       Sample JSONP
     </button>
     <button id="invalidjsonpbtn"
-      ng-click="updateModel('JSONP', 'https://angularjs.org/doesntexist&callback=JSON_CALLBACK')">
+      ng-click="updateModel('JSONP', 'https://angularjs.org/doesntexist')">
         Invalid JSONP
       </button>
     <pre>http status code: {{status}}</pre>
@@ -11619,6 +12902,13 @@ function $HttpProvider() {
 </file>
 <file name="script.js">
   angular.module('httpExample', [])
+    .config(['$sceDelegateProvider', function($sceDelegateProvider) {
+      // We must whitelist the JSONP endpoint that we are using to show that we trust it
+      $sceDelegateProvider.resourceUrlWhitelist([
+        'self',
+        'https://angularjs.org/**'
+      ]);
+    }])
     .controller('FetchController', ['$scope', '$http', '$templateCache',
       function($scope, $http, $templateCache) {
         $scope.method = 'GET';
@@ -11686,15 +12976,16 @@ function $HttpProvider() {
         throw minErr('$http')('badreq', 'Http request configuration must be an object.  Received: {0}', requestConfig);
       }
 
-      if (!isString(requestConfig.url)) {
-        throw minErr('$http')('badreq', 'Http request configuration url must be a string.  Received: {0}', requestConfig.url);
+      if (!isString($sce.valueOf(requestConfig.url))) {
+        throw minErr('$http')('badreq', 'Http request configuration url must be a string or a $sce trusted object.  Received: {0}', requestConfig.url);
       }
 
       var config = extend({
         method: 'get',
         transformRequest: defaults.transformRequest,
         transformResponse: defaults.transformResponse,
-        paramSerializer: defaults.paramSerializer
+        paramSerializer: defaults.paramSerializer,
+        jsonpCallbackParam: defaults.jsonpCallbackParam
       }, requestConfig);
 
       config.headers = mergeHeaders(requestConfig);
@@ -11702,9 +12993,11 @@ function $HttpProvider() {
       config.paramSerializer = isString(config.paramSerializer) ?
           $injector.get(config.paramSerializer) : config.paramSerializer;
 
+      $browser.$$incOutstandingRequestCount('$http');
+
       var requestInterceptors = [];
       var responseInterceptors = [];
-      var promise = $q.when(config);
+      var promise = $q.resolve(config);
 
       // apply interceptors
       forEach(reversedInterceptors, function(interceptor) {
@@ -11719,29 +13012,7 @@ function $HttpProvider() {
       promise = chainInterceptors(promise, requestInterceptors);
       promise = promise.then(serverRequest);
       promise = chainInterceptors(promise, responseInterceptors);
-
-      if (useLegacyPromise) {
-        promise.success = function(fn) {
-          assertArgFn(fn, 'fn');
-
-          promise.then(function(response) {
-            fn(response.data, response.status, response.headers, config);
-          });
-          return promise;
-        };
-
-        promise.error = function(fn) {
-          assertArgFn(fn, 'fn');
-
-          promise.then(null, function(response) {
-            fn(response.data, response.status, response.headers, config);
-          });
-          return promise;
-        };
-      } else {
-        promise.success = $httpMinErrLegacyFn('success');
-        promise.error = $httpMinErrLegacyFn('error');
-      }
+      promise = promise.finally(completeOutstandingRequest);
 
       return promise;
 
@@ -11759,6 +13030,10 @@ function $HttpProvider() {
         return promise;
       }
 
+      function completeOutstandingRequest() {
+        $browser.$$completeOutstandingRequest(noop, '$http');
+      }
+
       function executeHeaderFns(headers, config) {
         var headerContent, processedHeaders = {};
 
@@ -11842,9 +13117,11 @@ function $HttpProvider() {
      * @description
      * Shortcut method to perform `GET` request.
      *
-     * @param {string} url Relative or absolute URL specifying the destination of the request
-     * @param {Object=} config Optional configuration object
-     * @returns {HttpPromise} Future object
+     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;
+     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.
+     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.
+     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.
+     * See {@link ng.$http#$http-returns `$http()` return value}.
      */
 
     /**
@@ -11854,9 +13131,11 @@ function $HttpProvider() {
      * @description
      * Shortcut method to perform `DELETE` request.
      *
-     * @param {string} url Relative or absolute URL specifying the destination of the request
-     * @param {Object=} config Optional configuration object
-     * @returns {HttpPromise} Future object
+     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;
+     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.
+     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.
+     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.
+     * See {@link ng.$http#$http-returns `$http()` return value}.
      */
 
     /**
@@ -11866,9 +13145,11 @@ function $HttpProvider() {
      * @description
      * Shortcut method to perform `HEAD` request.
      *
-     * @param {string} url Relative or absolute URL specifying the destination of the request
-     * @param {Object=} config Optional configuration object
-     * @returns {HttpPromise} Future object
+     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;
+     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.
+     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.
+     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.
+     * See {@link ng.$http#$http-returns `$http()` return value}.
      */
 
     /**
@@ -11877,13 +13158,41 @@ function $HttpProvider() {
      *
      * @description
      * Shortcut method to perform `JSONP` request.
-     * If you would like to customize where and how the callbacks are stored then try overriding
+     *
+     * Note that, since JSONP requests are sensitive because the response is given full access to the browser,
+     * the url must be declared, via {@link $sce} as a trusted resource URL.
+     * You can trust a URL by adding it to the whitelist via
+     * {@link $sceDelegateProvider#resourceUrlWhitelist  `$sceDelegateProvider.resourceUrlWhitelist`} or
+     * by explicitly trusting the URL via {@link $sce#trustAsResourceUrl `$sce.trustAsResourceUrl(url)`}.
+     *
+     * You should avoid generating the URL for the JSONP request from user provided data.
+     * Provide additional query parameters via `params` property of the `config` parameter, rather than
+     * modifying the URL itself.
+     *
+     * JSONP requests must specify a callback to be used in the response from the server. This callback
+     * is passed as a query parameter in the request. You must specify the name of this parameter by
+     * setting the `jsonpCallbackParam` property on the request config object.
+     *
+     * ```
+     * $http.jsonp('some/trusted/url', {jsonpCallbackParam: 'callback'})
+     * ```
+     *
+     * You can also specify a default callback parameter name in `$http.defaults.jsonpCallbackParam`.
+     * Initially this is set to `'callback'`.
+     *
+     * <div class="alert alert-danger">
+     * You can no longer use the `JSON_CALLBACK` string as a placeholder for specifying where the callback
+     * parameter value should go.
+     * </div>
+     *
+     * If you would like to customise where and how the callbacks are stored then try overriding
      * or decorating the {@link $jsonpCallbacks} service.
      *
-     * @param {string} url Relative or absolute URL specifying the destination of the request.
-     *                     The name of the callback should be the string `JSON_CALLBACK`.
-     * @param {Object=} config Optional configuration object
-     * @returns {HttpPromise} Future object
+     * @param {string|TrustedObject} url Absolute or relative URL of the resource that is being requested;
+     *                                   or an object created by a call to `$sce.trustAsResourceUrl(url)`.
+     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.
+     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.
+     * See {@link ng.$http#$http-returns `$http()` return value}.
      */
     createShortMethods('get', 'delete', 'head', 'jsonp');
 
@@ -11896,8 +13205,9 @@ function $HttpProvider() {
      *
      * @param {string} url Relative or absolute URL specifying the destination of the request
      * @param {*} data Request content
-     * @param {Object=} config Optional configuration object
-     * @returns {HttpPromise} Future object
+     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.
+     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.
+     * See {@link ng.$http#$http-returns `$http()` return value}.
      */
 
     /**
@@ -11909,8 +13219,9 @@ function $HttpProvider() {
      *
      * @param {string} url Relative or absolute URL specifying the destination of the request
      * @param {*} data Request content
-     * @param {Object=} config Optional configuration object
-     * @returns {HttpPromise} Future object
+     * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.
+     * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.
+     * See {@link ng.$http#$http-returns `$http()` return value}.
      */
 
      /**
@@ -11922,8 +13233,9 @@ function $HttpProvider() {
       *
       * @param {string} url Relative or absolute URL specifying the destination of the request
       * @param {*} data Request content
-      * @param {Object=} config Optional configuration object
-      * @returns {HttpPromise} Future object
+      * @param {Object=} config Optional configuration object. See {@link ng.$http#$http-arguments `$http()` arguments}.
+      * @returns {HttpPromise}  A Promise that will be resolved or rejected with a response object.
+      * See {@link ng.$http#$http-returns `$http()` return value}.
       */
     createShortMethodsWithData('post', 'put', 'patch');
 
@@ -11980,16 +13292,33 @@ function $HttpProvider() {
           cache,
           cachedResp,
           reqHeaders = config.headers,
-          url = buildUrl(config.url, config.paramSerializer(config.params));
+          isJsonp = lowercase(config.method) === 'jsonp',
+          url = config.url;
+
+      if (isJsonp) {
+        // JSONP is a pretty sensitive operation where we're allowing a script to have full access to
+        // our DOM and JS space.  So we require that the URL satisfies SCE.RESOURCE_URL.
+        url = $sce.getTrustedResourceUrl(url);
+      } else if (!isString(url)) {
+        // If it is not a string then the URL must be a $sce trusted object
+        url = $sce.valueOf(url);
+      }
+
+      url = buildUrl(url, config.paramSerializer(config.params));
+
+      if (isJsonp) {
+        // Check the url and add the JSONP callback placeholder
+        url = sanitizeJsonpCallbackParam(url, config.jsonpCallbackParam);
+      }
 
       $http.pendingRequests.push(config);
       promise.then(removePendingReq, removePendingReq);
 
-
       if ((config.cache || defaults.cache) && config.cache !== false &&
           (config.method === 'GET' || config.method === 'JSONP')) {
         cache = isObject(config.cache) ? config.cache
-              : isObject(defaults.cache) ? defaults.cache
+            : isObject(/** @type {?} */ (defaults).cache)
+              ? /** @type {?} */ (defaults).cache
               : defaultCache;
       }
 
@@ -12002,9 +13331,9 @@ function $HttpProvider() {
           } else {
             // serving from cache
             if (isArray(cachedResp)) {
-              resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]);
+              resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3], cachedResp[4]);
             } else {
-              resolvePromise(cachedResp, 200, {}, 'OK');
+              resolvePromise(cachedResp, 200, {}, 'OK', 'complete');
             }
           }
         } else {
@@ -12017,7 +13346,7 @@ function $HttpProvider() {
       // if we won't have the response in cache, set the xsrf headers and
       // send the request to the backend
       if (isUndefined(cachedResp)) {
-        var xsrfValue = urlIsSameOrigin(config.url)
+        var xsrfValue = urlIsAllowedOrigin(config.url)
             ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName]
             : undefined;
         if (xsrfValue) {
@@ -12061,10 +13390,10 @@ function $HttpProvider() {
        *  - resolves the raw $http promise
        *  - calls $apply
        */
-      function done(status, response, headersString, statusText) {
+      function done(status, response, headersString, statusText, xhrStatus) {
         if (cache) {
           if (isSuccess(status)) {
-            cache.put(url, [status, response, parseHeaders(headersString), statusText]);
+            cache.put(url, [status, response, parseHeaders(headersString), statusText, xhrStatus]);
           } else {
             // remove promise from the cache
             cache.remove(url);
@@ -12072,7 +13401,7 @@ function $HttpProvider() {
         }
 
         function resolveHttpPromise() {
-          resolvePromise(response, status, headersString, statusText);
+          resolvePromise(response, status, headersString, statusText, xhrStatus);
         }
 
         if (useApplyAsync) {
@@ -12087,7 +13416,7 @@ function $HttpProvider() {
       /**
        * Resolves the raw $http promise.
        */
-      function resolvePromise(response, status, headers, statusText) {
+      function resolvePromise(response, status, headers, statusText, xhrStatus) {
         //status: HTTP response status code, 0, -1 (aborted by timeout / promise)
         status = status >= -1 ? status : 0;
 
@@ -12096,12 +13425,13 @@ function $HttpProvider() {
           status: status,
           headers: headersGetter(headers),
           config: config,
-          statusText: statusText
+          statusText: statusText,
+          xhrStatus: xhrStatus
         });
       }
 
       function resolvePromiseWithResult(result) {
-        resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText);
+        resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText, result.xhrStatus);
       }
 
       function removePendingReq() {
@@ -12117,6 +13447,30 @@ function $HttpProvider() {
       }
       return url;
     }
+
+    function sanitizeJsonpCallbackParam(url, cbKey) {
+      var parts = url.split('?');
+      if (parts.length > 2) {
+        // Throw if the url contains more than one `?` query indicator
+        throw $httpMinErr('badjsonp', 'Illegal use more than one "?", in url, "{1}"', url);
+      }
+      var params = parseKeyValue(parts[1]);
+      forEach(params, function(value, key) {
+        if (value === 'JSON_CALLBACK') {
+          // Throw if the url already contains a reference to JSON_CALLBACK
+          throw $httpMinErr('badjsonp', 'Illegal use of JSON_CALLBACK in url, "{0}"', url);
+        }
+        if (key === cbKey) {
+          // Throw if the callback param was already provided
+          throw $httpMinErr('badjsonp', 'Illegal use of callback param, "{0}", in url, "{1}"', cbKey, url);
+        }
+      });
+
+      // Add in the JSON_CALLBACK callback param value
+      url += ((url.indexOf('?') === -1) ? '?' : '&') + cbKey + '=JSON_CALLBACK';
+
+      return url;
+    }
   }];
 }
 
@@ -12177,7 +13531,6 @@ function $HttpBackendProvider() {
 function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {
   // TODO(vojta): fix the signature
   return function(method, url, post, callback, headers, timeout, withCredentials, responseType, eventHandlers, uploadEventHandlers) {
-    $browser.$$incOutstandingRequestCount();
     url = url || $browser.url();
 
     if (lowercase(method) === 'jsonp') {
@@ -12185,12 +13538,13 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
       var jsonpDone = jsonpReq(url, callbackPath, function(status, text) {
         // jsonpReq only ever sets status to 200 (OK), 404 (ERROR) or -1 (WAITING)
         var response = (status === 200) && callbacks.getResponse(callbackPath);
-        completeRequest(callback, status, response, '', text);
+        completeRequest(callback, status, response, '', text, 'complete');
         callbacks.removeCallback(callbackPath);
       });
     } else {
 
       var xhr = createXhr(method, url);
+      var abortedByTimeout = false;
 
       xhr.open(method, url, true);
       forEach(headers, function(value, key) {
@@ -12220,21 +13574,32 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
             status,
             response,
             xhr.getAllResponseHeaders(),
-            statusText);
+            statusText,
+            'complete');
       };
 
       var requestError = function() {
         // The response is always empty
         // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error
-        completeRequest(callback, -1, null, null, '');
+        completeRequest(callback, -1, null, null, '', 'error');
+      };
+
+      var requestAborted = function() {
+        completeRequest(callback, -1, null, null, '', abortedByTimeout ? 'timeout' : 'abort');
+      };
+
+      var requestTimeout = function() {
+        // The response is always empty
+        // See https://xhr.spec.whatwg.org/#request-error-steps and https://fetch.spec.whatwg.org/#concept-network-error
+        completeRequest(callback, -1, null, null, '', 'timeout');
       };
 
       xhr.onerror = requestError;
-      xhr.onabort = requestError;
-      xhr.ontimeout = requestError;
+      xhr.ontimeout = requestTimeout;
+      xhr.onabort = requestAborted;
 
       forEach(eventHandlers, function(value, key) {
-          xhr.addEventListener(key, value);
+        xhr.addEventListener(key, value);
       });
 
       forEach(uploadEventHandlers, function(value, key) {
@@ -12265,14 +13630,26 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
       xhr.send(isUndefined(post) ? null : post);
     }
 
+    // Since we are using xhr.abort() when a request times out, we have to set a flag that
+    // indicates to requestAborted if the request timed out or was aborted.
+    //
+    // http.timeout = numerical timeout   timeout
+    // http.timeout = $timeout            timeout
+    // http.timeout = promise             abort
+    // xhr.abort()                        abort (The xhr object is normally inaccessible, but
+    //                                    can be exposed with the xhrFactory)
     if (timeout > 0) {
-      var timeoutId = $browserDefer(timeoutRequest, timeout);
+      var timeoutId = $browserDefer(function() {
+        timeoutRequest('timeout');
+      }, timeout);
     } else if (isPromiseLike(timeout)) {
-      timeout.then(timeoutRequest);
+      timeout.then(function() {
+        timeoutRequest(isDefined(timeout.$$timeoutId) ? 'timeout' : 'abort');
+      });
     }
 
-
-    function timeoutRequest() {
+    function timeoutRequest(reason) {
+      abortedByTimeout = reason === 'timeout';
       if (jsonpDone) {
         jsonpDone();
       }
@@ -12281,15 +13658,14 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
       }
     }
 
-    function completeRequest(callback, status, response, headersString, statusText) {
+    function completeRequest(callback, status, response, headersString, statusText, xhrStatus) {
       // cancel timeout and subsequent timeout promise resolution
       if (isDefined(timeoutId)) {
         $browserDefer.cancel(timeoutId);
       }
       jsonpDone = xhr = null;
 
-      callback(status, response, headersString, statusText);
-      $browser.$$completeOutstandingRequest(noop);
+      callback(status, response, headersString, statusText, xhrStatus);
     }
   };
 
@@ -12304,8 +13680,8 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
     script.async = true;
 
     callback = function(event) {
-      removeEventListenerFn(script, 'load', callback);
-      removeEventListenerFn(script, 'error', callback);
+      script.removeEventListener('load', callback);
+      script.removeEventListener('error', callback);
       rawDocument.body.removeChild(script);
       script = null;
       var status = -1;
@@ -12324,8 +13700,8 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
       }
     };
 
-    addEventListenerFn(script, 'load', callback);
-    addEventListenerFn(script, 'error', callback);
+    script.addEventListener('load', callback);
+    script.addEventListener('error', callback);
     rawDocument.body.appendChild(script);
     return callback;
   }
@@ -12353,9 +13729,9 @@ $interpolateMinErr.interr = function(text, err) {
  * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.
  *
  * <div class="alert alert-danger">
- * This feature is sometimes used to mix different markup languages, e.g. to wrap an Angular
+ * This feature is sometimes used to mix different markup languages, e.g. to wrap an AngularJS
  * template within a Python Jinja template (or any other template language). Mixing templating
- * languages is **very dangerous**. The embedding template language will not safely escape Angular
+ * languages is **very dangerous**. The embedding template language will not safely escape AngularJS
  * expressions, so any user-controlled values in the template will cause Cross Site Scripting (XSS)
  * security bugs!
  * </div>
@@ -12404,9 +13780,8 @@ function $InterpolateProvider() {
     if (value) {
       startSymbol = value;
       return this;
-    } else {
-      return startSymbol;
     }
+    return startSymbol;
   };
 
   /**
@@ -12422,9 +13797,8 @@ function $InterpolateProvider() {
     if (value) {
       endSymbol = value;
       return this;
-    } else {
-      return endSymbol;
     }
+    return endSymbol;
   };
 
 
@@ -12443,23 +13817,6 @@ function $InterpolateProvider() {
         replace(escapedEndRegexp, endSymbol);
     }
 
-    function stringify(value) {
-      if (value == null) { // null || undefined
-        return '';
-      }
-      switch (typeof value) {
-        case 'string':
-          break;
-        case 'number':
-          value = '' + value;
-          break;
-        default:
-          value = toJson(value);
-      }
-
-      return value;
-    }
-
     // TODO: this is the same as the constantWatchDelegate in parse.js
     function constantWatchDelegate(scope, listener, objectEquality, constantInterp) {
       var unwatch = scope.$watch(function constantInterpolateWatch(scope) {
@@ -12488,7 +13845,7 @@ function $InterpolateProvider() {
      * ```js
      *   var $interpolate = ...; // injected
      *   var exp = $interpolate('Hello {{name | uppercase}}!');
-     *   expect(exp({name:'Angular'})).toEqual('Hello ANGULAR!');
+     *   expect(exp({name:'AngularJS'})).toEqual('Hello ANGULARJS!');
      * ```
      *
      * `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is
@@ -12506,8 +13863,8 @@ function $InterpolateProvider() {
      *   // "allOrNothing" mode
      *   exp = $interpolate('{{greeting}} {{name}}!', false, null, true);
      *   expect(exp(context)).toBeUndefined();
-     *   context.name = 'Angular';
-     *   expect(exp(context)).toEqual('Hello Angular!');
+     *   context.name = 'AngularJS';
+     *   expect(exp(context)).toEqual('Hello AngularJS!');
      * ```
      *
      * `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.
@@ -12588,16 +13945,21 @@ function $InterpolateProvider() {
      * - `context`: evaluation context for all expressions embedded in the interpolated text
      */
     function $interpolate(text, mustHaveExpression, trustedContext, allOrNothing) {
+      var contextAllowsConcatenation = trustedContext === $sce.URL || trustedContext === $sce.MEDIA_URL;
+
       // Provide a quick exit and simplified result function for text with no interpolation
       if (!text.length || text.indexOf(startSymbol) === -1) {
-        var constantInterp;
-        if (!mustHaveExpression) {
-          var unescapedText = unescapeText(text);
-          constantInterp = valueFn(unescapedText);
-          constantInterp.exp = text;
-          constantInterp.expressions = [];
-          constantInterp.$$watchDelegate = constantWatchDelegate;
+        if (mustHaveExpression) return;
+
+        var unescapedText = unescapeText(text);
+        if (contextAllowsConcatenation) {
+          unescapedText = $sce.getTrusted(trustedContext, unescapedText);
         }
+        var constantInterp = valueFn(unescapedText);
+        constantInterp.exp = text;
+        constantInterp.expressions = [];
+        constantInterp.$$watchDelegate = constantWatchDelegate;
+
         return constantInterp;
       }
 
@@ -12606,11 +13968,13 @@ function $InterpolateProvider() {
           endIndex,
           index = 0,
           expressions = [],
-          parseFns = [],
+          parseFns,
           textLength = text.length,
           exp,
           concat = [],
-          expressionPositions = [];
+          expressionPositions = [],
+          singleExpression;
+
 
       while (index < textLength) {
         if (((startIndex = text.indexOf(startSymbol, index)) !== -1) &&
@@ -12620,10 +13984,9 @@ function $InterpolateProvider() {
           }
           exp = text.substring(startIndex + startSymbolLength, endIndex);
           expressions.push(exp);
-          parseFns.push($parse(exp, parseStringifyInterceptor));
           index = endIndex + endSymbolLength;
           expressionPositions.push(concat.length);
-          concat.push('');
+          concat.push(''); // Placeholder that will get replaced with the evaluated expression.
         } else {
           // we did not find an interpolation, so we have to add the remainder to the separators array
           if (index !== textLength) {
@@ -12633,15 +13996,25 @@ function $InterpolateProvider() {
         }
       }
 
+      singleExpression = concat.length === 1 && expressionPositions.length === 1;
+      // Intercept expression if we need to stringify concatenated inputs, which may be SCE trusted
+      // objects rather than simple strings
+      // (we don't modify the expression if the input consists of only a single trusted input)
+      var interceptor = contextAllowsConcatenation && singleExpression ? undefined : parseStringifyInterceptor;
+      parseFns = expressions.map(function(exp) { return $parse(exp, interceptor); });
+
       // Concatenating expressions makes it hard to reason about whether some combination of
       // concatenated values are unsafe to use and could easily lead to XSS.  By requiring that a
-      // single expression be used for iframe[src], object[src], etc., we ensure that the value
-      // that's used is assigned or constructed by some JS code somewhere that is more testable or
-      // make it obvious that you bound the value to some user controlled value.  This helps reduce
-      // the load when auditing for XSS issues.
-      if (trustedContext && concat.length > 1) {
-          $interpolateMinErr.throwNoconcat(text);
-      }
+      // single expression be used for some $sce-managed secure contexts (RESOURCE_URLs mostly),
+      // we ensure that the value that's used is assigned or constructed by some JS code somewhere
+      // that is more testable or make it obvious that you bound the value to some user controlled
+      // value.  This helps reduce the load when auditing for XSS issues.
+
+      // Note that URL and MEDIA_URL $sce contexts do not need this, since `$sce` can sanitize the values
+      // passed to it. In that case, `$sce.getTrusted` will be called on either the single expression
+      // or on the overall concatenated string (losing trusted types used in the mix, by design).
+      // Both these methods will sanitize plain strings. Also, HTML could be included, but since it's
+      // only used in srcdoc attributes, this would not be very useful.
 
       if (!mustHaveExpression || expressions.length) {
         var compute = function(values) {
@@ -12649,13 +14022,16 @@ function $InterpolateProvider() {
             if (allOrNothing && isUndefined(values[i])) return;
             concat[expressionPositions[i]] = values[i];
           }
-          return concat.join('');
-        };
 
-        var getValue = function(value) {
-          return trustedContext ?
-            $sce.getTrusted(trustedContext, value) :
-            $sce.valueOf(value);
+          if (contextAllowsConcatenation) {
+            // If `singleExpression` then `concat[0]` might be a "trusted" value or `null`, rather than a string
+            return $sce.getTrusted(trustedContext, singleExpression ? concat[0] : concat.join(''));
+          } else if (trustedContext && concat.length > 1) {
+            // This context does not allow more than one part, e.g. expr + string or exp + exp.
+            $interpolateMinErr.throwNoconcat(text);
+          }
+          // In an unprivileged context or only one part: just concatenate and return.
+          return concat.join('');
         };
 
         return extend(function interpolationFn(context) {
@@ -12681,9 +14057,7 @@ function $InterpolateProvider() {
             var lastValue;
             return scope.$watchGroup(parseFns, /** @this */ function interpolateFnWatcher(values, oldValues) {
               var currValue = compute(values);
-              if (isFunction(listener)) {
-                listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope);
-              }
+              listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope);
               lastValue = currValue;
             });
           }
@@ -12692,7 +14066,13 @@ function $InterpolateProvider() {
 
       function parseStringifyInterceptor(value) {
         try {
-          value = getValue(value);
+          // In concatenable contexts, getTrusted comes at the end, to avoid sanitizing individual
+          // parts of a full URL. We don't care about losing the trustedness here.
+          // In non-concatenable contexts, where there is only one expression, this interceptor is
+          // not applied to the expression.
+          value = (trustedContext && !contextAllowsConcatenation) ?
+                    $sce.getTrusted(trustedContext, value) :
+                    $sce.valueOf(value);
           return allOrNothing && !isDefined(value) ? value : stringify(value);
         } catch (err) {
           $exceptionHandler($interpolateMinErr.interr(text, err));
@@ -12736,204 +14116,230 @@ function $InterpolateProvider() {
   }];
 }
 
+var $intervalMinErr = minErr('$interval');
+
 /** @this */
 function $IntervalProvider() {
-  this.$get = ['$rootScope', '$window', '$q', '$$q', '$browser',
-       function($rootScope,   $window,   $q,   $$q,   $browser) {
+  this.$get = ['$$intervalFactory', '$window',
+       function($$intervalFactory,   $window) {
     var intervals = {};
+    var setIntervalFn = function(tick, delay, deferred) {
+      var id = $window.setInterval(tick, delay);
+      intervals[id] = deferred;
+      return id;
+    };
+    var clearIntervalFn = function(id) {
+      $window.clearInterval(id);
+      delete intervals[id];
+    };
 
+    /**
+     * @ngdoc service
+     * @name $interval
+     *
+     * @description
+     * AngularJS's wrapper for `window.setInterval`. The `fn` function is executed every `delay`
+     * milliseconds.
+     *
+     * The return value of registering an interval function is a promise. This promise will be
+     * notified upon each tick of the interval, and will be resolved after `count` iterations, or
+     * run indefinitely if `count` is not defined. The value of the notification will be the
+     * number of iterations that have run.
+     * To cancel an interval, call `$interval.cancel(promise)`.
+     *
+     * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to
+     * move forward by `millis` milliseconds and trigger any functions scheduled to run in that
+     * time.
+     *
+     * <div class="alert alert-warning">
+     * **Note**: Intervals created by this service must be explicitly destroyed when you are finished
+     * with them.  In particular they are not automatically destroyed when a controller's scope or a
+     * directive's element are destroyed.
+     * You should take this into consideration and make sure to always cancel the interval at the
+     * appropriate moment.  See the example below for more details on how and when to do this.
+     * </div>
+     *
+     * @param {function()} fn A function that should be called repeatedly. If no additional arguments
+     *   are passed (see below), the function is called with the current iteration count.
+     * @param {number} delay Number of milliseconds between each function call.
+     * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat
+     *   indefinitely.
+     * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
+     *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
+     * @param {...*=} Pass additional parameters to the executed function.
+     * @returns {promise} A promise which will be notified on each iteration. It will resolve once all iterations of the interval complete.
+     *
+     * @example
+     * <example module="intervalExample" name="interval-service">
+     * <file name="index.html">
+     *   <script>
+     *     angular.module('intervalExample', [])
+     *       .controller('ExampleController', ['$scope', '$interval',
+     *         function($scope, $interval) {
+     *           $scope.format = 'M/d/yy h:mm:ss a';
+     *           $scope.blood_1 = 100;
+     *           $scope.blood_2 = 120;
+     *
+     *           var stop;
+     *           $scope.fight = function() {
+     *             // Don't start a new fight if we are already fighting
+     *             if ( angular.isDefined(stop) ) return;
+     *
+     *             stop = $interval(function() {
+     *               if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
+     *                 $scope.blood_1 = $scope.blood_1 - 3;
+     *                 $scope.blood_2 = $scope.blood_2 - 4;
+     *               } else {
+     *                 $scope.stopFight();
+     *               }
+     *             }, 100);
+     *           };
+     *
+     *           $scope.stopFight = function() {
+     *             if (angular.isDefined(stop)) {
+     *               $interval.cancel(stop);
+     *               stop = undefined;
+     *             }
+     *           };
+     *
+     *           $scope.resetFight = function() {
+     *             $scope.blood_1 = 100;
+     *             $scope.blood_2 = 120;
+     *           };
+     *
+     *           $scope.$on('$destroy', function() {
+     *             // Make sure that the interval is destroyed too
+     *             $scope.stopFight();
+     *           });
+     *         }])
+     *       // Register the 'myCurrentTime' directive factory method.
+     *       // We inject $interval and dateFilter service since the factory method is DI.
+     *       .directive('myCurrentTime', ['$interval', 'dateFilter',
+     *         function($interval, dateFilter) {
+     *           // return the directive link function. (compile function not needed)
+     *           return function(scope, element, attrs) {
+     *             var format,  // date format
+     *                 stopTime; // so that we can cancel the time updates
+     *
+     *             // used to update the UI
+     *             function updateTime() {
+     *               element.text(dateFilter(new Date(), format));
+     *             }
+     *
+     *             // watch the expression, and update the UI on change.
+     *             scope.$watch(attrs.myCurrentTime, function(value) {
+     *               format = value;
+     *               updateTime();
+     *             });
+     *
+     *             stopTime = $interval(updateTime, 1000);
+     *
+     *             // listen on DOM destroy (removal) event, and cancel the next UI update
+     *             // to prevent updating time after the DOM element was removed.
+     *             element.on('$destroy', function() {
+     *               $interval.cancel(stopTime);
+     *             });
+     *           }
+     *         }]);
+     *   </script>
+     *
+     *   <div>
+     *     <div ng-controller="ExampleController">
+     *       <label>Date format: <input ng-model="format"></label> <hr/>
+     *       Current time is: <span my-current-time="format"></span>
+     *       <hr/>
+     *       Blood 1 : <font color='red'>{{blood_1}}</font>
+     *       Blood 2 : <font color='red'>{{blood_2}}</font>
+     *       <button type="button" data-ng-click="fight()">Fight</button>
+     *       <button type="button" data-ng-click="stopFight()">StopFight</button>
+     *       <button type="button" data-ng-click="resetFight()">resetFight</button>
+     *     </div>
+     *   </div>
+     *
+     * </file>
+     * </example>
+     */
+    var interval = $$intervalFactory(setIntervalFn, clearIntervalFn);
 
-     /**
-      * @ngdoc service
-      * @name $interval
-      *
-      * @description
-      * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`
-      * milliseconds.
-      *
-      * The return value of registering an interval function is a promise. This promise will be
-      * notified upon each tick of the interval, and will be resolved after `count` iterations, or
-      * run indefinitely if `count` is not defined. The value of the notification will be the
-      * number of iterations that have run.
-      * To cancel an interval, call `$interval.cancel(promise)`.
-      *
-      * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to
-      * move forward by `millis` milliseconds and trigger any functions scheduled to run in that
-      * time.
-      *
-      * <div class="alert alert-warning">
-      * **Note**: Intervals created by this service must be explicitly destroyed when you are finished
-      * with them.  In particular they are not automatically destroyed when a controller's scope or a
-      * directive's element are destroyed.
-      * You should take this into consideration and make sure to always cancel the interval at the
-      * appropriate moment.  See the example below for more details on how and when to do this.
-      * </div>
-      *
-      * @param {function()} fn A function that should be called repeatedly. If no additional arguments
-      *   are passed (see below), the function is called with the current iteration count.
-      * @param {number} delay Number of milliseconds between each function call.
-      * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat
-      *   indefinitely.
-      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
-      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
-      * @param {...*=} Pass additional parameters to the executed function.
-      * @returns {promise} A promise which will be notified on each iteration.
-      *
-      * @example
-      * <example module="intervalExample" name="interval-service">
-      * <file name="index.html">
-      *   <script>
-      *     angular.module('intervalExample', [])
-      *       .controller('ExampleController', ['$scope', '$interval',
-      *         function($scope, $interval) {
-      *           $scope.format = 'M/d/yy h:mm:ss a';
-      *           $scope.blood_1 = 100;
-      *           $scope.blood_2 = 120;
-      *
-      *           var stop;
-      *           $scope.fight = function() {
-      *             // Don't start a new fight if we are already fighting
-      *             if ( angular.isDefined(stop) ) return;
-      *
-      *             stop = $interval(function() {
-      *               if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
-      *                 $scope.blood_1 = $scope.blood_1 - 3;
-      *                 $scope.blood_2 = $scope.blood_2 - 4;
-      *               } else {
-      *                 $scope.stopFight();
-      *               }
-      *             }, 100);
-      *           };
-      *
-      *           $scope.stopFight = function() {
-      *             if (angular.isDefined(stop)) {
-      *               $interval.cancel(stop);
-      *               stop = undefined;
-      *             }
-      *           };
-      *
-      *           $scope.resetFight = function() {
-      *             $scope.blood_1 = 100;
-      *             $scope.blood_2 = 120;
-      *           };
-      *
-      *           $scope.$on('$destroy', function() {
-      *             // Make sure that the interval is destroyed too
-      *             $scope.stopFight();
-      *           });
-      *         }])
-      *       // Register the 'myCurrentTime' directive factory method.
-      *       // We inject $interval and dateFilter service since the factory method is DI.
-      *       .directive('myCurrentTime', ['$interval', 'dateFilter',
-      *         function($interval, dateFilter) {
-      *           // return the directive link function. (compile function not needed)
-      *           return function(scope, element, attrs) {
-      *             var format,  // date format
-      *                 stopTime; // so that we can cancel the time updates
-      *
-      *             // used to update the UI
-      *             function updateTime() {
-      *               element.text(dateFilter(new Date(), format));
-      *             }
-      *
-      *             // watch the expression, and update the UI on change.
-      *             scope.$watch(attrs.myCurrentTime, function(value) {
-      *               format = value;
-      *               updateTime();
-      *             });
-      *
-      *             stopTime = $interval(updateTime, 1000);
-      *
-      *             // listen on DOM destroy (removal) event, and cancel the next UI update
-      *             // to prevent updating time after the DOM element was removed.
-      *             element.on('$destroy', function() {
-      *               $interval.cancel(stopTime);
-      *             });
-      *           }
-      *         }]);
-      *   </script>
-      *
-      *   <div>
-      *     <div ng-controller="ExampleController">
-      *       <label>Date format: <input ng-model="format"></label> <hr/>
-      *       Current time is: <span my-current-time="format"></span>
-      *       <hr/>
-      *       Blood 1 : <font color='red'>{{blood_1}}</font>
-      *       Blood 2 : <font color='red'>{{blood_2}}</font>
-      *       <button type="button" data-ng-click="fight()">Fight</button>
-      *       <button type="button" data-ng-click="stopFight()">StopFight</button>
-      *       <button type="button" data-ng-click="resetFight()">resetFight</button>
-      *     </div>
-      *   </div>
-      *
-      * </file>
-      * </example>
-      */
-    function interval(fn, delay, count, invokeApply) {
-      var hasParams = arguments.length > 4,
-          args = hasParams ? sliceArgs(arguments, 4) : [],
-          setInterval = $window.setInterval,
-          clearInterval = $window.clearInterval,
-          iteration = 0,
-          skipApply = (isDefined(invokeApply) && !invokeApply),
-          deferred = (skipApply ? $$q : $q).defer(),
-          promise = deferred.promise;
+    /**
+     * @ngdoc method
+     * @name $interval#cancel
+     *
+     * @description
+     * Cancels a task associated with the `promise`.
+     *
+     * @param {Promise=} promise returned by the `$interval` function.
+     * @returns {boolean} Returns `true` if the task was successfully canceled.
+     */
+    interval.cancel = function(promise) {
+      if (!promise) return false;
 
-      count = isDefined(count) ? count : 0;
+      if (!promise.hasOwnProperty('$$intervalId')) {
+        throw $intervalMinErr('badprom',
+            '`$interval.cancel()` called with a promise that was not generated by `$interval()`.');
+      }
 
-      promise.$$intervalId = setInterval(function tick() {
-        if (skipApply) {
-          $browser.defer(callback);
-        } else {
-          $rootScope.$evalAsync(callback);
-        }
-        deferred.notify(iteration++);
+      if (!intervals.hasOwnProperty(promise.$$intervalId)) return false;
 
-        if (count > 0 && iteration >= count) {
-          deferred.resolve(iteration);
-          clearInterval(promise.$$intervalId);
-          delete intervals[promise.$$intervalId];
-        }
+      var id = promise.$$intervalId;
+      var deferred = intervals[id];
 
-        if (!skipApply) $rootScope.$apply();
+      // Interval cancels should not report an unhandled promise.
+      markQExceptionHandled(deferred.promise);
+      deferred.reject('canceled');
+      clearIntervalFn(id);
+
+      return true;
+    };
+
+    return interval;
+  }];
+}
 
-      }, delay);
+/** @this */
+function $$IntervalFactoryProvider() {
+  this.$get = ['$browser', '$q', '$$q', '$rootScope',
+       function($browser,   $q,   $$q,   $rootScope) {
+    return function intervalFactory(setIntervalFn, clearIntervalFn) {
+      return function intervalFn(fn, delay, count, invokeApply) {
+        var hasParams = arguments.length > 4,
+            args = hasParams ? sliceArgs(arguments, 4) : [],
+            iteration = 0,
+            skipApply = isDefined(invokeApply) && !invokeApply,
+            deferred = (skipApply ? $$q : $q).defer(),
+            promise = deferred.promise;
+
+        count = isDefined(count) ? count : 0;
+
+        function callback() {
+          if (!hasParams) {
+            fn(iteration);
+          } else {
+            fn.apply(null, args);
+          }
+        }
 
-      intervals[promise.$$intervalId] = deferred;
+        function tick() {
+          if (skipApply) {
+            $browser.defer(callback);
+          } else {
+            $rootScope.$evalAsync(callback);
+          }
+          deferred.notify(iteration++);
 
-      return promise;
+          if (count > 0 && iteration >= count) {
+            deferred.resolve(iteration);
+            clearIntervalFn(promise.$$intervalId);
+          }
 
-      function callback() {
-        if (!hasParams) {
-          fn(iteration);
-        } else {
-          fn.apply(null, args);
+          if (!skipApply) $rootScope.$apply();
         }
-      }
-    }
 
+        promise.$$intervalId = setIntervalFn(tick, delay, deferred, skipApply);
 
-     /**
-      * @ngdoc method
-      * @name $interval#cancel
-      *
-      * @description
-      * Cancels a task associated with the `promise`.
-      *
-      * @param {Promise=} promise returned by the `$interval` function.
-      * @returns {boolean} Returns `true` if the task was successfully canceled.
-      */
-    interval.cancel = function(promise) {
-      if (promise && promise.$$intervalId in intervals) {
-        intervals[promise.$$intervalId].reject('canceled');
-        $window.clearInterval(promise.$$intervalId);
-        delete intervals[promise.$$intervalId];
-        return true;
-      }
-      return false;
+        return promise;
+      };
     };
-
-    return interval;
   }];
 }
 
@@ -12947,8 +14353,8 @@ function $IntervalProvider() {
  * how they vary compared to the requested url.
  */
 var $jsonpCallbacksProvider = /** @this */ function() {
-  this.$get = ['$window', function($window) {
-    var callbacks = $window.angular.callbacks;
+  this.$get = function() {
+    var callbacks = angular.callbacks;
     var callbackMap = {};
 
     function createCallback(callbackId) {
@@ -13015,7 +14421,7 @@ var $jsonpCallbacksProvider = /** @this */ function() {
         delete callbackMap[callbackPath];
       }
     };
-  }];
+  };
 };
 
 /**
@@ -13023,12 +14429,14 @@ var $jsonpCallbacksProvider = /** @this */ function() {
  * @name $locale
  *
  * @description
- * $locale service provides localization rules for various Angular components. As of right now the
+ * $locale service provides localization rules for various AngularJS components. As of right now the
  * only public api is:
  *
  * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)
  */
 
+/* global stripHash: true */
+
 var PATH_MATCH = /^([^?#]*)(\?([^#]*))?(#(.*))?$/,
     DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};
 var $locationMinErr = minErr('$location');
@@ -13045,12 +14453,36 @@ function encodePath(path) {
       i = segments.length;
 
   while (i--) {
-    segments[i] = encodeUriSegment(segments[i]);
+    // decode forward slashes to prevent them from being double encoded
+    segments[i] = encodeUriSegment(segments[i].replace(/%2F/g, '/'));
+  }
+
+  return segments.join('/');
+}
+
+function decodePath(path, html5Mode) {
+  var segments = path.split('/'),
+      i = segments.length;
+
+  while (i--) {
+    segments[i] = decodeURIComponent(segments[i]);
+    if (html5Mode) {
+      // encode forward slashes to prevent them from being mistaken for path separators
+      segments[i] = segments[i].replace(/\//g, '%2F');
+    }
   }
 
   return segments.join('/');
 }
 
+function normalizePath(pathValue, searchValue, hashValue) {
+  var search = toKeyValue(searchValue),
+    hash = hashValue ? '#' + encodeUriSegment(hashValue) : '',
+    path = encodePath(pathValue);
+
+  return path + (search ? '?' + search : '') + hash;
+}
+
 function parseAbsoluteUrl(absoluteUrl, locationObj) {
   var parsedUrl = urlResolve(absoluteUrl);
 
@@ -13060,7 +14492,7 @@ function parseAbsoluteUrl(absoluteUrl, locationObj) {
 }
 
 var DOUBLE_SLASH_REGEX = /^\s*[\\/]{2,}/;
-function parseAppUrl(url, locationObj) {
+function parseAppUrl(url, locationObj, html5Mode) {
 
   if (DOUBLE_SLASH_REGEX.test(url)) {
     throw $locationMinErr('badpath', 'Invalid url "{0}".', url);
@@ -13071,8 +14503,8 @@ function parseAppUrl(url, locationObj) {
     url = '/' + url;
   }
   var match = urlResolve(url);
-  locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?
-      match.pathname.substring(1) : match.pathname);
+  var path = prefixed && match.pathname.charAt(0) === '/' ? match.pathname.substring(1) : match.pathname;
+  locationObj.$$path = decodePath(path, html5Mode);
   locationObj.$$search = parseKeyValue(match.search);
   locationObj.$$hash = decodeURIComponent(match.hash);
 
@@ -13099,17 +14531,11 @@ function stripBaseUrl(base, url) {
   }
 }
 
-
 function stripHash(url) {
   var index = url.indexOf('#');
   return index === -1 ? url : url.substr(0, index);
 }
 
-function trimEmptyHash(url) {
-  return url.replace(/(#.+)|#$/, '$1');
-}
-
-
 function stripFile(url) {
   return url.substr(0, stripHash(url).lastIndexOf('/') + 1);
 }
@@ -13147,7 +14573,7 @@ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
           appBaseNoFile);
     }
 
-    parseAppUrl(pathUrl, this);
+    parseAppUrl(pathUrl, this, true);
 
     if (!this.$$path) {
       this.$$path = '/';
@@ -13156,16 +14582,8 @@ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
     this.$$compose();
   };
 
-  /**
-   * Compose url and update `absUrl` property
-   * @private
-   */
-  this.$$compose = function() {
-    var search = toKeyValue(this.$$search),
-        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
-
-    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
-    this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'
+  this.$$normalizeUrl = function(url) {
+    return appBaseNoFile + url.substr(1); // first char is always '/'
   };
 
   this.$$parseLinkUrl = function(url, relHref) {
@@ -13243,12 +14661,12 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
         withoutHashUrl = '';
         if (isUndefined(withoutBaseUrl)) {
           appBase = url;
-          this.replace();
+          /** @type {?} */ (this).replace();
         }
       }
     }
 
-    parseAppUrl(withoutHashUrl, this);
+    parseAppUrl(withoutHashUrl, this, false);
 
     this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);
 
@@ -13262,7 +14680,7 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
      *  * a.setAttribute('href', '/foo')
      *   * a.pathname === '/C:/foo' //true
      *
-     * Inside of Angular, we're always using pathnames that
+     * Inside of AngularJS, we're always using pathnames that
      * do not include drive names for routing.
      */
     function removeWindowsDriveName(path, url, base) {
@@ -13289,16 +14707,8 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
     }
   };
 
-  /**
-   * Compose hashbang URL and update `absUrl` property
-   * @private
-   */
-  this.$$compose = function() {
-    var search = toKeyValue(this.$$search),
-        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
-
-    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
-    this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');
+  this.$$normalizeUrl = function(url) {
+    return appBase + (url ? hashPrefix + url : '');
   };
 
   this.$$parseLinkUrl = function(url, relHref) {
@@ -13349,15 +14759,10 @@ function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
     return !!rewrittenUrl;
   };
 
-  this.$$compose = function() {
-    var search = toKeyValue(this.$$search),
-        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
-
-    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
+  this.$$normalizeUrl = function(url) {
     // include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#'
-    this.$$absUrl = appBase + hashPrefix + this.$$url;
+    return appBase + hashPrefix + url;
   };
-
 }
 
 
@@ -13381,6 +14786,16 @@ var locationPrototype = {
    */
   $$replace: false,
 
+  /**
+   * Compose url and update `url` and `absUrl` property
+   * @private
+   */
+  $$compose: function() {
+    this.$$url = normalizePath(this.$$path, this.$$search, this.$$hash);
+    this.$$absUrl = this.$$normalizeUrl(this.$$url);
+    this.$$urlUpdatedByLocation = true;
+  },
+
   /**
    * @ngdoc method
    * @name $location#absUrl
@@ -13465,7 +14880,7 @@ var locationPrototype = {
    *
    * Return host of current URL.
    *
-   * Note: compared to the non-angular version `location.host` which returns `hostname:port`, this returns the `hostname` portion only.
+   * Note: compared to the non-AngularJS version `location.host` which returns `hostname:port`, this returns the `hostname` portion only.
    *
    *
    * ```js
@@ -13685,6 +15100,7 @@ forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], fun
     // but we're changing the $$state reference to $browser.state() during the $digest
     // so the modification window is narrow.
     this.$$state = isUndefined(state) ? null : state;
+    this.$$urlUpdatedByLocation = true;
 
     return this;
   };
@@ -13747,7 +15163,7 @@ function locationGetterSetter(property, preprocess) {
  * Use the `$locationProvider` to configure how the application deep linking paths are stored.
  */
 function $LocationProvider() {
-  var hashPrefix = '',
+  var hashPrefix = '!',
       html5Mode = {
         enabled: false,
         requireBase: true,
@@ -13758,7 +15174,7 @@ function $LocationProvider() {
    * @ngdoc method
    * @name $locationProvider#hashPrefix
    * @description
-   * The default value for the prefix is `''`.
+   * The default value for the prefix is `'!'`.
    * @param {string=} prefix Prefix for hash part (containing path and search)
    * @returns {*} current value if used as getter or itself (chaining) if used as setter
    */
@@ -13885,6 +15301,13 @@ function $LocationProvider() {
 
     var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i;
 
+    // Determine if two URLs are equal despite potentially having different encoding/normalizing
+    //  such as $location.absUrl() vs $browser.url()
+    // See https://github.com/angular/angular.js/issues/16592
+    function urlsEqual(a, b) {
+      return a === b || urlResolve(a).href === urlResolve(b).href;
+    }
+
     function setBrowserUrlWithFallback(url, replace, state) {
       var oldUrl = $location.url();
       var oldState = $location.$$state;
@@ -13937,15 +15360,13 @@ function $LocationProvider() {
 
       if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) {
         if ($location.$$parseLinkUrl(absHref, relHref)) {
-          // We do a preventDefault for all urls that are part of the angular application,
+          // We do a preventDefault for all urls that are part of the AngularJS application,
           // in html5mode and also without, so that we are able to abort navigation without
           // getting double entries in the location history.
           event.preventDefault();
           // update location manually
           if ($location.absUrl() !== $browser.url()) {
             $rootScope.$apply();
-            // hack to work around FF6 bug 684208 when scenario runner clicks on links
-            $window.angular['ff-684208-preventDefault'] = true;
           }
         }
       }
@@ -13953,7 +15374,7 @@ function $LocationProvider() {
 
 
     // rewrite hashbang url <> html5 url
-    if (trimEmptyHash($location.absUrl()) !== trimEmptyHash(initialUrl)) {
+    if ($location.absUrl() !== initialUrl) {
       $browser.url($location.absUrl(), true);
     }
 
@@ -13962,7 +15383,7 @@ function $LocationProvider() {
     // update $location when $browser url changes
     $browser.onUrlChange(function(newUrl, newState) {
 
-      if (isUndefined(stripBaseUrl(appBaseNoFile, newUrl))) {
+      if (!startsWith(newUrl, appBaseNoFile)) {
         // If we are navigating outside of the app then force a reload
         $window.location.href = newUrl;
         return;
@@ -13972,7 +15393,6 @@ function $LocationProvider() {
         var oldUrl = $location.absUrl();
         var oldState = $location.$$state;
         var defaultPrevented;
-        newUrl = trimEmptyHash(newUrl);
         $location.$$parse(newUrl);
         $location.$$state = newState;
 
@@ -13997,36 +15417,40 @@ function $LocationProvider() {
 
     // update browser
     $rootScope.$watch(function $locationWatch() {
-      var oldUrl = trimEmptyHash($browser.url());
-      var newUrl = trimEmptyHash($location.absUrl());
-      var oldState = $browser.state();
-      var currentReplace = $location.$$replace;
-      var urlOrStateChanged = oldUrl !== newUrl ||
-        ($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
+      if (initializing || $location.$$urlUpdatedByLocation) {
+        $location.$$urlUpdatedByLocation = false;
 
-      if (initializing || urlOrStateChanged) {
-        initializing = false;
+        var oldUrl = $browser.url();
+        var newUrl = $location.absUrl();
+        var oldState = $browser.state();
+        var currentReplace = $location.$$replace;
+        var urlOrStateChanged = !urlsEqual(oldUrl, newUrl) ||
+          ($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
 
-        $rootScope.$evalAsync(function() {
-          var newUrl = $location.absUrl();
-          var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
-              $location.$$state, oldState).defaultPrevented;
+        if (initializing || urlOrStateChanged) {
+          initializing = false;
 
-          // if the location was changed by a `$locationChangeStart` handler then stop
-          // processing this location change
-          if ($location.absUrl() !== newUrl) return;
+          $rootScope.$evalAsync(function() {
+            var newUrl = $location.absUrl();
+            var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
+                $location.$$state, oldState).defaultPrevented;
 
-          if (defaultPrevented) {
-            $location.$$parse(oldUrl);
-            $location.$$state = oldState;
-          } else {
-            if (urlOrStateChanged) {
-              setBrowserUrlWithFallback(newUrl, currentReplace,
-                                        oldState === $location.$$state ? null : $location.$$state);
+            // if the location was changed by a `$locationChangeStart` handler then stop
+            // processing this location change
+            if ($location.absUrl() !== newUrl) return;
+
+            if (defaultPrevented) {
+              $location.$$parse(oldUrl);
+              $location.$$state = oldState;
+            } else {
+              if (urlOrStateChanged) {
+                setBrowserUrlWithFallback(newUrl, currentReplace,
+                                          oldState === $location.$$state ? null : $location.$$state);
+              }
+              afterLocationChange(oldUrl, oldState);
             }
-            afterLocationChange(oldUrl, oldState);
-          }
-        });
+          });
+        }
       }
 
       $location.$$replace = false;
@@ -14055,6 +15479,14 @@ function $LocationProvider() {
  *
  * The main purpose of this service is to simplify debugging and troubleshooting.
  *
+ * To reveal the location of the calls to `$log` in the JavaScript console,
+ * you can "blackbox" the AngularJS source in your browser:
+ *
+ * [Mozilla description of blackboxing](https://developer.mozilla.org/en-US/docs/Tools/Debugger/How_to/Black_box_a_source).
+ * [Chrome description of blackboxing](https://developer.chrome.com/devtools/docs/blackboxing).
+ *
+ * Note: Not all browsers support blackboxing.
+ *
  * The default is to log `debug` messages. You can use
  * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.
  *
@@ -14111,6 +15543,15 @@ function $LogProvider() {
   };
 
   this.$get = ['$window', function($window) {
+    // Support: IE 9-11, Edge 12-14+
+    // IE/Edge display errors in such a way that it requires the user to click in 4 places
+    // to see the stack trace. There is no way to feature-detect it so there's a chance
+    // of the user agent sniffing to go wrong but since it's only about logging, this shouldn't
+    // break apps. Other browsers display errors in a sensible way and some of them map stack
+    // traces along source maps if available so it makes sense to let browsers display it
+    // as they want.
+    var formatStackTrace = msie || /\bEdge\//.test($window.navigator && $window.navigator.userAgent);
+
     return {
       /**
        * @ngdoc method
@@ -14167,8 +15608,8 @@ function $LogProvider() {
     };
 
     function formatError(arg) {
-      if (arg instanceof Error) {
-        if (arg.stack) {
+      if (isError(arg)) {
+        if (arg.stack && formatStackTrace) {
           arg = (arg.message && arg.stack.indexOf(arg.message) === -1)
               ? 'Error: ' + arg.message + '\n' + arg.stack
               : arg.stack;
@@ -14181,29 +15622,17 @@ function $LogProvider() {
 
     function consoleLog(type) {
       var console = $window.console || {},
-          logFn = console[type] || console.log || noop,
-          hasApply = false;
-
-      // Note: reading logFn.apply throws an error in IE11 in IE8 document mode.
-      // The reason behind this is that console.log has type "object" in IE8...
-      try {
-        hasApply = !!logFn.apply;
-      } catch (e) { /* empty */ }
-
-      if (hasApply) {
-        return function() {
-          var args = [];
-          forEach(arguments, function(arg) {
-            args.push(formatError(arg));
-          });
-          return logFn.apply(console, args);
-        };
-      }
+          logFn = console[type] || console.log || noop;
 
-      // we are IE which either doesn't have window.console => this is noop and we do nothing,
-      // or we are IE where console.log doesn't have apply so we log at least first 2 args
-      return function(arg1, arg2) {
-        logFn(arg1, arg2 == null ? '' : arg2);
+      return function() {
+        var args = [];
+        forEach(arguments, function(arg) {
+          args.push(formatError(arg));
+        });
+        // Support: IE 9 only
+        // console methods don't inherit from Function.prototype in IE 9 so we can't
+        // call `logFn.apply(console, args)` directly.
+        return Function.prototype.apply.call(logFn, console, args);
       };
     }
   }];
@@ -14222,60 +15651,23 @@ function $LogProvider() {
 
 var $parseMinErr = minErr('$parse');
 
-var ARRAY_CTOR = [].constructor;
-var BOOLEAN_CTOR = (false).constructor;
-var FUNCTION_CTOR = Function.constructor;
-var NUMBER_CTOR = (0).constructor;
-var OBJECT_CTOR = {}.constructor;
-var STRING_CTOR = ''.constructor;
-var ARRAY_CTOR_PROTO = ARRAY_CTOR.prototype;
-var BOOLEAN_CTOR_PROTO = BOOLEAN_CTOR.prototype;
-var FUNCTION_CTOR_PROTO = FUNCTION_CTOR.prototype;
-var NUMBER_CTOR_PROTO = NUMBER_CTOR.prototype;
-var OBJECT_CTOR_PROTO = OBJECT_CTOR.prototype;
-var STRING_CTOR_PROTO = STRING_CTOR.prototype;
-
-var CALL = FUNCTION_CTOR_PROTO.call;
-var APPLY = FUNCTION_CTOR_PROTO.apply;
-var BIND = FUNCTION_CTOR_PROTO.bind;
-
-var objectValueOf = OBJECT_CTOR_PROTO.valueOf;
-
-// Sandboxing Angular Expressions
+var objectValueOf = {}.constructor.prototype.valueOf;
+
+// Sandboxing AngularJS Expressions
 // ------------------------------
-// Angular expressions are generally considered safe because these expressions only have direct
-// access to `$scope` and locals. However, one can obtain the ability to execute arbitrary JS code by
-// obtaining a reference to native JS functions such as the Function constructor.
+// AngularJS expressions are no longer sandboxed. So it is now even easier to access arbitrary JS code by
+// various means such as obtaining a reference to native JS functions like the Function constructor.
 //
-// As an example, consider the following Angular expression:
+// As an example, consider the following AngularJS expression:
 //
 //   {}.toString.constructor('alert("evil JS code")')
 //
-// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
-// against the expression language, but not to prevent exploits that were enabled by exposing
-// sensitive JavaScript or browser APIs on Scope. Exposing such objects on a Scope is never a good
-// practice and therefore we are not even trying to protect against interaction with an object
-// explicitly exposed in this way.
-//
-// In general, it is not possible to access a Window object from an angular expression unless a
-// window or some DOM object that has a reference to window is published onto a Scope.
-// Similarly we prevent invocations of function known to be dangerous, as well as assignments to
-// native objects.
+// It is important to realize that if you create an expression from a string that contains user provided
+// content then it is possible that your application contains a security vulnerability to an XSS style attack.
 //
 // See https://docs.angularjs.org/guide/security
 
 
-function ensureSafeMemberName(name, fullExpression) {
-  if (name === '__defineGetter__' || name === '__defineSetter__'
-      || name === '__lookupGetter__' || name === '__lookupSetter__'
-      || name === '__proto__') {
-    throw $parseMinErr('isecfld',
-        'Attempting to access a disallowed field in Angular expressions! '
-        + 'Expression: {0}', fullExpression);
-  }
-  return name;
-}
-
 function getStringValue(name) {
   // Property names must be strings. This means that non-string objects cannot be used
   // as keys in an object. Any non-string object, including a number, is typecasted
@@ -14294,67 +15686,6 @@ function getStringValue(name) {
   return name + '';
 }
 
-function ensureSafeObject(obj, fullExpression) {
-  // nifty check if obj is Function that is fast and works across iframes and other contexts
-  if (obj) {
-    if (obj.constructor === obj) {
-      throw $parseMinErr('isecfn',
-          'Referencing Function in Angular expressions is disallowed! Expression: {0}',
-          fullExpression);
-    } else if (// isWindow(obj)
-        obj.window === obj) {
-      throw $parseMinErr('isecwindow',
-          'Referencing the Window in Angular expressions is disallowed! Expression: {0}',
-          fullExpression);
-    } else if (// isElement(obj)
-        obj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) {
-      throw $parseMinErr('isecdom',
-          'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
-          fullExpression);
-    } else if (// block Object so that we can't get hold of dangerous Object.* methods
-        obj === Object) {
-      throw $parseMinErr('isecobj',
-          'Referencing Object in Angular expressions is disallowed! Expression: {0}',
-          fullExpression);
-    }
-  }
-  return obj;
-}
-
-function ensureSafeFunction(obj, fullExpression) {
-  if (obj) {
-    if (obj.constructor === obj) {
-      throw $parseMinErr('isecfn',
-        'Referencing Function in Angular expressions is disallowed! Expression: {0}',
-        fullExpression);
-    } else if (obj === CALL || obj === APPLY || obj === BIND) {
-      throw $parseMinErr('isecff',
-        'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}',
-        fullExpression);
-    }
-  }
-}
-
-function ensureSafeAssignContext(obj, fullExpression) {
-  if (obj) {
-    if (obj === ARRAY_CTOR ||
-        obj === BOOLEAN_CTOR ||
-        obj === FUNCTION_CTOR ||
-        obj === NUMBER_CTOR ||
-        obj === OBJECT_CTOR ||
-        obj === STRING_CTOR ||
-        obj === ARRAY_CTOR_PROTO ||
-        obj === BOOLEAN_CTOR_PROTO ||
-        obj === FUNCTION_CTOR_PROTO ||
-        obj === NUMBER_CTOR_PROTO ||
-        obj === OBJECT_CTOR_PROTO ||
-        obj === STRING_CTOR_PROTO) {
-      throw $parseMinErr('isecaf',
-        'Assigning to a constructor or its prototype is disallowed! Expression: {0}',
-        fullExpression);
-    }
-  }
-}
 
 var OPERATORS = createMap();
 forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; });
@@ -14929,15 +16260,47 @@ function isStateless($filter, filterName) {
   return !fn.$stateful;
 }
 
-function findConstantAndWatchExpressions(ast, $filter) {
+var PURITY_ABSOLUTE = 1;
+var PURITY_RELATIVE = 2;
+
+// Detect nodes which could depend on non-shallow state of objects
+function isPure(node, parentIsPure) {
+  switch (node.type) {
+    // Computed members might invoke a stateful toString()
+    case AST.MemberExpression:
+      if (node.computed) {
+        return false;
+      }
+      break;
+
+    // Unary always convert to primative
+    case AST.UnaryExpression:
+      return PURITY_ABSOLUTE;
+
+    // The binary + operator can invoke a stateful toString().
+    case AST.BinaryExpression:
+      return node.operator !== '+' ? PURITY_ABSOLUTE : false;
+
+    // Functions / filters probably read state from within objects
+    case AST.CallExpression:
+      return false;
+  }
+
+  return (undefined === parentIsPure) ? PURITY_RELATIVE : parentIsPure;
+}
+
+function findConstantAndWatchExpressions(ast, $filter, parentIsPure) {
   var allConstants;
   var argsToWatch;
   var isStatelessFilter;
+
+  var astIsPure = ast.isPure = isPure(ast, parentIsPure);
+
   switch (ast.type) {
   case AST.Program:
     allConstants = true;
     forEach(ast.body, function(expr) {
-      findConstantAndWatchExpressions(expr.expression, $filter);
+      findConstantAndWatchExpressions(expr.expression, $filter, astIsPure);
       allConstants = allConstants && expr.expression.constant;
     });
     ast.constant = allConstants;
@@ -14947,26 +16310,26 @@ function findConstantAndWatchExpressions(ast, $filter) {
     ast.toWatch = [];
     break;
   case AST.UnaryExpression:
-    findConstantAndWatchExpressions(ast.argument, $filter);
+    findConstantAndWatchExpressions(ast.argument, $filter, astIsPure);
     ast.constant = ast.argument.constant;
     ast.toWatch = ast.argument.toWatch;
     break;
   case AST.BinaryExpression:
-    findConstantAndWatchExpressions(ast.left, $filter);
-    findConstantAndWatchExpressions(ast.right, $filter);
+    findConstantAndWatchExpressions(ast.left, $filter, astIsPure);
+    findConstantAndWatchExpressions(ast.right, $filter, astIsPure);
     ast.constant = ast.left.constant && ast.right.constant;
     ast.toWatch = ast.left.toWatch.concat(ast.right.toWatch);
     break;
   case AST.LogicalExpression:
-    findConstantAndWatchExpressions(ast.left, $filter);
-    findConstantAndWatchExpressions(ast.right, $filter);
+    findConstantAndWatchExpressions(ast.left, $filter, astIsPure);
+    findConstantAndWatchExpressions(ast.right, $filter, astIsPure);
     ast.constant = ast.left.constant && ast.right.constant;
     ast.toWatch = ast.constant ? [] : [ast];
     break;
   case AST.ConditionalExpression:
-    findConstantAndWatchExpressions(ast.test, $filter);
-    findConstantAndWatchExpressions(ast.alternate, $filter);
-    findConstantAndWatchExpressions(ast.consequent, $filter);
+    findConstantAndWatchExpressions(ast.test, $filter, astIsPure);
+    findConstantAndWatchExpressions(ast.alternate, $filter, astIsPure);
+    findConstantAndWatchExpressions(ast.consequent, $filter, astIsPure);
     ast.constant = ast.test.constant && ast.alternate.constant && ast.consequent.constant;
     ast.toWatch = ast.constant ? [] : [ast];
     break;
@@ -14975,30 +16338,28 @@ function findConstantAndWatchExpressions(ast, $filter) {
     ast.toWatch = [ast];
     break;
   case AST.MemberExpression:
-    findConstantAndWatchExpressions(ast.object, $filter);
+    findConstantAndWatchExpressions(ast.object, $filter, astIsPure);
     if (ast.computed) {
-      findConstantAndWatchExpressions(ast.property, $filter);
+      findConstantAndWatchExpressions(ast.property, $filter, astIsPure);
     }
     ast.constant = ast.object.constant && (!ast.computed || ast.property.constant);
-    ast.toWatch = [ast];
+    ast.toWatch = ast.constant ? [] : [ast];
     break;
   case AST.CallExpression:
     isStatelessFilter = ast.filter ? isStateless($filter, ast.callee.name) : false;
     allConstants = isStatelessFilter;
     argsToWatch = [];
     forEach(ast.arguments, function(expr) {
-      findConstantAndWatchExpressions(expr, $filter);
+      findConstantAndWatchExpressions(expr, $filter, astIsPure);
       allConstants = allConstants && expr.constant;
-      if (!expr.constant) {
-        argsToWatch.push.apply(argsToWatch, expr.toWatch);
-      }
+      argsToWatch.push.apply(argsToWatch, expr.toWatch);
     });
     ast.constant = allConstants;
     ast.toWatch = isStatelessFilter ? argsToWatch : [ast];
     break;
   case AST.AssignmentExpression:
-    findConstantAndWatchExpressions(ast.left, $filter);
-    findConstantAndWatchExpressions(ast.right, $filter);
+    findConstantAndWatchExpressions(ast.left, $filter, astIsPure);
+    findConstantAndWatchExpressions(ast.right, $filter, astIsPure);
     ast.constant = ast.left.constant && ast.right.constant;
     ast.toWatch = [ast];
     break;
@@ -15006,11 +16367,9 @@ function findConstantAndWatchExpressions(ast, $filter) {
     allConstants = true;
     argsToWatch = [];
     forEach(ast.elements, function(expr) {
-      findConstantAndWatchExpressions(expr, $filter);
+      findConstantAndWatchExpressions(expr, $filter, astIsPure);
       allConstants = allConstants && expr.constant;
-      if (!expr.constant) {
-        argsToWatch.push.apply(argsToWatch, expr.toWatch);
-      }
+      argsToWatch.push.apply(argsToWatch, expr.toWatch);
     });
     ast.constant = allConstants;
     ast.toWatch = argsToWatch;
@@ -15019,10 +16378,14 @@ function findConstantAndWatchExpressions(ast, $filter) {
     allConstants = true;
     argsToWatch = [];
     forEach(ast.properties, function(property) {
-      findConstantAndWatchExpressions(property.value, $filter);
-      allConstants = allConstants && property.value.constant && !property.computed;
-      if (!property.value.constant) {
-        argsToWatch.push.apply(argsToWatch, property.value.toWatch);
+      findConstantAndWatchExpressions(property.value, $filter, astIsPure);
+      allConstants = allConstants && property.value.constant;
+      argsToWatch.push.apply(argsToWatch, property.value.toWatch);
+      if (property.computed) {
+        //`{[key]: value}` implicitly does `key.toString()` which may be non-pure
+        findConstantAndWatchExpressions(property.key, $filter, /*parentIsPure=*/false);
+        allConstants = allConstants && property.key.constant;
+        argsToWatch.push.apply(argsToWatch, property.key.toWatch);
       }
     });
     ast.constant = allConstants;
@@ -15069,19 +16432,16 @@ function isConstant(ast) {
   return ast.constant;
 }
 
-function ASTCompiler(astBuilder, $filter) {
-  this.astBuilder = astBuilder;
+function ASTCompiler($filter) {
   this.$filter = $filter;
 }
 
 ASTCompiler.prototype = {
-  compile: function(expression, expensiveChecks) {
+  compile: function(ast) {
     var self = this;
-    var ast = this.astBuilder.ast(expression);
     this.state = {
       nextId: 0,
       filters: {},
-      expensiveChecks: expensiveChecks,
       fn: {vars: [], body: [], own: {}},
       assign: {vars: [], body: [], own: {}},
       inputs: []
@@ -15106,7 +16466,7 @@ ASTCompiler.prototype = {
       var intoId = self.nextId();
       self.recurse(watch, intoId);
       self.return_(intoId);
-      self.state.inputs.push(fnKey);
+      self.state.inputs.push({name: fnKey, isPure: watch.isPure});
       watch.watchId = key;
     });
     this.state.computing = 'fn';
@@ -15124,27 +16484,15 @@ ASTCompiler.prototype = {
 
     // eslint-disable-next-line no-new-func
     var fn = (new Function('$filter',
-        'ensureSafeMemberName',
-        'ensureSafeObject',
-        'ensureSafeFunction',
         'getStringValue',
-        'ensureSafeAssignContext',
         'ifDefined',
         'plus',
-        'text',
         fnString))(
           this.$filter,
-          ensureSafeMemberName,
-          ensureSafeObject,
-          ensureSafeFunction,
           getStringValue,
-          ensureSafeAssignContext,
           ifDefined,
-          plusFn,
-          expression);
+          plusFn);
     this.state = this.stage = undefined;
-    fn.literal = isLiteral(ast);
-    fn.constant = isConstant(ast);
     return fn;
   },
 
@@ -15154,13 +16502,16 @@ ASTCompiler.prototype = {
 
   watchFns: function() {
     var result = [];
-    var fns = this.state.inputs;
+    var inputs = this.state.inputs;
     var self = this;
-    forEach(fns, function(name) {
-      result.push('var ' + name + '=' + self.generateFunction(name, 's'));
+    forEach(inputs, function(input) {
+      result.push('var ' + input.name + '=' + self.generateFunction(input.name, 's'));
+      if (input.isPure) {
+        result.push(input.name, '.isPure=' + JSON.stringify(input.isPure) + ';');
+      }
     });
-    if (fns.length) {
-      result.push('fn.inputs=[' + fns.join(',') + '];');
+    if (inputs.length) {
+      result.push('fn.inputs=[' + inputs.map(function(i) { return i.name; }).join(',') + '];');
     }
     return result.join('');
   },
@@ -15215,7 +16566,7 @@ ASTCompiler.prototype = {
     case AST.Literal:
       expression = this.escape(ast.value);
       this.assign(intoId, expression);
-      recursionFn(expression);
+      recursionFn(intoId || expression);
       break;
     case AST.UnaryExpression:
       this.recurse(ast.argument, undefined, undefined, function(expr) { right = expr; });
@@ -15255,22 +16606,18 @@ ASTCompiler.prototype = {
         nameId.computed = false;
         nameId.name = ast.name;
       }
-      ensureSafeMemberName(ast.name);
       self.if_(self.stage === 'inputs' || self.not(self.getHasOwnProperty('l', ast.name)),
         function() {
           self.if_(self.stage === 'inputs' || 's', function() {
             if (create && create !== 1) {
               self.if_(
-                self.not(self.nonComputedMember('s', ast.name)),
+                self.isNull(self.nonComputedMember('s', ast.name)),
                 self.lazyAssign(self.nonComputedMember('s', ast.name), '{}'));
             }
             self.assign(intoId, self.nonComputedMember('s', ast.name));
           });
         }, intoId && self.lazyAssign(intoId, self.nonComputedMember('l', ast.name))
         );
-      if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.name)) {
-        self.addEnsureSafeObject(intoId);
-      }
       recursionFn(intoId);
       break;
     case AST.MemberExpression:
@@ -15278,32 +16625,24 @@ ASTCompiler.prototype = {
       intoId = intoId || this.nextId();
       self.recurse(ast.object, left, undefined, function() {
         self.if_(self.notNull(left), function() {
-          if (create && create !== 1) {
-            self.addEnsureSafeAssignContext(left);
-          }
           if (ast.computed) {
             right = self.nextId();
             self.recurse(ast.property, right);
             self.getStringValue(right);
-            self.addEnsureSafeMemberName(right);
             if (create && create !== 1) {
               self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}'));
             }
-            expression = self.ensureSafeObject(self.computedMember(left, right));
+            expression = self.computedMember(left, right);
             self.assign(intoId, expression);
             if (nameId) {
               nameId.computed = true;
               nameId.name = right;
             }
           } else {
-            ensureSafeMemberName(ast.property.name);
             if (create && create !== 1) {
-              self.if_(self.not(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}'));
+              self.if_(self.isNull(self.nonComputedMember(left, ast.property.name)), self.lazyAssign(self.nonComputedMember(left, ast.property.name), '{}'));
             }
             expression = self.nonComputedMember(left, ast.property.name);
-            if (self.state.expensiveChecks || isPossiblyDangerousMemberName(ast.property.name)) {
-              expression = self.ensureSafeObject(expression);
-            }
             self.assign(intoId, expression);
             if (nameId) {
               nameId.computed = false;
@@ -15335,21 +16674,16 @@ ASTCompiler.prototype = {
         args = [];
         self.recurse(ast.callee, right, left, function() {
           self.if_(self.notNull(right), function() {
-            self.addEnsureSafeFunction(right);
             forEach(ast.arguments, function(expr) {
-              self.recurse(expr, self.nextId(), undefined, function(argument) {
-                args.push(self.ensureSafeObject(argument));
+              self.recurse(expr, ast.constant ? undefined : self.nextId(), undefined, function(argument) {
+                args.push(argument);
               });
             });
             if (left.name) {
-              if (!self.state.expensiveChecks) {
-                self.addEnsureSafeObject(left.context);
-              }
               expression = self.member(left.context, left.name, left.computed) + '(' + args.join(',') + ')';
             } else {
               expression = right + '(' + args.join(',') + ')';
             }
-            expression = self.ensureSafeObject(expression);
             self.assign(intoId, expression);
           }, function() {
             self.assign(intoId, 'undefined');
@@ -15364,8 +16698,6 @@ ASTCompiler.prototype = {
       this.recurse(ast.left, undefined, left, function() {
         self.if_(self.notNull(left.context), function() {
           self.recurse(ast.right, right);
-          self.addEnsureSafeObject(self.member(left.context, left.name, left.computed));
-          self.addEnsureSafeAssignContext(left.context);
           expression = self.member(left.context, left.name, left.computed) + ast.operator + right;
           self.assign(intoId, expression);
           recursionFn(intoId || expression);
@@ -15375,13 +16707,13 @@ ASTCompiler.prototype = {
     case AST.ArrayExpression:
       args = [];
       forEach(ast.elements, function(expr) {
-        self.recurse(expr, self.nextId(), undefined, function(argument) {
+        self.recurse(expr, ast.constant ? undefined : self.nextId(), undefined, function(argument) {
           args.push(argument);
         });
       });
       expression = '[' + args.join(',') + ']';
       this.assign(intoId, expression);
-      recursionFn(expression);
+      recursionFn(intoId || expression);
       break;
     case AST.ObjectExpression:
       args = [];
@@ -15423,15 +16755,15 @@ ASTCompiler.prototype = {
       break;
     case AST.ThisExpression:
       this.assign(intoId, 's');
-      recursionFn('s');
+      recursionFn(intoId || 's');
       break;
     case AST.LocalsExpression:
       this.assign(intoId, 'l');
-      recursionFn('l');
+      recursionFn(intoId || 'l');
       break;
     case AST.NGValueParameter:
       this.assign(intoId, 'v');
-      recursionFn('v');
+      recursionFn(intoId || 'v');
       break;
     }
   },
@@ -15490,6 +16822,10 @@ ASTCompiler.prototype = {
     return '!(' + expression + ')';
   },
 
+  isNull: function(expression) {
+    return expression + '==null';
+  },
+
   notNull: function(expression) {
     return expression + '!=null';
   },
@@ -15513,42 +16849,10 @@ ASTCompiler.prototype = {
     return this.nonComputedMember(left, right);
   },
 
-  addEnsureSafeObject: function(item) {
-    this.current().body.push(this.ensureSafeObject(item), ';');
-  },
-
-  addEnsureSafeMemberName: function(item) {
-    this.current().body.push(this.ensureSafeMemberName(item), ';');
-  },
-
-  addEnsureSafeFunction: function(item) {
-    this.current().body.push(this.ensureSafeFunction(item), ';');
-  },
-
-  addEnsureSafeAssignContext: function(item) {
-    this.current().body.push(this.ensureSafeAssignContext(item), ';');
-  },
-
-  ensureSafeObject: function(item) {
-    return 'ensureSafeObject(' + item + ',text)';
-  },
-
-  ensureSafeMemberName: function(item) {
-    return 'ensureSafeMemberName(' + item + ',text)';
-  },
-
-  ensureSafeFunction: function(item) {
-    return 'ensureSafeFunction(' + item + ',text)';
-  },
-
   getStringValue: function(item) {
     this.assign(item, 'getStringValue(' + item + ')');
   },
 
-  ensureSafeAssignContext: function(item) {
-    return 'ensureSafeAssignContext(' + item + ',text)';
-  },
-
   lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) {
     var self = this;
     return function() {
@@ -15594,17 +16898,13 @@ ASTCompiler.prototype = {
 };
 
 
-function ASTInterpreter(astBuilder, $filter) {
-  this.astBuilder = astBuilder;
+function ASTInterpreter($filter) {
   this.$filter = $filter;
 }
 
 ASTInterpreter.prototype = {
-  compile: function(expression, expensiveChecks) {
+  compile: function(ast) {
     var self = this;
-    var ast = this.astBuilder.ast(expression);
-    this.expression = expression;
-    this.expensiveChecks = expensiveChecks;
     findConstantAndWatchExpressions(ast, self.$filter);
     var assignable;
     var assign;
@@ -15617,6 +16917,7 @@ ASTInterpreter.prototype = {
       inputs = [];
       forEach(toWatch, function(watch, key) {
         var input = self.recurse(watch);
+        input.isPure = watch.isPure;
         watch.input = input;
         inputs.push(input);
         watch.watchId = key;
@@ -15643,8 +16944,6 @@ ASTInterpreter.prototype = {
     if (inputs) {
       fn.inputs = inputs;
     }
-    fn.literal = isLiteral(ast);
-    fn.constant = isConstant(ast);
     return fn;
   },
 
@@ -15675,20 +16974,16 @@ ASTInterpreter.prototype = {
         context
       );
     case AST.Identifier:
-      ensureSafeMemberName(ast.name, self.expression);
-      return self.identifier(ast.name,
-                             self.expensiveChecks || isPossiblyDangerousMemberName(ast.name),
-                             context, create, self.expression);
+      return self.identifier(ast.name, context, create);
     case AST.MemberExpression:
       left = this.recurse(ast.object, false, !!create);
       if (!ast.computed) {
-        ensureSafeMemberName(ast.property.name, self.expression);
         right = ast.property.name;
       }
       if (ast.computed) right = this.recurse(ast.property);
       return ast.computed ?
-        this.computedMember(left, right, context, create, self.expression) :
-        this.nonComputedMember(left, right, self.expensiveChecks, context, create, self.expression);
+        this.computedMember(left, right, context, create) :
+        this.nonComputedMember(left, right, context, create);
     case AST.CallExpression:
       args = [];
       forEach(ast.arguments, function(expr) {
@@ -15709,13 +17004,11 @@ ASTInterpreter.prototype = {
           var rhs = right(scope, locals, assign, inputs);
           var value;
           if (rhs.value != null) {
-            ensureSafeObject(rhs.context, self.expression);
-            ensureSafeFunction(rhs.value, self.expression);
             var values = [];
             for (var i = 0; i < args.length; ++i) {
-              values.push(ensureSafeObject(args[i](scope, locals, assign, inputs), self.expression));
+              values.push(args[i](scope, locals, assign, inputs));
             }
-            value = ensureSafeObject(rhs.value.apply(rhs.context, values), self.expression);
+            value = rhs.value.apply(rhs.context, values);
           }
           return context ? {value: value} : value;
         };
@@ -15725,8 +17018,6 @@ ASTInterpreter.prototype = {
       return function(scope, locals, assign, inputs) {
         var lhs = left(scope, locals, assign, inputs);
         var rhs = right(scope, locals, assign, inputs);
-        ensureSafeObject(lhs.value, self.expression);
-        ensureSafeAssignContext(lhs.context);
         lhs.context[lhs.name] = rhs;
         return context ? {value: rhs} : rhs;
       };
@@ -15802,7 +17093,7 @@ ASTInterpreter.prototype = {
       if (isDefined(arg)) {
         arg = -arg;
       } else {
-        arg = 0;
+        arg = -0;
       }
       return context ? {value: arg} : arg;
     };
@@ -15918,16 +17209,13 @@ ASTInterpreter.prototype = {
   value: function(value, context) {
     return function() { return context ? {context: undefined, name: undefined, value: value} : value; };
   },
-  identifier: function(name, expensiveChecks, context, create, expression) {
+  identifier: function(name, context, create) {
     return function(scope, locals, assign, inputs) {
       var base = locals && (name in locals) ? locals : scope;
-      if (create && create !== 1 && base && !(base[name])) {
+      if (create && create !== 1 && base && base[name] == null) {
         base[name] = {};
       }
       var value = base ? base[name] : undefined;
-      if (expensiveChecks) {
-        ensureSafeObject(value, expression);
-      }
       if (context) {
         return {context: base, name: name, value: value};
       } else {
@@ -15935,7 +17223,7 @@ ASTInterpreter.prototype = {
       }
     };
   },
-  computedMember: function(left, right, context, create, expression) {
+  computedMember: function(left, right, context, create) {
     return function(scope, locals, assign, inputs) {
       var lhs = left(scope, locals, assign, inputs);
       var rhs;
@@ -15943,15 +17231,12 @@ ASTInterpreter.prototype = {
       if (lhs != null) {
         rhs = right(scope, locals, assign, inputs);
         rhs = getStringValue(rhs);
-        ensureSafeMemberName(rhs, expression);
         if (create && create !== 1) {
-          ensureSafeAssignContext(lhs);
           if (lhs && !(lhs[rhs])) {
             lhs[rhs] = {};
           }
         }
         value = lhs[rhs];
-        ensureSafeObject(value, expression);
       }
       if (context) {
         return {context: lhs, name: rhs, value: value};
@@ -15960,19 +17245,15 @@ ASTInterpreter.prototype = {
       }
     };
   },
-  nonComputedMember: function(left, right, expensiveChecks, context, create, expression) {
+  nonComputedMember: function(left, right, context, create) {
     return function(scope, locals, assign, inputs) {
       var lhs = left(scope, locals, assign, inputs);
       if (create && create !== 1) {
-        ensureSafeAssignContext(lhs);
-        if (lhs && !(lhs[right])) {
+        if (lhs && lhs[right] == null) {
           lhs[right] = {};
         }
       }
       var value = lhs != null ? lhs[right] : undefined;
-      if (expensiveChecks || isPossiblyDangerousMemberName(right)) {
-        ensureSafeObject(value, expression);
-      }
       if (context) {
         return {context: lhs, name: right, value: value};
       } else {
@@ -15991,27 +17272,39 @@ ASTInterpreter.prototype = {
 /**
  * @constructor
  */
-var Parser = function Parser(lexer, $filter, options) {
-  this.lexer = lexer;
-  this.$filter = $filter;
-  this.options = options;
+function Parser(lexer, $filter, options) {
   this.ast = new AST(lexer, options);
-  this.astCompiler = options.csp ? new ASTInterpreter(this.ast, $filter) :
-                                   new ASTCompiler(this.ast, $filter);
-};
+  this.astCompiler = options.csp ? new ASTInterpreter($filter) :
+                                   new ASTCompiler($filter);
+}
 
 Parser.prototype = {
   constructor: Parser,
 
   parse: function(text) {
-    return this.astCompiler.compile(text, this.options.expensiveChecks);
+    var ast = this.getAst(text);
+    var fn = this.astCompiler.compile(ast.ast);
+    fn.literal = isLiteral(ast.ast);
+    fn.constant = isConstant(ast.ast);
+    fn.oneTime = ast.oneTime;
+    return fn;
+  },
+
+  getAst: function(exp) {
+    var oneTime = false;
+    exp = exp.trim();
+
+    if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {
+      oneTime = true;
+      exp = exp.substring(2);
+    }
+    return {
+      ast: this.ast.ast(exp),
+      oneTime: oneTime
+    };
   }
 };
 
-function isPossiblyDangerousMemberName(name) {
-  return name === 'constructor';
-}
-
 function getValueOf(value) {
   return isFunction(value.valueOf) ? value.valueOf() : objectValueOf.call(value);
 }
@@ -16025,15 +17318,15 @@ function getValueOf(value) {
  *
  * @description
  *
- * Converts Angular {@link guide/expression expression} into a function.
+ * Converts AngularJS {@link guide/expression expression} into a function.
  *
  * ```js
  *   var getter = $parse('user.name');
  *   var setter = getter.assign;
- *   var context = {user:{name:'angular'}};
+ *   var context = {user:{name:'AngularJS'}};
  *   var locals = {user:{name:'local'}};
  *
- *   expect(getter(context)).toEqual('angular');
+ *   expect(getter(context)).toEqual('AngularJS');
  *   setter(context, 'newValue');
  *   expect(context.user.name).toEqual('newValue');
  *   expect(getter(context, locals)).toEqual('local');
@@ -16069,8 +17362,7 @@ function getValueOf(value) {
  *  service.
  */
 function $ParseProvider() {
-  var cacheDefault = createMap();
-  var cacheExpensive = createMap();
+  var cache = createMap();
   var literals = {
     'true': true,
     'false': false,
@@ -16100,7 +17392,7 @@ function $ParseProvider() {
   *
   * @description
   *
-  * Allows defining the set of characters that are allowed in Angular expressions. The function
+  * Allows defining the set of characters that are allowed in AngularJS expressions. The function
   * `identifierStart` will get called to know if a given character is a valid character to be the
   * first character for an identifier. The function `identifierContinue` will get called to know if
   * a given character is a valid character to be a follow-up identifier character. The functions
@@ -16128,60 +17420,29 @@ function $ParseProvider() {
     var noUnsafeEval = csp().noUnsafeEval;
     var $parseOptions = {
           csp: noUnsafeEval,
-          expensiveChecks: false,
-          literals: copy(literals),
-          isIdentifierStart: isFunction(identStart) && identStart,
-          isIdentifierContinue: isFunction(identContinue) && identContinue
-        },
-        $parseOptionsExpensive = {
-          csp: noUnsafeEval,
-          expensiveChecks: true,
           literals: copy(literals),
           isIdentifierStart: isFunction(identStart) && identStart,
           isIdentifierContinue: isFunction(identContinue) && identContinue
         };
-    var runningChecksEnabled = false;
-
-    $parse.$$runningExpensiveChecks = function() {
-      return runningChecksEnabled;
-    };
-
+    $parse.$$getAst = $$getAst;
     return $parse;
 
-    function $parse(exp, interceptorFn, expensiveChecks) {
-      var parsedExpression, oneTime, cacheKey;
-
-      expensiveChecks = expensiveChecks || runningChecksEnabled;
+    function $parse(exp, interceptorFn) {
+      var parsedExpression, cacheKey;
 
       switch (typeof exp) {
         case 'string':
           exp = exp.trim();
           cacheKey = exp;
 
-          var cache = (expensiveChecks ? cacheExpensive : cacheDefault);
           parsedExpression = cache[cacheKey];
 
           if (!parsedExpression) {
-            if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {
-              oneTime = true;
-              exp = exp.substring(2);
-            }
-            var parseOptions = expensiveChecks ? $parseOptionsExpensive : $parseOptions;
-            var lexer = new Lexer(parseOptions);
-            var parser = new Parser(lexer, $filter, parseOptions);
+            var lexer = new Lexer($parseOptions);
+            var parser = new Parser(lexer, $filter, $parseOptions);
             parsedExpression = parser.parse(exp);
-            if (parsedExpression.constant) {
-              parsedExpression.$$watchDelegate = constantWatchDelegate;
-            } else if (oneTime) {
-              parsedExpression.$$watchDelegate = parsedExpression.literal ?
-                  oneTimeLiteralWatchDelegate : oneTimeWatchDelegate;
-            } else if (parsedExpression.inputs) {
-              parsedExpression.$$watchDelegate = inputsWatchDelegate;
-            }
-            if (expensiveChecks) {
-              parsedExpression = expensiveChecksInterceptor(parsedExpression);
-            }
-            cache[cacheKey] = parsedExpression;
+
+            cache[cacheKey] = addWatchDelegate(parsedExpression);
           }
           return addInterceptor(parsedExpression, interceptorFn);
 
@@ -16193,31 +17454,13 @@ function $ParseProvider() {
       }
     }
 
-    function expensiveChecksInterceptor(fn) {
-      if (!fn) return fn;
-      expensiveCheckFn.$$watchDelegate = fn.$$watchDelegate;
-      expensiveCheckFn.assign = expensiveChecksInterceptor(fn.assign);
-      expensiveCheckFn.constant = fn.constant;
-      expensiveCheckFn.literal = fn.literal;
-      for (var i = 0; fn.inputs && i < fn.inputs.length; ++i) {
-        fn.inputs[i] = expensiveChecksInterceptor(fn.inputs[i]);
-      }
-      expensiveCheckFn.inputs = fn.inputs;
-
-      return expensiveCheckFn;
-
-      function expensiveCheckFn(scope, locals, assign, inputs) {
-        var expensiveCheckOldValue = runningChecksEnabled;
-        runningChecksEnabled = true;
-        try {
-          return fn(scope, locals, assign, inputs);
-        } finally {
-          runningChecksEnabled = expensiveCheckOldValue;
-        }
-      }
+    function $$getAst(exp) {
+      var lexer = new Lexer($parseOptions);
+      var parser = new Parser(lexer, $filter, $parseOptions);
+      return parser.getAst(exp).ast;
     }
 
-    function expressionInputDirtyCheck(newValue, oldValueOfValue) {
+    function expressionInputDirtyCheck(newValue, oldValueOfValue, compareObjectIdentity) {
 
       if (newValue == null || oldValueOfValue == null) { // null/undefined
         return newValue === oldValueOfValue;
@@ -16230,7 +17473,7 @@ function $ParseProvider() {
         //             be cheaply dirty-checked
         newValue = getValueOf(newValue);
 
-        if (typeof newValue === 'object') {
+        if (typeof newValue === 'object' && !compareObjectIdentity) {
           // objects/arrays are not supported - deep-watching them would be too expensive
           return false;
         }
@@ -16252,7 +17495,7 @@ function $ParseProvider() {
         inputExpressions = inputExpressions[0];
         return scope.$watch(function expressionInputWatch(scope) {
           var newInputValue = inputExpressions(scope);
-          if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) {
+          if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf, inputExpressions.isPure)) {
             lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]);
             oldInputValueOf = newInputValue && getValueOf(newInputValue);
           }
@@ -16272,7 +17515,7 @@ function $ParseProvider() {
 
         for (var i = 0, ii = inputExpressions.length; i < ii; i++) {
           var newInputValue = inputExpressions[i](scope);
-          if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) {
+          if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i], inputExpressions[i].isPure))) {
             oldInputValues[i] = newInputValue;
             oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue);
           }
@@ -16286,53 +17529,51 @@ function $ParseProvider() {
       }, listener, objectEquality, prettyPrintExpression);
     }
 
-    function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) {
+    function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression, prettyPrintExpression) {
+      var isDone = parsedExpression.literal ? isAllDefined : isDefined;
       var unwatch, lastValue;
-      unwatch = scope.$watch(function oneTimeWatch(scope) {
-        return parsedExpression(scope);
-      }, /** @this */ function oneTimeListener(value, old, scope) {
-        lastValue = value;
-        if (isFunction(listener)) {
-          listener.apply(this, arguments);
-        }
-        if (isDefined(value)) {
-          scope.$$postDigest(function() {
-            if (isDefined(lastValue)) {
-              unwatch();
-            }
-          });
-        }
-      }, objectEquality);
-      return unwatch;
-    }
 
-    function oneTimeLiteralWatchDelegate(scope, listener, objectEquality, parsedExpression) {
-      var unwatch, lastValue;
-      unwatch = scope.$watch(function oneTimeWatch(scope) {
-        return parsedExpression(scope);
-      }, /** @this */ function oneTimeListener(value, old, scope) {
-        lastValue = value;
-        if (isFunction(listener)) {
-          listener.call(this, value, old, scope);
-        }
-        if (isAllDefined(value)) {
-          scope.$$postDigest(function() {
-            if (isAllDefined(lastValue)) unwatch();
-          });
-        }
-      }, objectEquality);
+      var exp = parsedExpression.$$intercepted || parsedExpression;
+      var post = parsedExpression.$$interceptor || identity;
+
+      var useInputs = parsedExpression.inputs && !exp.inputs;
+
+      // Propogate the literal/inputs/constant attributes
+      // ... but not oneTime since we are handling it
+      oneTimeWatch.literal = parsedExpression.literal;
+      oneTimeWatch.constant = parsedExpression.constant;
+      oneTimeWatch.inputs = parsedExpression.inputs;
+
+      // Allow other delegates to run on this wrapped expression
+      addWatchDelegate(oneTimeWatch);
+
+      unwatch = scope.$watch(oneTimeWatch, listener, objectEquality, prettyPrintExpression);
 
       return unwatch;
 
-      function isAllDefined(value) {
-        var allDefined = true;
-        forEach(value, function(val) {
-          if (!isDefined(val)) allDefined = false;
-        });
-        return allDefined;
+      function unwatchIfDone() {
+        if (isDone(lastValue)) {
+          unwatch();
+        }
+      }
+
+      function oneTimeWatch(scope, locals, assign, inputs) {
+        lastValue = useInputs && inputs ? inputs[0] : exp(scope, locals, assign, inputs);
+        if (isDone(lastValue)) {
+          scope.$$postDigest(unwatchIfDone);
+        }
+        return post(lastValue);
       }
     }
 
+    function isAllDefined(value) {
+      var allDefined = true;
+      forEach(value, function(val) {
+        if (!isDefined(val)) allDefined = false;
+      });
+      return allDefined;
+    }
+
     function constantWatchDelegate(scope, listener, objectEquality, parsedExpression) {
       var unwatch = scope.$watch(function constantWatch(scope) {
         unwatch();
@@ -16341,39 +17582,74 @@ function $ParseProvider() {
       return unwatch;
     }
 
+    function addWatchDelegate(parsedExpression) {
+      if (parsedExpression.constant) {
+        parsedExpression.$$watchDelegate = constantWatchDelegate;
+      } else if (parsedExpression.oneTime) {
+        parsedExpression.$$watchDelegate = oneTimeWatchDelegate;
+      } else if (parsedExpression.inputs) {
+        parsedExpression.$$watchDelegate = inputsWatchDelegate;
+      }
+
+      return parsedExpression;
+    }
+
+    function chainInterceptors(first, second) {
+      function chainedInterceptor(value) {
+        return second(first(value));
+      }
+      chainedInterceptor.$stateful = first.$stateful || second.$stateful;
+      chainedInterceptor.$$pure = first.$$pure && second.$$pure;
+
+      return chainedInterceptor;
+    }
+
     function addInterceptor(parsedExpression, interceptorFn) {
       if (!interceptorFn) return parsedExpression;
-      var watchDelegate = parsedExpression.$$watchDelegate;
-      var useInputs = false;
 
-      var regularWatch =
-          watchDelegate !== oneTimeLiteralWatchDelegate &&
-          watchDelegate !== oneTimeWatchDelegate;
+      // Extract any existing interceptors out of the parsedExpression
+      // to ensure the original parsedExpression is always the $$intercepted
+      if (parsedExpression.$$interceptor) {
+        interceptorFn = chainInterceptors(parsedExpression.$$interceptor, interceptorFn);
+        parsedExpression = parsedExpression.$$intercepted;
+      }
+
+      var useInputs = false;
 
-      var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) {
+      var fn = function interceptedExpression(scope, locals, assign, inputs) {
         var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs);
-        return interceptorFn(value, scope, locals);
-      } : function oneTimeInterceptedExpression(scope, locals, assign, inputs) {
-        var value = parsedExpression(scope, locals, assign, inputs);
-        var result = interceptorFn(value, scope, locals);
-        // we only return the interceptor's result if the
-        // initial value is defined (for bind-once)
-        return isDefined(value) ? result : value;
+        return interceptorFn(value);
       };
 
-      // Propagate $$watchDelegates other then inputsWatchDelegate
-      if (parsedExpression.$$watchDelegate &&
-          parsedExpression.$$watchDelegate !== inputsWatchDelegate) {
-        fn.$$watchDelegate = parsedExpression.$$watchDelegate;
-      } else if (!interceptorFn.$stateful) {
-        // If there is an interceptor, but no watchDelegate then treat the interceptor like
-        // we treat filters - it is assumed to be a pure function unless flagged with $stateful
-        fn.$$watchDelegate = inputsWatchDelegate;
+      // Maintain references to the interceptor/intercepted
+      fn.$$intercepted = parsedExpression;
+      fn.$$interceptor = interceptorFn;
+
+      // Propogate the literal/oneTime/constant attributes
+      fn.literal = parsedExpression.literal;
+      fn.oneTime = parsedExpression.oneTime;
+      fn.constant = parsedExpression.constant;
+
+      // Treat the interceptor like filters.
+      // If it is not $stateful then only watch its inputs.
+      // If the expression itself has no inputs then use the full expression as an input.
+      if (!interceptorFn.$stateful) {
         useInputs = !parsedExpression.inputs;
         fn.inputs = parsedExpression.inputs ? parsedExpression.inputs : [parsedExpression];
+
+        if (!interceptorFn.$$pure) {
+          fn.inputs = fn.inputs.map(function(e) {
+              // Remove the isPure flag of inputs when it is not absolute because they are now wrapped in a
+              // non-pure interceptor function.
+              if (e.isPure === PURITY_RELATIVE) {
+                return function depurifier(s) { return e(s); };
+              }
+              return e;
+            });
+        }
       }
 
-      return fn;
+      return addWatchDelegate(fn);
     }
   }];
 }
@@ -16382,19 +17658,18 @@ function $ParseProvider() {
  * @ngdoc service
  * @name $q
  * @requires $rootScope
- * @this
  *
  * @description
  * A service that helps you run functions asynchronously, and use their return values (or exceptions)
  * when they are done processing.
  *
- * This is an implementation of promises/deferred objects inspired by
- * [Kris Kowal's Q](https://github.com/kriskowal/q).
+ * This is a [Promises/A+](https://promisesaplus.com/)-compliant implementation of promises/deferred
+ * objects inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).
  *
  * $q can be used in two fashions --- one which is more similar to Kris Kowal's Q or jQuery's Deferred
  * implementations, and the other which resembles ES6 (ES2015) promises to some degree.
  *
- * # $q constructor
+ * ## $q constructor
  *
  * The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver`
  * function as the first argument. This is similar to the native Promise implementation from ES6,
@@ -16482,7 +17757,7 @@ function $ParseProvider() {
  * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the
  * section on serial or parallel joining of promises.
  *
- * # The Deferred API
+ * ## The Deferred API
  *
  * A new instance of deferred is constructed by calling `$q.defer()`.
  *
@@ -16504,7 +17779,7 @@ function $ParseProvider() {
  * - promise – `{Promise}` – promise object associated with this deferred.
  *
  *
- * # The Promise API
+ * ## The Promise API
  *
  * A new promise instance is created when a deferred instance is created and can be retrieved by
  * calling `deferred.promise`.
@@ -16536,7 +17811,7 @@ function $ParseProvider() {
  *   specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for
  *   more information.
  *
- * # Chaining promises
+ * ## Chaining promises
  *
  * Because calling the `then` method of a promise returns a new derived promise, it is easily
  * possible to create a chain of promises:
@@ -16556,17 +17831,17 @@ function $ParseProvider() {
  * $http's response interceptors.
  *
  *
- * # Differences between Kris Kowal's Q and $q
+ * ## Differences between Kris Kowal's Q and $q
  *
  *  There are two main differences:
  *
  * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation
- *   mechanism in angular, which means faster propagation of resolution or rejection into your
+ *   mechanism in AngularJS, which means faster propagation of resolution or rejection into your
  *   models and avoiding unnecessary browser repaints, which would result in flickering UI.
  * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains
  *   all the important functionality needed for common async tasks.
  *
- * # Testing
+ * ## Testing
  *
  *  ```js
  *    it('should simulate promise', inject(function($q, $rootScope) {
@@ -16596,22 +17871,61 @@ function $ParseProvider() {
  *
  * @returns {Promise} The newly created promise.
  */
+/**
+ * @ngdoc provider
+ * @name $qProvider
+ * @this
+ *
+ * @description
+ */
 function $QProvider() {
-
+  var errorOnUnhandledRejections = true;
   this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {
     return qFactory(function(callback) {
       $rootScope.$evalAsync(callback);
-    }, $exceptionHandler);
+    }, $exceptionHandler, errorOnUnhandledRejections);
   }];
+
+  /**
+   * @ngdoc method
+   * @name $qProvider#errorOnUnhandledRejections
+   * @kind function
+   *
+   * @description
+   * Retrieves or overrides whether to generate an error when a rejected promise is not handled.
+   * This feature is enabled by default.
+   *
+   * @param {boolean=} value Whether to generate an error when a rejected promise is not handled.
+   * @returns {boolean|ng.$qProvider} Current value when called without a new value or self for
+   *    chaining otherwise.
+   */
+  this.errorOnUnhandledRejections = function(value) {
+    if (isDefined(value)) {
+      errorOnUnhandledRejections = value;
+      return this;
+    } else {
+      return errorOnUnhandledRejections;
+    }
+  };
 }
 
 /** @this */
 function $$QProvider() {
+  var errorOnUnhandledRejections = true;
   this.$get = ['$browser', '$exceptionHandler', function($browser, $exceptionHandler) {
     return qFactory(function(callback) {
       $browser.defer(callback);
-    }, $exceptionHandler);
+    }, $exceptionHandler, errorOnUnhandledRejections);
   }];
+
+  this.errorOnUnhandledRejections = function(value) {
+    if (isDefined(value)) {
+      errorOnUnhandledRejections = value;
+      return this;
+    } else {
+      return errorOnUnhandledRejections;
+    }
+  };
 }
 
 /**
@@ -16620,10 +17934,14 @@ function $$QProvider() {
  * @param {function(function)} nextTick Function for executing functions in the next turn.
  * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for
  *     debugging purposes.
+ * @param {boolean=} errorOnUnhandledRejections Whether an error should be generated on unhandled
+ *     promises rejections.
  * @returns {object} Promise manager.
  */
-function qFactory(nextTick, exceptionHandler) {
+function qFactory(nextTick, exceptionHandler, errorOnUnhandledRejections) {
   var $qMinErr = minErr('$q', TypeError);
+  var queueSize = 0;
+  var checkQueue = [];
 
   /**
    * @ngdoc method
@@ -16636,14 +17954,18 @@ function qFactory(nextTick, exceptionHandler) {
    * @returns {Deferred} Returns a new instance of deferred.
    */
   function defer() {
-    var d = new Deferred();
-    //Necessary to support unbound execution :/
-    d.resolve = simpleBind(d, d.resolve);
-    d.reject = simpleBind(d, d.reject);
-    d.notify = simpleBind(d, d.notify);
-    return d;
+    return new Deferred();
+  }
+
+  function Deferred() {
+    var promise = this.promise = new Promise();
+    //Non prototype methods necessary to support unbound execution :/
+    this.resolve = function(val) { resolvePromise(promise, val); };
+    this.reject = function(reason) { rejectPromise(promise, reason); };
+    this.notify = function(progress) { notifyPromise(promise, progress); };
   }
 
+
   function Promise() {
     this.$$state = { status: 0 };
   }
@@ -16653,13 +17975,13 @@ function qFactory(nextTick, exceptionHandler) {
       if (isUndefined(onFulfilled) && isUndefined(onRejected) && isUndefined(progressBack)) {
         return this;
       }
-      var result = new Deferred();
+      var result = new Promise();
 
       this.$$state.pending = this.$$state.pending || [];
       this.$$state.pending.push([result, onFulfilled, onRejected, progressBack]);
       if (this.$$state.status > 0) scheduleProcessQueue(this.$$state);
 
-      return result.promise;
+      return result;
     },
 
     'catch': function(callback) {
@@ -16675,122 +17997,144 @@ function qFactory(nextTick, exceptionHandler) {
     }
   });
 
-  //Faster, more basic than angular.bind http://jsperf.com/angular-bind-vs-custom-vs-native
-  function simpleBind(context, fn) {
-    return function(value) {
-      fn.call(context, value);
-    };
-  }
-
   function processQueue(state) {
-    var fn, deferred, pending;
+    var fn, promise, pending;
 
     pending = state.pending;
     state.processScheduled = false;
     state.pending = undefined;
-    for (var i = 0, ii = pending.length; i < ii; ++i) {
-      deferred = pending[i][0];
-      fn = pending[i][state.status];
-      try {
-        if (isFunction(fn)) {
-          deferred.resolve(fn(state.value));
-        } else if (state.status === 1) {
-          deferred.resolve(state.value);
+    try {
+      for (var i = 0, ii = pending.length; i < ii; ++i) {
+        markQStateExceptionHandled(state);
+        promise = pending[i][0];
+        fn = pending[i][state.status];
+        try {
+          if (isFunction(fn)) {
+            resolvePromise(promise, fn(state.value));
+          } else if (state.status === 1) {
+            resolvePromise(promise, state.value);
+          } else {
+            rejectPromise(promise, state.value);
+          }
+        } catch (e) {
+          rejectPromise(promise, e);
+          // This error is explicitly marked for being passed to the $exceptionHandler
+          if (e && e.$$passToExceptionHandler === true) {
+            exceptionHandler(e);
+          }
+        }
+      }
+    } finally {
+      --queueSize;
+      if (errorOnUnhandledRejections && queueSize === 0) {
+        nextTick(processChecks);
+      }
+    }
+  }
+
+  function processChecks() {
+    // eslint-disable-next-line no-unmodified-loop-condition
+    while (!queueSize && checkQueue.length) {
+      var toCheck = checkQueue.shift();
+      if (!isStateExceptionHandled(toCheck)) {
+        markQStateExceptionHandled(toCheck);
+        var errorMessage = 'Possibly unhandled rejection: ' + toDebugString(toCheck.value);
+        if (isError(toCheck.value)) {
+          exceptionHandler(toCheck.value, errorMessage);
         } else {
-          deferred.reject(state.value);
+          exceptionHandler(errorMessage);
         }
-      } catch (e) {
-        deferred.reject(e);
-        exceptionHandler(e);
       }
     }
   }
 
   function scheduleProcessQueue(state) {
+    if (errorOnUnhandledRejections && !state.pending && state.status === 2 && !isStateExceptionHandled(state)) {
+      if (queueSize === 0 && checkQueue.length === 0) {
+        nextTick(processChecks);
+      }
+      checkQueue.push(state);
+    }
     if (state.processScheduled || !state.pending) return;
     state.processScheduled = true;
+    ++queueSize;
     nextTick(function() { processQueue(state); });
   }
 
-  function Deferred() {
-    this.promise = new Promise();
+  function resolvePromise(promise, val) {
+    if (promise.$$state.status) return;
+    if (val === promise) {
+      $$reject(promise, $qMinErr(
+        'qcycle',
+        'Expected promise to be resolved with value other than itself \'{0}\'',
+        val));
+    } else {
+      $$resolve(promise, val);
+    }
+
   }
 
-  extend(Deferred.prototype, {
-    resolve: function(val) {
-      if (this.promise.$$state.status) return;
-      if (val === this.promise) {
-        this.$$reject($qMinErr(
-          'qcycle',
-          'Expected promise to be resolved with value other than itself \'{0}\'',
-          val));
+  function $$resolve(promise, val) {
+    var then;
+    var done = false;
+    try {
+      if (isObject(val) || isFunction(val)) then = val.then;
+      if (isFunction(then)) {
+        promise.$$state.status = -1;
+        then.call(val, doResolve, doReject, doNotify);
       } else {
-        this.$$resolve(val);
-      }
-
-    },
-
-    $$resolve: function(val) {
-      var then;
-      var that = this;
-      var done = false;
-      try {
-        if ((isObject(val) || isFunction(val))) then = val && val.then;
-        if (isFunction(then)) {
-          this.promise.$$state.status = -1;
-          then.call(val, resolvePromise, rejectPromise, simpleBind(this, this.notify));
-        } else {
-          this.promise.$$state.value = val;
-          this.promise.$$state.status = 1;
-          scheduleProcessQueue(this.promise.$$state);
-        }
-      } catch (e) {
-        rejectPromise(e);
-        exceptionHandler(e);
+        promise.$$state.value = val;
+        promise.$$state.status = 1;
+        scheduleProcessQueue(promise.$$state);
       }
+    } catch (e) {
+      doReject(e);
+    }
 
-      function resolvePromise(val) {
-        if (done) return;
-        done = true;
-        that.$$resolve(val);
-      }
-      function rejectPromise(val) {
-        if (done) return;
-        done = true;
-        that.$$reject(val);
-      }
-    },
+    function doResolve(val) {
+      if (done) return;
+      done = true;
+      $$resolve(promise, val);
+    }
+    function doReject(val) {
+      if (done) return;
+      done = true;
+      $$reject(promise, val);
+    }
+    function doNotify(progress) {
+      notifyPromise(promise, progress);
+    }
+  }
 
-    reject: function(reason) {
-      if (this.promise.$$state.status) return;
-      this.$$reject(reason);
-    },
+  function rejectPromise(promise, reason) {
+    if (promise.$$state.status) return;
+    $$reject(promise, reason);
+  }
 
-    $$reject: function(reason) {
-      this.promise.$$state.value = reason;
-      this.promise.$$state.status = 2;
-      scheduleProcessQueue(this.promise.$$state);
-    },
+  function $$reject(promise, reason) {
+    promise.$$state.value = reason;
+    promise.$$state.status = 2;
+    scheduleProcessQueue(promise.$$state);
+  }
 
-    notify: function(progress) {
-      var callbacks = this.promise.$$state.pending;
+  function notifyPromise(promise, progress) {
+    var callbacks = promise.$$state.pending;
 
-      if ((this.promise.$$state.status <= 0) && callbacks && callbacks.length) {
-        nextTick(function() {
-          var callback, result;
-          for (var i = 0, ii = callbacks.length; i < ii; i++) {
-            result = callbacks[i][0];
-            callback = callbacks[i][3];
-            try {
-              result.notify(isFunction(callback) ? callback(progress) : progress);
-            } catch (e) {
-              exceptionHandler(e);
-            }
+    if ((promise.$$state.status <= 0) && callbacks && callbacks.length) {
+      nextTick(function() {
+        var callback, result;
+        for (var i = 0, ii = callbacks.length; i < ii; i++) {
+          result = callbacks[i][0];
+          callback = callbacks[i][3];
+          try {
+            notifyPromise(result, isFunction(callback) ? callback(progress) : progress);
+          } catch (e) {
+            exceptionHandler(e);
           }
-        });
-      }
+        }
+      });
     }
-  });
+  }
 
   /**
    * @ngdoc method
@@ -16829,9 +18173,9 @@ function qFactory(nextTick, exceptionHandler) {
    * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.
    */
   function reject(reason) {
-    var result = new Deferred();
-    result.reject(reason);
-    return result.promise;
+    var result = new Promise();
+    rejectPromise(result, reason);
+    return result;
   }
 
   function handleCallback(value, resolver, callback) {
@@ -16869,9 +18213,9 @@ function qFactory(nextTick, exceptionHandler) {
 
 
   function when(value, callback, errback, progressBack) {
-    var result = new Deferred();
-    result.resolve(value);
-    return result.promise.then(callback, errback, progressBack);
+    var result = new Promise();
+    resolvePromise(result, value);
+    return result.then(callback, errback, progressBack);
   }
 
   /**
@@ -16907,7 +18251,7 @@ function qFactory(nextTick, exceptionHandler) {
    */
 
   function all(promises) {
-    var deferred = new Deferred(),
+    var result = new Promise(),
         counter = 0,
         results = isArray(promises) ? [] : {};
 
@@ -16915,17 +18259,17 @@ function qFactory(nextTick, exceptionHandler) {
       counter++;
       when(promise).then(function(value) {
         results[key] = value;
-        if (!(--counter)) deferred.resolve(results);
+        if (!(--counter)) resolvePromise(result, results);
       }, function(reason) {
-        deferred.reject(reason);
+        rejectPromise(result, reason);
       });
     });
 
     if (counter === 0) {
-      deferred.resolve(results);
+      resolvePromise(result, results);
     }
 
-    return deferred.promise;
+    return result;
   }
 
   /**
@@ -16957,19 +18301,19 @@ function qFactory(nextTick, exceptionHandler) {
       throw $qMinErr('norslvr', 'Expected resolverFn, got \'{0}\'', resolver);
     }
 
-    var deferred = new Deferred();
+    var promise = new Promise();
 
     function resolveFn(value) {
-      deferred.resolve(value);
+      resolvePromise(promise, value);
     }
 
     function rejectFn(reason) {
-      deferred.reject(reason);
+      rejectPromise(promise, reason);
     }
 
     resolver(resolveFn, rejectFn);
 
-    return deferred.promise;
+    return promise;
   }
 
   // Let's make the instanceof operator work for promises, so that
@@ -16986,6 +18330,22 @@ function qFactory(nextTick, exceptionHandler) {
   return $Q;
 }
 
+function isStateExceptionHandled(state) {
+  return !!state.pur;
+}
+function markQStateExceptionHandled(state) {
+  state.pur = true;
+}
+function markQExceptionHandled(q) {
+  // Built-in `$q` promises will always have a `$$state` property. This check is to allow
+  // overwriting `$q` with a different promise library (e.g. Bluebird + angular-bluebird-promises).
+  // (Currently, this is the only method that might be called with a promise, even if it is not
+  // created by the built-in `$q`.)
+  if (q.$$state) {
+    markQStateExceptionHandled(q.$$state);
+  }
+}
+
 /** @this */
 function $$RAFProvider() { //rAF
   this.$get = ['$window', '$timeout', function($window, $timeout) {
@@ -17108,6 +18468,7 @@ function $RootScopeProvider() {
       this.$$watchersCount = 0;
       this.$id = nextUid();
       this.$$ChildScope = null;
+      this.$$suspended = false;
     }
     ChildScope.prototype = parent;
     return ChildScope;
@@ -17122,6 +18483,7 @@ function $RootScopeProvider() {
 
     function cleanUpScope($scope) {
 
+      // Support: IE 9 only
       if (msie === 9) {
         // There is a memory leak in IE9 if all child scopes are not disconnected
         // completely when a scope is destroyed. So this code will recurse up through
@@ -17159,7 +18521,7 @@ function $RootScopeProvider() {
      * an in-depth introduction and usage examples.
      *
      *
-     * # Inheritance
+     * ## Inheritance
      * A scope can inherit from a parent scope, as in this example:
      * ```js
          var parent = $rootScope;
@@ -17194,6 +18556,7 @@ function $RootScopeProvider() {
                      this.$$childHead = this.$$childTail = null;
       this.$root = this;
       this.$$destroyed = false;
+      this.$$suspended = false;
       this.$$listeners = {};
       this.$$listenerCount = {};
       this.$$watchersCount = 0;
@@ -17313,6 +18676,8 @@ function $RootScopeProvider() {
        *   according to the {@link angular.equals} function. To save the value of the object for
        *   later comparison, the {@link angular.copy} function is used. This therefore means that
        *   watching complex objects will have adverse memory and performance implications.
+       * - This should not be used to watch for changes in objects that are (or contain)
+       *   [File](https://developer.mozilla.org/docs/Web/API/File) objects due to limitations with {@link angular.copy `angular.copy`}.
        * - The watch `listener` may change the model, which may trigger other `listener`s to fire.
        *   This is achieved by rerunning the watchers until no changes are detected. The rerun
        *   iteration limit is 10 to prevent an infinite loop deadlock.
@@ -17332,7 +18697,7 @@ function $RootScopeProvider() {
        *
        *
        *
-       * # Example
+       * @example
        * ```js
            // let's assume that scope was dependency injected as the $rootScope
            var scope = $rootScope;
@@ -17408,14 +18773,15 @@ function $RootScopeProvider() {
        */
       $watch: function(watchExp, listener, objectEquality, prettyPrintExpression) {
         var get = $parse(watchExp);
+        var fn = isFunction(listener) ? listener : noop;
 
         if (get.$$watchDelegate) {
-          return get.$$watchDelegate(this, listener, objectEquality, get, watchExp);
+          return get.$$watchDelegate(this, fn, objectEquality, get, watchExp);
         }
         var scope = this,
             array = scope.$$watchers,
             watcher = {
-              fn: listener,
+              fn: fn,
               last: initWatchVal,
               get: get,
               exp: prettyPrintExpression || watchExp,
@@ -17424,10 +18790,6 @@ function $RootScopeProvider() {
 
         lastDirtyWatch = null;
 
-        if (!isFunction(listener)) {
-          watcher.fn = noop;
-        }
-
         if (!array) {
           array = scope.$$watchers = [];
           array.$$digestWatchIndex = -1;
@@ -17504,9 +18866,8 @@ function $RootScopeProvider() {
         }
 
         forEach(watchExpressions, function(expr, i) {
-          var unwatchFn = self.$watch(expr, function watchGroupSubAction(value, oldValue) {
+          var unwatchFn = self.$watch(expr, function watchGroupSubAction(value) {
             newValues[i] = value;
-            oldValues[i] = oldValue;
             if (!changeReactionScheduled) {
               changeReactionScheduled = true;
               self.$evalAsync(watchGroupAction);
@@ -17518,11 +18879,17 @@ function $RootScopeProvider() {
         function watchGroupAction() {
           changeReactionScheduled = false;
 
-          if (firstRun) {
-            firstRun = false;
-            listener(newValues, newValues, self);
-          } else {
-            listener(newValues, oldValues, self);
+          try {
+            if (firstRun) {
+              firstRun = false;
+              listener(newValues, newValues, self);
+            } else {
+              listener(newValues, oldValues, self);
+            }
+          } finally {
+            for (var i = 0; i < watchExpressions.length; i++) {
+              oldValues[i] = newValues[i];
+            }
           }
         }
 
@@ -17550,7 +18917,7 @@ function $RootScopeProvider() {
        *   adding, removing, and moving items belonging to an object or array.
        *
        *
-       * # Example
+       * @example
        * ```js
           $scope.names = ['igor', 'matias', 'misko', 'james'];
           $scope.dataCount = 4;
@@ -17590,7 +18957,11 @@ function $RootScopeProvider() {
        *    de-registration function is executed, the internal watch operation is terminated.
        */
       $watchCollection: function(obj, listener) {
-        $watchCollectionInterceptor.$stateful = true;
+        // Mark the interceptor as
+        // ... $$pure when literal since the instance will change when any input changes
+        $watchCollectionInterceptor.$$pure = $parse(obj).literal;
+        // ... $stateful when non-literal since we must read the state of the collection
+        $watchCollectionInterceptor.$stateful = !$watchCollectionInterceptor.$$pure;
 
         var self = this;
         // the current value, updated on each dirty-check run
@@ -17748,7 +19119,7 @@ function $RootScopeProvider() {
        *
        * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.
        *
-       * # Example
+       * @example
        * ```js
            var scope = ...;
            scope.name = 'misko';
@@ -17778,7 +19149,7 @@ function $RootScopeProvider() {
         var watch, value, last, fn, get,
             watchers,
             dirty, ttl = TTL,
-            next, current, target = this,
+            next, current, target = asyncQueue.length ? $rootScope : this,
             watchLog = [],
             logIdx, asyncTask;
 
@@ -17800,12 +19171,13 @@ function $RootScopeProvider() {
           current = target;
 
           // It's safe for asyncQueuePosition to be a local variable here because this loop can't
-          // be reentered recursively. Calling $digest from a function passed to $applyAsync would
+          // be reentered recursively. Calling $digest from a function passed to $evalAsync would
           // lead to a '$digest already in progress' error.
           for (var asyncQueuePosition = 0; asyncQueuePosition < asyncQueue.length; asyncQueuePosition++) {
             try {
               asyncTask = asyncQueue[asyncQueuePosition];
-              asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals);
+              fn = asyncTask.fn;
+              fn(asyncTask.scope, asyncTask.locals);
             } catch (e) {
               $exceptionHandler(e);
             }
@@ -17815,7 +19187,7 @@ function $RootScopeProvider() {
 
           traverseScopesLoop:
           do { // "traverse the scopes" loop
-            if ((watchers = current.$$watchers)) {
+            if ((watchers = !current.$$suspended && current.$$watchers)) {
               // process our watches
               watchers.$$digestWatchIndex = watchers.length;
               while (watchers.$$digestWatchIndex--) {
@@ -17859,7 +19231,9 @@ function $RootScopeProvider() {
             // Insanity Warning: scope depth-first traversal
             // yes, this code is a bit crazy, but it works and we have tests to prove it!
             // this piece should be kept in sync with the traversal in $broadcast
-            if (!(next = ((current.$$watchersCount && current.$$childHead) ||
+            // (though it differs due to having the extra check for $$suspended and does not
+            // check $$listenerCount)
+            if (!(next = ((!current.$$suspended && current.$$watchersCount && current.$$childHead) ||
                 (current !== target && current.$$nextSibling)))) {
               while (current !== target && !(next = current.$$nextSibling)) {
                 current = current.$parent;
@@ -17890,8 +19264,101 @@ function $RootScopeProvider() {
           }
         }
         postDigestQueue.length = postDigestQueuePosition = 0;
+
+        // Check for changes to browser url that happened during the $digest
+        // (for which no event is fired; e.g. via `history.pushState()`)
+        $browser.$$checkUrlChange();
+      },
+
+      /**
+       * @ngdoc method
+       * @name $rootScope.Scope#$suspend
+       * @kind function
+       *
+       * @description
+       * Suspend watchers of this scope subtree so that they will not be invoked during digest.
+       *
+       * This can be used to optimize your application when you know that running those watchers
+       * is redundant.
+       *
+       * **Warning**
+       *
+       * Suspending scopes from the digest cycle can have unwanted and difficult to debug results.
+       * Only use this approach if you are confident that you know what you are doing and have
+       * ample tests to ensure that bindings get updated as you expect.
+       *
+       * Some of the things to consider are:
+       *
+       * * Any external event on a directive/component will not trigger a digest while the hosting
+       *   scope is suspended - even if the event handler calls `$apply()` or `$rootScope.$digest()`.
+       * * Transcluded content exists on a scope that inherits from outside a directive but exists
+       *   as a child of the directive's containing scope. If the containing scope is suspended the
+       *   transcluded scope will also be suspended, even if the scope from which the transcluded
+       *   scope inherits is not suspended.
+       * * Multiple directives trying to manage the suspended status of a scope can confuse each other:
+       *    * A call to `$suspend()` on an already suspended scope is a no-op.
+       *    * A call to `$resume()` on a non-suspended scope is a no-op.
+       *    * If two directives suspend a scope, then one of them resumes the scope, the scope will no
+       *      longer be suspended. This could result in the other directive believing a scope to be
+       *      suspended when it is not.
+       * * If a parent scope is suspended then all its descendants will be also excluded from future
+       *   digests whether or not they have been suspended themselves. Note that this also applies to
+       *   isolate child scopes.
+       * * Calling `$digest()` directly on a descendant of a suspended scope will still run the watchers
+       *   for that scope and its descendants. When digesting we only check whether the current scope is
+       *   locally suspended, rather than checking whether it has a suspended ancestor.
+       * * Calling `$resume()` on a scope that has a suspended ancestor will not cause the scope to be
+       *   included in future digests until all its ancestors have been resumed.
+       * * Resolved promises, e.g. from explicit `$q` deferreds and `$http` calls, trigger `$apply()`
+       *   against the `$rootScope` and so will still trigger a global digest even if the promise was
+       *   initiated by a component that lives on a suspended scope.
+       */
+      $suspend: function() {
+        this.$$suspended = true;
+      },
+
+      /**
+       * @ngdoc method
+       * @name $rootScope.Scope#$isSuspended
+       * @kind function
+       *
+       * @description
+       * Call this method to determine if this scope has been explicitly suspended. It will not
+       * tell you whether an ancestor has been suspended.
+       * To determine if this scope will be excluded from a digest triggered at the $rootScope,
+       * for example, you must check all its ancestors:
+       *
+       * ```
+       * function isExcludedFromDigest(scope) {
+       *   while(scope) {
+       *     if (scope.$isSuspended()) return true;
+       *     scope = scope.$parent;
+       *   }
+       *   return false;
+       * ```
+       *
+       * Be aware that a scope may not be included in digests if it has a suspended ancestor,
+       * even if `$isSuspended()` returns false.
+       *
+       * @returns true if the current scope has been suspended.
+       */
+      $isSuspended: function() {
+        return this.$$suspended;
       },
 
+      /**
+       * @ngdoc method
+       * @name $rootScope.Scope#$resume
+       * @kind function
+       *
+       * @description
+       * Resume watchers of this scope subtree in case it was suspended.
+       *
+       * See {@link $rootScope.Scope#$suspend} for information about the dangers of using this approach.
+       */
+      $resume: function() {
+        this.$$suspended = false;
+      },
 
       /**
        * @ngdoc event
@@ -17969,10 +19436,10 @@ function $RootScopeProvider() {
        *
        * @description
        * Executes the `expression` on the current scope and returns the result. Any exceptions in
-       * the expression are propagated (uncaught). This is useful when evaluating Angular
+       * the expression are propagated (uncaught). This is useful when evaluating AngularJS
        * expressions.
        *
-       * # Example
+       * @example
        * ```js
            var scope = ng.$rootScope.Scope();
            scope.a = 1;
@@ -17982,7 +19449,7 @@ function $RootScopeProvider() {
            expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);
        * ```
        *
-       * @param {(string|function())=} expression An angular expression to be executed.
+       * @param {(string|function())=} expression An AngularJS expression to be executed.
        *
        *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.
        *    - `function(scope)`: execute the function with the current `scope` parameter.
@@ -18017,7 +19484,7 @@ function $RootScopeProvider() {
        * will be scheduled. However, it is encouraged to always call code that changes the model
        * from within an `$apply` call. That includes code evaluated via `$evalAsync`.
        *
-       * @param {(string|function())=} expression An angular expression to be executed.
+       * @param {(string|function())=} expression An AngularJS expression to be executed.
        *
        *    - `string`: execute using the rules as defined in {@link guide/expression expression}.
        *    - `function(scope)`: execute the function with the current `scope` parameter.
@@ -18032,10 +19499,10 @@ function $RootScopeProvider() {
             if (asyncQueue.length) {
               $rootScope.$digest();
             }
-          });
+          }, null, '$evalAsync');
         }
 
-        asyncQueue.push({scope: this, expression: $parse(expr), locals: locals});
+        asyncQueue.push({scope: this, fn: $parse(expr), locals: locals});
       },
 
       $$postDigest: function(fn) {
@@ -18048,15 +19515,14 @@ function $RootScopeProvider() {
        * @kind function
        *
        * @description
-       * `$apply()` is used to execute an expression in angular from outside of the angular
+       * `$apply()` is used to execute an expression in AngularJS from outside of the AngularJS
        * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).
-       * Because we are calling into the angular framework we need to perform proper scope life
+       * Because we are calling into the AngularJS framework we need to perform proper scope life
        * cycle of {@link ng.$exceptionHandler exception handling},
        * {@link ng.$rootScope.Scope#$digest executing watches}.
        *
-       * ## Life cycle
+       * **Life cycle: Pseudo-Code of `$apply()`**
        *
-       * # Pseudo-Code of `$apply()`
        * ```js
            function $apply(expr) {
              try {
@@ -18080,7 +19546,7 @@ function $RootScopeProvider() {
        *    expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.
        *
        *
-       * @param {(string|function())=} exp An angular expression to be executed.
+       * @param {(string|function())=} exp An AngularJS expression to be executed.
        *
        *    - `string`: execute using the rules as defined in {@link guide/expression expression}.
        *    - `function(scope)`: execute the function with current `scope` parameter.
@@ -18120,7 +19586,7 @@ function $RootScopeProvider() {
        * This can be used to queue up multiple expressions which need to be evaluated in the same
        * digest.
        *
-       * @param {(string|function())=} exp An angular expression to be executed.
+       * @param {(string|function())=} exp An AngularJS expression to be executed.
        *
        *    - `string`: execute using the rules as defined in {@link guide/expression expression}.
        *    - `function(scope)`: execute the function with current `scope` parameter.
@@ -18184,7 +19650,10 @@ function $RootScopeProvider() {
         return function() {
           var indexOfListener = namedListeners.indexOf(listener);
           if (indexOfListener !== -1) {
-            namedListeners[indexOfListener] = null;
+            // Use delete in the hope of the browser deallocating the memory for the array entry,
+            // while not shifting the array indexes of other listeners.
+            // See issue https://github.com/angular/angular.js/issues/16135
+            delete namedListeners[indexOfListener];
             decrementListenerCount(self, 1, name);
           }
         };
@@ -18251,8 +19720,7 @@ function $RootScopeProvider() {
           }
           //if any listener on the current scope stops propagation, prevent bubbling
           if (stopPropagation) {
-            event.currentScope = null;
-            return event;
+            break;
           }
           //traverse upwards
           scope = scope.$parent;
@@ -18326,7 +19794,8 @@ function $RootScopeProvider() {
           // Insanity Warning: scope depth-first traversal
           // yes, this code is a bit crazy, but it works and we have tests to prove it!
           // this piece should be kept in sync with the traversal in $digest
-          // (though it differs due to having the extra check for $$listenerCount)
+          // (though it differs due to having the extra check for $$listenerCount and
+          // does not check $$suspended)
           if (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||
               (current !== target && current.$$nextSibling)))) {
             while (current !== target && !(next = current.$$nextSibling)) {
@@ -18401,7 +19870,7 @@ function $RootScopeProvider() {
       if (applyAsyncId === null) {
         applyAsyncId = $browser.defer(function() {
           $rootScope.$apply(flushApplyAsync);
-        });
+        }, null, '$applyAsync');
       }
     }
   }];
@@ -18412,7 +19881,7 @@ function $RootScopeProvider() {
  * @name $rootElement
  *
  * @description
- * The root element of Angular application. This is either the element where {@link
+ * The root element of AngularJS application. This is either the element where {@link
  * ng.directive:ngApp ngApp} was declared or the element passed into
  * {@link angular.bootstrap}. The element represents the root element of application. It is also the
  * location where the application's {@link auto.$injector $injector} service gets
@@ -18428,7 +19897,8 @@ function $RootScopeProvider() {
  * Private service to sanitize uris for links and images. Used by $compile and $sanitize.
  */
 function $$SanitizeUriProvider() {
-  var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/,
+
+  var aHrefSanitizationWhitelist = /^\s*(https?|s?ftp|mailto|tel|file):/,
     imgSrcSanitizationWhitelist = /^\s*((https?|ftp|file|blob):|data:image\/)/;
 
   /**
@@ -18436,12 +19906,16 @@ function $$SanitizeUriProvider() {
    * Retrieves or overrides the default regular expression that is used for whitelisting of safe
    * urls during a[href] sanitization.
    *
-   * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+   * The sanitization is a security measure aimed at prevent XSS attacks via HTML anchor links.
    *
-   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into
-   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`
-   * regular expression. If a match is found, the original url is written into the dom. Otherwise,
-   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+   * Any url due to be assigned to an `a[href]` attribute via interpolation is marked as requiring
+   * the $sce.URL security context. When interpolation occurs a call is made to `$sce.trustAsUrl(url)`
+   * which in turn may call `$$sanitizeUri(url, isMedia)` to sanitize the potentially malicious URL.
+   *
+   * If the URL matches the `aHrefSanitizationWhitelist` regular expression, it is returned unchanged.
+   *
+   * If there is no match the URL is returned prefixed with `'unsafe:'` to ensure that when it is written
+   * to the DOM it is inactive and potentially malicious code will not be executed.
    *
    * @param {RegExp=} regexp New regexp to whitelist urls with.
    * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
@@ -18461,12 +19935,17 @@ function $$SanitizeUriProvider() {
    * Retrieves or overrides the default regular expression that is used for whitelisting of safe
    * urls during img[src] sanitization.
    *
-   * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+   * The sanitization is a security measure aimed at prevent XSS attacks via HTML image src links.
    *
-   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into
-   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`
-   * regular expression. If a match is found, the original url is written into the dom. Otherwise,
-   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+   * Any URL due to be assigned to an `img[src]` attribute via interpolation is marked as requiring
+   * the $sce.MEDIA_URL security context. When interpolation occurs a call is made to
+   * `$sce.trustAsMediaUrl(url)` which in turn may call `$$sanitizeUri(url, isMedia)` to sanitize
+   * the potentially malicious URL.
+   *
+   * If the URL matches the `aImgSanitizationWhitelist` regular expression, it is returned unchanged.
+   *
+   * If there is no match the URL is returned prefixed with `'unsafe:'` to ensure that when it is written
+   * to the DOM it is inactive and potentially malicious code will not be executed.
    *
    * @param {RegExp=} regexp New regexp to whitelist urls with.
    * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
@@ -18481,10 +19960,10 @@ function $$SanitizeUriProvider() {
   };
 
   this.$get = function() {
-    return function sanitizeUri(uri, isImage) {
-      var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;
-      var normalizedVal;
-      normalizedVal = urlResolve(uri).href;
+    return function sanitizeUri(uri, isMediaUrl) {
+      // if (!uri) return uri;
+      var regex = isMediaUrl ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;
+      var normalizedVal = urlResolve(uri && uri.trim()).href;
       if (normalizedVal !== '' && !normalizedVal.match(regex)) {
         return 'unsafe:' + normalizedVal;
       }
@@ -18509,17 +19988,38 @@ function $$SanitizeUriProvider() {
 var $sceMinErr = minErr('$sce');
 
 var SCE_CONTEXTS = {
+  // HTML is used when there's HTML rendered (e.g. ng-bind-html, iframe srcdoc binding).
   HTML: 'html',
+
+  // Style statements or stylesheets. Currently unused in AngularJS.
   CSS: 'css',
+
+  // An URL used in a context where it refers to the source of media, which are not expected to be run
+  // as scripts, such as an image, audio, video, etc.
+  MEDIA_URL: 'mediaUrl',
+
+  // An URL used in a context where it does not refer to a resource that loads code.
+  // A value that can be trusted as a URL can also trusted as a MEDIA_URL.
   URL: 'url',
-  // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a
-  // url.  (e.g. ng-include, script src, templateUrl)
+
+  // RESOURCE_URL is a subtype of URL used where the referred-to resource could be interpreted as
+  // code. (e.g. ng-include, script src binding, templateUrl)
+  // A value that can be trusted as a RESOURCE_URL, can also trusted as a URL and a MEDIA_URL.
   RESOURCE_URL: 'resourceUrl',
+
+  // Script. Currently unused in AngularJS.
   JS: 'js'
 };
 
 // Helper functions follow.
 
+var UNDERSCORE_LOWERCASE_REGEXP = /_([a-z])/g;
+
+function snakeToCamel(name) {
+  return name
+    .replace(UNDERSCORE_LOWERCASE_REGEXP, fnCamelCaseReplace);
+}
+
 function adjustMatcher(matcher) {
   if (matcher === 'self') {
     return matcher;
@@ -18569,6 +20069,16 @@ function adjustMatchers(matchers) {
  * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict
  * Contextual Escaping (SCE)} services to AngularJS.
  *
+ * For an overview of this service and the functionnality it provides in AngularJS, see the main
+ * page for {@link ng.$sce SCE}. The current page is targeted for developers who need to alter how
+ * SCE works in their application, which shouldn't be needed in most cases.
+ *
+ * <div class="alert alert-danger">
+ * AngularJS strongly relies on contextual escaping for the security of bindings: disabling or
+ * modifying this might cause cross site scripting (XSS) vulnerabilities. For libraries owners,
+ * changes to this service will also influence users, so be extra careful and document your changes.
+ * </div>
+ *
  * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of
  * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS.  This is
  * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to
@@ -18594,12 +20104,16 @@ function adjustMatchers(matchers) {
  * @description
  *
  * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate
- * $sceDelegate} service.  This allows one to get/set the whitelists and blacklists used to ensure
- * that the URLs used for sourcing Angular templates are safe.  Refer {@link
- * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and
- * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}
+ * $sceDelegate service}, used as a delegate for {@link ng.$sce Strict Contextual Escaping (SCE)}.
  *
- * For the general details about this service in Angular, read the main page for {@link ng.$sce
+ * The `$sceDelegateProvider` allows one to get/set the whitelists and blacklists used to ensure
+ * that the URLs used for sourcing AngularJS templates and other script-running URLs are safe (all
+ * places that use the `$sce.RESOURCE_URL` context). See
+ * {@link ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist}
+ * and
+ * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist},
+ *
+ * For the general details about this service in AngularJS, read the main page for {@link ng.$sce
  * Strict Contextual Escaping (SCE)}.
  *
  * **Example**:  Consider the following case. <a name="example"></a>
@@ -18626,6 +20140,13 @@ function adjustMatchers(matchers) {
  *    ]);
  *  });
  * ```
+ * Note that an empty whitelist will block every resource URL from being loaded, and will require
+ * you to manually mark each one as trusted with `$sce.trustAsResourceUrl`. However, templates
+ * requested by {@link ng.$templateRequest $templateRequest} that are present in
+ * {@link ng.$templateCache $templateCache} will not go through this check. If you have a mechanism
+ * to populate your templates in that cache at config time, then it is a good idea to remove 'self'
+ * from that whitelist. This helps to mitigate the security impact of certain types of issues, like
+ * for instance attacker-controlled `ng-includes`.
  */
 
 function $SceDelegateProvider() {
@@ -18641,23 +20162,23 @@ function $SceDelegateProvider() {
    * @kind function
    *
    * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value
-   *    provided.  This must be an array or null.  A snapshot of this array is used so further
-   *    changes to the array are ignored.
-   *
-   *    Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
-   *    allowed in this array.
+   *     provided.  This must be an array or null.  A snapshot of this array is used so further
+   *     changes to the array are ignored.
+   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
+   *     allowed in this array.
    *
-   *    <div class="alert alert-warning">
-   *    **Note:** an empty whitelist array will block all URLs!
-   *    </div>
+   * @return {Array} The currently set whitelist array.
    *
-   * @return {Array} the currently set whitelist array.
+   * @description
+   * Sets/Gets the whitelist of trusted resource URLs.
    *
    * The **default value** when no whitelist has been explicitly set is `['self']` allowing only
    * same origin resource requests.
    *
-   * @description
-   * Sets/Gets the whitelist of trusted resource URLs.
+   * <div class="alert alert-warning">
+   * **Note:** the default whitelist of 'self' is not recommended if your app shares its origin
+   * with other apps! It is a good idea to limit it to only your application's directory.
+   * </div>
    */
   this.resourceUrlWhitelist = function(value) {
     if (arguments.length) {
@@ -18672,25 +20193,23 @@ function $SceDelegateProvider() {
    * @kind function
    *
    * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value
-   *    provided.  This must be an array or null.  A snapshot of this array is used so further
-   *    changes to the array are ignored.
-   *
-   *    Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
-   *    allowed in this array.
-   *
-   *    The typical usage for the blacklist is to **block
-   *    [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as
-   *    these would otherwise be trusted but actually return content from the redirected domain.
+   *     provided.  This must be an array or null.  A snapshot of this array is used so further
+   *     changes to the array are ignored.</p><p>
+   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
+   *     allowed in this array.</p><p>
+   *     The typical usage for the blacklist is to **block
+   *     [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as
+   *     these would otherwise be trusted but actually return content from the redirected domain.
+   *     </p><p>
+   *     Finally, **the blacklist overrides the whitelist** and has the final say.
+   *
+   * @return {Array} The currently set blacklist array.
    *
-   *    Finally, **the blacklist overrides the whitelist** and has the final say.
-   *
-   * @return {Array} the currently set blacklist array.
+   * @description
+   * Sets/Gets the blacklist of trusted resource URLs.
    *
    * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there
    * is no blacklist.)
-   *
-   * @description
-   * Sets/Gets the blacklist of trusted resource URLs.
    */
 
   this.resourceUrlBlacklist = function(value) {
@@ -18700,7 +20219,7 @@ function $SceDelegateProvider() {
     return resourceUrlBlacklist;
   };
 
-  this.$get = ['$injector', function($injector) {
+  this.$get = ['$injector', '$$sanitizeUri', function($injector, $$sanitizeUri) {
 
     var htmlSanitizer = function htmlSanitizer(html) {
       throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
@@ -18713,7 +20232,7 @@ function $SceDelegateProvider() {
 
     function matchUrl(matcher, parsedUrl) {
       if (matcher === 'self') {
-        return urlIsSameOrigin(parsedUrl);
+        return urlIsSameOrigin(parsedUrl) || urlIsSameOriginAsBaseUrl(parsedUrl);
       } else {
         // definitely a regex.  See adjustMatchers()
         return !!matcher.exec(parsedUrl.href);
@@ -18765,7 +20284,8 @@ function $SceDelegateProvider() {
 
     byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);
     byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);
-    byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);
+    byType[SCE_CONTEXTS.MEDIA_URL] = generateHolderType(trustedValueHolderBase);
+    byType[SCE_CONTEXTS.URL] = generateHolderType(byType[SCE_CONTEXTS.MEDIA_URL]);
     byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);
     byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);
 
@@ -18774,17 +20294,24 @@ function $SceDelegateProvider() {
      * @name $sceDelegate#trustAs
      *
      * @description
-     * Returns an object that is trusted by angular for use in specified strict
-     * contextual escaping contexts (such as ng-bind-html, ng-include, any src
-     * attribute interpolation, any dom event binding attribute interpolation
-     * such as for onclick,  etc.) that uses the provided value.
-     * See {@link ng.$sce $sce} for enabling strict contextual escaping.
-     *
-     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,
-     *   resourceUrl, html, js and css.
-     * @param {*} value The value that that should be considered trusted/safe.
-     * @returns {*} A value that can be used to stand in for the provided `value` in places
-     * where Angular expects a $sce.trustAs() return value.
+     * Returns a trusted representation of the parameter for the specified context. This trusted
+     * object will later on be used as-is, without any security check, by bindings or directives
+     * that require this security context.
+     * For instance, marking a string as trusted for the `$sce.HTML` context will entirely bypass
+     * the potential `$sanitize` call in corresponding `$sce.HTML` bindings or directives, such as
+     * `ng-bind-html`. Note that in most cases you won't need to call this function: if you have the
+     * sanitizer loaded, passing the value itself will render all the HTML that does not pose a
+     * security risk.
+     *
+     * See {@link ng.$sceDelegate#getTrusted getTrusted} for the function that will consume those
+     * trusted values, and {@link ng.$sce $sce} for general documentation about strict contextual
+     * escaping.
+     *
+     * @param {string} type The context in which this value is safe for use, e.g. `$sce.URL`,
+     *     `$sce.RESOURCE_URL`, `$sce.HTML`, `$sce.JS` or `$sce.CSS`.
+     *
+     * @param {*} value The value that should be considered trusted.
+     * @return {*} A trusted representation of value, that can be used in the given context.
      */
     function trustAs(type, trustedValue) {
       var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);
@@ -18816,11 +20343,11 @@ function $SceDelegateProvider() {
      * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.
      *
      * If the passed parameter is not a value that had been returned by {@link
-     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is.
+     * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, it must be returned as-is.
      *
      * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}
-     *      call or anything else.
-     * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs
+     *     call or anything else.
+     * @return {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs
      *     `$sceDelegate.trustAs`} if `value` is the result of such a call.  Otherwise, returns
      *     `value` unchanged.
      */
@@ -18837,33 +20364,56 @@ function $SceDelegateProvider() {
      * @name $sceDelegate#getTrusted
      *
      * @description
-     * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and
-     * returns the originally supplied value if the queried context type is a supertype of the
-     * created type.  If this condition isn't satisfied, throws an exception.
+     * Given an object and a security context in which to assign it, returns a value that's safe to
+     * use in this context, which was represented by the parameter. To do so, this function either
+     * unwraps the safe type it has been given (for instance, a {@link ng.$sceDelegate#trustAs
+     * `$sceDelegate.trustAs`} result), or it might try to sanitize the value given, depending on
+     * the context and sanitizer availablility.
+     *
+     * The contexts that can be sanitized are $sce.MEDIA_URL, $sce.URL and $sce.HTML. The first two are available
+     * by default, and the third one relies on the `$sanitize` service (which may be loaded through
+     * the `ngSanitize` module). Furthermore, for $sce.RESOURCE_URL context, a plain string may be
+     * accepted if the resource url policy defined by {@link ng.$sceDelegateProvider#resourceUrlWhitelist
+     * `$sceDelegateProvider.resourceUrlWhitelist`} and {@link ng.$sceDelegateProvider#resourceUrlBlacklist
+     * `$sceDelegateProvider.resourceUrlBlacklist`} accepts that resource.
+     *
+     * This function will throw if the safe type isn't appropriate for this context, or if the
+     * value given cannot be accepted in the context (which might be caused by sanitization not
+     * being available, or the value not being recognized as safe).
      *
      * <div class="alert alert-danger">
      * Disabling auto-escaping is extremely dangerous, it usually creates a Cross Site Scripting
      * (XSS) vulnerability in your application.
      * </div>
      *
-     * @param {string} type The kind of context in which this value is to be used.
+     * @param {string} type The context in which this value is to be used (such as `$sce.HTML`).
      * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs
-     *     `$sceDelegate.trustAs`} call.
-     * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs
-     *     `$sceDelegate.trustAs`} if valid in this context.  Otherwise, throws an exception.
+     *     `$sceDelegate.trustAs`} call, or anything else (which will not be considered trusted.)
+     * @return {*} A version of the value that's safe to use in the given context, or throws an
+     *     exception if this is impossible.
      */
     function getTrusted(type, maybeTrusted) {
       if (maybeTrusted === null || isUndefined(maybeTrusted) || maybeTrusted === '') {
         return maybeTrusted;
       }
       var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);
+      // If maybeTrusted is a trusted class instance or subclass instance, then unwrap and return
+      // as-is.
       if (constructor && maybeTrusted instanceof constructor) {
         return maybeTrusted.$$unwrapTrustedValue();
       }
-      // If we get here, then we may only take one of two actions.
-      // 1. sanitize the value for the requested type, or
-      // 2. throw an exception.
-      if (type === SCE_CONTEXTS.RESOURCE_URL) {
+
+      // If maybeTrusted is a trusted class instance but not of the correct trusted type
+      // then unwrap it and allow it to pass through to the rest of the checks
+      if (isFunction(maybeTrusted.$$unwrapTrustedValue)) {
+        maybeTrusted = maybeTrusted.$$unwrapTrustedValue();
+      }
+
+      // If we get here, then we will either sanitize the value or throw an exception.
+      if (type === SCE_CONTEXTS.MEDIA_URL || type === SCE_CONTEXTS.URL) {
+        // we attempt to sanitize non-resource URLs
+        return $$sanitizeUri(maybeTrusted.toString(), type === SCE_CONTEXTS.MEDIA_URL);
+      } else if (type === SCE_CONTEXTS.RESOURCE_URL) {
         if (isResourceUrlAllowedByPolicy(maybeTrusted)) {
           return maybeTrusted;
         } else {
@@ -18872,8 +20422,10 @@ function $SceDelegateProvider() {
               maybeTrusted.toString());
         }
       } else if (type === SCE_CONTEXTS.HTML) {
+        // htmlSanitizer throws its own error when no sanitizer is available.
         return htmlSanitizer(maybeTrusted);
       }
+      // Default error when the $sce service has no way to make the input safe.
       throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
     }
 
@@ -18907,23 +20459,29 @@ function $SceDelegateProvider() {
  *
  * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.
  *
- * # Strict Contextual Escaping
+ * ## Strict Contextual Escaping
  *
- * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain
- * contexts to result in a value that is marked as safe to use for that context.  One example of
- * such a context is binding arbitrary html controlled by the user via `ng-bind-html`.  We refer
- * to these contexts as privileged or SCE contexts.
+ * Strict Contextual Escaping (SCE) is a mode in which AngularJS constrains bindings to only render
+ * trusted values. Its goal is to assist in writing code in a way that (a) is secure by default, and
+ * (b) makes auditing for security vulnerabilities such as XSS, clickjacking, etc. a lot easier.
  *
- * As of version 1.2, Angular ships with SCE enabled by default.
+ * ### Overview
  *
- * Note:  When enabled (the default), IE<11 in quirks mode is not supported.  In this mode, IE<11 allow
- * one to execute arbitrary javascript by the use of the expression() syntax.  Refer
- * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them.
- * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`
- * to the top of your HTML document.
+ * To systematically block XSS security bugs, AngularJS treats all values as untrusted by default in
+ * HTML or sensitive URL bindings. When binding untrusted values, AngularJS will automatically
+ * run security checks on them (sanitizations, whitelists, depending on context), or throw when it
+ * cannot guarantee the security of the result. That behavior depends strongly on contexts: HTML
+ * can be sanitized, but template URLs cannot, for instance.
  *
- * SCE assists in writing code in a way that (a) is secure by default and (b) makes auditing for
- * security vulnerabilities such as XSS, clickjacking, etc. a lot easier.
+ * To illustrate this, consider the `ng-bind-html` directive. It renders its value directly as HTML:
+ * we call that the *context*. When given an untrusted input, AngularJS will attempt to sanitize it
+ * before rendering if a sanitizer is available, and throw otherwise. To bypass sanitization and
+ * render the input as-is, you will need to mark it as trusted for that context before attempting
+ * to bind it.
+ *
+ * As of version 1.2, AngularJS ships with SCE enabled by default.
+ *
+ * ### In practice
  *
  * Here's an example of a binding in a privileged context:
  *
@@ -18933,10 +20491,10 @@ function $SceDelegateProvider() {
  * ```
  *
  * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user.  With SCE
- * disabled, this application allows the user to render arbitrary HTML into the DIV.
- * In a more realistic example, one may be rendering user comments, blog articles, etc. via
- * bindings.  (HTML is just one example of a context where rendering user controlled input creates
- * security vulnerabilities.)
+ * disabled, this application allows the user to render arbitrary HTML into the DIV, which would
+ * be an XSS security bug. In a more realistic example, one may be rendering user comments, blog
+ * articles, etc. via bindings. (HTML is just one example of a context where rendering user
+ * controlled input creates security vulnerabilities.)
  *
  * For the case of HTML, you might use a library, either on the client side, or on the server side,
  * to sanitize unsafe HTML before binding to the value and rendering it in the document.
@@ -18946,25 +20504,29 @@ function $SceDelegateProvider() {
  * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some
  * properties/fields and forgot to update the binding to the sanitized value?
  *
- * To be secure by default, you want to ensure that any such bindings are disallowed unless you can
- * determine that something explicitly says it's safe to use a value for binding in that
- * context.  You can then audit your code (a simple grep would do) to ensure that this is only done
- * for those values that you can easily tell are safe - because they were received from your server,
- * sanitized by your library, etc.  You can organize your codebase to help with this - perhaps
- * allowing only the files in a specific directory to do this.  Ensuring that the internal API
- * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.
+ * To be secure by default, AngularJS makes sure bindings go through that sanitization, or
+ * any similar validation process, unless there's a good reason to trust the given value in this
+ * context.  That trust is formalized with a function call. This means that as a developer, you
+ * can assume all untrusted bindings are safe. Then, to audit your code for binding security issues,
+ * you just need to ensure the values you mark as trusted indeed are safe - because they were
+ * received from your server, sanitized by your library, etc. You can organize your codebase to
+ * help with this - perhaps allowing only the files in a specific directory to do this.
+ * Ensuring that the internal API exposed by that code doesn't markup arbitrary values as safe then
+ * becomes a more manageable task.
  *
  * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}
  * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to
- * obtain values that will be accepted by SCE / privileged contexts.
+ * build the trusted versions of your values.
  *
- *
- * ## How does it work?
+ * ### How does it work?
  *
  * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted
- * $sce.getTrusted(context, value)} rather than to the value directly.  Directives use {@link
- * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the
- * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals.
+ * $sce.getTrusted(context, value)} rather than to the value directly.  Think of this function as
+ * a way to enforce the required security context in your data sink. Directives use {@link
+ * ng.$sce#parseAs $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs
+ * the {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals. Also,
+ * when binding without directives, AngularJS will understand the context of your bindings
+ * automatically.
  *
  * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link
  * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}.  Here's the actual code (slightly
@@ -18980,12 +20542,12 @@ function $SceDelegateProvider() {
  * }];
  * ```
  *
- * ## Impact on loading templates
+ * ### Impact on loading templates
  *
  * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as
  * `templateUrl`'s specified by {@link guide/directive directives}.
  *
- * By default, Angular only loads templates from the same domain and protocol as the application
+ * By default, AngularJS only loads templates from the same domain and protocol as the application
  * document.  This is done by calling {@link ng.$sce#getTrustedResourceUrl
  * $sce.getTrustedResourceUrl} on the template URL.  To load templates from other domains and/or
  * protocols, you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist
@@ -19000,16 +20562,18 @@ function $SceDelegateProvider() {
  * won't work on all browsers.  Also, loading templates from `file://` URL does not work on some
  * browsers.
  *
- * ## This feels like too much overhead
+ * ### This feels like too much overhead
  *
  * It's important to remember that SCE only applies to interpolation expressions.
  *
  * If your expressions are constant literals, they're automatically trusted and you don't need to
- * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g.
- * `<div ng-bind-html="'<b>implicitly trusted</b>'"></div>`) just works.
- *
- * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them
- * through {@link ng.$sce#getTrusted $sce.getTrusted}.  SCE doesn't play a role here.
+ * call `$sce.trustAs` on them (e.g.
+ * `<div ng-bind-html="'<b>implicitly trusted</b>'"></div>`) just works (remember to include the
+ * `ngSanitize` module). The `$sceDelegate` will also use the `$sanitize` service if it is available
+ * when binding untrusted values to `$sce.HTML` context.
+ * AngularJS provides an implementation in `angular-sanitize.js`, and if you
+ * wish to use it, you will also need to depend on the {@link ngSanitize `ngSanitize`} module in
+ * your application.
  *
  * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load
  * templates in `ng-include` from your application's domain without having to even know about SCE.
@@ -19023,17 +20587,33 @@ function $SceDelegateProvider() {
  * security onto an application later.
  *
  * <a name="contexts"></a>
- * ## What trusted context types are supported?
+ * ### What trusted context types are supported?
  *
  * | Context             | Notes          |
  * |---------------------|----------------|
  * | `$sce.HTML`         | For HTML that's safe to source into the application.  The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |
  * | `$sce.CSS`          | For CSS that's safe to source into the application.  Currently unused.  Feel free to use it in your own directives. |
- * | `$sce.URL`          | For URLs that are safe to follow as links.  Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |
- * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application.  Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG`, `VIDEO`, `AUDIO`, `SOURCE`, and `TRACK` (e.g. `IFRAME`, `OBJECT`, etc.)  <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |
+ * | `$sce.MEDIA_URL`    | For URLs that are safe to render as media. Is automatically converted from string by sanitizing when needed. |
+ * | `$sce.URL`          | For URLs that are safe to follow as links. Is automatically converted from string by sanitizing when needed. Note that `$sce.URL` makes a stronger statement about the URL than `$sce.MEDIA_URL` does and therefore contexts requiring values trusted for `$sce.URL` can be used anywhere that values trusted for `$sce.MEDIA_URL` are required.|
+ * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application.  Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.)  <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` or `$sce.MEDIA_URL` do and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` or `$sce.MEDIA_URL` are required. <br><br> The {@link $sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider#resourceUrlWhitelist()} and {@link $sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider#resourceUrlBlacklist()} can be used to restrict trusted origins for `RESOURCE_URL` |
  * | `$sce.JS`           | For JavaScript that is safe to execute in your application's context.  Currently unused.  Feel free to use it in your own directives. |
  *
- * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name="resourceUrlPatternItem"></a>
+ *
+ * <div class="alert alert-warning">
+ * Be aware that, before AngularJS 1.7.0, `a[href]` and `img[src]` used to sanitize their
+ * interpolated values directly rather than rely upon {@link ng.$sce#getTrusted `$sce.getTrusted`}.
+ *
+ * **As of 1.7.0, this is no longer the case.**
+ *
+ * Now such interpolations are marked as requiring `$sce.URL` (for `a[href]`) or `$sce.MEDIA_URL`
+ * (for `img[src]`), so that the sanitization happens (via `$sce.getTrusted...`) when the `$interpolate`
+ * service evaluates the expressions.
+ * </div>
+ *
+ * There are no CSS or JS context bindings in AngularJS currently, so their corresponding `$sce.trustAs`
+ * functions aren't useful yet. This might evolve.
+ *
+ * ### Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name="resourceUrlPatternItem"></a>
  *
  *  Each element in these arrays must be one of the following:
  *
@@ -19080,7 +20660,7 @@ function $SceDelegateProvider() {
  *
  * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.
  *
- * ## Show me an example using SCE.
+ * ### Show me an example using SCE.
  *
  * <example module="mySceApp" deps="angular-sanitize.js" name="sce-service">
  * <file name="index.html">
@@ -19105,8 +20685,8 @@ function $SceDelegateProvider() {
  *     .controller('AppController', ['$http', '$templateCache', '$sce',
  *       function AppController($http, $templateCache, $sce) {
  *         var self = this;
- *         $http.get('test_data.json', {cache: $templateCache}).success(function(userComments) {
- *           self.userComments = userComments;
+ *         $http.get('test_data.json', {cache: $templateCache}).then(function(response) {
+ *           self.userComments = response.data;
  *         });
  *         self.explicitlyTrustedHtml = $sce.trustAsHtml(
  *             '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
@@ -19150,14 +20730,15 @@ function $SceDelegateProvider() {
  * for little coding overhead.  It will be much harder to take an SCE disabled application and
  * either secure it on your own or enable SCE at a later stage.  It might make sense to disable SCE
  * for cases where you have a lot of existing code that was written before SCE was introduced and
- * you're migrating them a module at a time.
+ * you're migrating them a module at a time. Also do note that this is an app-wide setting, so if
+ * you are writing a library, you will cause security bugs applications using it.
  *
  * That said, here's how you can completely disable SCE:
  *
  * ```
  * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
  *   // Completely disable SCE.  For demonstration purposes only!
- *   // Do not use in new projects.
+ *   // Do not use in new projects or libraries.
  *   $sceProvider.enabled(false);
  * });
  * ```
@@ -19172,8 +20753,8 @@ function $SceProvider() {
    * @name $sceProvider#enabled
    * @kind function
    *
-   * @param {boolean=} value If provided, then enables/disables SCE.
-   * @return {boolean} true if SCE is enabled, false otherwise.
+   * @param {boolean=} value If provided, then enables/disables SCE application-wide.
+   * @return {boolean} True if SCE is enabled, false otherwise.
    *
    * @description
    * Enables/disables SCE and returns the current value.
@@ -19204,7 +20785,7 @@ function $SceProvider() {
    *     such a value.
    *
    * - getTrusted(contextEnum, value)
-   *     This function should return the a value that is safe to use in the context specified by
+   *     This function should return the value that is safe to use in the context specified by
    *     contextEnum or throw and exception otherwise.
    *
    * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be
@@ -19227,13 +20808,14 @@ function $SceProvider() {
    *     getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)
    *     will also succeed.
    *
-   * Inheritance happens to capture this in a natural way.  In some future, we
-   * may not use inheritance anymore.  That is OK because no code outside of
-   * sce.js and sceSpecs.js would need to be aware of this detail.
+   * Inheritance happens to capture this in a natural way. In some future, we may not use
+   * inheritance anymore. That is OK because no code outside of sce.js and sceSpecs.js would need to
+   * be aware of this detail.
    */
 
   this.$get = ['$parse', '$sceDelegate', function(
                 $parse,   $sceDelegate) {
+    // Support: IE 9-11 only
     // Prereq: Ensure that we're not running in IE<11 quirks mode.  In that mode, IE < 11 allow
     // the "expression(javascript expression)" syntax which is insecure.
     if (enabled && msie < 8) {
@@ -19250,8 +20832,8 @@ function $SceProvider() {
      * @name $sce#isEnabled
      * @kind function
      *
-     * @return {Boolean} true if SCE is enabled, false otherwise.  If you want to set the value, you
-     * have to do it at module config time on {@link ng.$sceProvider $sceProvider}.
+     * @return {Boolean} True if SCE is enabled, false otherwise.  If you want to set the value, you
+     *     have to do it at module config time on {@link ng.$sceProvider $sceProvider}.
      *
      * @description
      * Returns a boolean indicating if SCE is enabled.
@@ -19273,19 +20855,19 @@ function $SceProvider() {
      * @name $sce#parseAs
      *
      * @description
-     * Converts Angular {@link guide/expression expression} into a function.  This is like {@link
+     * Converts AngularJS {@link guide/expression expression} into a function.  This is like {@link
      * ng.$parse $parse} and is identical when the expression is a literal constant.  Otherwise, it
      * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,
      * *result*)}
      *
-     * @param {string} type The kind of SCE context in which this result will be used.
+     * @param {string} type The SCE context in which this result will be used.
      * @param {string} expression String expression to compile.
-     * @returns {function(context, locals)} a function which represents the compiled expression:
+     * @return {function(context, locals)} A function which represents the compiled expression:
      *
-     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
-     *      are evaluated against (typically a scope object).
-     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
-     *      `context`.
+     *    * `context` – `{object}` – an object against which any expressions embedded in the
+     *      strings are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values
+     *      in `context`.
      */
     sce.parseAs = function sceParseAs(type, expr) {
       var parsed = $parse(expr);
@@ -19303,18 +20885,18 @@ function $SceProvider() {
      * @name $sce#trustAs
      *
      * @description
-     * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.  As such,
-     * returns an object that is trusted by angular for use in specified strict contextual
-     * escaping contexts (such as ng-bind-html, ng-include, any src attribute
-     * interpolation, any dom event binding attribute interpolation such as for onclick,  etc.)
-     * that uses the provided value.  See * {@link ng.$sce $sce} for enabling strict contextual
-     * escaping.
+     * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such, returns a
+     * wrapped object that represents your value, and the trust you have in its safety for the given
+     * context. AngularJS can then use that value as-is in bindings of the specified secure context.
+     * This is used in bindings for `ng-bind-html`, `ng-include`, and most `src` attribute
+     * interpolations. See {@link ng.$sce $sce} for strict contextual escaping.
      *
-     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,
-     *   resourceUrl, html, js and css.
-     * @param {*} value The value that that should be considered trusted/safe.
-     * @returns {*} A value that can be used to stand in for the provided `value` in places
-     * where Angular expects a $sce.trustAs() return value.
+     * @param {string} type The context in which this value is safe for use, e.g. `$sce.URL`,
+     *     `$sce.RESOURCE_URL`, `$sce.HTML`, `$sce.JS` or `$sce.CSS`.
+     *
+     * @param {*} value The value that that should be considered trusted.
+     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`
+     *     in the context you specified.
      */
 
     /**
@@ -19325,11 +20907,23 @@ function $SceProvider() {
      * Shorthand method.  `$sce.trustAsHtml(value)` →
      *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}
      *
-     * @param {*} value The value to trustAs.
-     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml
-     *     $sce.getTrustedHtml(value)} to obtain the original value.  (privileged directives
-     *     only accept expressions that are either literal constants or are the
-     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)
+     * @param {*} value The value to mark as trusted for `$sce.HTML` context.
+     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`
+     *     in `$sce.HTML` context (like `ng-bind-html`).
+     */
+
+    /**
+     * @ngdoc method
+     * @name $sce#trustAsCss
+     *
+     * @description
+     * Shorthand method.  `$sce.trustAsCss(value)` →
+     *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.CSS, value)`}
+     *
+     * @param {*} value The value to mark as trusted for `$sce.CSS` context.
+     * @return {*} A wrapped version of value that can be used as a trusted variant
+     *     of your `value` in `$sce.CSS` context. This context is currently unused, so there are
+     *     almost no reasons to use this function so far.
      */
 
     /**
@@ -19340,11 +20934,10 @@ function $SceProvider() {
      * Shorthand method.  `$sce.trustAsUrl(value)` →
      *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}
      *
-     * @param {*} value The value to trustAs.
-     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl
-     *     $sce.getTrustedUrl(value)} to obtain the original value.  (privileged directives
-     *     only accept expressions that are either literal constants or are the
-     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)
+     * @param {*} value The value to mark as trusted for `$sce.URL` context.
+     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`
+     *     in `$sce.URL` context. That context is currently unused, so there are almost no reasons
+     *     to use this function so far.
      */
 
     /**
@@ -19355,11 +20948,10 @@ function $SceProvider() {
      * Shorthand method.  `$sce.trustAsResourceUrl(value)` →
      *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}
      *
-     * @param {*} value The value to trustAs.
-     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl
-     *     $sce.getTrustedResourceUrl(value)} to obtain the original value.  (privileged directives
-     *     only accept expressions that are either literal constants or are the return
-     *     value of {@link ng.$sce#trustAs $sce.trustAs}.)
+     * @param {*} value The value to mark as trusted for `$sce.RESOURCE_URL` context.
+     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`
+     *     in `$sce.RESOURCE_URL` context (template URLs in `ng-include`, most `src` attribute
+     *     bindings, ...)
      */
 
     /**
@@ -19370,11 +20962,10 @@ function $SceProvider() {
      * Shorthand method.  `$sce.trustAsJs(value)` →
      *     {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}
      *
-     * @param {*} value The value to trustAs.
-     * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs
-     *     $sce.getTrustedJs(value)} to obtain the original value.  (privileged directives
-     *     only accept expressions that are either literal constants or are the
-     *     return value of {@link ng.$sce#trustAs $sce.trustAs}.)
+     * @param {*} value The value to mark as trusted for `$sce.JS` context.
+     * @return {*} A wrapped version of value that can be used as a trusted variant of your `value`
+     *     in `$sce.JS` context. That context is currently unused, so there are almost no reasons to
+     *     use this function so far.
      */
 
     /**
@@ -19383,16 +20974,17 @@ function $SceProvider() {
      *
      * @description
      * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}.  As such,
-     * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the
-     * originally supplied value if the queried context type is a supertype of the created type.
-     * If this condition isn't satisfied, throws an exception.
-     *
-     * @param {string} type The kind of context in which this value is to be used.
-     * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`}
-     *                         call.
-     * @returns {*} The value the was originally provided to
-     *              {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context.
-     *              Otherwise, throws an exception.
+     * takes any input, and either returns a value that's safe to use in the specified context,
+     * or throws an exception. This function is aware of trusted values created by the `trustAs`
+     * function and its shorthands, and when contexts are appropriate, returns the unwrapped value
+     * as-is. Finally, this function can also throw when there is no way to turn `maybeTrusted` in a
+     * safe value (e.g., no sanitization is available or possible.)
+     *
+     * @param {string} type The context in which this value is to be used.
+     * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs
+     *     `$sce.trustAs`} call, or anything else (which will not be considered trusted.)
+     * @return {*} A version of the value that's safe to use in the given context, or throws an
+     *     exception if this is impossible.
      */
 
     /**
@@ -19404,7 +20996,7 @@ function $SceProvider() {
      *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}
      *
      * @param {*} value The value to pass to `$sce.getTrusted`.
-     * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)`
+     * @return {*} The return value of `$sce.getTrusted($sce.HTML, value)`
      */
 
     /**
@@ -19416,7 +21008,7 @@ function $SceProvider() {
      *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}
      *
      * @param {*} value The value to pass to `$sce.getTrusted`.
-     * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)`
+     * @return {*} The return value of `$sce.getTrusted($sce.CSS, value)`
      */
 
     /**
@@ -19428,7 +21020,7 @@ function $SceProvider() {
      *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}
      *
      * @param {*} value The value to pass to `$sce.getTrusted`.
-     * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)`
+     * @return {*} The return value of `$sce.getTrusted($sce.URL, value)`
      */
 
     /**
@@ -19440,7 +21032,7 @@ function $SceProvider() {
      *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}
      *
      * @param {*} value The value to pass to `$sceDelegate.getTrusted`.
-     * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`
+     * @return {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`
      */
 
     /**
@@ -19452,7 +21044,7 @@ function $SceProvider() {
      *     {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}
      *
      * @param {*} value The value to pass to `$sce.getTrusted`.
-     * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)`
+     * @return {*} The return value of `$sce.getTrusted($sce.JS, value)`
      */
 
     /**
@@ -19464,12 +21056,12 @@ function $SceProvider() {
      *     {@link ng.$sce#parseAs `$sce.parseAs($sce.HTML, value)`}
      *
      * @param {string} expression String expression to compile.
-     * @returns {function(context, locals)} a function which represents the compiled expression:
+     * @return {function(context, locals)} A function which represents the compiled expression:
      *
-     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
-     *      are evaluated against (typically a scope object).
-     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
-     *      `context`.
+     *    * `context` – `{object}` – an object against which any expressions embedded in the
+     *      strings are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values
+     *      in `context`.
      */
 
     /**
@@ -19481,12 +21073,12 @@ function $SceProvider() {
      *     {@link ng.$sce#parseAs `$sce.parseAs($sce.CSS, value)`}
      *
      * @param {string} expression String expression to compile.
-     * @returns {function(context, locals)} a function which represents the compiled expression:
+     * @return {function(context, locals)} A function which represents the compiled expression:
      *
-     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
-     *      are evaluated against (typically a scope object).
-     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
-     *      `context`.
+     *    * `context` – `{object}` – an object against which any expressions embedded in the
+     *      strings are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values
+     *      in `context`.
      */
 
     /**
@@ -19498,12 +21090,12 @@ function $SceProvider() {
      *     {@link ng.$sce#parseAs `$sce.parseAs($sce.URL, value)`}
      *
      * @param {string} expression String expression to compile.
-     * @returns {function(context, locals)} a function which represents the compiled expression:
+     * @return {function(context, locals)} A function which represents the compiled expression:
      *
-     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
-     *      are evaluated against (typically a scope object).
-     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
-     *      `context`.
+     *    * `context` – `{object}` – an object against which any expressions embedded in the
+     *      strings are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values
+     *      in `context`.
      */
 
     /**
@@ -19515,12 +21107,12 @@ function $SceProvider() {
      *     {@link ng.$sce#parseAs `$sce.parseAs($sce.RESOURCE_URL, value)`}
      *
      * @param {string} expression String expression to compile.
-     * @returns {function(context, locals)} a function which represents the compiled expression:
+     * @return {function(context, locals)} A function which represents the compiled expression:
      *
-     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
-     *      are evaluated against (typically a scope object).
-     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
-     *      `context`.
+     *    * `context` – `{object}` – an object against which any expressions embedded in the
+     *      strings are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values
+     *      in `context`.
      */
 
     /**
@@ -19532,12 +21124,12 @@ function $SceProvider() {
      *     {@link ng.$sce#parseAs `$sce.parseAs($sce.JS, value)`}
      *
      * @param {string} expression String expression to compile.
-     * @returns {function(context, locals)} a function which represents the compiled expression:
+     * @return {function(context, locals)} A function which represents the compiled expression:
      *
-     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
-     *      are evaluated against (typically a scope object).
-     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
-     *      `context`.
+     *    * `context` – `{object}` – an object against which any expressions embedded in the
+     *      strings are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values
+     *      in `context`.
      */
 
     // Shorthand delegations.
@@ -19547,13 +21139,13 @@ function $SceProvider() {
 
     forEach(SCE_CONTEXTS, function(enumValue, name) {
       var lName = lowercase(name);
-      sce[camelCase('parse_as_' + lName)] = function(expr) {
+      sce[snakeToCamel('parse_as_' + lName)] = function(expr) {
         return parse(enumValue, expr);
       };
-      sce[camelCase('get_trusted_' + lName)] = function(value) {
+      sce[snakeToCamel('get_trusted_' + lName)] = function(value) {
         return getTrusted(enumValue, value);
       };
-      sce[camelCase('trust_as_' + lName)] = function(value) {
+      sce[snakeToCamel('trust_as_' + lName)] = function(value) {
         return trustAs(enumValue, value);
       };
     });
@@ -19587,7 +21179,10 @@ function $SnifferProvider() {
         // (see https://developer.chrome.com/apps/api_index). If sandboxed, they can be detected by
         // the presence of an extension runtime ID and the absence of other Chrome runtime APIs
         // (see https://developer.chrome.com/apps/manifest/sandbox).
+        // (NW.js apps have access to Chrome APIs, but do support `history`.)
+        isNw = $window.nw && $window.nw.process,
         isChromePackagedApp =
+            !isNw &&
             $window.chrome &&
             ($window.chrome.app && $window.chrome.app.runtime ||
                 !$window.chrome.app && $window.chrome.runtime && $window.chrome.runtime.id),
@@ -19596,33 +21191,15 @@ function $SnifferProvider() {
           toInt((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),
         boxee = /Boxee/i.test(($window.navigator || {}).userAgent),
         document = $document[0] || {},
-        vendorPrefix,
-        vendorRegex = /^(Moz|webkit|ms)(?=[A-Z])/,
         bodyStyle = document.body && document.body.style,
         transitions = false,
-        animations = false,
-        match;
+        animations = false;
 
     if (bodyStyle) {
-      for (var prop in bodyStyle) {
-        if ((match = vendorRegex.exec(prop))) {
-          vendorPrefix = match[0];
-          vendorPrefix = vendorPrefix[0].toUpperCase() + vendorPrefix.substr(1);
-          break;
-        }
-      }
-
-      if (!vendorPrefix) {
-        vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit';
-      }
-
-      transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));
-      animations  = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));
-
-      if (android && (!transitions ||  !animations)) {
-        transitions = isString(bodyStyle.webkitTransition);
-        animations = isString(bodyStyle.webkitAnimation);
-      }
+      // Support: Android <5, Blackberry Browser 10, default Chrome in Android 4.4.x
+      // Mentioned browsers need a -webkit- prefix for transitions & animations.
+      transitions = !!('transition' in bodyStyle || 'webkitTransition' in bodyStyle);
+      animations = !!('animation' in bodyStyle || 'webkitAnimation' in bodyStyle);
     }
 
 
@@ -19637,12 +21214,13 @@ function $SnifferProvider() {
       // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined
       history: !!(hasHistoryPushState && !(android < 4) && !boxee),
       hasEvent: function(event) {
+        // Support: IE 9-11 only
         // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have
         // it. In particular the event is not fired when backspace or delete key are pressed or
         // when cut operation is performed.
         // IE10+ implements 'input' event but it erroneously fires under various situations,
         // e.g. when placeholder changes, or a form is focused.
-        if (event === 'input' && msie <= 11) return false;
+        if (event === 'input' && msie) return false;
 
         if (isUndefined(eventSupport[event])) {
           var divElm = document.createElement('div');
@@ -19652,7 +21230,6 @@ function $SnifferProvider() {
         return eventSupport[event];
       },
       csp: csp(),
-      vendorPrefix: vendorPrefix,
       transitions: transitions,
       animations: animations,
       android: android
@@ -19660,7 +21237,128 @@ function $SnifferProvider() {
   }];
 }
 
-var $templateRequestMinErr = minErr('$compile');
+/**
+ * ! This is a private undocumented service !
+ *
+ * @name $$taskTrackerFactory
+ * @description
+ * A function to create `TaskTracker` instances.
+ *
+ * A `TaskTracker` can keep track of pending tasks (grouped by type) and can notify interested
+ * parties when all pending tasks (or tasks of a specific type) have been completed.
+ *
+ * @param {$log} log - A logger instance (such as `$log`). Used to log error during callback
+ *     execution.
+ *
+ * @this
+ */
+function $$TaskTrackerFactoryProvider() {
+  this.$get = valueFn(function(log) { return new TaskTracker(log); });
+}
+
+function TaskTracker(log) {
+  var self = this;
+  var taskCounts = {};
+  var taskCallbacks = [];
+
+  var ALL_TASKS_TYPE = self.ALL_TASKS_TYPE = '$$all$$';
+  var DEFAULT_TASK_TYPE = self.DEFAULT_TASK_TYPE = '$$default$$';
+
+  /**
+   * Execute the specified function and decrement the appropriate `taskCounts` counter.
+   * If the counter reaches 0, all corresponding `taskCallbacks` are executed.
+   *
+   * @param {Function} fn - The function to execute.
+   * @param {string=} [taskType=DEFAULT_TASK_TYPE] - The type of task that is being completed.
+   */
+  self.completeTask = completeTask;
+
+  /**
+   * Increase the task count for the specified task type (or the default task type if non is
+   * specified).
+   *
+   * @param {string=} [taskType=DEFAULT_TASK_TYPE] - The type of task whose count will be increased.
+   */
+  self.incTaskCount = incTaskCount;
+
+  /**
+   * Execute the specified callback when all pending tasks have been completed.
+   *
+   * If there are no pending tasks, the callback is executed immediately. You can optionally limit
+   * the tasks that will be waited for to a specific type, by passing a `taskType`.
+   *
+   * @param {function} callback - The function to call when there are no pending tasks.
+   * @param {string=} [taskType=ALL_TASKS_TYPE] - The type of tasks that will be waited for.
+   */
+  self.notifyWhenNoPendingTasks = notifyWhenNoPendingTasks;
+
+  function completeTask(fn, taskType) {
+    taskType = taskType || DEFAULT_TASK_TYPE;
+
+    try {
+      fn();
+    } finally {
+      decTaskCount(taskType);
+
+      var countForType = taskCounts[taskType];
+      var countForAll = taskCounts[ALL_TASKS_TYPE];
+
+      // If at least one of the queues (`ALL_TASKS_TYPE` or `taskType`) is empty, run callbacks.
+      if (!countForAll || !countForType) {
+        var getNextCallback = !countForAll ? getLastCallback : getLastCallbackForType;
+        var nextCb;
+
+        while ((nextCb = getNextCallback(taskType))) {
+          try {
+            nextCb();
+          } catch (e) {
+            log.error(e);
+          }
+        }
+      }
+    }
+  }
+
+  function decTaskCount(taskType) {
+    taskType = taskType || DEFAULT_TASK_TYPE;
+    if (taskCounts[taskType]) {
+      taskCounts[taskType]--;
+      taskCounts[ALL_TASKS_TYPE]--;
+    }
+  }
+
+  function getLastCallback() {
+    var cbInfo = taskCallbacks.pop();
+    return cbInfo && cbInfo.cb;
+  }
+
+  function getLastCallbackForType(taskType) {
+    for (var i = taskCallbacks.length - 1; i >= 0; --i) {
+      var cbInfo = taskCallbacks[i];
+      if (cbInfo.type === taskType) {
+        taskCallbacks.splice(i, 1);
+        return cbInfo.cb;
+      }
+    }
+  }
+
+  function incTaskCount(taskType) {
+    taskType = taskType || DEFAULT_TASK_TYPE;
+    taskCounts[taskType] = (taskCounts[taskType] || 0) + 1;
+    taskCounts[ALL_TASKS_TYPE] = (taskCounts[ALL_TASKS_TYPE] || 0) + 1;
+  }
+
+  function notifyWhenNoPendingTasks(callback, taskType) {
+    taskType = taskType || ALL_TASKS_TYPE;
+    if (!taskCounts[taskType]) {
+      callback();
+    } else {
+      taskCallbacks.push({type: taskType, cb: callback});
+    }
+  }
+}
+
+var $templateRequestMinErr = minErr('$templateRequest');
 
 /**
  * @ngdoc provider
@@ -19713,6 +21411,12 @@ function $TemplateRequestProvider() {
    * If you want to pass custom options to the `$http` service, such as setting the Accept header you
    * can configure this via {@link $templateRequestProvider#httpOptions}.
    *
+   * `$templateRequest` is used internally by {@link $compile}, {@link ngRoute.$route}, and directives such
+   * as {@link ngInclude} to download and cache templates.
+   *
+   * 3rd party modules should use `$templateRequest` if their services or directives are loading
+   * templates.
+   *
    * @param {string|TrustedResourceUrl} tpl The HTTP request template URL
    * @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty
    *
@@ -19720,55 +21424,60 @@ function $TemplateRequestProvider() {
    *
    * @property {number} totalPendingRequests total amount of pending template requests being downloaded.
    */
-  this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) {
-
-    function handleRequestFn(tpl, ignoreRequestError) {
-      handleRequestFn.totalPendingRequests++;
+  this.$get = ['$exceptionHandler', '$templateCache', '$http', '$q', '$sce',
+    function($exceptionHandler, $templateCache, $http, $q, $sce) {
 
-      // We consider the template cache holds only trusted templates, so
-      // there's no need to go through whitelisting again for keys that already
-      // are included in there. This also makes Angular accept any script
-      // directive, no matter its name. However, we still need to unwrap trusted
-      // types.
-      if (!isString(tpl) || isUndefined($templateCache.get(tpl))) {
-        tpl = $sce.getTrustedResourceUrl(tpl);
-      }
+      function handleRequestFn(tpl, ignoreRequestError) {
+        handleRequestFn.totalPendingRequests++;
 
-      var transformResponse = $http.defaults && $http.defaults.transformResponse;
+        // We consider the template cache holds only trusted templates, so
+        // there's no need to go through whitelisting again for keys that already
+        // are included in there. This also makes AngularJS accept any script
+        // directive, no matter its name. However, we still need to unwrap trusted
+        // types.
+        if (!isString(tpl) || isUndefined($templateCache.get(tpl))) {
+          tpl = $sce.getTrustedResourceUrl(tpl);
+        }
 
-      if (isArray(transformResponse)) {
-        transformResponse = transformResponse.filter(function(transformer) {
-          return transformer !== defaultHttpResponseTransform;
-        });
-      } else if (transformResponse === defaultHttpResponseTransform) {
-        transformResponse = null;
-      }
+        var transformResponse = $http.defaults && $http.defaults.transformResponse;
 
-      return $http.get(tpl, extend({
-          cache: $templateCache,
-          transformResponse: transformResponse
-        }, httpOptions)
-        )['finally'](function() {
-          handleRequestFn.totalPendingRequests--;
-        })
-        .then(function(response) {
-          $templateCache.put(tpl, response.data);
-          return response.data;
-        }, handleError);
+        if (isArray(transformResponse)) {
+          transformResponse = transformResponse.filter(function(transformer) {
+            return transformer !== defaultHttpResponseTransform;
+          });
+        } else if (transformResponse === defaultHttpResponseTransform) {
+          transformResponse = null;
+        }
+
+        return $http.get(tpl, extend({
+            cache: $templateCache,
+            transformResponse: transformResponse
+          }, httpOptions))
+          .finally(function() {
+            handleRequestFn.totalPendingRequests--;
+          })
+          .then(function(response) {
+            return $templateCache.put(tpl, response.data);
+          }, handleError);
+
+        function handleError(resp) {
+          if (!ignoreRequestError) {
+            resp = $templateRequestMinErr('tpload',
+                'Failed to load template: {0} (HTTP status: {1} {2})',
+                tpl, resp.status, resp.statusText);
+
+            $exceptionHandler(resp);
+          }
 
-      function handleError(resp) {
-        if (!ignoreRequestError) {
-          throw $templateRequestMinErr('tpload', 'Failed to load template: {0} (HTTP status: {1} {2})',
-            tpl, resp.status, resp.statusText);
+          return $q.reject(resp);
         }
-        return $q.reject(resp);
       }
-    }
 
-    handleRequestFn.totalPendingRequests = 0;
+      handleRequestFn.totalPendingRequests = 0;
 
-    return handleRequestFn;
-  }];
+      return handleRequestFn;
+    }
+  ];
 }
 
 /** @this */
@@ -19875,7 +21584,15 @@ function $$TestabilityProvider() {
      * @name $$testability#whenStable
      *
      * @description
-     * Calls the callback when $timeout and $http requests are completed.
+     * Calls the callback when all pending tasks are completed.
+     *
+     * Types of tasks waited for include:
+     * - Pending timeouts (via {@link $timeout}).
+     * - Pending HTTP requests (via {@link $http}).
+     * - In-progress route transitions (via {@link $route}).
+     * - Pending tasks scheduled via {@link $rootScope#$applyAsync}.
+     * - Pending tasks scheduled via {@link $rootScope#$evalAsync}.
+     *   These include tasks scheduled via `$evalAsync()` indirectly (such as {@link $q} promises).
      *
      * @param {function} callback
      */
@@ -19887,6 +21604,8 @@ function $$TestabilityProvider() {
   }];
 }
 
+var $timeoutMinErr = minErr('$timeout');
+
 /** @this */
 function $TimeoutProvider() {
   this.$get = ['$rootScope', '$browser', '$q', '$$q', '$exceptionHandler',
@@ -19895,35 +21614,35 @@ function $TimeoutProvider() {
     var deferreds = {};
 
 
-     /**
-      * @ngdoc service
-      * @name $timeout
-      *
-      * @description
-      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch
-      * block and delegates any exceptions to
-      * {@link ng.$exceptionHandler $exceptionHandler} service.
-      *
-      * The return value of calling `$timeout` is a promise, which will be resolved when
-      * the delay has passed and the timeout function, if provided, is executed.
-      *
-      * To cancel a timeout request, call `$timeout.cancel(promise)`.
-      *
-      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to
-      * synchronously flush the queue of deferred functions.
-      *
-      * If you only want a promise that will be resolved after some specified delay
-      * then you can call `$timeout` without the `fn` function.
-      *
-      * @param {function()=} fn A function, whose execution should be delayed.
-      * @param {number=} [delay=0] Delay in milliseconds.
-      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
-      *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
-      * @param {...*=} Pass additional parameters to the executed function.
-      * @returns {Promise} Promise that will be resolved when the timeout is reached. The promise
-      *   will be resolved with the return value of the `fn` function.
-      *
-      */
+    /**
+     * @ngdoc service
+     * @name $timeout
+     *
+     * @description
+     * AngularJS's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch
+     * block and delegates any exceptions to
+     * {@link ng.$exceptionHandler $exceptionHandler} service.
+     *
+     * The return value of calling `$timeout` is a promise, which will be resolved when
+     * the delay has passed and the timeout function, if provided, is executed.
+     *
+     * To cancel a timeout request, call `$timeout.cancel(promise)`.
+     *
+     * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to
+     * synchronously flush the queue of deferred functions.
+     *
+     * If you only want a promise that will be resolved after some specified delay
+     * then you can call `$timeout` without the `fn` function.
+     *
+     * @param {function()=} fn A function, whose execution should be delayed.
+     * @param {number=} [delay=0] Delay in milliseconds.
+     * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
+     *   will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.
+     * @param {...*=} Pass additional parameters to the executed function.
+     * @returns {Promise} Promise that will be resolved when the timeout is reached. The promise
+     *   will be resolved with the return value of the `fn` function.
+     *
+     */
     function timeout(fn, delay, invokeApply) {
       if (!isFunction(fn)) {
         invokeApply = delay;
@@ -19948,7 +21667,7 @@ function $TimeoutProvider() {
         }
 
         if (!skipApply) $rootScope.$apply();
-      }, delay);
+      }, delay, '$timeout');
 
       promise.$$timeoutId = timeoutId;
       deferreds[timeoutId] = deferred;
@@ -19957,25 +21676,37 @@ function $TimeoutProvider() {
     }
 
 
-     /**
-      * @ngdoc method
-      * @name $timeout#cancel
-      *
-      * @description
-      * Cancels a task associated with the `promise`. As a result of this, the promise will be
-      * resolved with a rejection.
-      *
-      * @param {Promise=} promise Promise returned by the `$timeout` function.
-      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
-      *   canceled.
-      */
+    /**
+     * @ngdoc method
+     * @name $timeout#cancel
+     *
+     * @description
+     * Cancels a task associated with the `promise`. As a result of this, the promise will be
+     * resolved with a rejection.
+     *
+     * @param {Promise=} promise Promise returned by the `$timeout` function.
+     * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
+     *   canceled.
+     */
     timeout.cancel = function(promise) {
-      if (promise && promise.$$timeoutId in deferreds) {
-        deferreds[promise.$$timeoutId].reject('canceled');
-        delete deferreds[promise.$$timeoutId];
-        return $browser.defer.cancel(promise.$$timeoutId);
+      if (!promise) return false;
+
+      if (!promise.hasOwnProperty('$$timeoutId')) {
+        throw $timeoutMinErr('badprom',
+            '`$timeout.cancel()` called with a promise that was not generated by `$timeout()`.');
       }
-      return false;
+
+      if (!deferreds.hasOwnProperty(promise.$$timeoutId)) return false;
+
+      var id = promise.$$timeoutId;
+      var deferred = deferreds[id];
+
+      // Timeout cancels should not report an unhandled promise.
+      markQExceptionHandled(deferred.promise);
+      deferred.reject('canceled');
+      delete deferreds[id];
+
+      return $browser.defer.cancel(id);
     };
 
     return timeout;
@@ -19991,7 +21722,14 @@ function $TimeoutProvider() {
 // service.
 var urlParsingNode = window.document.createElement('a');
 var originUrl = urlResolve(window.location.href);
+var baseUrlParsingNode;
+
+urlParsingNode.href = 'http://[::1]';
 
+// Support: IE 9-11 only, Edge 16-17 only (fixed in 18 Preview)
+// IE/Edge don't wrap IPv6 addresses' hostnames in square brackets
+// when parsed out of an anchor element.
+var ipv6InBrackets = urlParsingNode.hostname === '[::1]';
 
 /**
  *
@@ -20002,7 +21740,7 @@ var originUrl = urlResolve(window.location.href);
  * URL will be resolved into an absolute URL in the context of the application document.
  * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related
  * properties are all populated to reflect the normalized URL.  This approach has wide
- * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc.  See
+ * compatibility - Safari 1+, Mozilla 1+ etc.  See
  * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
  *
  * Implementation Notes for IE
@@ -20022,25 +21760,29 @@ var originUrl = urlResolve(window.location.href);
  *   http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
  *
  * @kind function
- * @param {string} url The URL to be parsed.
+ * @param {string|object} url The URL to be parsed. If `url` is not a string, it will be returned
+ *     unchanged.
  * @description Normalizes and parses a URL.
  * @returns {object} Returns the normalized URL as a dictionary.
  *
- *   | member name   | Description    |
- *   |---------------|----------------|
+ *   | member name   | Description                                                            |
+ *   |---------------|------------------------------------------------------------------------|
  *   | href          | A normalized version of the provided URL if it was not an absolute URL |
- *   | protocol      | The protocol including the trailing colon                              |
+ *   | protocol      | The protocol without the trailing colon                                |
  *   | host          | The host and port (if the port is non-default) of the normalizedUrl    |
  *   | search        | The search params, minus the question mark                             |
- *   | hash          | The hash string, minus the hash symbol
- *   | hostname      | The hostname
- *   | port          | The port, without ":"
- *   | pathname      | The pathname, beginning with "/"
+ *   | hash          | The hash string, minus the hash symbol                                 |
+ *   | hostname      | The hostname                                                           |
+ *   | port          | The port, without ":"                                                  |
+ *   | pathname      | The pathname, beginning with "/"                                       |
  *
  */
 function urlResolve(url) {
+  if (!isString(url)) return url;
+
   var href = url;
 
+  // Support: IE 9-11 only
   if (msie) {
     // Normalize before parse.  Refer Implementation Notes on why this is
     // done in two steps on IE.
@@ -20050,14 +21792,19 @@ function urlResolve(url) {
 
   urlParsingNode.setAttribute('href', href);
 
-  // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+  var hostname = urlParsingNode.hostname;
+
+  if (!ipv6InBrackets && hostname.indexOf(':') > -1) {
+    hostname = '[' + hostname + ']';
+  }
+
   return {
     href: urlParsingNode.href,
     protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
     host: urlParsingNode.host,
     search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
     hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
-    hostname: urlParsingNode.hostname,
+    hostname: hostname,
     port: urlParsingNode.port,
     pathname: (urlParsingNode.pathname.charAt(0) === '/')
       ? urlParsingNode.pathname
@@ -20066,16 +21813,96 @@ function urlResolve(url) {
 }
 
 /**
- * Parse a request URL and determine whether this is a same-origin request as the application document.
+ * Parse a request URL and determine whether this is a same-origin request as the application
+ * document.
  *
  * @param {string|object} requestUrl The url of the request as a string that will be resolved
  * or a parsed URL object.
  * @returns {boolean} Whether the request is for the same origin as the application document.
  */
 function urlIsSameOrigin(requestUrl) {
-  var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;
-  return (parsed.protocol === originUrl.protocol &&
-          parsed.host === originUrl.host);
+  return urlsAreSameOrigin(requestUrl, originUrl);
+}
+
+/**
+ * Parse a request URL and determine whether it is same-origin as the current document base URL.
+ *
+ * Note: The base URL is usually the same as the document location (`location.href`) but can
+ * be overriden by using the `<base>` tag.
+ *
+ * @param {string|object} requestUrl The url of the request as a string that will be resolved
+ * or a parsed URL object.
+ * @returns {boolean} Whether the URL is same-origin as the document base URL.
+ */
+function urlIsSameOriginAsBaseUrl(requestUrl) {
+  return urlsAreSameOrigin(requestUrl, getBaseUrl());
+}
+
+/**
+ * Create a function that can check a URL's origin against a list of allowed/whitelisted origins.
+ * The current location's origin is implicitly trusted.
+ *
+ * @param {string[]} whitelistedOriginUrls - A list of URLs (strings), whose origins are trusted.
+ *
+ * @returns {Function} - A function that receives a URL (string or parsed URL object) and returns
+ *     whether it is of an allowed origin.
+ */
+function urlIsAllowedOriginFactory(whitelistedOriginUrls) {
+  var parsedAllowedOriginUrls = [originUrl].concat(whitelistedOriginUrls.map(urlResolve));
+
+  /**
+   * Check whether the specified URL (string or parsed URL object) has an origin that is allowed
+   * based on a list of whitelisted-origin URLs. The current location's origin is implicitly
+   * trusted.
+   *
+   * @param {string|Object} requestUrl - The URL to be checked (provided as a string that will be
+   *     resolved or a parsed URL object).
+   *
+   * @returns {boolean} - Whether the specified URL is of an allowed origin.
+   */
+  return function urlIsAllowedOrigin(requestUrl) {
+    var parsedUrl = urlResolve(requestUrl);
+    return parsedAllowedOriginUrls.some(urlsAreSameOrigin.bind(null, parsedUrl));
+  };
+}
+
+/**
+ * Determine if two URLs share the same origin.
+ *
+ * @param {string|Object} url1 - First URL to compare as a string or a normalized URL in the form of
+ *     a dictionary object returned by `urlResolve()`.
+ * @param {string|object} url2 - Second URL to compare as a string or a normalized URL in the form
+ *     of a dictionary object returned by `urlResolve()`.
+ *
+ * @returns {boolean} - True if both URLs have the same origin, and false otherwise.
+ */
+function urlsAreSameOrigin(url1, url2) {
+  url1 = urlResolve(url1);
+  url2 = urlResolve(url2);
+
+  return (url1.protocol === url2.protocol &&
+          url1.host === url2.host);
+}
+
+/**
+ * Returns the current document base URL.
+ * @returns {string}
+ */
+function getBaseUrl() {
+  if (window.document.baseURI) {
+    return window.document.baseURI;
+  }
+
+  // `document.baseURI` is available everywhere except IE
+  if (!baseUrlParsingNode) {
+    baseUrlParsingNode = window.document.createElement('a');
+    baseUrlParsingNode.href = '.';
+
+    // Work-around for IE bug described in Implementation Notes. The fix in `urlResolve()` is not
+    // suitable here because we need to track changes to the base URL.
+    baseUrlParsingNode = baseUrlParsingNode.cloneNode(false);
+  }
+  return baseUrlParsingNode.href;
 }
 
 /**
@@ -20086,7 +21913,7 @@ function urlIsSameOrigin(requestUrl) {
  * @description
  * A reference to the browser's `window` object. While `window`
  * is globally available in JavaScript, it causes testability problems, because
- * it is a global variable. In angular we always refer to it through the
+ * it is a global variable. In AngularJS we always refer to it through the
  * `$window` service, so it may be overridden, removed or mocked for testing.
  *
  * Expressions, like the one defined for the `ngClick` directive in the example
@@ -20209,7 +22036,7 @@ function $$CookieReaderProvider() {
  * annotated with dependencies and is responsible for creating a filter function.
  *
  * <div class="alert alert-warning">
- * **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.
+ * **Note:** Filter names must be valid AngularJS {@link expression} identifiers, such as `uppercase` or `orderBy`.
  * Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace
  * your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores
  * (`myapp_subsection_filterx`).
@@ -20252,8 +22079,8 @@ function $$CookieReaderProvider() {
  * ```
  *
  *
- * For more information about how angular filters work, and how to create your own filters, see
- * {@link guide/filter Filters} in the Angular Developer Guide.
+ * For more information about how AngularJS filters work, and how to create your own filters, see
+ * {@link guide/filter Filters} in the AngularJS Developer Guide.
  */
 
 /**
@@ -20263,7 +22090,7 @@ function $$CookieReaderProvider() {
  * @description
  * Filters are used for formatting data displayed to the user.
  *
- * They can be used in view templates, controllers or services.Angular comes
+ * They can be used in view templates, controllers or services. AngularJS comes
  * with a collection of [built-in filters](api/ng/filter), but it is easy to
  * define your own as well.
  *
@@ -20305,7 +22132,7 @@ function $FilterProvider($provide) {
    *    the keys are the filter names and the values are the filter factories.
    *
    *    <div class="alert alert-warning">
-   *    **Note:** Filter names must be valid angular {@link expression} identifiers, such as `uppercase` or `orderBy`.
+   *    **Note:** Filter names must be valid AngularJS {@link expression} identifiers, such as `uppercase` or `orderBy`.
    *    Names with special characters, such as hyphens and dots, are not allowed. If you wish to namespace
    *    your filters, then you can use capitalization (`myappSubsectionFilterx`) or underscores
    *    (`myapp_subsection_filterx`).
@@ -20367,6 +22194,9 @@ function $FilterProvider($provide) {
  * Selects a subset of items from `array` and returns it as a new array.
  *
  * @param {Array} array The source array.
+ * <div class="alert alert-info">
+ *   **Note**: If the array contains objects that reference themselves, filtering is not possible.
+ * </div>
  * @param {string|Object|function()} expression The predicate to be used for selecting items from
  *   `array`.
  *
@@ -20400,8 +22230,9 @@ function $FilterProvider($provide) {
  *     The final result is an array of those elements that the predicate returned true for.
  *
  * @param {function(actual, expected)|true|false} [comparator] Comparator which is used in
- *     determining if the expected value (from the filter expression) and actual value (from
- *     the object in the array) should be considered a match.
+ *     determining if values retrieved using `expression` (when it is not a function) should be
+ *     considered a match based on the expected value (from the filter expression) and actual
+ *     value (from the object in the array).
  *
  *   Can be one of:
  *
@@ -20584,7 +22415,10 @@ function deepCompare(actual, expected, comparator, anyPropertyKey, matchAgainstA
       var key;
       if (matchAgainstAnyProp) {
         for (key in actual) {
-          if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, anyPropertyKey, true)) {
+          // Under certain, rare, circumstances, key may not be a string and `charAt` will be undefined
+          // See: https://github.com/angular/angular.js/issues/15644
+          if (key.charAt && (key.charAt(0) !== '$') &&
+              deepCompare(actual[key], expected, comparator, anyPropertyKey, true)) {
             return true;
           }
         }
@@ -20649,7 +22483,7 @@ var ZERO_CHAR = '0';
        <div ng-controller="ExampleController">
          <input type="number" ng-model="amount" aria-label="amount"> <br>
          default currency symbol ($): <span id="currency-default">{{amount | currency}}</span><br>
-         custom currency identifier (USD$): <span id="currency-custom">{{amount | currency:"USD$"}}</span>
+         custom currency identifier (USD$): <span id="currency-custom">{{amount | currency:"USD$"}}</span><br>
          no fractions (0): <span id="currency-no-fractions">{{amount | currency:"USD$":0}}</span>
        </div>
      </file>
@@ -20686,11 +22520,14 @@ function currencyFilter($locale) {
       fractionSize = formats.PATTERNS[1].maxFrac;
     }
 
+    // If the currency symbol is empty, trim whitespace around the symbol
+    var currencySymbolRe = !currencySymbol ? /\s*\u00A4\s*/g : /\u00A4/g;
+
     // if null or undefined pass it through
     return (amount == null)
         ? amount
         : formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, fractionSize).
-            replace(/\u00A4/g, currencySymbol);
+            replace(currencySymbolRe, currencySymbol);
   };
 }
 
@@ -21093,7 +22930,7 @@ var DATE_FORMATS = {
      GGGG: longEraGetter
 };
 
-var DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,
+var DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\s\S]*)/,
     NUMBER_STRING = /^-?\d+$/;
 
 /**
@@ -21152,6 +22989,8 @@ var DATE_FORMATS_SPLIT = /((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+
  *   `"h 'in the morning'"`). In order to output a single quote, escape it - i.e., two single quotes in a sequence
  *   (e.g. `"h 'o''clock'"`).
  *
+ *   Any other characters in the `format` string will be output as-is.
+ *
  * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or
  *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.sssZ and its
  *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is
@@ -21314,6 +23153,9 @@ function jsonFilter() {
  * @kind function
  * @description
  * Converts string to lowercase.
+ *
+ * See the {@link ng.uppercase uppercase filter documentation} for a functionally identical example.
+ *
  * @see angular.lowercase
  */
 var lowercaseFilter = valueFn(lowercase);
@@ -21325,7 +23167,23 @@ var lowercaseFilter = valueFn(lowercase);
  * @kind function
  * @description
  * Converts string to uppercase.
- * @see angular.uppercase
+ * @example
+   <example module="uppercaseFilterExample" name="filter-uppercase">
+     <file name="index.html">
+       <script>
+         angular.module('uppercaseFilterExample', [])
+           .controller('ExampleController', ['$scope', function($scope) {
+             $scope.title = 'This is a title';
+           }]);
+       </script>
+       <div ng-controller="ExampleController">
+         <!-- This title should be formatted normally -->
+         <h1>{{title}}</h1>
+         <!-- This title should be capitalized -->
+         <h1>{{title | uppercase}}</h1>
+       </div>
+     </file>
+   </example>
  */
 var uppercaseFilter = valueFn(uppercase);
 
@@ -21501,6 +23359,7 @@ function sliceFn(input, begin, end) {
  *      index: ...
  *    }
  *    ```
+ *    **Note:** `null` values use `'null'` as their type.
  * 2. The comparator function is used to sort the items, based on the derived values, types and
  *    indices.
  *
@@ -21514,6 +23373,9 @@ function sliceFn(input, begin, end) {
  * dummy predicate that returns the item's index as `value`.
  * (If you are using a custom comparator, make sure it can handle this predicate as well.)
  *
+ * If a custom comparator still can't distinguish between two items, then they will be sorted based
+ * on their index using the built-in comparator.
+ *
  * Finally, in an attempt to simplify things, if a predicate returns an object as the extracted
  * value for an item, `orderBy` will try to convert that object to a primitive value, before passing
  * it to the comparator. The following rules govern the conversion:
@@ -21532,11 +23394,15 @@ function sliceFn(input, begin, end) {
  *
  * The default, built-in comparator should be sufficient for most usecases. In short, it compares
  * numbers numerically, strings alphabetically (and case-insensitively), for objects falls back to
- * using their index in the original collection, and sorts values of different types by type.
+ * using their index in the original collection, sorts values of different types by type and puts
+ * `undefined` and `null` values at the end of the sorted list.
  *
  * More specifically, it follows these steps to determine the relative order of items:
  *
- * 1. If the compared values are of different types, compare the types themselves alphabetically.
+ * 1. If the compared values are of different types:
+ *    - If one of the values is undefined, consider it "greater than" the other.
+ *    - Else if one of the values is null, consider it "greater than" the other.
+ *    - Else compare the types themselves alphabetically.
  * 2. If both values are of type `string`, compare them alphabetically in a case- and
  *    locale-insensitive way.
  * 3. If both values are objects, compare their indices instead.
@@ -21547,9 +23413,10 @@ function sliceFn(input, begin, end) {
  *
  * **Note:** If you notice numbers not being sorted as expected, make sure they are actually being
  *           saved as numbers and not strings.
- * **Note:** For the purpose of sorting, `null` values are treated as the string `'null'` (i.e.
- *           `type: 'string'`, `value: 'null'`). This may cause unexpected sort order relative to
- *           other values.
+ * **Note:** For the purpose of sorting, `null` and `undefined` are considered "greater than"
+ *           any other value (with undefined "greater than" null). This effectively means that `null`
+ *           and `undefined` values end up at the end of a list sorted in ascending order.
+ * **Note:** `null` values use `'null'` as their type to be able to distinguish them from objects.
  *
  * @param {Array|ArrayLike} collection - The collection (array or array-like object) to sort.
  * @param {(Function|string|Array.<Function|string>)=} expression - A predicate (or list of
@@ -21559,7 +23426,7 @@ function sliceFn(input, begin, end) {
  *
  *    - `Function`: A getter function. This function will be called with each item as argument and
  *      the return value will be used for sorting.
- *    - `string`: An Angular expression. This expression will be evaluated against each item and the
+ *    - `string`: An AngularJS expression. This expression will be evaluated against each item and the
  *      result will be used for sorting. For example, use `'label'` to sort by a property called
  *      `label` or `'label.substring(0, 3)'` to sort by the first 3 characters of the `label`
  *      property.<br />
@@ -22060,7 +23927,7 @@ function orderByFilter($parse) {
         }
       }
 
-      return compare(v1.tieBreaker, v2.tieBreaker) * descending;
+      return (compare(v1.tieBreaker, v2.tieBreaker) || defaultCompare(v1.tieBreaker, v2.tieBreaker)) * descending;
     }
   };
 
@@ -22116,8 +23983,7 @@ function orderByFilter($parse) {
   function getPredicateValue(value, index) {
     var type = typeof value;
     if (value === null) {
-      type = 'string';
-      value = 'null';
+      type = 'null';
     } else if (type === 'object') {
       value = objectValue(value);
     }
@@ -22148,7 +24014,11 @@ function orderByFilter($parse) {
         result = value1 < value2 ? -1 : 1;
       }
     } else {
-      result = type1 < type2 ? -1 : 1;
+      result = (type1 === 'undefined') ? 1 :
+        (type2 === 'undefined') ? -1 :
+        (type1 === 'null') ? 1 :
+        (type2 === 'null') ? -1 :
+        (type1 < type2) ? -1 : 1;
     }
 
     return result;
@@ -22205,10 +24075,10 @@ var htmlAnchorDirective = valueFn({
  * @priority 99
  *
  * @description
- * Using Angular markup like `{{hash}}` in an href attribute will
+ * Using AngularJS markup like `{{hash}}` in an href attribute will
  * make the link go to the wrong URL if the user clicks it before
- * Angular has a chance to replace the `{{hash}}` markup with its
- * value. Until Angular replaces the markup the link will be broken
+ * AngularJS has a chance to replace the `{{hash}}` markup with its
+ * value. Until AngularJS replaces the markup the link will be broken
  * and will most likely return a 404 error. The `ngHref` directive
  * solves this problem.
  *
@@ -22256,7 +24126,7 @@ var htmlAnchorDirective = valueFn({
 
           element(by.id('link-3')).click();
 
-          // At this point, we navigate away from an Angular page, so we need
+          // At this point, we navigate away from an AngularJS page, so we need
           // to use browser.driver to get the base webdriver.
 
           browser.wait(function() {
@@ -22285,7 +24155,7 @@ var htmlAnchorDirective = valueFn({
 
           element(by.id('link-6')).click();
 
-          // At this point, we navigate away from an Angular page, so we need
+          // At this point, we navigate away from an AngularJS page, so we need
           // to use browser.driver to get the base webdriver.
           browser.wait(function() {
             return browser.driver.getCurrentUrl().then(function(url) {
@@ -22304,9 +24174,9 @@ var htmlAnchorDirective = valueFn({
  * @priority 99
  *
  * @description
- * Using Angular markup like `{{hash}}` in a `src` attribute doesn't
+ * Using AngularJS markup like `{{hash}}` in a `src` attribute doesn't
  * work right: The browser will fetch from the URL with the literal
- * text `{{hash}}` until Angular replaces the expression inside
+ * text `{{hash}}` until AngularJS replaces the expression inside
  * `{{hash}}`. The `ngSrc` directive solves this problem.
  *
  * The buggy way to write it:
@@ -22330,9 +24200,9 @@ var htmlAnchorDirective = valueFn({
  * @priority 99
  *
  * @description
- * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't
+ * Using AngularJS markup like `{{hash}}` in a `srcset` attribute doesn't
  * work right: The browser will fetch from the URL with the literal
- * text `{{hash}}` until Angular replaces the expression inside
+ * text `{{hash}}` until AngularJS replaces the expression inside
  * `{{hash}}`. The `ngSrcset` directive solves this problem.
  *
  * The buggy way to write it:
@@ -22357,7 +24227,8 @@ var htmlAnchorDirective = valueFn({
  *
  * @description
  *
- * This directive sets the `disabled` attribute on the element if the
+ * This directive sets the `disabled` attribute on the element (typically a form control,
+ * e.g. `input`, `button`, `select` etc.) if the
  * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy.
  *
  * A special directive is necessary because we cannot use interpolation inside the `disabled`
@@ -22378,7 +24249,6 @@ var htmlAnchorDirective = valueFn({
       </file>
     </example>
  *
- * @element INPUT
  * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,
  *     then the `disabled` attribute will be set on the element
  */
@@ -22402,14 +24272,14 @@ var htmlAnchorDirective = valueFn({
  * @example
     <example name="ng-checked">
       <file name="index.html">
-        <label>Check me to check both: <input type="checkbox" ng-model="master"></label><br/>
-        <input id="checkSlave" type="checkbox" ng-checked="master" aria-label="Slave input">
+        <label>Check me to check both: <input type="checkbox" ng-model="leader"></label><br/>
+        <input id="checkFollower" type="checkbox" ng-checked="leader" aria-label="Follower input">
       </file>
       <file name="protractor.js" type="protractor">
         it('should check both checkBoxes', function() {
-          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();
-          element(by.model('master')).click();
-          expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();
+          expect(element(by.id('checkFollower')).getAttribute('checked')).toBeFalsy();
+          element(by.model('leader')).click();
+          expect(element(by.id('checkFollower')).getAttribute('checked')).toBeTruthy();
         });
       </file>
     </example>
@@ -22439,7 +24309,7 @@ var htmlAnchorDirective = valueFn({
     <example name="ng-readonly">
       <file name="index.html">
         <label>Check me to make text readonly: <input type="checkbox" ng-model="checked"></label><br/>
-        <input type="text" ng-readonly="checked" value="I'm Angular" aria-label="Readonly field" />
+        <input type="text" ng-readonly="checked" value="I'm AngularJS" aria-label="Readonly field" />
       </file>
       <file name="protractor.js" type="protractor">
         it('should toggle readonly attr', function() {
@@ -22514,15 +24384,20 @@ var htmlAnchorDirective = valueFn({
  *
  * ## A note about browser compatibility
  *
- * Edge, Firefox, and Internet Explorer do not support the `details` element, it is
+ * Internet Explorer and Edge do not support the `details` element, it is
  * recommended to use {@link ng.ngShow} and {@link ng.ngHide} instead.
  *
  * @example
      <example name="ng-open">
        <file name="index.html">
-         <label>Check me check multiple: <input type="checkbox" ng-model="open"></label><br/>
+         <label>Toggle details: <input type="checkbox" ng-model="open"></label><br/>
          <details id="details" ng-open="open">
-            <summary>Show/Hide me</summary>
+            <summary>List</summary>
+            <ul>
+              <li>Apple</li>
+              <li>Orange</li>
+              <li>Durian</li>
+            </ul>
          </details>
        </file>
        <file name="protractor.js" type="protractor">
@@ -22600,7 +24475,7 @@ forEach(ALIASED_ATTR, function(htmlAttr, ngAttr) {
 // ng-src, ng-srcset, ng-href are interpolated
 forEach(['src', 'srcset', 'href'], function(attrName) {
   var normalized = directiveNormalize('ng-' + attrName);
-  ngAttributeAliasDirectives[normalized] = function() {
+  ngAttributeAliasDirectives[normalized] = ['$sce', function($sce) {
     return {
       priority: 99, // it needs to run after the attributes are interpolated
       link: function(scope, element, attr) {
@@ -22614,6 +24489,10 @@ forEach(['src', 'srcset', 'href'], function(attrName) {
           propName = null;
         }
 
+        // We need to sanitize the url at least once, in case it is a constant
+        // non-interpolated attribute.
+        attr.$set(normalized, $sce.getTrustedMediaUrl(attr[normalized]));
+
         attr.$observe(normalized, function(value) {
           if (!value) {
             if (attrName === 'href') {
@@ -22624,28 +24503,32 @@ forEach(['src', 'srcset', 'href'], function(attrName) {
 
           attr.$set(name, value);
 
-          // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist
+          // Support: IE 9-11 only
+          // On IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist
           // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need
           // to set the property as well to achieve the desired effect.
-          // we use attr[attrName] value since $set can sanitize the url.
+          // We use attr[attrName] value since $set might have sanitized the url.
           if (msie && propName) element.prop(propName, attr[name]);
         });
       }
     };
-  };
+  }];
 });
 
-/* global -nullFormCtrl, -SUBMITTED_CLASS, addSetValidityMethod: true
+/* global -nullFormCtrl, -PENDING_CLASS, -SUBMITTED_CLASS
  */
 var nullFormCtrl = {
   $addControl: noop,
+  $getControls: valueFn([]),
   $$renameControl: nullFormRenameControl,
   $removeControl: noop,
   $setValidity: noop,
   $setDirty: noop,
   $setPristine: noop,
-  $setSubmitted: noop
+  $setSubmitted: noop,
+  $$setSubmitted: noop
 },
+PENDING_CLASS = 'ng-pending',
 SUBMITTED_CLASS = 'ng-submitted';
 
 function nullFormRenameControl(control, name) {
@@ -22660,17 +24543,23 @@ function nullFormRenameControl(control, name) {
  * @property {boolean} $dirty True if user has already interacted with the form.
  * @property {boolean} $valid True if all of the containing forms and controls are valid.
  * @property {boolean} $invalid True if at least one containing control or form is invalid.
- * @property {boolean} $pending True if at least one containing control or form is pending.
  * @property {boolean} $submitted True if user has submitted the form even if its invalid.
  *
- * @property {Object} $error Is an object hash, containing references to controls or
- *  forms with failing validators, where:
+ * @property {Object} $pending An object hash, containing references to controls or forms with
+ *  pending validators, where:
+ *
+ *  - keys are validations tokens (error names).
+ *  - values are arrays of controls or forms that have a pending validator for the given error name.
+ *
+ * See {@link form.FormController#$error $error} for a list of built-in validation tokens.
+ *
+ * @property {Object} $error An object hash, containing references to controls or forms with failing
+ *  validators, where:
  *
  *  - keys are validation tokens (error names),
- *  - values are arrays of controls or forms that have a failing validator for given error name.
+ *  - values are arrays of controls or forms that have a failing validator for the given error name.
  *
  *  Built-in validation tokens:
- *
  *  - `email`
  *  - `max`
  *  - `maxlength`
@@ -22696,22 +24585,28 @@ function nullFormRenameControl(control, name) {
  */
 //asks for $scope to fool the BC controller module
 FormController.$inject = ['$element', '$attrs', '$scope', '$animate', '$interpolate'];
-function FormController(element, attrs, $scope, $animate, $interpolate) {
-  var form = this,
-      controls = [];
+function FormController($element, $attrs, $scope, $animate, $interpolate) {
+  this.$$controls = [];
 
   // init state
-  form.$error = {};
-  form.$$success = {};
-  form.$pending = undefined;
-  form.$name = $interpolate(attrs.name || attrs.ngForm || '')($scope);
-  form.$dirty = false;
-  form.$pristine = true;
-  form.$valid = true;
-  form.$invalid = false;
-  form.$submitted = false;
-  form.$$parentForm = nullFormCtrl;
+  this.$error = {};
+  this.$$success = {};
+  this.$pending = undefined;
+  this.$name = $interpolate($attrs.name || $attrs.ngForm || '')($scope);
+  this.$dirty = false;
+  this.$pristine = true;
+  this.$valid = true;
+  this.$invalid = false;
+  this.$submitted = false;
+  this.$$parentForm = nullFormCtrl;
+
+  this.$$element = $element;
+  this.$$animate = $animate;
+
+  setupValidity(this);
+}
 
+FormController.prototype = {
   /**
    * @ngdoc method
    * @name form.FormController#$rollbackViewValue
@@ -22723,11 +24618,11 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
    * event defined in `ng-model-options`. This method is typically needed by the reset button of
    * a form that uses `ng-model-options` to pend updates.
    */
-  form.$rollbackViewValue = function() {
-    forEach(controls, function(control) {
+  $rollbackViewValue: function() {
+    forEach(this.$$controls, function(control) {
       control.$rollbackViewValue();
     });
-  };
+  },
 
   /**
    * @ngdoc method
@@ -22740,11 +24635,11 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
    * event defined in `ng-model-options`. This method is rarely needed as `NgModelController`
    * usually handles calling this in response to input events.
    */
-  form.$commitViewValue = function() {
-    forEach(controls, function(control) {
+  $commitViewValue: function() {
+    forEach(this.$$controls, function(control) {
       control.$commitViewValue();
     });
-  };
+  },
 
   /**
    * @ngdoc method
@@ -22767,29 +24662,53 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
    * For example, if an input control is added that is already `$dirty` and has `$error` properties,
    * calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form.
    */
-  form.$addControl = function(control) {
+  $addControl: function(control) {
     // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
     // and not added to the scope.  Now we throw an error.
     assertNotHasOwnProperty(control.$name, 'input');
-    controls.push(control);
+    this.$$controls.push(control);
 
     if (control.$name) {
-      form[control.$name] = control;
+      this[control.$name] = control;
     }
 
-    control.$$parentForm = form;
-  };
+    control.$$parentForm = this;
+  },
+
+  /**
+   * @ngdoc method
+   * @name form.FormController#$getControls
+   * @returns {Array} the controls that are currently part of this form
+   *
+   * @description
+   * This method returns a **shallow copy** of the controls that are currently part of this form.
+   * The controls can be instances of {@link form.FormController `FormController`}
+   * ({@link ngForm "child-forms"}) and of {@link ngModel.NgModelController `NgModelController`}.
+   * If you need access to the controls of child-forms, you have to call `$getControls()`
+   * recursively on them.
+   * This can be used for example to iterate over all controls to validate them.
+   *
+   * The controls can be accessed normally, but adding to, or removing controls from the array has
+   * no effect on the form. Instead, use {@link form.FormController#$addControl `$addControl()`} and
+   * {@link form.FormController#$removeControl `$removeControl()`} for this use-case.
+   * Likewise, adding a control to, or removing a control from the form is not reflected
+   * in the shallow copy. That means you should get a fresh copy from `$getControls()` every time
+   * you need access to the controls.
+   */
+  $getControls: function() {
+    return shallowCopy(this.$$controls);
+  },
 
   // Private API: rename a form control
-  form.$$renameControl = function(control, newName) {
+  $$renameControl: function(control, newName) {
     var oldName = control.$name;
 
-    if (form[oldName] === control) {
-      delete form[oldName];
+    if (this[oldName] === control) {
+      delete this[oldName];
     }
-    form[newName] = control;
+    this[newName] = control;
     control.$name = newName;
-  };
+  },
 
   /**
    * @ngdoc method
@@ -22807,60 +24726,26 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
    * different from case to case. For example, removing the only `$dirty` control from a form may or
    * may not mean that the form is still `$dirty`.
    */
-  form.$removeControl = function(control) {
-    if (control.$name && form[control.$name] === control) {
-      delete form[control.$name];
-    }
-    forEach(form.$pending, function(value, name) {
-      form.$setValidity(name, null, control);
-    });
-    forEach(form.$error, function(value, name) {
-      form.$setValidity(name, null, control);
-    });
-    forEach(form.$$success, function(value, name) {
-      form.$setValidity(name, null, control);
-    });
-
-    arrayRemove(controls, control);
+  $removeControl: function(control) {
+    if (control.$name && this[control.$name] === control) {
+      delete this[control.$name];
+    }
+    forEach(this.$pending, function(value, name) {
+      // eslint-disable-next-line no-invalid-this
+      this.$setValidity(name, null, control);
+    }, this);
+    forEach(this.$error, function(value, name) {
+      // eslint-disable-next-line no-invalid-this
+      this.$setValidity(name, null, control);
+    }, this);
+    forEach(this.$$success, function(value, name) {
+      // eslint-disable-next-line no-invalid-this
+      this.$setValidity(name, null, control);
+    }, this);
+
+    arrayRemove(this.$$controls, control);
     control.$$parentForm = nullFormCtrl;
-  };
-
-
-  /**
-   * @ngdoc method
-   * @name form.FormController#$setValidity
-   *
-   * @description
-   * Sets the validity of a form control.
-   *
-   * This method will also propagate to parent forms.
-   */
-  addSetValidityMethod({
-    ctrl: this,
-    $element: element,
-    set: function(object, property, controller) {
-      var list = object[property];
-      if (!list) {
-        object[property] = [controller];
-      } else {
-        var index = list.indexOf(controller);
-        if (index === -1) {
-          list.push(controller);
-        }
-      }
-    },
-    unset: function(object, property, controller) {
-      var list = object[property];
-      if (!list) {
-        return;
-      }
-      arrayRemove(list, controller);
-      if (list.length === 0) {
-        delete object[property];
-      }
-    },
-    $animate: $animate
-  });
+  },
 
   /**
    * @ngdoc method
@@ -22872,13 +24757,13 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
    * This method can be called to add the 'ng-dirty' class and set the form to a dirty
    * state (ng-dirty class). This method will also propagate to parent forms.
    */
-  form.$setDirty = function() {
-    $animate.removeClass(element, PRISTINE_CLASS);
-    $animate.addClass(element, DIRTY_CLASS);
-    form.$dirty = true;
-    form.$pristine = false;
-    form.$$parentForm.$setDirty();
-  };
+  $setDirty: function() {
+    this.$$animate.removeClass(this.$$element, PRISTINE_CLASS);
+    this.$$animate.addClass(this.$$element, DIRTY_CLASS);
+    this.$dirty = true;
+    this.$pristine = false;
+    this.$$parentForm.$setDirty();
+  },
 
   /**
    * @ngdoc method
@@ -22896,15 +24781,15 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
    * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after
    * saving or resetting it.
    */
-  form.$setPristine = function() {
-    $animate.setClass(element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS);
-    form.$dirty = false;
-    form.$pristine = true;
-    form.$submitted = false;
-    forEach(controls, function(control) {
+  $setPristine: function() {
+    this.$$animate.setClass(this.$$element, PRISTINE_CLASS, DIRTY_CLASS + ' ' + SUBMITTED_CLASS);
+    this.$dirty = false;
+    this.$pristine = true;
+    this.$submitted = false;
+    forEach(this.$$controls, function(control) {
       control.$setPristine();
     });
-  };
+  },
 
   /**
    * @ngdoc method
@@ -22919,25 +24804,87 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
    * Setting a form controls back to their untouched state is often useful when setting the form
    * back to its pristine state.
    */
-  form.$setUntouched = function() {
-    forEach(controls, function(control) {
+  $setUntouched: function() {
+    forEach(this.$$controls, function(control) {
       control.$setUntouched();
     });
-  };
+  },
 
   /**
    * @ngdoc method
    * @name form.FormController#$setSubmitted
    *
    * @description
-   * Sets the form to its submitted state.
+   * Sets the form to its `$submitted` state. This will also set `$submitted` on all child and
+   * parent forms of the form.
    */
-  form.$setSubmitted = function() {
-    $animate.addClass(element, SUBMITTED_CLASS);
-    form.$submitted = true;
-    form.$$parentForm.$setSubmitted();
-  };
-}
+  $setSubmitted: function() {
+    var rootForm = this;
+    while (rootForm.$$parentForm && (rootForm.$$parentForm !== nullFormCtrl)) {
+      rootForm = rootForm.$$parentForm;
+    }
+    rootForm.$$setSubmitted();
+  },
+
+  $$setSubmitted: function() {
+    this.$$animate.addClass(this.$$element, SUBMITTED_CLASS);
+    this.$submitted = true;
+    forEach(this.$$controls, function(control) {
+      if (control.$$setSubmitted) {
+        control.$$setSubmitted();
+      }
+    });
+  }
+};
+
+/**
+ * @ngdoc method
+ * @name form.FormController#$setValidity
+ *
+ * @description
+ * Change the validity state of the form, and notify the parent form (if any).
+ *
+ * Application developers will rarely need to call this method directly. It is used internally, by
+ * {@link ngModel.NgModelController#$setValidity NgModelController.$setValidity()}, to propagate a
+ * control's validity state to the parent `FormController`.
+ *
+ * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be
+ *        assigned to either `$error[validationErrorKey]` or `$pending[validationErrorKey]` (for
+ *        unfulfilled `$asyncValidators`), so that it is available for data-binding. The
+ *        `validationErrorKey` should be in camelCase and will get converted into dash-case for
+ *        class name. Example: `myError` will result in `ng-valid-my-error` and
+ *        `ng-invalid-my-error` classes and can be bound to as `{{ someForm.$error.myError }}`.
+ * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending
+ *        (undefined),  or skipped (null). Pending is used for unfulfilled `$asyncValidators`.
+ *        Skipped is used by AngularJS when validators do not run because of parse errors and when
+ *        `$asyncValidators` do not run because any of the `$validators` failed.
+ * @param {NgModelController | FormController} controller - The controller whose validity state is
+ *        triggering the change.
+ */
+addSetValidityMethod({
+  clazz: FormController,
+  set: function(object, property, controller) {
+    var list = object[property];
+    if (!list) {
+      object[property] = [controller];
+    } else {
+      var index = list.indexOf(controller);
+      if (index === -1) {
+        list.push(controller);
+      }
+    }
+  },
+  unset: function(object, property, controller) {
+    var list = object[property];
+    if (!list) {
+      return;
+    }
+    arrayRemove(list, controller);
+    if (list.length === 0) {
+      delete object[property];
+    }
+  }
+});
 
 /**
  * @ngdoc directive
@@ -22945,16 +24892,21 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
  * @restrict EAC
  *
  * @description
- * Nestable alias of {@link ng.directive:form `form`} directive. HTML
- * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a
- * sub-group of controls needs to be determined.
+ * Helper directive that makes it possible to create control groups inside a
+ * {@link ng.directive:form `form`} directive.
+ * These "child forms" can be used, for example, to determine the validity of a sub-group of
+ * controls.
  *
- * Note: the purpose of `ngForm` is to group controls,
- * but not to be a replacement for the `<form>` tag with all of its capabilities
- * (e.g. posting to the server, ...).
+ * <div class="alert alert-danger">
+ * **Note**: `ngForm` cannot be used as a replacement for `<form>`, because it lacks its
+ * [built-in HTML functionality](https://html.spec.whatwg.org/#the-form-element).
+ * Specifically, you cannot submit `ngForm` like a `<form>` tag. That means,
+ * you cannot send data to the server with `ngForm`, or integrate it with
+ * {@link ng.directive:ngSubmit `ngSubmit`}.
+ * </div>
  *
- * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into
- *                       related scope, under this name.
+ * @param {string=} ngForm|name Name of the form. If specified, the form controller will
+ *                              be published into the related scope, under this name.
  *
  */
 
@@ -22970,15 +24922,15 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
  * If the `name` attribute is specified, the form controller is published onto the current scope under
  * this name.
  *
- * # Alias: {@link ng.directive:ngForm `ngForm`}
+ * ## Alias: {@link ng.directive:ngForm `ngForm`}
  *
- * In Angular, forms can be nested. This means that the outer form is valid when all of the child
+ * In AngularJS, forms can be nested. This means that the outer form is valid when all of the child
  * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so
- * Angular provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to
+ * AngularJS provides the {@link ng.directive:ngForm `ngForm`} directive, which behaves identically to
  * `form` but can be nested. Nested forms can be useful, for example, if the validity of a sub-group
  * of controls needs to be determined.
  *
- * # CSS classes
+ * ## CSS classes
  *  - `ng-valid` is set if the form is valid.
  *  - `ng-invalid` is set if the form is invalid.
  *  - `ng-pending` is set if the form is pending.
@@ -22989,14 +24941,14 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
  * Keep in mind that ngAnimate can detect each of these classes when added and removed.
  *
  *
- * # Submitting a form and preventing the default action
+ * ## Submitting a form and preventing the default action
  *
- * Since the role of forms in client-side Angular applications is different than in classical
+ * Since the role of forms in client-side AngularJS applications is different than in classical
  * roundtrip apps, it is desirable for the browser not to translate the form submission into a full
  * page reload that sends the data to the server. Instead some javascript logic should be triggered
  * to handle the form submission in an application-specific way.
  *
- * For this reason, Angular prevents the default action (form submission to the server) unless the
+ * For this reason, AngularJS prevents the default action (form submission to the server) unless the
  * `<form>` element has an `action` attribute specified.
  *
  * You can use one of the following two ways to specify what javascript method should be called when
@@ -23022,8 +24974,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
  * submitted. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`
  * to have access to the updated model.
  *
- * ## Animation Hooks
- *
+ * @animations
  * Animations in ngForm are triggered when any of the associated CSS classes are added and removed.
  * These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any
  * other validations that are performed within the form. Animations in ngForm are similar to how
@@ -23134,13 +25085,13 @@ var formDirectiveFactory = function(isNgForm) {
                 event.preventDefault();
               };
 
-              addEventListenerFn(formElement[0], 'submit', handleFormSubmission);
+              formElement[0].addEventListener('submit', handleFormSubmission);
 
               // unregister the preventDefault listener so that we don't not leak memory but in a
               // way that will achieve the prevention of the default action.
               formElement.on('$destroy', function() {
                 $timeout(function() {
-                  removeEventListenerFn(formElement[0], 'submit', handleFormSubmission);
+                  formElement[0].removeEventListener('submit', handleFormSubmission);
                 }, 0, false);
               });
             }
@@ -23185,6 +25136,111 @@ var formDirectiveFactory = function(isNgForm) {
 var formDirective = formDirectiveFactory();
 var ngFormDirective = formDirectiveFactory(true);
 
+
+
+// helper methods
+function setupValidity(instance) {
+  instance.$$classCache = {};
+  instance.$$classCache[INVALID_CLASS] = !(instance.$$classCache[VALID_CLASS] = instance.$$element.hasClass(VALID_CLASS));
+}
+function addSetValidityMethod(context) {
+  var clazz = context.clazz,
+      set = context.set,
+      unset = context.unset;
+
+  clazz.prototype.$setValidity = function(validationErrorKey, state, controller) {
+    if (isUndefined(state)) {
+      createAndSet(this, '$pending', validationErrorKey, controller);
+    } else {
+      unsetAndCleanup(this, '$pending', validationErrorKey, controller);
+    }
+    if (!isBoolean(state)) {
+      unset(this.$error, validationErrorKey, controller);
+      unset(this.$$success, validationErrorKey, controller);
+    } else {
+      if (state) {
+        unset(this.$error, validationErrorKey, controller);
+        set(this.$$success, validationErrorKey, controller);
+      } else {
+        set(this.$error, validationErrorKey, controller);
+        unset(this.$$success, validationErrorKey, controller);
+      }
+    }
+    if (this.$pending) {
+      cachedToggleClass(this, PENDING_CLASS, true);
+      this.$valid = this.$invalid = undefined;
+      toggleValidationCss(this, '', null);
+    } else {
+      cachedToggleClass(this, PENDING_CLASS, false);
+      this.$valid = isObjectEmpty(this.$error);
+      this.$invalid = !this.$valid;
+      toggleValidationCss(this, '', this.$valid);
+    }
+
+    // re-read the state as the set/unset methods could have
+    // combined state in this.$error[validationError] (used for forms),
+    // where setting/unsetting only increments/decrements the value,
+    // and does not replace it.
+    var combinedState;
+    if (this.$pending && this.$pending[validationErrorKey]) {
+      combinedState = undefined;
+    } else if (this.$error[validationErrorKey]) {
+      combinedState = false;
+    } else if (this.$$success[validationErrorKey]) {
+      combinedState = true;
+    } else {
+      combinedState = null;
+    }
+
+    toggleValidationCss(this, validationErrorKey, combinedState);
+    this.$$parentForm.$setValidity(validationErrorKey, combinedState, this);
+  };
+
+  function createAndSet(ctrl, name, value, controller) {
+    if (!ctrl[name]) {
+      ctrl[name] = {};
+    }
+    set(ctrl[name], value, controller);
+  }
+
+  function unsetAndCleanup(ctrl, name, value, controller) {
+    if (ctrl[name]) {
+      unset(ctrl[name], value, controller);
+    }
+    if (isObjectEmpty(ctrl[name])) {
+      ctrl[name] = undefined;
+    }
+  }
+
+  function cachedToggleClass(ctrl, className, switchValue) {
+    if (switchValue && !ctrl.$$classCache[className]) {
+      ctrl.$$animate.addClass(ctrl.$$element, className);
+      ctrl.$$classCache[className] = true;
+    } else if (!switchValue && ctrl.$$classCache[className]) {
+      ctrl.$$animate.removeClass(ctrl.$$element, className);
+      ctrl.$$classCache[className] = false;
+    }
+  }
+
+  function toggleValidationCss(ctrl, validationErrorKey, isValid) {
+    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
+
+    cachedToggleClass(ctrl, VALID_CLASS + validationErrorKey, isValid === true);
+    cachedToggleClass(ctrl, INVALID_CLASS + validationErrorKey, isValid === false);
+  }
+}
+
+function isObjectEmpty(obj) {
+  if (obj) {
+    for (var prop in obj) {
+      if (obj.hasOwnProperty(prop)) {
+        return false;
+      }
+    }
+  }
+  return true;
+}
+
 /* global
   VALID_CLASS: false,
   INVALID_CLASS: false,
@@ -23230,10 +25286,10 @@ var inputType = {
    * @name input[text]
    *
    * @description
-   * Standard HTML text input with angular data binding, inherited by most of the `input` elements.
+   * Standard HTML text input with AngularJS data binding, inherited by most of the `input` elements.
    *
    *
-   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string} ngModel Assignable AngularJS expression to data-bind to.
    * @param {string=} name Property name of the form under which the control is published.
    * @param {string=} required Adds `required` validation error key if the value is not entered.
    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
@@ -23248,7 +25304,7 @@ var inputType = {
    *    that contains the regular expression body that will be converted to a regular expression
    *    as in the ngPattern directive.
    * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}
-   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.
+   *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.
    *    If the expression evaluates to a RegExp object, then this is used directly.
    *    If the expression evaluates to a string, then it will be converted to a RegExp
    *    after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to
@@ -23256,9 +25312,9 @@ var inputType = {
    *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to
    *    start at the index of the last search's match, thus not taking the whole input value into
    *    account.
-   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
    *    interaction with the input element.
-   * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
+   * @param {boolean=} [ngTrim=true] If set to false AngularJS will not automatically trim the input.
    *    This parameter is ignored for input[type=password] controls, which will never trim the
    *    input.
    *
@@ -23332,13 +25388,13 @@ var inputType = {
      * modern browsers do not yet support this input type, it is important to provide cues to users on the
      * expected input format via a placeholder or label.
      *
-     * The model must always be a Date object, otherwise Angular will throw an error.
+     * The model must always be a Date object, otherwise AngularJS will throw an error.
      * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
      *
      * The timezone to be used to read/write the `Date` instance in the model can be defined using
      * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
      *
-     * @param {string} ngModel Assignable angular expression to data-bind to.
+     * @param {string} ngModel Assignable AngularJS expression to data-bind to.
      * @param {string=} name Property name of the form under which the control is published.
      * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
      *   valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute
@@ -23356,7 +25412,7 @@ var inputType = {
      * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
      *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
      *    `required` when you want to data-bind to the `required` attribute.
-     * @param {string=} ngChange Angular expression to be executed when input changes due to user
+     * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
      *    interaction with the input element.
      *
      * @example
@@ -23434,13 +25490,17 @@ var inputType = {
     * the HTML5 date input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
     * local datetime format (yyyy-MM-ddTHH:mm:ss), for example: `2010-12-28T14:57:00`.
     *
-    * The model must always be a Date object, otherwise Angular will throw an error.
+    * The model must always be a Date object, otherwise AngularJS will throw an error.
     * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
     *
     * The timezone to be used to read/write the `Date` instance in the model can be defined using
     * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
     *
-    * @param {string} ngModel Assignable angular expression to data-bind to.
+    * The format of the displayed time can be adjusted with the
+    * {@link ng.directive:ngModelOptions#ngModelOptions-arguments ngModelOptions} `timeSecondsFormat`
+    * and `timeStripZeroSeconds`.
+    *
+    * @param {string} ngModel Assignable AngularJS expression to data-bind to.
     * @param {string=} name Property name of the form under which the control is published.
     * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
     *   This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation
@@ -23458,7 +25518,7 @@ var inputType = {
     * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
     *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
     *    `required` when you want to data-bind to the `required` attribute.
-    * @param {string=} ngChange Angular expression to be executed when input changes due to user
+    * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
     *    interaction with the input element.
     *
     * @example
@@ -23537,13 +25597,18 @@ var inputType = {
    * local time format (HH:mm:ss), for example: `14:57:00`. Model must be a Date object. This binding will always output a
    * Date object to the model of January 1, 1970, or local date `new Date(1970, 0, 1, HH, mm, ss)`.
    *
-   * The model must always be a Date object, otherwise Angular will throw an error.
+   * The model must always be a Date object, otherwise AngularJS will throw an error.
    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
    *
    * The timezone to be used to read/write the `Date` instance in the model can be defined using
-   * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
+   * {@link ng.directive:ngModelOptions#ngModelOptions-arguments ngModelOptions}. By default,
+   * this is the timezone of the browser.
    *
-   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * The format of the displayed time can be adjusted with the
+   * {@link ng.directive:ngModelOptions#ngModelOptions-arguments ngModelOptions} `timeSecondsFormat`
+   * and `timeStripZeroSeconds`.
+   *
+   * @param {string} ngModel Assignable AngularJS expression to data-bind to.
    * @param {string=} name Property name of the form under which the control is published.
    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
    *   This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this
@@ -23561,7 +25626,7 @@ var inputType = {
    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
    *    `required` when you want to data-bind to the `required` attribute.
-   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
    *    interaction with the input element.
    *
    * @example
@@ -23639,13 +25704,17 @@ var inputType = {
     * the HTML5 week input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
     * week format (yyyy-W##), for example: `2013-W02`.
     *
-    * The model must always be a Date object, otherwise Angular will throw an error.
+    * The model must always be a Date object, otherwise AngularJS will throw an error.
     * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
     *
+    * The value of the resulting Date object will be set to Thursday at 00:00:00 of the requested week,
+    * due to ISO-8601 week numbering standards. Information on ISO's system for numbering the weeks of the
+    * year can be found at: https://en.wikipedia.org/wiki/ISO_8601#Week_dates
+    *
     * The timezone to be used to read/write the `Date` instance in the model can be defined using
     * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
     *
-    * @param {string} ngModel Assignable angular expression to data-bind to.
+    * @param {string} ngModel Assignable AngularJS expression to data-bind to.
     * @param {string=} name Property name of the form under which the control is published.
     * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
     *   This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this
@@ -23663,7 +25732,7 @@ var inputType = {
     * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
     *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
     *    `required` when you want to data-bind to the `required` attribute.
-    * @param {string=} ngChange Angular expression to be executed when input changes due to user
+    * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
     *    interaction with the input element.
     *
     * @example
@@ -23741,7 +25810,7 @@ var inputType = {
    * the HTML5 month input, a text element will be used. In that case, the text must be entered in a valid ISO-8601
    * month format (yyyy-MM), for example: `2009-01`.
    *
-   * The model must always be a Date object, otherwise Angular will throw an error.
+   * The model must always be a Date object, otherwise AngularJS will throw an error.
    * Invalid `Date` objects (dates whose `getTime()` is `NaN`) will be rendered as an empty string.
    * If the model is not set to the first of the month, the next view to model update will set it
    * to the first of the month.
@@ -23749,7 +25818,7 @@ var inputType = {
    * The timezone to be used to read/write the `Date` instance in the model can be defined using
    * {@link ng.directive:ngModelOptions ngModelOptions}. By default, this is the timezone of the browser.
    *
-   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string} ngModel Assignable AngularJS expression to data-bind to.
    * @param {string=} name Property name of the form under which the control is published.
    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
    *   This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this
@@ -23768,7 +25837,7 @@ var inputType = {
    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
    *    `required` when you want to data-bind to the `required` attribute.
-   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
    *    interaction with the input element.
    *
    * @example
@@ -23846,12 +25915,16 @@ var inputType = {
    * error if not a valid number.
    *
    * <div class="alert alert-warning">
-   * The model must always be of type `number` otherwise Angular will throw an error.
+   * The model must always be of type `number` otherwise AngularJS will throw an error.
    * Be aware that a string containing a number is not enough. See the {@link ngModel:numfmt}
    * error docs for more information and an example of how to convert your model if necessary.
    * </div>
    *
-   * ## Issues with HTML5 constraint validation
+   *
+   *
+   * @knownIssue
+   *
+   * ### HTML5 constraint validation and `allowInvalid`
    *
    * In browsers that follow the
    * [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29),
@@ -23860,11 +25933,32 @@ var inputType = {
    * which means the view / model values in `ngModel` and subsequently the scope value
    * will also be an empty string.
    *
+   * @knownIssue
+   *
+   * ### Large numbers and `step` validation
    *
-   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * The `step` validation will not work correctly for very large numbers (e.g. 9999999999) due to
+   * Javascript's arithmetic limitations. If you need to handle large numbers, purpose-built
+   * libraries (e.g. https://github.com/MikeMcl/big.js/), can be included into AngularJS by
+   * {@link guide/forms#modifying-built-in-validators overwriting the validators}
+   * for `number` and / or `step`, or by {@link guide/forms#custom-validation applying custom validators}
+   * to an `input[text]` element. The source for `input[number]` type can be used as a starting
+   * point for both implementations.
+   *
+   * @param {string} ngModel Assignable AngularJS expression to data-bind to.
    * @param {string=} name Property name of the form under which the control is published.
    * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
+   *    Can be interpolated.
    * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.
+   *    Can be interpolated.
+   * @param {string=} ngMin Like `min`, sets the `min` validation error key if the value entered is less than `ngMin`,
+   *    but does not trigger HTML5 native validation. Takes an expression.
+   * @param {string=} ngMax Like `max`, sets the `max` validation error key if the value entered is greater than `ngMax`,
+   *    but does not trigger HTML5 native validation. Takes an expression.
+   * @param {string=} step Sets the `step` validation error key if the value entered does not fit the `step` constraint.
+   *    Can be interpolated.
+   * @param {string=} ngStep Like `step`, sets the `step` validation error key if the value entered does not fit the `ngStep` constraint,
+   *    but does not trigger HTML5 native validation. Takes an expression.
    * @param {string=} required Sets `required` validation error key if the value is not entered.
    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
    *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
@@ -23878,7 +25972,7 @@ var inputType = {
    *    that contains the regular expression body that will be converted to a regular expression
    *    as in the ngPattern directive.
    * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}
-   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.
+   *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.
    *    If the expression evaluates to a RegExp object, then this is used directly.
    *    If the expression evaluates to a string, then it will be converted to a RegExp
    *    after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to
@@ -23886,7 +25980,7 @@ var inputType = {
    *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to
    *    start at the index of the last search's match, thus not taking the whole input value into
    *    account.
-   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
    *    interaction with the input element.
    *
    * @example
@@ -23961,7 +26055,7 @@ var inputType = {
    * the built-in validators (see the {@link guide/forms Forms guide})
    * </div>
    *
-   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string} ngModel Assignable AngularJS expression to data-bind to.
    * @param {string=} name Property name of the form under which the control is published.
    * @param {string=} required Sets `required` validation error key if the value is not entered.
    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
@@ -23976,7 +26070,7 @@ var inputType = {
    *    that contains the regular expression body that will be converted to a regular expression
    *    as in the ngPattern directive.
    * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}
-   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.
+   *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.
    *    If the expression evaluates to a RegExp object, then this is used directly.
    *    If the expression evaluates to a string, then it will be converted to a RegExp
    *    after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to
@@ -23984,7 +26078,7 @@ var inputType = {
    *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to
    *    start at the index of the last search's match, thus not taking the whole input value into
    *    account.
-   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
    *    interaction with the input element.
    *
    * @example
@@ -24056,11 +26150,13 @@ var inputType = {
    *
    * <div class="alert alert-warning">
    * **Note:** `input[email]` uses a regex to validate email addresses that is derived from the regex
-   * used in Chromium. If you need stricter validation (e.g. requiring a top-level domain), you can
-   * use `ng-pattern` or modify the built-in validators (see the {@link guide/forms Forms guide})
+   * used in Chromium, which may not fulfill your app's requirements.
+   * If you need stricter (e.g. requiring a top-level domain), or more relaxed validation
+   * (e.g. allowing IPv6 address literals) you can use `ng-pattern` or
+   * modify the built-in validators (see the {@link guide/forms Forms guide}).
    * </div>
    *
-   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string} ngModel Assignable AngularJS expression to data-bind to.
    * @param {string=} name Property name of the form under which the control is published.
    * @param {string=} required Sets `required` validation error key if the value is not entered.
    * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
@@ -24075,7 +26171,7 @@ var inputType = {
    *    that contains the regular expression body that will be converted to a regular expression
    *    as in the ngPattern directive.
    * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}
-   *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.
+   *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.
    *    If the expression evaluates to a RegExp object, then this is used directly.
    *    If the expression evaluates to a string, then it will be converted to a RegExp
    *    after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to
@@ -24083,7 +26179,7 @@ var inputType = {
    *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to
    *    start at the index of the last search's match, thus not taking the whole input value into
    *    account.
-   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
    *    interaction with the input element.
    *
    * @example
@@ -24151,14 +26247,41 @@ var inputType = {
    * @description
    * HTML radio button.
    *
-   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * **Note:**<br>
+   * All inputs controlled by {@link ngModel ngModel} (including those of type `radio`) will use the
+   * value of their `name` attribute to determine the property under which their
+   * {@link ngModel.NgModelController NgModelController} will be published on the parent
+   * {@link form.FormController FormController}. Thus, if you use the same `name` for multiple
+   * inputs of a form (e.g. a group of radio inputs), only _one_ `NgModelController` will be
+   * published on the parent `FormController` under that name. The rest of the controllers will
+   * continue to work as expected, but you won't be able to access them as properties on the parent
+   * `FormController`.
+   *
+   * <div class="alert alert-info">
+   *   <p>
+   *     In plain HTML forms, the `name` attribute is used to identify groups of radio inputs, so
+   *     that the browser can manage their state (checked/unchecked) based on the state of other
+   *     inputs in the same group.
+   *   </p>
+   *   <p>
+   *     In AngularJS forms, this is not necessary. The input's state will be updated based on the
+   *     value of the underlying model data.
+   *   </p>
+   * </div>
+   *
+   * <div class="alert alert-success">
+   *   If you omit the `name` attribute on a radio input, `ngModel` will automatically assign it a
+   *   unique name.
+   * </div>
+   *
+   * @param {string} ngModel Assignable AngularJS expression to data-bind to.
    * @param {string} value The value to which the `ngModel` expression should be set when selected.
    *    Note that `value` only supports `string` values, i.e. the scope model needs to be a string,
    *    too. Use `ngValue` if you need complex models (`number`, `object`, ...).
    * @param {string=} name Property name of the form under which the control is published.
-   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
    *    interaction with the input element.
-   * @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio
+   * @param {string} ngValue AngularJS expression to which `ngModel` will be be set when the radio
    *    is selected. Should be used instead of the `value` attribute if you need
    *    a non-string `ngModel` (`boolean`, `array`, ...).
    *
@@ -24219,28 +26342,6 @@ var inputType = {
    * @description
    * Native range input with validation and transformation.
    *
-   * <div class="alert alert-warning">
-   *   <p>
-   *     In v1.5.9+, in order to avoid interfering with already existing, custom directives for
-   *     `input[range]`, you need to let Angular know that you want to enable its built-in support.
-   *     You can do this by adding the `ng-input-range` attribute to the input element. E.g.:
-   *     `<input type="range" ng-input-range ... />`
-   *   </p><br />
-   *   <p>
-   *     Input elements without the `ng-input-range` attibute will continue to be treated the same
-   *     as in previous versions (e.g. their model value will be a string not a number and Angular
-   *     will not take `min`/`max`/`step` attributes and properties into account).
-   *   </p><br />
-   *   <p>
-   *     **Note:** From v1.6.x onwards, the support for `input[range]` will be always enabled and
-   *     the `ng-input-range` attribute will have no effect.
-   *   </p><br />
-   *   <p>
-   *     This documentation page refers to elements which have the built-in support enabled; i.e.
-   *     elements _with_ the `ng-input-range` attribute.
-   *   </p>
-   * </div>
-   *
    * The model for the range input must always be a `Number`.
    *
    * IE9 and other browsers that do not support the `range` type fall back
@@ -24258,36 +26359,34 @@ var inputType = {
    * See the [HTML Spec on input[type=range]](https://www.w3.org/TR/html5/forms.html#range-state-(type=range))
    * for more info.
    *
-   * This has the following consequences for Angular:
+   * This has the following consequences for AngularJS:
    *
    * Since the element value should always reflect the current model value, a range input
    * will set the bound ngModel expression to the value that the browser has set for the
-   * input element. For example, in the following input `<input type="range" ng-input-range ng-model="model.value">`,
+   * input element. For example, in the following input `<input type="range" ng-model="model.value">`,
    * if the application sets `model.value = null`, the browser will set the input to `'50'`.
-   * Angular will then set the model to `50`, to prevent input and model value being out of sync.
+   * AngularJS will then set the model to `50`, to prevent input and model value being out of sync.
    *
    * That means the model for range will immediately be set to `50` after `ngModel` has been
    * initialized. It also means a range input can never have the required error.
    *
    * This does not only affect changes to the model value, but also to the values of the `min`,
    * `max`, and `step` attributes. When these change in a way that will cause the browser to modify
-   * the input value, Angular will also update the model value.
+   * the input value, AngularJS will also update the model value.
    *
    * Automatic value adjustment also means that a range input element can never have the `required`,
    * `min`, or `max` errors.
    *
    * However, `step` is currently only fully implemented by Firefox. Other browsers have problems
    * when the step value changes dynamically - they do not adjust the element value correctly, but
-   * instead may set the `stepMismatch` error. If that's the case, the Angular will set the `step`
+   * instead may set the `stepMismatch` error. If that's the case, the AngularJS will set the `step`
    * error on the input, and set the model to `undefined`.
    *
-   * Note that `input[range]` is not compatible with `ngMax`, `ngMin`, and `ngStep`, because they do
+   * Note that `input[range]` is not compatible with`ngMax`, `ngMin`, and `ngStep`, because they do
    * not set the `min` and `max` attributes, which means that the browser won't automatically adjust
    * the input value based on their values, and will always assume min = 0, max = 100, and step = 1.
    *
-   * @param           ngInputRange The presense of this attribute enables the built-in support for
-   *                  `input[range]`.
-   * @param {string}  ngModel Assignable angular expression to data-bind to.
+   * @param {string}  ngModel Assignable AngularJS expression to data-bind to.
    * @param {string=} name Property name of the form under which the control is published.
    * @param {string=} min Sets the `min` validation to ensure that the value entered is greater
    *                  than `min`. Can be interpolated.
@@ -24295,8 +26394,8 @@ var inputType = {
    *                  Can be interpolated.
    * @param {string=} step Sets the `step` validation to ensure that the value entered matches the `step`
    *                  Can be interpolated.
-   * @param {string=} ngChange Angular expression to be executed when the ngModel value changes due
-   *                  to user interaction with the input element.
+   * @param {expression=} ngChange AngularJS expression to be executed when the ngModel value changes due
+   *                      to user interaction with the input element.
    * @param {expression=} ngChecked If the expression is truthy, then the `checked` attribute will be set on the
    *                      element. **Note** : `ngChecked` should not be used alongside `ngModel`.
    *                      Checkout {@link ng.directive:ngChecked ngChecked} for usage.
@@ -24314,7 +26413,7 @@ var inputType = {
           </script>
           <form name="myForm" ng-controller="ExampleController">
 
-            Model as range: <input type="range" ng-input-range name="range" ng-model="value" min="{{min}}"  max="{{max}}">
+            Model as range: <input type="range" name="range" ng-model="value" min="{{min}}"  max="{{max}}">
             <hr>
             Model as number: <input type="number" ng-model="value"><br>
             Min: <input type="number" ng-model="min"><br>
@@ -24340,7 +26439,7 @@ var inputType = {
               }]);
           </script>
           <form name="myForm" ng-controller="ExampleController">
-            Model as range: <input type="range" ng-input-range name="range" ng-model="value" ng-min="min" ng-max="max">
+            Model as range: <input type="range" name="range" ng-model="value" ng-min="min" ng-max="max">
             <hr>
             Model as number: <input type="number" ng-model="value"><br>
             Min: <input type="number" ng-model="min"><br>
@@ -24362,11 +26461,11 @@ var inputType = {
    * @description
    * HTML checkbox.
    *
-   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string} ngModel Assignable AngularJS expression to data-bind to.
    * @param {string=} name Property name of the form under which the control is published.
    * @param {expression=} ngTrueValue The value to which the expression should be set when selected.
    * @param {expression=} ngFalseValue The value to which the expression should be set when not selected.
-   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
    *    interaction with the input element.
    *
    * @example
@@ -24443,6 +26542,16 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
       composing = true;
     });
 
+    // Support: IE9+
+    element.on('compositionupdate', function(ev) {
+      // End composition when ev.data is empty string on 'compositionupdate' event.
+      // When the input de-focusses (e.g. by clicking away), IE triggers 'compositionupdate'
+      // instead of 'compositionend'.
+      if (isUndefined(ev.data) || ev.data === '') {
+        composing = false;
+      }
+    });
+
     element.on('compositionend', function() {
       composing = false;
       listener();
@@ -24501,9 +26610,9 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
       deferListener(event, this, this.value);
     });
 
-    // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it
+    // if user modifies input value using context menu in IE, we need "paste", "cut" and "drop" events to catch it
     if ($sniffer.hasEvent('paste')) {
-      element.on('paste cut', deferListener);
+      element.on('paste cut drop', deferListener);
     }
   }
 
@@ -24573,7 +26682,7 @@ function weekParser(isoWeek, existingDate) {
 }
 
 function createDateParser(regexp, mapping) {
-  return function(iso, date) {
+  return function(iso, previousDate) {
     var parts, map;
 
     if (isDate(iso)) {
@@ -24595,15 +26704,15 @@ function createDateParser(regexp, mapping) {
 
       if (parts) {
         parts.shift();
-        if (date) {
+        if (previousDate) {
           map = {
-            yyyy: date.getFullYear(),
-            MM: date.getMonth() + 1,
-            dd: date.getDate(),
-            HH: date.getHours(),
-            mm: date.getMinutes(),
-            ss: date.getSeconds(),
-            sss: date.getMilliseconds() / 1000
+            yyyy: previousDate.getFullYear(),
+            MM: previousDate.getMonth() + 1,
+            dd: previousDate.getDate(),
+            HH: previousDate.getHours(),
+            mm: previousDate.getMinutes(),
+            ss: previousDate.getSeconds(),
+            sss: previousDate.getMilliseconds() / 1000
           };
         } else {
           map = { yyyy: 1970, MM: 1, dd: 1, HH: 0, mm: 0, ss: 0, sss: 0 };
@@ -24614,7 +26723,15 @@ function createDateParser(regexp, mapping) {
             map[mapping[index]] = +part;
           }
         });
-        return new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0);
+
+        var date = new Date(map.yyyy, map.MM - 1, map.dd, map.HH, map.mm, map.ss || 0, map.sss * 1000 || 0);
+        if (map.yyyy < 100) {
+          // In the constructor, 2-digit years map to 1900-1999.
+          // Use `setFullYear()` to set the correct year.
+          date.setFullYear(map.yyyy);
+        }
+
+        return date;
       }
     }
 
@@ -24623,25 +26740,24 @@ function createDateParser(regexp, mapping) {
 }
 
 function createDateInputType(type, regexp, parseDate, format) {
-  return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter) {
-    badInputChecker(scope, element, attr, ctrl);
+  return function dynamicDateInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {
+    badInputChecker(scope, element, attr, ctrl, type);
     baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
-    var timezone = ctrl && ctrl.$options && ctrl.$options.timezone;
+
+    var isTimeType = type === 'time' || type === 'datetimelocal';
     var previousDate;
+    var previousTimezone;
 
-    ctrl.$$parserName = type;
     ctrl.$parsers.push(function(value) {
       if (ctrl.$isEmpty(value)) return null;
+
       if (regexp.test(value)) {
         // Note: We cannot read ctrl.$modelValue, as there might be a different
         // parser/formatter in the processing chain so that the model
         // contains some different data format!
-        var parsedDate = parseDate(value, previousDate);
-        if (timezone) {
-          parsedDate = convertTimezoneToLocal(parsedDate, timezone);
-        }
-        return parsedDate;
+        return parseDateAndConvertTimeZoneToLocal(value, previousDate);
       }
+      ctrl.$$parserName = type;
       return undefined;
     });
 
@@ -24651,35 +26767,50 @@ function createDateInputType(type, regexp, parseDate, format) {
       }
       if (isValidDate(value)) {
         previousDate = value;
-        if (previousDate && timezone) {
+        var timezone = ctrl.$options.getOption('timezone');
+
+        if (timezone) {
+          previousTimezone = timezone;
           previousDate = convertTimezoneToLocal(previousDate, timezone, true);
         }
-        return $filter('date')(value, format, timezone);
+
+        return formatter(value, timezone);
       } else {
         previousDate = null;
+        previousTimezone = null;
         return '';
       }
     });
 
     if (isDefined(attr.min) || attr.ngMin) {
-      var minVal;
+      var minVal = attr.min || $parse(attr.ngMin)(scope);
+      var parsedMinVal = parseObservedDateValue(minVal);
+
       ctrl.$validators.min = function(value) {
-        return !isValidDate(value) || isUndefined(minVal) || parseDate(value) >= minVal;
+        return !isValidDate(value) || isUndefined(parsedMinVal) || parseDate(value) >= parsedMinVal;
       };
       attr.$observe('min', function(val) {
-        minVal = parseObservedDateValue(val);
-        ctrl.$validate();
+        if (val !== minVal) {
+          parsedMinVal = parseObservedDateValue(val);
+          minVal = val;
+          ctrl.$validate();
+        }
       });
     }
 
     if (isDefined(attr.max) || attr.ngMax) {
-      var maxVal;
+      var maxVal = attr.max || $parse(attr.ngMax)(scope);
+      var parsedMaxVal = parseObservedDateValue(maxVal);
+
       ctrl.$validators.max = function(value) {
-        return !isValidDate(value) || isUndefined(maxVal) || parseDate(value) <= maxVal;
+        return !isValidDate(value) || isUndefined(parsedMaxVal) || parseDate(value) <= parsedMaxVal;
       };
       attr.$observe('max', function(val) {
-        maxVal = parseObservedDateValue(val);
-        ctrl.$validate();
+        if (val !== maxVal) {
+          parsedMaxVal = parseObservedDateValue(val);
+          maxVal = val;
+          ctrl.$validate();
+        }
       });
     }
 
@@ -24689,27 +26820,68 @@ function createDateInputType(type, regexp, parseDate, format) {
     }
 
     function parseObservedDateValue(val) {
-      return isDefined(val) && !isDate(val) ? parseDate(val) || undefined : val;
+      return isDefined(val) && !isDate(val) ? parseDateAndConvertTimeZoneToLocal(val) || undefined : val;
+    }
+
+    function parseDateAndConvertTimeZoneToLocal(value, previousDate) {
+      var timezone = ctrl.$options.getOption('timezone');
+
+      if (previousTimezone && previousTimezone !== timezone) {
+        // If the timezone has changed, adjust the previousDate to the default timezone
+        // so that the new date is converted with the correct timezone offset
+        previousDate = addDateMinutes(previousDate, timezoneToOffset(previousTimezone));
+      }
+
+      var parsedDate = parseDate(value, previousDate);
+
+      if (!isNaN(parsedDate) && timezone) {
+        parsedDate = convertTimezoneToLocal(parsedDate, timezone);
+      }
+      return parsedDate;
+    }
+
+    function formatter(value, timezone) {
+      var targetFormat = format;
+
+      if (isTimeType && isString(ctrl.$options.getOption('timeSecondsFormat'))) {
+        targetFormat = format
+          .replace('ss.sss', ctrl.$options.getOption('timeSecondsFormat'))
+          .replace(/:$/, '');
+      }
+
+      var formatted =  $filter('date')(value, targetFormat, timezone);
+
+      if (isTimeType && ctrl.$options.getOption('timeStripZeroSeconds')) {
+        formatted = formatted.replace(/(?::00)?(?:\.000)?$/, '');
+      }
+
+      return formatted;
     }
   };
 }
 
-function badInputChecker(scope, element, attr, ctrl) {
+function badInputChecker(scope, element, attr, ctrl, parserName) {
   var node = element[0];
   var nativeValidation = ctrl.$$hasNativeValidators = isObject(node.validity);
   if (nativeValidation) {
     ctrl.$parsers.push(function(value) {
       var validity = element.prop(VALIDITY_STATE_PROPERTY) || {};
-      return validity.badInput || validity.typeMismatch ? undefined : value;
+      if (validity.badInput || validity.typeMismatch) {
+        ctrl.$$parserName = parserName;
+        return undefined;
+      }
+
+      return value;
     });
   }
 }
 
 function numberFormatterParser(ctrl) {
-  ctrl.$$parserName = 'number';
   ctrl.$parsers.push(function(value) {
     if (ctrl.$isEmpty(value))      return null;
     if (NUMBER_REGEXP.test(value)) return parseFloat(value);
+
+    ctrl.$$parserName = 'number';
     return undefined;
   });
 
@@ -24764,55 +26936,99 @@ function isValidForStep(viewValue, stepBase, step) {
   // and `viewValue` is expected to be a valid stringified number.
   var value = Number(viewValue);
 
+  var isNonIntegerValue = !isNumberInteger(value);
+  var isNonIntegerStepBase = !isNumberInteger(stepBase);
+  var isNonIntegerStep = !isNumberInteger(step);
+
   // Due to limitations in Floating Point Arithmetic (e.g. `0.3 - 0.2 !== 0.1` or
   // `0.5 % 0.1 !== 0`), we need to convert all numbers to integers.
-  if (!isNumberInteger(value) || !isNumberInteger(stepBase) || !isNumberInteger(step)) {
-    var decimalCount = Math.max(countDecimals(value), countDecimals(stepBase), countDecimals(step));
+  if (isNonIntegerValue || isNonIntegerStepBase || isNonIntegerStep) {
+    var valueDecimals = isNonIntegerValue ? countDecimals(value) : 0;
+    var stepBaseDecimals = isNonIntegerStepBase ? countDecimals(stepBase) : 0;
+    var stepDecimals = isNonIntegerStep ? countDecimals(step) : 0;
+
+    var decimalCount = Math.max(valueDecimals, stepBaseDecimals, stepDecimals);
     var multiplier = Math.pow(10, decimalCount);
 
     value = value * multiplier;
     stepBase = stepBase * multiplier;
     step = step * multiplier;
+
+    if (isNonIntegerValue) value = Math.round(value);
+    if (isNonIntegerStepBase) stepBase = Math.round(stepBase);
+    if (isNonIntegerStep) step = Math.round(step);
   }
 
   return (value - stepBase) % step === 0;
 }
 
-function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
-  badInputChecker(scope, element, attr, ctrl);
-  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
+function numberInputType(scope, element, attr, ctrl, $sniffer, $browser, $filter, $parse) {
+  badInputChecker(scope, element, attr, ctrl, 'number');
   numberFormatterParser(ctrl);
+  baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
 
-  var minVal;
-  var maxVal;
+  var parsedMinVal;
 
   if (isDefined(attr.min) || attr.ngMin) {
-    ctrl.$validators.min = function(value) {
-      return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal;
+    var minVal = attr.min || $parse(attr.ngMin)(scope);
+    parsedMinVal = parseNumberAttrVal(minVal);
+
+    ctrl.$validators.min = function(modelValue, viewValue) {
+      return ctrl.$isEmpty(viewValue) || isUndefined(parsedMinVal) || viewValue >= parsedMinVal;
     };
 
     attr.$observe('min', function(val) {
-      minVal = parseNumberAttrVal(val);
-      // TODO(matsko): implement validateLater to reduce number of validations
-      ctrl.$validate();
+      if (val !== minVal) {
+        parsedMinVal = parseNumberAttrVal(val);
+        minVal = val;
+        // TODO(matsko): implement validateLater to reduce number of validations
+        ctrl.$validate();
+      }
     });
   }
 
   if (isDefined(attr.max) || attr.ngMax) {
-    ctrl.$validators.max = function(value) {
-      return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal;
+    var maxVal = attr.max || $parse(attr.ngMax)(scope);
+    var parsedMaxVal = parseNumberAttrVal(maxVal);
+
+    ctrl.$validators.max = function(modelValue, viewValue) {
+      return ctrl.$isEmpty(viewValue) || isUndefined(parsedMaxVal) || viewValue <= parsedMaxVal;
     };
 
     attr.$observe('max', function(val) {
-      maxVal = parseNumberAttrVal(val);
+      if (val !== maxVal) {
+        parsedMaxVal = parseNumberAttrVal(val);
+        maxVal = val;
+        // TODO(matsko): implement validateLater to reduce number of validations
+        ctrl.$validate();
+      }
+    });
+  }
+
+  if (isDefined(attr.step) || attr.ngStep) {
+    var stepVal = attr.step || $parse(attr.ngStep)(scope);
+    var parsedStepVal = parseNumberAttrVal(stepVal);
+
+    ctrl.$validators.step = function(modelValue, viewValue) {
+      return ctrl.$isEmpty(viewValue) || isUndefined(parsedStepVal) ||
+        isValidForStep(viewValue, parsedMinVal || 0, parsedStepVal);
+    };
+
+    attr.$observe('step', function(val) {
       // TODO(matsko): implement validateLater to reduce number of validations
-      ctrl.$validate();
+      if (val !== stepVal) {
+        parsedStepVal = parseNumberAttrVal(val);
+        stepVal = val;
+        ctrl.$validate();
+      }
+
     });
+
   }
 }
 
 function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {
-  badInputChecker(scope, element, attr, ctrl);
+  badInputChecker(scope, element, attr, ctrl, 'range');
   numberFormatterParser(ctrl);
   baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
 
@@ -24837,6 +27053,8 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {
     originalRender;
 
   if (hasMinAttr) {
+    minVal = parseNumberAttrVal(attr.min);
+
     ctrl.$validators.min = supportsRange ?
       // Since all browsers set the input to a valid value, we don't need to check validity
       function noopMinValidator() { return true; } :
@@ -24849,6 +27067,8 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {
   }
 
   if (hasMaxAttr) {
+    maxVal = parseNumberAttrVal(attr.max);
+
     ctrl.$validators.max = supportsRange ?
       // Since all browsers set the input to a valid value, we don't need to check validity
       function noopMaxValidator() { return true; } :
@@ -24861,6 +27081,8 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {
   }
 
   if (hasStepAttr) {
+    stepVal = parseNumberAttrVal(attr.step);
+
     ctrl.$validators.step = supportsRange ?
       function nativeStepValidator() {
         // Currently, only FF implements the spec on step change correctly (i.e. adjusting the
@@ -24882,7 +27104,13 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {
     // attribute value when the input is first rendered, so that the browser can adjust the
     // input value based on the min/max value
     element.attr(htmlAttrName, attr[htmlAttrName]);
-    attr.$observe(htmlAttrName, changeFn);
+    var oldVal = attr[htmlAttrName];
+    attr.$observe(htmlAttrName, function wrappedObserver(val) {
+      if (val !== oldVal) {
+        oldVal = val;
+        changeFn(val);
+      }
+    });
   }
 
   function minChange(val) {
@@ -24936,11 +27164,11 @@ function rangeInputType(scope, element, attr, ctrl, $sniffer, $browser) {
     }
 
     // Some browsers don't adjust the input value correctly, but set the stepMismatch error
-    if (supportsRange && ctrl.$viewValue !== element.val()) {
-      ctrl.$setViewValue(element.val());
-    } else {
+    if (!supportsRange) {
       // TODO(matsko): implement validateLater to reduce number of validations
       ctrl.$validate();
+    } else if (ctrl.$viewValue !== element.val()) {
+      ctrl.$setViewValue(element.val());
     }
   }
 }
@@ -24951,7 +27179,6 @@ function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
   baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
   stringBasedInputType(ctrl);
 
-  ctrl.$$parserName = 'url';
   ctrl.$validators.url = function(modelValue, viewValue) {
     var value = modelValue || viewValue;
     return ctrl.$isEmpty(value) || URL_REGEXP.test(value);
@@ -24964,7 +27191,6 @@ function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
   baseInputType(scope, element, attr, ctrl, $sniffer, $browser);
   stringBasedInputType(ctrl);
 
-  ctrl.$$parserName = 'email';
   ctrl.$validators.email = function(modelValue, viewValue) {
     var value = modelValue || viewValue;
     return ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value);
@@ -24972,24 +27198,31 @@ function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
 }
 
 function radioInputType(scope, element, attr, ctrl) {
+  var doTrim = !attr.ngTrim || trim(attr.ngTrim) !== 'false';
   // make the name unique, if not defined
   if (isUndefined(attr.name)) {
     element.attr('name', nextUid());
   }
 
   var listener = function(ev) {
+    var value;
     if (element[0].checked) {
-      ctrl.$setViewValue(attr.value, ev && ev.type);
+      value = attr.value;
+      if (doTrim) {
+        value = trim(value);
+      }
+      ctrl.$setViewValue(value, ev && ev.type);
     }
   };
 
-  element.on('click', listener);
+  element.on('change', listener);
 
   ctrl.$render = function() {
     var value = attr.value;
-    // We generally use strict comparison. This is behavior we cannot change without a BC.
-    // eslint-disable-next-line eqeqeq
-    element[0].checked = (value == ctrl.$viewValue);
+    if (doTrim) {
+      value = trim(value);
+    }
+    element[0].checked = (value === ctrl.$viewValue);
   };
 
   attr.$observe('value', ctrl.$render);
@@ -25016,7 +27249,7 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
     ctrl.$setViewValue(element[0].checked, ev && ev.type);
   };
 
-  element.on('click', listener);
+  element.on('change', listener);
 
   ctrl.$render = function() {
     element[0].checked = ctrl.$viewValue;
@@ -25045,11 +27278,11 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
  * @restrict E
  *
  * @description
- * HTML textarea element control with angular data-binding. The data-binding and validation
+ * HTML textarea element control with AngularJS data-binding. The data-binding and validation
  * properties of this element are exactly the same as those of the
  * {@link ng.directive:input input element}.
  *
- * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string} ngModel Assignable AngularJS expression to data-bind to.
  * @param {string=} name Property name of the form under which the control is published.
  * @param {string=} required Sets `required` validation error key if the value is not entered.
  * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
@@ -25061,7 +27294,7 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
  *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any
  *    length.
  * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}
- *    does not match a RegExp found by evaluating the Angular expression given in the attribute value.
+ *    does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.
  *    If the expression evaluates to a RegExp object, then this is used directly.
  *    If the expression evaluates to a string, then it will be converted to a RegExp
  *    after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to
@@ -25069,15 +27302,15 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
  *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to
  *    start at the index of the last search's match, thus not taking the whole input value into
  *    account.
- * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
  *    interaction with the input element.
- * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
+ * @param {boolean=} [ngTrim=true] If set to false AngularJS will not automatically trim the input.
  *
  * @knownIssue
  *
  * When specifying the `placeholder` attribute of `<textarea>`, Internet Explorer will temporarily
  * insert the placeholder value as the textarea's content. If the placeholder value contains
- * interpolation (`{{ ... }}`), an error will be logged in the console when Angular tries to update
+ * interpolation (`{{ ... }}`), an error will be logged in the console when AngularJS tries to update
  * the value of the by-then-removed text node. This doesn't affect the functionality of the
  * textarea, but can be undesirable.
  *
@@ -25104,7 +27337,7 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
  * Specifically, data binding and event handling via `ng-model` is unsupported for `input[file]`.
  * </div>
  *
- * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string} ngModel Assignable AngularJS expression to data-bind to.
  * @param {string=} name Property name of the form under which the control is published.
  * @param {string=} required Sets `required` validation error key if the value is not entered.
  * @param {boolean=} ngRequired Sets `required` attribute if set to true
@@ -25114,7 +27347,7 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
  *    maxlength. Setting the attribute to a negative or non-numeric value, allows view values of any
  *    length.
  * @param {string=} ngPattern Sets `pattern` validation error key if the ngModel {@link ngModel.NgModelController#$viewValue $viewValue}
- *    value does not match a RegExp found by evaluating the Angular expression given in the attribute value.
+ *    value does not match a RegExp found by evaluating the AngularJS expression given in the attribute value.
  *    If the expression evaluates to a RegExp object, then this is used directly.
  *    If the expression evaluates to a string, then it will be converted to a RegExp
  *    after wrapping it in `^` and `$` characters. For instance, `"abc"` will be converted to
@@ -25122,9 +27355,9 @@ function checkboxInputType(scope, element, attr, ctrl, $sniffer, $browser, $filt
  *    **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to
  *    start at the index of the last search's match, thus not taking the whole input value into
  *    account.
- * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ * @param {string=} ngChange AngularJS expression to be executed when input changes due to user
  *    interaction with the input element.
- * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
+ * @param {boolean=} [ngTrim=true] If set to false AngularJS will not automatically trim the input.
  *    This parameter is ignored for input[type=password] controls, which will never trim the
  *    input.
  *
@@ -25234,11 +27467,7 @@ var inputDirective = ['$browser', '$sniffer', '$filter', '$parse',
     link: {
       pre: function(scope, element, attr, ctrls) {
         if (ctrls[0]) {
-          var type = lowercase(attr.type);
-          if ((type === 'range') && !attr.hasOwnProperty('ngInputRange')) {
-            type = 'text';
-          }
-          (inputType[type] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,
+          (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrls[0], $sniffer,
                                                               $browser, $filter, $parse);
         }
       }
@@ -25247,28 +27476,70 @@ var inputDirective = ['$browser', '$sniffer', '$filter', '$parse',
 }];
 
 
+var hiddenInputBrowserCacheDirective = function() {
+  var valueProperty = {
+    configurable: true,
+    enumerable: false,
+    get: function() {
+      return this.getAttribute('value') || '';
+    },
+    set: function(val) {
+      this.setAttribute('value', val);
+    }
+  };
+
+  return {
+    restrict: 'E',
+    priority: 200,
+    compile: function(_, attr) {
+      if (lowercase(attr.type) !== 'hidden') {
+        return;
+      }
+
+      return {
+        pre: function(scope, element, attr, ctrls) {
+          var node = element[0];
+
+          // Support: Edge
+          // Moving the DOM around prevents autofillling
+          if (node.parentNode) {
+            node.parentNode.insertBefore(node, node.nextSibling);
+          }
+
+          // Support: FF, IE
+          // Avoiding direct assignment to .value prevents autofillling
+          if (Object.defineProperty) {
+            Object.defineProperty(node, 'value', valueProperty);
+          }
+        }
+      };
+    }
+  };
+};
+
+
 
 var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
 /**
  * @ngdoc directive
  * @name ngValue
+ * @restrict A
+ * @priority 100
  *
  * @description
- * Binds the given expression to the value of `<option>` or {@link input[radio] `input[radio]`},
- * so that when the element is selected, the {@link ngModel `ngModel`} of that element is set to
- * the bound value.
+ * Binds the given expression to the value of the element.
  *
- * `ngValue` is useful when dynamically generating lists of radio buttons using
- * {@link ngRepeat `ngRepeat`}, as shown below.
+ * It is mainly used on {@link input[radio] `input[radio]`} and option elements,
+ * so that when the element is selected, the {@link ngModel `ngModel`} of that element (or its
+ * {@link select `select`} parent element) is set to the bound value. It is especially useful
+ * for dynamically generated lists using {@link ngRepeat `ngRepeat`}, as shown below.
  *
- * Likewise, `ngValue` can be used to generate `<option>` elements for
- * the {@link select `select`} element. In that case however, only strings are supported
- * for the `value `attribute, so the resulting `ngModel` will always be a string.
- * Support for `select` models with non-string values is available via `ngOptions`.
+ * It can also be used to achieve one-way binding of a given expression to an input element
+ * such as an `input[text]` or a `textarea`, when that element does not use ngModel.
  *
- * @element input
- * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute
- *   of the `input` element
+ * @element ANY
+ * @param {string=} ngValue AngularJS expression, whose value will be bound to the `value` attribute
+ * and `value` property of the element.
  *
  * @example
     <example name="ngValue-directive" module="valueExample">
@@ -25307,18 +27578,33 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
     </example>
  */
 var ngValueDirective = function() {
-  return {
-    restrict: 'A',
-    priority: 100,
+  /**
+   *  inputs use the value attribute as their default value if the value property is not set.
+   *  Once the value property has been set (by adding input), it will not react to changes to
+   *  the value attribute anymore. Setting both attribute and property fixes this behavior, and
+   *  makes it possible to use ngValue as a sort of one-way bind.
+   */
+  function updateElementValue(element, attr, value) {
+    // Support: IE9 only
+    // In IE9 values are converted to string (e.g. `input.value = null` results in `input.value === 'null'`).
+    var propValue = isDefined(value) ? value : (msie === 9) ? '' : null;
+    element.prop('value', propValue);
+    attr.$set('value', value);
+  }
+
+  return {
+    restrict: 'A',
+    priority: 100,
     compile: function(tpl, tplAttr) {
       if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
         return function ngValueConstantLink(scope, elm, attr) {
-          attr.$set('value', scope.$eval(attr.ngValue));
+          var value = scope.$eval(attr.ngValue);
+          updateElementValue(elm, attr, value);
         };
       } else {
         return function ngValueLink(scope, elm, attr) {
           scope.$watch(attr.ngValue, function valueWatchAction(value) {
-            attr.$set('value', value);
+            updateElementValue(elm, attr, value);
           });
         };
       }
@@ -25332,7 +27618,7 @@ var ngValueDirective = function() {
  * @restrict AC
  *
  * @description
- * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element
+ * The `ngBind` attribute tells AngularJS to replace the text content of the specified HTML element
  * with the value of a given expression, and to update the text content when the value of that
  * expression changes.
  *
@@ -25340,7 +27626,7 @@ var ngValueDirective = function() {
  * `{{ expression }}` which is similar but less verbose.
  *
  * It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily
- * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
+ * displayed by the browser in its raw state before AngularJS compiles it. Since `ngBind` is an
  * element attribute, it makes the bindings invisible to the user while the page is loading.
  *
  * An alternative solution to this problem would be using the
@@ -25386,7 +27672,7 @@ var ngBindDirective = ['$compile', function($compile) {
         $compile.$$addBindingInfo(element, attr.ngBind);
         element = element[0];
         scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
-          element.textContent = isUndefined(value) ? '' : value;
+          element.textContent = stringify(value);
         });
       };
     }
@@ -25470,7 +27756,7 @@ var ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate
  * Evaluates the expression and inserts the resulting HTML into the element in a secure way. By default,
  * the resulting HTML content will be sanitized using the {@link ngSanitize.$sanitize $sanitize} service.
  * To utilize this functionality, ensure that `$sanitize` is available, for example, by including {@link
- * ngSanitize} in your module's dependencies (not in core Angular). In order to use {@link ngSanitize}
+ * ngSanitize} in your module's dependencies (not in core AngularJS). In order to use {@link ngSanitize}
  * in your module's dependencies, you need to include "angular-sanitize.js" in your application.
  *
  * You may also bypass sanitization for values you know are safe. To do so, bind to
@@ -25536,6 +27822,7 @@ var ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse,
 /**
  * @ngdoc directive
  * @name ngChange
+ * @restrict A
  *
  * @description
  * Evaluate the given expression when the user changes the input.
@@ -25554,7 +27841,7 @@ var ngBindHtmlDirective = ['$sce', '$parse', '$compile', function($sce, $parse,
  *
  * Note, this directive requires `ngModel` to be present.
  *
- * @element input
+ * @element ANY
  * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change
  * in input value.
  *
@@ -25618,51 +27905,64 @@ var ngChangeDirective = valueFn({
 
 function classDirective(name, selector) {
   name = 'ngClass' + name;
-  return ['$animate', function($animate) {
+  var indexWatchExpression;
+
+  return ['$parse', function($parse) {
     return {
       restrict: 'AC',
       link: function(scope, element, attr) {
-        var oldVal;
-
-        attr.$observe('class', function(value) {
-          ngClassWatchAction(scope.$eval(attr[name]));
-        });
+        var classCounts = element.data('$classCounts');
+        var oldModulo = true;
+        var oldClassString;
 
+        if (!classCounts) {
+          // Use createMap() to prevent class assumptions involving property
+          // names in Object.prototype
+          classCounts = createMap();
+          element.data('$classCounts', classCounts);
+        }
 
         if (name !== 'ngClass') {
-          scope.$watch('$index', function($index, old$index) {
-            /* eslint-disable no-bitwise */
-            var mod = $index & 1;
-            if (mod !== (old$index & 1)) {
-              var classes = arrayClasses(oldVal);
-              if (mod === selector) {
-                addClasses(classes);
-              } else {
-                removeClasses(classes);
-              }
-            }
-            /* eslint-enable */
-          });
+          if (!indexWatchExpression) {
+            indexWatchExpression = $parse('$index', function moduloTwo($index) {
+              // eslint-disable-next-line no-bitwise
+              return $index & 1;
+            });
+          }
+
+          scope.$watch(indexWatchExpression, ngClassIndexWatchAction);
         }
 
-        scope.$watch(attr[name], ngClassWatchAction, true);
+        scope.$watch($parse(attr[name], toClassString), ngClassWatchAction);
 
-        function addClasses(classes) {
-          var newClasses = digestClassCounts(classes, 1);
-          attr.$addClass(newClasses);
+        function addClasses(classString) {
+          classString = digestClassCounts(split(classString), 1);
+          attr.$addClass(classString);
         }
 
-        function removeClasses(classes) {
-          var newClasses = digestClassCounts(classes, -1);
-          attr.$removeClass(newClasses);
+        function removeClasses(classString) {
+          classString = digestClassCounts(split(classString), -1);
+          attr.$removeClass(classString);
         }
 
-        function digestClassCounts(classes, count) {
-          // Use createMap() to prevent class assumptions involving property
-          // names in Object.prototype
-          var classCounts = element.data('$classCounts') || createMap();
+        function updateClasses(oldClassString, newClassString) {
+          var oldClassArray = split(oldClassString);
+          var newClassArray = split(newClassString);
+
+          var toRemoveArray = arrayDifference(oldClassArray, newClassArray);
+          var toAddArray = arrayDifference(newClassArray, oldClassArray);
+
+          var toRemoveString = digestClassCounts(toRemoveArray, -1);
+          var toAddString = digestClassCounts(toAddArray, 1);
+
+          attr.$addClass(toAddString);
+          attr.$removeClass(toRemoveString);
+        }
+
+        function digestClassCounts(classArray, count) {
           var classesToUpdate = [];
-          forEach(classes, function(className) {
+
+          forEach(classArray, function(className) {
             if (count > 0 || classCounts[className]) {
               classCounts[className] = (classCounts[className] || 0) + count;
               if (classCounts[className] === +(count > 0)) {
@@ -25670,83 +27970,81 @@ function classDirective(name, selector) {
               }
             }
           });
-          element.data('$classCounts', classCounts);
+
           return classesToUpdate.join(' ');
         }
 
-        function updateClasses(oldClasses, newClasses) {
-          var toAdd = arrayDifference(newClasses, oldClasses);
-          var toRemove = arrayDifference(oldClasses, newClasses);
-          toAdd = digestClassCounts(toAdd, 1);
-          toRemove = digestClassCounts(toRemove, -1);
-          if (toAdd && toAdd.length) {
-            $animate.addClass(element, toAdd);
-          }
-          if (toRemove && toRemove.length) {
-            $animate.removeClass(element, toRemove);
+        function ngClassIndexWatchAction(newModulo) {
+          // This watch-action should run before the `ngClassWatchAction()`, thus it
+          // adds/removes `oldClassString`. If the `ngClass` expression has changed as well, the
+          // `ngClassWatchAction()` will update the classes.
+          if (newModulo === selector) {
+            addClasses(oldClassString);
+          } else {
+            removeClasses(oldClassString);
           }
+
+          oldModulo = newModulo;
         }
 
-        function ngClassWatchAction(newVal) {
-          // eslint-disable-next-line no-bitwise
-          if (selector === true || (scope.$index & 1) === selector) {
-            var newClasses = arrayClasses(newVal || []);
-            if (!oldVal) {
-              addClasses(newClasses);
-            } else if (!equals(newVal,oldVal)) {
-              var oldClasses = arrayClasses(oldVal);
-              updateClasses(oldClasses, newClasses);
-            }
-          }
-          if (isArray(newVal)) {
-            oldVal = newVal.map(function(v) { return shallowCopy(v); });
-          } else {
-            oldVal = shallowCopy(newVal);
+        function ngClassWatchAction(newClassString) {
+          if (oldModulo === selector) {
+            updateClasses(oldClassString, newClassString);
           }
+
+          oldClassString = newClassString;
         }
       }
     };
+  }];
 
-    function arrayDifference(tokens1, tokens2) {
-      var values = [];
+  // Helpers
+  function arrayDifference(tokens1, tokens2) {
+    if (!tokens1 || !tokens1.length) return [];
+    if (!tokens2 || !tokens2.length) return tokens1;
 
-      outer:
-      for (var i = 0; i < tokens1.length; i++) {
-        var token = tokens1[i];
-        for (var j = 0; j < tokens2.length; j++) {
-          if (token === tokens2[j]) continue outer;
-        }
-        values.push(token);
+    var values = [];
+
+    outer:
+    for (var i = 0; i < tokens1.length; i++) {
+      var token = tokens1[i];
+      for (var j = 0; j < tokens2.length; j++) {
+        if (token === tokens2[j]) continue outer;
       }
-      return values;
+      values.push(token);
     }
 
-    function arrayClasses(classVal) {
-      var classes = [];
-      if (isArray(classVal)) {
-        forEach(classVal, function(v) {
-          classes = classes.concat(arrayClasses(v));
-        });
-        return classes;
-      } else if (isString(classVal)) {
-        return classVal.split(' ');
-      } else if (isObject(classVal)) {
-        forEach(classVal, function(v, k) {
-          if (v) {
-            classes = classes.concat(k.split(' '));
-          }
-        });
-        return classes;
-      }
-      return classVal;
+    return values;
+  }
+
+  function split(classString) {
+    return classString && classString.split(' ');
+  }
+
+  function toClassString(classValue) {
+    if (!classValue) return classValue;
+
+    var classString = classValue;
+
+    if (isArray(classValue)) {
+      classString = classValue.map(toClassString).join(' ');
+    } else if (isObject(classValue)) {
+      classString = Object.keys(classValue).
+        filter(function(key) { return classValue[key]; }).
+        join(' ');
+    } else if (!isString(classValue)) {
+      classString = classValue + '';
     }
-  }];
+
+    return classString;
+  }
 }
 
 /**
  * @ngdoc directive
  * @name ngClass
  * @restrict AC
+ * @element ANY
  *
  * @description
  * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding
@@ -25781,15 +28079,23 @@ function classDirective(name, selector) {
  * |----------------------------------|-------------------------------------|
  * | {@link ng.$animate#addClass addClass}       | just before the class is applied to the element   |
  * | {@link ng.$animate#removeClass removeClass} | just before the class is removed from the element |
+ * | {@link ng.$animate#setClass setClass} | just before classes are added and classes are removed from the element at the same time |
+ *
+ * ### ngClass and pre-existing CSS3 Transitions/Animations
+   The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.
+   Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder
+   any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure
+   to view the step by step details of {@link $animate#addClass $animate.addClass} and
+   {@link $animate#removeClass $animate.removeClass}.
  *
- * @element ANY
  * @param {expression} ngClass {@link guide/expression Expression} to eval. The result
  *   of the evaluation can be a string representing space delimited class
  *   names, an array, or a map of class names to boolean values. In the case of a map, the
  *   names of the properties whose values are truthy will be added as css classes to the
  *   element.
  *
- * @example Example that demonstrates basic bindings via ngClass directive.
+ * @example
+ * ### Basic
    <example name="ng-class">
      <file name="index.html">
        <p ng-class="{strike: deleted, bold: important, 'has-error': error}">Map Syntax Example</p>
@@ -25879,7 +28185,8 @@ function classDirective(name, selector) {
      </file>
    </example>
 
-   ## Animations
+   @example
+   ### Animations
 
    The example below demonstrates how to perform animations using ngClass.
 
@@ -25917,14 +28224,6 @@ function classDirective(name, selector) {
        });
      </file>
    </example>
-
-
-   ## ngClass and pre-existing CSS3 Transitions/Animations
-   The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.
-   Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder
-   any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure
-   to view the step by step details of {@link $animate#addClass $animate.addClass} and
-   {@link $animate#removeClass $animate.removeClass}.
  */
 var ngClassDirective = classDirective('', true);
 
@@ -25941,6 +28240,12 @@ var ngClassDirective = classDirective('', true);
  * This directive can be applied only within the scope of an
  * {@link ng.directive:ngRepeat ngRepeat}.
  *
+ * @animations
+ * | Animation                        | Occurs                              |
+ * |----------------------------------|-------------------------------------|
+ * | {@link ng.$animate#addClass addClass}       | just before the class is applied to the element   |
+ * | {@link ng.$animate#removeClass removeClass} | just before the class is removed from the element |
+ *
  * @element ANY
  * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result
  *   of the evaluation can be a string representing space delimited class names or an array.
@@ -25973,6 +28278,62 @@ var ngClassDirective = classDirective('', true);
        });
      </file>
    </example>
+ *
+ * <hr />
+ * @example
+ * An example on how to implement animations using `ngClassOdd`:
+ *
+   <example module="ngAnimate" deps="angular-animate.js" animations="true" name="ng-class-odd-animate">
+     <file name="index.html">
+       <div ng-init="items=['Item 3', 'Item 2', 'Item 1', 'Item 0']">
+         <button ng-click="items.unshift('Item ' + items.length)">Add item</button>
+         <hr />
+         <table>
+           <tr ng-repeat="item in items" ng-class-odd="'odd'">
+             <td>{{ item }}</td>
+           </tr>
+         </table>
+       </div>
+     </file>
+     <file name="style.css">
+       .odd {
+         background: rgba(255, 255, 0, 0.25);
+       }
+
+       .odd-add, .odd-remove {
+         transition: 1.5s;
+       }
+     </file>
+     <file name="protractor.js" type="protractor">
+       it('should add new entries to the beginning of the list', function() {
+         var button = element(by.buttonText('Add item'));
+         var rows = element.all(by.repeater('item in items'));
+
+         expect(rows.count()).toBe(4);
+         expect(rows.get(0).getText()).toBe('Item 3');
+         expect(rows.get(1).getText()).toBe('Item 2');
+
+         button.click();
+
+         expect(rows.count()).toBe(5);
+         expect(rows.get(0).getText()).toBe('Item 4');
+         expect(rows.get(1).getText()).toBe('Item 3');
+       });
+
+       it('should add odd class to odd entries', function() {
+         var button = element(by.buttonText('Add item'));
+         var rows = element.all(by.repeater('item in items'));
+
+         expect(rows.get(0).getAttribute('class')).toMatch(/odd/);
+         expect(rows.get(1).getAttribute('class')).not.toMatch(/odd/);
+
+         button.click();
+
+         expect(rows.get(0).getAttribute('class')).toMatch(/odd/);
+         expect(rows.get(1).getAttribute('class')).not.toMatch(/odd/);
+       });
+     </file>
+   </example>
  */
 var ngClassOddDirective = classDirective('Odd', 0);
 
@@ -25989,6 +28350,12 @@ var ngClassOddDirective = classDirective('Odd', 0);
  * This directive can be applied only within the scope of an
  * {@link ng.directive:ngRepeat ngRepeat}.
  *
+ * @animations
+ * | Animation                        | Occurs                              |
+ * |----------------------------------|-------------------------------------|
+ * | {@link ng.$animate#addClass addClass}       | just before the class is applied to the element   |
+ * | {@link ng.$animate#removeClass removeClass} | just before the class is removed from the element |
+ *
  * @element ANY
  * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The
  *   result of the evaluation can be a string representing space delimited class names or an array.
@@ -26021,6 +28388,62 @@ var ngClassOddDirective = classDirective('Odd', 0);
        });
      </file>
    </example>
+ *
+ * <hr />
+ * @example
+ * An example on how to implement animations using `ngClassEven`:
+ *
+   <example module="ngAnimate" deps="angular-animate.js" animations="true" name="ng-class-even-animate">
+     <file name="index.html">
+       <div ng-init="items=['Item 3', 'Item 2', 'Item 1', 'Item 0']">
+         <button ng-click="items.unshift('Item ' + items.length)">Add item</button>
+         <hr />
+         <table>
+           <tr ng-repeat="item in items" ng-class-even="'even'">
+             <td>{{ item }}</td>
+           </tr>
+         </table>
+       </div>
+     </file>
+     <file name="style.css">
+       .even {
+         background: rgba(255, 255, 0, 0.25);
+       }
+
+       .even-add, .even-remove {
+         transition: 1.5s;
+       }
+     </file>
+     <file name="protractor.js" type="protractor">
+       it('should add new entries to the beginning of the list', function() {
+         var button = element(by.buttonText('Add item'));
+         var rows = element.all(by.repeater('item in items'));
+
+         expect(rows.count()).toBe(4);
+         expect(rows.get(0).getText()).toBe('Item 3');
+         expect(rows.get(1).getText()).toBe('Item 2');
+
+         button.click();
+
+         expect(rows.count()).toBe(5);
+         expect(rows.get(0).getText()).toBe('Item 4');
+         expect(rows.get(1).getText()).toBe('Item 3');
+       });
+
+       it('should add even class to even entries', function() {
+         var button = element(by.buttonText('Add item'));
+         var rows = element.all(by.repeater('item in items'));
+
+         expect(rows.get(0).getAttribute('class')).not.toMatch(/even/);
+         expect(rows.get(1).getAttribute('class')).toMatch(/even/);
+
+         button.click();
+
+         expect(rows.get(0).getAttribute('class')).not.toMatch(/even/);
+         expect(rows.get(1).getAttribute('class')).toMatch(/even/);
+       });
+     </file>
+   </example>
  */
 var ngClassEvenDirective = classDirective('Even', 1);
 
@@ -26030,7 +28453,7 @@ var ngClassEvenDirective = classDirective('Even', 1);
  * @restrict AC
  *
  * @description
- * The `ngCloak` directive is used to prevent the Angular html template from being briefly
+ * The `ngCloak` directive is used to prevent the AngularJS html template from being briefly
  * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this
  * directive to avoid the undesirable flicker effect caused by the html template display.
  *
@@ -26049,7 +28472,7 @@ var ngClassEvenDirective = classDirective('Even', 1);
  * ```
  *
  * When this css rule is loaded by the browser, all html elements (including their children) that
- * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive
+ * are tagged with the `ngCloak` directive are hidden. When AngularJS encounters this directive
  * during the compilation of the template it deletes the `ngCloak` element attribute, making
  * the compiled element visible.
  *
@@ -26114,14 +28537,10 @@ var ngCloakDirective = ngDirective({
  * The controller instance can be published into a scope property by specifying
  * `ng-controller="as propertyName"`.
  *
- * If the current `$controllerProvider` is configured to use globals (via
- * {@link ng.$controllerProvider#allowGlobals `$controllerProvider.allowGlobals()` }), this may
- * also be the name of a globally accessible constructor function (not recommended).
- *
  * @example
  * Here is a simple form for editing user contact information. Adding, removing, clearing, and
  * greeting are methods declared on the controller (see source tab). These methods can
- * easily be called from the angular markup. Any changes to the data are automatically reflected
+ * easily be called from the AngularJS markup. Any changes to the data are automatically reflected
  * in the View without the need for a manual update.
  *
  * Two different declaration styles are included below:
@@ -26131,7 +28550,7 @@ var ngCloakDirective = ngDirective({
  * * one injects `$scope` into the controller:
  * `ng-controller="SettingsController2"`
  *
- * The second option is more common in the Angular community, and is generally used in boilerplates
+ * The second option is more common in the AngularJS community, and is generally used in boilerplates
  * and in this guide. However, there are advantages to binding properties directly to the controller
  * and avoiding scope.
  *
@@ -26328,31 +28747,31 @@ var ngControllerDirective = [function() {
  * @element ANY
  * @description
  *
- * Angular has some features that can conflict with certain restrictions that are applied when using
+ * AngularJS has some features that can conflict with certain restrictions that are applied when using
  * [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) rules.
  *
- * If you intend to implement CSP with these rules then you must tell Angular not to use these
+ * If you intend to implement CSP with these rules then you must tell AngularJS not to use these
  * features.
  *
  * This is necessary when developing things like Google Chrome Extensions or Universal Windows Apps.
  *
  *
- * The following default rules in CSP affect Angular:
+ * The following default rules in CSP affect AngularJS:
  *
  * * The use of `eval()`, `Function(string)` and similar functions to dynamically create and execute
- * code from strings is forbidden. Angular makes use of this in the {@link $parse} service to
- * provide a 30% increase in the speed of evaluating Angular expressions. (This CSP rule can be
+ * code from strings is forbidden. AngularJS makes use of this in the {@link $parse} service to
+ * provide a 30% increase in the speed of evaluating AngularJS expressions. (This CSP rule can be
  * disabled with the CSP keyword `unsafe-eval`, but it is generally not recommended as it would
  * weaken the protections offered by CSP.)
  *
  * * The use of inline resources, such as inline `<script>` and `<style>` elements, are forbidden.
- * This prevents apps from injecting custom styles directly into the document. Angular makes use of
+ * This prevents apps from injecting custom styles directly into the document. AngularJS makes use of
  * this to include some CSS rules (e.g. {@link ngCloak} and {@link ngHide}). To make these
  * directives work when a CSP rule is blocking inline styles, you must link to the `angular-csp.css`
  * in your HTML manually. (This CSP rule can be disabled with the CSP keyword `unsafe-inline`, but
  * it is generally not recommended as it would weaken the protections offered by CSP.)
  *
- * If you do not provide `ngCsp` then Angular tries to autodetect if CSP is blocking dynamic code
+ * If you do not provide `ngCsp` then AngularJS tries to autodetect if CSP is blocking dynamic code
  * creation from strings (e.g., `unsafe-eval` not specified in CSP header) and automatically
  * deactivates this feature in the {@link $parse} service. This autodetection, however, triggers a
  * CSP error to be logged in the console:
@@ -26369,35 +28788,36 @@ var ngControllerDirective = [function() {
  *
  * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*
  *
- * You can specify which of the CSP related Angular features should be deactivated by providing
+ * You can specify which of the CSP related AngularJS features should be deactivated by providing
  * a value for the `ng-csp` attribute. The options are as follows:
  *
- * * no-inline-style: this stops Angular from injecting CSS styles into the DOM
+ * * no-inline-style: this stops AngularJS from injecting CSS styles into the DOM
  *
- * * no-unsafe-eval: this stops Angular from optimizing $parse with unsafe eval of strings
+ * * no-unsafe-eval: this stops AngularJS from optimizing $parse with unsafe eval of strings
  *
  * You can use these values in the following combinations:
  *
  *
- * * No declaration means that Angular will assume that you can do inline styles, but it will do
+ * * No declaration means that AngularJS will assume that you can do inline styles, but it will do
  * a runtime check for unsafe-eval. E.g. `<body>`. This is backwardly compatible with previous
- * versions of Angular.
+ * versions of AngularJS.
  *
- * * A simple `ng-csp` (or `data-ng-csp`) attribute will tell Angular to deactivate both inline
+ * * A simple `ng-csp` (or `data-ng-csp`) attribute will tell AngularJS to deactivate both inline
  * styles and unsafe eval. E.g. `<body ng-csp>`. This is backwardly compatible with previous
- * versions of Angular.
+ * versions of AngularJS.
  *
- * * Specifying only `no-unsafe-eval` tells Angular that we must not use eval, but that we can
+ * * Specifying only `no-unsafe-eval` tells AngularJS that we must not use eval, but that we can
  * inject inline styles. E.g. `<body ng-csp="no-unsafe-eval">`.
  *
- * * Specifying only `no-inline-style` tells Angular that we must not inject styles, but that we can
+ * * Specifying only `no-inline-style` tells AngularJS that we must not inject styles, but that we can
  * run eval - no automatic check for unsafe eval will occur. E.g. `<body ng-csp="no-inline-style">`
  *
- * * Specifying both `no-unsafe-eval` and `no-inline-style` tells Angular that we must not inject
+ * * Specifying both `no-unsafe-eval` and `no-inline-style` tells AngularJS that we must not inject
  * styles nor use eval, which is the same as an empty: ng-csp.
  * E.g.`<body ng-csp="no-inline-style;no-unsafe-eval">`
  *
  * @example
+ *
  * This example shows how to apply the `ngCsp` directive to the `html` tag.
    ```html
      <!doctype html>
@@ -26406,122 +28826,122 @@ var ngControllerDirective = [function() {
      ...
      </html>
    ```
-  * @example
-      <!-- Note: the `.csp` suffix in the example name triggers CSP mode in our http server! -->
-      <example name="example.csp" module="cspExample" ng-csp="true">
-        <file name="index.html">
-          <div ng-controller="MainController as ctrl">
-            <div>
-              <button ng-click="ctrl.inc()" id="inc">Increment</button>
-              <span id="counter">
-                {{ctrl.counter}}
-              </span>
-            </div>
-
-            <div>
-              <button ng-click="ctrl.evil()" id="evil">Evil</button>
-              <span id="evilError">
-                {{ctrl.evilError}}
-              </span>
-            </div>
-          </div>
-        </file>
-        <file name="script.js">
-           angular.module('cspExample', [])
-             .controller('MainController', function MainController() {
-                this.counter = 0;
-                this.inc = function() {
-                  this.counter++;
-                };
-                this.evil = function() {
-                  try {
-                    eval('1+2'); // eslint-disable-line no-eval
-                  } catch (e) {
-                    this.evilError = e.message;
-                  }
-                };
-              });
-        </file>
-        <file name="protractor.js" type="protractor">
-          var util, webdriver;
-
-          var incBtn = element(by.id('inc'));
-          var counter = element(by.id('counter'));
-          var evilBtn = element(by.id('evil'));
-          var evilError = element(by.id('evilError'));
-
-          function getAndClearSevereErrors() {
-            return browser.manage().logs().get('browser').then(function(browserLog) {
-              return browserLog.filter(function(logEntry) {
-                return logEntry.level.value > webdriver.logging.Level.WARNING.value;
-              });
-            });
-          }
 
-          function clearErrors() {
-            getAndClearSevereErrors();
-          }
+  <!-- Note: the `.csp` suffix in the example name triggers CSP mode in our http server! -->
+  <example name="example.csp" module="cspExample" ng-csp="true">
+    <file name="index.html">
+      <div ng-controller="MainController as ctrl">
+        <div>
+          <button ng-click="ctrl.inc()" id="inc">Increment</button>
+          <span id="counter">
+            {{ctrl.counter}}
+          </span>
+        </div>
 
-          function expectNoErrors() {
-            getAndClearSevereErrors().then(function(filteredLog) {
-              expect(filteredLog.length).toEqual(0);
-              if (filteredLog.length) {
-                console.log('browser console errors: ' + util.inspect(filteredLog));
+        <div>
+          <button ng-click="ctrl.evil()" id="evil">Evil</button>
+          <span id="evilError">
+            {{ctrl.evilError}}
+          </span>
+        </div>
+      </div>
+    </file>
+    <file name="script.js">
+       angular.module('cspExample', [])
+         .controller('MainController', function MainController() {
+            this.counter = 0;
+            this.inc = function() {
+              this.counter++;
+            };
+            this.evil = function() {
+              try {
+                eval('1+2'); // eslint-disable-line no-eval
+              } catch (e) {
+                this.evilError = e.message;
               }
-            });
-          }
+            };
+          });
+    </file>
+    <file name="protractor.js" type="protractor">
+      var util, webdriver;
 
-          function expectError(regex) {
-            getAndClearSevereErrors().then(function(filteredLog) {
-              var found = false;
-              filteredLog.forEach(function(log) {
-                if (log.message.match(regex)) {
-                  found = true;
-                }
-              });
-              if (!found) {
-                throw new Error('expected an error that matches ' + regex);
-              }
-            });
-          }
+      var incBtn = element(by.id('inc'));
+      var counter = element(by.id('counter'));
+      var evilBtn = element(by.id('evil'));
+      var evilError = element(by.id('evilError'));
 
-          beforeEach(function() {
-            util = require('util');
-            webdriver = require('selenium-webdriver');
+      function getAndClearSevereErrors() {
+        return browser.manage().logs().get('browser').then(function(browserLog) {
+          return browserLog.filter(function(logEntry) {
+            return logEntry.level.value > webdriver.logging.Level.WARNING.value;
           });
+        });
+      }
 
-          // For now, we only test on Chrome,
-          // as Safari does not load the page with Protractor's injected scripts,
-          // and Firefox webdriver always disables content security policy (#6358)
-          if (browser.params.browser !== 'chrome') {
-            return;
+      function clearErrors() {
+        getAndClearSevereErrors();
+      }
+
+      function expectNoErrors() {
+        getAndClearSevereErrors().then(function(filteredLog) {
+          expect(filteredLog.length).toEqual(0);
+          if (filteredLog.length) {
+            console.log('browser console errors: ' + util.inspect(filteredLog));
           }
+        });
+      }
 
-          it('should not report errors when the page is loaded', function() {
-            // clear errors so we are not dependent on previous tests
-            clearErrors();
-            // Need to reload the page as the page is already loaded when
-            // we come here
-            browser.driver.getCurrentUrl().then(function(url) {
-              browser.get(url);
-            });
-            expectNoErrors();
+      function expectError(regex) {
+        getAndClearSevereErrors().then(function(filteredLog) {
+          var found = false;
+          filteredLog.forEach(function(log) {
+            if (log.message.match(regex)) {
+              found = true;
+            }
           });
+          if (!found) {
+            throw new Error('expected an error that matches ' + regex);
+          }
+        });
+      }
 
-          it('should evaluate expressions', function() {
-            expect(counter.getText()).toEqual('0');
-            incBtn.click();
-            expect(counter.getText()).toEqual('1');
-            expectNoErrors();
-          });
+      beforeEach(function() {
+        util = require('util');
+        webdriver = require('selenium-webdriver');
+      });
 
-          it('should throw and report an error when using "eval"', function() {
-            evilBtn.click();
-            expect(evilError.getText()).toMatch(/Content Security Policy/);
-            expectError(/Content Security Policy/);
-          });
-        </file>
-      </example>
+      // For now, we only test on Chrome,
+      // as Safari does not load the page with Protractor's injected scripts,
+      // and Firefox webdriver always disables content security policy (#6358)
+      if (browser.params.browser !== 'chrome') {
+        return;
+      }
+
+      it('should not report errors when the page is loaded', function() {
+        // clear errors so we are not dependent on previous tests
+        clearErrors();
+        // Need to reload the page as the page is already loaded when
+        // we come here
+        browser.driver.getCurrentUrl().then(function(url) {
+          browser.get(url);
+        });
+        expectNoErrors();
+      });
+
+      it('should evaluate expressions', function() {
+        expect(counter.getText()).toEqual('0');
+        incBtn.click();
+        expect(counter.getText()).toEqual('1');
+        expectNoErrors();
+      });
+
+      it('should throw and report an error when using "eval"', function() {
+        evilBtn.click();
+        expect(evilError.getText()).toMatch(/Content Security Policy/);
+        expectError(/Content Security Policy/);
+      });
+    </file>
+  </example>
   */
 
 // `ngCsp` is not implemented as a proper directive any more, because we need it be processed while
@@ -26531,13 +28951,14 @@ var ngControllerDirective = [function() {
 /**
  * @ngdoc directive
  * @name ngClick
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * The ngClick directive allows you to specify custom behavior when
  * an element is clicked.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon
  * click. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26562,7 +28983,7 @@ var ngControllerDirective = [function() {
  */
 /*
  * A collection of directives that allows creation of custom event handlers that are defined as
- * angular expressions and are compiled and executed within the current scope.
+ * AngularJS expressions and are compiled and executed within the current scope.
  */
 var ngEventDirectives = {};
 
@@ -26577,42 +28998,54 @@ forEach(
   'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),
   function(eventName) {
     var directiveName = directiveNormalize('ng-' + eventName);
-    ngEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse, $rootScope) {
-      return {
-        restrict: 'A',
-        compile: function($element, attr) {
-          // We expose the powerful $event object on the scope that provides access to the Window,
-          // etc. that isn't protected by the fast paths in $parse.  We explicitly request better
-          // checks at the cost of speed since event handler expressions are not executed as
-          // frequently as regular change detection.
-          var fn = $parse(attr[directiveName], /* interceptorFn */ null, /* expensiveChecks */ true);
-          return function ngEventHandler(scope, element) {
-            element.on(eventName, function(event) {
-              var callback = function() {
-                fn(scope, {$event:event});
-              };
-              if (forceAsyncEvents[eventName] && $rootScope.$$phase) {
-                scope.$evalAsync(callback);
-              } else {
-                scope.$apply(callback);
-              }
-            });
-          };
-        }
-      };
+    ngEventDirectives[directiveName] = ['$parse', '$rootScope', '$exceptionHandler', function($parse, $rootScope, $exceptionHandler) {
+      return createEventDirective($parse, $rootScope, $exceptionHandler, directiveName, eventName, forceAsyncEvents[eventName]);
     }];
   }
 );
 
+function createEventDirective($parse, $rootScope, $exceptionHandler, directiveName, eventName, forceAsync) {
+  return {
+    restrict: 'A',
+    compile: function($element, attr) {
+      // NOTE:
+      // We expose the powerful `$event` object on the scope that provides access to the Window,
+      // etc. This is OK, because expressions are not sandboxed any more (and the expression
+      // sandbox was never meant to be a security feature anyway).
+      var fn = $parse(attr[directiveName]);
+      return function ngEventHandler(scope, element) {
+        element.on(eventName, function(event) {
+          var callback = function() {
+            fn(scope, {$event: event});
+          };
+
+          if (!$rootScope.$$phase) {
+            scope.$apply(callback);
+          } else if (forceAsync) {
+            scope.$evalAsync(callback);
+          } else {
+            try {
+              callback();
+            } catch (error) {
+              $exceptionHandler(error);
+            }
+          }
+        });
+      };
+    }
+  };
+}
+
 /**
  * @ngdoc directive
  * @name ngDblclick
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon
  * a dblclick. (The Event object is available as `$event`)
  *
@@ -26631,12 +29064,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngMousedown
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * The ngMousedown directive allows you to specify custom behavior on mousedown event.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon
  * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26655,12 +29089,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngMouseup
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * Specify custom behavior on mouseup event.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon
  * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26678,12 +29113,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngMouseover
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * Specify custom behavior on mouseover event.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon
  * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26702,12 +29138,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngMouseenter
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * Specify custom behavior on mouseenter event.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon
  * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26726,12 +29163,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngMouseleave
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * Specify custom behavior on mouseleave event.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon
  * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26750,12 +29188,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngMousemove
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * Specify custom behavior on mousemove event.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon
  * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26774,12 +29213,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngKeydown
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * Specify custom behavior on keydown event.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon
  * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
  *
@@ -26796,12 +29236,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngKeyup
+ * @restrict A
+ * @element ANY
+ * @priority 0
  *
  * @description
  * Specify custom behavior on keyup event.
  *
- * @element ANY
- * @priority 0
  * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon
  * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
  *
@@ -26823,11 +29264,12 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngKeypress
+ * @restrict A
+ * @element ANY
  *
  * @description
  * Specify custom behavior on keypress event.
  *
- * @element ANY
  * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon
  * keypress. ({@link guide/expression#-event- Event object is available as `$event`}
  * and can be interrogated for keyCode, altKey, etc.)
@@ -26845,9 +29287,12 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngSubmit
+ * @restrict A
+ * @element form
+ * @priority 0
  *
  * @description
- * Enables binding angular expressions to onsubmit events.
+ * Enables binding AngularJS expressions to onsubmit events.
  *
  * Additionally it prevents the default action (which for form means sending the request to the
  * server and reloading the current page), but only if the form does not contain `action`,
@@ -26860,8 +29305,6 @@ forEach(
  * for a detailed discussion of when `ngSubmit` may be triggered.
  * </div>
  *
- * @element form
- * @priority 0
  * @param {expression} ngSubmit {@link guide/expression Expression} to eval.
  * ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26908,6 +29351,9 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngFocus
+ * @restrict A
+ * @element window, input, select, textarea, a
+ * @priority 0
  *
  * @description
  * Specify custom behavior on focus event.
@@ -26916,8 +29362,6 @@ forEach(
  * AngularJS executes the expression using `scope.$evalAsync` if the event is fired
  * during an `$apply` to ensure a consistent state.
  *
- * @element window, input, select, textarea, a
- * @priority 0
  * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon
  * focus. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26928,6 +29372,9 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngBlur
+ * @restrict A
+ * @element window, input, select, textarea, a
+ * @priority 0
  *
  * @description
  * Specify custom behavior on blur event.
@@ -26940,8 +29387,6 @@ forEach(
  * AngularJS executes the expression using `scope.$evalAsync` if the event is fired
  * during an `$apply` to ensure a consistent state.
  *
- * @element window, input, select, textarea, a
- * @priority 0
  * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon
  * blur. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26952,12 +29397,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngCopy
+ * @restrict A
+ * @element window, input, select, textarea, a
+ * @priority 0
  *
  * @description
  * Specify custom behavior on copy event.
  *
- * @element window, input, select, textarea, a
- * @priority 0
  * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon
  * copy. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26973,12 +29419,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngCut
+ * @restrict A
+ * @element window, input, select, textarea, a
+ * @priority 0
  *
  * @description
  * Specify custom behavior on cut event.
  *
- * @element window, input, select, textarea, a
- * @priority 0
  * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon
  * cut. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -26994,12 +29441,13 @@ forEach(
 /**
  * @ngdoc directive
  * @name ngPaste
+ * @restrict A
+ * @element window, input, select, textarea, a
+ * @priority 0
  *
  * @description
  * Specify custom behavior on paste event.
  *
- * @element window, input, select, textarea, a
- * @priority 0
  * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon
  * paste. ({@link guide/expression#-event- Event object is available as `$event`})
  *
@@ -27142,6 +29590,8 @@ var ngIfDirective = ['$animate', '$compile', function($animate, $compile) {
  * @ngdoc directive
  * @name ngInclude
  * @restrict ECA
+ * @scope
+ * @priority -400
  *
  * @description
  * Fetches, compiles and includes an external HTML fragment.
@@ -27150,7 +29600,7 @@ var ngIfDirective = ['$animate', '$compile', function($animate, $compile) {
  * application document. This is done by calling {@link $sce#getTrustedResourceUrl
  * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols
  * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or
- * {@link $sce#trustAsResourceUrl wrap them} as trusted values. Refer to Angular's {@link
+ * {@link $sce#trustAsResourceUrl wrap them} as trusted values. Refer to AngularJS's {@link
  * ng.$sce Strict Contextual Escaping}.
  *
  * In addition, the browser's
@@ -27168,10 +29618,7 @@ var ngIfDirective = ['$animate', '$compile', function($animate, $compile) {
  *
  * The enter and leave animation occur concurrently.
  *
- * @scope
- * @priority 400
- *
- * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,
+ * @param {string} ngInclude|src AngularJS expression evaluating to URL. If the source is a string constant,
  *                 make sure you wrap it in **single** quotes, e.g. `src="'myPartialTemplate.html'"`.
  * @param {string=} onload Expression to evaluate when a new partial is loaded.
  *                  <div class="alert alert-warning">
@@ -27448,6 +29895,10 @@ var ngIncludeFillContentDirective = ['$compile',
  * @ngdoc directive
  * @name ngInit
  * @restrict AC
+ * @priority 450
+ * @element ANY
+ *
+ * @param {expression} ngInit {@link guide/expression Expression} to eval.
  *
  * @description
  * The `ngInit` directive allows you to evaluate an expression in the
@@ -27455,10 +29906,16 @@ var ngIncludeFillContentDirective = ['$compile',
  *
  * <div class="alert alert-danger">
  * This directive can be abused to add unnecessary amounts of logic into your templates.
- * There are only a few appropriate uses of `ngInit`, such as for aliasing special properties of
- * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below; and for injecting data via
- * server side scripting. Besides these few cases, you should use {@link guide/controller controllers}
- * rather than `ngInit` to initialize values on a scope.
+ * There are only a few appropriate uses of `ngInit`:
+ * <ul>
+ *   <li>aliasing special properties of {@link ng.directive:ngRepeat `ngRepeat`},
+ *     as seen in the demo below.</li>
+ *   <li>initializing data during development, or for examples, as seen throughout these docs.</li>
+ *   <li>injecting data via server side scripting.</li>
+ * </ul>
+ *
+ * Besides these few cases, you should use {@link guide/component Components} or
+ * {@link guide/controller Controllers} rather than `ngInit` to initialize values on a scope.
  * </div>
  *
  * <div class="alert alert-warning">
@@ -27469,11 +29926,6 @@ var ngIncludeFillContentDirective = ['$compile',
  * </pre>
  * </div>
  *
- * @priority 450
- *
- * @element ANY
- * @param {expression} ngInit {@link guide/expression Expression} to eval.
- *
  * @example
    <example module="initExample" name="ng-init">
      <file name="index.html">
@@ -27516,6 +29968,10 @@ var ngInitDirective = ngDirective({
 /**
  * @ngdoc directive
  * @name ngList
+ * @restrict A
+ * @priority 100
+ *
+ * @param {string=} ngList optional delimiter that should be used to split the value.
  *
  * @description
  * Text input that converts between a delimited string and an array of strings. The default
@@ -27531,7 +29987,8 @@ var ngInitDirective = ngDirective({
  *   when joining the list items back together) and whitespace around each list item is stripped
  *   before it is added to the model.
  *
- * ### Example with Validation
+ * @example
+ * ### Validation
  *
  * <example name="ngList-directive" module="listExample">
  *   <file name="app.js">
@@ -27578,7 +30035,9 @@ var ngInitDirective = ngDirective({
  *   </file>
  * </example>
  *
- * ### Example - splitting on newline
+ * @example
+ * ### Splitting on newline
+ *
  * <example name="ngList-directive-newlines">
  *   <file name="index.html">
  *    <textarea ng-model="list" ng-list="&#10;" ng-trim="false"></textarea>
@@ -27594,8 +30053,6 @@ var ngInitDirective = ngDirective({
  *   </file>
  * </example>
  *
- * @element input
- * @param {string=} ngList optional delimiter that should be used to split the value.
  */
 var ngListDirective = function() {
   return {
@@ -27603,9 +30060,7 @@ var ngListDirective = function() {
     priority: 100,
     require: 'ngModel',
     link: function(scope, element, attr, ctrl) {
-      // We want to control whitespace trimming so we use this convoluted approach
-      // to access the ngList attribute, which doesn't pre-trim the attribute
-      var ngList = element.attr(attr.$attr.ngList) || ', ';
+      var ngList = attr.ngList || ', ';
       var trimValues = attr.ngTrim !== 'false';
       var separator = trimValues ? trim(ngList) : ngList;
 
@@ -27646,16 +30101,20 @@ var ngListDirective = function() {
   PRISTINE_CLASS: true,
   DIRTY_CLASS: true,
   UNTOUCHED_CLASS: true,
-  TOUCHED_CLASS: true
+  TOUCHED_CLASS: true,
+  PENDING_CLASS: true,
+  addSetValidityMethod: true,
+  setupValidity: true,
+  defaultModelOptions: false
 */
 
+
 var VALID_CLASS = 'ng-valid',
     INVALID_CLASS = 'ng-invalid',
     PRISTINE_CLASS = 'ng-pristine',
     DIRTY_CLASS = 'ng-dirty',
     UNTOUCHED_CLASS = 'ng-untouched',
     TOUCHED_CLASS = 'ng-touched',
-    PENDING_CLASS = 'ng-pending',
     EMPTY_CLASS = 'ng-empty',
     NOT_EMPTY_CLASS = 'ng-not-empty';
 
@@ -27664,36 +30123,60 @@ var ngModelMinErr = minErr('ngModel');
 /**
  * @ngdoc type
  * @name ngModel.NgModelController
- *
  * @property {*} $viewValue The actual value from the control's view. For `input` elements, this is a
  * String. See {@link ngModel.NgModelController#$setViewValue} for information about when the $viewValue
  * is set.
+ *
  * @property {*} $modelValue The value in the model that the control is bound to.
+ *
  * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
-       the control reads value from the DOM. The functions are called in array order, each passing
-       its return value through to the next. The last return value is forwarded to the
-       {@link ngModel.NgModelController#$validators `$validators`} collection.
+ *  the control updates the ngModelController with a new {@link ngModel.NgModelController#$viewValue
+    `$viewValue`} from the DOM, usually via user input.
+    See {@link ngModel.NgModelController#$setViewValue `$setViewValue()`} for a detailed lifecycle explanation.
+    Note that the `$parsers` are not called when the bound ngModel expression changes programmatically.
+
+  The functions are called in array order, each passing
+    its return value through to the next. The last return value is forwarded to the
+    {@link ngModel.NgModelController#$validators `$validators`} collection.
 
-Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue
-`$viewValue`}.
+  Parsers are used to sanitize / convert the {@link ngModel.NgModelController#$viewValue
+    `$viewValue`}.
 
-Returning `undefined` from a parser means a parse error occurred. In that case,
-no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`
-will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}
-is set to `true`. The parse error is stored in `ngModel.$error.parse`.
+  Returning `undefined` from a parser means a parse error occurred. In that case,
+    no {@link ngModel.NgModelController#$validators `$validators`} will run and the `ngModel`
+    will be set to `undefined` unless {@link ngModelOptions `ngModelOptions.allowInvalid`}
+    is set to `true`. The parse error is stored in `ngModel.$error.parse`.
+
+  This simple example shows a parser that would convert text input value to lowercase:
+ * ```js
+ * function parse(value) {
+ *   if (value) {
+ *     return value.toLowerCase();
+ *   }
+ * }
+ * ngModelController.$parsers.push(parse);
+ * ```
 
  *
  * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
-       the model value changes. The functions are called in reverse array order, each passing the value through to the
-       next. The last return value is used as the actual DOM value.
-       Used to format / convert values for display in the control.
+    the bound ngModel expression changes programmatically. The `$formatters` are not called when the
+    value of the control is changed by user interaction.
+
+  Formatters are used to format / convert the {@link ngModel.NgModelController#$modelValue
+    `$modelValue`} for display in the control.
+
+  The functions are called in reverse array order, each passing the value through to the
+    next. The last return value is used as the actual DOM value.
+
+  This simple example shows a formatter that would convert the model value to uppercase:
+
  * ```js
- * function formatter(value) {
+ * function format(value) {
  *   if (value) {
  *     return value.toUpperCase();
  *   }
  * }
- * ngModel.$formatters.push(formatter);
+ * ngModel.$formatters.push(format);
  * ```
  *
  * @property {Object.<string, function>} $validators A collection of validators that are applied
@@ -27740,8 +30223,10 @@ is set to `true`. The parse error is stored in `ngModel.$error.parse`.
  * };
  * ```
  *
- * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the
- *     view value has changed. It is called with no arguments, and its return value is ignored.
+ * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever
+ *     a change to {@link ngModel.NgModelController#$viewValue `$viewValue`} has caused a change
+ *     to {@link ngModel.NgModelController#$modelValue `$modelValue`}.
+ *     It is called with no arguments, and its return value is ignored.
  *     This can be used in place of additional $watches against the model value.
  *
  * @property {Object} $error An object hash with all failing validator ids as keys.
@@ -27763,7 +30248,7 @@ is set to `true`. The parse error is stored in `ngModel.$error.parse`.
  * listening to DOM events.
  * Such DOM related logic should be provided by other directives which make use of
  * `NgModelController` for data-binding to control elements.
- * Angular provides this DOM logic for most {@link input `input`} elements.
+ * AngularJS provides this DOM logic for most {@link input `input`} elements.
  * At the end of this page you can find a {@link ngModel.NgModelController#custom-control-example
  * custom control example} that uses `ngModelController` to bind to `contenteditable` elements.
  *
@@ -27861,8 +30346,8 @@ is set to `true`. The parse error is stored in `ngModel.$error.parse`.
  *
  *
  */
-var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$rootScope', '$q', '$interpolate',
-    /** @this */ function($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $rootScope, $q, $interpolate) {
+NgModelController.$inject = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate', '$timeout', '$q', '$interpolate'];
+function NgModelController($scope, $exceptionHandler, $attr, $element, $parse, $animate, $timeout, $q, $interpolate) {
   this.$viewValue = Number.NaN;
   this.$modelValue = Number.NaN;
   this.$$rawModelValue = undefined; // stores the parsed modelValue / model set from scope regardless of validity.
@@ -27882,40 +30367,61 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
   this.$pending = undefined; // keep pending keys here
   this.$name = $interpolate($attr.name || '', false)($scope);
   this.$$parentForm = nullFormCtrl;
+  this.$options = defaultModelOptions;
+  this.$$updateEvents = '';
+  // Attach the correct context to the event handler function for updateOn
+  this.$$updateEventHandler = this.$$updateEventHandler.bind(this);
+
+  this.$$parsedNgModel = $parse($attr.ngModel);
+  this.$$parsedNgModelAssign = this.$$parsedNgModel.assign;
+  this.$$ngModelGet = this.$$parsedNgModel;
+  this.$$ngModelSet = this.$$parsedNgModelAssign;
+  this.$$pendingDebounce = null;
+  this.$$parserValid = undefined;
+  this.$$parserName = 'parse';
+
+  this.$$currentValidationRunId = 0;
+
+  this.$$scope = $scope;
+  this.$$rootScope = $scope.$root;
+  this.$$attr = $attr;
+  this.$$element = $element;
+  this.$$animate = $animate;
+  this.$$timeout = $timeout;
+  this.$$parse = $parse;
+  this.$$q = $q;
+  this.$$exceptionHandler = $exceptionHandler;
+
+  setupValidity(this);
+  setupModelWatcher(this);
+}
+
+NgModelController.prototype = {
+  $$initGetterSetters: function() {
+    if (this.$options.getOption('getterSetter')) {
+      var invokeModelGetter = this.$$parse(this.$$attr.ngModel + '()'),
+          invokeModelSetter = this.$$parse(this.$$attr.ngModel + '($$$p)');
 
-  var parsedNgModel = $parse($attr.ngModel),
-      parsedNgModelAssign = parsedNgModel.assign,
-      ngModelGet = parsedNgModel,
-      ngModelSet = parsedNgModelAssign,
-      pendingDebounce = null,
-      parserValid,
-      ctrl = this;
-
-  this.$$setOptions = function(options) {
-    ctrl.$options = options;
-    if (options && options.getterSetter) {
-      var invokeModelGetter = $parse($attr.ngModel + '()'),
-          invokeModelSetter = $parse($attr.ngModel + '($$$p)');
-
-      ngModelGet = function($scope) {
-        var modelValue = parsedNgModel($scope);
+      this.$$ngModelGet = function($scope) {
+        var modelValue = this.$$parsedNgModel($scope);
         if (isFunction(modelValue)) {
           modelValue = invokeModelGetter($scope);
         }
         return modelValue;
       };
-      ngModelSet = function($scope, newValue) {
-        if (isFunction(parsedNgModel($scope))) {
+      this.$$ngModelSet = function($scope, newValue) {
+        if (isFunction(this.$$parsedNgModel($scope))) {
           invokeModelSetter($scope, {$$$p: newValue});
         } else {
-          parsedNgModelAssign($scope, newValue);
+          this.$$parsedNgModelAssign($scope, newValue);
         }
       };
-    } else if (!parsedNgModel.assign) {
+    } else if (!this.$$parsedNgModel.assign) {
       throw ngModelMinErr('nonassign', 'Expression \'{0}\' is non-assignable. Element: {1}',
-          $attr.ngModel, startingTag($element));
+          this.$$attr.ngModel, startingTag(this.$$element));
     }
-  };
+  },
+
 
   /**
    * @ngdoc method
@@ -27937,7 +30443,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * or `$viewValue` are objects (rather than a string or number) then `$render()` will not be
    * invoked if you only change a property on the objects.
    */
-  this.$render = noop;
+  $render: noop,
 
   /**
    * @ngdoc method
@@ -27957,57 +30463,20 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * @param {*} value The value of the input to check for emptiness.
    * @returns {boolean} True if `value` is "empty".
    */
-  this.$isEmpty = function(value) {
+  $isEmpty: function(value) {
     // eslint-disable-next-line no-self-compare
     return isUndefined(value) || value === '' || value === null || value !== value;
-  };
+  },
 
-  this.$$updateEmptyClasses = function(value) {
-    if (ctrl.$isEmpty(value)) {
-      $animate.removeClass($element, NOT_EMPTY_CLASS);
-      $animate.addClass($element, EMPTY_CLASS);
+  $$updateEmptyClasses: function(value) {
+    if (this.$isEmpty(value)) {
+      this.$$animate.removeClass(this.$$element, NOT_EMPTY_CLASS);
+      this.$$animate.addClass(this.$$element, EMPTY_CLASS);
     } else {
-      $animate.removeClass($element, EMPTY_CLASS);
-      $animate.addClass($element, NOT_EMPTY_CLASS);
+      this.$$animate.removeClass(this.$$element, EMPTY_CLASS);
+      this.$$animate.addClass(this.$$element, NOT_EMPTY_CLASS);
     }
-  };
-
-
-  var currentValidationRunId = 0;
-
-  /**
-   * @ngdoc method
-   * @name ngModel.NgModelController#$setValidity
-   *
-   * @description
-   * Change the validity state, and notify the form.
-   *
-   * This method can be called within $parsers/$formatters or a custom validation implementation.
-   * However, in most cases it should be sufficient to use the `ngModel.$validators` and
-   * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically.
-   *
-   * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned
-   *        to either `$error[validationErrorKey]` or `$pending[validationErrorKey]`
-   *        (for unfulfilled `$asyncValidators`), so that it is available for data-binding.
-   *        The `validationErrorKey` should be in camelCase and will get converted into dash-case
-   *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`
-   *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .
-   * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined),
-   *                          or skipped (null). Pending is used for unfulfilled `$asyncValidators`.
-   *                          Skipped is used by Angular when validators do not run because of parse errors and
-   *                          when `$asyncValidators` do not run because any of the `$validators` failed.
-   */
-  addSetValidityMethod({
-    ctrl: this,
-    $element: $element,
-    set: function(object, property) {
-      object[property] = true;
-    },
-    unset: function(object, property) {
-      delete object[property];
-    },
-    $animate: $animate
-  });
+  },
 
   /**
    * @ngdoc method
@@ -28020,12 +30489,12 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * state (`ng-pristine` class). A model is considered to be pristine when the control
    * has not been changed from when first compiled.
    */
-  this.$setPristine = function() {
-    ctrl.$dirty = false;
-    ctrl.$pristine = true;
-    $animate.removeClass($element, DIRTY_CLASS);
-    $animate.addClass($element, PRISTINE_CLASS);
-  };
+  $setPristine: function() {
+    this.$dirty = false;
+    this.$pristine = true;
+    this.$$animate.removeClass(this.$$element, DIRTY_CLASS);
+    this.$$animate.addClass(this.$$element, PRISTINE_CLASS);
+  },
 
   /**
    * @ngdoc method
@@ -28038,13 +30507,13 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * state (`ng-dirty` class). A model is considered to be dirty when the control has been changed
    * from when first compiled.
    */
-  this.$setDirty = function() {
-    ctrl.$dirty = true;
-    ctrl.$pristine = false;
-    $animate.removeClass($element, PRISTINE_CLASS);
-    $animate.addClass($element, DIRTY_CLASS);
-    ctrl.$$parentForm.$setDirty();
-  };
+  $setDirty: function() {
+    this.$dirty = true;
+    this.$pristine = false;
+    this.$$animate.removeClass(this.$$element, PRISTINE_CLASS);
+    this.$$animate.addClass(this.$$element, DIRTY_CLASS);
+    this.$$parentForm.$setDirty();
+  },
 
   /**
    * @ngdoc method
@@ -28058,11 +30527,11 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * by default, however this function can be used to restore that state if the model has
    * already been touched by the user.
    */
-  this.$setUntouched = function() {
-    ctrl.$touched = false;
-    ctrl.$untouched = true;
-    $animate.setClass($element, UNTOUCHED_CLASS, TOUCHED_CLASS);
-  };
+  $setUntouched: function() {
+    this.$touched = false;
+    this.$untouched = true;
+    this.$$animate.setClass(this.$$element, UNTOUCHED_CLASS, TOUCHED_CLASS);
+  },
 
   /**
    * @ngdoc method
@@ -28075,11 +30544,11 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * touched state (`ng-touched` class). A model is considered to be touched when the user has
    * first focused the control element and then shifted focus away from the control (blur event).
    */
-  this.$setTouched = function() {
-    ctrl.$touched = true;
-    ctrl.$untouched = false;
-    $animate.setClass($element, TOUCHED_CLASS, UNTOUCHED_CLASS);
-  };
+  $setTouched: function() {
+    this.$touched = true;
+    this.$untouched = false;
+    this.$$animate.setClass(this.$$element, TOUCHED_CLASS, UNTOUCHED_CLASS);
+  },
 
   /**
    * @ngdoc method
@@ -28098,13 +30567,14 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * and reset the input to the last committed view value.
    *
    * It is also possible that you run into difficulties if you try to update the ngModel's `$modelValue`
-   * programmatically before these debounced/future events have resolved/occurred, because Angular's
+   * programmatically before these debounced/future events have resolved/occurred, because AngularJS's
    * dirty checking mechanism is not able to tell whether the model has actually changed or not.
    *
    * The `$rollbackViewValue()` method should be called before programmatically changing the model of an
    * input which may have such events pending. This is important in order to make sure that the
    * input field will be updated with the new model value and any pending operations are cancelled.
    *
+   * @example
    * <example name="ng-model-cancel-update" module="cancel-update-example">
    *   <file name="app.js">
    *     angular.module('cancel-update-example', [])
@@ -28169,11 +30639,11 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
         </file>
    * </example>
    */
-  this.$rollbackViewValue = function() {
-    $timeout.cancel(pendingDebounce);
-    ctrl.$viewValue = ctrl.$$lastCommittedViewValue;
-    ctrl.$render();
-  };
+  $rollbackViewValue: function() {
+    this.$$timeout.cancel(this.$$pendingDebounce);
+    this.$viewValue = this.$$lastCommittedViewValue;
+    this.$render();
+  },
 
   /**
    * @ngdoc method
@@ -28187,45 +30657,47 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * If the validity changes to valid, it will set the model to the last available valid
    * `$modelValue`, i.e. either the last parsed value or the last value set from the scope.
    */
-  this.$validate = function() {
+  $validate: function() {
+
     // ignore $validate before model is initialized
-    if (isNumberNaN(ctrl.$modelValue)) {
+    if (isNumberNaN(this.$modelValue)) {
       return;
     }
 
-    var viewValue = ctrl.$$lastCommittedViewValue;
+    var viewValue = this.$$lastCommittedViewValue;
     // Note: we use the $$rawModelValue as $modelValue might have been
     // set to undefined during a view -> model update that found validation
     // errors. We can't parse the view here, since that could change
     // the model although neither viewValue nor the model on the scope changed
-    var modelValue = ctrl.$$rawModelValue;
+    var modelValue = this.$$rawModelValue;
 
-    var prevValid = ctrl.$valid;
-    var prevModelValue = ctrl.$modelValue;
+    var prevValid = this.$valid;
+    var prevModelValue = this.$modelValue;
 
-    var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
+    var allowInvalid = this.$options.getOption('allowInvalid');
 
-    ctrl.$$runValidators(modelValue, viewValue, function(allValid) {
+    var that = this;
+    this.$$runValidators(modelValue, viewValue, function(allValid) {
       // If there was no change in validity, don't update the model
       // This prevents changing an invalid modelValue to undefined
       if (!allowInvalid && prevValid !== allValid) {
-        // Note: Don't check ctrl.$valid here, as we could have
+        // Note: Don't check this.$valid here, as we could have
         // external validators (e.g. calculated on the server),
         // that just call $setValidity and need the model value
         // to calculate their validity.
-        ctrl.$modelValue = allValid ? modelValue : undefined;
+        that.$modelValue = allValid ? modelValue : undefined;
 
-        if (ctrl.$modelValue !== prevModelValue) {
-          ctrl.$$writeModelToScope();
+        if (that.$modelValue !== prevModelValue) {
+          that.$$writeModelToScope();
         }
       }
     });
+  },
 
-  };
-
-  this.$$runValidators = function(modelValue, viewValue, doneCallback) {
-    currentValidationRunId++;
-    var localValidationRunId = currentValidationRunId;
+  $$runValidators: function(modelValue, viewValue, doneCallback) {
+    this.$$currentValidationRunId++;
+    var localValidationRunId = this.$$currentValidationRunId;
+    var that = this;
 
     // check parser error
     if (!processParseErrors()) {
@@ -28239,34 +30711,36 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
     processAsyncValidators();
 
     function processParseErrors() {
-      var errorKey = ctrl.$$parserName || 'parse';
-      if (isUndefined(parserValid)) {
+      var errorKey = that.$$parserName;
+
+      if (isUndefined(that.$$parserValid)) {
         setValidity(errorKey, null);
       } else {
-        if (!parserValid) {
-          forEach(ctrl.$validators, function(v, name) {
+        if (!that.$$parserValid) {
+          forEach(that.$validators, function(v, name) {
             setValidity(name, null);
           });
-          forEach(ctrl.$asyncValidators, function(v, name) {
+          forEach(that.$asyncValidators, function(v, name) {
             setValidity(name, null);
           });
         }
+
         // Set the parse error last, to prevent unsetting it, should a $validators key == parserName
-        setValidity(errorKey, parserValid);
-        return parserValid;
+        setValidity(errorKey, that.$$parserValid);
+        return that.$$parserValid;
       }
       return true;
     }
 
     function processSyncValidators() {
       var syncValidatorsValid = true;
-      forEach(ctrl.$validators, function(validator, name) {
-        var result = validator(modelValue, viewValue);
+      forEach(that.$validators, function(validator, name) {
+        var result = Boolean(validator(modelValue, viewValue));
         syncValidatorsValid = syncValidatorsValid && result;
         setValidity(name, result);
       });
       if (!syncValidatorsValid) {
-        forEach(ctrl.$asyncValidators, function(v, name) {
+        forEach(that.$asyncValidators, function(v, name) {
           setValidity(name, null);
         });
         return false;
@@ -28277,7 +30751,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
     function processAsyncValidators() {
       var validatorPromises = [];
       var allValid = true;
-      forEach(ctrl.$asyncValidators, function(validator, name) {
+      forEach(that.$asyncValidators, function(validator, name) {
         var promise = validator(modelValue, viewValue);
         if (!isPromiseLike(promise)) {
           throw ngModelMinErr('nopromise',
@@ -28294,25 +30768,25 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
       if (!validatorPromises.length) {
         validationDone(true);
       } else {
-        $q.all(validatorPromises).then(function() {
+        that.$$q.all(validatorPromises).then(function() {
           validationDone(allValid);
         }, noop);
       }
     }
 
     function setValidity(name, isValid) {
-      if (localValidationRunId === currentValidationRunId) {
-        ctrl.$setValidity(name, isValid);
+      if (localValidationRunId === that.$$currentValidationRunId) {
+        that.$setValidity(name, isValid);
       }
     }
 
     function validationDone(allValid) {
-      if (localValidationRunId === currentValidationRunId) {
+      if (localValidationRunId === that.$$currentValidationRunId) {
 
         doneCallback(allValid);
       }
     }
-  };
+  },
 
   /**
    * @ngdoc method
@@ -28325,84 +30799,91 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * event defined in `ng-model-options`. this method is rarely needed as `NgModelController`
    * usually handles calling this in response to input events.
    */
-  this.$commitViewValue = function() {
-    var viewValue = ctrl.$viewValue;
+  $commitViewValue: function() {
+    var viewValue = this.$viewValue;
 
-    $timeout.cancel(pendingDebounce);
+    this.$$timeout.cancel(this.$$pendingDebounce);
 
     // If the view value has not changed then we should just exit, except in the case where there is
     // a native validator on the element. In this case the validation state may have changed even though
     // the viewValue has stayed empty.
-    if (ctrl.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !ctrl.$$hasNativeValidators)) {
+    if (this.$$lastCommittedViewValue === viewValue && (viewValue !== '' || !this.$$hasNativeValidators)) {
       return;
     }
-    ctrl.$$updateEmptyClasses(viewValue);
-    ctrl.$$lastCommittedViewValue = viewValue;
+    this.$$updateEmptyClasses(viewValue);
+    this.$$lastCommittedViewValue = viewValue;
 
     // change to dirty
-    if (ctrl.$pristine) {
+    if (this.$pristine) {
       this.$setDirty();
     }
     this.$$parseAndValidate();
-  };
+  },
 
-  this.$$parseAndValidate = function() {
-    var viewValue = ctrl.$$lastCommittedViewValue;
+  $$parseAndValidate: function() {
+    var viewValue = this.$$lastCommittedViewValue;
     var modelValue = viewValue;
-    parserValid = isUndefined(modelValue) ? undefined : true;
+    var that = this;
+
+    this.$$parserValid = isUndefined(modelValue) ? undefined : true;
 
-    if (parserValid) {
-      for (var i = 0; i < ctrl.$parsers.length; i++) {
-        modelValue = ctrl.$parsers[i](modelValue);
+    // Reset any previous parse error
+    this.$setValidity(this.$$parserName, null);
+    this.$$parserName = 'parse';
+
+    if (this.$$parserValid) {
+      for (var i = 0; i < this.$parsers.length; i++) {
+        modelValue = this.$parsers[i](modelValue);
         if (isUndefined(modelValue)) {
-          parserValid = false;
+          this.$$parserValid = false;
           break;
         }
       }
     }
-    if (isNumberNaN(ctrl.$modelValue)) {
-      // ctrl.$modelValue has not been touched yet...
-      ctrl.$modelValue = ngModelGet($scope);
+    if (isNumberNaN(this.$modelValue)) {
+      // this.$modelValue has not been touched yet...
+      this.$modelValue = this.$$ngModelGet(this.$$scope);
     }
-    var prevModelValue = ctrl.$modelValue;
-    var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
-    ctrl.$$rawModelValue = modelValue;
+    var prevModelValue = this.$modelValue;
+    var allowInvalid = this.$options.getOption('allowInvalid');
+    this.$$rawModelValue = modelValue;
 
     if (allowInvalid) {
-      ctrl.$modelValue = modelValue;
+      this.$modelValue = modelValue;
       writeToModelIfNeeded();
     }
 
     // Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date.
     // This can happen if e.g. $setViewValue is called from inside a parser
-    ctrl.$$runValidators(modelValue, ctrl.$$lastCommittedViewValue, function(allValid) {
+    this.$$runValidators(modelValue, this.$$lastCommittedViewValue, function(allValid) {
       if (!allowInvalid) {
-        // Note: Don't check ctrl.$valid here, as we could have
+        // Note: Don't check this.$valid here, as we could have
         // external validators (e.g. calculated on the server),
         // that just call $setValidity and need the model value
         // to calculate their validity.
-        ctrl.$modelValue = allValid ? modelValue : undefined;
+        that.$modelValue = allValid ? modelValue : undefined;
         writeToModelIfNeeded();
       }
     });
 
     function writeToModelIfNeeded() {
-      if (ctrl.$modelValue !== prevModelValue) {
-        ctrl.$$writeModelToScope();
+      if (that.$modelValue !== prevModelValue) {
+        that.$$writeModelToScope();
       }
     }
-  };
+  },
 
-  this.$$writeModelToScope = function() {
-    ngModelSet($scope, ctrl.$modelValue);
-    forEach(ctrl.$viewChangeListeners, function(listener) {
+  $$writeModelToScope: function() {
+    this.$$ngModelSet(this.$$scope, this.$modelValue);
+    forEach(this.$viewChangeListeners, function(listener) {
       try {
         listener();
       } catch (e) {
-        $exceptionHandler(e);
+        // eslint-disable-next-line no-invalid-this
+        this.$$exceptionHandler(e);
       }
-    });
-  };
+    }, this);
+  },
 
   /**
    * @ngdoc method
@@ -28418,9 +30899,10 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    *
    * When `$setViewValue` is called, the new `value` will be staged for committing through the `$parsers`
    * and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged
-   * value sent directly for processing, finally to be applied to `$modelValue` and then the
-   * **expression** specified in the `ng-model` attribute. Lastly, all the registered change listeners,
-   * in the `$viewChangeListeners` list, are called.
+   * value is sent directly for processing through the `$parsers` pipeline. After this, the `$validators` and
+   * `$asyncValidators` are called and the value is applied to `$modelValue`.
+   * Finally, the value is set to the **expression** specified in the `ng-model` attribute and
+   * all the registered change listeners, in the `$viewChangeListeners` list are called.
    *
    * In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`
    * and the `default` trigger is not listed, all those actions will remain pending until one of the
@@ -28454,43 +30936,239 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
    * @param {*} value value from the view.
    * @param {string} trigger Event that triggered the update.
    */
-  this.$setViewValue = function(value, trigger) {
-    ctrl.$viewValue = value;
-    if (!ctrl.$options || ctrl.$options.updateOnDefault) {
-      ctrl.$$debounceViewValueCommit(trigger);
+  $setViewValue: function(value, trigger) {
+    this.$viewValue = value;
+    if (this.$options.getOption('updateOnDefault')) {
+      this.$$debounceViewValueCommit(trigger);
     }
-  };
+  },
 
-  this.$$debounceViewValueCommit = function(trigger) {
-    var debounceDelay = 0,
-        options = ctrl.$options,
-        debounce;
+  $$debounceViewValueCommit: function(trigger) {
+    var debounceDelay = this.$options.getOption('debounce');
 
-    if (options && isDefined(options.debounce)) {
-      debounce = options.debounce;
-      if (isNumber(debounce)) {
-        debounceDelay = debounce;
-      } else if (isNumber(debounce[trigger])) {
-        debounceDelay = debounce[trigger];
-      } else if (isNumber(debounce['default'])) {
-        debounceDelay = debounce['default'];
-      }
+    if (isNumber(debounceDelay[trigger])) {
+      debounceDelay = debounceDelay[trigger];
+    } else if (isNumber(debounceDelay['default']) &&
+      this.$options.getOption('updateOn').indexOf(trigger) === -1
+    ) {
+      debounceDelay = debounceDelay['default'];
+    } else if (isNumber(debounceDelay['*'])) {
+      debounceDelay = debounceDelay['*'];
     }
 
-    $timeout.cancel(pendingDebounce);
-    if (debounceDelay) {
-      pendingDebounce = $timeout(function() {
-        ctrl.$commitViewValue();
+    this.$$timeout.cancel(this.$$pendingDebounce);
+    var that = this;
+    if (debounceDelay > 0) { // this fails if debounceDelay is an object
+      this.$$pendingDebounce = this.$$timeout(function() {
+        that.$commitViewValue();
       }, debounceDelay);
-    } else if ($rootScope.$$phase) {
-      ctrl.$commitViewValue();
+    } else if (this.$$rootScope.$$phase) {
+      this.$commitViewValue();
     } else {
-      $scope.$apply(function() {
-        ctrl.$commitViewValue();
+      this.$$scope.$apply(function() {
+        that.$commitViewValue();
       });
     }
-  };
+  },
+
+  /**
+   * @ngdoc method
+   *
+   * @name ngModel.NgModelController#$overrideModelOptions
+   *
+   * @description
+   *
+   * Override the current model options settings programmatically.
+   *
+   * The previous `ModelOptions` value will not be modified. Instead, a
+   * new `ModelOptions` object will inherit from the previous one overriding
+   * or inheriting settings that are defined in the given parameter.
+   *
+   * See {@link ngModelOptions} for information about what options can be specified
+   * and how model option inheritance works.
+   *
+   * <div class="alert alert-warning">
+   * **Note:** this function only affects the options set on the `ngModelController`,
+   * and not the options on the {@link ngModelOptions} directive from which they might have been
+   * obtained initially.
+   * </div>
+   *
+   * <div class="alert alert-danger">
+   * **Note:** it is not possible to override the `getterSetter` option.
+   * </div>
+   *
+   * @param {Object} options a hash of settings to override the previous options
+   *
+   */
+  $overrideModelOptions: function(options) {
+    this.$options = this.$options.createChild(options);
+    this.$$setUpdateOnEvents();
+  },
+
+  /**
+   * @ngdoc method
+   *
+   * @name  ngModel.NgModelController#$processModelValue
+
+   * @description
+   *
+   * Runs the model -> view pipeline on the current
+   * {@link ngModel.NgModelController#$modelValue $modelValue}.
+   *
+   * The following actions are performed by this method:
+   *
+   * - the `$modelValue` is run through the {@link ngModel.NgModelController#$formatters $formatters}
+   * and the result is set to the {@link ngModel.NgModelController#$viewValue $viewValue}
+   * - the `ng-empty` or `ng-not-empty` class is set on the element
+   * - if the `$viewValue` has changed:
+   *   - {@link ngModel.NgModelController#$render $render} is called on the control
+   *   - the {@link ngModel.NgModelController#$validators $validators} are run and
+   *   the validation status is set.
+   *
+   * This method is called by ngModel internally when the bound scope value changes.
+   * Application developers usually do not have to call this function themselves.
+   *
+   * This function can be used when the `$viewValue` or the rendered DOM value are not correctly
+   * formatted and the `$modelValue` must be run through the `$formatters` again.
+   *
+   * @example
+   * Consider a text input with an autocomplete list (for fruit), where the items are
+   * objects with a name and an id.
+   * A user enters `ap` and then selects `Apricot` from the list.
+   * Based on this, the autocomplete widget will call `$setViewValue({name: 'Apricot', id: 443})`,
+   * but the rendered value will still be `ap`.
+   * The widget can then call `ctrl.$processModelValue()` to run the model -> view
+   * pipeline again, which formats the object to the string `Apricot`,
+   * then updates the `$viewValue`, and finally renders it in the DOM.
+   *
+   * <example module="inputExample" name="ng-model-process">
+     <file name="index.html">
+      <div ng-controller="inputController" style="display: flex;">
+        <div style="margin-right: 30px;">
+          Search Fruit:
+          <basic-autocomplete items="items" on-select="selectedFruit = item"></basic-autocomplete>
+        </div>
+        <div>
+          Model:<br>
+          <pre>{{selectedFruit | json}}</pre>
+        </div>
+      </div>
+     </file>
+     <file name="app.js">
+      angular.module('inputExample', [])
+        .controller('inputController', function($scope) {
+          $scope.items = [
+            {name: 'Apricot', id: 443},
+            {name: 'Clementine', id: 972},
+            {name: 'Durian', id: 169},
+            {name: 'Jackfruit', id: 982},
+            {name: 'Strawberry', id: 863}
+          ];
+        })
+        .component('basicAutocomplete', {
+          bindings: {
+            items: '<',
+            onSelect: '&'
+          },
+          templateUrl: 'autocomplete.html',
+          controller: function($element, $scope) {
+            var that = this;
+            var ngModel;
+
+            that.$postLink = function() {
+              ngModel = $element.find('input').controller('ngModel');
+
+              ngModel.$formatters.push(function(value) {
+                return (value && value.name) || value;
+              });
+
+              ngModel.$parsers.push(function(value) {
+                var match = value;
+                for (var i = 0; i < that.items.length; i++) {
+                  if (that.items[i].name === value) {
+                    match = that.items[i];
+                    break;
+                  }
+                }
+
+                return match;
+              });
+            };
+
+            that.selectItem = function(item) {
+              ngModel.$setViewValue(item);
+              ngModel.$processModelValue();
+              that.onSelect({item: item});
+            };
+          }
+        });
+     </file>
+     <file name="autocomplete.html">
+       <div>
+         <input type="search" ng-model="$ctrl.searchTerm" />
+         <ul>
+           <li ng-repeat="item in $ctrl.items | filter:$ctrl.searchTerm">
+             <button ng-click="$ctrl.selectItem(item)">{{ item.name }}</button>
+           </li>
+         </ul>
+       </div>
+     </file>
+   * </example>
+   *
+   */
+  $processModelValue: function() {
+    var viewValue = this.$$format();
+
+    if (this.$viewValue !== viewValue) {
+      this.$$updateEmptyClasses(viewValue);
+      this.$viewValue = this.$$lastCommittedViewValue = viewValue;
+      this.$render();
+      // It is possible that model and view value have been updated during render
+      this.$$runValidators(this.$modelValue, this.$viewValue, noop);
+    }
+  },
+
+  /**
+   * This method is called internally to run the $formatters on the $modelValue
+   */
+  $$format: function() {
+    var formatters = this.$formatters,
+        idx = formatters.length;
+
+    var viewValue = this.$modelValue;
+    while (idx--) {
+      viewValue = formatters[idx](viewValue);
+    }
+
+    return viewValue;
+  },
+
+  /**
+   * This method is called internally when the bound scope value changes.
+   */
+  $$setModelValue: function(modelValue) {
+    this.$modelValue = this.$$rawModelValue = modelValue;
+    this.$$parserValid = undefined;
+    this.$processModelValue();
+  },
+
+  $$setUpdateOnEvents: function() {
+    if (this.$$updateEvents) {
+      this.$$element.off(this.$$updateEvents, this.$$updateEventHandler);
+    }
+
+    this.$$updateEvents = this.$options.getOption('updateOn');
+    if (this.$$updateEvents) {
+      this.$$element.on(this.$$updateEvents, this.$$updateEventHandler);
+    }
+  },
+
+  $$updateEventHandler: function(ev) {
+    this.$$debounceViewValueCommit(ev && ev.type);
+  }
+};
 
+function setupModelWatcher(ctrl) {
   // model -> value
   // Note: we cannot use a normal scope.$watch as we want to detect the following:
   // 1. scope value is 'a'
@@ -28499,47 +31177,63 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
   //    -> scope value did not change since the last digest as
   //       ng-change executes in apply phase
   // 4. view should be changed back to 'a'
-  $scope.$watch(function ngModelWatch() {
-    var modelValue = ngModelGet($scope);
+  ctrl.$$scope.$watch(function ngModelWatch(scope) {
+    var modelValue = ctrl.$$ngModelGet(scope);
 
     // if scope model value and ngModel value are out of sync
-    // TODO(perf): why not move this to the action fn?
+    // This cannot be moved to the action function, because it would not catch the
+    // case where the model is changed in the ngChange function or the model setter
     if (modelValue !== ctrl.$modelValue &&
-       // checks for NaN is needed to allow setting the model to NaN when there's an asyncValidator
-        // eslint-disable-next-line no-self-compare
-       (ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue)
+      // checks for NaN is needed to allow setting the model to NaN when there's an asyncValidator
+      // eslint-disable-next-line no-self-compare
+      (ctrl.$modelValue === ctrl.$modelValue || modelValue === modelValue)
     ) {
-      ctrl.$modelValue = ctrl.$$rawModelValue = modelValue;
-      parserValid = undefined;
-
-      var formatters = ctrl.$formatters,
-          idx = formatters.length;
-
-      var viewValue = modelValue;
-      while (idx--) {
-        viewValue = formatters[idx](viewValue);
-      }
-      if (ctrl.$viewValue !== viewValue) {
-        ctrl.$$updateEmptyClasses(viewValue);
-        ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;
-        ctrl.$render();
-
-        // It is possible that model and view value have been updated during render
-        ctrl.$$runValidators(ctrl.$modelValue, ctrl.$viewValue, noop);
-      }
+      ctrl.$$setModelValue(modelValue);
     }
 
     return modelValue;
   });
-}];
+}
+
+/**
+ * @ngdoc method
+ * @name ngModel.NgModelController#$setValidity
+ *
+ * @description
+ * Change the validity state, and notify the form.
+ *
+ * This method can be called within $parsers/$formatters or a custom validation implementation.
+ * However, in most cases it should be sufficient to use the `ngModel.$validators` and
+ * `ngModel.$asyncValidators` collections which will call `$setValidity` automatically.
+ *
+ * @param {string} validationErrorKey Name of the validator. The `validationErrorKey` will be assigned
+ *        to either `$error[validationErrorKey]` or `$pending[validationErrorKey]`
+ *        (for unfulfilled `$asyncValidators`), so that it is available for data-binding.
+ *        The `validationErrorKey` should be in camelCase and will get converted into dash-case
+ *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`
+ *        classes and can be bound to as `{{ someForm.someControl.$error.myError }}`.
+ * @param {boolean} isValid Whether the current state is valid (true), invalid (false), pending (undefined),
+ *                          or skipped (null). Pending is used for unfulfilled `$asyncValidators`.
+ *                          Skipped is used by AngularJS when validators do not run because of parse errors and
+ *                          when `$asyncValidators` do not run because any of the `$validators` failed.
+ */
+addSetValidityMethod({
+  clazz: NgModelController,
+  set: function(object, property) {
+    object[property] = true;
+  },
+  unset: function(object, property) {
+    delete object[property];
+  }
+});
 
 
 /**
  * @ngdoc directive
  * @name ngModel
- *
- * @element input
+ * @restrict A
  * @priority 1
+ * @param {expression} ngModel assignable {@link guide/expression Expression} to bind to.
  *
  * @description
  * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a
@@ -28581,7 +31275,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
  *  - {@link ng.directive:select select}
  *  - {@link ng.directive:textarea textarea}
  *
- * # Complex Models (objects or collections)
+ * ## Complex Models (objects or collections)
  *
  * By default, `ngModel` watches the model by reference, not value. This is important to know when
  * binding inputs to models that are objects (e.g. `Date`) or collections (e.g. arrays). If only properties of the
@@ -28597,7 +31291,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
  * first level of the object (or only changing the properties of an item in the collection if it's an array) will still
  * not trigger a re-rendering of the model.
  *
- * # CSS classes
+ * ## CSS classes
  * The following CSS classes are added and removed on the associated input/select/textarea element
  * depending on the validity of the model.
  *
@@ -28616,8 +31310,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
  *
  * Keep in mind that ngAnimate can detect each of these classes when added and removed.
  *
- * ## Animation Hooks
- *
+ * @animations
  * Animations within models are triggered when any of the associated CSS classes are added and removed
  * on the input element which is attached to the model. These classes include: `.ng-pristine`, `.ng-dirty`,
  * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.
@@ -28641,6 +31334,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
  * </pre>
  *
  * @example
+ * ### Basic Usage
  * <example deps="angular-animate.js" animations="true" fixBase="true" module="inputExample" name="ng-model">
      <file name="index.html">
        <script>
@@ -28670,7 +31364,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
      </file>
  * </example>
  *
- * ## Binding to a getter/setter
+ * @example
+ * ### Binding to a getter/setter
  *
  * Sometimes it's helpful to bind `ngModel` to a getter/setter function.  A getter/setter is a
  * function that returns a representation of the model when called with zero arguments, and sets
@@ -28679,7 +31374,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
  * to the view.
  *
  * <div class="alert alert-success">
- * **Best Practice:** It's best to keep getters fast because Angular is likely to call them more
+ * **Best Practice:** It's best to keep getters fast because AngularJS is likely to call them more
  * frequently than other parts of your code.
  * </div>
  *
@@ -28737,9 +31432,14 @@ var ngModelDirective = ['$rootScope', function($rootScope) {
       return {
         pre: function ngModelPreLink(scope, element, attr, ctrls) {
           var modelCtrl = ctrls[0],
-              formCtrl = ctrls[1] || modelCtrl.$$parentForm;
+              formCtrl = ctrls[1] || modelCtrl.$$parentForm,
+              optionsCtrl = ctrls[2];
 
-          modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options);
+          if (optionsCtrl) {
+            modelCtrl.$options = optionsCtrl.$options;
+          }
+
+          modelCtrl.$$initGetterSetters();
 
           // notify others, especially parent forms
           formCtrl.$addControl(modelCtrl);
@@ -28756,19 +31456,19 @@ var ngModelDirective = ['$rootScope', function($rootScope) {
         },
         post: function ngModelPostLink(scope, element, attr, ctrls) {
           var modelCtrl = ctrls[0];
-          if (modelCtrl.$options && modelCtrl.$options.updateOn) {
-            element.on(modelCtrl.$options.updateOn, function(ev) {
-              modelCtrl.$$debounceViewValueCommit(ev && ev.type);
-            });
+          modelCtrl.$$setUpdateOnEvents();
+
+          function setTouched() {
+            modelCtrl.$setTouched();
           }
 
           element.on('blur', function() {
             if (modelCtrl.$touched) return;
 
             if ($rootScope.$$phase) {
-              scope.$evalAsync(modelCtrl.$setTouched);
+              scope.$evalAsync(setTouched);
             } else {
-              scope.$apply(modelCtrl.$setTouched);
+              scope.$apply(setTouched);
             }
           });
         }
@@ -28777,25 +31477,175 @@ var ngModelDirective = ['$rootScope', function($rootScope) {
   };
 }];
 
-
-
+/* exported defaultModelOptions */
+var defaultModelOptions;
 var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/;
 
 /**
- * @ngdoc directive
- * @name ngModelOptions
+ * @ngdoc type
+ * @name ModelOptions
+ * @description
+ * A container for the options set by the {@link ngModelOptions} directive
+ */
+function ModelOptions(options) {
+  this.$$options = options;
+}
+
+ModelOptions.prototype = {
+
+  /**
+   * @ngdoc method
+   * @name ModelOptions#getOption
+   * @param {string} name the name of the option to retrieve
+   * @returns {*} the value of the option
+   * @description
+   * Returns the value of the given option
+   */
+  getOption: function(name) {
+    return this.$$options[name];
+  },
+
+  /**
+   * @ngdoc method
+   * @name ModelOptions#createChild
+   * @param {Object} options a hash of options for the new child that will override the parent's options
+   * @return {ModelOptions} a new `ModelOptions` object initialized with the given options.
+   */
+  createChild: function(options) {
+    var inheritAll = false;
+
+    // make a shallow copy
+    options = extend({}, options);
+
+    // Inherit options from the parent if specified by the value `"$inherit"`
+    forEach(options, /** @this */ function(option, key) {
+      if (option === '$inherit') {
+        if (key === '*') {
+          inheritAll = true;
+        } else {
+          options[key] = this.$$options[key];
+          // `updateOn` is special so we must also inherit the `updateOnDefault` option
+          if (key === 'updateOn') {
+            options.updateOnDefault = this.$$options.updateOnDefault;
+          }
+        }
+      } else {
+        if (key === 'updateOn') {
+          // If the `updateOn` property contains the `default` event then we have to remove
+          // it from the event list and set the `updateOnDefault` flag.
+          options.updateOnDefault = false;
+          options[key] = trim(option.replace(DEFAULT_REGEXP, function() {
+            options.updateOnDefault = true;
+            return ' ';
+          }));
+        }
+      }
+    }, this);
+
+    if (inheritAll) {
+      // We have a property of the form: `"*": "$inherit"`
+      delete options['*'];
+      defaults(options, this.$$options);
+    }
+
+    // Finally add in any missing defaults
+    defaults(options, defaultModelOptions.$$options);
+
+    return new ModelOptions(options);
+  }
+};
+
+
+defaultModelOptions = new ModelOptions({
+  updateOn: '',
+  updateOnDefault: true,
+  debounce: 0,
+  getterSetter: false,
+  allowInvalid: false,
+  timezone: null
+});
+
+
+/**
+ * @ngdoc directive
+ * @name ngModelOptions
+ * @restrict A
+ * @priority 10
  *
  * @description
- * Allows tuning how model updates are done. Using `ngModelOptions` you can specify a custom list of
- * events that will trigger a model update and/or a debouncing delay so that the actual update only
- * takes place when a timer expires; this timer will be reset after another change takes place.
+ * This directive allows you to modify the behaviour of {@link ngModel} directives within your
+ * application. You can specify an `ngModelOptions` directive on any element. All {@link ngModel}
+ * directives will use the options of their nearest `ngModelOptions` ancestor.
+ *
+ * The `ngModelOptions` settings are found by evaluating the value of the attribute directive as
+ * an AngularJS expression. This expression should evaluate to an object, whose properties contain
+ * the settings. For example: `<div ng-model-options="{ debounce: 100 }"`.
+ *
+ * ## Inheriting Options
+ *
+ * You can specify that an `ngModelOptions` setting should be inherited from a parent `ngModelOptions`
+ * directive by giving it the value of `"$inherit"`.
+ * Then it will inherit that setting from the first `ngModelOptions` directive found by traversing up the
+ * DOM tree. If there is no ancestor element containing an `ngModelOptions` directive then default settings
+ * will be used.
+ *
+ * For example given the following fragment of HTML
+ *
+ *
+ * ```html
+ * <div ng-model-options="{ allowInvalid: true, debounce: 200 }">
+ *   <form ng-model-options="{ updateOn: 'blur', allowInvalid: '$inherit' }">
+ *     <input ng-model-options="{ updateOn: 'default', allowInvalid: '$inherit' }" />
+ *   </form>
+ * </div>
+ * ```
+ *
+ * the `input` element will have the following settings
+ *
+ * ```js
+ * { allowInvalid: true, updateOn: 'default', debounce: 0 }
+ * ```
+ *
+ * Notice that the `debounce` setting was not inherited and used the default value instead.
+ *
+ * You can specify that all undefined settings are automatically inherited from an ancestor by
+ * including a property with key of `"*"` and value of `"$inherit"`.
+ *
+ * For example given the following fragment of HTML
+ *
+ *
+ * ```html
+ * <div ng-model-options="{ allowInvalid: true, debounce: 200 }">
+ *   <form ng-model-options="{ updateOn: 'blur', "*": '$inherit' }">
+ *     <input ng-model-options="{ updateOn: 'default', "*": '$inherit' }" />
+ *   </form>
+ * </div>
+ * ```
+ *
+ * the `input` element will have the following settings
+ *
+ * ```js
+ * { allowInvalid: true, updateOn: 'default', debounce: 200 }
+ * ```
+ *
+ * Notice that the `debounce` setting now inherits the value from the outer `<div>` element.
+ *
+ * If you are creating a reusable component then you should be careful when using `"*": "$inherit"`
+ * since you may inadvertently inherit a setting in the future that changes the behavior of your component.
+ *
+ *
+ * ## Triggering and debouncing model updates
+ *
+ * The `updateOn` and `debounce` properties allow you to specify a custom list of events that will
+ * trigger a model update and/or a debouncing delay so that the actual update only takes place when
+ * a timer expires; this timer will be reset after another change takes place.
  *
  * Given the nature of `ngModelOptions`, the value displayed inside input fields in the view might
  * be different from the value in the actual model. This means that if you update the model you
- * should also invoke {@link ngModel.NgModelController `$rollbackViewValue`} on the relevant input field in
+ * should also invoke {@link ngModel.NgModelController#$rollbackViewValue} on the relevant input field in
  * order to make sure it is synchronized with the model and that any debounced action is canceled.
  *
- * The easiest way to reference the control's {@link ngModel.NgModelController `$rollbackViewValue`}
+ * The easiest way to reference the control's {@link ngModel.NgModelController#$rollbackViewValue}
  * method is by making sure the input is placed inside a form that has a `name` attribute. This is
  * important because `form` controllers are published to the related scope under the name in their
  * `name` attribute.
@@ -28804,271 +31654,406 @@ var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/;
  * `submit` event. Note that `ngClick` events will occur before the model is updated. Use `ngSubmit`
  * to have access to the updated model.
  *
- * `ngModelOptions` has an effect on the element it's declared on and its descendants.
+ * ### Overriding immediate updates
  *
- * @param {Object} ngModelOptions options to apply to the current model. Valid keys are:
- *   - `updateOn`: string specifying which event should the input be bound to. You can set several
- *     events using an space delimited list. There is a special event called `default` that
- *     matches the default events belonging of the control.
- *   - `debounce`: integer value which contains the debounce model update value in milliseconds. A
- *     value of 0 triggers an immediate update. If an object is supplied instead, you can specify a
- *     custom value for each event. For example:
- *     `ng-model-options="{ updateOn: 'default blur', debounce: { 'default': 500, 'blur': 0 } }"`
- *   - `allowInvalid`: boolean value which indicates that the model can be set with values that did
- *     not validate correctly instead of the default behavior of setting the model to undefined.
- *   - `getterSetter`: boolean value which determines whether or not to treat functions bound to
-       `ngModel` as getters/setters.
- *   - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for
- *     `<input type="date">`, `<input type="time">`, ... . It understands UTC/GMT and the
- *     continental US time zone abbreviations, but for general use, use a time zone offset, for
- *     example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian)
- *     If not specified, the timezone of the browser will be used.
+ * The following example shows how to override immediate updates. Changes on the inputs within the
+ * form will update the model only when the control loses focus (blur event). If `escape` key is
+ * pressed while the input field is focused, the value is reset to the value in the current model.
  *
- * @example
-
-  The following example shows how to override immediate updates. Changes on the inputs within the
-  form will update the model only when the control loses focus (blur event). If `escape` key is
-  pressed while the input field is focused, the value is reset to the value in the current model.
-
-  <example name="ngModelOptions-directive-blur" module="optionsExample">
+ * <example name="ngModelOptions-directive-blur" module="optionsExample">
+ *   <file name="index.html">
+ *     <div ng-controller="ExampleController">
+ *       <form name="userForm">
+ *         <label>
+ *           Name:
+ *           <input type="text" name="userName"
+ *                  ng-model="user.name"
+ *                  ng-model-options="{ updateOn: 'blur' }"
+ *                  ng-keyup="cancel($event)" />
+ *         </label><br />
+ *         <label>
+ *           Other data:
+ *           <input type="text" ng-model="user.data" />
+ *         </label><br />
+ *       </form>
+ *       <pre>user.name = <span ng-bind="user.name"></span></pre>
+ *     </div>
+ *   </file>
+ *   <file name="app.js">
+ *     angular.module('optionsExample', [])
+ *       .controller('ExampleController', ['$scope', function($scope) {
+ *         $scope.user = { name: 'say', data: '' };
+ *
+ *         $scope.cancel = function(e) {
+ *           if (e.keyCode === 27) {
+ *             $scope.userForm.userName.$rollbackViewValue();
+ *           }
+ *         };
+ *       }]);
+ *   </file>
+ *   <file name="protractor.js" type="protractor">
+ *     var model = element(by.binding('user.name'));
+ *     var input = element(by.model('user.name'));
+ *     var other = element(by.model('user.data'));
+ *
+ *     it('should allow custom events', function() {
+ *       input.sendKeys(' hello');
+ *       input.click();
+ *       expect(model.getText()).toEqual('say');
+ *       other.click();
+ *       expect(model.getText()).toEqual('say hello');
+ *     });
+ *
+ *     it('should $rollbackViewValue when model changes', function() {
+ *       input.sendKeys(' hello');
+ *       expect(input.getAttribute('value')).toEqual('say hello');
+ *       input.sendKeys(protractor.Key.ESCAPE);
+ *       expect(input.getAttribute('value')).toEqual('say');
+ *       other.click();
+ *       expect(model.getText()).toEqual('say');
+ *     });
+ *   </file>
+ * </example>
+ *
+ * ### Debouncing updates
+ *
+ * The next example shows how to debounce model changes. Model will be updated only 1 sec after last change.
+ * If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.
+ *
+ * <example name="ngModelOptions-directive-debounce" module="optionsExample">
+ *   <file name="index.html">
+ *     <div ng-controller="ExampleController">
+ *       <form name="userForm">
+ *         Name:
+ *         <input type="text" name="userName"
+ *                ng-model="user.name"
+ *                ng-model-options="{ debounce: 1000 }" />
+ *         <button ng-click="userForm.userName.$rollbackViewValue(); user.name=''">Clear</button><br />
+ *       </form>
+ *       <pre>user.name = <span ng-bind="user.name"></span></pre>
+ *     </div>
+ *   </file>
+ *   <file name="app.js">
+ *     angular.module('optionsExample', [])
+ *       .controller('ExampleController', ['$scope', function($scope) {
+ *         $scope.user = { name: 'say' };
+ *       }]);
+ *   </file>
+ * </example>
+ *
+ * ### Default events, extra triggers, and catch-all debounce values
+ *
+ * This example shows the relationship between "default" update events and
+ * additional `updateOn` triggers.
+ *
+ * `default` events are those that are bound to the control, and when fired, update the `$viewValue`
+ * via {@link ngModel.NgModelController#$setViewValue $setViewValue}. Every event that is not listed
+ * in `updateOn` is considered a "default" event, since different control types have different
+ * default events.
+ *
+ * The control in this example updates by "default", "click", and "blur", with different `debounce`
+ * values. You can see that "click" doesn't have an individual `debounce` value -
+ * therefore it uses the `*` debounce value.
+ *
+ * There is also a button that calls {@link ngModel.NgModelController#$setViewValue $setViewValue}
+ * directly with a "custom" event. Since "custom" is not defined in the `updateOn` list,
+ * it is considered a "default" event and will update the
+ * control if "default" is defined in `updateOn`, and will receive the "default" debounce value.
+ * Note that this is just to illustrate how custom controls would possibly call `$setViewValue`.
+ *
+ * You can change the `updateOn` and `debounce` configuration to test different scenarios. This
+ * is done with {@link ngModel.NgModelController#$overrideModelOptions $overrideModelOptions}.
+ *
+  <example name="ngModelOptions-advanced" module="optionsExample">
     <file name="index.html">
-      <div ng-controller="ExampleController">
-        <form name="userForm">
-          <label>Name:
-            <input type="text" name="userName"
-                   ng-model="user.name"
-                   ng-model-options="{ updateOn: 'blur' }"
-                   ng-keyup="cancel($event)" />
-          </label><br />
-          <label>Other data:
-            <input type="text" ng-model="user.data" />
-          </label><br />
-        </form>
-        <pre>user.name = <span ng-bind="user.name"></span></pre>
-        <pre>user.data = <span ng-bind="user.data"></span></pre>
-      </div>
+       <model-update-demo></model-update-demo>
     </file>
     <file name="app.js">
       angular.module('optionsExample', [])
-        .controller('ExampleController', ['$scope', function($scope) {
-          $scope.user = { name: 'John', data: '' };
+        .component('modelUpdateDemo', {
+          templateUrl: 'template.html',
+          controller: function() {
+            this.name = 'Chinua';
+
+            this.options = {
+              updateOn: 'default blur click',
+              debounce: {
+                default: 2000,
+                blur: 0,
+                '*': 1000
+              }
+            };
 
-          $scope.cancel = function(e) {
-            if (e.keyCode === 27) {
-              $scope.userForm.userName.$rollbackViewValue();
-            }
-          };
-        }]);
-    </file>
-    <file name="protractor.js" type="protractor">
-      var model = element(by.binding('user.name'));
-      var input = element(by.model('user.name'));
-      var other = element(by.model('user.data'));
-
-      it('should allow custom events', function() {
-        input.sendKeys(' Doe');
-        input.click();
-        expect(model.getText()).toEqual('John');
-        other.click();
-        expect(model.getText()).toEqual('John Doe');
-      });
+            this.updateEvents = function() {
+              var eventList = this.options.updateOn.split(' ');
+              eventList.push('*');
+              var events = {};
 
-      it('should $rollbackViewValue when model changes', function() {
-        input.sendKeys(' Doe');
-        expect(input.getAttribute('value')).toEqual('John Doe');
-        input.sendKeys(protractor.Key.ESCAPE);
-        expect(input.getAttribute('value')).toEqual('John');
-        other.click();
-        expect(model.getText()).toEqual('John');
-      });
-    </file>
-  </example>
+              for (var i = 0; i < eventList.length; i++) {
+                events[eventList[i]] = this.options.debounce[eventList[i]];
+              }
 
-  This one shows how to debounce model changes. Model will be updated only 1 sec after last change.
-  If the `Clear` button is pressed, any debounced action is canceled and the value becomes empty.
+              this.events = events;
+            };
 
-  <example name="ngModelOptions-directive-debounce" module="optionsExample">
-    <file name="index.html">
-      <div ng-controller="ExampleController">
-        <form name="userForm">
-          <label>Name:
-            <input type="text" name="userName"
-                   ng-model="user.name"
-                   ng-model-options="{ debounce: 1000 }" />
-          </label>
-          <button ng-click="userForm.userName.$rollbackViewValue(); user.name=''">Clear</button>
-          <br />
-        </form>
-        <pre>user.name = <span ng-bind="user.name"></span></pre>
-      </div>
-    </file>
-    <file name="app.js">
-      angular.module('optionsExample', [])
-        .controller('ExampleController', ['$scope', function($scope) {
-          $scope.user = { name: 'Igor' };
-        }]);
-    </file>
-  </example>
+            this.updateOptions = function() {
+              var options = angular.extend(this.options, {
+                updateOn: Object.keys(this.events).join(' ').replace('*', ''),
+                debounce: this.events
+              });
 
-  This one shows how to bind to getter/setters:
+              this.form.input.$overrideModelOptions(options);
+            };
 
-  <example name="ngModelOptions-directive-getter-setter" module="getterSetterExample">
-    <file name="index.html">
-      <div ng-controller="ExampleController">
-        <form name="userForm">
-          <label>Name:
-            <input type="text" name="userName"
-                   ng-model="user.name"
-                   ng-model-options="{ getterSetter: true }" />
-          </label>
-        </form>
-        <pre>user.name = <span ng-bind="user.name()"></span></pre>
-      </div>
+            // Initialize the event form
+            this.updateEvents();
+          }
+        });
     </file>
-    <file name="app.js">
-      angular.module('getterSetterExample', [])
-        .controller('ExampleController', ['$scope', function($scope) {
-          var _name = 'Brian';
-          $scope.user = {
-            name: function(newName) {
-              // Note that newName can be undefined for two reasons:
-              // 1. Because it is called as a getter and thus called with no arguments
-              // 2. Because the property should actually be set to undefined. This happens e.g. if the
-              //    input is invalid
-              return arguments.length ? (_name = newName) : _name;
-            }
-          };
-        }]);
+    <file name="template.html">
+      <form name="$ctrl.form">
+        Input: <input type="text" name="input" ng-model="$ctrl.name" ng-model-options="$ctrl.options" />
+      </form>
+      Model: <tt>{{$ctrl.name}}</tt>
+      <hr>
+      <button ng-click="$ctrl.form.input.$setViewValue('some value', 'custom')">Trigger setViewValue with 'some value' and 'custom' event</button>
+
+      <hr>
+      <form ng-submit="$ctrl.updateOptions()">
+        <b>updateOn</b><br>
+        <input type="text" ng-model="$ctrl.options.updateOn" ng-change="$ctrl.updateEvents()" ng-model-options="{debounce: 500}">
+
+        <table>
+          <tr>
+            <th>Option</th>
+            <th>Debounce value</th>
+          </tr>
+          <tr ng-repeat="(key, value) in $ctrl.events">
+            <td>{{key}}</td>
+            <td><input type="number" ng-model="$ctrl.events[key]" /></td>
+          </tr>
+        </table>
+
+        <br>
+        <input type="submit" value="Update options">
+      </form>
     </file>
   </example>
+ *
+ *
+ * ## Model updates and validation
+ *
+ * The default behaviour in `ngModel` is that the model value is set to `undefined` when the
+ * validation determines that the value is invalid. By setting the `allowInvalid` property to true,
+ * the model will still be updated even if the value is invalid.
+ *
+ *
+ * ## Connecting to the scope
+ *
+ * By setting the `getterSetter` property to true you are telling ngModel that the `ngModel` expression
+ * on the scope refers to a "getter/setter" function rather than the value itself.
+ *
+ * The following example shows how to bind to getter/setters:
+ *
+ * <example name="ngModelOptions-directive-getter-setter" module="getterSetterExample">
+ *   <file name="index.html">
+ *     <div ng-controller="ExampleController">
+ *       <form name="userForm">
+ *         <label>
+ *           Name:
+ *           <input type="text" name="userName"
+ *                  ng-model="user.name"
+ *                  ng-model-options="{ getterSetter: true }" />
+ *         </label>
+ *       </form>
+ *       <pre>user.name = <span ng-bind="user.name()"></span></pre>
+ *     </div>
+ *   </file>
+ *   <file name="app.js">
+ *     angular.module('getterSetterExample', [])
+ *       .controller('ExampleController', ['$scope', function($scope) {
+ *         var _name = 'Brian';
+ *         $scope.user = {
+ *           name: function(newName) {
+ *             return angular.isDefined(newName) ? (_name = newName) : _name;
+ *           }
+ *         };
+ *       }]);
+ *   </file>
+ * </example>
+ *
+ *
+ * ## Programmatically changing options
+ *
+ * The `ngModelOptions` expression is only evaluated once when the directive is linked; it is not
+ * watched for changes. However, it is possible to override the options on a single
+ * {@link ngModel.NgModelController} instance with
+ * {@link ngModel.NgModelController#$overrideModelOptions `NgModelController#$overrideModelOptions()`}.
+ * See also the example for
+ * {@link ngModelOptions#default-events-extra-triggers-and-catch-all-debounce-values
+ * Default events, extra triggers, and catch-all debounce values}.
+ *
+ *
+ * ## Specifying timezones
+ *
+ * You can specify the timezone that date/time input directives expect by providing its name in the
+ * `timezone` property.
+ *
+ *
+ * ## Formatting the value of `time` and `datetime-local`
+ *
+ * With the options `timeSecondsFormat` and `timeStripZeroSeconds` it is possible to adjust the value
+ * that is displayed in the control. Note that browsers may apply their own formatting
+ * in the user interface.
+ *
+   <example name="ngModelOptions-time-format" module="timeExample">
+     <file name="index.html">
+       <time-example></time-example>
+     </file>
+     <file name="script.js">
+        angular.module('timeExample', [])
+          .component('timeExample', {
+            templateUrl: 'timeExample.html',
+            controller: function() {
+              this.time = new Date(1970, 0, 1, 14, 57, 0);
+
+              this.options = {
+                timeSecondsFormat: 'ss',
+                timeStripZeroSeconds: true
+              };
+
+              this.optionChange = function() {
+                this.timeForm.timeFormatted.$overrideModelOptions(this.options);
+                this.time = new Date(this.time);
+              };
+            }
+          });
+     </file>
+     <file name="timeExample.html">
+       <form name="$ctrl.timeForm">
+         <strong>Default</strong>:
+         <input type="time" ng-model="$ctrl.time" step="any" /><br>
+         <strong>With options</strong>:
+         <input type="time" name="timeFormatted" ng-model="$ctrl.time" step="any" ng-model-options="$ctrl.options" />
+         <br>
+
+         Options:<br>
+         <code>timeSecondsFormat</code>:
+         <input
+           type="text"
+           ng-model="$ctrl.options.timeSecondsFormat"
+           ng-change="$ctrl.optionChange()">
+         <br>
+         <code>timeStripZeroSeconds</code>:
+         <input
+           type="checkbox"
+           ng-model="$ctrl.options.timeStripZeroSeconds"
+           ng-change="$ctrl.optionChange()">
+        </form>
+      </file>
+ *  </example>
+ *
+ * @param {Object} ngModelOptions options to apply to {@link ngModel} directives on this element and
+ *   and its descendents.
+ *
+ * **General options**:
+ *
+ *   - `updateOn`: string specifying which event should the input be bound to. You can set several
+ *     events using an space delimited list. There is a special event called `default` that
+ *     matches the default events belonging to the control. These are the events that are bound to
+ *     the control, and when fired, update the `$viewValue` via `$setViewValue`.
+ *
+ *     `ngModelOptions` considers every event that is not listed in `updateOn` a "default" event,
+ *     since different control types use different default events.
+ *
+ *     See also the section {@link ngModelOptions#triggering-and-debouncing-model-updates
+ *     Triggering and debouncing model updates}.
+ *
+ *   - `debounce`: integer value which contains the debounce model update value in milliseconds. A
+ *     value of 0 triggers an immediate update. If an object is supplied instead, you can specify a
+ *     custom value for each event. For example:
+ *     ```
+ *     ng-model-options="{
+ *       updateOn: 'default blur',
+ *       debounce: { 'default': 500, 'blur': 0 }
+ *     }"
+ *     ```
+ *     You can use the `*` key to specify a debounce value that applies to all events that are not
+ *     specifically listed. In the following example, `mouseup` would have a debounce delay of 1000:
+ *     ```
+ *     ng-model-options="{
+ *       updateOn: 'default blur mouseup',
+ *       debounce: { 'default': 500, 'blur': 0, '*': 1000 }
+ *     }"
+ *     ```
+ *   - `allowInvalid`: boolean value which indicates that the model can be set with values that did
+ *     not validate correctly instead of the default behavior of setting the model to undefined.
+ *   - `getterSetter`: boolean value which determines whether or not to treat functions bound to
+ *     `ngModel` as getters/setters.
+ *
+ *
+ *  **Input-type specific options**:
+ *
+ *   - `timezone`: Defines the timezone to be used to read/write the `Date` instance in the model for
+ *     `<input type="date" />`, `<input type="time" />`, ... . It understands UTC/GMT and the
+ *     continental US time zone abbreviations, but for general use, use a time zone offset, for
+ *     example, `'+0430'` (4 hours, 30 minutes east of the Greenwich meridian)
+ *     If not specified, the timezone of the browser will be used.
+ *     Note that changing the timezone will have no effect on the current date, and is only applied after
+ *     the next input / model change.
+ *
+ *   - `timeSecondsFormat`: Defines if the `time` and `datetime-local` types should show seconds and
+ *     milliseconds. The option follows the format string of {@link date date filter}.
+ *     By default, the options is `undefined` which is equal to `'ss.sss'` (seconds and milliseconds).
+ *     The other options are `'ss'` (strips milliseconds), and `''` (empty string), which strips both
+ *     seconds and milliseconds.
+ *     Note that browsers that support `time` and `datetime-local` require the hour and minutes
+ *     part of the time string, and may show the value differently in the user interface.
+ *     {@link ngModelOptions#formatting-the-value-of-time-and-datetime-local- See the example}.
+ *
+ *   - `timeStripZeroSeconds`: Defines if the `time` and `datetime-local` types should strip the
+ *     seconds and milliseconds from the formatted value if they are zero. This option is applied
+ *     after `timeSecondsFormat`.
+ *     This option can be used to make the formatting consistent over different browsers, as some
+ *     browsers with support for `time` will natively hide the milliseconds and
+ *     seconds if they are zero, but others won't, and browsers that don't implement these input
+ *     types will always show the full string.
+ *     {@link ngModelOptions#formatting-the-value-of-time-and-datetime-local- See the example}.
+ *
  */
 var ngModelOptionsDirective = function() {
-  return {
-    restrict: 'A',
-    controller: ['$scope', '$attrs', function NgModelOptionsController($scope, $attrs) {
-      var that = this;
-      this.$options = copy($scope.$eval($attrs.ngModelOptions));
-      // Allow adding/overriding bound events
-      if (isDefined(this.$options.updateOn)) {
-        this.$options.updateOnDefault = false;
-        // extract "default" pseudo-event from list of events that can trigger a model update
-        this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() {
-          that.$options.updateOnDefault = true;
-          return ' ';
-        }));
-      } else {
-        this.$options.updateOnDefault = true;
-      }
-    }]
-  };
-};
-
-
-
-// helper methods
-function addSetValidityMethod(context) {
-  var ctrl = context.ctrl,
-      $element = context.$element,
-      classCache = {},
-      set = context.set,
-      unset = context.unset,
-      $animate = context.$animate;
-
-  classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS));
-
-  ctrl.$setValidity = setValidity;
-
-  function setValidity(validationErrorKey, state, controller) {
-    if (isUndefined(state)) {
-      createAndSet('$pending', validationErrorKey, controller);
-    } else {
-      unsetAndCleanup('$pending', validationErrorKey, controller);
-    }
-    if (!isBoolean(state)) {
-      unset(ctrl.$error, validationErrorKey, controller);
-      unset(ctrl.$$success, validationErrorKey, controller);
-    } else {
-      if (state) {
-        unset(ctrl.$error, validationErrorKey, controller);
-        set(ctrl.$$success, validationErrorKey, controller);
-      } else {
-        set(ctrl.$error, validationErrorKey, controller);
-        unset(ctrl.$$success, validationErrorKey, controller);
-      }
-    }
-    if (ctrl.$pending) {
-      cachedToggleClass(PENDING_CLASS, true);
-      ctrl.$valid = ctrl.$invalid = undefined;
-      toggleValidationCss('', null);
-    } else {
-      cachedToggleClass(PENDING_CLASS, false);
-      ctrl.$valid = isObjectEmpty(ctrl.$error);
-      ctrl.$invalid = !ctrl.$valid;
-      toggleValidationCss('', ctrl.$valid);
-    }
-
-    // re-read the state as the set/unset methods could have
-    // combined state in ctrl.$error[validationError] (used for forms),
-    // where setting/unsetting only increments/decrements the value,
-    // and does not replace it.
-    var combinedState;
-    if (ctrl.$pending && ctrl.$pending[validationErrorKey]) {
-      combinedState = undefined;
-    } else if (ctrl.$error[validationErrorKey]) {
-      combinedState = false;
-    } else if (ctrl.$$success[validationErrorKey]) {
-      combinedState = true;
-    } else {
-      combinedState = null;
-    }
-
-    toggleValidationCss(validationErrorKey, combinedState);
-    ctrl.$$parentForm.$setValidity(validationErrorKey, combinedState, ctrl);
+  NgModelOptionsController.$inject = ['$attrs', '$scope'];
+  function NgModelOptionsController($attrs, $scope) {
+    this.$$attrs = $attrs;
+    this.$$scope = $scope;
   }
+  NgModelOptionsController.prototype = {
+    $onInit: function() {
+      var parentOptions = this.parentCtrl ? this.parentCtrl.$options : defaultModelOptions;
+      var modelOptionsDefinition = this.$$scope.$eval(this.$$attrs.ngModelOptions);
 
-  function createAndSet(name, value, controller) {
-    if (!ctrl[name]) {
-      ctrl[name] = {};
+      this.$options = parentOptions.createChild(modelOptionsDefinition);
     }
-    set(ctrl[name], value, controller);
-  }
-
-  function unsetAndCleanup(name, value, controller) {
-    if (ctrl[name]) {
-      unset(ctrl[name], value, controller);
-    }
-    if (isObjectEmpty(ctrl[name])) {
-      ctrl[name] = undefined;
-    }
-  }
-
-  function cachedToggleClass(className, switchValue) {
-    if (switchValue && !classCache[className]) {
-      $animate.addClass($element, className);
-      classCache[className] = true;
-    } else if (!switchValue && classCache[className]) {
-      $animate.removeClass($element, className);
-      classCache[className] = false;
-    }
-  }
+  };
 
-  function toggleValidationCss(validationErrorKey, isValid) {
-    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
+  return {
+    restrict: 'A',
+    // ngModelOptions needs to run before ngModel and input directives
+    priority: 10,
+    require: {parentCtrl: '?^^ngModelOptions'},
+    bindToController: true,
+    controller: NgModelOptionsController
+  };
+};
 
-    cachedToggleClass(VALID_CLASS + validationErrorKey, isValid === true);
-    cachedToggleClass(INVALID_CLASS + validationErrorKey, isValid === false);
-  }
-}
 
-function isObjectEmpty(obj) {
-  if (obj) {
-    for (var prop in obj) {
-      if (obj.hasOwnProperty(prop)) {
-        return false;
-      }
+// shallow copy over values from `src` that are not already specified on `dst`
+function defaults(dst, src) {
+  forEach(src, function(value, key) {
+    if (!isDefined(dst[key])) {
+      dst[key] = value;
     }
-  }
-  return true;
+  });
 }
 
 /**
@@ -29076,32 +32061,31 @@ function isObjectEmpty(obj) {
  * @name ngNonBindable
  * @restrict AC
  * @priority 1000
+ * @element ANY
  *
  * @description
- * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current
- * DOM element. This is useful if the element contains what appears to be Angular directives and
- * bindings but which should be ignored by Angular. This could be the case if you have a site that
- * displays snippets of code, for instance.
- *
- * @element ANY
+ * The `ngNonBindable` directive tells AngularJS not to compile or bind the contents of the current
+ * DOM element, including directives on the element itself that have a lower priority than
+ * `ngNonBindable`. This is useful if the element contains what appears to be AngularJS directives
+ * and bindings but which should be ignored by AngularJS. This could be the case if you have a site
+ * that displays snippets of code, for instance.
  *
  * @example
  * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,
  * but the one wrapped in `ngNonBindable` is left alone.
  *
- * @example
-    <example name="ng-non-bindable">
-      <file name="index.html">
-        <div>Normal: {{1 + 2}}</div>
-        <div ng-non-bindable>Ignored: {{1 + 2}}</div>
-      </file>
-      <file name="protractor.js" type="protractor">
-       it('should check ng-non-bindable', function() {
-         expect(element(by.binding('1 + 2')).getText()).toContain('3');
-         expect(element.all(by.css('div')).last().getText()).toMatch(/1 \+ 2/);
-       });
-      </file>
-    </example>
+  <example name="ng-non-bindable">
+    <file name="index.html">
+      <div>Normal: {{1 + 2}}</div>
+      <div ng-non-bindable>Ignored: {{1 + 2}}</div>
+    </file>
+    <file name="protractor.js" type="protractor">
+     it('should check ng-non-bindable', function() {
+       expect(element(by.binding('1 + 2')).getText()).toContain('3');
+       expect(element.all(by.css('div')).last().getText()).toMatch(/1 \+ 2/);
+     });
+    </file>
+  </example>
  */
 var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
 
@@ -29122,14 +32106,12 @@ var ngOptionsMinErr = minErr('ngOptions');
  * elements for the `<select>` element using the array or object obtained by evaluating the
  * `ngOptions` comprehension expression.
  *
- * In many cases, {@link ng.directive:ngRepeat ngRepeat} can be used on `<option>` elements
- * instead of `ngOptions` to achieve a similar result.
- * However, `ngOptions` provides some benefits such as reducing memory and
- * increasing speed by not creating a new scope for each repeated instance, as well as providing
- * more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the
- * comprehension expression. `ngOptions` should be used when the `<select>` model needs to be bound
- *  to a non-string value. This is because an option element can only be bound to string values at
- * present.
+ * In many cases, {@link ng.directive:ngRepeat ngRepeat} can be used on `<option>` elements instead of
+ * `ngOptions` to achieve a similar result. However, `ngOptions` provides some benefits:
+ * - more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the
+ * comprehension expression
+ * - reduced memory consumption by not creating a new scope for each repeated instance
+ * - increased render speed by creating the options in a documentFragment instead of individually
  *
  * When an item in the `<select>` menu is selected, the array element or object property
  * represented by the selected option will be bound to the model identified by the `ngModel`
@@ -29218,13 +32200,8 @@ var ngOptionsMinErr = minErr('ngOptions');
  * is not matched against any `<option>` and the `<select>` appears as having no selected value.
  *
  *
- * @param {string} ngModel Assignable angular expression to data-bind to.
- * @param {string=} name Property name of the form under which the control is published.
- * @param {string=} required The control is considered valid only if value is entered.
- * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
- *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
- *    `required` when you want to data-bind to the `required` attribute.
- * @param {comprehension_expression=} ngOptions in one of the following forms:
+ * @param {string} ngModel Assignable AngularJS expression to data-bind to.
+ * @param {comprehension_expression} ngOptions in one of the following forms:
  *
  *   * for array data sources:
  *     * `label` **`for`** `value` **`in`** `array`
@@ -29263,6 +32240,13 @@ var ngOptionsMinErr = minErr('ngOptions');
  *      used to identify the objects in the array. The `trackexpr` will most likely refer to the
  *     `value` variable (e.g. `value.propertyName`). With this the selection is preserved
  *      even when the options are recreated (e.g. reloaded from the server).
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required The control is considered valid only if value is entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ *    `required` when you want to data-bind to the `required` attribute.
+ * @param {string=} ngAttrSize sets the size of the select element dynamically. Uses the
+ * {@link guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes ngAttr} directive.
  *
  * @example
     <example module="selectExample" name="select">
@@ -29512,7 +32496,8 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
   }
 
 
-  // we can't just jqLite('<option>') since jqLite is not smart enough
+  // Support: IE 9 only
+  // We can't just jqLite('<option>') since jqLite is not smart enough
   // to create it in <select> and IE barfs otherwise.
   var optionTemplate = window.document.createElement('option'),
       optGroupTemplate = window.document.createElement('optgroup');
@@ -29525,16 +32510,18 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
 
       // The emptyOption allows the application developer to provide their own custom "empty"
       // option when the viewValue does not match any of the option values.
-      var emptyOption;
       for (var i = 0, children = selectElement.children(), ii = children.length; i < ii; i++) {
         if (children[i].value === '') {
-          emptyOption = children.eq(i);
+          selectCtrl.hasEmptyOption = true;
+          selectCtrl.emptyOption = children.eq(i);
           break;
         }
       }
 
-      var providedEmptyOption = !!emptyOption;
-      var emptyOptionRendered = false;
+      // The empty option will be compiled and rendered before we first generate the options
+      selectElement.empty();
+
+      var providedEmptyOption = !!selectCtrl.emptyOption;
 
       var unknownOption = jqLite(optionTemplate.cloneNode(false));
       unknownOption.val('?');
@@ -29546,46 +32533,24 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
       // we only need to create it once.
       var listFragment = $document[0].createDocumentFragment();
 
-      var renderEmptyOption = function() {
-        if (!providedEmptyOption) {
-          selectElement.prepend(emptyOption);
-        }
-        selectElement.val('');
-        if (emptyOptionRendered) {
-          emptyOption.prop('selected', true); // needed for IE
-          emptyOption.attr('selected', true);
-        }
-      };
-
-      var removeEmptyOption = function() {
-        if (!providedEmptyOption) {
-          emptyOption.remove();
-        } else if (emptyOptionRendered) {
-          emptyOption.removeAttr('selected');
-        }
-      };
-
-      var renderUnknownOption = function() {
-        selectElement.prepend(unknownOption);
-        selectElement.val('?');
-        unknownOption.prop('selected', true); // needed for IE
-        unknownOption.attr('selected', true);
-      };
-
-      var removeUnknownOption = function() {
-        unknownOption.remove();
+      // Overwrite the implementation. ngOptions doesn't use hashes
+      selectCtrl.generateUnknownOptionValue = function(val) {
+        return '?';
       };
 
       // Update the controller methods for multiple selectable options
       if (!multiple) {
 
         selectCtrl.writeValue = function writeNgOptionsValue(value) {
-          var selectedOption = options.selectValueMap[selectElement.val()];
+          // The options might not be defined yet when ngModel tries to render
+          if (!options) return;
+
+          var selectedOption = selectElement[0].options[selectElement[0].selectedIndex];
           var option = options.getOptionFromViewValue(value);
 
           // Make sure to remove the selected attribute from the previously selected option
           // Otherwise, screen readers might get confused
-          if (selectedOption) selectedOption.element.removeAttribute('selected');
+          if (selectedOption) selectedOption.removeAttribute('selected');
 
           if (option) {
             // Don't update the option when it is already selected.
@@ -29594,8 +32559,7 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
             // set always
 
             if (selectElement[0].value !== option.selectValue) {
-              removeUnknownOption();
-              removeEmptyOption();
+              selectCtrl.removeUnknownOption();
 
               selectElement[0].value = option.selectValue;
               option.element.selected = true;
@@ -29603,13 +32567,7 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
 
             option.element.setAttribute('selected', 'selected');
           } else {
-            if (value === null || providedEmptyOption) {
-              removeUnknownOption();
-              renderEmptyOption();
-            } else {
-              removeEmptyOption();
-              renderUnknownOption();
-            }
+            selectCtrl.selectUnknownOrEmptyOption(value);
           }
         };
 
@@ -29618,8 +32576,8 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
           var selectedOption = options.selectValueMap[selectElement.val()];
 
           if (selectedOption && !selectedOption.disabled) {
-            removeEmptyOption();
-            removeUnknownOption();
+            selectCtrl.unselectEmptyOption();
+            selectCtrl.removeUnknownOption();
             return options.getViewValueFromOption(selectedOption);
           }
           return null;
@@ -29637,22 +32595,19 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
 
       } else {
 
-        ngModelCtrl.$isEmpty = function(value) {
-          return !value || value.length === 0;
-        };
+        selectCtrl.writeValue = function writeNgOptionsMultiple(values) {
+          // The options might not be defined yet when ngModel tries to render
+          if (!options) return;
 
+          // Only set `<option>.selected` if necessary, in order to prevent some browsers from
+          // scrolling to `<option>` elements that are outside the `<select>` element's viewport.
+          var selectedOptions = values && values.map(getAndUpdateSelectedOption) || [];
 
-        selectCtrl.writeValue = function writeNgOptionsMultiple(value) {
           options.items.forEach(function(option) {
-            option.element.selected = false;
+            if (option.element.selected && !includes(selectedOptions, option)) {
+              option.element.selected = false;
+            }
           });
-
-          if (value) {
-            value.forEach(function(item) {
-              var option = options.getOptionFromViewValue(item);
-              if (option) option.element.selected = true;
-            });
-          }
         };
 
 
@@ -29685,55 +32640,48 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
         }
       }
 
-
       if (providedEmptyOption) {
 
-        // we need to remove it before calling selectElement.empty() because otherwise IE will
-        // remove the label from the element. wtf?
-        emptyOption.remove();
-
         // compile the element since there might be bindings in it
-        $compile(emptyOption)(scope);
+        $compile(selectCtrl.emptyOption)(scope);
 
-        if (emptyOption[0].nodeType === NODE_TYPE_COMMENT) {
+        selectElement.prepend(selectCtrl.emptyOption);
+
+        if (selectCtrl.emptyOption[0].nodeType === NODE_TYPE_COMMENT) {
           // This means the empty option has currently no actual DOM node, probably because
           // it has been modified by a transclusion directive.
-
-          emptyOptionRendered = false;
+          selectCtrl.hasEmptyOption = false;
 
           // Redefine the registerOption function, which will catch
           // options that are added by ngIf etc. (rendering of the node is async because of
           // lazy transclusion)
           selectCtrl.registerOption = function(optionScope, optionEl) {
             if (optionEl.val() === '') {
-              emptyOptionRendered = true;
-              emptyOption = optionEl;
-              emptyOption.removeClass('ng-scope');
+              selectCtrl.hasEmptyOption = true;
+              selectCtrl.emptyOption = optionEl;
+              selectCtrl.emptyOption.removeClass('ng-scope');
               // This ensures the new empty option is selected if previously no option was selected
               ngModelCtrl.$render();
 
               optionEl.on('$destroy', function() {
-                emptyOption = undefined;
-                emptyOptionRendered = false;
+                var needsRerender = selectCtrl.$isEmptyOptionSelected();
+
+                selectCtrl.hasEmptyOption = false;
+                selectCtrl.emptyOption = undefined;
+
+                if (needsRerender) ngModelCtrl.$render();
               });
             }
           };
 
         } else {
-          emptyOption.removeClass('ng-scope');
-          emptyOptionRendered = true;
+          // remove the class, which is added automatically because we recompile the element and it
+          // becomes the compilation root
+          selectCtrl.emptyOption.removeClass('ng-scope');
         }
 
-      } else {
-        emptyOption = jqLite(optionTemplate.cloneNode(false));
       }
 
-      selectElement.empty();
-
-      // We need to do this here to ensure that the options object is defined
-      // when we first hit it in writeNgOptionsValue
-      updateOptions();
-
       // We will re-render the option elements if the option values or labels change
       scope.$watchCollection(ngOptions.getWatchables, updateOptions);
 
@@ -29745,11 +32693,20 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
         updateOptionElement(option, optionElement);
       }
 
+      function getAndUpdateSelectedOption(viewValue) {
+        var option = options.getOptionFromViewValue(viewValue);
+        var element = option && option.element;
+
+        if (element && !element.selected) element.selected = true;
+
+        return option;
+      }
 
       function updateOptionElement(option, element) {
         option.element = element;
         element.disabled = option.disabled;
-        // NOTE: The label must be set before the value, otherwise IE10/11/EDGE create unresponsive
+        // Support: IE 11 only, Edge 12-13 only
+        // NOTE: The label must be set before the value, otherwise IE 11 & Edge create unresponsive
         // selects in certain circumstances when multiple selects are next to each other and display
         // the option list in listbox style, i.e. the select is [multiple], or specifies a [size].
         // See https://github.com/angular/angular.js/issues/11314 for more info.
@@ -29785,11 +32742,6 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
 
         var groupElementMap = {};
 
-        // Ensure that the empty option is always there if it was explicitly provided
-        if (providedEmptyOption) {
-          selectElement.prepend(emptyOption);
-        }
-
         options.items.forEach(function addOption(option) {
           var groupElement;
 
@@ -29834,7 +32786,6 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
             ngModelCtrl.$render();
           }
         }
-
       }
   }
 
@@ -29862,27 +32813,27 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
  * @description
  * `ngPluralize` is a directive that displays messages according to en-US localization rules.
  * These rules are bundled with angular.js, but can be overridden
- * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive
+ * (see {@link guide/i18n AngularJS i18n} dev guide). You configure ngPluralize directive
  * by specifying the mappings between
  * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)
  * and the strings to be displayed.
  *
- * # Plural categories and explicit number rules
+ * ## Plural categories and explicit number rules
  * There are two
  * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)
- * in Angular's default en-US locale: "one" and "other".
+ * in AngularJS's default en-US locale: "one" and "other".
  *
  * While a plural category may match many numbers (for example, in en-US locale, "other" can match
  * any number that is not 1), an explicit number rule can only match one number. For example, the
  * explicit number rule for "3" matches the number 3. There are examples of plural categories
  * and explicit number rules throughout the rest of this documentation.
  *
- * # Configuring ngPluralize
+ * ## Configuring ngPluralize
  * You configure ngPluralize by providing 2 attributes: `count` and `when`.
  * You can also provide an optional attribute, `offset`.
  *
  * The value of the `count` attribute can be either a string or an {@link guide/expression
- * Angular expression}; these are evaluated on the current scope for its bound value.
+ * AngularJS expression}; these are evaluated on the current scope for its bound value.
  *
  * The `when` attribute specifies the mappings between plural categories and the actual
  * string to be displayed. The value of the attribute should be a JSON object.
@@ -29904,14 +32855,14 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
  * show "a dozen people are viewing".
  *
  * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted
- * into pluralized strings. In the previous example, Angular will replace `{}` with
+ * into pluralized strings. In the previous example, AngularJS will replace `{}` with
  * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder
  * for <span ng-non-bindable>{{numberExpression}}</span>.
  *
  * If no rule is defined for a category, then an empty string is displayed and a warning is generated.
  * Note that some locales define more categories than `one` and `other`. For example, fr-fr defines `few` and `many`.
  *
- * # Configuring ngPluralize with offset
+ * ## Configuring ngPluralize with offset
  * The `offset` attribute allows further customization of pluralized text, which can result in
  * a better user experience. For example, instead of the message "4 people are viewing this document",
  * you might display "John, Kate and 2 others are viewing this document".
@@ -29932,7 +32883,7 @@ var ngOptionsDirective = ['$compile', '$document', '$parse', function($compile,
  * three explicit number rules 0, 1 and 2.
  * When one person, perhaps John, views the document, "John is viewing" will be shown.
  * When three people view the document, no explicit number rule is found, so
- * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.
+ * an offset of 2 is taken off 3, and AngularJS uses 1 to decide the plural category.
  * In this case, plural category 'one' is matched and "John, Mary and one other person are viewing"
  * is shown.
  *
@@ -30093,12 +33044,308 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
   };
 }];
 
+/**
+ * @ngdoc directive
+ * @name ngRef
+ * @restrict A
+ *
+ * @description
+ * The `ngRef` attribute tells AngularJS to assign the controller of a component (or a directive)
+ * to the given property in the current scope. It is also possible to add the jqlite-wrapped DOM
+ * element to the scope.
+ *
+ * If the element with `ngRef` is destroyed `null` is assigned to the property.
+ *
+ * Note that if you want to assign from a child into the parent scope, you must initialize the
+ * target property on the parent scope, otherwise `ngRef` will assign on the child scope.
+ * This commonly happens when assigning elements or components wrapped in {@link ngIf} or
+ * {@link ngRepeat}. See the second example below.
+ *
+ *
+ * @element ANY
+ * @param {string} ngRef property name - A valid AngularJS expression identifier to which the
+ *                       controller or jqlite-wrapped DOM element will be bound.
+ * @param {string=} ngRefRead read value - The name of a directive (or component) on this element,
+ *                            or the special string `$element`. If a name is provided, `ngRef` will
+ *                            assign the matching controller. If `$element` is provided, the element
+ *                            itself is assigned (even if a controller is available).
+ *
+ *
+ * @example
+ * ### Simple toggle
+ * This example shows how the controller of the component toggle
+ * is reused in the template through the scope to use its logic.
+ * <example name="ng-ref-component" module="myApp">
+ *   <file name="index.html">
+ *     <my-toggle ng-ref="myToggle"></my-toggle>
+ *     <button ng-click="myToggle.toggle()">Toggle</button>
+ *     <div ng-show="myToggle.isOpen()">
+ *       You are using a component in the same template to show it.
+ *     </div>
+ *   </file>
+ *   <file name="index.js">
+ *     angular.module('myApp', [])
+ *     .component('myToggle', {
+ *       controller: function ToggleController() {
+ *         var opened = false;
+ *         this.isOpen = function() { return opened; };
+ *         this.toggle = function() { opened = !opened; };
+ *       }
+ *     });
+ *   </file>
+ *   <file name="protractor.js" type="protractor">
+ *      it('should publish the toggle into the scope', function() {
+ *        var toggle = element(by.buttonText('Toggle'));
+ *        expect(toggle.evaluate('myToggle.isOpen()')).toEqual(false);
+ *        toggle.click();
+ *        expect(toggle.evaluate('myToggle.isOpen()')).toEqual(true);
+ *      });
+ *   </file>
+ * </example>
+ *
+ * @example
+ * ### ngRef inside scopes
+ * This example shows how `ngRef` works with child scopes. The `ngRepeat`-ed `myWrapper` components
+ * are assigned to the scope of `myRoot`, because the `toggles` property has been initialized.
+ * The repeated `myToggle` components are published to the child scopes created by `ngRepeat`.
+ * `ngIf` behaves similarly - the assignment of `myToggle` happens in the `ngIf` child scope,
+ * because the target property has not been initialized on the `myRoot` component controller.
+ *
+ * <example name="ng-ref-scopes" module="myApp">
+ *   <file name="index.html">
+ *     <my-root></my-root>
+ *   </file>
+ *   <file name="index.js">
+ *     angular.module('myApp', [])
+ *     .component('myRoot', {
+ *       templateUrl: 'root.html',
+ *       controller: function() {
+ *         this.wrappers = []; // initialize the array so that the wrappers are assigned into the parent scope
+ *       }
+ *     })
+ *     .component('myToggle', {
+ *       template: '<strong>myToggle</strong><button ng-click="$ctrl.toggle()" ng-transclude></button>',
+ *       transclude: true,
+ *       controller: function ToggleController() {
+ *         var opened = false;
+ *         this.isOpen = function() { return opened; };
+ *         this.toggle = function() { opened = !opened; };
+ *       }
+ *     })
+ *     .component('myWrapper', {
+ *       transclude: true,
+ *       template: '<strong>myWrapper</strong>' +
+ *         '<div>ngRepeatToggle.isOpen(): {{$ctrl.ngRepeatToggle.isOpen() | json}}</div>' +
+ *         '<my-toggle ng-ref="$ctrl.ngRepeatToggle"><ng-transclude></ng-transclude></my-toggle>'
+ *     });
+ *   </file>
+ *   <file name="root.html">
+ *     <strong>myRoot</strong>
+ *     <my-toggle ng-ref="$ctrl.outerToggle">Outer Toggle</my-toggle>
+ *     <div>outerToggle.isOpen(): {{$ctrl.outerToggle.isOpen() | json}}</div>
+ *     <div><em>wrappers assigned to root</em><br>
+ *     <div ng-repeat="wrapper in $ctrl.wrappers">
+ *       wrapper.ngRepeatToggle.isOpen(): {{wrapper.ngRepeatToggle.isOpen() | json}}
+ *     </div>
+ *
+ *     <ul>
+ *       <li ng-repeat="(index, value) in [1,2,3]">
+ *         <strong>ngRepeat</strong>
+ *         <div>outerToggle.isOpen(): {{$ctrl.outerToggle.isOpen() | json}}</div>
+ *         <my-wrapper ng-ref="$ctrl.wrappers[index]">ngRepeat Toggle {{$index + 1}}</my-wrapper>
+ *       </li>
+ *     </ul>
+ *
+ *     <div>ngIfToggle.isOpen(): {{ngIfToggle.isOpen()}} // This is always undefined because it's
+ *       assigned to the child scope created by ngIf.
+ *     </div>
+ *     <div ng-if="true">
+          <strong>ngIf</strong>
+ *        <my-toggle ng-ref="ngIfToggle">ngIf Toggle</my-toggle>
+ *        <div>ngIfToggle.isOpen(): {{ngIfToggle.isOpen() | json}}</div>
+ *        <div>outerToggle.isOpen(): {{$ctrl.outerToggle.isOpen() | json}}</div>
+ *     </div>
+ *   </file>
+ *   <file name="styles.css">
+ *     ul {
+ *       list-style: none;
+ *       padding-left: 0;
+ *     }
+ *
+ *     li[ng-repeat] {
+ *       background: lightgreen;
+ *       padding: 8px;
+ *       margin: 8px;
+ *     }
+ *
+ *     [ng-if] {
+ *       background: lightgrey;
+ *       padding: 8px;
+ *     }
+ *
+ *     my-root {
+ *       background: lightgoldenrodyellow;
+ *       padding: 8px;
+ *       display: block;
+ *     }
+ *
+ *     my-wrapper {
+ *       background: lightsalmon;
+ *       padding: 8px;
+ *       display: block;
+ *     }
+ *
+ *     my-toggle {
+ *       background: lightblue;
+ *       padding: 8px;
+ *       display: block;
+ *     }
+ *   </file>
+ *   <file name="protractor.js" type="protractor">
+ *      var OuterToggle = function() {
+ *        this.toggle = function() {
+ *          element(by.buttonText('Outer Toggle')).click();
+ *        };
+ *        this.isOpen = function() {
+ *          return element.all(by.binding('outerToggle.isOpen()')).first().getText();
+ *        };
+ *      };
+ *      var NgRepeatToggle = function(i) {
+ *        var parent = element.all(by.repeater('(index, value) in [1,2,3]')).get(i - 1);
+ *        this.toggle = function() {
+ *          element(by.buttonText('ngRepeat Toggle ' + i)).click();
+ *        };
+ *        this.isOpen = function() {
+ *          return parent.element(by.binding('ngRepeatToggle.isOpen() | json')).getText();
+ *        };
+ *        this.isOuterOpen = function() {
+ *          return parent.element(by.binding('outerToggle.isOpen() | json')).getText();
+ *        };
+ *      };
+ *      var NgRepeatToggles = function() {
+ *        var toggles = [1,2,3].map(function(i) { return new NgRepeatToggle(i); });
+ *        this.forEach = function(fn) {
+ *          toggles.forEach(fn);
+ *        };
+ *        this.isOuterOpen = function(i) {
+ *          return toggles[i - 1].isOuterOpen();
+ *        };
+ *      };
+ *      var NgIfToggle = function() {
+ *        var parent = element(by.css('[ng-if]'));
+ *        this.toggle = function() {
+ *          element(by.buttonText('ngIf Toggle')).click();
+ *        };
+ *        this.isOpen = function() {
+ *          return by.binding('ngIfToggle.isOpen() | json').getText();
+ *        };
+ *        this.isOuterOpen = function() {
+ *          return parent.element(by.binding('outerToggle.isOpen() | json')).getText();
+ *        };
+ *      };
+ *
+ *      it('should toggle the outer toggle', function() {
+ *        var outerToggle = new OuterToggle();
+ *        expect(outerToggle.isOpen()).toEqual('outerToggle.isOpen(): false');
+ *        outerToggle.toggle();
+ *        expect(outerToggle.isOpen()).toEqual('outerToggle.isOpen(): true');
+ *      });
+ *
+ *      it('should toggle all outer toggles', function() {
+ *        var outerToggle = new OuterToggle();
+ *        var repeatToggles = new NgRepeatToggles();
+ *        var ifToggle = new NgIfToggle();
+ *        expect(outerToggle.isOpen()).toEqual('outerToggle.isOpen(): false');
+ *        expect(repeatToggles.isOuterOpen(1)).toEqual('outerToggle.isOpen(): false');
+ *        expect(repeatToggles.isOuterOpen(2)).toEqual('outerToggle.isOpen(): false');
+ *        expect(repeatToggles.isOuterOpen(3)).toEqual('outerToggle.isOpen(): false');
+ *        expect(ifToggle.isOuterOpen()).toEqual('outerToggle.isOpen(): false');
+ *        outerToggle.toggle();
+ *        expect(outerToggle.isOpen()).toEqual('outerToggle.isOpen(): true');
+ *        expect(repeatToggles.isOuterOpen(1)).toEqual('outerToggle.isOpen(): true');
+ *        expect(repeatToggles.isOuterOpen(2)).toEqual('outerToggle.isOpen(): true');
+ *        expect(repeatToggles.isOuterOpen(3)).toEqual('outerToggle.isOpen(): true');
+ *        expect(ifToggle.isOuterOpen()).toEqual('outerToggle.isOpen(): true');
+ *      });
+ *
+ *      it('should toggle each repeat iteration separately', function() {
+ *        var repeatToggles = new NgRepeatToggles();
+ *
+ *        repeatToggles.forEach(function(repeatToggle) {
+ *          expect(repeatToggle.isOpen()).toEqual('ngRepeatToggle.isOpen(): false');
+ *          expect(repeatToggle.isOuterOpen()).toEqual('outerToggle.isOpen(): false');
+ *          repeatToggle.toggle();
+ *          expect(repeatToggle.isOpen()).toEqual('ngRepeatToggle.isOpen(): true');
+ *          expect(repeatToggle.isOuterOpen()).toEqual('outerToggle.isOpen(): false');
+ *        });
+ *      });
+ *   </file>
+ * </example>
+ *
+ */
+
+var ngRefMinErr = minErr('ngRef');
+
+var ngRefDirective = ['$parse', function($parse) {
+  return {
+    priority: -1, // Needed for compatibility with element transclusion on the same element
+    restrict: 'A',
+    compile: function(tElement, tAttrs) {
+      // Get the expected controller name, converts <data-some-thing> into "someThing"
+      var controllerName = directiveNormalize(nodeName_(tElement));
+
+      // Get the expression for value binding
+      var getter = $parse(tAttrs.ngRef);
+      var setter = getter.assign || function() {
+        throw ngRefMinErr('nonassign', 'Expression in ngRef="{0}" is non-assignable!', tAttrs.ngRef);
+      };
+
+      return function(scope, element, attrs) {
+        var refValue;
+
+        if (attrs.hasOwnProperty('ngRefRead')) {
+          if (attrs.ngRefRead === '$element') {
+            refValue = element;
+          } else {
+            refValue = element.data('$' + attrs.ngRefRead + 'Controller');
+
+            if (!refValue) {
+              throw ngRefMinErr(
+                'noctrl',
+                'The controller for ngRefRead="{0}" could not be found on ngRef="{1}"',
+                attrs.ngRefRead,
+                tAttrs.ngRef
+              );
+            }
+          }
+        } else {
+          refValue = element.data('$' + controllerName + 'Controller');
+        }
+
+        refValue = refValue || element;
+
+        setter(scope, refValue);
+
+        // when the element is removed, remove it (nullify it)
+        element.on('$destroy', function() {
+          // only remove it if value has not changed,
+          // because animations (and other procedures) may duplicate elements
+          if (getter(scope) === refValue) {
+            setter(scope, null);
+          }
+        });
+      };
+    }
+  };
+}];
+
 /* exported ngRepeatDirective */
 
 /**
  * @ngdoc directive
  * @name ngRepeat
  * @multiElement
+ * @restrict A
  *
  * @description
  * The `ngRepeat` directive instantiates a template once per item from a collection. Each template
@@ -30122,7 +33369,7 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
  * </div>
  *
  *
- * # Iterating over object properties
+ * ## Iterating over object properties
  *
  * It is possible to get `ngRepeat` to iterate over the properties of an object using the following
  * syntax:
@@ -30134,14 +33381,14 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
  * However, there are a few limitations compared to array iteration:
  *
  * - The JavaScript specification does not define the order of keys
- *   returned for an object, so Angular relies on the order returned by the browser
+ *   returned for an object, so AngularJS relies on the order returned by the browser
  *   when running `for key in myObj`. Browsers generally follow the strategy of providing
  *   keys in the order in which they were defined, although there are exceptions when keys are deleted
  *   and reinstated. See the
  *   [MDN page on `delete` for more info](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete#Cross-browser_notes).
  *
  * - `ngRepeat` will silently *ignore* object keys starting with `$`, because
- *   it's a prefix used by Angular for public (`$`) and private (`$$`) properties.
+ *   it's a prefix used by AngularJS for public (`$`) and private (`$$`) properties.
  *
  * - The built-in filters {@link ng.orderBy orderBy} and {@link ng.filter filter} do not work with
  *   objects, and will throw an error if used with one.
@@ -30152,7 +33399,7 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
  * or implement a `$watch` on the object yourself.
  *
  *
- * # Tracking and Duplicates
+ * ## Tracking and Duplicates
  *
  * `ngRepeat` uses {@link $rootScope.Scope#$watchCollection $watchCollection} to detect changes in
  * the collection. When a change happens, `ngRepeat` then makes the corresponding changes to the DOM:
@@ -30166,73 +33413,150 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
  * For example, if an item is added to the collection, `ngRepeat` will know that all other items
  * already have DOM elements, and will not re-render them.
  *
- * The default tracking function (which tracks items by their identity) does not allow
- * duplicate items in arrays. This is because when there are duplicates, it is not possible
- * to maintain a one-to-one mapping between collection items and DOM elements.
- *
- * If you do need to repeat duplicate items, you can substitute the default tracking behavior
- * with your own using the `track by` expression.
- *
- * For example, you may track items by the index of each item in the collection, using the
- * special scope property `$index`:
- * ```html
- *    <div ng-repeat="n in [42, 42, 43, 43] track by $index">
- *      {{n}}
- *    </div>
- * ```
- *
- * You may also use arbitrary expressions in `track by`, including references to custom functions
- * on the scope:
- * ```html
- *    <div ng-repeat="n in [42, 42, 43, 43] track by myTrackingFunction(n)">
- *      {{n}}
- *    </div>
- * ```
+ * All different types of tracking functions, their syntax, and their support for duplicate
+ * items in collections can be found in the
+ * {@link ngRepeat#ngRepeat-arguments ngRepeat expression description}.
  *
  * <div class="alert alert-success">
- * If you are working with objects that have a unique identifier property, you should track
- * by this identifier instead of the object instance. Should you reload your data later, `ngRepeat`
- * will not have to rebuild the DOM elements for items it has already rendered, even if the
- * JavaScript objects in the collection have been substituted for new ones. For large collections,
- * this significantly improves rendering performance. If you don't have a unique identifier,
- * `track by $index` can also provide a performance boost.
+ * **Best Practice:** If you are working with objects that have a unique identifier property, you
+ * should track by this identifier instead of the object instance,
+ * e.g. `item in items track by item.id`.
+ * Should you reload your data later, `ngRepeat` will not have to rebuild the DOM elements for items
+ * it has already rendered, even if the JavaScript objects in the collection have been substituted
+ * for new ones. For large collections, this significantly improves rendering performance.
  * </div>
  *
- * ```html
- *    <div ng-repeat="model in collection track by model.id">
- *      {{model.name}}
- *    </div>
- * ```
+ * ### Effects of DOM Element re-use
  *
- * <br />
- * <div class="alert alert-warning">
- * Avoid using `track by $index` when the repeated template contains
- * {@link guide/expression#one-time-binding one-time bindings}. In such cases, the `nth` DOM
- * element will always be matched with the `nth` item of the array, so the bindings on that element
- * will not be updated even when the corresponding item changes, essentially causing the view to get
- * out-of-sync with the underlying data.
- * </div>
+ * When DOM elements are re-used, ngRepeat updates the scope for the element, which will
+ * automatically update any active bindings on the template. However, other
+ * functionality will not be updated, because the element is not re-created:
  *
- * When no `track by` expression is provided, it is equivalent to tracking by the built-in
- * `$id` function, which tracks items by their identity:
- * ```html
- *    <div ng-repeat="obj in collection track by $id(obj)">
- *      {{obj.prop}}
- *    </div>
- * ```
+ * - Directives are not re-compiled
+ * - {@link guide/expression#one-time-binding one-time expressions} on the repeated template are not
+ * updated if they have stabilized.
  *
- * <br />
- * <div class="alert alert-warning">
- * **Note:** `track by` must always be the last expression:
- * </div>
- * ```
- *    <div ng-repeat="model in collection | orderBy: 'id' as filtered_result track by model.id">
- *      {{model.name}}
- *    </div>
- * ```
+ * The above affects all kinds of element re-use due to tracking, but may be especially visible
+ * when tracking by `$index` due to the way ngRepeat re-uses elements.
  *
+ * The following example shows the effects of different actions with tracking:
+
+  <example module="ngRepeat" name="ngRepeat-tracking" deps="angular-animate.js" animations="true">
+    <file name="script.js">
+      angular.module('ngRepeat', ['ngAnimate']).controller('repeatController', function($scope) {
+        var friends = [
+          {name:'John', age:25},
+          {name:'Mary', age:40},
+          {name:'Peter', age:85}
+        ];
+
+        $scope.removeFirst = function() {
+          $scope.friends.shift();
+        };
+
+        $scope.updateAge = function() {
+          $scope.friends.forEach(function(el) {
+            el.age = el.age + 5;
+          });
+        };
+
+        $scope.copy = function() {
+          $scope.friends = angular.copy($scope.friends);
+        };
+
+        $scope.reset = function() {
+          $scope.friends = angular.copy(friends);
+        };
+
+        $scope.reset();
+      });
+    </file>
+    <file name="index.html">
+      <div ng-controller="repeatController">
+        <ol>
+          <li>When you click "Update Age", only the first list updates the age, because all others have
+          a one-time binding on the age property. If you then click "Copy", the current friend list
+          is copied, and now the second list updates the age, because the identity of the collection items
+          has changed and the list must be re-rendered. The 3rd and 4th list stay the same, because all the
+          items are already known according to their tracking functions.
+          </li>
+          <li>When you click "Remove First", the 4th list has the wrong age on both remaining items. This is
+          due to tracking by $index: when the first collection item is removed, ngRepeat reuses the first
+          DOM element for the new first collection item, and so on. Since the age property is one-time
+          bound, the value remains from the collection item which was previously at this index.
+          </li>
+        </ol>
+
+        <button ng-click="removeFirst()">Remove First</button>
+        <button ng-click="updateAge()">Update Age</button>
+        <button ng-click="copy()">Copy</button>
+        <br><button ng-click="reset()">Reset List</button>
+        <br>
+        <code>track by $id(friend)</code> (default):
+        <ul class="example-animate-container">
+          <li class="animate-repeat" ng-repeat="friend in friends">
+            {{friend.name}} is {{friend.age}} years old.
+          </li>
+        </ul>
+        <code>track by $id(friend)</code> (default), with age one-time binding:
+        <ul class="example-animate-container">
+          <li class="animate-repeat" ng-repeat="friend in friends">
+            {{friend.name}} is {{::friend.age}} years old.
+          </li>
+        </ul>
+        <code>track by friend.name</code>, with age one-time binding:
+        <ul class="example-animate-container">
+          <li class="animate-repeat" ng-repeat="friend in friends track by friend.name">
+            {{friend.name}}  is {{::friend.age}} years old.
+          </li>
+        </ul>
+        <code>track by $index</code>, with age one-time binding:
+        <ul class="example-animate-container">
+          <li class="animate-repeat" ng-repeat="friend in friends track by $index">
+            {{friend.name}} is {{::friend.age}} years old.
+          </li>
+        </ul>
+      </div>
+    </file>
+    <file name="animations.css">
+      .example-animate-container {
+        background:white;
+        border:1px solid black;
+        list-style:none;
+        margin:0;
+        padding:0 10px;
+      }
+
+      .animate-repeat {
+        line-height:30px;
+        list-style:none;
+        box-sizing:border-box;
+      }
+
+      .animate-repeat.ng-move,
+      .animate-repeat.ng-enter,
+      .animate-repeat.ng-leave {
+        transition:all linear 0.5s;
+      }
+
+      .animate-repeat.ng-leave.ng-leave-active,
+      .animate-repeat.ng-move,
+      .animate-repeat.ng-enter {
+        opacity:0;
+        max-height:0;
+      }
+
+      .animate-repeat.ng-leave,
+      .animate-repeat.ng-move.ng-move-active,
+      .animate-repeat.ng-enter.ng-enter-active {
+        opacity:1;
+        max-height:30px;
+      }
+    </file>
+  </example>
+
  *
- * # Special repeat start and end points
+ * ## Special repeat start and end points
  * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending
  * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.
  * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)
@@ -30307,22 +33631,38 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
  *     more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are
  *     mapped to the same DOM element, which is not possible.)
  *
- *     Note that the tracking expression must come last, after any filters, and the alias expression.
- *
- *     For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements
- *     will be associated by item identity in the array.
- *
- *     For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique
- *     `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements
- *     with the corresponding item in the array by identity. Moving the same object in array would move the DOM
- *     element in the same way in the DOM.
- *
- *     For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this
- *     case the object identity does not matter. Two objects are considered equivalent as long as their `id`
- *     property is same.
+ *     *Default tracking: $id()*: `item in items` is equivalent to `item in items track by $id(item)`.
+ *     This implies that the DOM elements will be associated by item identity in the collection.
+ *
+ *     The built-in `$id()` function can be used to assign a unique
+ *     `$$hashKey` property to each item in the collection. This property is then used as a key to associated DOM elements
+ *     with the corresponding item in the collection by identity. Moving the same object would move
+ *     the DOM element in the same way in the DOM.
+ *     Note that the default id function does not support duplicate primitive values (`number`, `string`),
+ *     but supports duplictae non-primitive values (`object`) that are *equal* in shape.
+ *
+ *     *Custom Expression*: It is possible to use any AngularJS expression to compute the tracking
+ *     id, for example with a function, or using a property on the collection items.
+ *     `item in items track by item.id` is a typical pattern when the items have a unique identifier,
+ *     e.g. database id. In this case the object identity does not matter. Two objects are considered
+ *     equivalent as long as their `id` property is same.
+ *     Tracking by unique identifier is the most performant way and should be used whenever possible.
+ *
+ *     *$index*: This special property tracks the collection items by their index, and
+ *     re-uses the DOM elements that match that index, e.g. `item in items track by $index`. This can
+ *     be used for a performance improvement if no unique identfier is available and the identity of
+ *     the collection items cannot be easily computed. It also allows duplicates.
+ *
+ *     <div class="alert alert-warning">
+ *       <strong>Note:</strong> Re-using DOM elements can have unforeseen effects. Read the
+ *       {@link ngRepeat#tracking-and-duplicates section on tracking and duplicates} for
+ *       more info.
+ *     </div>
  *
- *     For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter
- *     to items in conjunction with a tracking expression.
+ *     <div class="alert alert-warning">
+ *       <strong>Note:</strong> the `track by` expression must come last - after any filters, and the alias expression:
+ *       `item in items | filter:searchText as results  track by item.id`
+ *     </div>
  *
  *   * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the
  *     intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message
@@ -30331,21 +33671,21 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
  *     For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after
  *     the items have been processed through the filter.
  *
- *     Please note that `as [variable name] is not an operator but rather a part of ngRepeat micro-syntax so it can be used only at the end
- *     (and not as operator, inside an expression).
+ *     Please note that `as [variable name]` is not an operator but rather a part of ngRepeat
+ *     micro-syntax so it can be used only after all filters (and not as operator, inside an expression).
  *
- *     For example: `item in items | filter : x | orderBy : order | limitTo : limit as results` .
+ *     For example: `item in items | filter : x | orderBy : order | limitTo : limit as results track by item.id` .
  *
  * @example
  * This example uses `ngRepeat` to display a list of people. A filter is used to restrict the displayed
  * results by name or by age. New (entering) and removed (leaving) items are animated.
-  <example module="ngRepeat" name="ngRepeat" deps="angular-animate.js" animations="true" name="ng-repeat">
+  <example module="ngRepeat" name="ngRepeat" deps="angular-animate.js" animations="true">
     <file name="index.html">
       <div ng-controller="repeatController">
         I have {{friends.length}} friends. They are:
         <input type="search" ng-model="q" placeholder="filter friends..." aria-label="filter friends" />
         <ul class="example-animate-container">
-          <li class="animate-repeat" ng-repeat="friend in friends | filter:q as results">
+          <li class="animate-repeat" ng-repeat="friend in friends | filter:q as results track by friend.name">
             [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
           </li>
           <li class="animate-repeat" ng-if="results.length === 0">
@@ -30453,6 +33793,13 @@ var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $ani
     return block.clone[block.clone.length - 1];
   };
 
+  var trackByIdArrayFn = function($scope, key, value) {
+    return hashKey(value);
+  };
+
+  var trackByIdObjFn = function($scope, key) {
+    return key;
+  };
 
   return {
     restrict: 'A',
@@ -30492,36 +33839,27 @@ var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $ani
           aliasAs);
       }
 
-      var trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn;
-      var hashFnLocals = {$id: hashKey};
+      var trackByIdExpFn;
 
       if (trackByExp) {
-        trackByExpGetter = $parse(trackByExp);
-      } else {
-        trackByIdArrayFn = function(key, value) {
-          return hashKey(value);
-        };
-        trackByIdObjFn = function(key) {
-          return key;
+        var hashFnLocals = {$id: hashKey};
+        var trackByExpGetter = $parse(trackByExp);
+
+        trackByIdExpFn = function($scope, key, value, index) {
+          // assign key, value, and $index to the locals so that they can be used in hash functions
+          if (keyIdentifier) hashFnLocals[keyIdentifier] = key;
+          hashFnLocals[valueIdentifier] = value;
+          hashFnLocals.$index = index;
+          return trackByExpGetter($scope, hashFnLocals);
         };
       }
 
       return function ngRepeatLink($scope, $element, $attr, ctrl, $transclude) {
 
-        if (trackByExpGetter) {
-          trackByIdExpFn = function(key, value, index) {
-            // assign key, value, and $index to the locals so that they can be used in hash functions
-            if (keyIdentifier) hashFnLocals[keyIdentifier] = key;
-            hashFnLocals[valueIdentifier] = value;
-            hashFnLocals.$index = index;
-            return trackByExpGetter($scope, hashFnLocals);
-          };
-        }
-
         // Store a list of elements from previous run. This is a hash where key is the item from the
         // iterator, and the value is objects with following properties.
         //   - scope: bound scope
-        //   - element: previous element.
+        //   - clone: previous element.
         //   - index: position
         //
         // We are using no-proto object so that we don't need to guard against inherited props via
@@ -30571,7 +33909,7 @@ var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $ani
           for (index = 0; index < collectionLength; index++) {
             key = (collection === collectionKeys) ? index : collectionKeys[index];
             value = collection[key];
-            trackById = trackByIdFn(key, value, index);
+            trackById = trackByIdFn($scope, key, value, index);
             if (lastBlockMap[trackById]) {
               // found previously seen block
               block = lastBlockMap[trackById];
@@ -30593,6 +33931,12 @@ var ngRepeatDirective = ['$parse', '$animate', '$compile', function($parse, $ani
             }
           }
 
+          // Clear the value property from the hashFnLocals object to prevent a reference to the last value
+          // being leaked into the ngRepeatCompile function scope
+          if (hashFnLocals) {
+            hashFnLocals[valueIdentifier] = undefined;
+          }
+
           // remove leftover items
           for (var blockKey in lastBlockMap) {
             block = lastBlockMap[blockKey];
@@ -30717,7 +34061,11 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
  * By default you don't need to override anything in CSS and the animations will work around the
  * display style.
  *
- * ## A note about animations with `ngShow`
+ * @animations
+ * | Animation                                           | Occurs                                                                                                        |
+ * |-----------------------------------------------------|---------------------------------------------------------------------------------------------------------------|
+ * | {@link $animate#addClass addClass} `.ng-hide`       | After the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden. |
+ * | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngShow` expression evaluates to a truthy value and just before contents are set to visible.        |
  *
  * Animations in `ngShow`/`ngHide` work with the show and hide events that are triggered when the
  * directive expression is true and false. This system works like the animation system present with
@@ -30739,12 +34087,6 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
  * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display property
  * to block during animation states - ngAnimate will automatically handle the style toggling for you.
  *
- * @animations
- * | Animation                                           | Occurs                                                                                                        |
- * |-----------------------------------------------------|---------------------------------------------------------------------------------------------------------------|
- * | {@link $animate#addClass addClass} `.ng-hide`       | After the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden. |
- * | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngShow` expression evaluates to a truthy value and just before contents are set to visible.        |
- *
  * @element ANY
  * @param {expression} ngShow If the {@link guide/expression expression} is truthy/falsy then the
  *                            element is shown/hidden respectively.
@@ -30841,6 +34183,25 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
       });
     </file>
   </example>
+ *
+ * @knownIssue
+ *
+ * ### Flickering when using ngShow to toggle between elements
+ *
+ * When using {@link ngShow} and / or {@link ngHide} to toggle between elements, it can
+ * happen that both the element to show and the element to hide are visible for a very short time.
+ *
+ * This usually happens when the {@link ngAnimate ngAnimate module} is included, but no actual animations
+ * are defined for {@link ngShow} / {@link ngHide}. Internet Explorer is affected more often than
+ * other browsers.
+ *
+ * There are several way to mitigate this problem:
+ *
+ * - {@link guide/animations#how-to-selectively-enable-disable-and-skip-animations Disable animations on the affected elements}.
+ * - Use {@link ngIf} or {@link ngSwitch} instead of {@link ngShow} / {@link ngHide}.
+ * - Use the special CSS selector `ng-hide.ng-hide-animate` to set `{display: none}` or similar on the affected elements.
+ * - Use `ng-class="{'ng-hide': expression}` instead of instead of {@link ngShow} / {@link ngHide}.
+ * - Define an animation on the affected elements.
  */
 var ngShowDirective = ['$animate', function($animate) {
   return {
@@ -30919,7 +34280,11 @@ var ngShowDirective = ['$animate', function($animate) {
  * By default you don't need to override in CSS anything and the animations will work around the
  * display style.
  *
- * ## A note about animations with `ngHide`
+ * @animations
+ * | Animation                                           | Occurs                                                                                                     |
+ * |-----------------------------------------------------|------------------------------------------------------------------------------------------------------------|
+ * | {@link $animate#addClass addClass} `.ng-hide`       | After the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden.  |
+ * | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngHide` expression evaluates to a non truthy value and just before contents are set to visible. |
  *
  * Animations in `ngShow`/`ngHide` work with the show and hide events that are triggered when the
  * directive expression is true and false. This system works like the animation system present with
@@ -30941,13 +34306,6 @@ var ngShowDirective = ['$animate', function($animate) {
  * Keep in mind that, as of AngularJS version 1.3, there is no need to change the display property
  * to block during animation states - ngAnimate will automatically handle the style toggling for you.
  *
- * @animations
- * | Animation                                           | Occurs                                                                                                     |
- * |-----------------------------------------------------|------------------------------------------------------------------------------------------------------------|
- * | {@link $animate#addClass addClass} `.ng-hide`       | After the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden.  |
- * | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngHide` expression evaluates to a non truthy value and just before contents are set to visible. |
- *
- *
  * @element ANY
  * @param {expression} ngHide If the {@link guide/expression expression} is truthy/falsy then the
  *                            element is hidden/shown respectively.
@@ -31044,6 +34402,25 @@ var ngShowDirective = ['$animate', function($animate) {
       });
     </file>
   </example>
+ *
+ * @knownIssue
+ *
+ * ### Flickering when using ngHide to toggle between elements
+ *
+ * When using {@link ngShow} and / or {@link ngHide} to toggle between elements, it can
+ * happen that both the element to show and the element to hide are visible for a very short time.
+ *
+ * This usually happens when the {@link ngAnimate ngAnimate module} is included, but no actual animations
+ * are defined for {@link ngShow} / {@link ngHide}. Internet Explorer is affected more often than
+ * other browsers.
+ *
+ * There are several way to mitigate this problem:
+ *
+ * - {@link guide/animations#how-to-selectively-enable-disable-and-skip-animations Disable animations on the affected elements}.
+ * - Use {@link ngIf} or {@link ngSwitch} instead of {@link ngShow} / {@link ngHide}.
+ * - Use the special CSS selector `ng-hide.ng-hide-animate` to set `{display: none}` or similar on the affected elements.
+ * - Use `ng-class="{'ng-hide': expression}` instead of instead of {@link ngShow} / {@link ngHide}.
+ * - Define an animation on the affected elements.
  */
 var ngHideDirective = ['$animate', function($animate) {
   return {
@@ -31103,22 +34480,22 @@ var ngHideDirective = ['$animate', function($animate) {
        var colorSpan = element(by.css('span'));
 
        it('should check ng-style', function() {
-         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
+         expect(colorSpan.getCssValue('color')).toMatch(/rgba\(0, 0, 0, 1\)|rgb\(0, 0, 0\)/);
          element(by.css('input[value=\'set color\']')).click();
-         expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');
+         expect(colorSpan.getCssValue('color')).toMatch(/rgba\(255, 0, 0, 1\)|rgb\(255, 0, 0\)/);
          element(by.css('input[value=clear]')).click();
-         expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
+         expect(colorSpan.getCssValue('color')).toMatch(/rgba\(0, 0, 0, 1\)|rgb\(0, 0, 0\)/);
        });
      </file>
    </example>
  */
 var ngStyleDirective = ngDirective(function(scope, element, attr) {
-  scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {
+  scope.$watchCollection(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {
     if (oldStyles && (newStyles !== oldStyles)) {
-      forEach(oldStyles, function(val, style) { element.css(style, '');});
+      forEach(oldStyles, function(val, style) { element.css(style, ''); });
     }
     if (newStyles) element.css(newStyles);
-  }, true);
+  });
 });
 
 /**
@@ -31358,8 +34735,8 @@ var ngSwitchDefaultDirective = ngDirective({
  *
  * If the transcluded content is not empty (i.e. contains one or more DOM nodes, including whitespace text nodes), any existing
  * content of this element will be removed before the transcluded content is inserted.
- * If the transcluded content is empty, the existing content is left intact. This lets you provide fallback content in the case
- * that no transcluded content is provided.
+ * If the transcluded content is empty (or only whitespace), the existing content is left intact. This lets you provide fallback
+ * content in the case that no transcluded content is provided.
  *
  * @element ANY
  *
@@ -31392,7 +34769,7 @@ var ngSwitchDefaultDirective = ngDirective({
  *     <div ng-controller="ExampleController">
  *       <input ng-model="title" aria-label="title"> <br/>
  *       <textarea ng-model="text" aria-label="text"></textarea> <br/>
- *       <pane title="{{title}}">{{text}}</pane>
+ *       <pane title="{{title}}"><span>{{text}}</span></pane>
  *     </div>
  *   </file>
  *   <file name="protractor.js" type="protractor">
@@ -31507,7 +34884,6 @@ var ngTranscludeMinErr = minErr('ngTransclude');
 var ngTranscludeDirective = ['$compile', function($compile) {
   return {
     restrict: 'EAC',
-    terminal: true,
     compile: function ngTranscludeCompile(tElement) {
 
       // Remove and cache any original content to act as a fallback
@@ -31540,7 +34916,7 @@ var ngTranscludeDirective = ['$compile', function($compile) {
         }
 
         function ngTranscludeCloneAttachFn(clone, transcludedScope) {
-          if (clone.length) {
+          if (clone.length && notWhitespace(clone)) {
             $element.append(clone);
           } else {
             useFallbackContent();
@@ -31557,6 +34933,15 @@ var ngTranscludeDirective = ['$compile', function($compile) {
             $element.append(clone);
           });
         }
+
+        function notWhitespace(nodes) {
+          for (var i = 0, ii = nodes.length; i < ii; i++) {
+            var node = nodes[i];
+            if (node.nodeType !== NODE_TYPE_TEXT || node.nodeValue.trim()) {
+              return true;
+            }
+          }
+        }
       };
     }
   };
@@ -31574,118 +34959,299 @@ var ngTranscludeDirective = ['$compile', function($compile) {
  * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be
  * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.
  *
- * @param {string} type Must be set to `'text/ng-template'`.
- * @param {string} id Cache name of the template.
+ * @param {string} type Must be set to `'text/ng-template'`.
+ * @param {string} id Cache name of the template.
+ *
+ * @example
+  <example  name="script-tag">
+    <file name="index.html">
+      <script type="text/ng-template" id="/tpl.html">
+        Content of the template.
+      </script>
+
+      <a ng-click="currentTpl='/tpl.html'" id="tpl-link">Load inlined template</a>
+      <div id="tpl-content" ng-include src="currentTpl"></div>
+    </file>
+    <file name="protractor.js" type="protractor">
+      it('should load template defined inside script tag', function() {
+        element(by.css('#tpl-link')).click();
+        expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);
+      });
+    </file>
+  </example>
+ */
+var scriptDirective = ['$templateCache', function($templateCache) {
+  return {
+    restrict: 'E',
+    terminal: true,
+    compile: function(element, attr) {
+      if (attr.type === 'text/ng-template') {
+        var templateUrl = attr.id,
+            text = element[0].text;
+
+        $templateCache.put(templateUrl, text);
+      }
+    }
+  };
+}];
+
+/* exported selectDirective, optionDirective */
+
+var noopNgModelController = { $setViewValue: noop, $render: noop };
+
+function setOptionSelectedStatus(optionEl, value) {
+  optionEl.prop('selected', value);
+  /**
+   * When unselecting an option, setting the property to null / false should be enough
+   * However, screenreaders might react to the selected attribute instead, see
+   * https://github.com/angular/angular.js/issues/14419
+   * Note: "selected" is a boolean attr and will be removed when the "value" arg in attr() is false
+   * or null
+   */
+  optionEl.attr('selected', value);
+}
+
+/**
+ * @ngdoc type
+ * @name  select.SelectController
+ *
+ * @description
+ * The controller for the {@link ng.select select} directive. The controller exposes
+ * a few utility methods that can be used to augment the behavior of a regular or an
+ * {@link ng.ngOptions ngOptions} select element.
+ *
+ * @example
+ * ### Set a custom error when the unknown option is selected
+ *
+ * This example sets a custom error "unknownValue" on the ngModelController
+ * when the select element's unknown option is selected, i.e. when the model is set to a value
+ * that is not matched by any option.
+ *
+ * <example name="select-unknown-value-error" module="staticSelect">
+ * <file name="index.html">
+ * <div ng-controller="ExampleController">
+ *   <form name="myForm">
+ *     <label for="testSelect"> Single select: </label><br>
+ *     <select name="testSelect" ng-model="selected" unknown-value-error>
+ *       <option value="option-1">Option 1</option>
+ *       <option value="option-2">Option 2</option>
+ *     </select><br>
+ *     <span class="error" ng-if="myForm.testSelect.$error.unknownValue">
+ *       Error: The current model doesn't match any option</span><br>
+ *
+ *     <button ng-click="forceUnknownOption()">Force unknown option</button><br>
+ *   </form>
+ * </div>
+ * </file>
+ * <file name="app.js">
+ *  angular.module('staticSelect', [])
+ *    .controller('ExampleController', ['$scope', function($scope) {
+ *      $scope.selected = null;
+ *
+ *      $scope.forceUnknownOption = function() {
+ *        $scope.selected = 'nonsense';
+ *      };
+ *   }])
+ *   .directive('unknownValueError', function() {
+ *     return {
+ *       require: ['ngModel', 'select'],
+ *       link: function(scope, element, attrs, ctrls) {
+ *         var ngModelCtrl = ctrls[0];
+ *         var selectCtrl = ctrls[1];
+ *
+ *         ngModelCtrl.$validators.unknownValue = function(modelValue, viewValue) {
+ *           if (selectCtrl.$isUnknownOptionSelected()) {
+ *             return false;
+ *           }
+ *
+ *           return true;
+ *         };
+ *       }
+ *
+ *     };
+ *   });
+ * </file>
+ *</example>
+ *
+ *
+ * @example
+ * ### Set the "required" error when the unknown option is selected.
+ *
+ * By default, the "required" error on the ngModelController is only set on a required select
+ * when the empty option is selected. This example adds a custom directive that also sets the
+ * error when the unknown option is selected.
+ *
+ * <example name="select-unknown-value-required" module="staticSelect">
+ * <file name="index.html">
+ * <div ng-controller="ExampleController">
+ *   <form name="myForm">
+ *     <label for="testSelect"> Select: </label><br>
+ *     <select name="testSelect" ng-model="selected" required unknown-value-required>
+ *       <option value="option-1">Option 1</option>
+ *       <option value="option-2">Option 2</option>
+ *     </select><br>
+ *     <span class="error" ng-if="myForm.testSelect.$error.required">Error: Please select a value</span><br>
+ *
+ *     <button ng-click="forceUnknownOption()">Force unknown option</button><br>
+ *   </form>
+ * </div>
+ * </file>
+ * <file name="app.js">
+ *  angular.module('staticSelect', [])
+ *    .controller('ExampleController', ['$scope', function($scope) {
+ *      $scope.selected = null;
+ *
+ *      $scope.forceUnknownOption = function() {
+ *        $scope.selected = 'nonsense';
+ *      };
+ *   }])
+ *   .directive('unknownValueRequired', function() {
+ *     return {
+ *       priority: 1, // This directive must run after the required directive has added its validator
+ *       require: ['ngModel', 'select'],
+ *       link: function(scope, element, attrs, ctrls) {
+ *         var ngModelCtrl = ctrls[0];
+ *         var selectCtrl = ctrls[1];
+ *
+ *         var originalRequiredValidator = ngModelCtrl.$validators.required;
+ *
+ *         ngModelCtrl.$validators.required = function() {
+ *           if (attrs.required && selectCtrl.$isUnknownOptionSelected()) {
+ *             return false;
+ *           }
  *
- * @example
-  <example  name="script-tag">
-    <file name="index.html">
-      <script type="text/ng-template" id="/tpl.html">
-        Content of the template.
-      </script>
+ *           return originalRequiredValidator.apply(this, arguments);
+ *         };
+ *       }
+ *     };
+ *   });
+ * </file>
+ * <file name="protractor.js" type="protractor">
+ *  it('should show the error message when the unknown option is selected', function() {
 
-      <a ng-click="currentTpl='/tpl.html'" id="tpl-link">Load inlined template</a>
-      <div id="tpl-content" ng-include src="currentTpl"></div>
-    </file>
-    <file name="protractor.js" type="protractor">
-      it('should load template defined inside script tag', function() {
-        element(by.css('#tpl-link')).click();
-        expect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);
-      });
-    </file>
-  </example>
- */
-var scriptDirective = ['$templateCache', function($templateCache) {
-  return {
-    restrict: 'E',
-    terminal: true,
-    compile: function(element, attr) {
-      if (attr.type === 'text/ng-template') {
-        var templateUrl = attr.id,
-            text = element[0].text;
+      var error = element(by.className('error'));
 
-        $templateCache.put(templateUrl, text);
-      }
-    }
-  };
-}];
+      expect(error.getText()).toBe('Error: Please select a value');
 
-/* exported selectDirective, optionDirective */
+      element(by.cssContainingText('option', 'Option 1')).click();
 
-var noopNgModelController = { $setViewValue: noop, $render: noop };
+      expect(error.isPresent()).toBe(false);
 
-function chromeHack(optionElement) {
-  // Workaround for https://code.google.com/p/chromium/issues/detail?id=381459
-  // Adding an <option selected="selected"> element to a <select required="required"> should
-  // automatically select the new element
-  if (optionElement[0].hasAttribute('selected')) {
-    optionElement[0].selected = true;
-  }
-}
+      element(by.tagName('button')).click();
 
-/**
- * @ngdoc type
- * @name  select.SelectController
- * @description
- * The controller for the `<select>` directive. This provides support for reading
- * and writing the selected value(s) of the control and also coordinates dynamically
- * added `<option>` elements, perhaps by an `ngRepeat` directive.
+      expect(error.getText()).toBe('Error: Please select a value');
+    });
+ * </file>
+ *</example>
+ *
+ *
  */
 var SelectController =
         ['$element', '$scope', /** @this */ function($element, $scope) {
 
   var self = this,
-      optionsMap = new HashMap();
+      optionsMap = new NgMap();
+
+  self.selectValueMap = {}; // Keys are the hashed values, values the original values
 
   // If the ngModel doesn't get provided then provide a dummy noop version to prevent errors
   self.ngModelCtrl = noopNgModelController;
+  self.multiple = false;
 
   // The "unknown" option is one that is prepended to the list if the viewValue
   // does not match any of the options. When it is rendered the value of the unknown
   // option is '? XXX ?' where XXX is the hashKey of the value that is not known.
   //
+  // Support: IE 9 only
   // We can't just jqLite('<option>') since jqLite is not smart enough
   // to create it in <select> and IE barfs otherwise.
   self.unknownOption = jqLite(window.document.createElement('option'));
+
+  // The empty option is an option with the value '' that the application developer can
+  // provide inside the select. It is always selectable and indicates that a "null" selection has
+  // been made by the user.
+  // If the select has an empty option, and the model of the select is set to "undefined" or "null",
+  // the empty option is selected.
+  // If the model is set to a different unmatched value, the unknown option is rendered and
+  // selected, i.e both are present, because a "null" selection and an unknown value are different.
+  self.hasEmptyOption = false;
+  self.emptyOption = undefined;
+
   self.renderUnknownOption = function(val) {
-    var unknownVal = '? ' + hashKey(val) + ' ?';
+    var unknownVal = self.generateUnknownOptionValue(val);
     self.unknownOption.val(unknownVal);
     $element.prepend(self.unknownOption);
+    setOptionSelectedStatus(self.unknownOption, true);
     $element.val(unknownVal);
   };
 
-  $scope.$on('$destroy', function() {
-    // disable unknown option so that we don't do work when the whole select is being destroyed
-    self.renderUnknownOption = noop;
-  });
+  self.updateUnknownOption = function(val) {
+    var unknownVal = self.generateUnknownOptionValue(val);
+    self.unknownOption.val(unknownVal);
+    setOptionSelectedStatus(self.unknownOption, true);
+    $element.val(unknownVal);
+  };
+
+  self.generateUnknownOptionValue = function(val) {
+    return '? ' + hashKey(val) + ' ?';
+  };
 
   self.removeUnknownOption = function() {
     if (self.unknownOption.parent()) self.unknownOption.remove();
   };
 
+  self.selectEmptyOption = function() {
+    if (self.emptyOption) {
+      $element.val('');
+      setOptionSelectedStatus(self.emptyOption, true);
+    }
+  };
+
+  self.unselectEmptyOption = function() {
+    if (self.hasEmptyOption) {
+      setOptionSelectedStatus(self.emptyOption, false);
+    }
+  };
+
+  $scope.$on('$destroy', function() {
+    // disable unknown option so that we don't do work when the whole select is being destroyed
+    self.renderUnknownOption = noop;
+  });
 
   // Read the value of the select control, the implementation of this changes depending
   // upon whether the select can have multiple values and whether ngOptions is at work.
   self.readValue = function readSingleValue() {
-    self.removeUnknownOption();
-    return $element.val();
+    var val = $element.val();
+    // ngValue added option values are stored in the selectValueMap, normal interpolations are not
+    var realVal = val in self.selectValueMap ? self.selectValueMap[val] : val;
+
+    if (self.hasOption(realVal)) {
+      return realVal;
+    }
+
+    return null;
   };
 
 
   // Write the value to the select control, the implementation of this changes depending
   // upon whether the select can have multiple values and whether ngOptions is at work.
   self.writeValue = function writeSingleValue(value) {
+    // Make sure to remove the selected attribute from the previously selected option
+    // Otherwise, screen readers might get confused
+    var currentlySelectedOption = $element[0].options[$element[0].selectedIndex];
+    if (currentlySelectedOption) setOptionSelectedStatus(jqLite(currentlySelectedOption), false);
+
     if (self.hasOption(value)) {
       self.removeUnknownOption();
-      $element.val(value);
-      if (value === '') self.emptyOption.prop('selected', true); // to make IE9 happy
+
+      var hashedVal = hashKey(value);
+      $element.val(hashedVal in self.selectValueMap ? hashedVal : value);
+
+      // Set selected attribute and property on selected option for screen readers
+      var selectedOption = $element[0].options[$element[0].selectedIndex];
+      setOptionSelectedStatus(jqLite(selectedOption), true);
     } else {
-      if (value == null && self.emptyOption) {
-        self.removeUnknownOption();
-        $element.val('');
-      } else {
-        self.renderUnknownOption(value);
-      }
+      self.selectUnknownOrEmptyOption(value);
     }
   };
 
@@ -31697,12 +35263,14 @@ var SelectController =
 
     assertNotHasOwnProperty(value, '"option value"');
     if (value === '') {
+      self.hasEmptyOption = true;
       self.emptyOption = element;
     }
     var count = optionsMap.get(value) || 0;
-    optionsMap.put(value, count + 1);
-    self.ngModelCtrl.$render();
-    chromeHack(element);
+    optionsMap.set(value, count + 1);
+    // Only render at the end of a digest. This improves render performance when many options
+    // are added during a digest and ensures all relevant options are correctly marked as selected
+    scheduleRender();
   };
 
   // Tell the select control that an option, with the given value, has been removed
@@ -31710,12 +35278,13 @@ var SelectController =
     var count = optionsMap.get(value);
     if (count) {
       if (count === 1) {
-        optionsMap.remove(value);
+        optionsMap.delete(value);
         if (value === '') {
+          self.hasEmptyOption = false;
           self.emptyOption = undefined;
         }
       } else {
-        optionsMap.put(value, count - 1);
+        optionsMap.set(value, count - 1);
       }
     }
   };
@@ -31725,36 +35294,185 @@ var SelectController =
     return !!optionsMap.get(value);
   };
 
+  /**
+   * @ngdoc method
+   * @name select.SelectController#$hasEmptyOption
+   *
+   * @description
+   *
+   * Returns `true` if the select element currently has an empty option
+   * element, i.e. an option that signifies that the select is empty / the selection is null.
+   *
+   */
+  self.$hasEmptyOption = function() {
+    return self.hasEmptyOption;
+  };
+
+  /**
+   * @ngdoc method
+   * @name select.SelectController#$isUnknownOptionSelected
+   *
+   * @description
+   *
+   * Returns `true` if the select element's unknown option is selected. The unknown option is added
+   * and automatically selected whenever the select model doesn't match any option.
+   *
+   */
+  self.$isUnknownOptionSelected = function() {
+    // Presence of the unknown option means it is selected
+    return $element[0].options[0] === self.unknownOption[0];
+  };
+
+  /**
+   * @ngdoc method
+   * @name select.SelectController#$isEmptyOptionSelected
+   *
+   * @description
+   *
+   * Returns `true` if the select element has an empty option and this empty option is currently
+   * selected. Returns `false` if the select element has no empty option or it is not selected.
+   *
+   */
+  self.$isEmptyOptionSelected = function() {
+    return self.hasEmptyOption && $element[0].options[$element[0].selectedIndex] === self.emptyOption[0];
+  };
+
+  self.selectUnknownOrEmptyOption = function(value) {
+    if (value == null && self.emptyOption) {
+      self.removeUnknownOption();
+      self.selectEmptyOption();
+    } else if (self.unknownOption.parent().length) {
+      self.updateUnknownOption(value);
+    } else {
+      self.renderUnknownOption(value);
+    }
+  };
+
+  var renderScheduled = false;
+  function scheduleRender() {
+    if (renderScheduled) return;
+    renderScheduled = true;
+    $scope.$$postDigest(function() {
+      renderScheduled = false;
+      self.ngModelCtrl.$render();
+    });
+  }
+
+  var updateScheduled = false;
+  function scheduleViewValueUpdate(renderAfter) {
+    if (updateScheduled) return;
+
+    updateScheduled = true;
+
+    $scope.$$postDigest(function() {
+      if ($scope.$$destroyed) return;
+
+      updateScheduled = false;
+      self.ngModelCtrl.$setViewValue(self.readValue());
+      if (renderAfter) self.ngModelCtrl.$render();
+    });
+  }
+
+
+  self.registerOption = function(optionScope, optionElement, optionAttrs, interpolateValueFn, interpolateTextFn) {
+
+    if (optionAttrs.$attr.ngValue) {
+      // The value attribute is set by ngValue
+      var oldVal, hashedVal;
+      optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) {
+
+        var removal;
+        var previouslySelected = optionElement.prop('selected');
+
+        if (isDefined(hashedVal)) {
+          self.removeOption(oldVal);
+          delete self.selectValueMap[hashedVal];
+          removal = true;
+        }
+
+        hashedVal = hashKey(newVal);
+        oldVal = newVal;
+        self.selectValueMap[hashedVal] = newVal;
+        self.addOption(newVal, optionElement);
+        // Set the attribute directly instead of using optionAttrs.$set - this stops the observer
+        // from firing a second time. Other $observers on value will also get the result of the
+        // ngValue expression, not the hashed value
+        optionElement.attr('value', hashedVal);
 
-  self.registerOption = function(optionScope, optionElement, optionAttrs, hasDynamicValueAttr, interpolateTextFn) {
+        if (removal && previouslySelected) {
+          scheduleViewValueUpdate();
+        }
 
-    if (hasDynamicValueAttr) {
-      // either "value" is interpolated directly, or set by ngValue
-      var oldVal;
+      });
+    } else if (interpolateValueFn) {
+      // The value attribute is interpolated
       optionAttrs.$observe('value', function valueAttributeObserveAction(newVal) {
+        // This method is overwritten in ngOptions and has side-effects!
+        self.readValue();
+
+        var removal;
+        var previouslySelected = optionElement.prop('selected');
+
         if (isDefined(oldVal)) {
           self.removeOption(oldVal);
+          removal = true;
         }
         oldVal = newVal;
         self.addOption(newVal, optionElement);
+
+        if (removal && previouslySelected) {
+          scheduleViewValueUpdate();
+        }
       });
     } else if (interpolateTextFn) {
       // The text content is interpolated
       optionScope.$watch(interpolateTextFn, function interpolateWatchAction(newVal, oldVal) {
         optionAttrs.$set('value', newVal);
+        var previouslySelected = optionElement.prop('selected');
         if (oldVal !== newVal) {
           self.removeOption(oldVal);
         }
         self.addOption(newVal, optionElement);
+
+        if (oldVal && previouslySelected) {
+          scheduleViewValueUpdate();
+        }
       });
     } else {
       // The value attribute is static
       self.addOption(optionAttrs.value, optionElement);
     }
 
+
+    optionAttrs.$observe('disabled', function(newVal) {
+
+      // Since model updates will also select disabled options (like ngOptions),
+      // we only have to handle options becoming disabled, not enabled
+
+      if (newVal === 'true' || newVal && optionElement.prop('selected')) {
+        if (self.multiple) {
+          scheduleViewValueUpdate(true);
+        } else {
+          self.ngModelCtrl.$setViewValue(null);
+          self.ngModelCtrl.$render();
+        }
+      }
+    });
+
     optionElement.on('$destroy', function() {
-      self.removeOption(optionAttrs.value);
-      self.ngModelCtrl.$render();
+      var currentValue = self.readValue();
+      var removeValue = optionAttrs.value;
+
+      self.removeOption(removeValue);
+      scheduleRender();
+
+      if (self.multiple && currentValue && currentValue.indexOf(removeValue) !== -1 ||
+          currentValue === removeValue
+      ) {
+        // When multiple (selected) options are destroyed at the same time, we don't want
+        // to run a model update for each of them. Instead, run a single update in the $$postDigest
+        scheduleViewValueUpdate(true);
+      }
     });
   };
 }];
@@ -31765,7 +35483,7 @@ var SelectController =
  * @restrict E
  *
  * @description
- * HTML `SELECT` element with angular data-binding.
+ * HTML `select` element with AngularJS data-binding.
  *
  * The `select` directive is used together with {@link ngModel `ngModel`} to provide data-binding
  * between the scope and the `<select>` control (including setting default values).
@@ -31775,16 +35493,27 @@ var SelectController =
  * When an item in the `<select>` menu is selected, the value of the selected option will be bound
  * to the model identified by the `ngModel` directive. With static or repeated options, this is
  * the content of the `value` attribute or the textContent of the `<option>`, if the value attribute is missing.
- * For dynamic options, use interpolation inside the `value` attribute or the `textContent`. Using
- * {@link ngValue ngValue} is also possible (as it sets the `value` attribute), and will take
- * precedence over `value` and `textContent`.
+ * Value and textContent can be interpolated.
  *
- * <div class="alert alert-warning">
- * Note that the value of a `select` directive used without `ngOptions` is always a string.
- * When the model needs to be bound to a non-string value, you must either explicitly convert it
- * using a directive (see example below) or use `ngOptions` to specify the set of options.
- * This is because an option element can only be bound to string values at present.
- * </div>
+ * The {@link select.SelectController select controller} exposes utility functions that can be used
+ * to manipulate the select's behavior.
+ *
+ * ## Matching model and option values
+ *
+ * In general, the match between the model and an option is evaluated by strictly comparing the model
+ * value against the value of the available options.
+ *
+ * If you are setting the option value with the option's `value` attribute, or textContent, the
+ * value will always be a `string` which means that the model value must also be a string.
+ * Otherwise the `select` directive cannot match them correctly.
+ *
+ * To bind the model to a non-string value, you can use one of the following strategies:
+ * - the {@link ng.ngOptions `ngOptions`} directive
+ *   ({@link ng.select#using-select-with-ngoptions-and-setting-a-default-value})
+ * - the {@link ng.ngValue `ngValue`} directive, which allows arbitrary expressions to be
+ *   option values ({@link ng.select#using-ngvalue-to-bind-the-model-to-an-array-of-objects Example})
+ * - model $parsers / $formatters to convert the string value
+ *   ({@link ng.select#binding-select-to-a-non-string-value-via-ngmodel-parsing-formatting Example})
  *
  * If the viewValue of `ngModel` does not match any of the options, then the control
  * will automatically add an "unknown" option, which it then removes when the mismatch is resolved.
@@ -31793,16 +35522,20 @@ var SelectController =
  * be nested into the `<select>` element. This element will then represent the `null` or "not selected"
  * option. See example below for demonstration.
  *
- * <div class="alert alert-info">
+ * ## Choosing between `ngRepeat` and `ngOptions`
+ *
  * In many cases, `ngRepeat` can be used on `<option>` elements instead of {@link ng.directive:ngOptions
- * ngOptions} to achieve a similar result. However, `ngOptions` provides some benefits, such as
- * more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the
- * comprehension expression, and additionally in reducing memory and increasing speed by not creating
- * a new scope for each repeated instance.
- * </div>
+ * ngOptions} to achieve a similar result. However, `ngOptions` provides some benefits:
+ * - more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the
+ * comprehension expression
+ * - reduced memory consumption by not creating a new scope for each repeated instance
+ * - increased render speed by creating the options in a documentFragment instead of individually
+ *
+ * Specifically, select with repeated options slows down significantly starting at 2000 options in
+ * Chrome and Internet Explorer / Edge.
  *
  *
- * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string} ngModel Assignable AngularJS expression to data-bind to.
  * @param {string=} name Property name of the form under which the control is published.
  * @param {string=} multiple Allows multiple options to be selected. The selected values will be
  *     bound to the model as an array.
@@ -31810,10 +35543,13 @@ var SelectController =
  * @param {string=} ngRequired Adds required attribute and required validation constraint to
  * the element when the ngRequired expression evaluates to true. Use ngRequired instead of required
  * when you want to data-bind to the required attribute.
- * @param {string=} ngChange Angular expression to be executed when selected option(s) changes due to user
+ * @param {string=} ngChange AngularJS expression to be executed when selected option(s) changes due to user
  *    interaction with the select element.
  * @param {string=} ngOptions sets the options that the select is populated with and defines what is
  * set on the model on selection. See {@link ngOptions `ngOptions`}.
+ * @param {string=} ngAttrSize sets the size of the select element dynamically. Uses the
+ * {@link guide/interpolation#-ngattr-for-binding-to-arbitrary-attributes ngAttr} directive.
+ *
  *
  * @example
  * ### Simple `select` elements with static options
@@ -31864,25 +35600,26 @@ var SelectController =
  * </file>
  *</example>
  *
+ * @example
  * ### Using `ngRepeat` to generate `select` options
- * <example name="ngrepeat-select" module="ngrepeatSelect">
+ * <example name="select-ngrepeat" module="ngrepeatSelect">
  * <file name="index.html">
  * <div ng-controller="ExampleController">
  *   <form name="myForm">
  *     <label for="repeatSelect"> Repeat select: </label>
- *     <select name="repeatSelect" id="repeatSelect" ng-model="data.repeatSelect">
+ *     <select name="repeatSelect" id="repeatSelect" ng-model="data.model">
  *       <option ng-repeat="option in data.availableOptions" value="{{option.id}}">{{option.name}}</option>
  *     </select>
  *   </form>
  *   <hr>
- *   <tt>repeatSelect = {{data.repeatSelect}}</tt><br/>
+ *   <tt>model = {{data.model}}</tt><br/>
  * </div>
  * </file>
  * <file name="app.js">
  *  angular.module('ngrepeatSelect', [])
  *    .controller('ExampleController', ['$scope', function($scope) {
  *      $scope.data = {
- *       repeatSelect: null,
+ *       model: null,
  *       availableOptions: [
  *         {id: '1', name: 'Option A'},
  *         {id: '2', name: 'Option B'},
@@ -31893,7 +35630,40 @@ var SelectController =
  * </file>
  *</example>
  *
+ * @example
+ * ### Using `ngValue` to bind the model to an array of objects
+ * <example name="select-ngvalue" module="ngvalueSelect">
+ * <file name="index.html">
+ * <div ng-controller="ExampleController">
+ *   <form name="myForm">
+ *     <label for="ngvalueselect"> ngvalue select: </label>
+ *     <select size="6" name="ngvalueselect" ng-model="data.model" multiple>
+ *       <option ng-repeat="option in data.availableOptions" ng-value="option.value">{{option.name}}</option>
+ *     </select>
+ *   </form>
+ *   <hr>
+ *   <pre>model = {{data.model | json}}</pre><br/>
+ * </div>
+ * </file>
+ * <file name="app.js">
+ *  angular.module('ngvalueSelect', [])
+ *    .controller('ExampleController', ['$scope', function($scope) {
+ *      $scope.data = {
+ *       model: null,
+ *       availableOptions: [
+           {value: 'myString', name: 'string'},
+           {value: 1, name: 'integer'},
+           {value: true, name: 'boolean'},
+           {value: null, name: 'null'},
+           {value: {prop: 'value'}, name: 'object'},
+           {value: ['a'], name: 'array'}
+ *       ]
+ *      };
+ *   }]);
+ * </file>
+ *</example>
  *
+ * @example
  * ### Using `select` with `ngOptions` and setting a default value
  * See the {@link ngOptions ngOptions documentation} for more `ngOptions` usage examples.
  *
@@ -31925,7 +35695,7 @@ var SelectController =
  * </file>
  *</example>
  *
- *
+ * @example
  * ### Binding `select` to a non-string value via `ngModel` parsing / formatting
  *
  * <example name="select-with-non-string-options" module="nonStringSelect">
@@ -31979,11 +35749,16 @@ var selectDirective = function() {
 
   function selectPreLink(scope, element, attr, ctrls) {
 
-      // if ngModel is not defined, we don't need to do anything
+      var selectCtrl = ctrls[0];
       var ngModelCtrl = ctrls[1];
-      if (!ngModelCtrl) return;
 
-      var selectCtrl = ctrls[0];
+      // if ngModel is not defined, we don't need to do anything but set the registerOption
+      // function to noop, so options don't get added internally
+      if (!ngModelCtrl) {
+        selectCtrl.registerOption = noop;
+        return;
+      }
+
 
       selectCtrl.ngModelCtrl = ngModelCtrl;
 
@@ -31991,6 +35766,7 @@ var selectDirective = function() {
       // to the `readValue` method, which can be changed if the select can have multiple
       // selected values or if the options are being generated by `ngOptions`
       element.on('change', function() {
+        selectCtrl.removeUnknownOption();
         scope.$apply(function() {
           ngModelCtrl.$setViewValue(selectCtrl.readValue());
         });
@@ -32001,13 +35777,15 @@ var selectDirective = function() {
       // we have to add an extra watch since ngModel doesn't work well with arrays - it
       // doesn't trigger rendering if only an item in the array changes.
       if (attr.multiple) {
+        selectCtrl.multiple = true;
 
         // Read value now needs to check each option to see if it is selected
         selectCtrl.readValue = function readMultipleValue() {
           var array = [];
           forEach(element.find('option'), function(option) {
-            if (option.selected) {
-              array.push(option.value);
+            if (option.selected && !option.disabled) {
+              var val = option.value;
+              array.push(val in selectCtrl.selectValueMap ? selectCtrl.selectValueMap[val] : val);
             }
           });
           return array;
@@ -32015,9 +35793,22 @@ var selectDirective = function() {
 
         // Write value now needs to set the selected property of each matching option
         selectCtrl.writeValue = function writeMultipleValue(value) {
-          var items = new HashMap(value);
           forEach(element.find('option'), function(option) {
-            option.selected = isDefined(items.get(option.value));
+            var shouldBeSelected = !!value && (includes(value, option.value) ||
+                                               includes(value, selectCtrl.selectValueMap[option.value]));
+            var currentlySelected = option.selected;
+
+            // Support: IE 9-11 only, Edge 12-15+
+            // In IE and Edge adding options to the selection via shift+click/UP/DOWN
+            // will de-select already selected options if "selected" on those options was set
+            // more than once (i.e. when the options were already selected)
+            // So we only modify the selected property if necessary.
+            // Note: this behavior cannot be replicated via unit tests because it only shows in the
+            // actual user interface.
+            if (shouldBeSelected !== currentlySelected) {
+              setOptionSelectedStatus(jqLite(option), shouldBeSelected);
+            }
+
           });
         };
 
@@ -32068,15 +35859,13 @@ var optionDirective = ['$interpolate', function($interpolate) {
     restrict: 'E',
     priority: 100,
     compile: function(element, attr) {
-      var hasDynamicValueAttr, interpolateTextFn;
+      var interpolateValueFn, interpolateTextFn;
 
       if (isDefined(attr.ngValue)) {
-        // If ngValue is defined, then the value attr will be set to the result of the expression,
-        // and the selectCtrl must set up an observer
-        hasDynamicValueAttr = true;
+        // Will be handled by registerOption
       } else if (isDefined(attr.value)) {
-        // If the value attr contains an interpolation, the selectCtrl must set up an observer
-        hasDynamicValueAttr = $interpolate(attr.value, true);
+        // If the value attribute is defined, check if it contains an interpolation
+        interpolateValueFn = $interpolate(attr.value, true);
       } else {
         // If the value attribute is not defined then we fall back to the
         // text content of the option element, which may be interpolated
@@ -32095,7 +35884,7 @@ var optionDirective = ['$interpolate', function($interpolate) {
               parent.parent().data(selectCtrlName); // in case we are in optgroup
 
         if (selectCtrl) {
-          selectCtrl.registerOption(scope, element, attr, hasDynamicValueAttr, interpolateTextFn);
+          selectCtrl.registerOption(scope, element, attr, interpolateValueFn, interpolateTextFn);
         }
       };
     }
@@ -32107,13 +35896,17 @@ var optionDirective = ['$interpolate', function($interpolate) {
  * @name ngRequired
  * @restrict A
  *
+ * @param {expression} ngRequired AngularJS expression. If it evaluates to `true`, it sets the
+ *                                `required` attribute to the element and adds the `required`
+ *                                {@link ngModel.NgModelController#$validators `validator`}.
+ *
  * @description
  *
  * ngRequired adds the required {@link ngModel.NgModelController#$validators `validator`} to {@link ngModel `ngModel`}.
  * It is most often used for {@link input `input`} and {@link select `select`} controls, but can also be
  * applied to custom controls.
  *
- * The directive sets the `required` attribute on the element if the Angular expression inside
+ * The directive sets the `required` attribute on the element if the AngularJS expression inside
  * `ngRequired` evaluates to true. A special directive for setting `required` is necessary because we
  * cannot use interpolation inside `required`. See the {@link guide/interpolation interpolation guide}
  * for more info.
@@ -32161,28 +35954,44 @@ var optionDirective = ['$interpolate', function($interpolate) {
  *   </file>
  * </example>
  */
-var requiredDirective = function() {
+var requiredDirective = ['$parse', function($parse) {
   return {
     restrict: 'A',
     require: '?ngModel',
     link: function(scope, elm, attr, ctrl) {
       if (!ctrl) return;
-      attr.required = true; // force truthy in case we are on non input element
+      // For boolean attributes like required, presence means true
+      var value = attr.hasOwnProperty('required') || $parse(attr.ngRequired)(scope);
+
+      if (!attr.ngRequired) {
+        // force truthy in case we are on non input element
+        // (input elements do this automatically for boolean attributes like required)
+        attr.required = true;
+      }
 
       ctrl.$validators.required = function(modelValue, viewValue) {
-        return !attr.required || !ctrl.$isEmpty(viewValue);
+        return !value || !ctrl.$isEmpty(viewValue);
       };
 
-      attr.$observe('required', function() {
-        ctrl.$validate();
+      attr.$observe('required', function(newVal) {
+
+        if (value !== newVal) {
+          value = newVal;
+          ctrl.$validate();
+        }
       });
     }
   };
-};
+}];
 
 /**
  * @ngdoc directive
  * @name ngPattern
+ * @restrict A
+ *
+ * @param {expression|RegExp} ngPattern AngularJS expression that must evaluate to a `RegExp` or a `String`
+ *                                      parsable into a `RegExp`, or a `RegExp` literal. See above for
+ *                                      more details.
  *
  * @description
  *
@@ -32190,11 +35999,12 @@ var requiredDirective = function() {
  * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.
  *
  * The validator sets the `pattern` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}
- * does not match a RegExp which is obtained by evaluating the Angular expression given in the
- * `ngPattern` attribute value:
- * * If the expression evaluates to a RegExp object, then this is used directly.
- * * If the expression evaluates to a string, then it will be converted to a RegExp after wrapping it
- * in `^` and `$` characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
+ * does not match a RegExp which is obtained from the `ngPattern` attribute value:
+ * - the value is an AngularJS expression:
+ *   - If the expression evaluates to a RegExp object, then this is used directly.
+ *   - If the expression evaluates to a string, then it will be converted to a RegExp after wrapping it
+ *     in `^` and `$` characters. For instance, `"abc"` will be converted to `new RegExp('^abc$')`.
+ * - If the value is a RegExp literal, e.g. `ngPattern="/^\d+$/"`, it is used directly.
  *
  * <div class="alert alert-info">
  * **Note:** Avoid using the `g` flag on the RegExp, as it will cause each successive search to
@@ -32255,40 +36065,68 @@ var requiredDirective = function() {
  *   </file>
  * </example>
  */
-var patternDirective = function() {
+var patternDirective = ['$parse', function($parse) {
   return {
     restrict: 'A',
     require: '?ngModel',
-    link: function(scope, elm, attr, ctrl) {
-      if (!ctrl) return;
-
-      var regexp, patternExp = attr.ngPattern || attr.pattern;
-      attr.$observe('pattern', function(regex) {
-        if (isString(regex) && regex.length > 0) {
-          regex = new RegExp('^' + regex + '$');
+    compile: function(tElm, tAttr) {
+      var patternExp;
+      var parseFn;
+
+      if (tAttr.ngPattern) {
+        patternExp = tAttr.ngPattern;
+
+        // ngPattern might be a scope expression, or an inlined regex, which is not parsable.
+        // We get value of the attribute here, so we can compare the old and the new value
+        // in the observer to avoid unnecessary validations
+        if (tAttr.ngPattern.charAt(0) === '/' && REGEX_STRING_REGEXP.test(tAttr.ngPattern)) {
+          parseFn = function() { return tAttr.ngPattern; };
+        } else {
+          parseFn = $parse(tAttr.ngPattern);
         }
+      }
+
+      return function(scope, elm, attr, ctrl) {
+        if (!ctrl) return;
 
-        if (regex && !regex.test) {
-          throw minErr('ngPattern')('noregexp',
-            'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp,
-            regex, startingTag(elm));
+        var attrVal = attr.pattern;
+
+        if (attr.ngPattern) {
+          attrVal = parseFn(scope);
+        } else {
+          patternExp = attr.pattern;
         }
 
-        regexp = regex || undefined;
-        ctrl.$validate();
-      });
+        var regexp = parsePatternAttr(attrVal, patternExp, elm);
+
+        attr.$observe('pattern', function(newVal) {
+          var oldRegexp = regexp;
+
+          regexp = parsePatternAttr(newVal, patternExp, elm);
 
-      ctrl.$validators.pattern = function(modelValue, viewValue) {
-        // HTML5 pattern constraint validates the input value, so we validate the viewValue
-        return ctrl.$isEmpty(viewValue) || isUndefined(regexp) || regexp.test(viewValue);
+          if ((oldRegexp && oldRegexp.toString()) !== (regexp && regexp.toString())) {
+            ctrl.$validate();
+          }
+        });
+
+        ctrl.$validators.pattern = function(modelValue, viewValue) {
+          // HTML5 pattern constraint validates the input value, so we validate the viewValue
+          return ctrl.$isEmpty(viewValue) || isUndefined(regexp) || regexp.test(viewValue);
+        };
       };
     }
+
   };
-};
+}];
 
 /**
  * @ngdoc directive
  * @name ngMaxlength
+ * @restrict A
+ *
+ * @param {expression} ngMaxlength AngularJS expression that must evaluate to a `Number` or `String`
+ *                                 parsable into a `Number`. Used as value for the `maxlength`
+ *                                 {@link ngModel.NgModelController#$validators validator}.
  *
  * @description
  *
@@ -32296,7 +36134,7 @@ var patternDirective = function() {
  * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.
  *
  * The validator sets the `maxlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}
- * is longer than the integer obtained by evaluating the Angular expression given in the
+ * is longer than the integer obtained by evaluating the AngularJS expression given in the
  * `ngMaxlength` attribute value.
  *
  * <div class="alert alert-info">
@@ -32352,29 +36190,38 @@ var patternDirective = function() {
  *   </file>
  * </example>
  */
-var maxlengthDirective = function() {
+var maxlengthDirective = ['$parse', function($parse) {
   return {
     restrict: 'A',
     require: '?ngModel',
     link: function(scope, elm, attr, ctrl) {
       if (!ctrl) return;
 
-      var maxlength = -1;
+      var maxlength = attr.maxlength || $parse(attr.ngMaxlength)(scope);
+      var maxlengthParsed = parseLength(maxlength);
+
       attr.$observe('maxlength', function(value) {
-        var intVal = toInt(value);
-        maxlength = isNumberNaN(intVal) ? -1 : intVal;
-        ctrl.$validate();
+        if (maxlength !== value) {
+          maxlengthParsed = parseLength(value);
+          maxlength = value;
+          ctrl.$validate();
+        }
       });
       ctrl.$validators.maxlength = function(modelValue, viewValue) {
-        return (maxlength < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlength);
+        return (maxlengthParsed < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlengthParsed);
       };
     }
   };
-};
+}];
 
 /**
  * @ngdoc directive
  * @name ngMinlength
+ * @restrict A
+ *
+ * @param {expression} ngMinlength AngularJS expression that must evaluate to a `Number` or `String`
+ *                                 parsable into a `Number`. Used as value for the `minlength`
+ *                                 {@link ngModel.NgModelController#$validators validator}.
  *
  * @description
  *
@@ -32382,7 +36229,7 @@ var maxlengthDirective = function() {
  * It is most often used for text-based {@link input `input`} controls, but can also be applied to custom text-based controls.
  *
  * The validator sets the `minlength` error key if the {@link ngModel.NgModelController#$viewValue `ngModel.$viewValue`}
- * is shorter than the integer obtained by evaluating the Angular expression given in the
+ * is shorter than the integer obtained by evaluating the AngularJS expression given in the
  * `ngMinlength` attribute value.
  *
  * <div class="alert alert-info">
@@ -32436,35 +36283,63 @@ var maxlengthDirective = function() {
  *   </file>
  * </example>
  */
-var minlengthDirective = function() {
+var minlengthDirective = ['$parse', function($parse) {
   return {
     restrict: 'A',
     require: '?ngModel',
     link: function(scope, elm, attr, ctrl) {
       if (!ctrl) return;
 
-      var minlength = 0;
+      var minlength = attr.minlength || $parse(attr.ngMinlength)(scope);
+      var minlengthParsed = parseLength(minlength) || -1;
+
       attr.$observe('minlength', function(value) {
-        minlength = toInt(value) || 0;
-        ctrl.$validate();
+        if (minlength !== value) {
+          minlengthParsed = parseLength(value) || -1;
+          minlength = value;
+          ctrl.$validate();
+        }
+
       });
       ctrl.$validators.minlength = function(modelValue, viewValue) {
-        return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength;
+        return ctrl.$isEmpty(viewValue) || viewValue.length >= minlengthParsed;
       };
     }
   };
-};
+}];
+
+
+function parsePatternAttr(regex, patternExp, elm) {
+  if (!regex) return undefined;
+
+  if (isString(regex)) {
+    regex = new RegExp('^' + regex + '$');
+  }
+
+  if (!regex.test) {
+    throw minErr('ngPattern')('noregexp',
+      'Expected {0} to be a RegExp but was {1}. Element: {2}', patternExp,
+      regex, startingTag(elm));
+  }
+
+  return regex;
+}
+
+function parseLength(val) {
+  var intVal = toInt(val);
+  return isNumberNaN(intVal) ? -1 : intVal;
+}
 
 if (window.angular.bootstrap) {
-  //AngularJS is already loaded, so we can return here...
+  // AngularJS is already loaded, so we can return here...
   if (window.console) {
-    console.log('WARNING: Tried to load angular more than once.');
+    console.log('WARNING: Tried to load AngularJS more than once.');
   }
   return;
 }
 
-//try to bind to jquery now so that one can write jqLite(document).ready()
-//but we will rebind on bootstrap again.
+// try to bind to jquery now so that one can write jqLite(fn)
+// but we will rebind on bootstrap again.
 bindJQuery();
 
 publishExternalAPI(angular);
@@ -32612,10 +36487,10 @@ $provide.value("$locale", {
 });
 }]);
 
-  jqLite(window.document).ready(function() {
+  jqLite(function() {
     angularInit(window.document, bootstrap);
   });
 
 })(window);
 
-!window.angular.$$csp().noInlineStyle && window.angular.element(document.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:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');
\ No newline at end of file
+!window.angular.$$csp().noInlineStyle && window.angular.element(document.head).prepend(window.angular.element('<style>').text('@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}'));
\ No newline at end of file
diff --git a/civicrm/bower_components/angular/angular.min.js b/civicrm/bower_components/angular/angular.min.js
index c8d650bdd966ed3eaca2c8250196ebd724fa5577..c0e894dff160010d86c18c3183da8a34f00064f7 100644
--- a/civicrm/bower_components/angular/angular.min.js
+++ b/civicrm/bower_components/angular/angular.min.js
@@ -1,324 +1,350 @@
 /*
- AngularJS v1.5.11
- (c) 2010-2017 Google, Inc. http://angularjs.org
+ AngularJS v1.8.0
+ (c) 2010-2020 Google, Inc. http://angularjs.org
  License: MIT
 */
-(function(y){'use strict';function G(a,b){b=b||Error;return function(){var d=arguments[0],c;c="["+(a?a+":":"")+d+"] http://errors.angularjs.org/1.5.11/"+(a?a+"/":"")+d;for(d=1;d<arguments.length;d++){c=c+(1==d?"?":"&")+"p"+(d-1)+"=";var f=encodeURIComponent,e;e=arguments[d];e="function"==typeof e?e.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof e?"undefined":"string"!=typeof e?JSON.stringify(e):e;c+=f(e)}return new b(c)}}function la(a){if(null==a||Ya(a))return!1;if(I(a)||D(a)||F&&a instanceof
-F)return!0;var b="length"in Object(a)&&a.length;return ba(b)&&(0<=b&&(b-1 in a||a instanceof Array)||"function"===typeof a.item)}function q(a,b,d){var c,f;if(a)if(C(a))for(c in a)"prototype"===c||"length"===c||"name"===c||a.hasOwnProperty&&!a.hasOwnProperty(c)||b.call(d,a[c],c,a);else if(I(a)||la(a)){var e="object"!==typeof a;c=0;for(f=a.length;c<f;c++)(e||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==q)a.forEach(b,d,a);else if(xc(a))for(c in a)b.call(d,a[c],c,a);else if("function"===
-typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&b.call(d,a[c],c,a);else for(c in a)ua.call(a,c)&&b.call(d,a[c],c,a);return a}function yc(a,b,d){for(var c=Object.keys(a).sort(),f=0;f<c.length;f++)b.call(d,a[c[f]],c[f]);return c}function zc(a){return function(b,d){a(d,b)}}function ke(){return++sb}function Rb(a,b,d){for(var c=a.$$hashKey,f=0,e=b.length;f<e;++f){var g=b[f];if(E(g)||C(g))for(var h=Object.keys(g),k=0,l=h.length;k<l;k++){var m=h[k],n=g[m];d&&E(n)?ja(n)?a[m]=new Date(n.valueOf()):
-Za(n)?a[m]=new RegExp(n):n.nodeName?a[m]=n.cloneNode(!0):Sb(n)?a[m]=n.clone():(E(a[m])||(a[m]=I(n)?[]:{}),Rb(a[m],[n],!0)):a[m]=n}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function R(a){return Rb(a,va.call(arguments,1),!1)}function le(a){return Rb(a,va.call(arguments,1),!0)}function Z(a){return parseInt(a,10)}function Tb(a,b){return R(Object.create(a),b)}function w(){}function $a(a){return a}function ha(a){return function(){return a}}function Ac(a){return C(a.toString)&&a.toString!==ma}function z(a){return"undefined"===
-typeof a}function x(a){return"undefined"!==typeof a}function E(a){return null!==a&&"object"===typeof a}function xc(a){return null!==a&&"object"===typeof a&&!Bc(a)}function D(a){return"string"===typeof a}function ba(a){return"number"===typeof a}function ja(a){return"[object Date]"===ma.call(a)}function C(a){return"function"===typeof a}function Za(a){return"[object RegExp]"===ma.call(a)}function Ya(a){return a&&a.window===a}function ab(a){return a&&a.$evalAsync&&a.$watch}function Ka(a){return"boolean"===
-typeof a}function me(a){return a&&ba(a.length)&&ne.test(ma.call(a))}function Sb(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function oe(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function wa(a){return Q(a.nodeName||a[0]&&a[0].nodeName)}function bb(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function sa(a,b){function d(a,b){var d=b.$$hashKey,e;if(I(a)){e=0;for(var f=a.length;e<f;e++)b.push(c(a[e]))}else if(xc(a))for(e in a)b[e]=c(a[e]);else if(a&&
-"function"===typeof a.hasOwnProperty)for(e in a)a.hasOwnProperty(e)&&(b[e]=c(a[e]));else for(e in a)ua.call(a,e)&&(b[e]=c(a[e]));d?b.$$hashKey=d:delete b.$$hashKey;return b}function c(a){if(!E(a))return a;var b=e.indexOf(a);if(-1!==b)return g[b];if(Ya(a)||ab(a))throw xa("cpws");var b=!1,c=f(a);void 0===c&&(c=I(a)?[]:Object.create(Bc(a)),b=!0);e.push(a);g.push(c);return b?d(a,c):c}function f(a){switch(ma.call(a)){case "[object Int8Array]":case "[object Int16Array]":case "[object Int32Array]":case "[object Float32Array]":case "[object Float64Array]":case "[object Uint8Array]":case "[object Uint8ClampedArray]":case "[object Uint16Array]":case "[object Uint32Array]":return new a.constructor(c(a.buffer),
-a.byteOffset,a.length);case "[object ArrayBuffer]":if(!a.slice){var b=new ArrayBuffer(a.byteLength);(new Uint8Array(b)).set(new Uint8Array(a));return b}return a.slice(0);case "[object Boolean]":case "[object Number]":case "[object String]":case "[object Date]":return new a.constructor(a.valueOf());case "[object RegExp]":return b=new RegExp(a.source,a.toString().match(/[^/]*$/)[0]),b.lastIndex=a.lastIndex,b;case "[object Blob]":return new a.constructor([a],{type:a.type})}if(C(a.cloneNode))return a.cloneNode(!0)}
-var e=[],g=[];if(b){if(me(b)||"[object ArrayBuffer]"===ma.call(b))throw xa("cpta");if(a===b)throw xa("cpi");I(b)?b.length=0:q(b,function(a,d){"$$hashKey"!==d&&delete b[d]});e.push(a);g.push(b);return d(a,b)}return c(a)}function na(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d=typeof a,c;if(d===typeof b&&"object"===d)if(I(a)){if(!I(b))return!1;if((d=a.length)===b.length){for(c=0;c<d;c++)if(!na(a[c],b[c]))return!1;return!0}}else{if(ja(a))return ja(b)?na(a.getTime(),
-b.getTime()):!1;if(Za(a))return Za(b)?a.toString()===b.toString():!1;if(ab(a)||ab(b)||Ya(a)||Ya(b)||I(b)||ja(b)||Za(b))return!1;d=V();for(c in a)if("$"!==c.charAt(0)&&!C(a[c])){if(!na(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&x(b[c])&&!C(b[c]))return!1;return!0}return!1}function cb(a,b,d){return a.concat(va.call(b,d))}function db(a,b){var d=2<arguments.length?va.call(arguments,2):[];return!C(b)||b instanceof RegExp?b:d.length?function(){return arguments.length?b.apply(a,
-cb(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function pe(a,b){var d=b;"string"===typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=void 0:Ya(b)?d="$WINDOW":b&&y.document===b?d="$DOCUMENT":ab(b)&&(d="$SCOPE");return d}function eb(a,b){if(!z(a))return ba(b)||(b=b?2:null),JSON.stringify(a,pe,b)}function Cc(a){return D(a)?JSON.parse(a):a}function Dc(a,b){a=a.replace(qe,"");var d=Date.parse("Jan 01, 1970 00:00:00 "+a)/6E4;return ia(d)?b:d}function Ub(a,
-b,d){d=d?-1:1;var c=a.getTimezoneOffset();b=Dc(b,c);d*=b-c;a=new Date(a.getTime());a.setMinutes(a.getMinutes()+d);return a}function ya(a){a=F(a).clone();try{a.empty()}catch(b){}var d=F("<div>").append(a).html();try{return a[0].nodeType===La?Q(d):d.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(a,b){return"<"+Q(b)})}catch(c){return Q(d)}}function Ec(a){try{return decodeURIComponent(a)}catch(b){}}function Fc(a){var b={};q((a||"").split("&"),function(a){var c,f,e;a&&(f=a=a.replace(/\+/g,"%20"),
-c=a.indexOf("="),-1!==c&&(f=a.substring(0,c),e=a.substring(c+1)),f=Ec(f),x(f)&&(e=x(e)?Ec(e):!0,ua.call(b,f)?I(b[f])?b[f].push(e):b[f]=[b[f],e]:b[f]=e))});return b}function Vb(a){var b=[];q(a,function(a,c){I(a)?q(a,function(a){b.push(oa(c,!0)+(!0===a?"":"="+oa(a,!0)))}):b.push(oa(c,!0)+(!0===a?"":"="+oa(a,!0)))});return b.length?b.join("&"):""}function tb(a){return oa(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function oa(a,b){return encodeURIComponent(a).replace(/%40/gi,
-"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function re(a,b){var d,c,f=Oa.length;for(c=0;c<f;++c)if(d=Oa[c]+b,D(d=a.getAttribute(d)))return d;return null}function se(a,b){var d,c,f={};q(Oa,function(b){b+="app";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))});q(Oa,function(b){b+="app";var f;!d&&(f=a.querySelector("["+b.replace(":","\\:")+"]"))&&(d=f,c=f.getAttribute(b))});d&&(te?(f.strictDi=null!==re(d,"strict-di"),
-b(d,c?[c]:[],f)):y.console.error("Angular: disabling automatic bootstrap. <script> protocol indicates an extension, document.location.href does not match."))}function Gc(a,b,d){E(d)||(d={});d=R({strictDi:!1},d);var c=function(){a=F(a);if(a.injector()){var c=a[0]===y.document?"document":ya(a);throw xa("btstrpd",c.replace(/</,"&lt;").replace(/>/,"&gt;"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);
-b.unshift("ng");c=fb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},f=/^NG_ENABLE_DEBUG_INFO!/,e=/^NG_DEFER_BOOTSTRAP!/;y&&f.test(y.name)&&(d.debugInfoEnabled=!0,y.name=y.name.replace(f,""));if(y&&!e.test(y.name))return c();y.name=y.name.replace(e,"");$.resumeBootstrap=function(a){q(a,function(a){b.push(a)});return c()};C($.resumeDeferredBootstrap)&&$.resumeDeferredBootstrap()}function ue(){y.name=
-"NG_ENABLE_DEBUG_INFO!"+y.name;y.location.reload()}function ve(a){a=$.element(a).injector();if(!a)throw xa("test");return a.get("$$testability")}function Hc(a,b){b=b||"_";return a.replace(we,function(a,c){return(c?b:"")+a.toLowerCase()})}function xe(){var a;if(!Ic){var b=ub();(za=z(b)?y.jQuery:b?y[b]:void 0)&&za.fn.on?(F=za,R(za.fn,{scope:Pa.scope,isolateScope:Pa.isolateScope,controller:Pa.controller,injector:Pa.injector,inheritedData:Pa.inheritedData}),a=za.cleanData,za.cleanData=function(b){for(var c,
-f=0,e;null!=(e=b[f]);f++)(c=za._data(e,"events"))&&c.$destroy&&za(e).triggerHandler("$destroy");a(b)}):F=W;$.element=F;Ic=!0}}function gb(a,b,d){if(!a)throw xa("areq",b||"?",d||"required");return a}function Qa(a,b,d){d&&I(a)&&(a=a[a.length-1]);gb(C(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ra(a,b){if("hasOwnProperty"===a)throw xa("badname",b);}function Jc(a,b,d){if(!b)return a;b=b.split(".");for(var c,f=a,e=b.length,g=0;g<e;g++)c=
-b[g],a&&(a=(f=a)[c]);return!d&&C(a)?db(f,a):a}function vb(a){for(var b=a[0],d=a[a.length-1],c,f=1;b!==d&&(b=b.nextSibling);f++)if(c||a[f]!==b)c||(c=F(va.call(a,0,f))),c.push(b);return c||a}function V(){return Object.create(null)}function ye(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=G("$injector"),c=G("ng");a=b(a,"angular",Object);a.$$minErr=a.$$minErr||G;return b(a,"module",function(){var a={};return function(e,g,h){if("hasOwnProperty"===e)throw c("badname","module");g&&a.hasOwnProperty(e)&&
-(a[e]=null);return b(a,e,function(){function a(b,d,e,f){f||(f=c);return function(){f[e||"push"]([b,d,arguments]);return H}}function b(a,d){return function(b,f){f&&C(f)&&(f.$$moduleName=e);c.push([a,d,arguments]);return H}}if(!g)throw d("nomod",e);var c=[],f=[],r=[],s=a("$injector","invoke","push",f),H={_invokeQueue:c,_configBlocks:f,_runBlocks:r,requires:g,name:e,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide",
-"constant","unshift"),decorator:b("$provide","decorator"),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),component:b("$compileProvider","component"),config:s,run:function(a){r.push(a);return this}};h&&s(h);return H})}})}function ka(a,b){if(I(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(E(a))for(d in b=b||{},a)if("$"!==d.charAt(0)||"$"!==d.charAt(1))b[d]=a[d];
-return b||a}function ze(a){R(a,{bootstrap:Gc,copy:sa,extend:R,merge:le,equals:na,element:F,forEach:q,injector:fb,noop:w,bind:db,toJson:eb,fromJson:Cc,identity:$a,isUndefined:z,isDefined:x,isString:D,isFunction:C,isObject:E,isNumber:ba,isElement:Sb,isArray:I,version:Ae,isDate:ja,lowercase:Q,uppercase:wb,callbacks:{$$counter:0},getTestability:ve,$$minErr:G,$$csp:da,reloadWithDebugInfo:ue});Wb=ye(y);Wb("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Be});a.provider("$compile",Kc).directive({a:Ce,
-input:Lc,textarea:Lc,form:De,script:Ee,select:Fe,option:Ge,ngBind:He,ngBindHtml:Ie,ngBindTemplate:Je,ngClass:Ke,ngClassEven:Le,ngClassOdd:Me,ngCloak:Ne,ngController:Oe,ngForm:Pe,ngHide:Qe,ngIf:Re,ngInclude:Se,ngInit:Te,ngNonBindable:Ue,ngPluralize:Ve,ngRepeat:We,ngShow:Xe,ngStyle:Ye,ngSwitch:Ze,ngSwitchWhen:$e,ngSwitchDefault:af,ngOptions:bf,ngTransclude:cf,ngModel:df,ngList:ef,ngChange:ff,pattern:Mc,ngPattern:Mc,required:Nc,ngRequired:Nc,minlength:Oc,ngMinlength:Oc,maxlength:Pc,ngMaxlength:Pc,ngValue:gf,
-ngModelOptions:hf}).directive({ngInclude:jf}).directive(xb).directive(Qc);a.provider({$anchorScroll:kf,$animate:lf,$animateCss:mf,$$animateJs:nf,$$animateQueue:of,$$AnimateRunner:pf,$$animateAsyncRun:qf,$browser:rf,$cacheFactory:sf,$controller:tf,$document:uf,$exceptionHandler:vf,$filter:Rc,$$forceReflow:wf,$interpolate:xf,$interval:yf,$http:zf,$httpParamSerializer:Af,$httpParamSerializerJQLike:Bf,$httpBackend:Cf,$xhrFactory:Df,$jsonpCallbacks:Ef,$location:Ff,$log:Gf,$parse:Hf,$rootScope:If,$q:Jf,
-$$q:Kf,$sce:Lf,$sceDelegate:Mf,$sniffer:Nf,$templateCache:Of,$templateRequest:Pf,$$testability:Qf,$timeout:Rf,$window:Sf,$$rAF:Tf,$$jqLite:Uf,$$HashMap:Vf,$$cookieReader:Wf})}])}function hb(a){return a.replace(Xf,function(a,d,c,f){return f?c.toUpperCase():c}).replace(Yf,"Moz$1")}function Sc(a){a=a.nodeType;return 1===a||!a||9===a}function Tc(a,b){var d,c,f=b.createDocumentFragment(),e=[];if(Xb.test(a)){d=f.appendChild(b.createElement("div"));c=(Zf.exec(a)||["",""])[1].toLowerCase();c=pa[c]||pa._default;
-d.innerHTML=c[1]+a.replace($f,"<$1></$2>")+c[2];for(c=c[0];c--;)d=d.lastChild;e=cb(e,d.childNodes);d=f.firstChild;d.textContent=""}else e.push(b.createTextNode(a));f.textContent="";f.innerHTML="";q(e,function(a){f.appendChild(a)});return f}function Uc(a,b){var d=a.parentNode;d&&d.replaceChild(b,a);b.appendChild(a)}function W(a){if(a instanceof W)return a;var b;D(a)&&(a=Y(a),b=!0);if(!(this instanceof W)){if(b&&"<"!==a.charAt(0))throw Yb("nosel");return new W(a)}if(b){b=y.document;var d;a=(d=ag.exec(a))?
-[b.createElement(d[1])]:(d=Tc(a,b))?d.childNodes:[]}Vc(this,a)}function Zb(a){return a.cloneNode(!0)}function yb(a,b){b||ib(a);if(a.querySelectorAll)for(var d=a.querySelectorAll("*"),c=0,f=d.length;c<f;c++)ib(d[c])}function Wc(a,b,d,c){if(x(c))throw Yb("offargs");var f=(c=zb(a))&&c.events,e=c&&c.handle;if(e)if(b){var g=function(b){var c=f[b];x(d)&&bb(c||[],d);x(d)&&c&&0<c.length||(a.removeEventListener(b,e,!1),delete f[b])};q(b.split(" "),function(a){g(a);Ab[a]&&g(Ab[a])})}else for(b in f)"$destroy"!==
-b&&a.removeEventListener(b,e,!1),delete f[b]}function ib(a,b){var d=a.ng339,c=d&&jb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),Wc(a)),delete jb[d],a.ng339=void 0))}function zb(a,b){var d=a.ng339,d=d&&jb[d];b&&!d&&(a.ng339=d=++bg,d=jb[d]={events:{},data:{},handle:void 0});return d}function $b(a,b,d){if(Sc(a)){var c=x(d),f=!c&&b&&!E(b),e=!b;a=(a=zb(a,!f))&&a.data;if(c)a[b]=d;else{if(e)return a;if(f)return a&&a[b];R(a,b)}}}function Bb(a,b){return a.getAttribute?
--1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" "):!1}function Cb(a,b){b&&a.setAttribute&&q(b.split(" "),function(b){a.setAttribute("class",Y((" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").replace(" "+Y(b)+" "," ")))})}function Db(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ");q(b.split(" "),function(a){a=Y(a);-1===d.indexOf(" "+a+" ")&&(d+=a+" ")});a.setAttribute("class",Y(d))}}function Vc(a,b){if(b)if(b.nodeType)a[a.length++]=
-b;else{var d=b.length;if("number"===typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function Xc(a,b){return Eb(a,"$"+(b||"ngController")+"Controller")}function Eb(a,b,d){9===a.nodeType&&(a=a.documentElement);for(b=I(b)?b:[b];a;){for(var c=0,f=b.length;c<f;c++)if(x(d=F.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function Yc(a){for(yb(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Fb(a,b){b||yb(a);var d=a.parentNode;d&&d.removeChild(a)}
-function cg(a,b){b=b||y;if("complete"===b.document.readyState)b.setTimeout(a);else F(b).on("load",a)}function Zc(a,b){var d=Gb[b.toLowerCase()];return d&&$c[wa(a)]&&d}function dg(a,b){var d=function(c,d){c.isDefaultPrevented=function(){return c.defaultPrevented};var e=b[d||c.type],g=e?e.length:0;if(g){if(z(c.immediatePropagationStopped)){var h=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();h&&h.call(c)}}c.isImmediatePropagationStopped=
-function(){return!0===c.immediatePropagationStopped};var k=e.specialHandlerWrapper||eg;1<g&&(e=ka(e));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||k(a,c,e[l])}};d.elem=a;return d}function eg(a,b,d){d.call(a,b)}function fg(a,b,d){var c=b.relatedTarget;c&&(c===a||gg.call(a,c))||d.call(a,b)}function Uf(){this.$get=function(){return R(W,{hasClass:function(a,b){a.attr&&(a=a[0]);return Bb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return Db(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);
-return Cb(a,b)}})}}function Aa(a,b){var d=a&&a.$$hashKey;if(d)return"function"===typeof d&&(d=a.$$hashKey()),d;d=typeof a;return d="function"===d||"object"===d&&null!==a?a.$$hashKey=d+":"+(b||ke)():d+":"+a}function Sa(a,b){if(b){var d=0;this.nextUid=function(){return++d}}q(a,this.put,this)}function ad(a){a=(Function.prototype.toString.call(a)+" ").replace(hg,"");return a.match(ig)||a.match(jg)}function kg(a){return(a=ad(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function fb(a,b){function d(a){return function(b,
-c){if(E(b))q(b,zc(a));else return a(b,c)}}function c(a,b){Ra(a,"service");if(C(b)||I(b))b=r.instantiate(b);if(!b.$get)throw Ba("pget",a);return n[a+"Provider"]=b}function f(a,b){return function(){var c=u.invoke(b,this);if(z(c))throw Ba("undef",a);return c}}function e(a,b,d){return c(a,{$get:!1!==d?f(a,b):b})}function g(a){gb(z(a)||I(a),"modulesToLoad","not an array");var b=[],c;q(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=r.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.put(a,
-!0);try{D(a)?(c=Wb(a),b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):C(a)?b.push(r.invoke(a)):I(a)?b.push(r.invoke(a)):Qa(a,"module")}catch(e){throw I(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1===e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ba("modulerr",a,e.stack||e.message||e);}}});return b}function h(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===k)throw Ba("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=k,a[b]=
-c(b,e),a[b]}catch(f){throw a[b]===k&&delete a[b],f;}finally{l.shift()}}function e(a,c,f){var g=[];a=fb.$$annotate(a,b,f);for(var h=0,k=a.length;h<k;h++){var l=a[h];if("string"!==typeof l)throw Ba("itkn",l);g.push(c&&c.hasOwnProperty(l)?c[l]:d(l,f))}return g}return{invoke:function(a,b,c,d){"string"===typeof c&&(d=c,c=null);c=e(a,c,d);I(a)&&(a=a[a.length-1]);d=11>=Ia?!1:"function"===typeof a&&/^(?:class\b|constructor\()/.test(Function.prototype.toString.call(a)+" ");return d?(c.unshift(null),new (Function.prototype.bind.apply(a,
-c))):a.apply(b,c)},instantiate:function(a,b,c){var d=I(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d,a))},get:d,annotate:fb.$$annotate,has:function(b){return n.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var k={},l=[],m=new Sa([],!0),n={$provide:{provider:d(c),factory:d(e),service:d(function(a,b){return e(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return e(a,ha(b),!1)}),constant:d(function(a,b){Ra(a,"constant");
-n[a]=b;s[a]=b}),decorator:function(a,b){var c=r.get(a+"Provider"),d=c.$get;c.$get=function(){var a=u.invoke(d,c);return u.invoke(b,null,{$delegate:a})}}}},r=n.$injector=h(n,function(a,b){$.isString(b)&&l.push(b);throw Ba("unpr",l.join(" <- "));}),s={},H=h(s,function(a,b){var c=r.get(a+"Provider",b);return u.invoke(c.$get,c,void 0,a)}),u=H;n.$injectorProvider={$get:ha(H)};var p=g(a),u=H.get("$injector");u.strictDi=b;q(p,function(a){a&&u.invoke(a)});return u}function kf(){var a=!0;this.disableAutoScrolling=
-function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function f(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===wa(a))return b=a,!0});return b}function e(a){if(a){a.scrollIntoView();var c;c=g.yOffset;C(c)?c=c():Sb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):ba(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=D(a)?a:ba(a)?a.toString():d.hash();var b;a?(b=h.getElementById(a))?
-e(b):(b=f(h.getElementsByName(a)))?e(b):"top"===a&&e(null):e(null)}var h=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||cg(function(){c.$evalAsync(g)})});return g}]}function kb(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;I(a)&&(a=a.join(" "));I(b)&&(b=b.join(" "));return a+" "+b}function lg(a){D(a)&&(a=a.split(" "));var b=V();q(a,function(a){a.length&&(b[a]=!0)});return b}function Ca(a){return E(a)?a:{}}function mg(a,b,d,c){function f(a){try{a.apply(null,
-va.call(arguments,1))}finally{if(H--,0===H)for(;u.length;)try{u.pop()()}catch(b){d.error(b)}}}function e(){N=null;g();h()}function g(){p=L();p=z(p)?null:p;na(p,J)&&(p=J);J=p}function h(){if(A!==k.url()||K!==p)A=k.url(),K=p,q(O,function(a){a(k.url(),p)})}var k=this,l=a.location,m=a.history,n=a.setTimeout,r=a.clearTimeout,s={};k.isMock=!1;var H=0,u=[];k.$$completeOutstandingRequest=f;k.$$incOutstandingRequestCount=function(){H++};k.notifyWhenNoOutstandingRequests=function(a){0===H?a():u.push(a)};var p,
-K,A=l.href,v=b.find("base"),N=null,L=c.history?function(){try{return m.state}catch(a){}}:w;g();K=p;k.url=function(b,d,e){z(e)&&(e=null);l!==a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=K===e;if(A===b&&(!c.history||f))return k;var h=A&&Ga(A)===Ga(b);A=b;K=e;!c.history||h&&f?(h||(N=b),d?l.replace(b):h?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b,l.href!==b&&(N=b)):(m[d?"replaceState":"pushState"](e,"",b),g(),K=p);N&&(N=b);return k}return N||l.href.replace(/%27/g,
-"'")};k.state=function(){return p};var O=[],M=!1,J=null;k.onUrlChange=function(b){if(!M){if(c.history)F(a).on("popstate",e);F(a).on("hashchange",e);M=!0}O.push(b);return b};k.$$applicationDestroyed=function(){F(a).off("hashchange popstate",e)};k.$$checkUrlChange=h;k.baseHref=function(){var a=v.attr("href");return a?a.replace(/^(https?:)?\/\/[^/]*/,""):""};k.defer=function(a,b){var c;H++;c=n(function(){delete s[c];f(a)},b||0);s[c]=!0;return c};k.defer.cancel=function(a){return s[a]?(delete s[a],r(a),
-f(w),!0):!1}}function rf(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new mg(a,c,b,d)}]}function sf(){this.$get=function(){function a(a,c){function f(a){a!==n&&(r?r===a&&(r=a.n):r=a,e(a.n,a.p),e(a,n),n=a,n.n=null)}function e(a,b){a!==b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw G("$cacheFactory")("iid",a);var g=0,h=R({},c,{id:a}),k=V(),l=c&&c.capacity||Number.MAX_VALUE,m=V(),n=null,r=null;return b[a]={put:function(a,b){if(!z(b)){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]=
-{key:a});f(c)}a in k||g++;k[a]=b;g>l&&this.remove(r.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;f(b)}return k[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b===n&&(n=b.p);b===r&&(r=b.n);e(b.n,b.p);delete m[a]}a in k&&(delete k[a],g--)},removeAll:function(){k=V();g=0;m=V();n=r=null},destroy:function(){m=h=k=null;delete b[a]},info:function(){return R({},h,{size:g})}}}var b={};a.info=function(){var a={};q(b,function(b,f){a[f]=b.info()});return a};
-a.get=function(a){return b[a]};return a}}function Of(){this.$get=["$cacheFactory",function(a){return a("templates")}]}function Kc(a,b){function d(a,b,c){var d=/^\s*([@&<]|=(\*?))(\??)\s*([\w$]*)\s*$/,e=V();q(a,function(a,f){if(a in n)e[f]=n[a];else{var g=a.match(d);if(!g)throw fa("iscp",b,f,a,c?"controller bindings definition":"isolate scope definition");e[f]={mode:g[1][0],collection:"*"===g[2],optional:"?"===g[3],attrName:g[4]||f};g[4]&&(n[a]=e[f])}});return e}function c(a){var b=a.charAt(0);if(!b||
-b!==Q(b))throw fa("baddir",a);if(a!==a.trim())throw fa("baddir",a);}function f(a){var b=a.require||a.controller&&a.name;!I(b)&&E(b)&&q(b,function(a,c){var d=a.match(l);a.substring(d[0].length)||(b[c]=d[0]+c)});return b}var e={},g=/^\s*directive:\s*([\w-]+)\s+(.*)$/,h=/(([\w-]+)(?::([^;]+))?;?)/,k=oe("ngSrc,ngSrcset,src,srcset"),l=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,m=/^(on[a-z]+|formaction)$/,n=V();this.directive=function A(b,d){gb(b,"name");Ra(b,"directive");D(b)?(c(b),gb(d,"directiveFactory"),e.hasOwnProperty(b)||
-(e[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var d=[];q(e[b],function(e,g){try{var h=a.invoke(e);C(h)?h={compile:ha(h)}:!h.compile&&h.link&&(h.compile=ha(h.link));h.priority=h.priority||0;h.index=g;h.name=h.name||b;h.require=f(h);var k=h,l=h.restrict;if(l&&(!D(l)||!/[EACM]/.test(l)))throw fa("badrestrict",l,b);k.restrict=l||"EA";h.$$moduleName=e.$$moduleName;d.push(h)}catch(m){c(m)}});return d}])),e[b].push(d)):q(b,zc(A));return this};this.component=function(a,b){function c(a){function e(b){return C(b)||
-I(b)?function(c,d){return a.invoke(b,this,{$element:c,$attrs:d})}:b}var f=b.template||b.templateUrl?b.template:"",g={controller:d,controllerAs:ng(b.controller)||b.controllerAs||"$ctrl",template:e(f),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E",require:b.require};q(b,function(a,b){"$"===b.charAt(0)&&(g[b]=a)});return g}var d=b.controller||function(){};q(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a,C(d)&&(d[b]=a))});c.$inject=["$injector"];
-return this.directive(a,c)};this.aHrefSanitizationWhitelist=function(a){return x(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return x(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var r=!0;this.debugInfoEnabled=function(a){return x(a)?(r=a,this):r};var s=!0;this.preAssignBindingsEnabled=function(a){return x(a)?(s=a,this):s};var H=10;this.onChangesTtl=function(a){return arguments.length?(H=a,this):
-H};var u=!0;this.commentDirectivesEnabled=function(a){return arguments.length?(u=a,this):u};var p=!0;this.cssClassDirectivesEnabled=function(a){return arguments.length?(p=a,this):p};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(a,b,c,f,n,M,J,B,T,S){function P(){try{if(!--xa)throw da=void 0,fa("infchng",H);J.$apply(function(){for(var a=[],b=0,c=da.length;b<c;++b)try{da[b]()}catch(d){a.push(d)}da=
-void 0;if(a.length)throw a;})}finally{xa++}}function t(a,b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a}function qa(a,b,c){ta.innerHTML="<span "+b+">";b=ta.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function Ja(a,b){try{a.addClass(b)}catch(c){}}function ca(a,b,c,d,e){a instanceof F||(a=F(a));for(var f=/\S+/,g=0,h=a.length;g<h;g++){var k=a[g];k.nodeType===La&&k.nodeValue.match(f)&&
-Uc(k,a[g]=y.document.createElement("span"))}var l=Ma(a,b,a,c,d,e);ca.$$addScopeClass(a);var m=null;return function(b,c,d){gb(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var f=d.parentBoundTranscludeFn,g=d.transcludeControllers;d=d.futureParentElement;f&&f.$$boundTransclude&&(f=f.$$boundTransclude);m||(m=(d=d&&d[0])?"foreignobject"!==wa(d)&&ma.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==m?F(ha(m,F("<div>").append(a).html())):c?Pa.clone.call(a):a;if(g)for(var h in g)d.data("$"+
-h+"Controller",g[h].instance);ca.$$addScopeInfo(d,b);c&&c(d,b);l&&l(b,d,d,f);return d}}function Ma(a,b,c,d,e,f){function g(a,c,d,e){var f,k,l,m,n,s,A;if(p)for(A=Array(c.length),m=0;m<h.length;m+=3)f=h[m],A[f]=c[f];else A=c;m=0;for(n=h.length;m<n;)k=A[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),ca.$$addScopeInfo(F(k),l)):l=a,s=c.transcludeOnThisElement?G(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?G(a,b):null,c(f,l,k,d,s)):f&&f(a,k.childNodes,void 0,e)}for(var h=[],k,l,m,n,p,s=0;s<a.length;s++){k=
-new t;l=cc(a[s],[],k,0===s?d:void 0,e);(f=l.length?W(l,a[s],k,b,c,null,[],[],f):null)&&f.scope&&ca.$$addScopeClass(k.$$element);k=f&&f.terminal||!(m=a[s].childNodes)||!m.length?null:Ma(m,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||k)h.push(s,f,k),n=!0,p=p||f;f=null}return n?g:null}function G(a,b,c){function d(e,f,g,h,k){e||(e=a.$new(!1,k),e.$$transcluded=!0);return b(e,f,{parentBoundTranscludeFn:c,transcludeControllers:g,futureParentElement:h})}var e=d.$$slots=V(),
-f;for(f in b.$$slots)e[f]=b.$$slots[f]?G(a,b.$$slots[f],c):null;return d}function cc(a,b,c,d,e){var f=c.$attr,g;switch(a.nodeType){case 1:g=wa(a);U(b,Da(g),"E",d,e);for(var k,l,m,n,p=a.attributes,s=0,A=p&&p.length;s<A;s++){var r=!1,u=!1;k=p[s];l=k.name;m=Y(k.value);k=Da(l);(n=Ga.test(k))&&(l=l.replace(bd,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()}));(k=k.match(Ha))&&Z(k[1])&&(r=l,u=l.substr(0,l.length-5)+"end",l=l.substr(0,l.length-6));k=Da(l.toLowerCase());f[k]=l;if(n||!c.hasOwnProperty(k))c[k]=
-m,Zc(a,k)&&(c[k]=!0);pa(a,b,m,k,n);U(b,k,"A",d,e,r,u)}"input"===g&&"hidden"===a.getAttribute("type")&&a.setAttribute("autocomplete","off");if(!Fa)break;f=a.className;E(f)&&(f=f.animVal);if(D(f)&&""!==f)for(;a=h.exec(f);)k=Da(a[2]),U(b,k,"C",d,e)&&(c[k]=Y(a[3])),f=f.substr(a.index+a[0].length);break;case La:if(11===Ia)for(;a.parentNode&&a.nextSibling&&a.nextSibling.nodeType===La;)a.nodeValue+=a.nextSibling.nodeValue,a.parentNode.removeChild(a.nextSibling);ka(b,a.nodeValue);break;case 8:if(!Ea)break;
-Ta(a,b,c,d,e)}b.sort(ja);return b}function Ta(a,b,c,d,e){try{var f=g.exec(a.nodeValue);if(f){var h=Da(f[1]);U(b,h,"M",d,e)&&(c[h]=Y(f[2]))}}catch(k){}}function cd(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw fa("uterdir",b,c);1===a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return F(d)}function dd(a,b,c){return function(d,e,f,g,h){e=cd(e[0],b,c);return a(d,e,f,g,h)}}function dc(a,b,c,d,e,f){var g;return a?
-ca(b,c,d,e,f):function(){g||(g=ca(b,c,d,e,f),b=c=f=null);return g.apply(this,arguments)}}function W(a,b,d,e,f,g,h,k,l){function m(a,b,c,d){if(a){c&&(a=dd(a,c,d));a.require=v.require;a.directiveName=S;if(u===v||v.$$isolateScope)a=ra(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=dd(b,c,d));b.require=v.require;b.directiveName=S;if(u===v||v.$$isolateScope)b=ra(b,{isolateScope:!0});k.push(b)}}function n(a,e,f,g,l){function m(a,b,c,d){var e;ab(a)||(d=c,c=b,b=a,a=void 0);H&&(e=J);c||(c=H?P.parent():P);if(d){var f=
-l.$$slots[d];if(f)return f(a,b,e,c,qa);if(z(f))throw fa("noslot",d,ya(P));}else return l(a,b,e,c,qa)}var p,v,B,M,T,J,S,P;b===f?(g=d,P=d.$$element):(P=F(f),g=new t(P,d));T=e;u?M=e.$new(!0):A&&(T=e.$parent);l&&(S=m,S.$$boundTransclude=l,S.isSlotFilled=function(a){return!!l.$$slots[a]});r&&(J=ba(P,g,S,r,M,e,u));u&&(ca.$$addScopeInfo(P,M,!0,!(O&&(O===u||O===u.$$originalDirective))),ca.$$addScopeClass(P,!0),M.$$isolateBindings=u.$$isolateBindings,v=la(e,g,M,M.$$isolateBindings,u),v.removeWatches&&M.$on("$destroy",
-v.removeWatches));for(p in J){v=r[p];B=J[p];var L=v.$$bindings.bindToController;if(s){B.bindingInfo=L?la(T,g,B.instance,L,v):{};var ac=B();ac!==B.instance&&(B.instance=ac,P.data("$"+v.name+"Controller",ac),B.bindingInfo.removeWatches&&B.bindingInfo.removeWatches(),B.bindingInfo=la(T,g,B.instance,L,v))}else B.instance=B(),P.data("$"+v.name+"Controller",B.instance),B.bindingInfo=la(T,g,B.instance,L,v)}q(r,function(a,b){var c=a.require;a.bindToController&&!I(c)&&E(c)&&R(J[b].instance,X(b,c,P,J))});q(J,
-function(a){var b=a.instance;if(C(b.$onChanges))try{b.$onChanges(a.bindingInfo.initialChanges)}catch(d){c(d)}if(C(b.$onInit))try{b.$onInit()}catch(e){c(e)}C(b.$doCheck)&&(T.$watch(function(){b.$doCheck()}),b.$doCheck());C(b.$onDestroy)&&T.$on("$destroy",function(){b.$onDestroy()})});p=0;for(v=h.length;p<v;p++)B=h[p],sa(B,B.isolateScope?M:e,P,g,B.require&&X(B.directiveName,B.require,P,J),S);var qa=e;u&&(u.template||null===u.templateUrl)&&(qa=M);a&&a(qa,f.childNodes,void 0,l);for(p=k.length-1;0<=p;p--)B=
-k[p],sa(B,B.isolateScope?M:e,P,g,B.require&&X(B.directiveName,B.require,P,J),S);q(J,function(a){a=a.instance;C(a.$postLink)&&a.$postLink()})}l=l||{};for(var p=-Number.MAX_VALUE,A=l.newScopeDirective,r=l.controllerDirectives,u=l.newIsolateScopeDirective,O=l.templateDirective,M=l.nonTlbTranscludeDirective,T=!1,J=!1,H=l.hasElementTranscludeDirective,B=d.$$element=F(b),v,S,P,L=e,qa,x=!1,Ja=!1,w,y=0,D=a.length;y<D;y++){v=a[y];var Ta=v.$$start,Ma=v.$$end;Ta&&(B=cd(b,Ta,Ma));P=void 0;if(p>v.priority)break;
-if(w=v.scope)v.templateUrl||(E(w)?($("new/isolated scope",u||A,v,B),u=v):$("new/isolated scope",u,v,B)),A=A||v;S=v.name;if(!x&&(v.replace&&(v.templateUrl||v.template)||v.transclude&&!v.$$tlb)){for(w=y+1;x=a[w++];)if(x.transclude&&!x.$$tlb||x.replace&&(x.templateUrl||x.template)){Ja=!0;break}x=!0}!v.templateUrl&&v.controller&&(r=r||V(),$("'"+S+"' controller",r[S],v,B),r[S]=v);if(w=v.transclude)if(T=!0,v.$$tlb||($("transclusion",M,v,B),M=v),"element"===w)H=!0,p=v.priority,P=B,B=d.$$element=F(ca.$$createComment(S,
-d[S])),b=B[0],ga(f,va.call(P,0),b),P[0].$$parentNode=P[0].parentNode,L=dc(Ja,P,e,p,g&&g.name,{nonTlbTranscludeDirective:M});else{var G=V();P=F(Zb(b)).contents();if(E(w)){P=[];var Q=V(),bc=V();q(w,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Q[a]=b;G[b]=null;bc[b]=c});q(B.contents(),function(a){var b=Q[Da(wa(a))];b?(bc[b]=!0,G[b]=G[b]||[],G[b].push(a)):P.push(a)});q(bc,function(a,b){if(!a)throw fa("reqslot",b);});for(var U in G)G[U]&&(G[U]=dc(Ja,G[U],e))}B.empty();L=dc(Ja,P,e,void 0,
-void 0,{needsNewScope:v.$$isolateScope||v.$$newScope});L.$$slots=G}if(v.template)if(J=!0,$("template",O,v,B),O=v,w=C(v.template)?v.template(B,d):v.template,w=Ca(w),v.replace){g=v;P=Xb.test(w)?ed(ha(v.templateNamespace,Y(w))):[];b=P[0];if(1!==P.length||1!==b.nodeType)throw fa("tplrt",S,"");ga(f,B,b);D={$attr:{}};w=cc(b,[],D);var og=a.splice(y+1,a.length-(y+1));(u||A)&&aa(w,u,A);a=a.concat(w).concat(og);ea(d,D);D=a.length}else B.html(w);if(v.templateUrl)J=!0,$("template",O,v,B),O=v,v.replace&&(g=v),
-n=ia(a.splice(y,a.length-y),B,d,f,T&&L,h,k,{controllerDirectives:r,newScopeDirective:A!==v&&A,newIsolateScopeDirective:u,templateDirective:O,nonTlbTranscludeDirective:M}),D=a.length;else if(v.compile)try{qa=v.compile(B,d,L);var Z=v.$$originalDirective||v;C(qa)?m(null,db(Z,qa),Ta,Ma):qa&&m(db(Z,qa.pre),db(Z,qa.post),Ta,Ma)}catch(da){c(da,ya(B))}v.terminal&&(n.terminal=!0,p=Math.max(p,v.priority))}n.scope=A&&!0===A.scope;n.transcludeOnThisElement=T;n.templateOnThisElement=J;n.transclude=L;l.hasElementTranscludeDirective=
-H;return n}function X(a,b,c,d){var e;if(D(b)){var f=b.match(l);b=b.substring(f[0].length);var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw fa("ctreq",b,a);}else if(I(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=X(a,b[g],c,d);else E(b)&&(e={},q(b,function(b,f){e[f]=X(a,b,c,d)}));return e||null}function ba(a,b,c,d,e,f,g){var h=V(),k;for(k in d){var l=d[k],m={$scope:l===g||l.$$isolateScope?e:f,$element:a,
-$attrs:b,$transclude:c},n=l.controller;"@"===n&&(n=b[l.name]);m=M(n,m,!0,l.controllerAs);h[l.name]=m;a.data("$"+l.name+"Controller",m.instance)}return h}function aa(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Tb(a[d],{$$isolateScope:b,$$newScope:c})}function U(b,c,f,g,h,k,l){if(c===h)return null;var m=null;if(e.hasOwnProperty(c)){h=a.get(c+"Directive");for(var n=0,p=h.length;n<p;n++)if(c=h[n],(z(g)||g>c.priority)&&-1!==c.restrict.indexOf(f)){k&&(c=Tb(c,{$$start:k,$$end:l}));if(!c.$$bindings){var s=
-m=c,r=c.name,v={isolateScope:null,bindToController:null};E(s.scope)&&(!0===s.bindToController?(v.bindToController=d(s.scope,r,!0),v.isolateScope={}):v.isolateScope=d(s.scope,r,!1));E(s.bindToController)&&(v.bindToController=d(s.bindToController,r,!0));if(v.bindToController&&!s.controller)throw fa("noctrl",r);m=m.$$bindings=v;E(m.isolateScope)&&(c.$$isolateBindings=m.isolateScope)}b.push(c);m=c}}return m}function Z(b){if(e.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,f=c.length;d<f;d++)if(b=
-c[d],b.multiElement)return!0;return!1}function ea(a,b){var c=b.$attr,d=a.$attr;q(a,function(d,e){"$"!==e.charAt(0)&&(b[e]&&b[e]!==d&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))});q(b,function(b,e){a.hasOwnProperty(e)||"$"===e.charAt(0)||(a[e]=b,"class"!==e&&"style"!==e&&(d[e]=c[e]))})}function ia(a,b,c,d,e,g,h,k){var l=[],m,n,p=b[0],s=a.shift(),A=Tb(s,{templateUrl:null,transclude:null,replace:null,$$originalDirective:s}),r=C(s.templateUrl)?s.templateUrl(b,c):s.templateUrl,v=s.templateNamespace;
-b.empty();f(r).then(function(f){var u,B;f=Ca(f);if(s.replace){f=Xb.test(f)?ed(ha(v,Y(f))):[];u=f[0];if(1!==f.length||1!==u.nodeType)throw fa("tplrt",s.name,r);f={$attr:{}};ga(d,b,u);var O=cc(u,[],f);E(s.scope)&&aa(O,!0);a=O.concat(a);ea(c,f)}else u=p,b.html(f);a.unshift(A);m=W(a,u,c,e,b,s,g,h,k);q(d,function(a,c){a===u&&(d[c]=b[0])});for(n=Ma(b[0].childNodes,e);l.length;){f=l.shift();B=l.shift();var M=l.shift(),T=l.shift(),O=b[0];if(!f.$$destroyed){if(B!==p){var J=B.className;k.hasElementTranscludeDirective&&
-s.replace||(O=Zb(u));ga(M,F(B),O);Ja(F(O),J)}B=m.transcludeOnThisElement?G(f,m.transclude,T):T;m(n,f,O,d,B)}}l=null});return function(a,b,c,d,e){a=e;b.$$destroyed||(l?l.push(b,c,d,a):(m.transcludeOnThisElement&&(a=G(b,m.transclude,e)),m(n,b,c,d,a)))}}function ja(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 $(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw fa("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),
-a,ya(d));}function ka(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&ca.$$addBindingClass(a);return function(a,c){var e=c.parent();b||ca.$$addBindingClass(e);ca.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function ha(a,b){a=Q(a||"html");switch(a){case "svg":case "math":var c=y.document.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function oa(a,b){if("srcdoc"===
-b)return B.HTML;var c=wa(a);if("src"===b||"ngSrc"===b){if(-1===["img","video","audio","source","track"].indexOf(c))return B.RESOURCE_URL}else if("xlinkHref"===b||"form"===c&&"action"===b)return B.RESOURCE_URL}function pa(a,c,d,e,f){var g=oa(a,e),h=k[e]||f,l=b(d,!f,g,h);if(l){if("multiple"===e&&"select"===wa(a))throw fa("selmulti",ya(a));c.push({priority:100,compile:function(){return{pre:function(a,c,f){c=f.$$observers||(f.$$observers=V());if(m.test(e))throw fa("nodomevents");var k=f[e];k!==d&&(l=
-k&&b(k,!0,g,h),d=k);l&&(f[e]=l(a),(c[e]||(c[e]=[])).$$inter=!0,(f.$$observers&&f.$$observers[e].$$scope||a).$watch(l,function(a,b){"class"===e&&a!==b?f.$updateClass(a,b):f.$set(e,a)}))}}}})}}function ga(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]===d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&(a.context=c);break}f&&f.replaceChild(c,d);a=y.document.createDocumentFragment();for(g=0;g<e;g++)a.appendChild(b[g]);
-F.hasData(d)&&(F.data(c,F.data(d)),F(d).off("$destroy"));F.cleanData(a.querySelectorAll("*"));for(g=1;g<e;g++)delete b[g];b[0]=c;b.length=1}function ra(a,b){return R(function(){return a.apply(null,arguments)},a,b)}function sa(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,ya(d))}}function la(a,c,d,e,f){function g(b,c,e){!C(d.$onChanges)||c===e||c!==c&&e!==e||(da||(a.$$postDigest(P),da=[]),m||(m={},da.push(h)),m[b]&&(e=m[b].previousValue),m[b]=new Hb(e,c))}function h(){d.$onChanges(m);m=void 0}var k=[],
-l={},m;q(e,function(e,h){var m=e.attrName,p=e.optional,s,A,r,u;switch(e.mode){case "@":p||ua.call(c,m)||(d[h]=c[m]=void 0);p=c.$observe(m,function(a){if(D(a)||Ka(a))g(h,a,d[h]),d[h]=a});c.$$observers[m].$$scope=a;s=c[m];D(s)?d[h]=b(s)(a):Ka(s)&&(d[h]=s);l[h]=new Hb(ec,d[h]);k.push(p);break;case "=":if(!ua.call(c,m)){if(p)break;c[m]=void 0}if(p&&!c[m])break;A=n(c[m]);u=A.literal?na:function(a,b){return a===b||a!==a&&b!==b};r=A.assign||function(){s=d[h]=A(a);throw fa("nonassign",c[m],m,f.name);};s=
-d[h]=A(a);p=function(b){u(b,d[h])||(u(b,s)?r(a,b=d[h]):d[h]=b);return s=b};p.$stateful=!0;p=e.collection?a.$watchCollection(c[m],p):a.$watch(n(c[m],p),null,A.literal);k.push(p);break;case "<":if(!ua.call(c,m)){if(p)break;c[m]=void 0}if(p&&!c[m])break;A=n(c[m]);var B=A.literal,M=d[h]=A(a);l[h]=new Hb(ec,d[h]);p=a.$watch(A,function(a,b){if(b===a){if(b===M||B&&na(b,M))return;b=M}g(h,a,b);d[h]=a},B);k.push(p);break;case "&":A=c.hasOwnProperty(m)?n(c[m]):w;if(A===w&&p)break;d[h]=function(b){return A(a,
-b)}}});return{initialChanges:l,removeWatches:k.length&&function(){for(var a=0,b=k.length;a<b;++a)k[a]()}}}var za=/^\w/,ta=y.document.createElement("div"),Ea=u,Fa=p,xa=H,da;t.prototype={$normalize:Da,$addClass:function(a){a&&0<a.length&&T.addClass(this.$$element,a)},$removeClass:function(a){a&&0<a.length&&T.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=fd(a,b);c&&c.length&&T.addClass(this.$$element,c);(c=fd(b,a))&&c.length&&T.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=
-Zc(this.$$element[0],a),g=gd[a],h=a;f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=Hc(a,"-"));f=wa(this.$$element);if("a"===f&&("href"===a||"xlinkHref"===a)||"img"===f&&"src"===a)this[a]=b=S(b,"src"===a);else if("img"===f&&"srcset"===a&&x(b)){for(var f="",g=Y(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(g)?k:/(,)/,g=g.split(k),k=Math.floor(g.length/2),l=0;l<k;l++)var m=2*l,f=f+S(Y(g[m]),!0),f=f+(" "+Y(g[m+1]));g=Y(g[2*
-l]).split(/\s/);f+=S(Y(g[0]),!0);2===g.length&&(f+=" "+Y(g[1]));this[a]=b=f}!1!==d&&(null===b||z(b)?this.$$element.removeAttr(e):za.test(e)?this.$$element.attr(e,b):qa(this.$$element[0],e,b));(a=this.$$observers)&&q(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=V()),e=d[a]||(d[a]=[]);e.push(b);J.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||z(c[a])||b(c[a])});return function(){bb(e,b)}}};var Aa=b.startSymbol(),Ba=b.endSymbol(),
-Ca="{{"===Aa&&"}}"===Ba?$a:function(a){return a.replace(/\{\{/g,Aa).replace(/}}/g,Ba)},Ga=/^ngAttr[A-Z]/,Ha=/^(.+)Start$/;ca.$$addBindingInfo=r?function(a,b){var c=a.data("$binding")||[];I(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:w;ca.$$addBindingClass=r?function(a){Ja(a,"ng-binding")}:w;ca.$$addScopeInfo=r?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:w;ca.$$addScopeClass=r?function(a,b){Ja(a,b?"ng-isolate-scope":"ng-scope")}:w;ca.$$createComment=function(a,
-b){var c="";r&&(c=" "+(a||"")+": ",b&&(c+=b+" "));return y.document.createComment(c)};return ca}]}function Hb(a,b){this.previousValue=a;this.currentValue=b}function Da(a){return hb(a.replace(bd,""))}function fd(a,b){var d="",c=a.split(/\s+/),f=b.split(/\s+/),e=0;a:for(;e<c.length;e++){for(var g=c[e],h=0;h<f.length;h++)if(g===f[h])continue a;d+=(0<d.length?" ":"")+g}return d}function ed(a){a=F(a);var b=a.length;if(1>=b)return a;for(;b--;){var d=a[b];(8===d.nodeType||d.nodeType===La&&""===d.nodeValue.trim())&&
-pg.call(a,b,1)}return a}function ng(a,b){if(b&&D(b))return b;if(D(a)){var d=hd.exec(a);if(d)return d[3]}}function tf(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,c){Ra(b,"controller");E(b)?R(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function f(a,b,c,d){if(!a||!E(a.$scope))throw G("$controller")("noscp",d,b);a.$scope[b]=c}return function(e,g,h,k){var l,m,n;h=!0===h;k&&D(k)&&(n=k);if(D(e)){k=e.match(hd);
-if(!k)throw id("ctrlfmt",e);m=k[1];n=n||k[3];e=a.hasOwnProperty(m)?a[m]:Jc(g.$scope,m,!0)||(b?Jc(c,m,!0):void 0);if(!e)throw id("ctrlreg",m);Qa(e,m,!0)}if(h)return h=(I(e)?e[e.length-1]:e).prototype,l=Object.create(h||null),n&&f(g,n,l,m||e.name),R(function(){var a=d.invoke(e,l,g,m);a!==l&&(E(a)||C(a))&&(l=a,n&&f(g,n,l,m||e.name));return l},{instance:l,identifier:n});l=d.instantiate(e,g,m);n&&f(g,n,l,m||e.name);return l}}]}function uf(){this.$get=["$window",function(a){return F(a.document)}]}function vf(){this.$get=
-["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function fc(a){return E(a)?ja(a)?a.toISOString():eb(a):a}function Af(){this.$get=function(){return function(a){if(!a)return"";var b=[];yc(a,function(a,c){null===a||z(a)||(I(a)?q(a,function(a){b.push(oa(c)+"="+oa(fc(a)))}):b.push(oa(c)+"="+oa(fc(a))))});return b.join("&")}}}function Bf(){this.$get=function(){return function(a){function b(a,f,e){null===a||z(a)||(I(a)?q(a,function(a,c){b(a,f+"["+(E(a)?c:"")+"]")}):E(a)&&!ja(a)?yc(a,
-function(a,c){b(a,f+(e?"":"[")+c+(e?"":"]"))}):d.push(oa(f)+"="+oa(fc(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function gc(a,b){if(D(a)){var d=a.replace(qg,"").trim();if(d){var c=b("Content-Type");(c=c&&0===c.indexOf(jd))||(c=(c=d.match(rg))&&sg[c[0]].test(d));c&&(a=Cc(d))}}return a}function kd(a){var b=V(),d;D(a)?q(a.split("\n"),function(a){d=a.indexOf(":");var f=Q(Y(a.substr(0,d)));a=Y(a.substr(d+1));f&&(b[f]=b[f]?b[f]+", "+a:a)}):E(a)&&q(a,function(a,d){var e=Q(d),g=Y(a);e&&
-(b[e]=b[e]?b[e]+", "+g:g)});return b}function ld(a){var b;return function(d){b||(b=kd(a));return d?(d=b[Q(d)],void 0===d&&(d=null),d):b}}function md(a,b,d,c){if(C(c))return c(a,b,d);q(c,function(c){a=c(a,b,d)});return a}function zf(){var a=this.defaults={transformResponse:[gc],transformRequest:[function(a){return E(a)&&"[object File]"!==ma.call(a)&&"[object Blob]"!==ma.call(a)&&"[object FormData]"!==ma.call(a)?eb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ka(hc),put:ka(hc),
-patch:ka(hc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer"},b=!1;this.useApplyAsync=function(a){return x(a)?(b=!!a,this):b};var d=!0;this.useLegacyPromiseExtensions=function(a){return x(a)?(d=!!a,this):d};var c=this.interceptors=[];this.$get=["$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector",function(f,e,g,h,k,l){function m(b){function c(a,b){for(var d=0,e=b.length;d<e;){var f=b[d++],g=b[d++];a=a.then(f,g)}b.length=0;
-return a}function e(a,b){var c,d={};q(a,function(a,e){C(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}function f(a){var b=R({},a);b.data=md(a.data,a.headers,a.status,g.transformResponse);a=a.status;return 200<=a&&300>a?b:k.reject(b)}if(!E(b))throw G("$http")("badreq",b);if(!D(b.url))throw G("$http")("badreq",b.url);var g=R({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer},b);g.headers=function(b){var c=a.headers,d=R({},b.headers),
-f,g,h,c=R({},c.common,c[Q(b.method)]);a:for(f in c){g=Q(f);for(h in d)if(Q(h)===g)continue a;d[f]=c[f]}return e(d,ka(b))}(b);g.method=wb(g.method);g.paramSerializer=D(g.paramSerializer)?l.get(g.paramSerializer):g.paramSerializer;var h=[],m=[],s=k.when(g);q(H,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&m.push(a.response,a.responseError)});s=c(s,h);s=s.then(function(b){var c=b.headers,d=md(b.data,ld(c),void 0,b.transformRequest);z(d)&&
-q(c,function(a,b){"content-type"===Q(b)&&delete c[b]});z(b.withCredentials)&&!z(a.withCredentials)&&(b.withCredentials=a.withCredentials);return n(b,d).then(f,f)});s=c(s,m);d?(s.success=function(a){Qa(a,"fn");s.then(function(b){a(b.data,b.status,b.headers,g)});return s},s.error=function(a){Qa(a,"fn");s.then(null,function(b){a(b.data,b.status,b.headers,g)});return s}):(s.success=nd("success"),s.error=nd("error"));return s}function n(c,d){function g(a){if(a){var c={};q(a,function(a,d){c[d]=function(c){function d(){a(c)}
-b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function l(a,c,d,e){function f(){n(c,a,d,e)}J&&(200<=a&&300>a?J.put(S,[a,c,kd(d),e]):J.remove(S));b?h.$applyAsync(f):(f(),h.$$phase||h.$apply())}function n(a,b,d,e){b=-1<=b?b:0;(200<=b&&300>b?O.resolve:O.reject)({data:a,status:b,headers:ld(d),config:c,statusText:e})}function H(a){n(a.data,a.status,ka(a.headers()),a.statusText)}function L(){var a=m.pendingRequests.indexOf(c);-1!==a&&m.pendingRequests.splice(a,1)}var O=k.defer(),M=O.promise,
-J,B,T=c.headers,S=r(c.url,c.paramSerializer(c.params));m.pendingRequests.push(c);M.then(L,L);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(J=E(c.cache)?c.cache:E(a.cache)?a.cache:s);J&&(B=J.get(S),x(B)?B&&C(B.then)?B.then(H,H):I(B)?n(B[1],B[0],ka(B[2]),B[3]):n(B,200,{},"OK"):J.put(S,M));z(B)&&((B=od(c.url)?e()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(T[c.xsrfHeaderName||a.xsrfHeaderName]=B),f(c.method,S,d,l,T,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),
-g(c.uploadEventHandlers)));return M}function r(a,b){0<b.length&&(a+=(-1===a.indexOf("?")?"?":"&")+b);return a}var s=g("$http");a.paramSerializer=D(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var H=[];q(c,function(a){H.unshift(D(a)?l.get(a):l.invoke(a))});m.pendingRequests=[];(function(a){q(arguments,function(a){m[a]=function(b,c){return m(R({},c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){q(arguments,function(a){m[a]=function(b,c,d){return m(R({},d||{},
-{method:a,url:b,data:c}))}})})("post","put","patch");m.defaults=a;return m}]}function Df(){this.$get=function(){return function(){return new y.XMLHttpRequest}}}function Cf(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(a,b,d,c){return tg(a,c,a.defer,b,d[0])}]}function tg(a,b,d,c,f){function e(a,b,d){a=a.replace("JSON_CALLBACK",b);var e=f.createElement("script"),m=null;e.type="text/javascript";e.src=a;e.async=!0;m=function(a){e.removeEventListener("load",m,!1);e.removeEventListener("error",
-m,!1);f.body.removeChild(e);e=null;var g=-1,s="unknown";a&&("load"!==a.type||c.wasCalled(b)||(a={type:"error"}),s=a.type,g="error"===a.type?404:200);d&&d(g,s)};e.addEventListener("load",m,!1);e.addEventListener("error",m,!1);f.body.appendChild(e);return m}return function(f,h,k,l,m,n,r,s,H,u){function p(){v&&v();N&&N.abort()}function K(b,c,e,f,g){x(O)&&d.cancel(O);v=N=null;b(c,e,f,g);a.$$completeOutstandingRequest(w)}a.$$incOutstandingRequestCount();h=h||a.url();if("jsonp"===Q(f))var A=c.createCallback(h),
-v=e(h,A,function(a,b){var d=200===a&&c.getResponse(A);K(l,a,d,"",b);c.removeCallback(A)});else{var N=b(f,h);N.open(f,h,!0);q(m,function(a,b){x(a)&&N.setRequestHeader(b,a)});N.onload=function(){var a=N.statusText||"",b="response"in N?N.response:N.responseText,c=1223===N.status?204:N.status;0===c&&(c=b?200:"file"===ta(h).protocol?404:0);K(l,c,b,N.getAllResponseHeaders(),a)};f=function(){K(l,-1,null,null,"")};N.onerror=f;N.onabort=f;N.ontimeout=f;q(H,function(a,b){N.addEventListener(b,a)});q(u,function(a,
-b){N.upload.addEventListener(b,a)});r&&(N.withCredentials=!0);if(s)try{N.responseType=s}catch(L){if("json"!==s)throw L;}N.send(z(k)?null:k)}if(0<n)var O=d(p,n);else n&&C(n.then)&&n.then(p)}}function xf(){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(d,c,f){function e(a){return"\\\\\\"+a}function g(c){return c.replace(n,a).replace(r,b)}function h(a,b,c,d){var e=a.$watch(function(a){e();
-return d(a)},b,c);return e}function k(e,k,n,p){function r(a){try{var b=a;a=n?f.getTrusted(n,b):f.valueOf(b);var d;if(p&&!x(a))d=a;else if(null==a)d="";else{switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=eb(a)}d=a}return d}catch(g){c(Ha.interr(e,g))}}if(!e.length||-1===e.indexOf(a)){var A;k||(k=g(e),A=ha(k),A.exp=e,A.expressions=[],A.$$watchDelegate=h);return A}p=!!p;var v,q,L=0,O=[],M=[];A=e.length;for(var J=[],B=[];L<A;)if(-1!==(v=e.indexOf(a,L))&&-1!==(q=e.indexOf(b,v+
-l)))L!==v&&J.push(g(e.substring(L,v))),L=e.substring(v+l,q),O.push(L),M.push(d(L,r)),L=q+m,B.push(J.length),J.push("");else{L!==A&&J.push(g(e.substring(L)));break}n&&1<J.length&&Ha.throwNoconcat(e);if(!k||O.length){var T=function(a){for(var b=0,c=O.length;b<c;b++){if(p&&z(a[b]))return;J[B[b]]=a[b]}return J.join("")};return R(function(a){var b=0,d=O.length,f=Array(d);try{for(;b<d;b++)f[b]=M[b](a);return T(f)}catch(g){c(Ha.interr(e,g))}},{exp:e,expressions:O,$$watchDelegate:function(a,b){var c;return a.$watchGroup(M,
-function(d,e){var f=T(d);C(b)&&b.call(this,f,d!==e?c:f,a);c=f})}})}}var l=a.length,m=b.length,n=new RegExp(a.replace(/./g,e),"g"),r=new RegExp(b.replace(/./g,e),"g");k.startSymbol=function(){return a};k.endSymbol=function(){return b};return k}]}function yf(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(a,b,d,c,f){function e(e,k,l,m){function n(){r?e.apply(null,s):e(p)}var r=4<arguments.length,s=r?va.call(arguments,4):[],H=b.setInterval,u=b.clearInterval,p=0,K=x(m)&&!m,A=(K?c:d).defer(),
-v=A.promise;l=x(l)?l:0;v.$$intervalId=H(function(){K?f.defer(n):a.$evalAsync(n);A.notify(p++);0<l&&p>=l&&(A.resolve(p),u(v.$$intervalId),delete g[v.$$intervalId]);K||a.$apply()},k);g[v.$$intervalId]=A;return v}var g={};e.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0):!1};return e}]}function ic(a){a=a.split("/");for(var b=a.length;b--;)a[b]=tb(a[b]);return a.join("/")}function pd(a,b){var d=ta(a);b.$$protocol=
-d.protocol;b.$$host=d.hostname;b.$$port=Z(d.port)||ug[d.protocol]||null}function qd(a,b){if(vg.test(a))throw lb("badpath",a);var d="/"!==a.charAt(0);d&&(a="/"+a);var c=ta(a);b.$$path=decodeURIComponent(d&&"/"===c.pathname.charAt(0)?c.pathname.substring(1):c.pathname);b.$$search=Fc(c.search);b.$$hash=decodeURIComponent(c.hash);b.$$path&&"/"!==b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function ra(a,b){if(b.slice(0,a.length)===a)return b.substr(a.length)}function Ga(a){var b=a.indexOf("#");return-1===
-b?a:a.substr(0,b)}function mb(a){return a.replace(/(#.+)|#$/,"$1")}function jc(a,b,d){this.$$html5=!0;d=d||"";pd(a,this);this.$$parse=function(a){var d=ra(b,a);if(!D(d))throw lb("ipthprfx",a,b);qd(d,this);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Vb(this.$$search),d=this.$$hash?"#"+tb(this.$$hash):"";this.$$url=ic(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1)};this.$$parseLinkUrl=function(c,f){if(f&&"#"===f[0])return this.hash(f.slice(1)),
-!0;var e,g;x(e=ra(a,c))?(g=e,g=d&&x(e=ra(d,e))?b+(ra("/",e)||e):a+g):x(e=ra(b,c))?g=b+e:b===c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function kc(a,b,d){pd(a,this);this.$$parse=function(c){var f=ra(a,c)||ra(b,c),e;z(f)||"#"!==f.charAt(0)?this.$$html5?e=f:(e="",z(f)&&(a=c,this.replace())):(e=ra(d,f),z(e)&&(e=f));qd(e,this);c=this.$$path;var f=a,g=/^\/[A-Z]:(\/.*)/;e.slice(0,f.length)===f&&(e=e.replace(f,""));g.exec(e)||(c=(e=g.exec(c))?e[1]:c);this.$$path=c;this.$$compose()};this.$$compose=function(){var b=
-Vb(this.$$search),f=this.$$hash?"#"+tb(this.$$hash):"";this.$$url=ic(this.$$path)+(b?"?"+b:"")+f;this.$$absUrl=a+(this.$$url?d+this.$$url:"")};this.$$parseLinkUrl=function(b,d){return Ga(a)===Ga(b)?(this.$$parse(b),!0):!1}}function rd(a,b,d){this.$$html5=!0;kc.apply(this,arguments);this.$$parseLinkUrl=function(c,f){if(f&&"#"===f[0])return this.hash(f.slice(1)),!0;var e,g;a===Ga(c)?e=c:(g=ra(b,c))?e=a+d+g:b===c+"/"&&(e=b);e&&this.$$parse(e);return!!e};this.$$compose=function(){var b=Vb(this.$$search),
-f=this.$$hash?"#"+tb(this.$$hash):"";this.$$url=ic(this.$$path)+(b?"?"+b:"")+f;this.$$absUrl=a+d+this.$$url}}function Ib(a){return function(){return this[a]}}function sd(a,b){return function(d){if(z(d))return this[a];this[a]=b(d);this.$$compose();return this}}function Ff(){var a="",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return x(b)?(a=b,this):a};this.html5Mode=function(a){if(Ka(a))return b.enabled=a,this;if(E(a)){Ka(a.enabled)&&(b.enabled=a.enabled);Ka(a.requireBase)&&
-(b.requireBase=a.requireBase);if(Ka(a.rewriteLinks)||D(a.rewriteLinks))b.rewriteLinks=a.rewriteLinks;return this}return b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,f,e,g){function h(a,b,d){var e=l.url(),f=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(g){throw l.url(e),l.$$state=f,g;}}function k(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();var n=c.url(),r;if(b.enabled){if(!m&&b.requireBase)throw lb("nobase");
-r=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(m||"/");m=f.history?jc:rd}else r=Ga(n),m=kc;var s=r.substr(0,Ga(r).lastIndexOf("/")+1);l=new m(r,s,"#"+a);l.$$parseLinkUrl(n,n);l.$$state=c.state();var H=/^\s*(javascript|mailto):/i;e.on("click",function(a){var f=b.rewriteLinks;if(f&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!==a.which&&2!==a.button){for(var h=F(a.target);"a"!==wa(h[0]);)if(h[0]===e[0]||!(h=h.parent())[0])return;if(!D(f)||!z(h.attr(f))){var f=h.prop("href"),k=h.attr("href")||h.attr("xlink:href");
-E(f)&&"[object SVGAnimatedString]"===f.toString()&&(f=ta(f.animVal).href);H.test(f)||!f||h.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(f,k)||(a.preventDefault(),l.absUrl()!==c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=!0))}}});mb(l.absUrl())!==mb(n)&&c.url(l.absUrl(),!0);var u=!0;c.onUrlChange(function(a,b){z(ra(s,a))?g.location.href=a:(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,f;a=mb(a);l.$$parse(a);l.$$state=b;f=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;
-l.absUrl()===a&&(f?(l.$$parse(c),l.$$state=e,h(c,!1,e)):(u=!1,k(c,e)))}),d.$$phase||d.$digest())});d.$watch(function(){var a=mb(c.url()),b=mb(l.absUrl()),e=c.state(),g=l.$$replace,m=a!==b||l.$$html5&&f.history&&e!==l.$$state;if(u||m)u=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,e).defaultPrevented;l.absUrl()===b&&(c?(l.$$parse(a),l.$$state=e):(m&&h(b,g,e===l.$$state?null:l.$$state),k(a,e)))});l.$$replace=!1});return l}]}function Gf(){var a=!0,b=
-this;this.debugEnabled=function(b){return x(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){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));return a}function f(a){var b=d.console||{},f=b[a]||b.log||w;a=!1;try{a=!!f.apply}catch(k){}return a?function(){var a=[];q(arguments,function(b){a.push(c(b))});return f.apply(b,a)}:function(a,b){f(a,null==b?"":b)}}return{log:f("log"),
-info:f("info"),warn:f("warn"),error:f("error"),debug:function(){var c=f("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Ua(a,b){if("__defineGetter__"===a||"__defineSetter__"===a||"__lookupGetter__"===a||"__lookupSetter__"===a||"__proto__"===a)throw ea("isecfld",b);return a}function wg(a){return a+""}function Ea(a,b){if(a){if(a.constructor===a)throw ea("isecfn",b);if(a.window===a)throw ea("isecwindow",b);if(a.children&&(a.nodeName||a.prop&&a.attr&&a.find))throw ea("isecdom",b);if(a===
-Object)throw ea("isecobj",b);}return a}function td(a,b){if(a){if(a.constructor===a)throw ea("isecfn",b);if(a===xg||a===yg||a===zg)throw ea("isecff",b);}}function Jb(a,b){if(a&&(a===ud||a===vd||a===wd||a===xd||a===yd||a===zd||a===Ag||a===Bg||a===Kb||a===Cg||a===Ad||a===Dg))throw ea("isecaf",b);}function Eg(a,b){return"undefined"!==typeof a?a:b}function Bd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function X(a,b){var d,c,f;switch(a.type){case t.Program:d=!0;q(a.body,function(a){X(a.expression,
-b);d=d&&a.expression.constant});a.constant=d;break;case t.Literal:a.constant=!0;a.toWatch=[];break;case t.UnaryExpression:X(a.argument,b);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case t.BinaryExpression:X(a.left,b);X(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case t.LogicalExpression:X(a.left,b);X(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case t.ConditionalExpression:X(a.test,
-b);X(a.alternate,b);X(a.consequent,b);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case t.Identifier:a.constant=!1;a.toWatch=[a];break;case t.MemberExpression:X(a.object,b);a.computed&&X(a.property,b);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=[a];break;case t.CallExpression:d=f=a.filter?!b(a.callee.name).$stateful:!1;c=[];q(a.arguments,function(a){X(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});
-a.constant=d;a.toWatch=f?c:[a];break;case t.AssignmentExpression:X(a.left,b);X(a.right,b);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case t.ArrayExpression:d=!0;c=[];q(a.elements,function(a){X(a,b);d=d&&a.constant;a.constant||c.push.apply(c,a.toWatch)});a.constant=d;a.toWatch=c;break;case t.ObjectExpression:d=!0;c=[];q(a.properties,function(a){X(a.value,b);d=d&&a.value.constant&&!a.computed;a.value.constant||c.push.apply(c,a.value.toWatch)});a.constant=d;a.toWatch=c;break;case t.ThisExpression:a.constant=
-!1;a.toWatch=[];break;case t.LocalsExpression:a.constant=!1,a.toWatch=[]}}function Cd(a){if(1===a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function Dd(a){return a.type===t.Identifier||a.type===t.MemberExpression}function Ed(a){if(1===a.body.length&&Dd(a.body[0].expression))return{type:t.AssignmentExpression,left:a.body[0].expression,right:{type:t.NGValueParameter},operator:"="}}function Fd(a){return 0===a.body.length||1===a.body.length&&(a.body[0].expression.type===
-t.Literal||a.body[0].expression.type===t.ArrayExpression||a.body[0].expression.type===t.ObjectExpression)}function Gd(a,b){this.astBuilder=a;this.$filter=b}function Hd(a,b){this.astBuilder=a;this.$filter=b}function Lb(a){return"constructor"===a}function lc(a){return C(a.valueOf)?a.valueOf():Fg.call(a)}function Hf(){var a=V(),b=V(),d={"true":!0,"false":!1,"null":null,undefined:void 0},c,f;this.addLiteral=function(a,b){d[a]=b};this.setIdentifierFns=function(a,b){c=a;f=b;return this};this.$get=["$filter",
-function(e){function g(c,d,f){var g,k,H;f=f||K;switch(typeof c){case "string":H=c=c.trim();var q=f?b:a;g=q[H];if(!g){":"===c.charAt(0)&&":"===c.charAt(1)&&(k=!0,c=c.substring(2));g=f?p:u;var B=new mc(g);g=(new nc(B,e,g)).parse(c);g.constant?g.$$watchDelegate=r:k?g.$$watchDelegate=g.literal?n:m:g.inputs&&(g.$$watchDelegate=l);f&&(g=h(g));q[H]=g}return s(g,d);case "function":return s(c,d);default:return s(w,d)}}function h(a){function b(c,d,e,f){var g=K;K=!0;try{return a(c,d,e,f)}finally{K=g}}if(!a)return a;
-b.$$watchDelegate=a.$$watchDelegate;b.assign=h(a.assign);b.constant=a.constant;b.literal=a.literal;for(var c=0;a.inputs&&c<a.inputs.length;++c)a.inputs[c]=h(a.inputs[c]);b.inputs=a.inputs;return b}function k(a,b){return null==a||null==b?a===b:"object"===typeof a&&(a=lc(a),"object"===typeof a)?!1:a===b||a!==a&&b!==b}function l(a,b,c,d,e){var f=d.inputs,g;if(1===f.length){var h=k,f=f[0];return a.$watch(function(a){var b=f(a);k(b,h)||(g=d(a,void 0,void 0,[b]),h=b&&lc(b));return g},b,c,e)}for(var l=[],
-m=[],n=0,s=f.length;n<s;n++)l[n]=k,m[n]=null;return a.$watch(function(a){for(var b=!1,c=0,e=f.length;c<e;c++){var h=f[c](a);if(b||(b=!k(h,l[c])))m[c]=h,l[c]=h&&lc(h)}b&&(g=d(a,void 0,void 0,m));return g},b,c,e)}function m(a,b,c,d){var e,f;return e=a.$watch(function(a){return d(a)},function(a,c,d){f=a;C(b)&&b.apply(this,arguments);x(a)&&d.$$postDigest(function(){x(f)&&e()})},c)}function n(a,b,c,d){function e(a){var b=!0;q(a,function(a){x(a)||(b=!1)});return b}var f,g;return f=a.$watch(function(a){return d(a)},
-function(a,c,d){g=a;C(b)&&b.call(this,a,c,d);e(a)&&d.$$postDigest(function(){e(g)&&f()})},c)}function r(a,b,c,d){var e=a.$watch(function(a){e();return d(a)},b,c);return e}function s(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,c=c!==n&&c!==m?function(c,e,f,g){f=d&&g?g[0]:a(c,e,f,g);return b(f,c,e)}:function(c,d,e,f){e=a(c,d,e,f);c=b(e,c,d);return x(e)?c:e};a.$$watchDelegate&&a.$$watchDelegate!==l?c.$$watchDelegate=a.$$watchDelegate:b.$stateful||(c.$$watchDelegate=l,d=!a.inputs,c.inputs=a.inputs?
-a.inputs:[a]);return c}var H=da().noUnsafeEval,u={csp:H,expensiveChecks:!1,literals:sa(d),isIdentifierStart:C(c)&&c,isIdentifierContinue:C(f)&&f},p={csp:H,expensiveChecks:!0,literals:sa(d),isIdentifierStart:C(c)&&c,isIdentifierContinue:C(f)&&f},K=!1;g.$$runningExpensiveChecks=function(){return K};return g}]}function Jf(){this.$get=["$rootScope","$exceptionHandler",function(a,b){return Id(function(b){a.$evalAsync(b)},b)}]}function Kf(){this.$get=["$browser","$exceptionHandler",function(a,b){return Id(function(b){a.defer(b)},
-b)}]}function Id(a,b){function d(){var a=new g;a.resolve=f(a,a.resolve);a.reject=f(a,a.reject);a.notify=f(a,a.notify);return a}function c(){this.$$state={status:0}}function f(a,b){return function(c){b.call(a,c)}}function e(c){!c.processScheduled&&c.pending&&(c.processScheduled=!0,a(function(){var a,d,e;e=c.pending;c.processScheduled=!1;c.pending=void 0;for(var f=0,g=e.length;f<g;++f){d=e[f][0];a=e[f][c.status];try{C(a)?d.resolve(a(c.value)):1===c.status?d.resolve(c.value):d.reject(c.value)}catch(h){d.reject(h),
-b(h)}}}))}function g(){this.promise=new c}function h(a){var b=new g;b.reject(a);return b.promise}function k(a,b,c){var d=null;try{C(c)&&(d=c())}catch(e){return h(e)}return d&&C(d.then)?d.then(function(){return b(a)},h):b(a)}function l(a,b,c,d){var e=new g;e.resolve(a);return e.promise.then(b,c,d)}function m(a){if(!C(a))throw n("norslvr",a);var b=new g;a(function(a){b.resolve(a)},function(a){b.reject(a)});return b.promise}var n=G("$q",TypeError);R(c.prototype,{then:function(a,b,c){if(z(a)&&z(b)&&z(c))return this;
-var d=new g;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&e(this.$$state);return d.promise},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return k(b,r,a)},function(b){return k(b,h,a)},b)}});R(g.prototype,{resolve:function(a){this.promise.$$state.status||(a===this.promise?this.$$reject(n("qcycle",a)):this.$$resolve(a))},$$resolve:function(a){function c(a){k||(k=!0,h.$$resolve(a))}function d(a){k||
-(k=!0,h.$$reject(a))}var g,h=this,k=!1;try{if(E(a)||C(a))g=a&&a.then;C(g)?(this.promise.$$state.status=-1,g.call(a,c,d,f(this,this.notify))):(this.promise.$$state.value=a,this.promise.$$state.status=1,e(this.promise.$$state))}catch(l){d(l),b(l)}},reject:function(a){this.promise.$$state.status||this.$$reject(a)},$$reject:function(a){this.promise.$$state.value=a;this.promise.$$state.status=2;e(this.promise.$$state)},notify:function(c){var d=this.promise.$$state.pending;0>=this.promise.$$state.status&&
-d&&d.length&&a(function(){for(var a,e,f=0,g=d.length;f<g;f++){e=d[f][0];a=d[f][3];try{e.notify(C(a)?a(c):c)}catch(h){b(h)}}})}});var r=l;m.prototype=c.prototype;m.defer=d;m.reject=h;m.when=l;m.resolve=r;m.all=function(a){var b=new g,c=0,d=I(a)?[]:{};q(a,function(a,e){c++;l(a).then(function(a){d[e]=a;--c||b.resolve(d)},function(a){b.reject(a)})});0===c&&b.resolve(d);return b.promise};m.race=function(a){var b=d();q(a,function(a){l(a).then(b.resolve,b.reject)});return b.promise};return m}function Tf(){this.$get=
-["$window","$timeout",function(a,b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,f=!!d,e=f?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};e.supported=f;return e}]}function If(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=
-0;this.$id=++sb;this.$$ChildScope=null}b.prototype=a;return b}var b=10,d=G("$rootScope"),c=null,f=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$exceptionHandler","$parse","$browser",function(e,g,h){function k(a){a.currentScope.$$destroyed=!0}function l(a){9===Ia&&(a.$$childHead&&l(a.$$childHead),a.$$nextSibling&&l(a.$$nextSibling));a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=a.$$childTail=a.$root=a.$$watchers=null}function m(){this.$id=++sb;this.$$phase=
-this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$$isolateBindings=null}function n(a){if(K.$$phase)throw d("inprog",K.$$phase);K.$$phase=a}function r(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function s(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function H(){}function u(){for(;t.length;)try{t.shift()()}catch(a){e(a)}f=
-null}function p(){null===f&&(f=h.defer(function(){K.$apply(u)}))}m.prototype={constructor:m,$new:function(b,c){var d;c=c||this;b?(d=new m,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope);d.$parent=c;d.$$prevSibling=c.$$childTail;c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):c.$$childHead=c.$$childTail=d;(b||c!==this)&&d.$on("$destroy",k);return d},$watch:function(a,b,d,e){var f=g(a);if(f.$$watchDelegate)return f.$$watchDelegate(this,b,d,
-f,a);var h=this,k=h.$$watchers,l={fn:b,last:H,get:f,exp:e||a,eq:!!d};c=null;C(b)||(l.fn=w);k||(k=h.$$watchers=[],k.$$digestWatchIndex=-1);k.unshift(l);k.$$digestWatchIndex++;r(this,1);return function(){var a=bb(k,l);0<=a&&(r(h,-1),a<k.$$digestWatchIndex&&k.$$digestWatchIndex--);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,g)):b(e,d,g)}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=
-!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});q(a,function(a,b){var k=g.$watch(a,function(a,f){e[b]=a;d[b]=f;h||(h=!0,g.$evalAsync(c))});f.push(k)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(!z(e)){if(E(e))if(la(e))for(f!==n&&(f=n,s=f.length=0,l++),a=e.length,s!==a&&(l++,f.length=s=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(l++,f[b]=g);else{f!==r&&(f=r={},s=0,l++);a=0;for(b in e)ua.call(e,
-b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(s++,f[b]=g,l++));if(s>a)for(b in l++,f)ua.call(e,b)||(s--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,m=g(a,c),n=[],r={},p=!0,s=0;return this.$watch(m,function(){p?(p=!1,b(e,e,d)):b(e,h,d);if(k)if(E(e))if(la(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)ua.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var a,g,k,l,m,r,p,s=b,q,t=[],N,x;n("$digest");
-h.$$checkUrlChange();this===K&&null!==f&&(h.defer.cancel(f),u());c=null;do{p=!1;q=this;for(r=0;r<A.length;r++){try{x=A[r],x.scope.$eval(x.expression,x.locals)}catch(z){e(z)}c=null}A.length=0;a:do{if(r=q.$$watchers)for(r.$$digestWatchIndex=r.length;r.$$digestWatchIndex--;)try{if(a=r[r.$$digestWatchIndex])if(m=a.get,(g=m(q))!==(k=a.last)&&!(a.eq?na(g,k):ia(g)&&ia(k)))p=!0,c=a,a.last=a.eq?sa(g,null):g,l=a.fn,l(g,k===H?g:k,q),5>s&&(N=4-s,t[N]||(t[N]=[]),t[N].push({msg:C(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):
-a.exp,newVal:g,oldVal:k}));else if(a===c){p=!1;break a}}catch(w){e(w)}if(!(r=q.$$watchersCount&&q.$$childHead||q!==this&&q.$$nextSibling))for(;q!==this&&!(r=q.$$nextSibling);)q=q.$parent}while(q=r);if((p||A.length)&&!s--)throw K.$$phase=null,d("infdig",b,t);}while(p||A.length);for(K.$$phase=null;L<v.length;)try{v[L++]()}catch(y){e(y)}v.length=L=0},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===K&&h.$$applicationDestroyed();r(this,
--this.$$watchersCount);for(var b in this.$$listenerCount)s(this,this.$$listenerCount[b],b);a&&a.$$childHead===this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail===this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=w;this.$on=this.$watch=this.$watchGroup=function(){return w};this.$$listeners=
-{};this.$$nextSibling=null;l(this)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){K.$$phase||A.length||h.defer(function(){A.length&&K.$digest()});A.push({scope:this,expression:g(a),locals:b})},$$postDigest:function(a){v.push(a)},$apply:function(a){try{n("$apply");try{return this.$eval(a)}finally{K.$$phase=null}}catch(b){e(b)}finally{try{K.$digest()}catch(c){throw e(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&t.push(b);a=g(a);p()},$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(){var d=c.indexOf(b);-1!==d&&(c[d]=null,s(e,1,a))}},$emit:function(a,b){var c=[],d,f=this,g=!1,h={name:a,targetScope:f,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=cb([h],arguments,1),l,m;do{d=f.$$listeners[a]||c;h.currentScope=f;l=0;for(m=d.length;l<
-m;l++)if(d[l])try{d[l].apply(null,k)}catch(n){e(n)}else d.splice(l,1),l--,m--;if(g)return h.currentScope=null,h;f=f.$parent}while(f);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,f={name:a,targetScope:this,preventDefault:function(){f.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return f;for(var g=cb([f],arguments,1),h,k;c=d;){f.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){e(l)}else d.splice(h,
-1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}f.currentScope=null;return f}};var K=new m,A=K.$$asyncQueue=[],v=K.$$postDigestQueue=[],t=K.$$applyAsyncQueue=[],L=0;return K}]}function Be(){var a=/^\s*(https?|ftp|mailto|tel|file):/,b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return x(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return x(a)?(b=a,this):b};
-this.$get=function(){return function(d,c){var f=c?b:a,e;e=ta(d).href;return""===e||e.match(f)?d:"unsafe:"+e}}}function Gg(a){if("self"===a)return a;if(D(a)){if(-1<a.indexOf("***"))throw Fa("iwcard",a);a=Jd(a).replace(/\\\*\\\*/g,".*").replace(/\\\*/g,"[^:/.?&;]*");return new RegExp("^"+a+"$")}if(Za(a))return new RegExp("^"+a.source+"$");throw Fa("imatcher");}function Kd(a){var b=[];x(a)&&q(a,function(a){b.push(Gg(a))});return b}function Mf(){this.SCE_CONTEXTS=ga;var a=["self"],b=[];this.resourceUrlWhitelist=
-function(b){arguments.length&&(a=Kd(b));return a};this.resourceUrlBlacklist=function(a){arguments.length&&(b=Kd(a));return b};this.$get=["$injector",function(d){function c(a,b){return"self"===a?od(b):!!a.exec(b.href)}function f(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var e=function(a){throw Fa("unsafe");
-};d.has("$sanitize")&&(e=d.get("$sanitize"));var g=f(),h={};h[ga.HTML]=f(g);h[ga.CSS]=f(g);h[ga.URL]=f(g);h[ga.JS]=f(g);h[ga.RESOURCE_URL]=f(h[ga.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw Fa("icontext",a,b);if(null===b||z(b)||""===b)return b;if("string"!==typeof b)throw Fa("itype",a);return new c(b)},getTrusted:function(d,f){if(null===f||z(f)||""===f)return f;var g=h.hasOwnProperty(d)?h[d]:null;if(g&&f instanceof g)return f.$$unwrapTrustedValue();if(d===ga.RESOURCE_URL){var g=
-ta(f.toString()),n,r,s=!1;n=0;for(r=a.length;n<r;n++)if(c(a[n],g)){s=!0;break}if(s)for(n=0,r=b.length;n<r;n++)if(c(b[n],g)){s=!1;break}if(s)return f;throw Fa("insecurl",f.toString());}if(d===ga.HTML)return e(f);throw Fa("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function Lf(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=["$parse","$sceDelegate",function(b,d){if(a&&8>Ia)throw Fa("iequirks");var c=ka(ga);c.isEnabled=function(){return a};
-c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=$a);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var f=c.parseAs,e=c.getTrusted,g=c.trustAs;q(ga,function(a,b){var d=Q(b);c[hb("parse_as_"+d)]=function(b){return f(a,b)};c[hb("get_trusted_"+d)]=function(b){return e(a,b)};c[hb("trust_as_"+d)]=function(b){return g(a,b)}});return c}]}function Nf(){this.$get=["$window",
-"$document",function(a,b){var d={},c=!(a.chrome&&(a.chrome.app&&a.chrome.app.runtime||!a.chrome.app&&a.chrome.runtime&&a.chrome.runtime.id))&&a.history&&a.history.pushState,f=Z((/android (\d+)/.exec(Q((a.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},h,k=/^(Moz|webkit|ms)(?=[A-Z])/,l=g.body&&g.body.style,m=!1,n=!1;if(l){for(var r in l)if(m=k.exec(r)){h=m[0];h=h[0].toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in l&&"webkit");m=!!("transition"in l||
-h+"Transition"in l);n=!!("animation"in l||h+"Animation"in l);!f||m&&n||(m=D(l.webkitTransition),n=D(l.webkitAnimation))}return{history:!(!c||4>f||e),hasEvent:function(a){if("input"===a&&11>=Ia)return!1;if(z(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:da(),vendorPrefix:h,transitions:m,animations:n,android:f}}]}function Pf(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$templateCache","$http","$q","$sce",function(b,d,c,f){function e(g,h){e.totalPendingRequests++;
-if(!D(g)||z(b.get(g)))g=f.getTrustedResourceUrl(g);var k=d.defaults&&d.defaults.transformResponse;I(k)?k=k.filter(function(a){return a!==gc}):k===gc&&(k=null);return d.get(g,R({cache:b,transformResponse:k},a))["finally"](function(){e.totalPendingRequests--}).then(function(a){b.put(g,a.data);return a.data},function(a){if(!h)throw Hg("tpload",g,a.status,a.statusText);return c.reject(a)})}e.totalPendingRequests=0;return e}]}function Qf(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,
-b,d){a=a.getElementsByClassName("ng-binding");var g=[];q(a,function(a){var c=$.element(a).data("$binding");c&&q(c,function(c){d?(new RegExp("(^|\\s)"+Jd(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!==c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],h=0;h<g.length;++h){var k=a.querySelectorAll("["+g[h]+"model"+(d?"=":"*=")+'"'+b+'"]');if(k.length)return k}},getLocation:function(){return d.url()},setLocation:function(b){b!==d.url()&&(d.url(b),a.$digest())},
-whenStable:function(a){b.notifyWhenNoOutstandingRequests(a)}}}]}function Rf(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(a,b,d,c,f){function e(e,k,l){C(e)||(l=k,k=e,e=w);var m=va.call(arguments,3),n=x(l)&&!l,r=(n?c:d).defer(),s=r.promise,q;q=b.defer(function(){try{r.resolve(e.apply(null,m))}catch(b){r.reject(b),f(b)}finally{delete g[s.$$timeoutId]}n||a.$apply()},k);s.$$timeoutId=q;g[q]=r;return s}var g={};e.cancel=function(a){return a&&a.$$timeoutId in g?(g[a.$$timeoutId].reject("canceled"),
-delete g[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):!1};return e}]}function ta(a){Ia&&(aa.setAttribute("href",a),a=aa.href);aa.setAttribute("href",a);return{href:aa.href,protocol:aa.protocol?aa.protocol.replace(/:$/,""):"",host:aa.host,search:aa.search?aa.search.replace(/^\?/,""):"",hash:aa.hash?aa.hash.replace(/^#/,""):"",hostname:aa.hostname,port:aa.port,pathname:"/"===aa.pathname.charAt(0)?aa.pathname:"/"+aa.pathname}}function od(a){a=D(a)?ta(a):a;return a.protocol===Ld.protocol&&a.host===Ld.host}
-function Sf(){this.$get=ha(y)}function Md(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}var d=a[0]||{},c={},f="";return function(){var a,g,h,k,l;try{a=d.cookie||""}catch(m){a=""}if(a!==f)for(f=a,a=f.split("; "),c={},h=0;h<a.length;h++)g=a[h],k=g.indexOf("="),0<k&&(l=b(g.substring(0,k)),z(c[l])&&(c[l]=b(g.substring(k+1))));return c}}function Wf(){this.$get=Md}function Rc(a){function b(d,c){if(E(d)){var f={};q(d,function(a,c){f[c]=b(c,a)});return f}return a.factory(d+"Filter",
-c)}this.register=b;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];b("currency",Nd);b("date",Od);b("filter",Ig);b("json",Jg);b("limitTo",Kg);b("lowercase",Lg);b("number",Pd);b("orderBy",Qd);b("uppercase",Mg)}function Ig(){return function(a,b,d,c){if(!la(a)){if(null==a)return a;throw G("filter")("notarray",a);}c=c||"$";var f;switch(oc(b)){case "function":break;case "boolean":case "null":case "number":case "string":f=!0;case "object":b=Ng(b,d,c,f);break;default:return a}return Array.prototype.filter.call(a,
-b)}}function Ng(a,b,d,c){var f=E(a)&&d in a;!0===b?b=na:C(b)||(b=function(a,b){if(z(a))return!1;if(null===a||null===b)return a===b;if(E(b)||E(a)&&!Ac(a))return!1;a=Q(""+a);b=Q(""+b);return-1!==a.indexOf(b)});return function(e){return f&&!E(e)?Na(e,a[d],b,d,!1):Na(e,a,b,d,c)}}function Na(a,b,d,c,f,e){var g=oc(a),h=oc(b);if("string"===h&&"!"===b.charAt(0))return!Na(a,b.substring(1),d,c,f);if(I(a))return a.some(function(a){return Na(a,b,d,c,f)});switch(g){case "object":var k;if(f){for(k in a)if("$"!==
-k.charAt(0)&&Na(a[k],b,d,c,!0))return!0;return e?!1:Na(a,b,d,c,!1)}if("object"===h){for(k in b)if(e=b[k],!C(e)&&!z(e)&&(g=k===c,!Na(g?a:a[k],e,d,c,g,g)))return!1;return!0}return d(a,b);case "function":return!1;default:return d(a,b)}}function oc(a){return null===a?"null":typeof a}function Nd(a){var b=a.NUMBER_FORMATS;return function(a,c,f){z(c)&&(c=b.CURRENCY_SYM);z(f)&&(f=b.PATTERNS[1].maxFrac);return null==a?a:Rd(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,f).replace(/\u00A4/g,c)}}function Pd(a){var b=
-a.NUMBER_FORMATS;return function(a,c){return null==a?a:Rd(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function Og(a){var b=0,d,c,f,e,g;-1<(c=a.indexOf(Sd))&&(a=a.replace(Sd,""));0<(f=a.search(/e/i))?(0>c&&(c=f),c+=+a.slice(f+1),a=a.substring(0,f)):0>c&&(c=a.length);for(f=0;a.charAt(f)===pc;f++);if(f===(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)===pc;)g--;c-=f;d=[];for(e=0;f<=g;f++,e++)d[e]=+a.charAt(f)}c>Td&&(d=d.splice(0,Td-1),b=c-1,c=1);return{d:d,e:b,i:c}}function Pg(a,b,d,c){var f=a.d,e=
-f.length-a.i;b=z(b)?Math.min(Math.max(d,e),c):+b;d=b+a.i;c=f[d];if(0<d){f.splice(Math.max(a.i,d));for(var g=d;g<f.length;g++)f[g]=0}else for(e=Math.max(0,e),a.i=1,f.length=Math.max(1,d=b+1),f[0]=0,g=1;g<d;g++)f[g]=0;if(5<=c)if(0>d-1){for(c=0;c>d;c--)f.unshift(0),a.i++;f.unshift(1);a.i++}else f[d-1]++;for(;e<Math.max(0,b);e++)f.push(0);if(b=f.reduceRight(function(a,b,c,d){b+=a;d[c]=b%10;return Math.floor(b/10)},0))f.unshift(b),a.i++}function Rd(a,b,d,c,f){if(!D(a)&&!ba(a)||isNaN(a))return"";var e=
-!isFinite(a),g=!1,h=Math.abs(a)+"",k="";if(e)k="\u221e";else{g=Og(h);Pg(g,f,b.minFrac,b.maxFrac);k=g.d;h=g.i;f=g.e;e=[];for(g=k.reduce(function(a,b){return a&&!b},!0);0>h;)k.unshift(0),h++;0<h?e=k.splice(h,k.length):(e=k,k=[0]);h=[];for(k.length>=b.lgSize&&h.unshift(k.splice(-b.lgSize,k.length).join(""));k.length>b.gSize;)h.unshift(k.splice(-b.gSize,k.length).join(""));k.length&&h.unshift(k.join(""));k=h.join(d);e.length&&(k+=c+e.join(""));f&&(k+="e+"+f)}return 0>a&&!g?b.negPre+k+b.negSuf:b.posPre+
-k+b.posSuf}function Mb(a,b,d,c){var f="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,f="-");for(a=""+a;a.length<b;)a=pc+a;d&&(a=a.substr(a.length-b));return f+a}function U(a,b,d,c,f){d=d||0;return function(e){e=e["get"+a]();if(0<d||e>-d)e+=d;0===e&&-12===d&&(e=12);return Mb(e,b,c,f)}}function nb(a,b,d){return function(c,f){var e=c["get"+a](),g=wb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return f[g][e]}}function Ud(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Vd(a){return function(b){var d=
-Ud(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Mb(b,a)}}function qc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Od(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var e=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,k=b[8]?a.setUTCHours:a.setHours;b[9]&&(e=Z(b[9]+b[10]),g=Z(b[9]+b[11]));h.call(a,Z(b[1]),Z(b[2])-1,Z(b[3]));e=Z(b[4]||0)-e;g=Z(b[5]||0)-g;h=Z(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||
-0)));k.call(a,e,g,h,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,e){var g="",h=[],k,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;D(c)&&(c=Qg.test(c)?Z(c):b(c));ba(c)&&(c=new Date(c));if(!ja(c)||!isFinite(c.getTime()))return c;for(;d;)(l=Rg.exec(d))?(h=cb(h,l,1),d=h.pop()):(h.push(d),d=null);var m=c.getTimezoneOffset();e&&(m=Dc(e,m),c=Ub(c,e,!0));q(h,function(b){k=Sg[b];g+=k?k(c,a.DATETIME_FORMATS,m):
-"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Jg(){return function(a,b){z(b)&&(b=2);return eb(a,b)}}function Kg(){return function(a,b,d){b=Infinity===Math.abs(Number(b))?Number(b):Z(b);if(ia(b))return a;ba(a)&&(a=a.toString());if(!la(a))return a;d=!d||isNaN(d)?0:Z(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?rc(a,d,d+b):0===d?rc(a,b,a.length):rc(a,Math.max(0,d+b),d)}}function rc(a,b,d){return D(a)?a.slice(b,d):va.call(a,b,d)}function Qd(a){function b(b){return b.map(function(b){var c=
-1,d=$a;if(C(b))d=b;else if(D(b)){if("+"===b.charAt(0)||"-"===b.charAt(0))c="-"===b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var f=d(),d=function(a){return a[f]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,k=b.type;if(d===k){var k=a.value,l=b.value;"string"===d?(k=k.toLowerCase(),l=l.toLowerCase()):"object"===d&&(E(k)&&(k=a.index),E(l)&&(l=b.index));k!==l&&(c=
-k<l?-1:1)}else c=d<k?-1:1;return c}return function(a,e,g,h){if(null==a)return a;if(!la(a))throw G("orderBy")("notarray",a);I(e)||(e=[e]);0===e.length&&(e=["+"]);var k=b(e),l=g?-1:1,m=C(h)?h:c;a=Array.prototype.map.call(a,function(a,b){return{value:a,tieBreaker:{value:b,type:"number",index:b},predicateValues:k.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("object"===c)a:{if(C(e.valueOf)&&(e=e.valueOf(),d(e)))break a;Ac(e)&&(e=e.toString(),d(e))}return{value:e,type:c,
-index:b}})}});a.sort(function(a,b){for(var c=0,d=k.length;c<d;c++){var e=m(a.predicateValues[c],b.predicateValues[c]);if(e)return e*k[c].descending*l}return m(a.tieBreaker,b.tieBreaker)*l});return a=a.map(function(a){return a.value})}}function Va(a){C(a)&&(a={link:a});a.restrict=a.restrict||"AC";return ha(a)}function Wd(a,b,d,c,f){var e=this,g=[];e.$error={};e.$$success={};e.$pending=void 0;e.$name=f(b.name||b.ngForm||"")(d);e.$dirty=!1;e.$pristine=!0;e.$valid=!0;e.$invalid=!1;e.$submitted=!1;e.$$parentForm=
-Nb;e.$rollbackViewValue=function(){q(g,function(a){a.$rollbackViewValue()})};e.$commitViewValue=function(){q(g,function(a){a.$commitViewValue()})};e.$addControl=function(a){Ra(a.$name,"input");g.push(a);a.$name&&(e[a.$name]=a);a.$$parentForm=e};e.$$renameControl=function(a,b){var c=a.$name;e[c]===a&&delete e[c];e[b]=a;a.$name=b};e.$removeControl=function(a){a.$name&&e[a.$name]===a&&delete e[a.$name];q(e.$pending,function(b,c){e.$setValidity(c,null,a)});q(e.$error,function(b,c){e.$setValidity(c,null,
-a)});q(e.$$success,function(b,c){e.$setValidity(c,null,a)});bb(g,a);a.$$parentForm=Nb};Xd({ctrl:this,$element:a,set:function(a,b,c){var d=a[b];d?-1===d.indexOf(c)&&d.push(c):a[b]=[c]},unset:function(a,b,c){var d=a[b];d&&(bb(d,c),0===d.length&&delete a[b])},$animate:c});e.$setDirty=function(){c.removeClass(a,Wa);c.addClass(a,Ob);e.$dirty=!0;e.$pristine=!1;e.$$parentForm.$setDirty()};e.$setPristine=function(){c.setClass(a,Wa,Ob+" ng-submitted");e.$dirty=!1;e.$pristine=!0;e.$submitted=!1;q(g,function(a){a.$setPristine()})};
-e.$setUntouched=function(){q(g,function(a){a.$setUntouched()})};e.$setSubmitted=function(){c.addClass(a,"ng-submitted");e.$submitted=!0;e.$$parentForm.$setSubmitted()}}function sc(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function Xa(a,b,d,c,f,e){var g=Q(b[0].type);if(!f.android){var h=!1;b.on("compositionstart",function(){h=!0});b.on("compositionend",function(){h=!1;l()})}var k,l=function(a){k&&(e.defer.cancel(k),k=null);if(!h){var f=b.val();a=a&&a.type;"password"===
-g||d.ngTrim&&"false"===d.ngTrim||(f=Y(f));(c.$viewValue!==f||""===f&&c.$$hasNativeValidators)&&c.$setViewValue(f,a)}};if(f.hasEvent("input"))b.on("input",l);else{var m=function(a,b,c){k||(k=e.defer(function(){k=null;b&&b.value===c||l(a)}))};b.on("keydown",function(a){var b=a.keyCode;91===b||15<b&&19>b||37<=b&&40>=b||m(a,this,this.value)});if(f.hasEvent("paste"))b.on("paste cut",m)}b.on("change",l);if(Yd[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!k){var b=
-this.validity,c=b.badInput,d=b.typeMismatch;k=e.defer(function(){k=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Pb(a,b){return function(d,c){var f,e;if(ja(d))return d;if(D(d)){'"'===d.charAt(0)&&'"'===d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(Tg.test(d))return new Date(d);a.lastIndex=0;if(f=a.exec(d))return f.shift(),e=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),
-mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},q(f,function(a,c){c<b.length&&(e[b[c]]=+a)}),new Date(e.yyyy,e.MM-1,e.dd,e.HH,e.mm,e.ss||0,1E3*e.sss||0)}return NaN}}function ob(a,b,d,c){return function(f,e,g,h,k,l,m){function n(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function r(a){return x(a)&&!ja(a)?d(a)||void 0:a}tc(f,e,g,h);Xa(f,e,g,h,k,l);var s=h&&h.$options&&h.$options.timezone,q;h.$$parserName=a;h.$parsers.push(function(a){if(h.$isEmpty(a))return null;
-if(b.test(a))return a=d(a,q),s&&(a=Ub(a,s)),a});h.$formatters.push(function(a){if(a&&!ja(a))throw pb("datefmt",a);if(n(a))return(q=a)&&s&&(q=Ub(q,s,!0)),m("date")(a,c,s);q=null;return""});if(x(g.min)||g.ngMin){var u;h.$validators.min=function(a){return!n(a)||z(u)||d(a)>=u};g.$observe("min",function(a){u=r(a);h.$validate()})}if(x(g.max)||g.ngMax){var p;h.$validators.max=function(a){return!n(a)||z(p)||d(a)<=p};g.$observe("max",function(a){p=r(a);h.$validate()})}}}function tc(a,b,d,c){(c.$$hasNativeValidators=
-E(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};return c.badInput||c.typeMismatch?void 0:a})}function Zd(a){a.$$parserName="number";a.$parsers.push(function(b){if(a.$isEmpty(b))return null;if(Ug.test(b))return parseFloat(b)});a.$formatters.push(function(b){if(!a.$isEmpty(b)){if(!ba(b))throw pb("numfmt",b);b=b.toString()}return b})}function qb(a){x(a)&&!ba(a)&&(a=parseFloat(a));return ia(a)?void 0:a}function uc(a){var b=a.toString(),d=b.indexOf(".");return-1===d?-1<a&&1>
-a&&(a=/e-(\d+)$/.exec(b))?Number(a[1]):0:b.length-d-1}function $d(a,b,d,c,f){if(x(c)){a=a(c);if(!a.constant)throw pb("constexpr",d,c);return a(b)}return f}function vc(a,b){a="ngClass"+a;return["$animate",function(d){function c(a,b){var c=[],d=0;a:for(;d<a.length;d++){for(var f=a[d],m=0;m<b.length;m++)if(f===b[m])continue a;c.push(f)}return c}function f(a){var b=[];return I(a)?(q(a,function(a){b=b.concat(f(a))}),b):D(a)?a.split(" "):E(a)?(q(a,function(a,c){a&&(b=b.concat(c.split(" ")))}),b):a}return{restrict:"AC",
-link:function(e,g,h){function k(a){a=l(a,1);h.$addClass(a)}function l(a,b){var c=g.data("$classCounts")||V(),d=[];q(a,function(a){if(0<b||c[a])c[a]=(c[a]||0)+b,c[a]===+(0<b)&&d.push(a)});g.data("$classCounts",c);return d.join(" ")}function m(a,b){var e=c(b,a),f=c(a,b),e=l(e,1),f=l(f,-1);e&&e.length&&d.addClass(g,e);f&&f.length&&d.removeClass(g,f)}function n(a){if(!0===b||(e.$index&1)===b){var c=f(a||[]);if(!r)k(c);else if(!na(a,r)){var d=f(r);m(d,c)}}r=I(a)?a.map(function(a){return ka(a)}):ka(a)}
-var r;h.$observe("class",function(b){n(e.$eval(h[a]))});"ngClass"!==a&&e.$watch("$index",function(a,c){var d=a&1;if(d!==(c&1)){var e=f(r);d===b?k(e):(d=l(e,-1),h.$removeClass(d))}});e.$watch(h[a],n,!0)}}}]}function Xd(a){function b(a,b){b&&!e[a]?(k.addClass(f,a),e[a]=!0):!b&&e[a]&&(k.removeClass(f,a),e[a]=!1)}function d(a,c){a=a?"-"+Hc(a,"-"):"";b(rb+a,!0===c);b(ae+a,!1===c)}var c=a.ctrl,f=a.$element,e={},g=a.set,h=a.unset,k=a.$animate;e[ae]=!(e[rb]=f.hasClass(rb));c.$setValidity=function(a,e,f){z(e)?
-(c.$pending||(c.$pending={}),g(c.$pending,a,f)):(c.$pending&&h(c.$pending,a,f),be(c.$pending)&&(c.$pending=void 0));Ka(e)?e?(h(c.$error,a,f),g(c.$$success,a,f)):(g(c.$error,a,f),h(c.$$success,a,f)):(h(c.$error,a,f),h(c.$$success,a,f));c.$pending?(b(ce,!0),c.$valid=c.$invalid=void 0,d("",null)):(b(ce,!1),c.$valid=be(c.$error),c.$invalid=!c.$valid,d("",c.$valid));e=c.$pending&&c.$pending[a]?void 0:c.$error[a]?!1:c.$$success[a]?!0:null;d(a,e);c.$$parentForm.$setValidity(a,e,c)}}function be(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;
-return!0}var Vg=/^\/(.+)\/([a-z]*)$/,ua=Object.prototype.hasOwnProperty,Q=function(a){return D(a)?a.toLowerCase():a},wb=function(a){return D(a)?a.toUpperCase():a},Ia,F,za,va=[].slice,pg=[].splice,Wg=[].push,ma=Object.prototype.toString,Bc=Object.getPrototypeOf,xa=G("ng"),$=y.angular||(y.angular={}),Wb,sb=0;Ia=y.document.documentMode;var ia=Number.isNaN||function(a){return a!==a};w.$inject=[];$a.$inject=[];var I=Array.isArray,ne=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/,
-Y=function(a){return D(a)?a.trim():a},Jd=function(a){return a.replace(/([-()[\]{}+?*.$^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},da=function(){if(!x(da.rules)){var a=y.document.querySelector("[ng-csp]")||y.document.querySelector("[data-ng-csp]");if(a){var b=a.getAttribute("ng-csp")||a.getAttribute("data-ng-csp");da.rules={noUnsafeEval:!b||-1!==b.indexOf("no-unsafe-eval"),noInlineStyle:!b||-1!==b.indexOf("no-inline-style")}}else{a=da;try{new Function(""),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,
-noInlineStyle:!1}}}return da.rules},ub=function(){if(x(ub.name_))return ub.name_;var a,b,d=Oa.length,c,f;for(b=0;b<d;++b)if(c=Oa[b],a=y.document.querySelector("["+c.replace(":","\\:")+"jq]")){f=a.getAttribute(c+"jq");break}return ub.name_=f},qe=/:/g,Oa=["ng-","data-ng-","ng:","x-ng-"],te=function(a){var b=a.currentScript,b=b&&b.getAttribute("src");if(!b)return!0;var d=a.createElement("a");d.href=b;if(a.location.origin===d.origin)return!0;switch(d.protocol){case "http:":case "https:":case "ftp:":case "blob:":case "file:":case "data:":return!0;
-default:return!1}}(y.document),we=/[A-Z]/g,Ic=!1,La=3,Ae={full:"1.5.11",major:1,minor:5,dot:11,codeName:"princely-quest"};W.expando="ng339";var jb=W.cache={},bg=1;W._data=function(a){return this.cache[a[this.expando]]||{}};var Xf=/([:\-_]+(.))/g,Yf=/^moz([A-Z])/,Ab={mouseleave:"mouseout",mouseenter:"mouseover"},Yb=G("jqLite"),ag=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Xb=/<|&#?\w+;/,Zf=/<([\w:-]+)/,$f=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,pa={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,"",""]};pa.optgroup=pa.option;pa.tbody=pa.tfoot=pa.colgroup=pa.caption=pa.thead;pa.th=pa.td;var gg=y.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Pa=W.prototype={ready:function(a){function b(){d||(d=!0,a())}var d=!1;"complete"===y.document.readyState?y.setTimeout(b):
-(this.on("DOMContentLoaded",b),W(y).on("load",b))},toString:function(){var a=[];q(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=a?F(this[a]):F(this[this.length+a])},length:0,push:Wg,sort:[].sort,splice:[].splice},Gb={};q("multiple selected checked disabled readOnly required open".split(" "),function(a){Gb[Q(a)]=a});var $c={};q("input select option textarea button form details".split(" "),function(a){$c[a]=!0});var gd={ngMinlength:"minlength",ngMaxlength:"maxlength",
-ngMin:"min",ngMax:"max",ngPattern:"pattern"};q({data:$b,removeData:ib,hasData:function(a){for(var b in jb[a.ng339])return!0;return!1},cleanData:function(a){for(var b=0,d=a.length;b<d;b++)ib(a[b])}},function(a,b){W[b]=a});q({data:$b,inheritedData:Eb,scope:function(a){return F.data(a,"$scope")||Eb(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return F.data(a,"$isolateScope")||F.data(a,"$isolateScopeNoTemplate")},controller:Xc,injector:function(a){return Eb(a,"$injector")},removeAttr:function(a,
-b){a.removeAttribute(b)},hasClass:Bb,css:function(a,b,d){b=hb(b);if(x(d))a.style[b]=d;else return a.style[b]},attr:function(a,b,d){var c=a.nodeType;if(c!==La&&2!==c&&8!==c)if(c=Q(b),Gb[c])if(x(d))d?(a[b]=!0,a.setAttribute(b,c)):(a[b]=!1,a.removeAttribute(c));else return a[b]||(a.attributes.getNamedItem(b)||w).specified?c:void 0;else if(x(d))a.setAttribute(b,d);else if(a.getAttribute)return a=a.getAttribute(b,2),null===a?void 0:a},prop:function(a,b,d){if(x(d))a[b]=d;else return a[b]},text:function(){function a(a,
-d){if(z(d)){var c=a.nodeType;return 1===c||c===La?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(z(b)){if(a.multiple&&"select"===wa(a)){var d=[];q(a.options,function(a){a.selected&&d.push(a.value||a.text)});return 0===d.length?null:d}return a.value}a.value=b},html:function(a,b){if(z(b))return a.innerHTML;yb(a,!0);a.innerHTML=b},empty:Yc},function(a,b){W.prototype[b]=function(b,c){var f,e,g=this.length;if(a!==Yc&&z(2===a.length&&a!==Bb&&a!==Xc?b:c)){if(E(b)){for(f=0;f<g;f++)if(a===
-$b)a(this[f],b);else for(e in b)a(this[f],e,b[e]);return this}f=a.$dv;g=z(f)?Math.min(g,1):g;for(e=0;e<g;e++){var h=a(this[e],b,c);f=f?f+h:h}return f}for(f=0;f<g;f++)a(this[f],b,c);return this}});q({removeData:ib,on:function(a,b,d,c){if(x(c))throw Yb("onargs");if(Sc(a)){c=zb(a,!0);var f=c.events,e=c.handle;e||(e=c.handle=dg(a,f));c=0<=b.indexOf(" ")?b.split(" "):[b];for(var g=c.length,h=function(b,c,g){var h=f[b];h||(h=f[b]=[],h.specialHandlerWrapper=c,"$destroy"===b||g||a.addEventListener(b,e,!1));
-h.push(d)};g--;)b=c[g],Ab[b]?(h(Ab[b],fg),h(b,void 0,!0)):h(b)}},off:Wc,one:function(a,b,d){a=F(a);a.on(b,function f(){a.off(b,d);a.off(b,f)});a.on(b,d)},replaceWith:function(a,b){var d,c=a.parentNode;yb(a);q(new W(b),function(b){d?c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];q(a.childNodes,function(a){1===a.nodeType&&b.push(a)});return b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,b){var d=a.nodeType;if(1===d||11===
-d){b=new W(b);for(var d=0,c=b.length;d<c;d++)a.appendChild(b[d])}},prepend:function(a,b){if(1===a.nodeType){var d=a.firstChild;q(new W(b),function(b){a.insertBefore(b,d)})}},wrap:function(a,b){Uc(a,F(b).eq(0).clone()[0])},remove:Fb,detach:function(a){Fb(a,!0)},after:function(a,b){var d=a,c=a.parentNode;if(c){b=new W(b);for(var f=0,e=b.length;f<e;f++){var g=b[f];c.insertBefore(g,d.nextSibling);d=g}}},addClass:Db,removeClass:Cb,toggleClass:function(a,b,d){b&&q(b.split(" "),function(b){var f=d;z(f)&&
-(f=!Bb(a,b));(f?Db:Cb)(a,b)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:Zb,triggerHandler:function(a,b,d){var c,f,e=b.type||b,g=zb(a);if(g=(g=g&&g.events)&&g[e])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=
-!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:w,type:e,target:a},b.type&&(c=R(c,b)),b=ka(g),f=d?[c].concat(d):[c],q(b,function(b){c.isImmediatePropagationStopped()||b.apply(a,f)})}},function(a,b){W.prototype[b]=function(b,c,f){for(var e,g=0,h=this.length;g<h;g++)z(e)?(e=a(this[g],b,c,f),x(e)&&(e=F(e))):Vc(e,a(this[g],b,c,f));return x(e)?e:this}});W.prototype.bind=W.prototype.on;W.prototype.unbind=W.prototype.off;Sa.prototype={put:function(a,
-b){this[Aa(a,this.nextUid)]=b},get:function(a){return this[Aa(a,this.nextUid)]},remove:function(a){var b=this[a=Aa(a,this.nextUid)];delete this[a];return b}};var Vf=[function(){this.$get=[function(){return Sa}]}],ig=/^([^(]+?)=>/,jg=/^[^(]*\(\s*([^)]*)\)/m,Xg=/,/,Yg=/^\s*(_?)(\S+?)\1\s*$/,hg=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ba=G("$injector");fb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw D(d)&&d||(d=a.name||kg(a)),Ba("strictdi",d);b=
-ad(a);q(b[1].split(Xg),function(a){a.replace(Yg,function(a,b,d){c.push(d)})})}a.$inject=c}}else I(a)?(b=a.length-1,Qa(a[b],"fn"),c=a.slice(0,b)):Qa(a,"fn",!0);return c};var de=G("$animate"),nf=function(){this.$get=w},of=function(){var a=new Sa,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function f(a,b,c){var d=!1;b&&(b=D(b)?b.split(" "):I(b)?b:[],q(b,function(b){b&&(d=!0,a[b]=c)}));return d}function e(){q(b,function(b){var c=a.get(b);if(c){var d=lg(b.attr("class")),e="",f="";q(c,
-function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});q(b,function(a){e&&Db(a,e);f&&Cb(a,f)});a.remove(b)}});b.length=0}return{enabled:w,on:w,off:w,pin:w,push:function(g,h,k,l){l&&l();k=k||{};k.from&&g.css(k.from);k.to&&g.css(k.to);if(k.addClass||k.removeClass)if(h=k.addClass,l=k.removeClass,k=a.get(g)||{},h=f(k,h,!0),l=f(k,l,!1),h||l)a.put(g,k),b.push(g),1===b.length&&c.$$postDigest(e);g=new d;g.complete();return g}}}]},lf=["$provide",function(a){var b=this;this.$$registeredAnimations=
-Object.create(null);this.register=function(d,c){if(d&&"."!==d.charAt(0))throw de("notcsel",d);var f=d+"-animation";b.$$registeredAnimations[d.substr(1)]=f;a.factory(f,c)};this.classNameFilter=function(a){if(1===arguments.length&&(this.$$classNameFilter=a instanceof RegExp?a:null)&&/(\s+|\/)ng-animate(\s+|\/)/.test(this.$$classNameFilter.toString()))throw de("nongcls","ng-animate");return this.$$classNameFilter};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var h;a:{for(h=0;h<d.length;h++){var k=
-d[h];if(1===k.nodeType){h=k;break a}}h=void 0}!h||h.parentNode||h.previousElementSibling||(d=null)}d?d.after(a):c.prepend(a)}return{on:a.on,off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.end&&a.end()},enter:function(f,e,g,h){e=e&&F(e);g=g&&F(g);e=e||g.parent();b(f,e,g);return a.push(f,"enter",Ca(h))},move:function(f,e,g,h){e=e&&F(e);g=g&&F(g);e=e||g.parent();b(f,e,g);return a.push(f,"move",Ca(h))},leave:function(b,c){return a.push(b,"leave",Ca(c),function(){b.remove()})},addClass:function(b,
-c,g){g=Ca(g);g.addClass=kb(g.addclass,c);return a.push(b,"addClass",g)},removeClass:function(b,c,g){g=Ca(g);g.removeClass=kb(g.removeClass,c);return a.push(b,"removeClass",g)},setClass:function(b,c,g,h){h=Ca(h);h.addClass=kb(h.addClass,c);h.removeClass=kb(h.removeClass,g);return a.push(b,"setClass",h)},animate:function(b,c,g,h,k){k=Ca(k);k.from=k.from?R(k.from,c):c;k.to=k.to?R(k.to,g):g;k.tempClasses=kb(k.tempClasses,h||"ng-inline-animate");return a.push(b,"animate",k)}}}]}],qf=function(){this.$get=
-["$$rAF",function(a){function b(b){d.push(b);1<d.length||a(function(){for(var a=0;a<d.length;a++)d[a]();d=[]})}var d=[];return function(){var a=!1;b(function(){a=!0});return function(d){a?d():b(d)}}}]},pf=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$document","$timeout",function(a,b,d,c,f){function e(a){this.setHost(a);var b=d();this._doneCallbacks=[];this._tick=function(a){var d=c[0];d&&d.hidden?f(a,0,!1):b(a)};this._state=0}e.chain=function(a,b){function c(){if(d===a.length)b(!0);
-else a[d](function(a){!1===a?b(!1):(d++,c())})}var d=0;c()};e.all=function(a,b){function c(f){e=e&&f;++d===a.length&&b(e)}var d=0,e=!0;q(a,function(a){a.done(c)})};e.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},progress:w,getPromise:function(){if(!this.promise){var b=this;this.promise=a(function(a,c){b.done(function(b){!1===b?c():a()})})}return this.promise},then:function(a,b){return this.getPromise().then(a,b)},"catch":function(a){return this.getPromise()["catch"](a)},
-"finally":function(a){return this.getPromise()["finally"](a)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end();this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel();this._resolve(!1)},complete:function(a){var b=this;0===b._state&&(b._state=1,b._tick(function(){b._resolve(a)}))},_resolve:function(a){2!==this._state&&(q(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length=
-0,this._state=2)}};return e}]},mf=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function(a,b,d){return function(b,f){function e(){a(function(){g.addClass&&(b.addClass(g.addClass),g.addClass=null);g.removeClass&&(b.removeClass(g.removeClass),g.removeClass=null);g.to&&(b.css(g.to),g.to=null);h||k.complete();h=!0});return k}var g=f||{};g.$$prepared||(g=sa(g));g.cleanupStyles&&(g.from=g.to=null);g.from&&(b.css(g.from),g.from=null);var h,k=new d;return{start:e,end:e}}}]},fa=G("$compile"),ec=new function(){};
-Kc.$inject=["$provide","$$sanitizeUriProvider"];Hb.prototype.isFirstChange=function(){return this.previousValue===ec};var bd=/^((?:x|data)[:\-_])/i,id=G("$controller"),hd=/^(\S+)(\s+as\s+([\w$]+))?$/,wf=function(){this.$get=["$document",function(a){return function(b){b?!b.nodeType&&b instanceof F&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},jd="application/json",hc={"Content-Type":jd+";charset=utf-8"},rg=/^\[|^\{(?!\{)/,sg={"[":/]$/,"{":/}$/},qg=/^\)]\}',?\n/,Zg=G("$http"),nd=function(a){return function(){throw Zg("legacy",
-a);}},Ha=$.$interpolateMinErr=G("$interpolate");Ha.throwNoconcat=function(a){throw Ha("noconcat",a);};Ha.interr=function(a,b){return Ha("interr",a,b.toString())};var Ef=function(){this.$get=["$window",function(a){function b(a){var b=function(a){b.data=a;b.called=!0};b.id=a;return b}var d=a.angular.callbacks,c={};return{createCallback:function(a){a="_"+(d.$$counter++).toString(36);var e="angular.callbacks."+a,g=b(a);c[e]=d[a]=g;return e},wasCalled:function(a){return c[a].called},getResponse:function(a){return c[a].data},
-removeCallback:function(a){delete d[c[a].id];delete c[a]}}}]},$g=/^([^?#]*)(\?([^#]*))?(#(.*))?$/,ug={http:80,https:443,ftp:21},lb=G("$location"),vg=/^\s*[\\/]{2,}/,ah={$$absUrl:"",$$html5:!1,$$replace:!1,absUrl:Ib("$$absUrl"),url:function(a){if(z(a))return this.$$url;var b=$g.exec(a);(b[1]||""===a)&&this.path(decodeURIComponent(b[1]));(b[2]||b[1]||""===a)&&this.search(b[3]||"");this.hash(b[5]||"");return this},protocol:Ib("$$protocol"),host:Ib("$$host"),port:Ib("$$port"),path:sd("$$path",function(a){a=
-null!==a?a.toString():"";return"/"===a.charAt(0)?a:"/"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(D(a)||ba(a))a=a.toString(),this.$$search=Fc(a);else if(E(a))a=sa(a,{}),q(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw lb("isrcharg");break;default:z(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();return this},hash:sd("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};
-q([rd,kc,jc],function(a){a.prototype=Object.create(ah);a.prototype.state=function(b){if(!arguments.length)return this.$$state;if(a!==jc||!this.$$html5)throw lb("nostate");this.$$state=z(b)?null:b;return this}});var ea=G("$parse"),ud=[].constructor,vd=(!1).constructor,wd=Function.constructor,xd=(0).constructor,yd={}.constructor,zd="".constructor,Ag=ud.prototype,Bg=vd.prototype,Kb=wd.prototype,Cg=xd.prototype,Ad=yd.prototype,Dg=zd.prototype,xg=Kb.call,yg=Kb.apply,zg=Kb.bind,Fg=Ad.valueOf,Qb=V();q("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),
-function(a){Qb[a]=!0});var bh={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},mc=function(a){this.options=a};mc.prototype={constructor:mc,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,
-text:a}),this.index++;else if(this.isWhitespace(a))this.index++;else{var b=a+this.peek(),d=b+this.peek(2),c=Qb[b],f=Qb[d];Qb[a]||c||f?(a=f?d:c?b:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,b){return-1!==b.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===
+(function(z){'use strict';function ve(a){if(D(a))w(a.objectMaxDepth)&&(Xb.objectMaxDepth=Yb(a.objectMaxDepth)?a.objectMaxDepth:NaN),w(a.urlErrorParamsEnabled)&&Ga(a.urlErrorParamsEnabled)&&(Xb.urlErrorParamsEnabled=a.urlErrorParamsEnabled);else return Xb}function Yb(a){return X(a)&&0<a}function F(a,b){b=b||Error;return function(){var d=arguments[0],c;c="["+(a?a+":":"")+d+"] http://errors.angularjs.org/1.8.0/"+(a?a+"/":"")+d;for(d=1;d<arguments.length;d++){c=c+(1==d?"?":"&")+"p"+(d-1)+"=";var e=encodeURIComponent,
+f;f=arguments[d];f="function"==typeof f?f.toString().replace(/ \{[\s\S]*$/,""):"undefined"==typeof f?"undefined":"string"!=typeof f?JSON.stringify(f):f;c+=e(f)}return new b(c)}}function za(a){if(null==a||$a(a))return!1;if(H(a)||C(a)||x&&a instanceof x)return!0;var b="length"in Object(a)&&a.length;return X(b)&&(0<=b&&b-1 in a||"function"===typeof a.item)}function r(a,b,d){var c,e;if(a)if(B(a))for(c in a)"prototype"!==c&&"length"!==c&&"name"!==c&&a.hasOwnProperty(c)&&b.call(d,a[c],c,a);else if(H(a)||
+za(a)){var f="object"!==typeof a;c=0;for(e=a.length;c<e;c++)(f||c in a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==r)a.forEach(b,d,a);else if(Pc(a))for(c in a)b.call(d,a[c],c,a);else if("function"===typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&b.call(d,a[c],c,a);else for(c in a)ta.call(a,c)&&b.call(d,a[c],c,a);return a}function Qc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function Zb(a){return function(b,d){a(d,b)}}function we(){return++qb}
+function $b(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=b[e];if(D(g)||B(g))for(var k=Object.keys(g),h=0,l=k.length;h<l;h++){var m=k[h],p=g[m];d&&D(p)?ha(p)?a[m]=new Date(p.valueOf()):ab(p)?a[m]=new RegExp(p):p.nodeName?a[m]=p.cloneNode(!0):ac(p)?a[m]=p.clone():"__proto__"!==m&&(D(a[m])||(a[m]=H(p)?[]:{}),$b(a[m],[p],!0)):a[m]=p}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function S(a){return $b(a,Ha.call(arguments,1),!1)}function xe(a){return $b(a,Ha.call(arguments,1),!0)}function fa(a){return parseInt(a,
+10)}function bc(a,b){return S(Object.create(a),b)}function E(){}function Ta(a){return a}function ia(a){return function(){return a}}function cc(a){return B(a.toString)&&a.toString!==la}function A(a){return"undefined"===typeof a}function w(a){return"undefined"!==typeof a}function D(a){return null!==a&&"object"===typeof a}function Pc(a){return null!==a&&"object"===typeof a&&!Rc(a)}function C(a){return"string"===typeof a}function X(a){return"number"===typeof a}function ha(a){return"[object Date]"===la.call(a)}
+function H(a){return Array.isArray(a)||a instanceof Array}function dc(a){switch(la.call(a)){case "[object Error]":return!0;case "[object Exception]":return!0;case "[object DOMException]":return!0;default:return a instanceof Error}}function B(a){return"function"===typeof a}function ab(a){return"[object RegExp]"===la.call(a)}function $a(a){return a&&a.window===a}function bb(a){return a&&a.$evalAsync&&a.$watch}function Ga(a){return"boolean"===typeof a}function ye(a){return a&&X(a.length)&&ze.test(la.call(a))}
+function ac(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function Ae(a){var b={};a=a.split(",");var d;for(d=0;d<a.length;d++)b[a[d]]=!0;return b}function ua(a){return K(a.nodeName||a[0]&&a[0].nodeName)}function cb(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function Ia(a,b,d){function c(a,b,c){c--;if(0>c)return"...";var d=b.$$hashKey,f;if(H(a)){f=0;for(var g=a.length;f<g;f++)b.push(e(a[f],c))}else if(Pc(a))for(f in a)b[f]=e(a[f],c);else if(a&&"function"===typeof a.hasOwnProperty)for(f in a)a.hasOwnProperty(f)&&
+(b[f]=e(a[f],c));else for(f in a)ta.call(a,f)&&(b[f]=e(a[f],c));d?b.$$hashKey=d:delete b.$$hashKey;return b}function e(a,b){if(!D(a))return a;var d=g.indexOf(a);if(-1!==d)return k[d];if($a(a)||bb(a))throw oa("cpws");var d=!1,e=f(a);void 0===e&&(e=H(a)?[]:Object.create(Rc(a)),d=!0);g.push(a);k.push(e);return d?c(a,e,b):e}function f(a){switch(la.call(a)){case "[object Int8Array]":case "[object Int16Array]":case "[object Int32Array]":case "[object Float32Array]":case "[object Float64Array]":case "[object Uint8Array]":case "[object Uint8ClampedArray]":case "[object Uint16Array]":case "[object Uint32Array]":return new a.constructor(e(a.buffer),
+a.byteOffset,a.length);case "[object ArrayBuffer]":if(!a.slice){var b=new ArrayBuffer(a.byteLength);(new Uint8Array(b)).set(new Uint8Array(a));return b}return a.slice(0);case "[object Boolean]":case "[object Number]":case "[object String]":case "[object Date]":return new a.constructor(a.valueOf());case "[object RegExp]":return b=new RegExp(a.source,a.toString().match(/[^/]*$/)[0]),b.lastIndex=a.lastIndex,b;case "[object Blob]":return new a.constructor([a],{type:a.type})}if(B(a.cloneNode))return a.cloneNode(!0)}
+var g=[],k=[];d=Yb(d)?d:NaN;if(b){if(ye(b)||"[object ArrayBuffer]"===la.call(b))throw oa("cpta");if(a===b)throw oa("cpi");H(b)?b.length=0:r(b,function(a,c){"$$hashKey"!==c&&delete b[c]});g.push(a);k.push(b);return c(a,b,d)}return e(a,d)}function ec(a,b){return a===b||a!==a&&b!==b}function va(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d=typeof a,c;if(d===typeof b&&"object"===d)if(H(a)){if(!H(b))return!1;if((d=a.length)===b.length){for(c=0;c<d;c++)if(!va(a[c],
+b[c]))return!1;return!0}}else{if(ha(a))return ha(b)?ec(a.getTime(),b.getTime()):!1;if(ab(a))return ab(b)?a.toString()===b.toString():!1;if(bb(a)||bb(b)||$a(a)||$a(b)||H(b)||ha(b)||ab(b))return!1;d=T();for(c in a)if("$"!==c.charAt(0)&&!B(a[c])){if(!va(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&w(b[c])&&!B(b[c]))return!1;return!0}return!1}function db(a,b,d){return a.concat(Ha.call(b,d))}function Va(a,b){var d=2<arguments.length?Ha.call(arguments,2):[];return!B(b)||b instanceof
+RegExp?b:d.length?function(){return arguments.length?b.apply(a,db(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function Sc(a,b){var d=b;"string"===typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=void 0:$a(b)?d="$WINDOW":b&&z.document===b?d="$DOCUMENT":bb(b)&&(d="$SCOPE");return d}function eb(a,b){if(!A(a))return X(b)||(b=b?2:null),JSON.stringify(a,Sc,b)}function Tc(a){return C(a)?JSON.parse(a):a}function fc(a,b){a=a.replace(Be,"");var d=Date.parse("Jan 01, 1970 00:00:00 "+
+a)/6E4;return Y(d)?b:d}function Uc(a,b){a=new Date(a.getTime());a.setMinutes(a.getMinutes()+b);return a}function gc(a,b,d){d=d?-1:1;var c=a.getTimezoneOffset();b=fc(b,c);return Uc(a,d*(b-c))}function Aa(a){a=x(a).clone().empty();var b=x("<div></div>").append(a).html();try{return a[0].nodeType===Pa?K(b):b.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(a,b){return"<"+K(b)})}catch(d){return K(b)}}function Vc(a){try{return decodeURIComponent(a)}catch(b){}}function hc(a){var b={};r((a||"").split("&"),
+function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=Vc(e),w(e)&&(f=w(f)?Vc(f):!0,ta.call(b,e)?H(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function Ce(a){var b=[];r(a,function(a,c){H(a)?r(a,function(a){b.push(ba(c,!0)+(!0===a?"":"="+ba(a,!0)))}):b.push(ba(c,!0)+(!0===a?"":"="+ba(a,!0)))});return b.length?b.join("&"):""}function ic(a){return ba(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ba(a,
+b){return encodeURIComponent(a).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function De(a,b){var d,c,e=Qa.length;for(c=0;c<e;++c)if(d=Qa[c]+b,C(d=a.getAttribute(d)))return d;return null}function Ee(a,b){var d,c,e={};r(Qa,function(b){b+="app";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))});r(Qa,function(b){b+="app";var e;!d&&(e=a.querySelector("["+b.replace(":","\\:")+"]"))&&(d=e,c=e.getAttribute(b))});
+d&&(Fe?(e.strictDi=null!==De(d,"strict-di"),b(d,c?[c]:[],e)):z.console.error("AngularJS: disabling automatic bootstrap. <script> protocol indicates an extension, document.location.href does not match."))}function Wc(a,b,d){D(d)||(d={});d=S({strictDi:!1},d);var c=function(){a=x(a);if(a.injector()){var c=a[0]===z.document?"document":Aa(a);throw oa("btstrpd",c.replace(/</,"&lt;").replace(/>/,"&gt;"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",
+function(a){a.debugInfoEnabled(!0)}]);b.unshift("ng");c=fb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;z&&e.test(z.name)&&(d.debugInfoEnabled=!0,z.name=z.name.replace(e,""));if(z&&!f.test(z.name))return c();z.name=z.name.replace(f,"");ca.resumeBootstrap=function(a){r(a,function(a){b.push(a)});return c()};B(ca.resumeDeferredBootstrap)&&
+ca.resumeDeferredBootstrap()}function Ge(){z.name="NG_ENABLE_DEBUG_INFO!"+z.name;z.location.reload()}function He(a){a=ca.element(a).injector();if(!a)throw oa("test");return a.get("$$testability")}function Xc(a,b){b=b||"_";return a.replace(Ie,function(a,c){return(c?b:"")+a.toLowerCase()})}function Je(){var a;if(!Yc){var b=rb();(sb=A(b)?z.jQuery:b?z[b]:void 0)&&sb.fn.on?(x=sb,S(sb.fn,{scope:Wa.scope,isolateScope:Wa.isolateScope,controller:Wa.controller,injector:Wa.injector,inheritedData:Wa.inheritedData})):
+x=U;a=x.cleanData;x.cleanData=function(b){for(var c,e=0,f;null!=(f=b[e]);e++)(c=(x._data(f)||{}).events)&&c.$destroy&&x(f).triggerHandler("$destroy");a(b)};ca.element=x;Yc=!0}}function Ke(){U.legacyXHTMLReplacement=!0}function gb(a,b,d){if(!a)throw oa("areq",b||"?",d||"required");return a}function tb(a,b,d){d&&H(a)&&(a=a[a.length-1]);gb(B(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ja(a,b){if("hasOwnProperty"===a)throw oa("badname",
+b);}function Le(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g<f;g++)c=b[g],a&&(a=(e=a)[c]);return!d&&B(a)?Va(e,a):a}function ub(a){for(var b=a[0],d=a[a.length-1],c,e=1;b!==d&&(b=b.nextSibling);e++)if(c||a[e]!==b)c||(c=x(Ha.call(a,0,e))),c.push(b);return c||a}function T(){return Object.create(null)}function jc(a){if(null==a)return"";switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=!cc(a)||H(a)||ha(a)?eb(a):a.toString()}return a}function Me(a){function b(a,
+b,c){return a[b]||(a[b]=c())}var d=F("$injector"),c=F("ng");a=b(a,"angular",Object);a.$$minErr=a.$$minErr||F;return b(a,"module",function(){var a={};return function(f,g,k){var h={};if("hasOwnProperty"===f)throw c("badname","module");g&&a.hasOwnProperty(f)&&(a[f]=null);return b(a,f,function(){function a(b,c,d,f){f||(f=e);return function(){f[d||"push"]([b,c,arguments]);return t}}function b(a,c,d){d||(d=e);return function(b,e){e&&B(e)&&(e.$$moduleName=f);d.push([a,c,arguments]);return t}}if(!g)throw d("nomod",
+f);var e=[],n=[],s=[],G=a("$injector","invoke","push",n),t={_invokeQueue:e,_configBlocks:n,_runBlocks:s,info:function(a){if(w(a)){if(!D(a))throw c("aobj","value");h=a;return this}return h},requires:g,name:f,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),decorator:b("$provide","decorator",n),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider",
+"register"),directive:b("$compileProvider","directive"),component:b("$compileProvider","component"),config:G,run:function(a){s.push(a);return this}};k&&G(k);return t})}})}function ja(a,b){if(H(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(D(a))for(d in b=b||{},a)if("$"!==d.charAt(0)||"$"!==d.charAt(1))b[d]=a[d];return b||a}function Ne(a,b){var d=[];Yb(b)&&(a=ca.copy(a,null,b));return JSON.stringify(a,function(a,b){b=Sc(a,b);if(D(b)){if(0<=d.indexOf(b))return"...";d.push(b)}return b})}
+function Oe(a){S(a,{errorHandlingConfig:ve,bootstrap:Wc,copy:Ia,extend:S,merge:xe,equals:va,element:x,forEach:r,injector:fb,noop:E,bind:Va,toJson:eb,fromJson:Tc,identity:Ta,isUndefined:A,isDefined:w,isString:C,isFunction:B,isObject:D,isNumber:X,isElement:ac,isArray:H,version:Pe,isDate:ha,callbacks:{$$counter:0},getTestability:He,reloadWithDebugInfo:Ge,UNSAFE_restoreLegacyJqLiteXHTMLReplacement:Ke,$$minErr:F,$$csp:Ba,$$encodeUriSegment:ic,$$encodeUriQuery:ba,$$lowercase:K,$$stringify:jc,$$uppercase:vb});
+lc=Me(z);lc("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Qe});a.provider("$compile",Zc).directive({a:Re,input:$c,textarea:$c,form:Se,script:Te,select:Ue,option:Ve,ngBind:We,ngBindHtml:Xe,ngBindTemplate:Ye,ngClass:Ze,ngClassEven:$e,ngClassOdd:af,ngCloak:bf,ngController:cf,ngForm:df,ngHide:ef,ngIf:ff,ngInclude:gf,ngInit:hf,ngNonBindable:jf,ngPluralize:kf,ngRef:lf,ngRepeat:mf,ngShow:nf,ngStyle:of,ngSwitch:pf,ngSwitchWhen:qf,ngSwitchDefault:rf,ngOptions:sf,ngTransclude:tf,ngModel:uf,
+ngList:vf,ngChange:wf,pattern:ad,ngPattern:ad,required:bd,ngRequired:bd,minlength:cd,ngMinlength:cd,maxlength:dd,ngMaxlength:dd,ngValue:xf,ngModelOptions:yf}).directive({ngInclude:zf,input:Af}).directive(wb).directive(ed);a.provider({$anchorScroll:Bf,$animate:Cf,$animateCss:Df,$$animateJs:Ef,$$animateQueue:Ff,$$AnimateRunner:Gf,$$animateAsyncRun:Hf,$browser:If,$cacheFactory:Jf,$controller:Kf,$document:Lf,$$isDocumentHidden:Mf,$exceptionHandler:Nf,$filter:fd,$$forceReflow:Of,$interpolate:Pf,$interval:Qf,
+$$intervalFactory:Rf,$http:Sf,$httpParamSerializer:Tf,$httpParamSerializerJQLike:Uf,$httpBackend:Vf,$xhrFactory:Wf,$jsonpCallbacks:Xf,$location:Yf,$log:Zf,$parse:$f,$rootScope:ag,$q:bg,$$q:cg,$sce:dg,$sceDelegate:eg,$sniffer:fg,$$taskTrackerFactory:gg,$templateCache:hg,$templateRequest:ig,$$testability:jg,$timeout:kg,$window:lg,$$rAF:mg,$$jqLite:ng,$$Map:og,$$cookieReader:pg})}]).info({angularVersion:"1.8.0"})}function xb(a,b){return b.toUpperCase()}function yb(a){return a.replace(qg,xb)}function mc(a){a=
+a.nodeType;return 1===a||!a||9===a}function gd(a,b){var d,c,e,f=b.createDocumentFragment(),g=[],k;if(nc.test(a)){d=f.appendChild(b.createElement("div"));c=(rg.exec(a)||["",""])[1].toLowerCase();e=U.legacyXHTMLReplacement?a.replace(sg,"<$1></$2>"):a;if(10>wa)for(c=hb[c]||hb._default,d.innerHTML=c[1]+e+c[2],k=c[0];k--;)d=d.firstChild;else{c=qa[c]||[];for(k=c.length;-1<--k;)d.appendChild(z.document.createElement(c[k])),d=d.firstChild;d.innerHTML=e}g=db(g,d.childNodes);d=f.firstChild;d.textContent=""}else g.push(b.createTextNode(a));
+f.textContent="";f.innerHTML="";r(g,function(a){f.appendChild(a)});return f}function U(a){if(a instanceof U)return a;var b;C(a)&&(a=V(a),b=!0);if(!(this instanceof U)){if(b&&"<"!==a.charAt(0))throw oc("nosel");return new U(a)}if(b){b=z.document;var d;a=(d=tg.exec(a))?[b.createElement(d[1])]:(d=gd(a,b))?d.childNodes:[];pc(this,a)}else B(a)?hd(a):pc(this,a)}function qc(a){return a.cloneNode(!0)}function zb(a,b){!b&&mc(a)&&x.cleanData([a]);a.querySelectorAll&&x.cleanData(a.querySelectorAll("*"))}function id(a){for(var b in a)return!1;
+return!0}function jd(a){var b=a.ng339,d=b&&Ka[b],c=d&&d.events,d=d&&d.data;d&&!id(d)||c&&!id(c)||(delete Ka[b],a.ng339=void 0)}function kd(a,b,d,c){if(w(c))throw oc("offargs");var e=(c=Ab(a))&&c.events,f=c&&c.handle;if(f){if(b){var g=function(b){var c=e[b];w(d)&&cb(c||[],d);w(d)&&c&&0<c.length||(a.removeEventListener(b,f),delete e[b])};r(b.split(" "),function(a){g(a);Bb[a]&&g(Bb[a])})}else for(b in e)"$destroy"!==b&&a.removeEventListener(b,f),delete e[b];jd(a)}}function rc(a,b){var d=a.ng339;if(d=
+d&&Ka[d])b?delete d.data[b]:d.data={},jd(a)}function Ab(a,b){var d=a.ng339,d=d&&Ka[d];b&&!d&&(a.ng339=d=++ug,d=Ka[d]={events:{},data:{},handle:void 0});return d}function sc(a,b,d){if(mc(a)){var c,e=w(d),f=!e&&b&&!D(b),g=!b;a=(a=Ab(a,!f))&&a.data;if(e)a[yb(b)]=d;else{if(g)return a;if(f)return a&&a[yb(b)];for(c in b)a[yb(c)]=b[c]}}}function Cb(a,b){return a.getAttribute?-1<(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" "):!1}function Db(a,b){if(b&&a.setAttribute){var d=
+(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," "),c=d;r(b.split(" "),function(a){a=V(a);c=c.replace(" "+a+" "," ")});c!==d&&a.setAttribute("class",V(c))}}function Eb(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," "),c=d;r(b.split(" "),function(a){a=V(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});c!==d&&a.setAttribute("class",V(c))}}function pc(a,b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if("number"===typeof d&&b.window!==b){if(d)for(var c=
+0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function ld(a,b){return Fb(a,"$"+(b||"ngController")+"Controller")}function Fb(a,b,d){9===a.nodeType&&(a=a.documentElement);for(b=H(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(w(d=x.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function md(a){for(zb(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Gb(a,b){b||zb(a);var d=a.parentNode;d&&d.removeChild(a)}function vg(a,b){b=b||z;if("complete"===b.document.readyState)b.setTimeout(a);
+else x(b).on("load",a)}function hd(a){function b(){z.document.removeEventListener("DOMContentLoaded",b);z.removeEventListener("load",b);a()}"complete"===z.document.readyState?z.setTimeout(a):(z.document.addEventListener("DOMContentLoaded",b),z.addEventListener("load",b))}function nd(a,b){var d=Hb[b.toLowerCase()];return d&&od[ua(a)]&&d}function wg(a,b){var d=function(c,d){c.isDefaultPrevented=function(){return c.defaultPrevented};var f=b[d||c.type],g=f?f.length:0;if(g){if(A(c.immediatePropagationStopped)){var k=
+c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();k&&k.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var h=f.specialHandlerWrapper||xg;1<g&&(f=ja(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||h(a,c,f[l])}};d.elem=a;return d}function xg(a,b,d){d.call(a,b)}function yg(a,b,d){var c=b.relatedTarget;c&&(c===a||zg.call(a,c))||d.call(a,b)}function ng(){this.$get=
+function(){return S(U,{hasClass:function(a,b){a.attr&&(a=a[0]);return Cb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return Eb(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);return Db(a,b)}})}}function La(a,b){var d=a&&a.$$hashKey;if(d)return"function"===typeof d&&(d=a.$$hashKey()),d;d=typeof a;return d="function"===d||"object"===d&&null!==a?a.$$hashKey=d+":"+(b||we)():d+":"+a}function pd(){this._keys=[];this._values=[];this._lastKey=NaN;this._lastIndex=-1}function qd(a){a=Function.prototype.toString.call(a).replace(Ag,
+"");return a.match(Bg)||a.match(Cg)}function Dg(a){return(a=qd(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function fb(a,b){function d(a){return function(b,c){if(D(b))r(b,Zb(a));else return a(b,c)}}function c(a,b){Ja(a,"service");if(B(b)||H(b))b=n.instantiate(b);if(!b.$get)throw Ca("pget",a);return p[a+"Provider"]=b}function e(a,b){return function(){var c=t.invoke(b,this);if(A(c))throw Ca("undef",a);return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){gb(A(a)||
+H(a),"modulesToLoad","not an array");var b=[],c;r(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],f=n.get(e[0]);f[e[1]].apply(f,e[2])}}if(!m.get(a)){m.set(a,!0);try{C(a)?(c=lc(a),t.modules[a]=c,b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):B(a)?b.push(n.invoke(a)):H(a)?b.push(n.invoke(a)):tb(a,"module")}catch(e){throw H(a)&&(a=a[a.length-1]),e.message&&e.stack&&-1===e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ca("modulerr",
+a,e.stack||e.message||e);}}});return b}function k(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===h)throw Ca("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=h,a[b]=c(b,e),a[b]}catch(f){throw a[b]===h&&delete a[b],f;}finally{l.shift()}}function e(a,c,f){var g=[];a=fb.$$annotate(a,b,f);for(var h=0,k=a.length;h<k;h++){var l=a[h];if("string"!==typeof l)throw Ca("itkn",l);g.push(c&&c.hasOwnProperty(l)?c[l]:d(l,f))}return g}return{invoke:function(a,b,c,d){"string"===typeof c&&
+(d=c,c=null);c=e(a,c,d);H(a)&&(a=a[a.length-1]);d=a;if(wa||"function"!==typeof d)d=!1;else{var f=d.$$ngIsClass;Ga(f)||(f=d.$$ngIsClass=/^class\b/.test(Function.prototype.toString.call(d)));d=f}return d?(c.unshift(null),new (Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=H(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d,a))},get:d,annotate:fb.$$annotate,has:function(b){return p.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}
+b=!0===b;var h={},l=[],m=new Ib,p={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,ia(b),!1)}),constant:d(function(a,b){Ja(a,"constant");p[a]=b;s[a]=b}),decorator:function(a,b){var c=n.get(a+"Provider"),d=c.$get;c.$get=function(){var a=t.invoke(d,c);return t.invoke(b,null,{$delegate:a})}}}},n=p.$injector=k(p,function(a,b){ca.isString(b)&&l.push(b);throw Ca("unpr",l.join(" <- "));}),s={},
+G=k(s,function(a,b){var c=n.get(a+"Provider",b);return t.invoke(c.$get,c,void 0,a)}),t=G;p.$injectorProvider={$get:ia(G)};t.modules=n.modules=T();var N=g(a),t=G.get("$injector");t.strictDi=b;r(N,function(a){a&&t.invoke(a)});t.loadNewModules=function(a){r(g(a),function(a){a&&t.invoke(a)})};return t}function Bf(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===
+ua(a))return b=a,!0});return b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset;B(c)?c=c():ac(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):X(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=C(a)?a:X(a)?a.toString():d.hash();var b;a?(b=k.getElementById(a))?f(b):(b=e(k.getElementsByName(a)))?f(b):"top"===a&&f(null):f(null)}var k=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===
+b&&""===a||vg(function(){c.$evalAsync(g)})});return g}]}function ib(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;H(a)&&(a=a.join(" "));H(b)&&(b=b.join(" "));return a+" "+b}function Eg(a){C(a)&&(a=a.split(" "));var b=T();r(a,function(a){a.length&&(b[a]=!0)});return b}function ra(a){return D(a)?a:{}}function Fg(a,b,d,c,e){function f(){pa=null;k()}function g(){t=y();t=A(t)?null:t;va(t,P)&&(t=P);N=P=t}function k(){var a=N;g();if(v!==h.url()||a!==t)v=h.url(),N=t,r(J,function(a){a(h.url(),t)})}
+var h=this,l=a.location,m=a.history,p=a.setTimeout,n=a.clearTimeout,s={},G=e(d);h.isMock=!1;h.$$completeOutstandingRequest=G.completeTask;h.$$incOutstandingRequestCount=G.incTaskCount;h.notifyWhenNoOutstandingRequests=G.notifyWhenNoPendingTasks;var t,N,v=l.href,kc=b.find("base"),pa=null,y=c.history?function(){try{return m.state}catch(a){}}:E;g();h.url=function(b,d,e){A(e)&&(e=null);l!==a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=N===e;b=ga(b).href;if(v===b&&(!c.history||f))return h;
+var k=v&&Da(v)===Da(b);v=b;N=e;!c.history||k&&f?(k||(pa=b),d?l.replace(b):k?(d=l,e=b,f=e.indexOf("#"),e=-1===f?"":e.substr(f),d.hash=e):l.href=b,l.href!==b&&(pa=b)):(m[d?"replaceState":"pushState"](e,"",b),g());pa&&(pa=b);return h}return(pa||l.href).replace(/#$/,"")};h.state=function(){return t};var J=[],I=!1,P=null;h.onUrlChange=function(b){if(!I){if(c.history)x(a).on("popstate",f);x(a).on("hashchange",f);I=!0}J.push(b);return b};h.$$applicationDestroyed=function(){x(a).off("hashchange popstate",
+f)};h.$$checkUrlChange=k;h.baseHref=function(){var a=kc.attr("href");return a?a.replace(/^(https?:)?\/\/[^/]*/,""):""};h.defer=function(a,b,c){var d;b=b||0;c=c||G.DEFAULT_TASK_TYPE;G.incTaskCount(c);d=p(function(){delete s[d];G.completeTask(a,c)},b);s[d]=c;return d};h.defer.cancel=function(a){if(s.hasOwnProperty(a)){var b=s[a];delete s[a];n(a);G.completeTask(E,b);return!0}return!1}}function If(){this.$get=["$window","$log","$sniffer","$document","$$taskTrackerFactory",function(a,b,d,c,e){return new Fg(a,
+c,b,d,e)}]}function Jf(){this.$get=function(){function a(a,c){function e(a){a!==p&&(n?n===a&&(n=a.n):n=a,f(a.n,a.p),f(a,p),p=a,p.n=null)}function f(a,b){a!==b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw F("$cacheFactory")("iid",a);var g=0,k=S({},c,{id:a}),h=T(),l=c&&c.capacity||Number.MAX_VALUE,m=T(),p=null,n=null;return b[a]={put:function(a,b){if(!A(b)){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}a in h||g++;h[a]=b;g>l&&this.remove(n.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=
+m[a];if(!b)return;e(b)}return h[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b===p&&(p=b.p);b===n&&(n=b.n);f(b.n,b.p);delete m[a]}a in h&&(delete h[a],g--)},removeAll:function(){h=T();g=0;m=T();p=n=null},destroy:function(){m=k=h=null;delete b[a]},info:function(){return S({},k,{size:g})}}}var b={};a.info=function(){var a={};r(b,function(b,e){a[e]=b.info()});return a};a.get=function(a){return b[a]};return a}}function hg(){this.$get=["$cacheFactory",function(a){return a("templates")}]}
+function Zc(a,b){function d(a,b,c){var d=/^([@&]|[=<](\*?))(\??)\s*([\w$]*)$/,e=T();r(a,function(a,f){a=a.trim();if(a in p)e[f]=p[a];else{var g=a.match(d);if(!g)throw $("iscp",b,f,a,c?"controller bindings definition":"isolate scope definition");e[f]={mode:g[1][0],collection:"*"===g[2],optional:"?"===g[3],attrName:g[4]||f};g[4]&&(p[a]=e[f])}});return e}function c(a){var b=a.charAt(0);if(!b||b!==K(b))throw $("baddir",a);if(a!==a.trim())throw $("baddir",a);}function e(a){var b=a.require||a.controller&&
+a.name;!H(b)&&D(b)&&r(b,function(a,c){var d=a.match(l);a.substring(d[0].length)||(b[c]=d[0]+c)});return b}var f={},g=/^\s*directive:\s*([\w-]+)\s+(.*)$/,k=/(([\w-]+)(?::([^;]+))?;?)/,h=Ae("ngSrc,ngSrcset,src,srcset"),l=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,m=/^(on[a-z]+|formaction)$/,p=T();this.directive=function pa(b,d){gb(b,"name");Ja(b,"directive");C(b)?(c(b),gb(d,"directiveFactory"),f.hasOwnProperty(b)||(f[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var d=[];r(f[b],function(f,
+g){try{var h=a.invoke(f);B(h)?h={compile:ia(h)}:!h.compile&&h.link&&(h.compile=ia(h.link));h.priority=h.priority||0;h.index=g;h.name=h.name||b;h.require=e(h);var k=h,l=h.restrict;if(l&&(!C(l)||!/[EACM]/.test(l)))throw $("badrestrict",l,b);k.restrict=l||"EA";h.$$moduleName=f.$$moduleName;d.push(h)}catch(m){c(m)}});return d}])),f[b].push(d)):r(b,Zb(pa));return this};this.component=function y(a,b){function c(a){function e(b){return B(b)||H(b)?function(c,d){return a.invoke(b,this,{$element:c,$attrs:d})}:
+b}var f=b.template||b.templateUrl?b.template:"",g={controller:d,controllerAs:Gg(b.controller)||b.controllerAs||"$ctrl",template:e(f),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E",require:b.require};r(b,function(a,b){"$"===b.charAt(0)&&(g[b]=a)});return g}if(!C(a))return r(a,Zb(Va(this,y))),this;var d=b.controller||function(){};r(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a,B(d)&&(d[b]=a))});c.$inject=["$injector"];return this.directive(a,
+c)};this.aHrefSanitizationWhitelist=function(a){return w(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return w(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var n=!0;this.debugInfoEnabled=function(a){return w(a)?(n=a,this):n};var s=!1;this.strictComponentBindingsEnabled=function(a){return w(a)?(s=a,this):s};var G=10;this.onChangesTtl=function(a){return arguments.length?(G=a,this):G};var t=!0;this.commentDirectivesEnabled=
+function(a){return arguments.length?(t=a,this):t};var N=!0;this.cssClassDirectivesEnabled=function(a){return arguments.length?(N=a,this):N};var v=T();this.addPropertySecurityContext=function(a,b,c){var d=a.toLowerCase()+"|"+b.toLowerCase();if(d in v&&v[d]!==c)throw $("ctxoverride",a,b,v[d],c);v[d]=c;return this};(function(){function a(b,c){r(c,function(a){v[a.toLowerCase()]=b})}a(W.HTML,["iframe|srcdoc","*|innerHTML","*|outerHTML"]);a(W.CSS,["*|style"]);a(W.URL,"area|href area|ping a|href a|ping blockquote|cite body|background del|cite input|src ins|cite q|cite".split(" "));
+a(W.MEDIA_URL,"audio|src img|src img|srcset source|src source|srcset track|src video|src video|poster".split(" "));a(W.RESOURCE_URL,"*|formAction applet|code applet|codebase base|href embed|src frame|src form|action head|profile html|manifest iframe|src link|href media|src object|codebase object|data script|src".split(" "))})();this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate",function(a,b,c,e,p,M,L,u,R){function q(){try{if(!--Ja)throw Ua=
+void 0,$("infchng",G);L.$apply(function(){for(var a=0,b=Ua.length;a<b;++a)try{Ua[a]()}catch(d){c(d)}Ua=void 0})}finally{Ja++}}function ma(a,b){if(!a)return a;if(!C(a))throw $("srcset",b,a.toString());for(var c="",d=V(a),e=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,e=/\s/.test(d)?e:/(,)/,d=d.split(e),e=Math.floor(d.length/2),f=0;f<e;f++)var g=2*f,c=c+u.getTrustedMediaUrl(V(d[g])),c=c+(" "+V(d[g+1]));d=V(d[2*f]).split(/\s/);c+=u.getTrustedMediaUrl(V(d[0]));2===d.length&&(c+=" "+V(d[1]));return c}function w(a,
+b){if(b){var c=Object.keys(b),d,e,f;d=0;for(e=c.length;d<e;d++)f=c[d],this[f]=b[f]}else this.$attr={};this.$$element=a}function O(a,b,c){Fa.innerHTML="<span "+b+">";b=Fa.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function sa(a,b){try{a.addClass(b)}catch(c){}}function da(a,b,c,d,e){a instanceof x||(a=x(a));var f=Xa(a,b,a,c,d,e);da.$$addScopeClass(a);var g=null;return function(b,c,d){if(!a)throw $("multilink");gb(b,"scope");e&&e.needsNewScope&&
+(b=b.$parent.$new());d=d||{};var h=d.parentBoundTranscludeFn,k=d.transcludeControllers;d=d.futureParentElement;h&&h.$$boundTransclude&&(h=h.$$boundTransclude);g||(g=(d=d&&d[0])?"foreignobject"!==ua(d)&&la.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==g?x(ja(g,x("<div></div>").append(a).html())):c?Wa.clone.call(a):a;if(k)for(var l in k)d.data("$"+l+"Controller",k[l].instance);da.$$addScopeInfo(d,b);c&&c(d,b);f&&f(b,d,d,h);c||(a=f=null);return d}}function Xa(a,b,c,d,e,f){function g(a,c,d,e){var f,
+k,l,m,p,I,t;if(n)for(t=Array(c.length),m=0;m<h.length;m+=3)f=h[m],t[f]=c[f];else t=c;m=0;for(p=h.length;m<p;)k=t[h[m++]],c=h[m++],f=h[m++],c?(c.scope?(l=a.$new(),da.$$addScopeInfo(x(k),l)):l=a,I=c.transcludeOnThisElement?ka(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?ka(a,b):null,c(f,l,k,d,I)):f&&f(a,k.childNodes,void 0,e)}for(var h=[],k=H(a)||a instanceof x,l,m,p,I,n,t=0;t<a.length;t++){l=new w;11===wa&&jb(a,t,k);m=tc(a[t],[],l,0===t?d:void 0,e);(f=m.length?aa(m,a[t],l,b,c,null,[],[],f):
+null)&&f.scope&&da.$$addScopeClass(l.$$element);l=f&&f.terminal||!(p=a[t].childNodes)||!p.length?null:Xa(p,f?(f.transcludeOnThisElement||!f.templateOnThisElement)&&f.transclude:b);if(f||l)h.push(t,f,l),I=!0,n=n||f;f=null}return I?g:null}function jb(a,b,c){var d=a[b],e=d.parentNode,f;if(d.nodeType===Pa)for(;;){f=e?d.nextSibling:a[b+1];if(!f||f.nodeType!==Pa)break;d.nodeValue+=f.nodeValue;f.parentNode&&f.parentNode.removeChild(f);c&&f===a[b+1]&&a.splice(b+1,1)}}function ka(a,b,c){function d(e,f,g,h,
+k){e||(e=a.$new(!1,k),e.$$transcluded=!0);return b(e,f,{parentBoundTranscludeFn:c,transcludeControllers:g,futureParentElement:h})}var e=d.$$slots=T(),f;for(f in b.$$slots)e[f]=b.$$slots[f]?ka(a,b.$$slots[f],c):null;return d}function tc(a,b,d,e,f){var g=d.$attr,h;switch(a.nodeType){case 1:h=ua(a);Y(b,xa(h),"E",e,f);for(var l,m,n,t,J,s=a.attributes,v=0,G=s&&s.length;v<G;v++){var P=!1,N=!1,r=!1,y=!1,u=!1,M;l=s[v];m=l.name;t=l.value;n=xa(m.toLowerCase());(J=n.match(Ra))?(r="Attr"===J[1],y="Prop"===J[1],
+u="On"===J[1],m=m.replace(rd,"").toLowerCase().substr(4+J[1].length).replace(/_(.)/g,function(a,b){return b.toUpperCase()})):(M=n.match(Sa))&&ca(M[1])&&(P=m,N=m.substr(0,m.length-5)+"end",m=m.substr(0,m.length-6));if(y||u)d[n]=t,g[n]=l.name,y?Ea(a,b,n,m):b.push(sd(p,L,c,n,m,!1));else{n=xa(m.toLowerCase());g[n]=m;if(r||!d.hasOwnProperty(n))d[n]=t,nd(a,n)&&(d[n]=!0);Ia(a,b,t,n,r);Y(b,n,"A",e,f,P,N)}}"input"===h&&"hidden"===a.getAttribute("type")&&a.setAttribute("autocomplete","off");if(!Qa)break;g=
+a.className;D(g)&&(g=g.animVal);if(C(g)&&""!==g)for(;a=k.exec(g);)n=xa(a[2]),Y(b,n,"C",e,f)&&(d[n]=V(a[3])),g=g.substr(a.index+a[0].length);break;case Pa:na(b,a.nodeValue);break;case 8:if(!Oa)break;F(a,b,d,e,f)}b.sort(ia);return b}function F(a,b,c,d,e){try{var f=g.exec(a.nodeValue);if(f){var h=xa(f[1]);Y(b,h,"M",d,e)&&(c[h]=V(f[2]))}}catch(k){}}function U(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw $("uterdir",b,c);1===a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&
+e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return x(d)}function W(a,b,c){return function(d,e,f,g,h){e=U(e[0],b,c);return a(d,e,f,g,h)}}function Z(a,b,c,d,e,f){var g;return a?da(b,c,d,e,f):function(){g||(g=da(b,c,d,e,f),b=c=f=null);return g.apply(this,arguments)}}function aa(a,b,d,e,f,g,h,k,l){function m(a,b,c,d){if(a){c&&(a=W(a,c,d));a.require=u.require;a.directiveName=Q;if(s===u||u.$$isolateScope)a=Ba(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=W(b,c,d));b.require=u.require;b.directiveName=
+Q;if(s===u||u.$$isolateScope)b=Ba(b,{isolateScope:!0});k.push(b)}}function p(a,e,f,g,l){function m(a,b,c,d){var e;bb(a)||(d=c,c=b,b=a,a=void 0);N&&(e=P);c||(c=N?Q.parent():Q);if(d){var f=l.$$slots[d];if(f)return f(a,b,e,c,R);if(A(f))throw $("noslot",d,Aa(Q));}else return l(a,b,e,c,R)}var n,u,L,y,G,P,M,Q;b===f?(g=d,Q=d.$$element):(Q=x(f),g=new w(Q,d));G=e;s?y=e.$new(!0):t&&(G=e.$parent);l&&(M=m,M.$$boundTransclude=l,M.isSlotFilled=function(a){return!!l.$$slots[a]});J&&(P=ea(Q,g,M,J,y,e,s));s&&(da.$$addScopeInfo(Q,
+y,!0,!(v&&(v===s||v===s.$$originalDirective))),da.$$addScopeClass(Q,!0),y.$$isolateBindings=s.$$isolateBindings,u=Da(e,g,y,y.$$isolateBindings,s),u.removeWatches&&y.$on("$destroy",u.removeWatches));for(n in P){u=J[n];L=P[n];var Hg=u.$$bindings.bindToController;L.instance=L();Q.data("$"+u.name+"Controller",L.instance);L.bindingInfo=Da(G,g,L.instance,Hg,u)}r(J,function(a,b){var c=a.require;a.bindToController&&!H(c)&&D(c)&&S(P[b].instance,X(b,c,Q,P))});r(P,function(a){var b=a.instance;if(B(b.$onChanges))try{b.$onChanges(a.bindingInfo.initialChanges)}catch(d){c(d)}if(B(b.$onInit))try{b.$onInit()}catch(e){c(e)}B(b.$doCheck)&&
+(G.$watch(function(){b.$doCheck()}),b.$doCheck());B(b.$onDestroy)&&G.$on("$destroy",function(){b.$onDestroy()})});n=0;for(u=h.length;n<u;n++)L=h[n],Ca(L,L.isolateScope?y:e,Q,g,L.require&&X(L.directiveName,L.require,Q,P),M);var R=e;s&&(s.template||null===s.templateUrl)&&(R=y);a&&a(R,f.childNodes,void 0,l);for(n=k.length-1;0<=n;n--)L=k[n],Ca(L,L.isolateScope?y:e,Q,g,L.require&&X(L.directiveName,L.require,Q,P),M);r(P,function(a){a=a.instance;B(a.$postLink)&&a.$postLink()})}l=l||{};for(var n=-Number.MAX_VALUE,
+t=l.newScopeDirective,J=l.controllerDirectives,s=l.newIsolateScopeDirective,v=l.templateDirective,L=l.nonTlbTranscludeDirective,G=!1,P=!1,N=l.hasElementTranscludeDirective,y=d.$$element=x(b),u,Q,M,R=e,q,ma=!1,Jb=!1,O,sa=0,C=a.length;sa<C;sa++){u=a[sa];var E=u.$$start,jb=u.$$end;E&&(y=U(b,E,jb));M=void 0;if(n>u.priority)break;if(O=u.scope)u.templateUrl||(D(O)?(ba("new/isolated scope",s||t,u,y),s=u):ba("new/isolated scope",s,u,y)),t=t||u;Q=u.name;if(!ma&&(u.replace&&(u.templateUrl||u.template)||u.transclude&&
+!u.$$tlb)){for(O=sa+1;ma=a[O++];)if(ma.transclude&&!ma.$$tlb||ma.replace&&(ma.templateUrl||ma.template)){Jb=!0;break}ma=!0}!u.templateUrl&&u.controller&&(J=J||T(),ba("'"+Q+"' controller",J[Q],u,y),J[Q]=u);if(O=u.transclude)if(G=!0,u.$$tlb||(ba("transclusion",L,u,y),L=u),"element"===O)N=!0,n=u.priority,M=y,y=d.$$element=x(da.$$createComment(Q,d[Q])),b=y[0],oa(f,Ha.call(M,0),b),R=Z(Jb,M,e,n,g&&g.name,{nonTlbTranscludeDirective:L});else{var ka=T();if(D(O)){M=z.document.createDocumentFragment();var Xa=
+T(),F=T();r(O,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Xa[a]=b;ka[b]=null;F[b]=c});r(y.contents(),function(a){var b=Xa[xa(ua(a))];b?(F[b]=!0,ka[b]=ka[b]||z.document.createDocumentFragment(),ka[b].appendChild(a)):M.appendChild(a)});r(F,function(a,b){if(!a)throw $("reqslot",b);});for(var K in ka)ka[K]&&(R=x(ka[K].childNodes),ka[K]=Z(Jb,R,e));M=x(M.childNodes)}else M=x(qc(b)).contents();y.empty();R=Z(Jb,M,e,void 0,void 0,{needsNewScope:u.$$isolateScope||u.$$newScope});R.$$slots=ka}if(u.template)if(P=
+!0,ba("template",v,u,y),v=u,O=B(u.template)?u.template(y,d):u.template,O=Na(O),u.replace){g=u;M=nc.test(O)?td(ja(u.templateNamespace,V(O))):[];b=M[0];if(1!==M.length||1!==b.nodeType)throw $("tplrt",Q,"");oa(f,y,b);C={$attr:{}};O=tc(b,[],C);var Ig=a.splice(sa+1,a.length-(sa+1));(s||t)&&fa(O,s,t);a=a.concat(O).concat(Ig);ga(d,C);C=a.length}else y.html(O);if(u.templateUrl)P=!0,ba("template",v,u,y),v=u,u.replace&&(g=u),p=ha(a.splice(sa,a.length-sa),y,d,f,G&&R,h,k,{controllerDirectives:J,newScopeDirective:t!==
+u&&t,newIsolateScopeDirective:s,templateDirective:v,nonTlbTranscludeDirective:L}),C=a.length;else if(u.compile)try{q=u.compile(y,d,R);var Y=u.$$originalDirective||u;B(q)?m(null,Va(Y,q),E,jb):q&&m(Va(Y,q.pre),Va(Y,q.post),E,jb)}catch(ca){c(ca,Aa(y))}u.terminal&&(p.terminal=!0,n=Math.max(n,u.priority))}p.scope=t&&!0===t.scope;p.transcludeOnThisElement=G;p.templateOnThisElement=P;p.transclude=R;l.hasElementTranscludeDirective=N;return p}function X(a,b,c,d){var e;if(C(b)){var f=b.match(l);b=b.substring(f[0].length);
+var g=f[1]||f[3],f="?"===f[2];"^^"===g?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e="^^"===g&&c[0]&&9===c[0].nodeType?null:g?c.inheritedData(h):c.data(h)}if(!e&&!f)throw $("ctreq",b,a);}else if(H(b))for(e=[],g=0,f=b.length;g<f;g++)e[g]=X(a,b[g],c,d);else D(b)&&(e={},r(b,function(b,f){e[f]=X(a,b,c,d)}));return e||null}function ea(a,b,c,d,e,f,g){var h=T(),k;for(k in d){var l=d[k],m={$scope:l===g||l.$$isolateScope?e:f,$element:a,$attrs:b,$transclude:c},p=l.controller;"@"===
+p&&(p=b[l.name]);m=M(p,m,!0,l.controllerAs);h[l.name]=m;a.data("$"+l.name+"Controller",m.instance)}return h}function fa(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=bc(a[d],{$$isolateScope:b,$$newScope:c})}function Y(b,c,e,g,h,k,l){if(c===h)return null;var m=null;if(f.hasOwnProperty(c)){h=a.get(c+"Directive");for(var p=0,n=h.length;p<n;p++)if(c=h[p],(A(g)||g>c.priority)&&-1!==c.restrict.indexOf(e)){k&&(c=bc(c,{$$start:k,$$end:l}));if(!c.$$bindings){var I=m=c,t=c.name,u={isolateScope:null,bindToController:null};
+D(I.scope)&&(!0===I.bindToController?(u.bindToController=d(I.scope,t,!0),u.isolateScope={}):u.isolateScope=d(I.scope,t,!1));D(I.bindToController)&&(u.bindToController=d(I.bindToController,t,!0));if(u.bindToController&&!I.controller)throw $("noctrl",t);m=m.$$bindings=u;D(m.isolateScope)&&(c.$$isolateBindings=m.isolateScope)}b.push(c);m=c}}return m}function ca(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d<e;d++)if(b=c[d],b.multiElement)return!0;return!1}function ga(a,b){var c=
+b.$attr,d=a.$attr;r(a,function(d,e){"$"!==e.charAt(0)&&(b[e]&&b[e]!==d&&(d=d.length?d+(("style"===e?";":" ")+b[e]):b[e]),a.$set(e,d,!0,c[e]))});r(b,function(b,e){a.hasOwnProperty(e)||"$"===e.charAt(0)||(a[e]=b,"class"!==e&&"style"!==e&&(d[e]=c[e]))})}function ha(a,b,d,f,g,h,k,l){var m=[],p,n,t=b[0],u=a.shift(),J=bc(u,{templateUrl:null,transclude:null,replace:null,$$originalDirective:u}),s=B(u.templateUrl)?u.templateUrl(b,d):u.templateUrl,L=u.templateNamespace;b.empty();e(s).then(function(c){var e,
+I;c=Na(c);if(u.replace){c=nc.test(c)?td(ja(L,V(c))):[];e=c[0];if(1!==c.length||1!==e.nodeType)throw $("tplrt",u.name,s);c={$attr:{}};oa(f,b,e);var v=tc(e,[],c);D(u.scope)&&fa(v,!0);a=v.concat(a);ga(d,c)}else e=t,b.html(c);a.unshift(J);p=aa(a,e,d,g,b,u,h,k,l);r(f,function(a,c){a===e&&(f[c]=b[0])});for(n=Xa(b[0].childNodes,g);m.length;){c=m.shift();I=m.shift();var y=m.shift(),P=m.shift(),v=b[0];if(!c.$$destroyed){if(I!==t){var G=I.className;l.hasElementTranscludeDirective&&u.replace||(v=qc(e));oa(y,
+x(I),v);sa(x(v),G)}I=p.transcludeOnThisElement?ka(c,p.transclude,P):P;p(n,c,v,f,I)}}m=null}).catch(function(a){dc(a)&&c(a)});return function(a,b,c,d,e){a=e;b.$$destroyed||(m?m.push(b,c,d,a):(p.transcludeOnThisElement&&(a=ka(b,p.transclude,e)),p(n,b,c,d,a)))}}function ia(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 ba(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw $("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),
+a,Aa(d));}function na(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&da.$$addBindingClass(a);return function(a,c){var e=c.parent();b||da.$$addBindingClass(e);da.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function ja(a,b){a=K(a||"html");switch(a){case "svg":case "math":var c=z.document.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function qa(a,b){if("srcdoc"===
+b)return u.HTML;if("src"===b||"ngSrc"===b)return-1===["img","video","audio","source","track"].indexOf(a)?u.RESOURCE_URL:u.MEDIA_URL;if("xlinkHref"===b)return"image"===a?u.MEDIA_URL:"a"===a?u.URL:u.RESOURCE_URL;if("form"===a&&"action"===b||"base"===a&&"href"===b||"link"===a&&"href"===b)return u.RESOURCE_URL;if("a"===a&&("href"===b||"ngHref"===b))return u.URL}function ya(a,b){var c=b.toLowerCase();return v[a+"|"+c]||v["*|"+c]}function za(a){return ma(u.valueOf(a),"ng-prop-srcset")}function Ea(a,b,c,
+d){if(m.test(d))throw $("nodomevents");a=ua(a);var e=ya(a,d),f=Ta;"srcset"!==d||"img"!==a&&"source"!==a?e&&(f=u.getTrusted.bind(u,e)):f=za;b.push({priority:100,compile:function(a,b){var e=p(b[c]),g=p(b[c],function(a){return u.valueOf(a)});return{pre:function(a,b){function c(){var g=e(a);b[0][d]=f(g)}c();a.$watch(g,c)}}}})}function Ia(a,c,d,e,f){var g=ua(a),k=qa(g,e),l=h[e]||f,p=b(d,!f,k,l);if(p){if("multiple"===e&&"select"===g)throw $("selmulti",Aa(a));if(m.test(e))throw $("nodomevents");c.push({priority:100,
+compile:function(){return{pre:function(a,c,f){c=f.$$observers||(f.$$observers=T());var g=f[e];g!==d&&(p=g&&b(g,!0,k,l),d=g);p&&(f[e]=p(a),(c[e]||(c[e]=[])).$$inter=!0,(f.$$observers&&f.$$observers[e].$$scope||a).$watch(p,function(a,b){"class"===e&&a!==b?f.$updateClass(a,b):f.$set(e,a)}))}}}})}}function oa(a,b,c){var d=b[0],e=b.length,f=d.parentNode,g,h;if(a)for(g=0,h=a.length;g<h;g++)if(a[g]===d){a[g++]=c;h=g+e-1;for(var k=a.length;g<k;g++,h++)h<k?a[g]=a[h]:delete a[g];a.length-=e-1;a.context===d&&
+(a.context=c);break}f&&f.replaceChild(c,d);a=z.document.createDocumentFragment();for(g=0;g<e;g++)a.appendChild(b[g]);x.hasData(d)&&(x.data(c,x.data(d)),x(d).off("$destroy"));x.cleanData(a.querySelectorAll("*"));for(g=1;g<e;g++)delete b[g];b[0]=c;b.length=1}function Ba(a,b){return S(function(){return a.apply(null,arguments)},a,b)}function Ca(a,b,d,e,f,g){try{a(b,d,e,f,g)}catch(h){c(h,Aa(d))}}function ra(a,b){if(s)throw $("missingattr",a,b);}function Da(a,c,d,e,f){function g(b,c,e){B(d.$onChanges)&&
+!ec(c,e)&&(Ua||(a.$$postDigest(q),Ua=[]),m||(m={},Ua.push(h)),m[b]&&(e=m[b].previousValue),m[b]=new Kb(e,c))}function h(){d.$onChanges(m);m=void 0}var k=[],l={},m;r(e,function(e,h){var m=e.attrName,n=e.optional,I,t,u,s;switch(e.mode){case "@":n||ta.call(c,m)||(ra(m,f.name),d[h]=c[m]=void 0);n=c.$observe(m,function(a){if(C(a)||Ga(a))g(h,a,d[h]),d[h]=a});c.$$observers[m].$$scope=a;I=c[m];C(I)?d[h]=b(I)(a):Ga(I)&&(d[h]=I);l[h]=new Kb(uc,d[h]);k.push(n);break;case "=":if(!ta.call(c,m)){if(n)break;ra(m,
+f.name);c[m]=void 0}if(n&&!c[m])break;t=p(c[m]);s=t.literal?va:ec;u=t.assign||function(){I=d[h]=t(a);throw $("nonassign",c[m],m,f.name);};I=d[h]=t(a);n=function(b){s(b,d[h])||(s(b,I)?u(a,b=d[h]):d[h]=b);return I=b};n.$stateful=!0;n=e.collection?a.$watchCollection(c[m],n):a.$watch(p(c[m],n),null,t.literal);k.push(n);break;case "<":if(!ta.call(c,m)){if(n)break;ra(m,f.name);c[m]=void 0}if(n&&!c[m])break;t=p(c[m]);var v=t.literal,L=d[h]=t(a);l[h]=new Kb(uc,d[h]);n=a[e.collection?"$watchCollection":"$watch"](t,
+function(a,b){if(b===a){if(b===L||v&&va(b,L))return;b=L}g(h,a,b);d[h]=a});k.push(n);break;case "&":n||ta.call(c,m)||ra(m,f.name);t=c.hasOwnProperty(m)?p(c[m]):E;if(t===E&&n)break;d[h]=function(b){return t(a,b)}}});return{initialChanges:l,removeWatches:k.length&&function(){for(var a=0,b=k.length;a<b;++a)k[a]()}}}var Ma=/^\w/,Fa=z.document.createElement("div"),Oa=t,Qa=N,Ja=G,Ua;w.prototype={$normalize:xa,$addClass:function(a){a&&0<a.length&&R.addClass(this.$$element,a)},$removeClass:function(a){a&&
+0<a.length&&R.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=ud(a,b);c&&c.length&&R.addClass(this.$$element,c);(c=ud(b,a))&&c.length&&R.removeClass(this.$$element,c)},$set:function(a,b,d,e){var f=nd(this.$$element[0],a),g=vd[a],h=a;f?(this.$$element.prop(a,b),e=f):g&&(this[g]=b,h=g);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=Xc(a,"-"));"img"===ua(this.$$element)&&"srcset"===a&&(this[a]=b=ma(b,"$set('srcset', value)"));!1!==d&&(null===b||A(b)?this.$$element.removeAttr(e):
+Ma.test(e)?f&&!1===b?this.$$element.removeAttr(e):this.$$element.attr(e,b):O(this.$$element[0],e,b));(a=this.$$observers)&&r(a[h],function(a){try{a(b)}catch(d){c(d)}})},$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=T()),e=d[a]||(d[a]=[]);e.push(b);L.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||A(c[a])||b(c[a])});return function(){cb(e,b)}}};var Ka=b.startSymbol(),La=b.endSymbol(),Na="{{"===Ka&&"}}"===La?Ta:function(a){return a.replace(/\{\{/g,Ka).replace(/}}/g,La)},Ra=
+/^ng(Attr|Prop|On)([A-Z].*)$/,Sa=/^(.+)Start$/;da.$$addBindingInfo=n?function(a,b){var c=a.data("$binding")||[];H(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:E;da.$$addBindingClass=n?function(a){sa(a,"ng-binding")}:E;da.$$addScopeInfo=n?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:E;da.$$addScopeClass=n?function(a,b){sa(a,b?"ng-isolate-scope":"ng-scope")}:E;da.$$createComment=function(a,b){var c="";n&&(c=" "+(a||"")+": ",b&&(c+=b+" "));return z.document.createComment(c)};
+return da}]}function Kb(a,b){this.previousValue=a;this.currentValue=b}function xa(a){return a.replace(rd,"").replace(Jg,function(a,d,c){return c?d.toUpperCase():d})}function ud(a,b){var d="",c=a.split(/\s+/),e=b.split(/\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],k=0;k<e.length;k++)if(g===e[k])continue a;d+=(0<d.length?" ":"")+g}return d}function td(a){a=x(a);var b=a.length;if(1>=b)return a;for(;b--;){var d=a[b];(8===d.nodeType||d.nodeType===Pa&&""===d.nodeValue.trim())&&Kg.call(a,b,1)}return a}
+function Gg(a,b){if(b&&C(b))return b;if(C(a)){var d=wd.exec(a);if(d)return d[3]}}function Kf(){var a={};this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,d){Ja(b,"controller");D(b)?S(a,b):a[b]=d};this.$get=["$injector",function(b){function d(a,b,d,g){if(!a||!D(a.$scope))throw F("$controller")("noscp",g,b);a.$scope[b]=d}return function(c,e,f,g){var k,h,l;f=!0===f;g&&C(g)&&(l=g);if(C(c)){g=c.match(wd);if(!g)throw xd("ctrlfmt",c);h=g[1];l=l||g[3];c=a.hasOwnProperty(h)?a[h]:Le(e.$scope,
+h,!0);if(!c)throw xd("ctrlreg",h);tb(c,h,!0)}if(f)return f=(H(c)?c[c.length-1]:c).prototype,k=Object.create(f||null),l&&d(e,l,k,h||c.name),S(function(){var a=b.invoke(c,k,e,h);a!==k&&(D(a)||B(a))&&(k=a,l&&d(e,l,k,h||c.name));return k},{instance:k,identifier:l});k=b.instantiate(c,e,h);l&&d(e,l,k,h||c.name);return k}}]}function Lf(){this.$get=["$window",function(a){return x(a.document)}]}function Mf(){this.$get=["$document","$rootScope",function(a,b){function d(){e=c.hidden}var c=a[0],e=c&&c.hidden;
+a.on("visibilitychange",d);b.$on("$destroy",function(){a.off("visibilitychange",d)});return function(){return e}}]}function Nf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function vc(a){return D(a)?ha(a)?a.toISOString():eb(a):a}function Tf(){this.$get=function(){return function(a){if(!a)return"";var b=[];Qc(a,function(a,c){null===a||A(a)||B(a)||(H(a)?r(a,function(a){b.push(ba(c)+"="+ba(vc(a)))}):b.push(ba(c)+"="+ba(vc(a))))});return b.join("&")}}}function Uf(){this.$get=
+function(){return function(a){function b(a,e,f){H(a)?r(a,function(a,c){b(a,e+"["+(D(a)?c:"")+"]")}):D(a)&&!ha(a)?Qc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):(B(a)&&(a=a()),d.push(ba(e)+"="+(null==a?"":ba(vc(a)))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function wc(a,b){if(C(a)){var d=a.replace(Lg,"").trim();if(d){var c=b("Content-Type"),c=c&&0===c.indexOf(yd),e;(e=c)||(e=(e=d.match(Mg))&&Ng[e[0]].test(d));if(e)try{a=Tc(d)}catch(f){if(!c)return a;throw Lb("baddata",a,f);}}}return a}
+function zd(a){var b=T(),d;C(a)?r(a.split("\n"),function(a){d=a.indexOf(":");var e=K(V(a.substr(0,d)));a=V(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):D(a)&&r(a,function(a,d){var f=K(d),g=V(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function Ad(a){var b;return function(d){b||(b=zd(a));return d?(d=b[K(d)],void 0===d&&(d=null),d):b}}function Bd(a,b,d,c){if(B(c))return c(a,b,d);r(c,function(c){a=c(a,b,d)});return a}function Sf(){var a=this.defaults={transformResponse:[wc],transformRequest:[function(a){return D(a)&&
+"[object File]"!==la.call(a)&&"[object Blob]"!==la.call(a)&&"[object FormData]"!==la.call(a)?eb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ja(xc),put:ja(xc),patch:ja(xc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer",jsonpCallbackParam:"callback"},b=!1;this.useApplyAsync=function(a){return w(a)?(b=!!a,this):b};var d=this.interceptors=[],c=this.xsrfWhitelistedOrigins=[];this.$get=["$browser","$httpBackend","$$cookieReader",
+"$cacheFactory","$rootScope","$q","$injector","$sce",function(e,f,g,k,h,l,m,p){function n(b){function c(a,b){for(var d=0,e=b.length;d<e;){var f=b[d++],g=b[d++];a=a.then(f,g)}b.length=0;return a}function d(a,b){var c,e={};r(a,function(a,d){B(a)?(c=a(b),null!=c&&(e[d]=c)):e[d]=a});return e}function f(a){var b=S({},a);b.data=Bd(a.data,a.headers,a.status,g.transformResponse);a=a.status;return 200<=a&&300>a?b:l.reject(b)}if(!D(b))throw F("$http")("badreq",b);if(!C(p.valueOf(b.url)))throw F("$http")("badreq",
+b.url);var g=S({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer,jsonpCallbackParam:a.jsonpCallbackParam},b);g.headers=function(b){var c=a.headers,e=S({},b.headers),f,g,h,c=S({},c.common,c[K(b.method)]);a:for(f in c){g=K(f);for(h in e)if(K(h)===g)continue a;e[f]=c[f]}return d(e,ja(b))}(b);g.method=vb(g.method);g.paramSerializer=C(g.paramSerializer)?m.get(g.paramSerializer):g.paramSerializer;e.$$incOutstandingRequestCount("$http");
+var h=[],k=[];b=l.resolve(g);r(v,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&k.push(a.response,a.responseError)});b=c(b,h);b=b.then(function(b){var c=b.headers,d=Bd(b.data,Ad(c),void 0,b.transformRequest);A(d)&&r(c,function(a,b){"content-type"===K(b)&&delete c[b]});A(b.withCredentials)&&!A(a.withCredentials)&&(b.withCredentials=a.withCredentials);return s(b,d).then(f,f)});b=c(b,k);return b=b.finally(function(){e.$$completeOutstandingRequest(E,
+"$http")})}function s(c,d){function e(a){if(a){var c={};r(a,function(a,d){c[d]=function(c){function d(){a(c)}b?h.$applyAsync(d):h.$$phase?d():h.$apply(d)}});return c}}function k(a,c,d,e,f){function g(){m(c,a,d,e,f)}R&&(200<=a&&300>a?R.put(O,[a,c,zd(d),e,f]):R.remove(O));b?h.$applyAsync(g):(g(),h.$$phase||h.$apply())}function m(a,b,d,e,f){b=-1<=b?b:0;(200<=b&&300>b?L.resolve:L.reject)({data:a,status:b,headers:Ad(d),config:c,statusText:e,xhrStatus:f})}function s(a){m(a.data,a.status,ja(a.headers()),
+a.statusText,a.xhrStatus)}function v(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var L=l.defer(),u=L.promise,R,q,ma=c.headers,x="jsonp"===K(c.method),O=c.url;x?O=p.getTrustedResourceUrl(O):C(O)||(O=p.valueOf(O));O=G(O,c.paramSerializer(c.params));x&&(O=t(O,c.jsonpCallbackParam));n.pendingRequests.push(c);u.then(v,v);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(R=D(c.cache)?c.cache:D(a.cache)?a.cache:N);R&&(q=R.get(O),w(q)?q&&B(q.then)?q.then(s,
+s):H(q)?m(q[1],q[0],ja(q[2]),q[3],q[4]):m(q,200,{},"OK","complete"):R.put(O,u));A(q)&&((q=kc(c.url)?g()[c.xsrfCookieName||a.xsrfCookieName]:void 0)&&(ma[c.xsrfHeaderName||a.xsrfHeaderName]=q),f(c.method,O,d,k,ma,c.timeout,c.withCredentials,c.responseType,e(c.eventHandlers),e(c.uploadEventHandlers)));return u}function G(a,b){0<b.length&&(a+=(-1===a.indexOf("?")?"?":"&")+b);return a}function t(a,b){var c=a.split("?");if(2<c.length)throw Lb("badjsonp",a);c=hc(c[1]);r(c,function(c,d){if("JSON_CALLBACK"===
+c)throw Lb("badjsonp",a);if(d===b)throw Lb("badjsonp",b,a);});return a+=(-1===a.indexOf("?")?"?":"&")+b+"=JSON_CALLBACK"}var N=k("$http");a.paramSerializer=C(a.paramSerializer)?m.get(a.paramSerializer):a.paramSerializer;var v=[];r(d,function(a){v.unshift(C(a)?m.get(a):m.invoke(a))});var kc=Og(c);n.pendingRequests=[];(function(a){r(arguments,function(a){n[a]=function(b,c){return n(S({},c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){r(arguments,function(a){n[a]=function(b,
+c,d){return n(S({},d||{},{method:a,url:b,data:c}))}})})("post","put","patch");n.defaults=a;return n}]}function Wf(){this.$get=function(){return function(){return new z.XMLHttpRequest}}}function Vf(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(a,b,d,c){return Pg(a,c,a.defer,b,d[0])}]}function Pg(a,b,d,c,e){function f(a,b,d){a=a.replace("JSON_CALLBACK",b);var f=e.createElement("script"),m=null;f.type="text/javascript";f.src=a;f.async=!0;m=function(a){f.removeEventListener("load",
+m);f.removeEventListener("error",m);e.body.removeChild(f);f=null;var g=-1,s="unknown";a&&("load"!==a.type||c.wasCalled(b)||(a={type:"error"}),s=a.type,g="error"===a.type?404:200);d&&d(g,s)};f.addEventListener("load",m);f.addEventListener("error",m);e.body.appendChild(f);return m}return function(e,k,h,l,m,p,n,s,G,t){function N(a){J="timeout"===a;pa&&pa();y&&y.abort()}function v(a,b,c,e,f,g){w(P)&&d.cancel(P);pa=y=null;a(b,c,e,f,g)}k=k||a.url();if("jsonp"===K(e))var q=c.createCallback(k),pa=f(k,q,function(a,
+b){var d=200===a&&c.getResponse(q);v(l,a,d,"",b,"complete");c.removeCallback(q)});else{var y=b(e,k),J=!1;y.open(e,k,!0);r(m,function(a,b){w(a)&&y.setRequestHeader(b,a)});y.onload=function(){var a=y.statusText||"",b="response"in y?y.response:y.responseText,c=1223===y.status?204:y.status;0===c&&(c=b?200:"file"===ga(k).protocol?404:0);v(l,c,b,y.getAllResponseHeaders(),a,"complete")};y.onerror=function(){v(l,-1,null,null,"","error")};y.ontimeout=function(){v(l,-1,null,null,"","timeout")};y.onabort=function(){v(l,
+-1,null,null,"",J?"timeout":"abort")};r(G,function(a,b){y.addEventListener(b,a)});r(t,function(a,b){y.upload.addEventListener(b,a)});n&&(y.withCredentials=!0);if(s)try{y.responseType=s}catch(I){if("json"!==s)throw I;}y.send(A(h)?null:h)}if(0<p)var P=d(function(){N("timeout")},p);else p&&B(p.then)&&p.then(function(){N(w(p.$$timeoutId)?"timeout":"abort")})}}function Pf(){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(d,c,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(p,a).replace(n,b)}function k(a,b,c,d){var e=a.$watch(function(a){e();return d(a)},b,c);return e}function h(f,h,n,p){function v(a){try{return a=n&&!r?e.getTrusted(n,a):e.valueOf(a),p&&!w(a)?a:jc(a)}catch(b){c(Ma.interr(f,b))}}var r=n===e.URL||n===e.MEDIA_URL;if(!f.length||-1===f.indexOf(a)){if(h)return;h=g(f);r&&(h=e.getTrusted(n,h));h=ia(h);h.exp=f;h.expressions=[];h.$$watchDelegate=
+k;return h}p=!!p;for(var q,y,J=0,I=[],P,Q=f.length,M=[],L=[],u;J<Q;)if(-1!==(q=f.indexOf(a,J))&&-1!==(y=f.indexOf(b,q+l)))J!==q&&M.push(g(f.substring(J,q))),J=f.substring(q+l,y),I.push(J),J=y+m,L.push(M.length),M.push("");else{J!==Q&&M.push(g(f.substring(J)));break}u=1===M.length&&1===L.length;var R=r&&u?void 0:v;P=I.map(function(a){return d(a,R)});if(!h||I.length){var x=function(a){for(var b=0,c=I.length;b<c;b++){if(p&&A(a[b]))return;M[L[b]]=a[b]}if(r)return e.getTrusted(n,u?M[0]:M.join(""));n&&
+1<M.length&&Ma.throwNoconcat(f);return M.join("")};return S(function(a){var b=0,d=I.length,e=Array(d);try{for(;b<d;b++)e[b]=P[b](a);return x(e)}catch(g){c(Ma.interr(f,g))}},{exp:f,expressions:I,$$watchDelegate:function(a,b){var c;return a.$watchGroup(P,function(d,e){var f=x(d);b.call(this,f,d!==e?c:f,a);c=f})}})}}var l=a.length,m=b.length,p=new RegExp(a.replace(/./g,f),"g"),n=new RegExp(b.replace(/./g,f),"g");h.startSymbol=function(){return a};h.endSymbol=function(){return b};return h}]}function Qf(){this.$get=
+["$$intervalFactory","$window",function(a,b){var d={},c=function(a){b.clearInterval(a);delete d[a]},e=a(function(a,c,e){a=b.setInterval(a,c);d[a]=e;return a},c);e.cancel=function(a){if(!a)return!1;if(!a.hasOwnProperty("$$intervalId"))throw Qg("badprom");if(!d.hasOwnProperty(a.$$intervalId))return!1;a=a.$$intervalId;var b=d[a],e=b.promise;e.$$state&&(e.$$state.pur=!0);b.reject("canceled");c(a);return!0};return e}]}function Rf(){this.$get=["$browser","$q","$$q","$rootScope",function(a,b,d,c){return function(e,
+f){return function(g,k,h,l){function m(){p?g.apply(null,n):g(s)}var p=4<arguments.length,n=p?Ha.call(arguments,4):[],s=0,G=w(l)&&!l,t=(G?d:b).defer(),r=t.promise;h=w(h)?h:0;r.$$intervalId=e(function(){G?a.defer(m):c.$evalAsync(m);t.notify(s++);0<h&&s>=h&&(t.resolve(s),f(r.$$intervalId));G||c.$apply()},k,t,G);return r}}}]}function Cd(a,b){var d=ga(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=fa(d.port)||Rg[d.protocol]||null}function Dd(a,b,d){if(Sg.test(a))throw kb("badpath",a);var c="/"!==
+a.charAt(0);c&&(a="/"+a);a=ga(a);for(var c=(c&&"/"===a.pathname.charAt(0)?a.pathname.substring(1):a.pathname).split("/"),e=c.length;e--;)c[e]=decodeURIComponent(c[e]),d&&(c[e]=c[e].replace(/\//g,"%2F"));d=c.join("/");b.$$path=d;b.$$search=hc(a.search);b.$$hash=decodeURIComponent(a.hash);b.$$path&&"/"!==b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function yc(a,b){return a.slice(0,b.length)===b}function ya(a,b){if(yc(b,a))return b.substr(a.length)}function Da(a){var b=a.indexOf("#");return-1===b?a:
+a.substr(0,b)}function zc(a,b,d){this.$$html5=!0;d=d||"";Cd(a,this);this.$$parse=function(a){var d=ya(b,a);if(!C(d))throw kb("ipthprfx",a,b);Dd(d,this,!0);this.$$path||(this.$$path="/");this.$$compose()};this.$$normalizeUrl=function(a){return b+a.substr(1)};this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;w(f=ya(a,c))?(g=f,g=d&&w(f=ya(d,f))?b+(ya("/",f)||f):a+g):w(f=ya(b,c))?g=b+f:b===c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function Ac(a,b,d){Cd(a,this);
+this.$$parse=function(c){var e=ya(a,c)||ya(b,c),f;A(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",A(e)&&(a=c,this.replace())):(f=ya(d,e),A(f)&&(f=e));Dd(f,this,!1);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;yc(f,e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};this.$$normalizeUrl=function(b){return a+(b?d+b:"")};this.$$parseLinkUrl=function(b,d){return Da(a)===Da(b)?(this.$$parse(b),!0):!1}}function Ed(a,b,d){this.$$html5=!0;Ac.apply(this,arguments);this.$$parseLinkUrl=
+function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a===Da(c)?f=c:(g=ya(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);return!!f};this.$$normalizeUrl=function(b){return a+d+b}}function Mb(a){return function(){return this[a]}}function Fd(a,b){return function(d){if(A(d))return this[a];this[a]=b(d);this.$$compose();return this}}function Yf(){var a="!",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return w(b)?(a=b,this):a};this.html5Mode=function(a){if(Ga(a))return b.enabled=
+a,this;if(D(a)){Ga(a.enabled)&&(b.enabled=a.enabled);Ga(a.requireBase)&&(b.requireBase=a.requireBase);if(Ga(a.rewriteLinks)||C(a.rewriteLinks))b.rewriteLinks=a.rewriteLinks;return this}return b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function k(a,b){return a===b||ga(a).href===ga(b).href}function h(a,b,d){var e=m.url(),f=m.$$state;try{c.url(a,b,d),m.$$state=c.state()}catch(g){throw m.url(e),m.$$state=f,g;}}function l(a,b){d.$broadcast("$locationChangeSuccess",
+m.absUrl(),a,m.$$state,b)}var m,p;p=c.baseHref();var n=c.url(),s;if(b.enabled){if(!p&&b.requireBase)throw kb("nobase");s=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(p||"/");p=e.history?zc:Ed}else s=Da(n),p=Ac;var r=s.substr(0,Da(s).lastIndexOf("/")+1);m=new p(s,r,"#"+a);m.$$parseLinkUrl(n,n);m.$$state=c.state();var t=/^\s*(javascript|mailto):/i;f.on("click",function(a){var e=b.rewriteLinks;if(e&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!==a.which&&2!==a.button){for(var g=x(a.target);"a"!==ua(g[0]);)if(g[0]===
+f[0]||!(g=g.parent())[0])return;if(!C(e)||!A(g.attr(e))){var e=g.prop("href"),h=g.attr("href")||g.attr("xlink:href");D(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=ga(e.animVal).href);t.test(e)||!e||g.attr("target")||a.isDefaultPrevented()||!m.$$parseLinkUrl(e,h)||(a.preventDefault(),m.absUrl()!==c.url()&&d.$apply())}}});m.absUrl()!==n&&c.url(m.absUrl(),!0);var N=!0;c.onUrlChange(function(a,b){yc(a,r)?(d.$evalAsync(function(){var c=m.absUrl(),e=m.$$state,f;m.$$parse(a);m.$$state=b;f=d.$broadcast("$locationChangeStart",
+a,c,b,e).defaultPrevented;m.absUrl()===a&&(f?(m.$$parse(c),m.$$state=e,h(c,!1,e)):(N=!1,l(c,e)))}),d.$$phase||d.$digest()):g.location.href=a});d.$watch(function(){if(N||m.$$urlUpdatedByLocation){m.$$urlUpdatedByLocation=!1;var a=c.url(),b=m.absUrl(),f=c.state(),g=m.$$replace,n=!k(a,b)||m.$$html5&&e.history&&f!==m.$$state;if(N||n)N=!1,d.$evalAsync(function(){var b=m.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,m.$$state,f).defaultPrevented;m.absUrl()===b&&(c?(m.$$parse(a),m.$$state=f):(n&&h(b,
+g,f===m.$$state?null:m.$$state),l(a,f)))})}m.$$replace=!1});return m}]}function Zf(){var a=!0,b=this;this.debugEnabled=function(b){return w(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){dc(a)&&(a.stack&&f?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));return a}function e(a){var b=d.console||{},e=b[a]||b.log||E;return function(){var a=[];r(arguments,function(b){a.push(c(b))});return Function.prototype.apply.call(e,
+b,a)}}var f=wa||/\bEdge\//.test(d.navigator&&d.navigator.userAgent);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 Tg(a){return a+""}function Ug(a,b){return"undefined"!==typeof a?a:b}function Gd(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function Vg(a,b){switch(a.type){case q.MemberExpression:if(a.computed)return!1;break;case q.UnaryExpression:return 1;case q.BinaryExpression:return"+"!==
+a.operator?1:!1;case q.CallExpression:return!1}return void 0===b?Hd:b}function Z(a,b,d){var c,e,f=a.isPure=Vg(a,d);switch(a.type){case q.Program:c=!0;r(a.body,function(a){Z(a.expression,b,f);c=c&&a.expression.constant});a.constant=c;break;case q.Literal:a.constant=!0;a.toWatch=[];break;case q.UnaryExpression:Z(a.argument,b,f);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case q.BinaryExpression:Z(a.left,b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=
+a.left.toWatch.concat(a.right.toWatch);break;case q.LogicalExpression:Z(a.left,b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case q.ConditionalExpression:Z(a.test,b,f);Z(a.alternate,b,f);Z(a.consequent,b,f);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case q.Identifier:a.constant=!1;a.toWatch=[a];break;case q.MemberExpression:Z(a.object,b,f);a.computed&&Z(a.property,b,f);a.constant=a.object.constant&&
+(!a.computed||a.property.constant);a.toWatch=a.constant?[]:[a];break;case q.CallExpression:c=d=a.filter?!b(a.callee.name).$stateful:!1;e=[];r(a.arguments,function(a){Z(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=d?e:[a];break;case q.AssignmentExpression:Z(a.left,b,f);Z(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case q.ArrayExpression:c=!0;e=[];r(a.elements,function(a){Z(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;
+a.toWatch=e;break;case q.ObjectExpression:c=!0;e=[];r(a.properties,function(a){Z(a.value,b,f);c=c&&a.value.constant;e.push.apply(e,a.value.toWatch);a.computed&&(Z(a.key,b,!1),c=c&&a.key.constant,e.push.apply(e,a.key.toWatch))});a.constant=c;a.toWatch=e;break;case q.ThisExpression:a.constant=!1;a.toWatch=[];break;case q.LocalsExpression:a.constant=!1,a.toWatch=[]}}function Id(a){if(1===a.length){a=a[0].expression;var b=a.toWatch;return 1!==b.length?b:b[0]!==a?b:void 0}}function Jd(a){return a.type===
+q.Identifier||a.type===q.MemberExpression}function Kd(a){if(1===a.body.length&&Jd(a.body[0].expression))return{type:q.AssignmentExpression,left:a.body[0].expression,right:{type:q.NGValueParameter},operator:"="}}function Ld(a){this.$filter=a}function Md(a){this.$filter=a}function Nb(a,b,d){this.ast=new q(a,d);this.astCompiler=d.csp?new Md(b):new Ld(b)}function Bc(a){return B(a.valueOf)?a.valueOf():Wg.call(a)}function $f(){var a=T(),b={"true":!0,"false":!1,"null":null,undefined:void 0},d,c;this.addLiteral=
+function(a,c){b[a]=c};this.setIdentifierFns=function(a,b){d=a;c=b;return this};this.$get=["$filter",function(e){function f(b,c){var d,f;switch(typeof b){case "string":return f=b=b.trim(),d=a[f],d||(d=new Ob(G),d=(new Nb(d,e,G)).parse(b),a[f]=p(d)),s(d,c);case "function":return s(b,c);default:return s(E,c)}}function g(a,b,c){return null==a||null==b?a===b:"object"!==typeof a||(a=Bc(a),"object"!==typeof a||c)?a===b||a!==a&&b!==b:!1}function k(a,b,c,d,e){var f=d.inputs,h;if(1===f.length){var k=g,f=f[0];
+return a.$watch(function(a){var b=f(a);g(b,k,f.isPure)||(h=d(a,void 0,void 0,[b]),k=b&&Bc(b));return h},b,c,e)}for(var l=[],m=[],n=0,p=f.length;n<p;n++)l[n]=g,m[n]=null;return a.$watch(function(a){for(var b=!1,c=0,e=f.length;c<e;c++){var k=f[c](a);if(b||(b=!g(k,l[c],f[c].isPure)))m[c]=k,l[c]=k&&Bc(k)}b&&(h=d(a,void 0,void 0,m));return h},b,c,e)}function h(a,b,c,d,e){function f(){h(m)&&k()}function g(a,b,c,d){m=u&&d?d[0]:n(a,b,c,d);h(m)&&a.$$postDigest(f);return s(m)}var h=d.literal?l:w,k,m,n=d.$$intercepted||
+d,s=d.$$interceptor||Ta,u=d.inputs&&!n.inputs;g.literal=d.literal;g.constant=d.constant;g.inputs=d.inputs;p(g);return k=a.$watch(g,b,c,e)}function l(a){var b=!0;r(a,function(a){w(a)||(b=!1)});return b}function m(a,b,c,d){var e=a.$watch(function(a){e();return d(a)},b,c);return e}function p(a){a.constant?a.$$watchDelegate=m:a.oneTime?a.$$watchDelegate=h:a.inputs&&(a.$$watchDelegate=k);return a}function n(a,b){function c(d){return b(a(d))}c.$stateful=a.$stateful||b.$stateful;c.$$pure=a.$$pure&&b.$$pure;
+return c}function s(a,b){if(!b)return a;a.$$interceptor&&(b=n(a.$$interceptor,b),a=a.$$intercepted);var c=!1,d=function(d,e,f,g){d=c&&g?g[0]:a(d,e,f,g);return b(d)};d.$$intercepted=a;d.$$interceptor=b;d.literal=a.literal;d.oneTime=a.oneTime;d.constant=a.constant;b.$stateful||(c=!a.inputs,d.inputs=a.inputs?a.inputs:[a],b.$$pure||(d.inputs=d.inputs.map(function(a){return a.isPure===Hd?function(b){return a(b)}:a})));return p(d)}var G={csp:Ba().noUnsafeEval,literals:Ia(b),isIdentifierStart:B(d)&&d,isIdentifierContinue:B(c)&&
+c};f.$$getAst=function(a){var b=new Ob(G);return(new Nb(b,e,G)).getAst(a).ast};return f}]}function bg(){var a=!0;this.$get=["$rootScope","$exceptionHandler",function(b,d){return Nd(function(a){b.$evalAsync(a)},d,a)}];this.errorOnUnhandledRejections=function(b){return w(b)?(a=b,this):a}}function cg(){var a=!0;this.$get=["$browser","$exceptionHandler",function(b,d){return Nd(function(a){b.defer(a)},d,a)}];this.errorOnUnhandledRejections=function(b){return w(b)?(a=b,this):a}}function Nd(a,b,d){function c(){return new e}
+function e(){var a=this.promise=new f;this.resolve=function(b){h(a,b)};this.reject=function(b){m(a,b)};this.notify=function(b){n(a,b)}}function f(){this.$$state={status:0}}function g(){for(;!w&&x.length;){var a=x.shift();if(!a.pur){a.pur=!0;var c=a.value,c="Possibly unhandled rejection: "+("function"===typeof c?c.toString().replace(/ \{[\s\S]*$/,""):A(c)?"undefined":"string"!==typeof c?Ne(c,void 0):c);dc(a.value)?b(a.value,c):b(c)}}}function k(c){!d||c.pending||2!==c.status||c.pur||(0===w&&0===x.length&&
+a(g),x.push(c));!c.processScheduled&&c.pending&&(c.processScheduled=!0,++w,a(function(){var e,f,k;k=c.pending;c.processScheduled=!1;c.pending=void 0;try{for(var l=0,n=k.length;l<n;++l){c.pur=!0;f=k[l][0];e=k[l][c.status];try{B(e)?h(f,e(c.value)):1===c.status?h(f,c.value):m(f,c.value)}catch(p){m(f,p),p&&!0===p.$$passToExceptionHandler&&b(p)}}}finally{--w,d&&0===w&&a(g)}}))}function h(a,b){a.$$state.status||(b===a?p(a,v("qcycle",b)):l(a,b))}function l(a,b){function c(b){g||(g=!0,l(a,b))}function d(b){g||
+(g=!0,p(a,b))}function e(b){n(a,b)}var f,g=!1;try{if(D(b)||B(b))f=b.then;B(f)?(a.$$state.status=-1,f.call(b,c,d,e)):(a.$$state.value=b,a.$$state.status=1,k(a.$$state))}catch(h){d(h)}}function m(a,b){a.$$state.status||p(a,b)}function p(a,b){a.$$state.value=b;a.$$state.status=2;k(a.$$state)}function n(c,d){var e=c.$$state.pending;0>=c.$$state.status&&e&&e.length&&a(function(){for(var a,c,f=0,g=e.length;f<g;f++){c=e[f][0];a=e[f][3];try{n(c,B(a)?a(d):d)}catch(h){b(h)}}})}function s(a){var b=new f;m(b,
+a);return b}function G(a,b,c){var d=null;try{B(c)&&(d=c())}catch(e){return s(e)}return d&&B(d.then)?d.then(function(){return b(a)},s):b(a)}function t(a,b,c,d){var e=new f;h(e,a);return e.then(b,c,d)}function q(a){if(!B(a))throw v("norslvr",a);var b=new f;a(function(a){h(b,a)},function(a){m(b,a)});return b}var v=F("$q",TypeError),w=0,x=[];S(f.prototype,{then:function(a,b,c){if(A(a)&&A(b)&&A(c))return this;var d=new f;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,a,b,c]);
+0<this.$$state.status&&k(this.$$state);return d},"catch":function(a){return this.then(null,a)},"finally":function(a,b){return this.then(function(b){return G(b,y,a)},function(b){return G(b,s,a)},b)}});var y=t;q.prototype=f.prototype;q.defer=c;q.reject=s;q.when=t;q.resolve=y;q.all=function(a){var b=new f,c=0,d=H(a)?[]:{};r(a,function(a,e){c++;t(a).then(function(a){d[e]=a;--c||h(b,d)},function(a){m(b,a)})});0===c&&h(b,d);return b};q.race=function(a){var b=c();r(a,function(a){t(a).then(b.resolve,b.reject)});
+return b.promise};return q}function mg(){this.$get=["$window","$timeout",function(a,b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,e=!!d,f=e?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};f.supported=e;return f}]}function ag(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;
+this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$id=++qb;this.$$ChildScope=null;this.$$suspended=!1}b.prototype=a;return b}var b=10,d=F("$rootScope"),c=null,e=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$exceptionHandler","$parse","$browser",function(f,g,k){function h(a){a.currentScope.$$destroyed=!0}function l(a){9===wa&&(a.$$childHead&&l(a.$$childHead),a.$$nextSibling&&l(a.$$nextSibling));a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=
+a.$$childTail=a.$root=a.$$watchers=null}function m(){this.$id=++qb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$suspended=this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$$isolateBindings=null}function p(a){if(v.$$phase)throw d("inprog",v.$$phase);v.$$phase=a}function n(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function s(a,b,c){do a.$$listenerCount[c]-=
+b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function G(){}function t(){for(;y.length;)try{y.shift()()}catch(a){f(a)}e=null}function q(){null===e&&(e=k.defer(function(){v.$apply(t)},null,"$applyAsync"))}m.prototype={constructor:m,$new:function(b,c){var d;c=c||this;b?(d=new m,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope);d.$parent=c;d.$$prevSibling=c.$$childTail;c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):
+c.$$childHead=c.$$childTail=d;(b||c!==this)&&d.$on("$destroy",h);return d},$watch:function(a,b,d,e){var f=g(a);b=B(b)?b:E;if(f.$$watchDelegate)return f.$$watchDelegate(this,b,d,f,a);var h=this,k=h.$$watchers,l={fn:b,last:G,get:f,exp:e||a,eq:!!d};c=null;k||(k=h.$$watchers=[],k.$$digestWatchIndex=-1);k.unshift(l);k.$$digestWatchIndex++;n(this,1);return function(){var a=cb(k,l);0<=a&&(n(h,-1),a<k.$$digestWatchIndex&&k.$$digestWatchIndex--);c=null}},$watchGroup:function(a,b){function c(){h=!1;try{k?(k=
+!1,b(e,e,g)):b(e,d,g)}finally{for(var f=0;f<a.length;f++)d[f]=e[f]}}var d=Array(a.length),e=Array(a.length),f=[],g=this,h=!1,k=!0;if(!a.length){var l=!0;g.$evalAsync(function(){l&&b(e,e,g)});return function(){l=!1}}if(1===a.length)return this.$watch(a[0],function(a,c,f){e[0]=a;d[0]=c;b(e,a===c?e:d,f)});r(a,function(a,b){var d=g.$watch(a,function(a){e[b]=a;h||(h=!0,g.$evalAsync(c))});f.push(d)});return function(){for(;f.length;)f.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,
+g,h;if(!A(e)){if(D(e))if(za(e))for(f!==n&&(f=n,t=f.length=0,l++),a=e.length,t!==a&&(l++,f.length=t=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(l++,f[b]=g);else{f!==p&&(f=p={},t=0,l++);a=0;for(b in e)ta.call(e,b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(t++,f[b]=g,l++));if(t>a)for(b in l++,f)ta.call(e,b)||(t--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$$pure=g(a).literal;c.$stateful=!c.$$pure;var d=this,e,f,h,k=1<b.length,l=0,m=g(a,c),n=[],p={},s=!0,t=0;return this.$watch(m,
+function(){s?(s=!1,b(e,e,d)):b(e,h,d);if(k)if(D(e))if(za(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)ta.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var a,g,h,l,m,n,s,r=b,q,y=w.length?v:this,N=[],A,z;p("$digest");k.$$checkUrlChange();this===v&&null!==e&&(k.defer.cancel(e),t());c=null;do{s=!1;q=y;for(n=0;n<w.length;n++){try{z=w[n],l=z.fn,l(z.scope,z.locals)}catch(C){f(C)}c=null}w.length=0;a:do{if(n=!q.$$suspended&&q.$$watchers)for(n.$$digestWatchIndex=n.length;n.$$digestWatchIndex--;)try{if(a=
+n[n.$$digestWatchIndex])if(m=a.get,(g=m(q))!==(h=a.last)&&!(a.eq?va(g,h):Y(g)&&Y(h)))s=!0,c=a,a.last=a.eq?Ia(g,null):g,l=a.fn,l(g,h===G?g:h,q),5>r&&(A=4-r,N[A]||(N[A]=[]),N[A].push({msg:B(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):a.exp,newVal:g,oldVal:h}));else if(a===c){s=!1;break a}}catch(E){f(E)}if(!(n=!q.$$suspended&&q.$$watchersCount&&q.$$childHead||q!==y&&q.$$nextSibling))for(;q!==y&&!(n=q.$$nextSibling);)q=q.$parent}while(q=n);if((s||w.length)&&!r--)throw v.$$phase=null,d("infdig",b,N);
+}while(s||w.length);for(v.$$phase=null;J<x.length;)try{x[J++]()}catch(D){f(D)}x.length=J=0;k.$$checkUrlChange()},$suspend:function(){this.$$suspended=!0},$isSuspended:function(){return this.$$suspended},$resume:function(){this.$$suspended=!1},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===v&&k.$$applicationDestroyed();n(this,-this.$$watchersCount);for(var b in this.$$listenerCount)s(this,this.$$listenerCount[b],b);a&&a.$$childHead===
+this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail===this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=E;this.$on=this.$watch=this.$watchGroup=function(){return E};this.$$listeners={};this.$$nextSibling=null;l(this)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){v.$$phase||
+w.length||k.defer(function(){w.length&&v.$digest()},null,"$evalAsync");w.push({scope:this,fn:g(a),locals:b})},$$postDigest:function(a){x.push(a)},$apply:function(a){try{p("$apply");try{return this.$eval(a)}finally{v.$$phase=null}}catch(b){f(b)}finally{try{v.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&y.push(b);a=g(a);q()},$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(){var d=c.indexOf(b);-1!==d&&(delete c[d],s(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=db([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(m=d.length;l<m;l++)if(d[l])try{d[l].apply(null,k)}catch(n){f(n)}else d.splice(l,1),l--,m--;if(g)break;e=e.$parent}while(e);h.currentScope=
+null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=db([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=
+null;return e}};var v=new m,w=v.$$asyncQueue=[],x=v.$$postDigestQueue=[],y=v.$$applyAsyncQueue=[],J=0;return v}]}function Qe(){var a=/^\s*(https?|s?ftp|mailto|tel|file):/,b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return w(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return w(a)?(b=a,this):b};this.$get=function(){return function(d,c){var e=c?b:a,f=ga(d&&d.trim()).href;return""===f||f.match(e)?d:"unsafe:"+f}}}function Xg(a){if("self"===
+a)return a;if(C(a)){if(-1<a.indexOf("***"))throw Ea("iwcard",a);a=Od(a).replace(/\\\*\\\*/g,".*").replace(/\\\*/g,"[^:/.?&;]*");return new RegExp("^"+a+"$")}if(ab(a))return new RegExp("^"+a.source+"$");throw Ea("imatcher");}function Pd(a){var b=[];w(a)&&r(a,function(a){b.push(Xg(a))});return b}function eg(){this.SCE_CONTEXTS=W;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){arguments.length&&(a=Pd(b));return a};this.resourceUrlBlacklist=function(a){arguments.length&&(b=Pd(a));return b};
+this.$get=["$injector","$$sanitizeUri",function(d,c){function e(a,b){var c;"self"===a?(c=Cc(b,Qd))||(z.document.baseURI?c=z.document.baseURI:(Na||(Na=z.document.createElement("a"),Na.href=".",Na=Na.cloneNode(!1)),c=Na.href),c=Cc(b,c)):c=!!a.exec(b.href);return c}function f(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};
+return b}var g=function(a){throw Ea("unsafe");};d.has("$sanitize")&&(g=d.get("$sanitize"));var k=f(),h={};h[W.HTML]=f(k);h[W.CSS]=f(k);h[W.MEDIA_URL]=f(k);h[W.URL]=f(h[W.MEDIA_URL]);h[W.JS]=f(k);h[W.RESOURCE_URL]=f(h[W.URL]);return{trustAs:function(a,b){var c=h.hasOwnProperty(a)?h[a]:null;if(!c)throw Ea("icontext",a,b);if(null===b||A(b)||""===b)return b;if("string"!==typeof b)throw Ea("itype",a);return new c(b)},getTrusted:function(d,f){if(null===f||A(f)||""===f)return f;var k=h.hasOwnProperty(d)?
+h[d]:null;if(k&&f instanceof k)return f.$$unwrapTrustedValue();B(f.$$unwrapTrustedValue)&&(f=f.$$unwrapTrustedValue());if(d===W.MEDIA_URL||d===W.URL)return c(f.toString(),d===W.MEDIA_URL);if(d===W.RESOURCE_URL){var k=ga(f.toString()),n,s,r=!1;n=0;for(s=a.length;n<s;n++)if(e(a[n],k)){r=!0;break}if(r)for(n=0,s=b.length;n<s;n++)if(e(b[n],k)){r=!1;break}if(r)return f;throw Ea("insecurl",f.toString());}if(d===W.HTML)return g(f);throw Ea("unsafe");},valueOf:function(a){return a instanceof k?a.$$unwrapTrustedValue():
+a}}}]}function dg(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=["$parse","$sceDelegate",function(b,d){if(a&&8>wa)throw Ea("iequirks");var c=ja(W);c.isEnabled=function(){return a};c.trustAs=d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=Ta);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;r(W,
+function(a,b){var d=K(b);c[("parse_as_"+d).replace(Dc,xb)]=function(b){return e(a,b)};c[("get_trusted_"+d).replace(Dc,xb)]=function(b){return f(a,b)};c[("trust_as_"+d).replace(Dc,xb)]=function(b){return g(a,b)}});return c}]}function fg(){this.$get=["$window","$document",function(a,b){var d={},c=!((!a.nw||!a.nw.process)&&a.chrome&&(a.chrome.app&&a.chrome.app.runtime||!a.chrome.app&&a.chrome.runtime&&a.chrome.runtime.id))&&a.history&&a.history.pushState,e=fa((/android (\d+)/.exec(K((a.navigator||{}).userAgent))||
+[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},k=g.body&&g.body.style,h=!1,l=!1;k&&(h=!!("transition"in k||"webkitTransition"in k),l=!!("animation"in k||"webkitAnimation"in k));return{history:!(!c||4>e||f),hasEvent:function(a){if("input"===a&&wa)return!1;if(A(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ba(),transitions:h,animations:l,android:e}}]}function gg(){this.$get=ia(function(a){return new Yg(a)})}function Yg(a){function b(){var a=e.pop();return a&&
+a.cb}function d(a){for(var b=e.length-1;0<=b;--b){var c=e[b];if(c.type===a)return e.splice(b,1),c.cb}}var c={},e=[],f=this.ALL_TASKS_TYPE="$$all$$",g=this.DEFAULT_TASK_TYPE="$$default$$";this.completeTask=function(e,h){h=h||g;try{e()}finally{var l;l=h||g;c[l]&&(c[l]--,c[f]--);l=c[h];var m=c[f];if(!m||!l)for(l=m?d:b;m=l(h);)try{m()}catch(p){a.error(p)}}};this.incTaskCount=function(a){a=a||g;c[a]=(c[a]||0)+1;c[f]=(c[f]||0)+1};this.notifyWhenNoPendingTasks=function(a,b){b=b||f;c[b]?e.push({type:b,cb:a}):
+a()}}function ig(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$exceptionHandler","$templateCache","$http","$q","$sce",function(b,d,c,e,f){function g(k,h){g.totalPendingRequests++;if(!C(k)||A(d.get(k)))k=f.getTrustedResourceUrl(k);var l=c.defaults&&c.defaults.transformResponse;H(l)?l=l.filter(function(a){return a!==wc}):l===wc&&(l=null);return c.get(k,S({cache:d,transformResponse:l},a)).finally(function(){g.totalPendingRequests--}).then(function(a){return d.put(k,a.data)},
+function(a){h||(a=Zg("tpload",k,a.status,a.statusText),b(a));return e.reject(a)})}g.totalPendingRequests=0;return g}]}function jg(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];r(a,function(a){var c=ca.element(a).data("$binding");c&&r(c,function(c){d?(new RegExp("(^|\\s)"+Od(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!==c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-",
+"data-ng-","ng\\:"],k=0;k<g.length;++k){var h=a.querySelectorAll("["+g[k]+"model"+(d?"=":"*=")+'"'+b+'"]');if(h.length)return h}},getLocation:function(){return d.url()},setLocation:function(b){b!==d.url()&&(d.url(b),a.$digest())},whenStable:function(a){b.notifyWhenNoOutstandingRequests(a)}}}]}function kg(){this.$get=["$rootScope","$browser","$q","$$q","$exceptionHandler",function(a,b,d,c,e){function f(f,h,l){B(f)||(l=h,h=f,f=E);var m=Ha.call(arguments,3),p=w(l)&&!l,n=(p?c:d).defer(),s=n.promise,r;
+r=b.defer(function(){try{n.resolve(f.apply(null,m))}catch(b){n.reject(b),e(b)}finally{delete g[s.$$timeoutId]}p||a.$apply()},h,"$timeout");s.$$timeoutId=r;g[r]=n;return s}var g={};f.cancel=function(a){if(!a)return!1;if(!a.hasOwnProperty("$$timeoutId"))throw $g("badprom");if(!g.hasOwnProperty(a.$$timeoutId))return!1;a=a.$$timeoutId;var c=g[a],d=c.promise;d.$$state&&(d.$$state.pur=!0);c.reject("canceled");delete g[a];return b.defer.cancel(a)};return f}]}function ga(a){if(!C(a))return a;wa&&(aa.setAttribute("href",
+a),a=aa.href);aa.setAttribute("href",a);a=aa.hostname;!ah&&-1<a.indexOf(":")&&(a="["+a+"]");return{href:aa.href,protocol:aa.protocol?aa.protocol.replace(/:$/,""):"",host:aa.host,search:aa.search?aa.search.replace(/^\?/,""):"",hash:aa.hash?aa.hash.replace(/^#/,""):"",hostname:a,port:aa.port,pathname:"/"===aa.pathname.charAt(0)?aa.pathname:"/"+aa.pathname}}function Og(a){var b=[Qd].concat(a.map(ga));return function(a){a=ga(a);return b.some(Cc.bind(null,a))}}function Cc(a,b){a=ga(a);b=ga(b);return a.protocol===
+b.protocol&&a.host===b.host}function lg(){this.$get=ia(z)}function Rd(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}var d=a[0]||{},c={},e="";return function(){var a,g,k,h,l;try{a=d.cookie||""}catch(m){a=""}if(a!==e)for(e=a,a=e.split("; "),c={},k=0;k<a.length;k++)g=a[k],h=g.indexOf("="),0<h&&(l=b(g.substring(0,h)),A(c[l])&&(c[l]=b(g.substring(h+1))));return c}}function pg(){this.$get=Rd}function fd(a){function b(d,c){if(D(d)){var e={};r(d,function(a,c){e[c]=b(c,a)});return e}return a.factory(d+
+"Filter",c)}this.register=b;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];b("currency",Sd);b("date",Td);b("filter",bh);b("json",ch);b("limitTo",dh);b("lowercase",eh);b("number",Ud);b("orderBy",Vd);b("uppercase",fh)}function bh(){return function(a,b,d,c){if(!za(a)){if(null==a)return a;throw F("filter")("notarray",a);}c=c||"$";var e;switch(Ec(b)){case "function":break;case "boolean":case "null":case "number":case "string":e=!0;case "object":b=gh(b,d,c,e);break;default:return a}return Array.prototype.filter.call(a,
+b)}}function gh(a,b,d,c){var e=D(a)&&d in a;!0===b?b=va:B(b)||(b=function(a,b){if(A(a))return!1;if(null===a||null===b)return a===b;if(D(b)||D(a)&&!cc(a))return!1;a=K(""+a);b=K(""+b);return-1!==a.indexOf(b)});return function(f){return e&&!D(f)?Fa(f,a[d],b,d,!1):Fa(f,a,b,d,c)}}function Fa(a,b,d,c,e,f){var g=Ec(a),k=Ec(b);if("string"===k&&"!"===b.charAt(0))return!Fa(a,b.substring(1),d,c,e);if(H(a))return a.some(function(a){return Fa(a,b,d,c,e)});switch(g){case "object":var h;if(e){for(h in a)if(h.charAt&&
+"$"!==h.charAt(0)&&Fa(a[h],b,d,c,!0))return!0;return f?!1:Fa(a,b,d,c,!1)}if("object"===k){for(h in b)if(f=b[h],!B(f)&&!A(f)&&(g=h===c,!Fa(g?a:a[h],f,d,c,g,g)))return!1;return!0}return d(a,b);case "function":return!1;default:return d(a,b)}}function Ec(a){return null===a?"null":typeof a}function Sd(a){var b=a.NUMBER_FORMATS;return function(a,c,e){A(c)&&(c=b.CURRENCY_SYM);A(e)&&(e=b.PATTERNS[1].maxFrac);var f=c?/\u00A4/g:/\s*\u00A4\s*/g;return null==a?a:Wd(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,e).replace(f,
+c)}}function Ud(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Wd(a,b.PATTERNS[0],b.GROUP_SEP,b.DECIMAL_SEP,c)}}function hh(a){var b=0,d,c,e,f,g;-1<(c=a.indexOf(Xd))&&(a=a.replace(Xd,""));0<(e=a.search(/e/i))?(0>c&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)===Fc;e++);if(e===(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)===Fc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Yd&&(d=d.splice(0,Yd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function ih(a,
+b,d,c){var e=a.d,f=e.length-a.i;b=A(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0<d){e.splice(Math.max(a.i,d));for(var g=d;g<e.length;g++)e[g]=0}else for(f=Math.max(0,f),a.i=1,e.length=Math.max(1,d=b+1),e[0]=0,g=1;g<d;g++)e[g]=0;if(5<=c)if(0>d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;f<Math.max(0,b);f++)e.push(0);if(b=e.reduceRight(function(a,b,c,d){b+=a;d[c]=b%10;return Math.floor(b/10)},0))e.unshift(b),a.i++}function Wd(a,b,d,c,e){if(!C(a)&&!X(a)||isNaN(a))return"";
+var f=!isFinite(a),g=!1,k=Math.abs(a)+"",h="";if(f)h="\u221e";else{g=hh(k);ih(g,e,b.minFrac,b.maxFrac);h=g.d;k=g.i;e=g.e;f=[];for(g=h.reduce(function(a,b){return a&&!b},!0);0>k;)h.unshift(0),k++;0<k?f=h.splice(k,h.length):(f=h,h=[0]);k=[];for(h.length>=b.lgSize&&k.unshift(h.splice(-b.lgSize,h.length).join(""));h.length>b.gSize;)k.unshift(h.splice(-b.gSize,h.length).join(""));h.length&&k.unshift(h.join(""));h=k.join(d);f.length&&(h+=c+f.join(""));e&&(h+="e+"+e)}return 0>a&&!g?b.negPre+h+b.negSuf:b.posPre+
+h+b.posSuf}function Pb(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length<b;)a=Fc+a;d&&(a=a.substr(a.length-b));return e+a}function ea(a,b,d,c,e){d=d||0;return function(f){f=f["get"+a]();if(0<d||f>-d)f+=d;0===f&&-12===d&&(f=12);return Pb(f,b,c,e)}}function lb(a,b,d){return function(c,e){var f=c["get"+a](),g=vb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Zd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function $d(a){return function(b){var d=
+Zd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-+d;b=1+Math.round(b/6048E5);return Pb(b,a)}}function Gc(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Td(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,k=b[8]?a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=fa(b[9]+b[10]),g=fa(b[9]+b[11]));k.call(a,fa(b[1]),fa(b[2])-1,fa(b[3]));f=fa(b[4]||0)-f;g=fa(b[5]||0)-g;k=fa(b[6]||0);b=Math.round(1E3*parseFloat("0."+
+(b[7]||0)));h.call(a,f,g,k,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,d,f){var g="",k=[],h,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;C(c)&&(c=jh.test(c)?fa(c):b(c));X(c)&&(c=new Date(c));if(!ha(c)||!isFinite(c.getTime()))return c;for(;d;)(l=kh.exec(d))?(k=db(k,l,1),d=k.pop()):(k.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=fc(f,m),c=gc(c,f,!0));r(k,function(b){h=lh[b];g+=h?h(c,a.DATETIME_FORMATS,
+m):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function ch(){return function(a,b){A(b)&&(b=2);return eb(a,b)}}function dh(){return function(a,b,d){b=Infinity===Math.abs(Number(b))?Number(b):fa(b);if(Y(b))return a;X(a)&&(a=a.toString());if(!za(a))return a;d=!d||isNaN(d)?0:fa(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?Hc(a,d,d+b):0===d?Hc(a,b,a.length):Hc(a,Math.max(0,d+b),d)}}function Hc(a,b,d){return C(a)?a.slice(b,d):Ha.call(a,b,d)}function Vd(a){function b(b){return b.map(function(b){var c=
+1,d=Ta;if(B(b))d=b;else if(C(b)){if("+"===b.charAt(0)||"-"===b.charAt(0))c="-"===b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var e=d(),d=function(a){return a[e]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,h=b.type;if(d===h){var h=a.value,l=b.value;"string"===d?(h=h.toLowerCase(),l=l.toLowerCase()):"object"===d&&(D(h)&&(h=a.index),D(l)&&(l=b.index));h!==l&&(c=
+h<l?-1:1)}else c="undefined"===d?1:"undefined"===h?-1:"null"===d?1:"null"===h?-1:d<h?-1:1;return c}return function(a,f,g,k){if(null==a)return a;if(!za(a))throw F("orderBy")("notarray",a);H(f)||(f=[f]);0===f.length&&(f=["+"]);var h=b(f),l=g?-1:1,m=B(k)?k:c;a=Array.prototype.map.call(a,function(a,b){return{value:a,tieBreaker:{value:b,type:"number",index:b},predicateValues:h.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="null";else if("object"===c)a:{if(B(e.valueOf)&&(e=e.valueOf(),d(e)))break a;
+cc(e)&&(e=e.toString(),d(e))}return{value:e,type:c,index:b}})}});a.sort(function(a,b){for(var d=0,e=h.length;d<e;d++){var f=m(a.predicateValues[d],b.predicateValues[d]);if(f)return f*h[d].descending*l}return(m(a.tieBreaker,b.tieBreaker)||c(a.tieBreaker,b.tieBreaker))*l});return a=a.map(function(a){return a.value})}}function Ra(a){B(a)&&(a={link:a});a.restrict=a.restrict||"AC";return ia(a)}function Qb(a,b,d,c,e){this.$$controls=[];this.$error={};this.$$success={};this.$pending=void 0;this.$name=e(b.name||
+b.ngForm||"")(d);this.$dirty=!1;this.$valid=this.$pristine=!0;this.$submitted=this.$invalid=!1;this.$$parentForm=mb;this.$$element=a;this.$$animate=c;ae(this)}function ae(a){a.$$classCache={};a.$$classCache[be]=!(a.$$classCache[nb]=a.$$element.hasClass(nb))}function ce(a){function b(a,b,c){c&&!a.$$classCache[b]?(a.$$animate.addClass(a.$$element,b),a.$$classCache[b]=!0):!c&&a.$$classCache[b]&&(a.$$animate.removeClass(a.$$element,b),a.$$classCache[b]=!1)}function d(a,c,d){c=c?"-"+Xc(c,"-"):"";b(a,nb+
+c,!0===d);b(a,be+c,!1===d)}var c=a.set,e=a.unset;a.clazz.prototype.$setValidity=function(a,g,k){A(g)?(this.$pending||(this.$pending={}),c(this.$pending,a,k)):(this.$pending&&e(this.$pending,a,k),de(this.$pending)&&(this.$pending=void 0));Ga(g)?g?(e(this.$error,a,k),c(this.$$success,a,k)):(c(this.$error,a,k),e(this.$$success,a,k)):(e(this.$error,a,k),e(this.$$success,a,k));this.$pending?(b(this,"ng-pending",!0),this.$valid=this.$invalid=void 0,d(this,"",null)):(b(this,"ng-pending",!1),this.$valid=
+de(this.$error),this.$invalid=!this.$valid,d(this,"",this.$valid));g=this.$pending&&this.$pending[a]?void 0:this.$error[a]?!1:this.$$success[a]?!0:null;d(this,a,g);this.$$parentForm.$setValidity(a,g,this)}}function de(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}function Ic(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function Sa(a,b,d,c,e,f){var g=K(b[0].type);if(!e.android){var k=!1;b.on("compositionstart",function(){k=!0});b.on("compositionupdate",
+function(a){if(A(a.data)||""===a.data)k=!1});b.on("compositionend",function(){k=!1;l()})}var h,l=function(a){h&&(f.defer.cancel(h),h=null);if(!k){var e=b.val();a=a&&a.type;"password"===g||d.ngTrim&&"false"===d.ngTrim||(e=V(e));(c.$viewValue!==e||""===e&&c.$$hasNativeValidators)&&c.$setViewValue(e,a)}};if(e.hasEvent("input"))b.on("input",l);else{var m=function(a,b,c){h||(h=f.defer(function(){h=null;b&&b.value===c||l(a)}))};b.on("keydown",function(a){var b=a.keyCode;91===b||15<b&&19>b||37<=b&&40>=b||
+m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut drop",m)}b.on("change",l);if(ee[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!h){var b=this.validity,c=b.badInput,d=b.typeMismatch;h=f.defer(function(){h=null;b.badInput===c&&b.typeMismatch===d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Rb(a,b){return function(d,c){var e,f;if(ha(d))return d;if(C(d)){'"'===d.charAt(0)&&'"'===d.charAt(d.length-
+1)&&(d=d.substring(1,d.length-1));if(mh.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,ss:0,sss:0},r(e,function(a,c){c<b.length&&(f[b[c]]=+a)}),e=new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0),100>f.yyyy&&e.setFullYear(f.yyyy),e}return NaN}}function ob(a,b,d,c){return function(e,f,g,k,h,l,m,
+p){function n(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function s(a){return w(a)&&!ha(a)?r(a)||void 0:a}function r(a,b){var c=k.$options.getOption("timezone");v&&v!==c&&(b=Uc(b,fc(v)));var e=d(a,b);!isNaN(e)&&c&&(e=gc(e,c));return e}Jc(e,f,g,k,a);Sa(e,f,g,k,h,l);var t="time"===a||"datetimelocal"===a,q,v;k.$parsers.push(function(c){if(k.$isEmpty(c))return null;if(b.test(c))return r(c,q);k.$$parserName=a});k.$formatters.push(function(a){if(a&&!ha(a))throw pb("datefmt",a);if(n(a)){q=a;var b=
+k.$options.getOption("timezone");b&&(v=b,q=gc(q,b,!0));var d=c;t&&C(k.$options.getOption("timeSecondsFormat"))&&(d=c.replace("ss.sss",k.$options.getOption("timeSecondsFormat")).replace(/:$/,""));a=m("date")(a,d,b);t&&k.$options.getOption("timeStripZeroSeconds")&&(a=a.replace(/(?::00)?(?:\.000)?$/,""));return a}v=q=null;return""});if(w(g.min)||g.ngMin){var x=g.min||p(g.ngMin)(e),z=s(x);k.$validators.min=function(a){return!n(a)||A(z)||d(a)>=z};g.$observe("min",function(a){a!==x&&(z=s(a),x=a,k.$validate())})}if(w(g.max)||
+g.ngMax){var y=g.max||p(g.ngMax)(e),J=s(y);k.$validators.max=function(a){return!n(a)||A(J)||d(a)<=J};g.$observe("max",function(a){a!==y&&(J=s(a),y=a,k.$validate())})}}}function Jc(a,b,d,c,e){(c.$$hasNativeValidators=D(b[0].validity))&&c.$parsers.push(function(a){var d=b.prop("validity")||{};if(d.badInput||d.typeMismatch)c.$$parserName=e;else return a})}function fe(a){a.$parsers.push(function(b){if(a.$isEmpty(b))return null;if(nh.test(b))return parseFloat(b);a.$$parserName="number"});a.$formatters.push(function(b){if(!a.$isEmpty(b)){if(!X(b))throw pb("numfmt",
+b);b=b.toString()}return b})}function na(a){w(a)&&!X(a)&&(a=parseFloat(a));return Y(a)?void 0:a}function Kc(a){var b=a.toString(),d=b.indexOf(".");return-1===d?-1<a&&1>a&&(a=/e-(\d+)$/.exec(b))?Number(a[1]):0:b.length-d-1}function ge(a,b,d){a=Number(a);var c=(a|0)!==a,e=(b|0)!==b,f=(d|0)!==d;if(c||e||f){var g=c?Kc(a):0,k=e?Kc(b):0,h=f?Kc(d):0,g=Math.max(g,k,h),g=Math.pow(10,g);a*=g;b*=g;d*=g;c&&(a=Math.round(a));e&&(b=Math.round(b));f&&(d=Math.round(d))}return 0===(a-b)%d}function he(a,b,d,c,e){if(w(c)){a=
+a(c);if(!a.constant)throw pb("constexpr",d,c);return a(b)}return e}function Lc(a,b){function d(a,b){if(!a||!a.length)return[];if(!b||!b.length)return a;var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],m=0;m<b.length;m++)if(e===b[m])continue a;c.push(e)}return c}function c(a){if(!a)return a;var b=a;H(a)?b=a.map(c).join(" "):D(a)?b=Object.keys(a).filter(function(b){return a[b]}).join(" "):C(a)||(b=a+"");return b}a="ngClass"+a;var e;return["$parse",function(f){return{restrict:"AC",link:function(g,
+k,h){function l(a,b){var c=[];r(a,function(a){if(0<b||p[a])p[a]=(p[a]||0)+b,p[a]===+(0<b)&&c.push(a)});return c.join(" ")}function m(a){if(a===b){var c=s,c=l(c&&c.split(" "),1);h.$addClass(c)}else c=s,c=l(c&&c.split(" "),-1),h.$removeClass(c);n=a}var p=k.data("$classCounts"),n=!0,s;p||(p=T(),k.data("$classCounts",p));"ngClass"!==a&&(e||(e=f("$index",function(a){return a&1})),g.$watch(e,m));g.$watch(f(h[a],c),function(a){if(n===b){var c=s&&s.split(" "),e=a&&a.split(" "),f=d(c,e),c=d(e,c),f=l(f,-1),
+c=l(c,1);h.$addClass(c);h.$removeClass(f)}s=a})}}}]}function sd(a,b,d,c,e,f){return{restrict:"A",compile:function(g,k){var h=a(k[c]);return function(a,c){c.on(e,function(c){var e=function(){h(a,{$event:c})};if(b.$$phase)if(f)a.$evalAsync(e);else try{e()}catch(g){d(g)}else a.$apply(e)})}}}}function Sb(a,b,d,c,e,f,g,k,h){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=void 0;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=
+[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=void 0;this.$name=h(d.name||"",!1)(a);this.$$parentForm=mb;this.$options=Tb;this.$$updateEvents="";this.$$updateEventHandler=this.$$updateEventHandler.bind(this);this.$$parsedNgModel=e(d.ngModel);this.$$parsedNgModelAssign=this.$$parsedNgModel.assign;this.$$ngModelGet=this.$$parsedNgModel;this.$$ngModelSet=this.$$parsedNgModelAssign;this.$$pendingDebounce=
+null;this.$$parserValid=void 0;this.$$parserName="parse";this.$$currentValidationRunId=0;this.$$scope=a;this.$$rootScope=a.$root;this.$$attr=d;this.$$element=c;this.$$animate=f;this.$$timeout=g;this.$$parse=e;this.$$q=k;this.$$exceptionHandler=b;ae(this);oh(this)}function oh(a){a.$$scope.$watch(function(b){b=a.$$ngModelGet(b);b===a.$modelValue||a.$modelValue!==a.$modelValue&&b!==b||a.$$setModelValue(b);return b})}function Mc(a){this.$$options=a}function ie(a,b){r(b,function(b,c){w(a[c])||(a[c]=b)})}
+function Oa(a,b){a.prop("selected",b);a.attr("selected",b)}function je(a,b,d){if(a){C(a)&&(a=new RegExp("^"+a+"$"));if(!a.test)throw F("ngPattern")("noregexp",b,a,Aa(d));return a}}function Ub(a){a=fa(a);return Y(a)?-1:a}var Xb={objectMaxDepth:5,urlErrorParamsEnabled:!0},ke=/^\/(.+)\/([a-z]*)$/,ta=Object.prototype.hasOwnProperty,K=function(a){return C(a)?a.toLowerCase():a},vb=function(a){return C(a)?a.toUpperCase():a},wa,x,sb,Ha=[].slice,Kg=[].splice,ph=[].push,la=Object.prototype.toString,Rc=Object.getPrototypeOf,
+oa=F("ng"),ca=z.angular||(z.angular={}),lc,qb=0;wa=z.document.documentMode;var Y=Number.isNaN||function(a){return a!==a};E.$inject=[];Ta.$inject=[];var ze=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/,V=function(a){return C(a)?a.trim():a},Od=function(a){return a.replace(/([-()[\]{}+?*.$^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},Ba=function(){if(!w(Ba.rules)){var a=z.document.querySelector("[ng-csp]")||z.document.querySelector("[data-ng-csp]");if(a){var b=
+a.getAttribute("ng-csp")||a.getAttribute("data-ng-csp");Ba.rules={noUnsafeEval:!b||-1!==b.indexOf("no-unsafe-eval"),noInlineStyle:!b||-1!==b.indexOf("no-inline-style")}}else{a=Ba;try{new Function(""),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,noInlineStyle:!1}}}return Ba.rules},rb=function(){if(w(rb.name_))return rb.name_;var a,b,d=Qa.length,c,e;for(b=0;b<d;++b)if(c=Qa[b],a=z.document.querySelector("["+c.replace(":","\\:")+"jq]")){e=a.getAttribute(c+"jq");break}return rb.name_=e},Be=/:/g,Qa=["ng-",
+"data-ng-","ng:","x-ng-"],Fe=function(a){var b=a.currentScript;if(!b)return!0;if(!(b instanceof z.HTMLScriptElement||b instanceof z.SVGScriptElement))return!1;b=b.attributes;return[b.getNamedItem("src"),b.getNamedItem("href"),b.getNamedItem("xlink:href")].every(function(b){if(!b)return!0;if(!b.value)return!1;var c=a.createElement("a");c.href=b.value;if(a.location.origin===c.origin)return!0;switch(c.protocol){case "http:":case "https:":case "ftp:":case "blob:":case "file:":case "data:":return!0;default:return!1}})}(z.document),
+Ie=/[A-Z]/g,Yc=!1,Pa=3,Pe={full:"1.8.0",major:1,minor:8,dot:0,codeName:"nested-vaccination"};U.expando="ng339";var Ka=U.cache={},ug=1;U._data=function(a){return this.cache[a[this.expando]]||{}};var qg=/-([a-z])/g,qh=/^-ms-/,Bb={mouseleave:"mouseout",mouseenter:"mouseover"},oc=F("jqLite"),tg=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,nc=/<|&#?\w+;/,rg=/<([\w:-]+)/,sg=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,qa={thead:["table"],col:["colgroup","table"],tr:["tbody","table"],td:["tr",
+"tbody","table"]};qa.tbody=qa.tfoot=qa.colgroup=qa.caption=qa.thead;qa.th=qa.td;var hb={option:[1,'<select multiple="multiple">',"</select>"],_default:[0,"",""]},Nc;for(Nc in qa){var le=qa[Nc],me=le.slice().reverse();hb[Nc]=[me.length,"<"+me.join("><")+">","</"+le.join("></")+">"]}hb.optgroup=hb.option;var zg=z.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Wa=U.prototype={ready:hd,toString:function(){var a=[];r(this,function(b){a.push(""+b)});return"["+a.join(", ")+
+"]"},eq:function(a){return 0<=a?x(this[a]):x(this[this.length+a])},length:0,push:ph,sort:[].sort,splice:[].splice},Hb={};r("multiple selected checked disabled readOnly required open".split(" "),function(a){Hb[K(a)]=a});var od={};r("input select option textarea button form details".split(" "),function(a){od[a]=!0});var vd={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern",ngStep:"step"};r({data:sc,removeData:rc,hasData:function(a){for(var b in Ka[a.ng339])return!0;
+return!1},cleanData:function(a){for(var b=0,d=a.length;b<d;b++)rc(a[b]),kd(a[b])}},function(a,b){U[b]=a});r({data:sc,inheritedData:Fb,scope:function(a){return x.data(a,"$scope")||Fb(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return x.data(a,"$isolateScope")||x.data(a,"$isolateScopeNoTemplate")},controller:ld,injector:function(a){return Fb(a,"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:Cb,css:function(a,b,d){b=yb(b.replace(qh,"ms-"));if(w(d))a.style[b]=
+d;else return a.style[b]},attr:function(a,b,d){var c=a.nodeType;if(c!==Pa&&2!==c&&8!==c&&a.getAttribute){var c=K(b),e=Hb[c];if(w(d))null===d||!1===d&&e?a.removeAttribute(b):a.setAttribute(b,e?c:d);else return a=a.getAttribute(b),e&&null!==a&&(a=c),null===a?void 0:a}},prop:function(a,b,d){if(w(d))a[b]=d;else return a[b]},text:function(){function a(a,d){if(A(d)){var c=a.nodeType;return 1===c||c===Pa?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(A(b)){if(a.multiple&&"select"===
+ua(a)){var d=[];r(a.options,function(a){a.selected&&d.push(a.value||a.text)});return d}return a.value}a.value=b},html:function(a,b){if(A(b))return a.innerHTML;zb(a,!0);a.innerHTML=b},empty:md},function(a,b){U.prototype[b]=function(b,c){var e,f,g=this.length;if(a!==md&&A(2===a.length&&a!==Cb&&a!==ld?b:c)){if(D(b)){for(e=0;e<g;e++)if(a===sc)a(this[e],b);else for(f in b)a(this[e],f,b[f]);return this}e=a.$dv;g=A(e)?Math.min(g,1):g;for(f=0;f<g;f++){var k=a(this[f],b,c);e=e?e+k:k}return e}for(e=0;e<g;e++)a(this[e],
+b,c);return this}});r({removeData:rc,on:function(a,b,d,c){if(w(c))throw oc("onargs");if(mc(a)){c=Ab(a,!0);var e=c.events,f=c.handle;f||(f=c.handle=wg(a,e));c=0<=b.indexOf(" ")?b.split(" "):[b];for(var g=c.length,k=function(b,c,g){var k=e[b];k||(k=e[b]=[],k.specialHandlerWrapper=c,"$destroy"===b||g||a.addEventListener(b,f));k.push(d)};g--;)b=c[g],Bb[b]?(k(Bb[b],yg),k(b,void 0,!0)):k(b)}},off:kd,one:function(a,b,d){a=x(a);a.on(b,function e(){a.off(b,d);a.off(b,e)});a.on(b,d)},replaceWith:function(a,
+b){var d,c=a.parentNode;zb(a);r(new U(b),function(b){d?c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];r(a.childNodes,function(a){1===a.nodeType&&b.push(a)});return b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,b){var d=a.nodeType;if(1===d||11===d){b=new U(b);for(var d=0,c=b.length;d<c;d++)a.appendChild(b[d])}},prepend:function(a,b){if(1===a.nodeType){var d=a.firstChild;r(new U(b),function(b){a.insertBefore(b,d)})}},
+wrap:function(a,b){var d=x(b).eq(0).clone()[0],c=a.parentNode;c&&c.replaceChild(d,a);d.appendChild(a)},remove:Gb,detach:function(a){Gb(a,!0)},after:function(a,b){var d=a,c=a.parentNode;if(c){b=new U(b);for(var e=0,f=b.length;e<f;e++){var g=b[e];c.insertBefore(g,d.nextSibling);d=g}}},addClass:Eb,removeClass:Db,toggleClass:function(a,b,d){b&&r(b.split(" "),function(b){var e=d;A(e)&&(e=!Cb(a,b));(e?Eb:Db)(a,b)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},
+find:function(a,b){return a.getElementsByTagName?a.getElementsByTagName(b):[]},clone:qc,triggerHandler:function(a,b,d){var c,e,f=b.type||b,g=Ab(a);if(g=(g=g&&g.events)&&g[f])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:E,type:f,target:a},b.type&&(c=S(c,
+b)),b=ja(g),e=d?[c].concat(d):[c],r(b,function(b){c.isImmediatePropagationStopped()||b.apply(a,e)})}},function(a,b){U.prototype[b]=function(b,c,e){for(var f,g=0,k=this.length;g<k;g++)A(f)?(f=a(this[g],b,c,e),w(f)&&(f=x(f))):pc(f,a(this[g],b,c,e));return w(f)?f:this}});U.prototype.bind=U.prototype.on;U.prototype.unbind=U.prototype.off;var rh=Object.create(null);pd.prototype={_idx:function(a){a!==this._lastKey&&(this._lastKey=a,this._lastIndex=this._keys.indexOf(a));return this._lastIndex},_transformKey:function(a){return Y(a)?
+rh:a},get:function(a){a=this._transformKey(a);a=this._idx(a);if(-1!==a)return this._values[a]},has:function(a){a=this._transformKey(a);return-1!==this._idx(a)},set:function(a,b){a=this._transformKey(a);var d=this._idx(a);-1===d&&(d=this._lastIndex=this._keys.length);this._keys[d]=a;this._values[d]=b},delete:function(a){a=this._transformKey(a);a=this._idx(a);if(-1===a)return!1;this._keys.splice(a,1);this._values.splice(a,1);this._lastKey=NaN;this._lastIndex=-1;return!0}};var Ib=pd,og=[function(){this.$get=
+[function(){return Ib}]}],Bg=/^([^(]+?)=>/,Cg=/^[^(]*\(\s*([^)]*)\)/m,sh=/,/,th=/^\s*(_?)(\S+?)\1\s*$/,Ag=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ca=F("$injector");fb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw C(d)&&d||(d=a.name||Dg(a)),Ca("strictdi",d);b=qd(a);r(b[1].split(sh),function(a){a.replace(th,function(a,b,d){c.push(d)})})}a.$inject=c}}else H(a)?(b=a.length-1,tb(a[b],"fn"),c=a.slice(0,b)):tb(a,"fn",!0);return c};var ne=F("$animate"),
+Ef=function(){this.$get=E},Ff=function(){var a=new Ib,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,c){function e(a,b,c){var d=!1;b&&(b=C(b)?b.split(" "):H(b)?b:[],r(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){r(b,function(b){var c=a.get(b);if(c){var d=Eg(b.attr("class")),e="",f="";r(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});r(b,function(a){e&&Eb(a,e);f&&Db(a,f)});a.delete(b)}});b.length=0}return{enabled:E,on:E,off:E,pin:E,push:function(g,
+k,h,l){l&&l();h=h||{};h.from&&g.css(h.from);h.to&&g.css(h.to);if(h.addClass||h.removeClass)if(k=h.addClass,l=h.removeClass,h=a.get(g)||{},k=e(h,k,!0),l=e(h,l,!1),k||l)a.set(g,h),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},Cf=["$provide",function(a){var b=this,d=null,c=null;this.$$registeredAnimations=Object.create(null);this.register=function(c,d){if(c&&"."!==c.charAt(0))throw ne("notcsel",c);var g=c+"-animation";b.$$registeredAnimations[c.substr(1)]=g;a.factory(g,
+d)};this.customFilter=function(a){1===arguments.length&&(c=B(a)?a:null);return c};this.classNameFilter=function(a){if(1===arguments.length&&(d=a instanceof RegExp?a:null)&&/[(\s|\/)]ng-animate[(\s|\/)]/.test(d.toString()))throw d=null,ne("nongcls","ng-animate");return d};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var e;a:{for(e=0;e<d.length;e++){var f=d[e];if(1===f.nodeType){e=f;break a}}e=void 0}!e||e.parentNode||e.previousElementSibling||(d=null)}d?d.after(a):c.prepend(a)}return{on:a.on,
+off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.cancel&&a.cancel()},enter:function(c,d,h,l){d=d&&x(d);h=h&&x(h);d=d||h.parent();b(c,d,h);return a.push(c,"enter",ra(l))},move:function(c,d,h,l){d=d&&x(d);h=h&&x(h);d=d||h.parent();b(c,d,h);return a.push(c,"move",ra(l))},leave:function(b,c){return a.push(b,"leave",ra(c),function(){b.remove()})},addClass:function(b,c,d){d=ra(d);d.addClass=ib(d.addclass,c);return a.push(b,"addClass",d)},removeClass:function(b,c,d){d=ra(d);d.removeClass=ib(d.removeClass,
+c);return a.push(b,"removeClass",d)},setClass:function(b,c,d,f){f=ra(f);f.addClass=ib(f.addClass,c);f.removeClass=ib(f.removeClass,d);return a.push(b,"setClass",f)},animate:function(b,c,d,f,m){m=ra(m);m.from=m.from?S(m.from,c):c;m.to=m.to?S(m.to,d):d;m.tempClasses=ib(m.tempClasses,f||"ng-inline-animate");return a.push(b,"animate",m)}}}]}],Hf=function(){this.$get=["$$rAF",function(a){function b(b){d.push(b);1<d.length||a(function(){for(var a=0;a<d.length;a++)d[a]();d=[]})}var d=[];return function(){var a=
+!1;b(function(){a=!0});return function(d){a?d():b(d)}}}]},Gf=function(){this.$get=["$q","$sniffer","$$animateAsyncRun","$$isDocumentHidden","$timeout",function(a,b,d,c,e){function f(a){this.setHost(a);var b=d();this._doneCallbacks=[];this._tick=function(a){c()?e(a,0,!1):b(a)};this._state=0}f.chain=function(a,b){function c(){if(d===a.length)b(!0);else a[d](function(a){!1===a?b(!1):(d++,c())})}var d=0;c()};f.all=function(a,b){function c(f){e=e&&f;++d===a.length&&b(e)}var d=0,e=!0;r(a,function(a){a.done(c)})};
+f.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},progress:E,getPromise:function(){if(!this.promise){var b=this;this.promise=a(function(a,c){b.done(function(b){!1===b?c():a()})})}return this.promise},then:function(a,b){return this.getPromise().then(a,b)},"catch":function(a){return this.getPromise()["catch"](a)},"finally":function(a){return this.getPromise()["finally"](a)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&
+this.host.resume()},end:function(){this.host.end&&this.host.end();this._resolve(!0)},cancel:function(){this.host.cancel&&this.host.cancel();this._resolve(!1)},complete:function(a){var b=this;0===b._state&&(b._state=1,b._tick(function(){b._resolve(a)}))},_resolve:function(a){2!==this._state&&(r(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length=0,this._state=2)}};return f}]},Df=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function(a,b,d){return function(b,e){function f(){a(function(){g.addClass&&
+(b.addClass(g.addClass),g.addClass=null);g.removeClass&&(b.removeClass(g.removeClass),g.removeClass=null);g.to&&(b.css(g.to),g.to=null);k||h.complete();k=!0});return h}var g=e||{};g.$$prepared||(g=Ia(g));g.cleanupStyles&&(g.from=g.to=null);g.from&&(b.css(g.from),g.from=null);var k,h=new d;return{start:f,end:f}}}]},$=F("$compile"),uc=new function(){};Zc.$inject=["$provide","$$sanitizeUriProvider"];Kb.prototype.isFirstChange=function(){return this.previousValue===uc};var rd=/^((?:x|data)[:\-_])/i,Jg=
+/[:\-_]+(.)/g,xd=F("$controller"),wd=/^(\S+)(\s+as\s+([\w$]+))?$/,Of=function(){this.$get=["$document",function(a){return function(b){b?!b.nodeType&&b instanceof x&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},yd="application/json",xc={"Content-Type":yd+";charset=utf-8"},Mg=/^\[|^\{(?!\{)/,Ng={"[":/]$/,"{":/}$/},Lg=/^\)]\}',?\n/,Lb=F("$http"),Ma=ca.$interpolateMinErr=F("$interpolate");Ma.throwNoconcat=function(a){throw Ma("noconcat",a);};Ma.interr=function(a,b){return Ma("interr",a,b.toString())};
+var Qg=F("$interval"),Xf=function(){this.$get=function(){function a(a){var b=function(a){b.data=a;b.called=!0};b.id=a;return b}var b=ca.callbacks,d={};return{createCallback:function(c){c="_"+(b.$$counter++).toString(36);var e="angular.callbacks."+c,f=a(c);d[e]=b[c]=f;return e},wasCalled:function(a){return d[a].called},getResponse:function(a){return d[a].data},removeCallback:function(a){delete b[d[a].id];delete d[a]}}}},uh=/^([^?#]*)(\?([^#]*))?(#(.*))?$/,Rg={http:80,https:443,ftp:21},kb=F("$location"),
+Sg=/^\s*[\\/]{2,}/,vh={$$absUrl:"",$$html5:!1,$$replace:!1,$$compose:function(){for(var a=this.$$path,b=this.$$hash,d=Ce(this.$$search),b=b?"#"+ic(b):"",a=a.split("/"),c=a.length;c--;)a[c]=ic(a[c].replace(/%2F/g,"/"));this.$$url=a.join("/")+(d?"?"+d:"")+b;this.$$absUrl=this.$$normalizeUrl(this.$$url);this.$$urlUpdatedByLocation=!0},absUrl:Mb("$$absUrl"),url:function(a){if(A(a))return this.$$url;var b=uh.exec(a);(b[1]||""===a)&&this.path(decodeURIComponent(b[1]));(b[2]||b[1]||""===a)&&this.search(b[3]||
+"");this.hash(b[5]||"");return this},protocol:Mb("$$protocol"),host:Mb("$$host"),port:Mb("$$port"),path:Fd("$$path",function(a){a=null!==a?a.toString():"";return"/"===a.charAt(0)?a:"/"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(C(a)||X(a))a=a.toString(),this.$$search=hc(a);else if(D(a))a=Ia(a,{}),r(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw kb("isrcharg");break;default:A(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();
+return this},hash:Fd("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};r([Ed,Ac,zc],function(a){a.prototype=Object.create(vh);a.prototype.state=function(b){if(!arguments.length)return this.$$state;if(a!==zc||!this.$$html5)throw kb("nostate");this.$$state=A(b)?null:b;this.$$urlUpdatedByLocation=!0;return this}});var Ya=F("$parse"),Wg={}.constructor.prototype.valueOf,Vb=T();r("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(a){Vb[a]=
+!0});var wh={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Ob=function(a){this.options=a};Ob.prototype={constructor:Ob,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,
+text:a}),this.index++;else if(this.isWhitespace(a))this.index++;else{var b=a+this.peek(),d=b+this.peek(2),c=Vb[b],e=Vb[d];Vb[a]||c||e?(a=e?d:c?b:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,b){return-1!==b.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===
 typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,this.codePointAt(a)):this.isValidIdentifierContinue(a)},
 isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,b,d){d=d||this.index;b=
-x(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw ea("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var d=Q(this.text.charAt(this.index));if("."===d||this.isNumber(d))a+=d;else{var c=this.peek();if("e"===d&&this.isExpOperator(c))a+=d;else if(this.isExpOperator(d)&&c&&this.isNumber(c)&&"e"===a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||c&&this.isNumber(c)||"e"!==a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:b,
-text:a,constant:!0,value:Number(a)})},readIdent:function(){var a=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var b=this.peekMultichar();if(!this.isIdentifierContinue(b))break;this.index+=b.length}this.tokens.push({index:a,text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var b=this.index;this.index++;for(var d="",c=a,f=!1;this.index<this.text.length;){var e=this.text.charAt(this.index),c=c+e;if(f)"u"===e?(f=this.text.substring(this.index+
-1,this.index+5),f.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+f+"]"),this.index+=4,d+=String.fromCharCode(parseInt(f,16))):d+=bh[e]||e,f=!1;else if("\\"===e)f=!0;else{if(e===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,value:d});return}d+=e}this.index++}this.throwError("Unterminated quote",b)}};var t=function(a,b){this.lexer=a;this.options=b};t.Program="Program";t.ExpressionStatement="ExpressionStatement";t.AssignmentExpression="AssignmentExpression";t.ConditionalExpression=
-"ConditionalExpression";t.LogicalExpression="LogicalExpression";t.BinaryExpression="BinaryExpression";t.UnaryExpression="UnaryExpression";t.CallExpression="CallExpression";t.MemberExpression="MemberExpression";t.Identifier="Identifier";t.Literal="Literal";t.ArrayExpression="ArrayExpression";t.Property="Property";t.ObjectExpression="ObjectExpression";t.ThisExpression="ThisExpression";t.LocalsExpression="LocalsExpression";t.NGValueParameter="NGValueParameter";t.prototype={ast:function(a){this.text=
-a;this.tokens=this.lexer.lex(a);a=this.program();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);return a},program:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.expressionStatement()),!this.expect(";"))return{type:t.Program,body:a}},expressionStatement:function(){return{type:t.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},
-expression:function(){return this.assignment()},assignment:function(){var a=this.ternary();if(this.expect("=")){if(!Dd(a))throw ea("lval");a={type:t.AssignmentExpression,left:a,right:this.assignment(),operator:"="}}return a},ternary:function(){var a=this.logicalOR(),b,d;return this.expect("?")&&(b=this.expression(),this.consume(":"))?(d=this.expression(),{type:t.ConditionalExpression,test:a,alternate:b,consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a={type:t.LogicalExpression,
-operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=this.equality();this.expect("&&");)a={type:t.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect("==","!=","===","!==");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=this.additive(),b;b=this.expect("<",">","<=",">=");)a={type:t.BinaryExpression,operator:b.text,
-left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:t.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:t.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},
-primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=sa(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:t.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",
-this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:t.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:t.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:t.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:t.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());
-return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:t.Identifier,name:a.text}},constant:function(){return{type:t.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");
-return{type:t.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:t.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()):this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")?(this.consume(":"),b.value=this.expression()):b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"),
-b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:t.ObjectExpression,properties:a}},throwError:function(a,b){throw ea("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw ea("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw ea("ueoe",
-this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,f){if(this.tokens.length>a){a=this.tokens[a];var e=a.text;if(e===b||e===d||e===c||e===f||!(b||d||c||f))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:t.ThisExpression},$locals:{type:t.LocalsExpression}}};Gd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.state={nextId:0,filters:{},
-expensiveChecks:b,fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};X(c,d.$filter);var f="",e;this.stage="assign";if(e=Ed(c))this.state.computing="assign",f=this.nextId(),this.recurse(e,f),this.return_(f),f="fn.assign="+this.generateFunction("assign","s,v,l");e=Cd(c.body);d.stage="inputs";q(e,function(a,b){var c="fn"+b;d.state[c]={vars:[],body:[],own:{}};d.state.computing=c;var e=d.nextId();d.recurse(a,e);d.return_(e);d.state.inputs.push(c);a.watchId=b});this.state.computing=
-"fn";this.stage="main";this.recurse(c);f='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+f+this.watchFns()+"return fn;";f=(new Function("$filter","ensureSafeMemberName","ensureSafeObject","ensureSafeFunction","getStringValue","ensureSafeAssignContext","ifDefined","plus","text",f))(this.$filter,Ua,Ea,td,wg,Jb,Eg,Bd,a);this.state=this.stage=void 0;f.literal=Fd(c);f.constant=c.constant;return f},USE:"use",STRICT:"strict",watchFns:function(){var a=
-[],b=this.state.inputs,d=this;q(b,function(b){a.push("var "+b+"="+d.generateFunction(b,"s"))});b.length&&a.push("fn.inputs=["+b.join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;q(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+
-";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,f,e){var g,h,k=this,l,m,n;c=c||w;if(!e&&x(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,f,!0));else switch(a.type){case t.Program:q(a.body,function(b,c){k.recurse(b.expression,void 0,void 0,function(a){h=a});c!==a.body.length-1?k.current().body.push(h,";"):k.return_(h)});break;case t.Literal:m=this.escape(a.value);this.assign(b,m);c(m);break;
-case t.UnaryExpression:this.recurse(a.argument,void 0,void 0,function(a){h=a});m=a.operator+"("+this.ifDefined(h,0)+")";this.assign(b,m);c(m);break;case t.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){h=a});m="+"===a.operator?this.plus(g,h):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(h,0):"("+g+")"+a.operator+"("+h+")";this.assign(b,m);c(m);break;case t.LogicalExpression:b=b||this.nextId();k.recurse(a.left,b);
-k.if_("&&"===a.operator?b:k.not(b),k.lazyRecurse(a.right,b));c(b);break;case t.ConditionalExpression:b=b||this.nextId();k.recurse(a.test,b);k.if_(b,k.lazyRecurse(a.alternate,b),k.lazyRecurse(a.consequent,b));c(b);break;case t.Identifier:b=b||this.nextId();d&&(d.context="inputs"===k.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);Ua(a.name);k.if_("inputs"===k.stage||k.not(k.getHasOwnProperty("l",a.name)),function(){k.if_("inputs"===k.stage||
-"s",function(){f&&1!==f&&k.if_(k.not(k.nonComputedMember("s",a.name)),k.lazyAssign(k.nonComputedMember("s",a.name),"{}"));k.assign(b,k.nonComputedMember("s",a.name))})},b&&k.lazyAssign(b,k.nonComputedMember("l",a.name)));(k.state.expensiveChecks||Lb(a.name))&&k.addEnsureSafeObject(b);c(b);break;case t.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();k.recurse(a.object,g,void 0,function(){k.if_(k.notNull(g),function(){f&&1!==f&&k.addEnsureSafeAssignContext(g);if(a.computed)h=
-k.nextId(),k.recurse(a.property,h),k.getStringValue(h),k.addEnsureSafeMemberName(h),f&&1!==f&&k.if_(k.not(k.computedMember(g,h)),k.lazyAssign(k.computedMember(g,h),"{}")),m=k.ensureSafeObject(k.computedMember(g,h)),k.assign(b,m),d&&(d.computed=!0,d.name=h);else{Ua(a.property.name);f&&1!==f&&k.if_(k.not(k.nonComputedMember(g,a.property.name)),k.lazyAssign(k.nonComputedMember(g,a.property.name),"{}"));m=k.nonComputedMember(g,a.property.name);if(k.state.expensiveChecks||Lb(a.property.name))m=k.ensureSafeObject(m);
-k.assign(b,m);d&&(d.computed=!1,d.name=a.property.name)}},function(){k.assign(b,"undefined")});c(b)},!!f);break;case t.CallExpression:b=b||this.nextId();a.filter?(h=k.filter(a.callee.name),l=[],q(a.arguments,function(a){var b=k.nextId();k.recurse(a,b);l.push(b)}),m=h+"("+l.join(",")+")",k.assign(b,m),c(b)):(h=k.nextId(),g={},l=[],k.recurse(a.callee,h,g,function(){k.if_(k.notNull(h),function(){k.addEnsureSafeFunction(h);q(a.arguments,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(k.ensureSafeObject(a))})});
-g.name?(k.state.expensiveChecks||k.addEnsureSafeObject(g.context),m=k.member(g.context,g.name,g.computed)+"("+l.join(",")+")"):m=h+"("+l.join(",")+")";m=k.ensureSafeObject(m);k.assign(b,m)},function(){k.assign(b,"undefined")});c(b)}));break;case t.AssignmentExpression:h=this.nextId();g={};this.recurse(a.left,void 0,g,function(){k.if_(k.notNull(g.context),function(){k.recurse(a.right,h);k.addEnsureSafeObject(k.member(g.context,g.name,g.computed));k.addEnsureSafeAssignContext(g.context);m=k.member(g.context,
-g.name,g.computed)+a.operator+h;k.assign(b,m);c(b||m)})},1);break;case t.ArrayExpression:l=[];q(a.elements,function(a){k.recurse(a,k.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(m);break;case t.ObjectExpression:l=[];n=!1;q(a.properties,function(a){a.computed&&(n=!0)});n?(b=b||this.nextId(),this.assign(b,"{}"),q(a.properties,function(a){a.computed?(g=k.nextId(),k.recurse(a.key,g)):g=a.key.type===t.Identifier?a.key.name:""+a.key.value;h=k.nextId();k.recurse(a.value,
-h);k.assign(k.member(b,g,a.computed),h)})):(q(a.properties,function(b){k.recurse(b.value,a.constant?void 0:k.nextId(),void 0,function(a){l.push(k.escape(b.key.type===t.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b,m));c(b||m);break;case t.ThisExpression:this.assign(b,"s");c("s");break;case t.LocalsExpression:this.assign(b,"l");c("l");break;case t.NGValueParameter:this.assign(b,"v"),c("v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||
-(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;
-c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},addEnsureSafeObject:function(a){this.current().body.push(this.ensureSafeObject(a),
-";")},addEnsureSafeMemberName:function(a){this.current().body.push(this.ensureSafeMemberName(a),";")},addEnsureSafeFunction:function(a){this.current().body.push(this.ensureSafeFunction(a),";")},addEnsureSafeAssignContext:function(a){this.current().body.push(this.ensureSafeAssignContext(a),";")},ensureSafeObject:function(a){return"ensureSafeObject("+a+",text)"},ensureSafeMemberName:function(a){return"ensureSafeMemberName("+a+",text)"},ensureSafeFunction:function(a){return"ensureSafeFunction("+a+",text)"},
-getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},ensureSafeAssignContext:function(a){return"ensureSafeAssignContext("+a+",text)"},lazyRecurse:function(a,b,d,c,f,e){var g=this;return function(){g.recurse(a,b,d,c,f,e)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(D(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+
-"'";if(ba(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw ea("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};Hd.prototype={compile:function(a,b){var d=this,c=this.astBuilder.ast(a);this.expression=a;this.expensiveChecks=b;X(c,d.$filter);var f,e;if(f=Ed(c))e=this.recurse(f);f=Cd(c.body);
-var g;f&&(g=[],q(f,function(a,b){var c=d.recurse(a);a.input=c;g.push(c);a.watchId=b}));var h=[];q(c.body,function(a){h.push(d.recurse(a.expression))});f=0===c.body.length?w:1===c.body.length?h[0]:function(a,b){var c;q(h,function(d){c=d(a,b)});return c};e&&(f.assign=function(a,b,c){return e(a,c,b)});g&&(f.inputs=g);f.literal=Fd(c);f.constant=c.constant;return f},recurse:function(a,b,d){var c,f,e=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case t.Literal:return this.value(a.value,
-b);case t.UnaryExpression:return f=this.recurse(a.argument),this["unary"+a.operator](f,b);case t.BinaryExpression:return c=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](c,f,b);case t.LogicalExpression:return c=this.recurse(a.left),f=this.recurse(a.right),this["binary"+a.operator](c,f,b);case t.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case t.Identifier:return Ua(a.name,e.expression),e.identifier(a.name,
-e.expensiveChecks||Lb(a.name),b,d,e.expression);case t.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(Ua(a.property.name,e.expression),f=a.property.name),a.computed&&(f=this.recurse(a.property)),a.computed?this.computedMember(c,f,b,d,e.expression):this.nonComputedMember(c,f,e.expensiveChecks,b,d,e.expression);case t.CallExpression:return g=[],q(a.arguments,function(a){g.push(e.recurse(a))}),a.filter&&(f=this.$filter(a.callee.name)),a.filter||(f=this.recurse(a.callee,!0)),a.filter?
-function(a,c,d,e){for(var n=[],r=0;r<g.length;++r)n.push(g[r](a,c,d,e));a=f.apply(void 0,n,e);return b?{context:void 0,name:void 0,value:a}:a}:function(a,c,d,m){var n=f(a,c,d,m),r;if(null!=n.value){Ea(n.context,e.expression);td(n.value,e.expression);r=[];for(var s=0;s<g.length;++s)r.push(Ea(g[s](a,c,d,m),e.expression));r=Ea(n.value.apply(n.context,r),e.expression)}return b?{value:r}:r};case t.AssignmentExpression:return c=this.recurse(a.left,!0,1),f=this.recurse(a.right),function(a,d,g,m){var n=c(a,
-d,g,m);a=f(a,d,g,m);Ea(n.value,e.expression);Jb(n.context);n.context[n.name]=a;return b?{value:a}:a};case t.ArrayExpression:return g=[],q(a.elements,function(a){g.push(e.recurse(a))}),function(a,c,d,e){for(var f=[],r=0;r<g.length;++r)f.push(g[r](a,c,d,e));return b?{value:f}:f};case t.ObjectExpression:return g=[],q(a.properties,function(a){a.computed?g.push({key:e.recurse(a.key),computed:!0,value:e.recurse(a.value)}):g.push({key:a.key.type===t.Identifier?a.key.name:""+a.key.value,computed:!1,value:e.recurse(a.value)})}),
-function(a,c,d,e){for(var f={},r=0;r<g.length;++r)g[r].computed?f[g[r].key(a,c,d,e)]=g[r].value(a,c,d,e):f[g[r].key]=g[r].value(a,c,d,e);return b?{value:f}:f};case t.ThisExpression:return function(a){return b?{value:a}:a};case t.LocalsExpression:return function(a,c){return b?{value:c}:c};case t.NGValueParameter:return function(a,c,d){return b?{value:d}:d}}},"unary+":function(a,b){return function(d,c,f,e){d=a(d,c,f,e);d=x(d)?+d:0;return b?{value:d}:d}},"unary-":function(a,b){return function(d,c,f,
-e){d=a(d,c,f,e);d=x(d)?-d:0;return b?{value:d}:d}},"unary!":function(a,b){return function(d,c,f,e){d=!a(d,c,f,e);return b?{value:d}:d}},"binary+":function(a,b,d){return function(c,f,e,g){var h=a(c,f,e,g);c=b(c,f,e,g);h=Bd(h,c);return d?{value:h}:h}},"binary-":function(a,b,d){return function(c,f,e,g){var h=a(c,f,e,g);c=b(c,f,e,g);h=(x(h)?h:0)-(x(c)?c:0);return d?{value:h}:h}},"binary*":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)*b(c,f,e,g);return d?{value:c}:c}},"binary/":function(a,b,d){return function(c,
-f,e,g){c=a(c,f,e,g)/b(c,f,e,g);return d?{value:c}:c}},"binary%":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)%b(c,f,e,g);return d?{value:c}:c}},"binary===":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)===b(c,f,e,g);return d?{value:c}:c}},"binary!==":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)!==b(c,f,e,g);return d?{value:c}:c}},"binary==":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)==b(c,f,e,g);return d?{value:c}:c}},"binary!=":function(a,b,d){return function(c,
-f,e,g){c=a(c,f,e,g)!=b(c,f,e,g);return d?{value:c}:c}},"binary<":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)<b(c,f,e,g);return d?{value:c}:c}},"binary>":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)>b(c,f,e,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)<=b(c,f,e,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)>=b(c,f,e,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,f,e,g){c=
-a(c,f,e,g)&&b(c,f,e,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,f,e,g){c=a(c,f,e,g)||b(c,f,e,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(f,e,g,h){f=a(f,e,g,h)?b(f,e,g,h):d(f,e,g,h);return c?{value:f}:f}},value:function(a,b){return function(){return b?{context:void 0,name:void 0,value:a}:a}},identifier:function(a,b,d,c,f){return function(e,g,h,k){e=g&&a in g?g:e;c&&1!==c&&e&&!e[a]&&(e[a]={});g=e?e[a]:void 0;b&&Ea(g,f);return d?{context:e,name:a,
-value:g}:g}},computedMember:function(a,b,d,c,f){return function(e,g,h,k){var l=a(e,g,h,k),m,n;null!=l&&(m=b(e,g,h,k),m+="",Ua(m,f),c&&1!==c&&(Jb(l),l&&!l[m]&&(l[m]={})),n=l[m],Ea(n,f));return d?{context:l,name:m,value:n}:n}},nonComputedMember:function(a,b,d,c,f,e){return function(g,h,k,l){g=a(g,h,k,l);f&&1!==f&&(Jb(g),g&&!g[b]&&(g[b]={}));h=null!=g?g[b]:void 0;(d||Lb(b))&&Ea(h,e);return c?{context:g,name:b,value:h}:h}},inputs:function(a,b){return function(d,c,f,e){return e?e[b]:a(d,c,f)}}};var nc=
-function(a,b,d){this.lexer=a;this.$filter=b;this.options=d;this.ast=new t(a,d);this.astCompiler=d.csp?new Hd(this.ast,b):new Gd(this.ast,b)};nc.prototype={constructor:nc,parse:function(a){return this.astCompiler.compile(a,this.options.expensiveChecks)}};var Fa=G("$sce"),ga={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Hg=G("$compile"),aa=y.document.createElement("a"),Ld=ta(y.location.href);Md.$inject=["$document"];Rc.$inject=["$provide"];var Td=22,Sd=".",pc="0";Nd.$inject=["$locale"];
-Pd.$inject=["$locale"];var Sg={yyyy:U("FullYear",4,0,!1,!0),yy:U("FullYear",2,0,!0,!0),y:U("FullYear",1,0,!1,!0),MMMM:nb("Month"),MMM:nb("Month",!0),MM:U("Month",2,1),M:U("Month",1,1),LLLL:nb("Month",!1,!0),dd:U("Date",2),d:U("Date",1),HH:U("Hours",2),H:U("Hours",1),hh:U("Hours",2,-12),h:U("Hours",1,-12),mm:U("Minutes",2),m:U("Minutes",1),ss:U("Seconds",2),s:U("Seconds",1),sss:U("Milliseconds",3),EEEE:nb("Day"),EEE:nb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,
-b,d){a=-1*d;return a=(0<=a?"+":"")+(Mb(Math[0<a?"floor":"ceil"](a/60),2)+Mb(Math.abs(a%60),2))},ww:Vd(2),w:Vd(1),G:qc,GG:qc,GGG:qc,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},Rg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,Qg=/^-?\d+$/;Od.$inject=["$locale"];var Lg=ha(Q),Mg=ha(wb);Qd.$inject=["$parse"];var Ce=ha({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var f=
-"[object SVGAnimatedString]"===ma.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(f)||a.preventDefault()})}}}}),xb={};q(Gb,function(a,b){function d(a,d,f){a.$watch(f[c],function(a){f.$set(b,!!a)})}if("multiple"!==a){var c=Da("ng-"+b),f=d;"checked"===a&&(f=function(a,b,f){f.ngModel!==f[c]&&d(a,b,f)});xb[c]=function(){return{restrict:"A",priority:100,link:f}}}});q(gd,function(a,b){xb[b]=function(){return{priority:100,link:function(a,c,f){if("ngPattern"===b&&"/"===f.ngPattern.charAt(0)&&
-(c=f.ngPattern.match(Vg))){f.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(f[b],function(a){f.$set(b,a)})}}}});q(["src","srcset","href"],function(a){var b=Da("ng-"+a);xb[b]=function(){return{priority:99,link:function(d,c,f){var e=a,g=a;"href"===a&&"[object SVGAnimatedString]"===ma.call(c.prop("href"))&&(g="xlinkHref",f.$attr[g]="xlink:href",e=null);f.$observe(b,function(b){b?(f.$set(g,b),Ia&&e&&c.prop(e,f[g])):"href"===a&&f.$set(g,null)})}}}});var Nb={$addControl:w,$$renameControl:function(a,
-b){a.$name=b},$removeControl:w,$setValidity:w,$setDirty:w,$setPristine:w,$setSubmitted:w};Wd.$inject=["$element","$attrs","$scope","$animate","$interpolate"];var ee=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||w}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Wd,compile:function(d,e){d.addClass(Wa).addClass(rb);var g=e.name?"name":a&&e.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var n=f[0];if(!("action"in
-e)){var r=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",r,!1);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",r,!1)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var s=g?c(n.$name):w;g&&(s(a,n),e.$observe(g,function(b){n.$name!==b&&(s(a,void 0),n.$$parentForm.$$renameControl(n,b),s=c(n.$name),s(a,n))}));d.on("$destroy",function(){n.$$parentForm.$removeControl(n);s(a,void 0);R(n,Nb)})}}}}}]},De=
-ee(),Pe=ee(!0),Tg=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,ch=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,dh=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Ug=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,fe=/^(\d{4,})-(\d{2})-(\d{2})$/,ge=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,
-wc=/^(\d{4,})-W(\d\d)$/,he=/^(\d{4,})-(\d\d)$/,ie=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Yd=V();q(["date","datetime-local","month","time","week"],function(a){Yd[a]=!0});var je={text:function(a,b,d,c,f,e){Xa(a,b,d,c,f,e);sc(c)},date:ob("date",fe,Pb(fe,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":ob("datetimelocal",ge,Pb(ge,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:ob("time",ie,Pb(ie,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:ob("week",wc,function(a,b){if(ja(a))return a;
-if(D(a)){wc.lastIndex=0;var d=wc.exec(a);if(d){var c=+d[1],f=+d[2],e=d=0,g=0,h=0,k=Ud(c),f=7*(f-1);b&&(d=b.getHours(),e=b.getMinutes(),g=b.getSeconds(),h=b.getMilliseconds());return new Date(c,0,k.getDate()+f,d,e,g,h)}}return NaN},"yyyy-Www"),month:ob("month",he,Pb(he,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,f,e){tc(a,b,d,c);Xa(a,b,d,c,f,e);Zd(c);var g,h;if(x(d.min)||d.ngMin)c.$validators.min=function(a){return c.$isEmpty(a)||z(g)||a>=g},d.$observe("min",function(a){g=qb(a);c.$validate()});
-if(x(d.max)||d.ngMax)c.$validators.max=function(a){return c.$isEmpty(a)||z(h)||a<=h},d.$observe("max",function(a){h=qb(a);c.$validate()})},url:function(a,b,d,c,f,e){Xa(a,b,d,c,f,e);sc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||ch.test(d)}},email:function(a,b,d,c,f,e){Xa(a,b,d,c,f,e);sc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||dh.test(d)}},radio:function(a,b,d,c){z(d.name)&&b.attr("name",++sb);b.on("click",
-function(a){b[0].checked&&c.$setViewValue(d.value,a&&a.type)});c.$render=function(){b[0].checked=d.value==c.$viewValue};d.$observe("value",c.$render)},range:function(a,b,d,c,f,e){function g(a,c){b.attr(a,d[a]);d.$observe(a,c)}function h(a){n=qb(a);ia(c.$modelValue)||(m?(a=b.val(),n>a&&(a=n,b.val(a)),c.$setViewValue(a)):c.$validate())}function k(a){r=qb(a);ia(c.$modelValue)||(m?(a=b.val(),r<a&&(b.val(r),a=r<n?n:r),c.$setViewValue(a)):c.$validate())}function l(a){s=qb(a);ia(c.$modelValue)||(m&&c.$viewValue!==
-b.val()?c.$setViewValue(b.val()):c.$validate())}tc(a,b,d,c);Zd(c);Xa(a,b,d,c,f,e);var m=c.$$hasNativeValidators&&"range"===b[0].type,n=m?0:void 0,r=m?100:void 0,s=m?1:void 0,q=b[0].validity;a=x(d.min);f=x(d.max);e=x(d.step);var u=c.$render;c.$render=m&&x(q.rangeUnderflow)&&x(q.rangeOverflow)?function(){u();c.$setViewValue(b.val())}:u;a&&(c.$validators.min=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||z(n)||b>=n},g("min",h));f&&(c.$validators.max=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||
-z(r)||b<=r},g("max",k));e&&(c.$validators.step=m?function(){return!q.stepMismatch}:function(a,b){var d;if(!(d=c.$isEmpty(b)||z(s))){d=n||0;var e=s,f=Number(b);if((f|0)!==f||(d|0)!==d||(e|0)!==e){var g=Math.max(uc(f),uc(d),uc(e)),g=Math.pow(10,g),f=f*g;d*=g;e*=g}d=0===(f-d)%e}return d},g("step",l))},checkbox:function(a,b,d,c,f,e,g,h){var k=$d(h,a,"ngTrueValue",d.ngTrueValue,!0),l=$d(h,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=
-c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return na(a,k)});c.$parsers.push(function(a){return a?k:l})},hidden:w,button:w,submit:w,reset:w,file:w},Lc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(f,e,g,h){if(h[0]){var k=Q(g.type);"range"!==k||g.hasOwnProperty("ngInputRange")||(k="text");(je[k]||je.text)(f,e,g,h[0],b,a,d,c)}}}}}],eh=/^(true|false|\d+)$/,gf=function(){return{restrict:"A",
-priority:100,compile:function(a,b){return eh.test(b.ngValue)?function(a,b,f){f.$set("value",a.$eval(f.ngValue))}:function(a,b,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},He=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,f){a.$$addBindingInfo(c,f.ngBind);c=c[0];b.$watch(f.ngBind,function(a){c.textContent=z(a)?"":a})}}}}],Je=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,
-d,e){c=a(d.attr(e.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];e.$observe("ngBindTemplate",function(a){d.textContent=z(a)?"":a})}}}}],Ie=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,f){var e=b(f.ngBindHtml),g=b(f.ngBindHtml,function(b){return a.valueOf(b)});d.$$addBindingClass(c);return function(b,c,f){d.$$addBindingInfo(c,f.ngBindHtml);b.$watch(g,function(){var d=e(b);c.html(a.getTrustedHtml(d)||"")})}}}}],ff=ha({restrict:"A",require:"ngModel",
-link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Ke=vc("",!0),Me=vc("Odd",0),Le=vc("Even",1),Ne=Va({compile:function(a,b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),Oe=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],Qc={},fh={blur:!0,focus:!0};q("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=Da("ng-"+a);
-Qc[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(f,e){var g=d(e[b],null,!0);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};fh[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var Re=["$animate","$compile",function(a,b){return{multiElement:!0,transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,f,e,g){var h,k,l;d.$watch(f.ngIf,function(d){d?k||g(function(d,e){k=e;d[d.length++]=b.$$createComment("end ngIf",
-f.ngIf);h={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),k&&(k.$destroy(),k=null),h&&(l=vb(h.clone),a.leave(l).done(function(a){!1!==a&&(l=null)}),h=null))})}}}],Se=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:$.noop,compile:function(c,f){var e=f.ngInclude||f.src,g=f.onload||"",h=f.autoscroll;return function(c,f,m,n,r){var q=0,t,u,p,z=function(){u&&(u.remove(),u=null);t&&(t.$destroy(),t=null);
-p&&(d.leave(p).done(function(a){!1!==a&&(u=null)}),u=p,p=null)};c.$watch(e,function(e){var m=function(a){!1===a||!x(h)||h&&!c.$eval(h)||b()},u=++q;e?(a(e,!0).then(function(a){if(!c.$$destroyed&&u===q){var b=c.$new();n.template=a;a=r(b,function(a){z();d.enter(a,null,f).done(m)});t=b;p=a;t.$emit("$includeContentLoaded",e);c.$eval(g)}},function(){c.$$destroyed||u!==q||(z(),c.$emit("$includeContentError",e))}),c.$emit("$includeContentRequested",e)):(z(),n.template=null)})}}}}],jf=["$compile",function(a){return{restrict:"ECA",
-priority:-400,require:"ngInclude",link:function(b,d,c,f){ma.call(d[0]).match(/SVG/)?(d.empty(),a(Tc(f.template,y.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(f.template),a(d.contents())(b))}}}],Te=Va({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),ef=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var f=b.attr(d.$attr.ngList)||", ",e="false"!==d.ngTrim,g=e?Y(f):f;c.$parsers.push(function(a){if(!z(a)){var b=
-[];a&&q(a.split(g),function(a){a&&b.push(e?Y(a):a)});return b}});c.$formatters.push(function(a){if(I(a))return a.join(f)});c.$isEmpty=function(a){return!a||!a.length}}}},rb="ng-valid",ae="ng-invalid",Wa="ng-pristine",Ob="ng-dirty",ce="ng-pending",pb=G("ngModel"),gh=["$scope","$exceptionHandler","$attrs","$element","$parse","$animate","$timeout","$rootScope","$q","$interpolate",function(a,b,d,c,f,e,g,h,k,l){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=void 0;this.$validators={};
-this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=void 0;this.$name=l(d.name||"",!1)(a);this.$$parentForm=Nb;var m=f(d.ngModel),n=m.assign,r=m,s=n,t=null,u,p=this;this.$$setOptions=function(a){if((p.$options=a)&&a.getterSetter){var b=f(d.ngModel+"()"),e=f(d.ngModel+"($$$p)");r=function(a){var c=m(a);C(c)&&(c=b(a));
-return c};s=function(a,b){C(m(a))?e(a,{$$$p:b}):n(a,b)}}else if(!m.assign)throw pb("nonassign",d.ngModel,ya(c));};this.$render=w;this.$isEmpty=function(a){return z(a)||""===a||null===a||a!==a};this.$$updateEmptyClasses=function(a){p.$isEmpty(a)?(e.removeClass(c,"ng-not-empty"),e.addClass(c,"ng-empty")):(e.removeClass(c,"ng-empty"),e.addClass(c,"ng-not-empty"))};var y=0;Xd({ctrl:this,$element:c,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]},$animate:e});this.$setPristine=function(){p.$dirty=
-!1;p.$pristine=!0;e.removeClass(c,Ob);e.addClass(c,Wa)};this.$setDirty=function(){p.$dirty=!0;p.$pristine=!1;e.removeClass(c,Wa);e.addClass(c,Ob);p.$$parentForm.$setDirty()};this.$setUntouched=function(){p.$touched=!1;p.$untouched=!0;e.setClass(c,"ng-untouched","ng-touched")};this.$setTouched=function(){p.$touched=!0;p.$untouched=!1;e.setClass(c,"ng-touched","ng-untouched")};this.$rollbackViewValue=function(){g.cancel(t);p.$viewValue=p.$$lastCommittedViewValue;p.$render()};this.$validate=function(){if(!ia(p.$modelValue)){var a=
-p.$$rawModelValue,b=p.$valid,c=p.$modelValue,d=p.$options&&p.$options.allowInvalid;p.$$runValidators(a,p.$$lastCommittedViewValue,function(e){d||b===e||(p.$modelValue=e?a:void 0,p.$modelValue!==c&&p.$$writeModelToScope())})}};this.$$runValidators=function(a,b,c){function d(){var c=!0;q(p.$validators,function(d,e){var g=d(a,b);c=c&&g;f(e,g)});return c?!0:(q(p.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;q(p.$asyncValidators,function(e,g){var h=e(a,b);if(!h||!C(h.then))throw pb("nopromise",
-h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?k.all(c).then(function(){g(d)},w):g(!0)}function f(a,b){h===y&&p.$setValidity(a,b)}function g(a){h===y&&c(a)}y++;var h=y;(function(){var a=p.$$parserName||"parse";if(z(u))f(a,null);else return u||(q(p.$validators,function(a,b){f(b,null)}),q(p.$asyncValidators,function(a,b){f(b,null)})),f(a,u),u;return!0})()?d()?e():g(!1):g(!1)};this.$commitViewValue=function(){var a=p.$viewValue;g.cancel(t);if(p.$$lastCommittedViewValue!==
-a||""===a&&p.$$hasNativeValidators)p.$$updateEmptyClasses(a),p.$$lastCommittedViewValue=a,p.$pristine&&this.$setDirty(),this.$$parseAndValidate()};this.$$parseAndValidate=function(){var b=p.$$lastCommittedViewValue;if(u=z(b)?void 0:!0)for(var c=0;c<p.$parsers.length;c++)if(b=p.$parsers[c](b),z(b)){u=!1;break}ia(p.$modelValue)&&(p.$modelValue=r(a));var d=p.$modelValue,e=p.$options&&p.$options.allowInvalid;p.$$rawModelValue=b;e&&(p.$modelValue=b,p.$modelValue!==d&&p.$$writeModelToScope());p.$$runValidators(b,
-p.$$lastCommittedViewValue,function(a){e||(p.$modelValue=a?b:void 0,p.$modelValue!==d&&p.$$writeModelToScope())})};this.$$writeModelToScope=function(){s(a,p.$modelValue);q(p.$viewChangeListeners,function(a){try{a()}catch(c){b(c)}})};this.$setViewValue=function(a,b){p.$viewValue=a;p.$options&&!p.$options.updateOnDefault||p.$$debounceViewValueCommit(b)};this.$$debounceViewValueCommit=function(b){var c=0,d=p.$options;d&&x(d.debounce)&&(d=d.debounce,ba(d)?c=d:ba(d[b])?c=d[b]:ba(d["default"])&&(c=d["default"]));
-g.cancel(t);c?t=g(function(){p.$commitViewValue()},c):h.$$phase?p.$commitViewValue():a.$apply(function(){p.$commitViewValue()})};a.$watch(function(){var b=r(a);if(b!==p.$modelValue&&(p.$modelValue===p.$modelValue||b===b)){p.$modelValue=p.$$rawModelValue=b;u=void 0;for(var c=p.$formatters,d=c.length,e=b;d--;)e=c[d](e);p.$viewValue!==e&&(p.$$updateEmptyClasses(e),p.$viewValue=p.$$lastCommittedViewValue=e,p.$render(),p.$$runValidators(p.$modelValue,p.$viewValue,w))}return b})}],df=["$rootScope",function(a){return{restrict:"A",
-require:["ngModel","^?form","^?ngModelOptions"],controller:gh,priority:1,compile:function(b){b.addClass(Wa).addClass("ng-untouched").addClass(rb);return{pre:function(a,b,f,e){var g=e[0];b=e[1]||g.$$parentForm;g.$$setOptions(e[2]&&e[2].$options);b.$addControl(g);f.$observe("name",function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,a)});a.$on("$destroy",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,f,e){var g=e[0];if(g.$options&&g.$options.updateOn)c.on(g.$options.updateOn,
-function(a){g.$$debounceViewValueCommit(a&&a.type)});c.on("blur",function(){g.$touched||(a.$$phase?b.$evalAsync(g.$setTouched):b.$apply(g.$setTouched))})}}}}}],hh=/(\s+|^)default(\s+|$)/,hf=function(){return{restrict:"A",controller:["$scope","$attrs",function(a,b){var d=this;this.$options=sa(a.$eval(b.ngModelOptions));x(this.$options.updateOn)?(this.$options.updateOnDefault=!1,this.$options.updateOn=Y(this.$options.updateOn.replace(hh,function(){d.$options.updateOnDefault=!0;return" "}))):this.$options.updateOnDefault=
-!0}]}},Ue=Va({terminal:!0,priority:1E3}),ih=G("ngOptions"),jh=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\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]+?))?$/,bf=["$compile","$document","$parse",function(a,b,d){function c(a,b,c){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}function f(a){var b;if(!q&&la(a))b=a;else{b=
-[];for(var c in a)a.hasOwnProperty(c)&&"$"!==c.charAt(0)&&b.push(c)}return b}var n=a.match(jh);if(!n)throw ih("iexp",a,ya(b));var r=n[5]||n[7],q=n[6];a=/ as /.test(n[0])&&n[1];var t=n[9];b=d(n[2]?n[1]:r);var u=a&&d(a)||b,p=t&&d(t),x=t?function(a,b){return p(c,b)}:function(a){return Aa(a)},A=function(a,b){return x(a,C(a,b))},v=d(n[2]||n[1]),z=d(n[3]||""),L=d(n[4]||""),w=d(n[8]),y={},C=q?function(a,b){y[q]=b;y[r]=a;return y}:function(a){y[r]=a;return y};return{trackBy:t,getTrackByValue:A,getWatchables:d(w,
-function(a){var b=[];a=a||[];for(var d=f(a),e=d.length,g=0;g<e;g++){var h=a===d?g:d[g],l=a[h],h=C(l,h),l=x(l,h);b.push(l);if(n[2]||n[1])l=v(c,h),b.push(l);n[4]&&(h=L(c,h),b.push(h))}return b}),getOptions:function(){for(var a=[],b={},d=w(c)||[],g=f(d),h=g.length,n=0;n<h;n++){var p=d===g?n:g[n],r=C(d[p],p),q=u(c,r),p=x(q,r),s=v(c,r),y=z(c,r),r=L(c,r),q=new e(p,q,s,y,r);a.push(q);b[p]=q}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[A(a)]},getViewValueFromOption:function(a){return t?
-sa(a.viewValue):a.viewValue}}}}}var f=y.document.createElement("option"),e=y.document.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=w},post:function(d,h,k,l){function m(a,b){a.element=b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,b.textContent=a.label);b.value=a.selectValue}function n(){var a=w&&r.readValue();if(w)for(var b=w.items.length-1;0<=b;b--){var c=w.items[b];x(c.group)?Fb(c.element.parentNode):
-Fb(c.element)}w=C.getOptions();var d={};A&&h.prepend(u);w.items.forEach(function(a){var b;if(x(a.group)){b=d[a.group];b||(b=e.cloneNode(!1),D.appendChild(b),b.label=null===a.group?"null":a.group,d[a.group]=b);var c=f.cloneNode(!1)}else b=D,c=f.cloneNode(!1);b.appendChild(c);m(a,c)});h[0].appendChild(D);s.$render();s.$isEmpty(a)||(b=r.readValue(),(C.trackBy||t?na(a,b):a===b)||(s.$setViewValue(b),s.$render()))}var r=l[0],s=l[1],t=k.multiple,u;l=0;for(var p=h.children(),z=p.length;l<z;l++)if(""===p[l].value){u=
-p.eq(l);break}var A=!!u,v=!1,y=F(f.cloneNode(!1));y.val("?");var w,C=c(k.ngOptions,h,d),D=b[0].createDocumentFragment(),E=function(){A?v&&u.removeAttr("selected"):u.remove()};t?(s.$isEmpty=function(a){return!a||0===a.length},r.writeValue=function(a){w.items.forEach(function(a){a.element.selected=!1});a&&a.forEach(function(a){if(a=w.getOptionFromViewValue(a))a.element.selected=!0})},r.readValue=function(){var a=h.val()||[],b=[];q(a,function(a){(a=w.selectValueMap[a])&&!a.disabled&&b.push(w.getViewValueFromOption(a))});
-return b},C.trackBy&&d.$watchCollection(function(){if(I(s.$viewValue))return s.$viewValue.map(function(a){return C.getTrackByValue(a)})},function(){s.$render()})):(r.writeValue=function(a){var b=w.selectValueMap[h.val()],c=w.getOptionFromViewValue(a);b&&b.element.removeAttribute("selected");c?(h[0].value!==c.selectValue&&(y.remove(),E(),h[0].value=c.selectValue,c.element.selected=!0),c.element.setAttribute("selected","selected")):null===a||A?(y.remove(),A||h.prepend(u),h.val(""),v&&(u.prop("selected",
-!0),u.attr("selected",!0))):(E(),h.prepend(y),h.val("?"),y.prop("selected",!0),y.attr("selected",!0))},r.readValue=function(){var a=w.selectValueMap[h.val()];return a&&!a.disabled?(E(),y.remove(),w.getViewValueFromOption(a)):null},C.trackBy&&d.$watch(function(){return C.getTrackByValue(s.$viewValue)},function(){s.$render()}));A?(u.remove(),a(u)(d),8===u[0].nodeType?(v=!1,r.registerOption=function(a,b){""===b.val()&&(v=!0,u=b,u.removeClass("ng-scope"),s.$render(),b.on("$destroy",function(){u=void 0;
-v=!1}))}):(u.removeClass("ng-scope"),v=!0)):u=F(f.cloneNode(!1));h.empty();n();d.$watchCollection(C.getWatchables,n)}}}}],Ve=["$locale","$interpolate","$log",function(a,b,d){var c=/{}/g,f=/^when(Minus)?(.+)$/;return{link:function(e,g,h){function k(a){g.text(a||"")}var l=h.count,m=h.$attr.when&&g.attr(h.$attr.when),n=h.offset||0,r=e.$eval(m)||{},s={},t=b.startSymbol(),u=b.endSymbol(),p=t+l+"-"+n+u,x=$.noop,A;q(h,function(a,b){var c=f.exec(b);c&&(c=(c[1]?"-":"")+Q(c[2]),r[c]=g.attr(h.$attr[b]))});q(r,
-function(a,d){s[d]=b(a.replace(c,p))});e.$watch(l,function(b){var c=parseFloat(b),f=ia(c);f||c in r||(c=a.pluralCat(c-n));c===A||f&&ia(A)||(x(),f=s[c],z(f)?(null!=b&&d.debug("ngPluralize: no rule defined for '"+c+"' in "+m),x=w,k()):x=e.$watch(f,k),A=c)})}}}],We=["$parse","$animate","$compile",function(a,b,d){var c=G("ngRepeat"),f=function(a,b,c,d,f,m,n){a[c]=d;f&&(a[f]=m);a.$index=b;a.$first=0===b;a.$last=b===n-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(b&1))};return{restrict:"A",multiElement:!0,
-transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(e,g){var h=g.ngRepeat,k=d.$$createComment("end ngRepeat",h),l=h.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!l)throw c("iexp",h);var m=l[1],n=l[2],r=l[3],s=l[4],l=m.match(/^(?:(\s*[$\w]+)|\(\s*([$\w]+)\s*,\s*([$\w]+)\s*\))$/);if(!l)throw c("iidexp",m);var t=l[3]||l[1],u=l[2];if(r&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(r)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(r)))throw c("badident",
-r);var p,x,A,v,w={$id:Aa};s?p=a(s):(A=function(a,b){return Aa(b)},v=function(a){return a});return function(a,d,e,g,l){p&&(x=function(b,c,d){u&&(w[u]=b);w[t]=c;w.$index=d;return p(a,w)});var m=V();a.$watchCollection(n,function(e){var g,n,p=d[0],s,w=V(),z,y,C,D,F,E,G;r&&(a[r]=e);if(la(e))F=e,n=x||A;else for(G in n=x||v,F=[],e)ua.call(e,G)&&"$"!==G.charAt(0)&&F.push(G);z=F.length;G=Array(z);for(g=0;g<z;g++)if(y=e===F?g:F[g],C=e[y],D=n(y,C,g),m[D])E=m[D],delete m[D],w[D]=E,G[g]=E;else{if(w[D])throw q(G,
-function(a){a&&a.scope&&(m[a.id]=a)}),c("dupes",h,D,C);G[g]={id:D,scope:void 0,clone:void 0};w[D]=!0}for(s in m){E=m[s];D=vb(E.clone);b.leave(D);if(D[0].parentNode)for(g=0,n=D.length;g<n;g++)D[g].$$NG_REMOVED=!0;E.scope.$destroy()}for(g=0;g<z;g++)if(y=e===F?g:F[g],C=e[y],E=G[g],E.scope){s=p;do s=s.nextSibling;while(s&&s.$$NG_REMOVED);E.clone[0]!==s&&b.move(vb(E.clone),null,p);p=E.clone[E.clone.length-1];f(E.scope,g,t,C,u,y,z)}else l(function(a,c){E.scope=c;var d=k.cloneNode(!1);a[a.length++]=d;b.enter(a,
-null,p);p=d;E.clone=a;w[E.id]=E;f(E.scope,g,t,C,u,y,z)});m=w})}}}}],Xe=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngShow,function(b){a[b?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Qe=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngHide,function(b){a[b?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Ye=Va(function(a,b,d){a.$watch(d.ngStyle,function(a,
-d){d&&a!==d&&q(d,function(a,c){b.css(c,"")});a&&b.css(a)},!0)}),Ze=["$animate","$compile",function(a,b){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(d,c,f,e){var g=[],h=[],k=[],l=[],m=function(a,b){return function(c){!1!==c&&a.splice(b,1)}};d.$watch(f.ngSwitch||f.on,function(c){for(var d,f;k.length;)a.cancel(k.pop());d=0;for(f=l.length;d<f;++d){var t=vb(h[d].clone);l[d].$destroy();(k[d]=a.leave(t)).done(m(k,d))}h.length=0;l.length=0;(g=e.cases["!"+c]||e.cases["?"])&&
-q(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=b.$$createComment("end ngSwitchWhen");h.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],$e=Va({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,f){a=d.ngSwitchWhen.split(d.ngSwitchWhenSeparator).sort().filter(function(a,b,c){return c[b-1]!==a});q(a,function(a){c.cases["!"+a]=c.cases["!"+a]||[];c.cases["!"+a].push({transclude:f,element:b})})}}),af=Va({transclude:"element",
-priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,f){c.cases["?"]=c.cases["?"]||[];c.cases["?"].push({transclude:f,element:b})}}),kh=G("ngTransclude"),cf=["$compile",function(a){return{restrict:"EAC",terminal:!0,compile:function(b){var d=a(b.contents());b.empty();return function(a,b,e,g,h){function k(){d(a,function(a){b.append(a)})}if(!h)throw kh("orphan",ya(b));e.ngTransclude===e.$attr.ngTransclude&&(e.ngTransclude="");e=e.ngTransclude||e.ngTranscludeSlot;h(function(a,c){a.length?
-b.append(a):(k(),c.$destroy())},null,e);e&&!h.isSlotFilled(e)&&k()}}}}],Ee=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,d){"text/ng-template"===d.type&&a.put(d.id,b[0].text)}}}],lh={$setViewValue:w,$render:w},mh=["$element","$scope",function(a,b){var d=this,c=new Sa;d.ngModelCtrl=lh;d.unknownOption=F(y.document.createElement("option"));d.renderUnknownOption=function(b){b="? "+Aa(b)+" ?";d.unknownOption.val(b);a.prepend(d.unknownOption);a.val(b)};b.$on("$destroy",
-function(){d.renderUnknownOption=w});d.removeUnknownOption=function(){d.unknownOption.parent()&&d.unknownOption.remove()};d.readValue=function(){d.removeUnknownOption();return a.val()};d.writeValue=function(b){d.hasOption(b)?(d.removeUnknownOption(),a.val(b),""===b&&d.emptyOption.prop("selected",!0)):null==b&&d.emptyOption?(d.removeUnknownOption(),a.val("")):d.renderUnknownOption(b)};d.addOption=function(a,b){if(8!==b[0].nodeType){Ra(a,'"option value"');""===a&&(d.emptyOption=b);var g=c.get(a)||0;
-c.put(a,g+1);d.ngModelCtrl.$render();b[0].hasAttribute("selected")&&(b[0].selected=!0)}};d.removeOption=function(a){var b=c.get(a);b&&(1===b?(c.remove(a),""===a&&(d.emptyOption=void 0)):c.put(a,b-1))};d.hasOption=function(a){return!!c.get(a)};d.registerOption=function(a,b,c,h,k){if(h){var l;c.$observe("value",function(a){x(l)&&d.removeOption(l);l=a;d.addOption(a,b)})}else k?a.$watch(k,function(a,f){c.$set("value",a);f!==a&&d.removeOption(f);d.addOption(a,b)}):d.addOption(c.value,b);b.on("$destroy",
-function(){d.removeOption(c.value);d.ngModelCtrl.$render()})}}],Fe=function(){return{restrict:"E",require:["select","?ngModel"],controller:mh,priority:1,link:{pre:function(a,b,d,c){var f=c[1];if(f){var e=c[0];e.ngModelCtrl=f;b.on("change",function(){a.$apply(function(){f.$setViewValue(e.readValue())})});if(d.multiple){e.readValue=function(){var a=[];q(b.find("option"),function(b){b.selected&&a.push(b.value)});return a};e.writeValue=function(a){var c=new Sa(a);q(b.find("option"),function(a){a.selected=
-x(c.get(a.value))})};var g,h=NaN;a.$watch(function(){h!==f.$viewValue||na(g,f.$viewValue)||(g=ka(f.$viewValue),f.$render());h=f.$viewValue});f.$isEmpty=function(a){return!a||0===a.length}}}},post:function(a,b,d,c){var f=c[1];if(f){var e=c[0];f.$render=function(){e.writeValue(f.$viewValue)}}}}}},Ge=["$interpolate",function(a){return{restrict:"E",priority:100,compile:function(b,d){var c,f;x(d.ngValue)?c=!0:x(d.value)?c=a(d.value,!0):(f=a(b.text(),!0))||d.$set("value",b.text());return function(a,b,d){var k=
-b.parent();(k=k.data("$selectController")||k.parent().data("$selectController"))&&k.registerOption(a,b,d,c,f)}}}}],Nc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){c&&(d.required=!0,c.$validators.required=function(a,b){return!d.required||!c.$isEmpty(b)},d.$observe("required",function(){c.$validate()}))}}},Mc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var f,e=d.ngPattern||d.pattern;d.$observe("pattern",function(a){D(a)&&0<a.length&&(a=
-new RegExp("^"+a+"$"));if(a&&!a.test)throw G("ngPattern")("noregexp",e,a,ya(b));f=a||void 0;c.$validate()});c.$validators.pattern=function(a,b){return c.$isEmpty(b)||z(f)||f.test(b)}}}}},Pc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var f=-1;d.$observe("maxlength",function(a){a=Z(a);f=ia(a)?-1:a;c.$validate()});c.$validators.maxlength=function(a,b){return 0>f||c.$isEmpty(b)||b.length<=f}}}}},Oc=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,
-d,c){if(c){var f=0;d.$observe("minlength",function(a){f=Z(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=f}}}}};y.angular.bootstrap?y.console&&console.log("WARNING: Tried to load angular more than once."):(xe(),ze($),$.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),
-ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "),WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",
-mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,c){var f=a|0,e=c;void 0===e&&(e=Math.min(b(a),3));Math.pow(10,e);return 1==f&&0==
-e?"one":"other"}})}]),F(y.document).ready(function(){se(y.document,Gc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.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:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');
+w(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw Ya("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var d=K(this.text.charAt(this.index));if("."===d||this.isNumber(d))a+=d;else{var c=this.peek();if("e"===d&&this.isExpOperator(c))a+=d;else if(this.isExpOperator(d)&&c&&this.isNumber(c)&&"e"===a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||c&&this.isNumber(c)||"e"!==a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:b,
+text:a,constant:!0,value:Number(a)})},readIdent:function(){var a=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var b=this.peekMultichar();if(!this.isIdentifierContinue(b))break;this.index+=b.length}this.tokens.push({index:a,text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var b=this.index;this.index++;for(var d="",c=a,e=!1;this.index<this.text.length;){var f=this.text.charAt(this.index),c=c+f;if(e)"u"===f?(e=this.text.substring(this.index+
+1,this.index+5),e.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+e+"]"),this.index+=4,d+=String.fromCharCode(parseInt(e,16))):d+=wh[f]||f,e=!1;else if("\\"===f)e=!0;else{if(f===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,value:d});return}d+=f}this.index++}this.throwError("Unterminated quote",b)}};var q=function(a,b){this.lexer=a;this.options=b};q.Program="Program";q.ExpressionStatement="ExpressionStatement";q.AssignmentExpression="AssignmentExpression";q.ConditionalExpression=
+"ConditionalExpression";q.LogicalExpression="LogicalExpression";q.BinaryExpression="BinaryExpression";q.UnaryExpression="UnaryExpression";q.CallExpression="CallExpression";q.MemberExpression="MemberExpression";q.Identifier="Identifier";q.Literal="Literal";q.ArrayExpression="ArrayExpression";q.Property="Property";q.ObjectExpression="ObjectExpression";q.ThisExpression="ThisExpression";q.LocalsExpression="LocalsExpression";q.NGValueParameter="NGValueParameter";q.prototype={ast:function(a){this.text=
+a;this.tokens=this.lexer.lex(a);a=this.program();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);return a},program:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.expressionStatement()),!this.expect(";"))return{type:q.Program,body:a}},expressionStatement:function(){return{type:q.ExpressionStatement,expression:this.filterChain()}},filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},
+expression:function(){return this.assignment()},assignment:function(){var a=this.ternary();if(this.expect("=")){if(!Jd(a))throw Ya("lval");a={type:q.AssignmentExpression,left:a,right:this.assignment(),operator:"="}}return a},ternary:function(){var a=this.logicalOR(),b,d;return this.expect("?")&&(b=this.expression(),this.consume(":"))?(d=this.expression(),{type:q.ConditionalExpression,test:a,alternate:b,consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a={type:q.LogicalExpression,
+operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=this.equality();this.expect("&&");)a={type:q.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect("==","!=","===","!==");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=this.additive(),b;b=this.expect("<",">","<=",">=");)a={type:q.BinaryExpression,operator:b.text,
+left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:q.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+","-","!"))?{type:q.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},
+primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=Ia(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:q.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",
+this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:q.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:q.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:q.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=[a];for(var b={type:q.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());
+return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:q.Identifier,name:a.text}},constant:function(){return{type:q.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");
+return{type:q.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:q.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()):this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")?(this.consume(":"),b.value=this.expression()):b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"),
+b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:q.ObjectExpression,properties:a}},throwError:function(a,b){throw Ya("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw Ya("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw Ya("ueoe",
+this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:q.ThisExpression},$locals:{type:q.LocalsExpression}}};var Hd=2;Ld.prototype={compile:function(a){var b=this;this.state={nextId:0,filters:{},fn:{vars:[],
+body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};Z(a,b.$filter);var d="",c;this.stage="assign";if(c=Kd(a))this.state.computing="assign",d=this.nextId(),this.recurse(c,d),this.return_(d),d="fn.assign="+this.generateFunction("assign","s,v,l");c=Id(a.body);b.stage="inputs";r(c,function(a,c){var d="fn"+c;b.state[d]={vars:[],body:[],own:{}};b.state.computing=d;var k=b.nextId();b.recurse(a,k);b.return_(k);b.state.inputs.push({name:d,isPure:a.isPure});a.watchId=c});this.state.computing="fn";this.stage=
+"main";this.recurse(a);a='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+d+this.watchFns()+"return fn;";a=(new Function("$filter","getStringValue","ifDefined","plus",a))(this.$filter,Tg,Ug,Gd);this.state=this.stage=void 0;return a},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;r(b,function(b){a.push("var "+b.name+"="+d.generateFunction(b.name,"s"));b.isPure&&a.push(b.name,".isPure="+JSON.stringify(b.isPure)+
+";")});b.length&&a.push("fn.inputs=["+b.map(function(a){return a.name}).join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;r(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},
+recurse:function(a,b,d,c,e,f){var g,k,h=this,l,m,p;c=c||E;if(!f&&w(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case q.Program:r(a.body,function(b,c){h.recurse(b.expression,void 0,void 0,function(a){k=a});c!==a.body.length-1?h.current().body.push(k,";"):h.return_(k)});break;case q.Literal:m=this.escape(a.value);this.assign(b,m);c(b||m);break;case q.UnaryExpression:this.recurse(a.argument,void 0,
+void 0,function(a){k=a});m=a.operator+"("+this.ifDefined(k,0)+")";this.assign(b,m);c(m);break;case q.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){k=a});m="+"===a.operator?this.plus(g,k):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(k,0):"("+g+")"+a.operator+"("+k+")";this.assign(b,m);c(m);break;case q.LogicalExpression:b=b||this.nextId();h.recurse(a.left,b);h.if_("&&"===a.operator?b:h.not(b),h.lazyRecurse(a.right,
+b));c(b);break;case q.ConditionalExpression:b=b||this.nextId();h.recurse(a.test,b);h.if_(b,h.lazyRecurse(a.alternate,b),h.lazyRecurse(a.consequent,b));c(b);break;case q.Identifier:b=b||this.nextId();d&&(d.context="inputs"===h.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);h.if_("inputs"===h.stage||h.not(h.getHasOwnProperty("l",a.name)),function(){h.if_("inputs"===h.stage||"s",function(){e&&1!==e&&h.if_(h.isNull(h.nonComputedMember("s",a.name)),
+h.lazyAssign(h.nonComputedMember("s",a.name),"{}"));h.assign(b,h.nonComputedMember("s",a.name))})},b&&h.lazyAssign(b,h.nonComputedMember("l",a.name)));c(b);break;case q.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();h.recurse(a.object,g,void 0,function(){h.if_(h.notNull(g),function(){a.computed?(k=h.nextId(),h.recurse(a.property,k),h.getStringValue(k),e&&1!==e&&h.if_(h.not(h.computedMember(g,k)),h.lazyAssign(h.computedMember(g,k),"{}")),m=h.computedMember(g,k),h.assign(b,
+m),d&&(d.computed=!0,d.name=k)):(e&&1!==e&&h.if_(h.isNull(h.nonComputedMember(g,a.property.name)),h.lazyAssign(h.nonComputedMember(g,a.property.name),"{}")),m=h.nonComputedMember(g,a.property.name),h.assign(b,m),d&&(d.computed=!1,d.name=a.property.name))},function(){h.assign(b,"undefined")});c(b)},!!e);break;case q.CallExpression:b=b||this.nextId();a.filter?(k=h.filter(a.callee.name),l=[],r(a.arguments,function(a){var b=h.nextId();h.recurse(a,b);l.push(b)}),m=k+"("+l.join(",")+")",h.assign(b,m),c(b)):
+(k=h.nextId(),g={},l=[],h.recurse(a.callee,k,g,function(){h.if_(h.notNull(k),function(){r(a.arguments,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m=g.name?h.member(g.context,g.name,g.computed)+"("+l.join(",")+")":k+"("+l.join(",")+")";h.assign(b,m)},function(){h.assign(b,"undefined")});c(b)}));break;case q.AssignmentExpression:k=this.nextId();g={};this.recurse(a.left,void 0,g,function(){h.if_(h.notNull(g.context),function(){h.recurse(a.right,k);m=h.member(g.context,
+g.name,g.computed)+a.operator+k;h.assign(b,m);c(b||m)})},1);break;case q.ArrayExpression:l=[];r(a.elements,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(b||m);break;case q.ObjectExpression:l=[];p=!1;r(a.properties,function(a){a.computed&&(p=!0)});p?(b=b||this.nextId(),this.assign(b,"{}"),r(a.properties,function(a){a.computed?(g=h.nextId(),h.recurse(a.key,g)):g=a.key.type===q.Identifier?a.key.name:""+a.key.value;k=h.nextId();
+h.recurse(a.value,k);h.assign(h.member(b,g,a.computed),k)})):(r(a.properties,function(b){h.recurse(b.value,a.constant?void 0:h.nextId(),void 0,function(a){l.push(h.escape(b.key.type===q.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b,m));c(b||m);break;case q.ThisExpression:this.assign(b,"s");c(b||"s");break;case q.LocalsExpression:this.assign(b,"l");c(b||"l");break;case q.NGValueParameter:this.assign(b,"v"),c(b||"v")}},getHasOwnProperty:function(a,b){var d=a+"."+
+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,
+b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},isNull:function(a){return a+"==null"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,
+b)},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(C(a))return"'"+a.replace(this.stringEscapeRegex,this.stringEscapeFn)+"'";if(X(a))return a.toString();if(!0===a)return"true";if(!1===
+a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw Ya("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};Md.prototype={compile:function(a){var b=this;Z(a,b.$filter);var d,c;if(d=Kd(a))c=this.recurse(d);d=Id(a.body);var e;d&&(e=[],r(d,function(a,c){var d=b.recurse(a);d.isPure=a.isPure;a.input=d;e.push(d);a.watchId=c}));var f=[];r(a.body,
+function(a){f.push(b.recurse(a.expression))});a=0===a.body.length?E:1===a.body.length?f[0]:function(a,b){var c;r(f,function(d){c=d(a,b)});return c};c&&(a.assign=function(a,b,d){return c(a,d,b)});e&&(a.inputs=e);return a},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case q.Literal:return this.value(a.value,b);case q.UnaryExpression:return e=this.recurse(a.argument),this["unary"+a.operator](e,b);case q.BinaryExpression:return c=this.recurse(a.left),
+e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case q.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case q.Identifier:return f.identifier(a.name,b,d);case q.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||(e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,
+e,b,d):this.nonComputedMember(c,e,b,d);case q.CallExpression:return g=[],r(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var p=[],n=0;n<g.length;++n)p.push(g[n](a,c,d,f));a=e.apply(void 0,p,f);return b?{context:void 0,name:void 0,value:a}:a}:function(a,c,d,f){var p=e(a,c,d,f),n;if(null!=p.value){n=[];for(var s=0;s<g.length;++s)n.push(g[s](a,c,d,f));n=p.value.apply(p.context,n)}return b?
+{value:n}:n};case q.AssignmentExpression:return c=this.recurse(a.left,!0,1),e=this.recurse(a.right),function(a,d,f,g){var p=c(a,d,f,g);a=e(a,d,f,g);p.context[p.name]=a;return b?{value:a}:a};case q.ArrayExpression:return g=[],r(a.elements,function(a){g.push(f.recurse(a))}),function(a,c,d,e){for(var f=[],n=0;n<g.length;++n)f.push(g[n](a,c,d,e));return b?{value:f}:f};case q.ObjectExpression:return g=[],r(a.properties,function(a){a.computed?g.push({key:f.recurse(a.key),computed:!0,value:f.recurse(a.value)}):
+g.push({key:a.key.type===q.Identifier?a.key.name:""+a.key.value,computed:!1,value:f.recurse(a.value)})}),function(a,c,d,e){for(var f={},n=0;n<g.length;++n)g[n].computed?f[g[n].key(a,c,d,e)]=g[n].value(a,c,d,e):f[g[n].key]=g[n].value(a,c,d,e);return b?{value:f}:f};case q.ThisExpression:return function(a){return b?{value:a}:a};case q.LocalsExpression:return function(a,c){return b?{value:c}:c};case q.NGValueParameter:return function(a,c,d){return b?{value:d}:d}}},"unary+":function(a,b){return function(d,
+c,e,f){d=a(d,c,e,f);d=w(d)?+d:0;return b?{value:d}:d}},"unary-":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=w(d)?-d:-0;return b?{value:d}:d}},"unary!":function(a,b){return function(d,c,e,f){d=!a(d,c,e,f);return b?{value:d}:d}},"binary+":function(a,b,d){return function(c,e,f,g){var k=a(c,e,f,g);c=b(c,e,f,g);k=Gd(k,c);return d?{value:k}:k}},"binary-":function(a,b,d){return function(c,e,f,g){var k=a(c,e,f,g);c=b(c,e,f,g);k=(w(k)?k:0)-(w(c)?c:0);return d?{value:k}:k}},"binary*":function(a,b,
+d){return function(c,e,f,g){c=a(c,e,f,g)*b(c,e,f,g);return d?{value:c}:c}},"binary/":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)/b(c,e,f,g);return d?{value:c}:c}},"binary%":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)%b(c,e,f,g);return d?{value:c}:c}},"binary===":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)===b(c,e,f,g);return d?{value:c}:c}},"binary!==":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!==b(c,e,f,g);return d?{value:c}:c}},"binary==":function(a,b,d){return function(c,
+e,f,g){c=a(c,e,f,g)==b(c,e,f,g);return d?{value:c}:c}},"binary!=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!=b(c,e,f,g);return d?{value:c}:c}},"binary<":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<b(c,e,f,g);return d?{value:c}:c}},"binary>":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c=
+a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k)?b(e,f,g,k):d(e,f,g,k);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0,name:void 0,value:a}:a}},identifier:function(a,b,d){return function(c,e,f,g){c=
+e&&a in e?e:c;d&&1!==d&&c&&null==c[a]&&(c[a]={});e=c?c[a]:void 0;return b?{context:c,name:a,value:e}:e}},computedMember:function(a,b,d,c){return function(e,f,g,k){var h=a(e,f,g,k),l,m;null!=h&&(l=b(e,f,g,k),l+="",c&&1!==c&&h&&!h[l]&&(h[l]={}),m=h[l]);return d?{context:h,name:l,value:m}:m}},nonComputedMember:function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k);c&&1!==c&&e&&null==e[b]&&(e[b]={});f=null!=e?e[b]:void 0;return d?{context:e,name:b,value:f}:f}},inputs:function(a,b){return function(d,
+c,e,f){return f?f[b]:a(d,c,e)}}};Nb.prototype={constructor:Nb,parse:function(a){a=this.getAst(a);var b=this.astCompiler.compile(a.ast),d=a.ast;b.literal=0===d.body.length||1===d.body.length&&(d.body[0].expression.type===q.Literal||d.body[0].expression.type===q.ArrayExpression||d.body[0].expression.type===q.ObjectExpression);b.constant=a.ast.constant;b.oneTime=a.oneTime;return b},getAst:function(a){var b=!1;a=a.trim();":"===a.charAt(0)&&":"===a.charAt(1)&&(b=!0,a=a.substring(2));return{ast:this.ast.ast(a),
+oneTime:b}}};var Ea=F("$sce"),W={HTML:"html",CSS:"css",MEDIA_URL:"mediaUrl",URL:"url",RESOURCE_URL:"resourceUrl",JS:"js"},Dc=/_([a-z])/g,Zg=F("$templateRequest"),$g=F("$timeout"),aa=z.document.createElement("a"),Qd=ga(z.location.href),Na;aa.href="http://[::1]";var ah="[::1]"===aa.hostname;Rd.$inject=["$document"];fd.$inject=["$provide"];var Yd=22,Xd=".",Fc="0";Sd.$inject=["$locale"];Ud.$inject=["$locale"];var lh={yyyy:ea("FullYear",4,0,!1,!0),yy:ea("FullYear",2,0,!0,!0),y:ea("FullYear",1,0,!1,!0),
+MMMM:lb("Month"),MMM:lb("Month",!0),MM:ea("Month",2,1),M:ea("Month",1,1),LLLL:lb("Month",!1,!0),dd:ea("Date",2),d:ea("Date",1),HH:ea("Hours",2),H:ea("Hours",1),hh:ea("Hours",2,-12),h:ea("Hours",1,-12),mm:ea("Minutes",2),m:ea("Minutes",1),ss:ea("Seconds",2),s:ea("Seconds",1),sss:ea("Milliseconds",3),EEEE:lb("Day"),EEE:lb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Pb(Math[0<a?"floor":"ceil"](a/60),2)+Pb(Math.abs(a%60),2))},
+ww:$d(2),w:$d(1),G:Gc,GG:Gc,GGG:Gc,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},kh=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\s\S]*)/,jh=/^-?\d+$/;Td.$inject=["$locale"];var eh=ia(K),fh=ia(vb);Vd.$inject=["$parse"];var Re=ia({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===la.call(b.prop("href"))?"xlink:href":"href";
+b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),wb={};r(Hb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!==a){var c=xa("ng-"+b),e=d;"checked"===a&&(e=function(a,b,e){e.ngModel!==e[c]&&d(a,b,e)});wb[c]=function(){return{restrict:"A",priority:100,link:e}}}});r(vd,function(a,b){wb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"===e.ngPattern.charAt(0)&&(c=e.ngPattern.match(ke))){e.$set("ngPattern",new RegExp(c[1],
+c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});r(["src","srcset","href"],function(a){var b=xa("ng-"+a);wb[b]=["$sce",function(d){return{priority:99,link:function(c,e,f){var g=a,k=a;"href"===a&&"[object SVGAnimatedString]"===la.call(e.prop("href"))&&(k="xlinkHref",f.$attr[k]="xlink:href",g=null);f.$set(b,d.getTrustedMediaUrl(f[b]));f.$observe(b,function(b){b?(f.$set(k,b),wa&&g&&e.prop(g,f[k])):"href"===a&&f.$set(k,null)})}}}]});var mb={$addControl:E,$getControls:ia([]),$$renameControl:function(a,
+b){a.$name=b},$removeControl:E,$setValidity:E,$setDirty:E,$setPristine:E,$setSubmitted:E,$$setSubmitted:E};Qb.$inject=["$element","$attrs","$scope","$animate","$interpolate"];Qb.prototype={$rollbackViewValue:function(){r(this.$$controls,function(a){a.$rollbackViewValue()})},$commitViewValue:function(){r(this.$$controls,function(a){a.$commitViewValue()})},$addControl:function(a){Ja(a.$name,"input");this.$$controls.push(a);a.$name&&(this[a.$name]=a);a.$$parentForm=this},$getControls:function(){return ja(this.$$controls)},
+$$renameControl:function(a,b){var d=a.$name;this[d]===a&&delete this[d];this[b]=a;a.$name=b},$removeControl:function(a){a.$name&&this[a.$name]===a&&delete this[a.$name];r(this.$pending,function(b,d){this.$setValidity(d,null,a)},this);r(this.$error,function(b,d){this.$setValidity(d,null,a)},this);r(this.$$success,function(b,d){this.$setValidity(d,null,a)},this);cb(this.$$controls,a);a.$$parentForm=mb},$setDirty:function(){this.$$animate.removeClass(this.$$element,Za);this.$$animate.addClass(this.$$element,
+Wb);this.$dirty=!0;this.$pristine=!1;this.$$parentForm.$setDirty()},$setPristine:function(){this.$$animate.setClass(this.$$element,Za,Wb+" ng-submitted");this.$dirty=!1;this.$pristine=!0;this.$submitted=!1;r(this.$$controls,function(a){a.$setPristine()})},$setUntouched:function(){r(this.$$controls,function(a){a.$setUntouched()})},$setSubmitted:function(){for(var a=this;a.$$parentForm&&a.$$parentForm!==mb;)a=a.$$parentForm;a.$$setSubmitted()},$$setSubmitted:function(){this.$$animate.addClass(this.$$element,
+"ng-submitted");this.$submitted=!0;r(this.$$controls,function(a){a.$$setSubmitted&&a.$$setSubmitted()})}};ce({clazz:Qb,set:function(a,b,d){var c=a[b];c?-1===c.indexOf(d)&&c.push(d):a[b]=[d]},unset:function(a,b,d){var c=a[b];c&&(cb(c,d),0===c.length&&delete a[b])}});var oe=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||E}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Qb,compile:function(d,f){d.addClass(Za).addClass(nb);
+var g=f.name?"name":a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var p=f[0];if(!("action"in e)){var n=function(b){a.$apply(function(){p.$commitViewValue();p.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",n);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",n)},0,!1)})}(f[1]||p.$$parentForm).$addControl(p);var s=g?c(p.$name):E;g&&(s(a,p),e.$observe(g,function(b){p.$name!==b&&(s(a,void 0),p.$$parentForm.$$renameControl(p,b),s=c(p.$name),s(a,p))}));
+d.on("$destroy",function(){p.$$parentForm.$removeControl(p);s(a,void 0);S(p,mb)})}}}}}]},Se=oe(),df=oe(!0),mh=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,xh=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,yh=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,
+nh=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,pe=/^(\d{4,})-(\d{2})-(\d{2})$/,qe=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Oc=/^(\d{4,})-W(\d\d)$/,re=/^(\d{4,})-(\d\d)$/,se=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,ee=T();r(["date","datetime-local","month","time","week"],function(a){ee[a]=!0});var te={text:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c)},date:ob("date",pe,Rb(pe,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":ob("datetimelocal",qe,Rb(qe,"yyyy MM dd HH mm ss sss".split(" ")),
+"yyyy-MM-ddTHH:mm:ss.sss"),time:ob("time",se,Rb(se,["HH","mm","ss","sss"]),"HH:mm:ss.sss"),week:ob("week",Oc,function(a,b){if(ha(a))return a;if(C(a)){Oc.lastIndex=0;var d=Oc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,k=0,h=Zd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),k=b.getMilliseconds());return new Date(c,0,h.getDate()+e,d,f,g,k)}}return NaN},"yyyy-Www"),month:ob("month",re,Rb(re,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f,g,k){Jc(a,b,d,c,"number");fe(c);Sa(a,
+b,d,c,e,f);var h;if(w(d.min)||d.ngMin){var l=d.min||k(d.ngMin)(a);h=na(l);c.$validators.min=function(a,b){return c.$isEmpty(b)||A(h)||b>=h};d.$observe("min",function(a){a!==l&&(h=na(a),l=a,c.$validate())})}if(w(d.max)||d.ngMax){var m=d.max||k(d.ngMax)(a),p=na(m);c.$validators.max=function(a,b){return c.$isEmpty(b)||A(p)||b<=p};d.$observe("max",function(a){a!==m&&(p=na(a),m=a,c.$validate())})}if(w(d.step)||d.ngStep){var n=d.step||k(d.ngStep)(a),s=na(n);c.$validators.step=function(a,b){return c.$isEmpty(b)||
+A(s)||ge(b,h||0,s)};d.$observe("step",function(a){a!==n&&(s=na(a),n=a,c.$validate())})}},url:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c);c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||xh.test(d)}},email:function(a,b,d,c,e,f){Sa(a,b,d,c,e,f);Ic(c);c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||yh.test(d)}},radio:function(a,b,d,c){var e=!d.ngTrim||"false"!==V(d.ngTrim);A(d.name)&&b.attr("name",++qb);b.on("change",function(a){var g;b[0].checked&&(g=d.value,e&&(g=
+V(g)),c.$setViewValue(g,a&&a.type))});c.$render=function(){var a=d.value;e&&(a=V(a));b[0].checked=a===c.$viewValue};d.$observe("value",c.$render)},range:function(a,b,d,c,e,f){function g(a,c){b.attr(a,d[a]);var e=d[a];d.$observe(a,function(a){a!==e&&(e=a,c(a))})}function k(a){p=na(a);Y(c.$modelValue)||(m?(a=b.val(),p>a&&(a=p,b.val(a)),c.$setViewValue(a)):c.$validate())}function h(a){n=na(a);Y(c.$modelValue)||(m?(a=b.val(),n<a&&(b.val(n),a=n<p?p:n),c.$setViewValue(a)):c.$validate())}function l(a){s=
+na(a);Y(c.$modelValue)||(m?c.$viewValue!==b.val()&&c.$setViewValue(b.val()):c.$validate())}Jc(a,b,d,c,"range");fe(c);Sa(a,b,d,c,e,f);var m=c.$$hasNativeValidators&&"range"===b[0].type,p=m?0:void 0,n=m?100:void 0,s=m?1:void 0,r=b[0].validity;a=w(d.min);e=w(d.max);f=w(d.step);var q=c.$render;c.$render=m&&w(r.rangeUnderflow)&&w(r.rangeOverflow)?function(){q();c.$setViewValue(b.val())}:q;a&&(p=na(d.min),c.$validators.min=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||A(p)||b>=p},g("min",k));
+e&&(n=na(d.max),c.$validators.max=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||A(n)||b<=n},g("max",h));f&&(s=na(d.step),c.$validators.step=m?function(){return!r.stepMismatch}:function(a,b){return c.$isEmpty(b)||A(s)||ge(b,p||0,s)},g("step",l))},checkbox:function(a,b,d,c,e,f,g,k){var h=he(k,a,"ngTrueValue",d.ngTrueValue,!0),l=he(k,a,"ngFalseValue",d.ngFalseValue,!1);b.on("change",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=
+function(a){return!1===a};c.$formatters.push(function(a){return va(a,h)});c.$parsers.push(function(a){return a?h:l})},hidden:E,button:E,submit:E,reset:E,file:E},$c=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,f,g,k){k[0]&&(te[K(g.type)]||te.text)(e,f,g,k[0],b,a,d,c)}}}}],Af=function(){var a={configurable:!0,enumerable:!1,get:function(){return this.getAttribute("value")||""},set:function(a){this.setAttribute("value",a)}};
+return{restrict:"E",priority:200,compile:function(b,d){if("hidden"===K(d.type))return{pre:function(b,d,f,g){b=d[0];b.parentNode&&b.parentNode.insertBefore(b,b.nextSibling);Object.defineProperty&&Object.defineProperty(b,"value",a)}}}}},zh=/^(true|false|\d+)$/,xf=function(){function a(a,d,c){var e=w(c)?c:9===wa?"":null;a.prop("value",e);d.$set("value",c)}return{restrict:"A",priority:100,compile:function(b,d){return zh.test(d.ngValue)?function(b,d,f){b=b.$eval(f.ngValue);a(d,f,b)}:function(b,d,f){b.$watch(f.ngValue,
+function(b){a(d,f,b)})}}}},We=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=jc(a)})}}}}],Ye=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=A(a)?"":a})}}}}],
+Xe=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(b){return a.valueOf(b)});d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){var d=f(b);c.html(a.getTrustedHtml(d)||"")})}}}}],wf=ia({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Ze=Lc("",!0),af=Lc("Odd",0),$e=Lc("Even",1),bf=Ra({compile:function(a,
+b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),cf=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],ed={},Ah={blur:!0,focus:!0};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=xa("ng-"+a);ed[b]=["$parse","$rootScope","$exceptionHandler",function(d,c,e){return sd(d,c,e,b,a,Ah[a])}]});var ff=["$animate","$compile",function(a,b){return{multiElement:!0,
+transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var k,h,l;d.$watch(e.ngIf,function(d){d?h||g(function(d,f){h=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);k={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),h&&(h.$destroy(),h=null),k&&(l=ub(k.clone),a.leave(l).done(function(a){!1!==a&&(l=null)}),k=null))})}}}],gf=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",
+controller:ca.noop,compile:function(c,e){var f=e.ngInclude||e.src,g=e.onload||"",k=e.autoscroll;return function(c,e,m,p,n){var r=0,q,t,x,v=function(){t&&(t.remove(),t=null);q&&(q.$destroy(),q=null);x&&(d.leave(x).done(function(a){!1!==a&&(t=null)}),t=x,x=null)};c.$watch(f,function(f){var m=function(a){!1===a||!w(k)||k&&!c.$eval(k)||b()},t=++r;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&t===r){var b=c.$new();p.template=a;a=n(b,function(a){v();d.enter(a,null,e).done(m)});q=b;x=a;q.$emit("$includeContentLoaded",
+f);c.$eval(g)}},function(){c.$$destroyed||t!==r||(v(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(v(),p.template=null)})}}}}],zf=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){la.call(d[0]).match(/SVG/)?(d.empty(),a(gd(e.template,z.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],hf=Ra({priority:450,compile:function(){return{pre:function(a,
+b,d){a.$eval(d.ngInit)}}}}),vf=function(){return{restrict:"A",priority:100,require:"ngModel",link:function(a,b,d,c){var e=d.ngList||", ",f="false"!==d.ngTrim,g=f?V(e):e;c.$parsers.push(function(a){if(!A(a)){var b=[];a&&r(a.split(g),function(a){a&&b.push(f?V(a):a)});return b}});c.$formatters.push(function(a){if(H(a))return a.join(e)});c.$isEmpty=function(a){return!a||!a.length}}}},nb="ng-valid",be="ng-invalid",Za="ng-pristine",Wb="ng-dirty",pb=F("ngModel");Sb.$inject="$scope $exceptionHandler $attrs $element $parse $animate $timeout $q $interpolate".split(" ");
+Sb.prototype={$$initGetterSetters:function(){if(this.$options.getOption("getterSetter")){var a=this.$$parse(this.$$attr.ngModel+"()"),b=this.$$parse(this.$$attr.ngModel+"($$$p)");this.$$ngModelGet=function(b){var c=this.$$parsedNgModel(b);B(c)&&(c=a(b));return c};this.$$ngModelSet=function(a,c){B(this.$$parsedNgModel(a))?b(a,{$$$p:c}):this.$$parsedNgModelAssign(a,c)}}else if(!this.$$parsedNgModel.assign)throw pb("nonassign",this.$$attr.ngModel,Aa(this.$$element));},$render:E,$isEmpty:function(a){return A(a)||
+""===a||null===a||a!==a},$$updateEmptyClasses:function(a){this.$isEmpty(a)?(this.$$animate.removeClass(this.$$element,"ng-not-empty"),this.$$animate.addClass(this.$$element,"ng-empty")):(this.$$animate.removeClass(this.$$element,"ng-empty"),this.$$animate.addClass(this.$$element,"ng-not-empty"))},$setPristine:function(){this.$dirty=!1;this.$pristine=!0;this.$$animate.removeClass(this.$$element,Wb);this.$$animate.addClass(this.$$element,Za)},$setDirty:function(){this.$dirty=!0;this.$pristine=!1;this.$$animate.removeClass(this.$$element,
+Za);this.$$animate.addClass(this.$$element,Wb);this.$$parentForm.$setDirty()},$setUntouched:function(){this.$touched=!1;this.$untouched=!0;this.$$animate.setClass(this.$$element,"ng-untouched","ng-touched")},$setTouched:function(){this.$touched=!0;this.$untouched=!1;this.$$animate.setClass(this.$$element,"ng-touched","ng-untouched")},$rollbackViewValue:function(){this.$$timeout.cancel(this.$$pendingDebounce);this.$viewValue=this.$$lastCommittedViewValue;this.$render()},$validate:function(){if(!Y(this.$modelValue)){var a=
+this.$$lastCommittedViewValue,b=this.$$rawModelValue,d=this.$valid,c=this.$modelValue,e=this.$options.getOption("allowInvalid"),f=this;this.$$runValidators(b,a,function(a){e||d===a||(f.$modelValue=a?b:void 0,f.$modelValue!==c&&f.$$writeModelToScope())})}},$$runValidators:function(a,b,d){function c(){var c=!0;r(h.$validators,function(d,e){var g=Boolean(d(a,b));c=c&&g;f(e,g)});return c?!0:(r(h.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;r(h.$asyncValidators,function(e,
+g){var h=e(a,b);if(!h||!B(h.then))throw pb("nopromise",h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?h.$$q.all(c).then(function(){g(d)},E):g(!0)}function f(a,b){k===h.$$currentValidationRunId&&h.$setValidity(a,b)}function g(a){k===h.$$currentValidationRunId&&d(a)}this.$$currentValidationRunId++;var k=this.$$currentValidationRunId,h=this;(function(){var a=h.$$parserName;if(A(h.$$parserValid))f(a,null);else return h.$$parserValid||(r(h.$validators,function(a,
+b){f(b,null)}),r(h.$asyncValidators,function(a,b){f(b,null)})),f(a,h.$$parserValid),h.$$parserValid;return!0})()?c()?e():g(!1):g(!1)},$commitViewValue:function(){var a=this.$viewValue;this.$$timeout.cancel(this.$$pendingDebounce);if(this.$$lastCommittedViewValue!==a||""===a&&this.$$hasNativeValidators)this.$$updateEmptyClasses(a),this.$$lastCommittedViewValue=a,this.$pristine&&this.$setDirty(),this.$$parseAndValidate()},$$parseAndValidate:function(){var a=this.$$lastCommittedViewValue,b=this;this.$$parserValid=
+A(a)?void 0:!0;this.$setValidity(this.$$parserName,null);this.$$parserName="parse";if(this.$$parserValid)for(var d=0;d<this.$parsers.length;d++)if(a=this.$parsers[d](a),A(a)){this.$$parserValid=!1;break}Y(this.$modelValue)&&(this.$modelValue=this.$$ngModelGet(this.$$scope));var c=this.$modelValue,e=this.$options.getOption("allowInvalid");this.$$rawModelValue=a;e&&(this.$modelValue=a,b.$modelValue!==c&&b.$$writeModelToScope());this.$$runValidators(a,this.$$lastCommittedViewValue,function(d){e||(b.$modelValue=
+d?a:void 0,b.$modelValue!==c&&b.$$writeModelToScope())})},$$writeModelToScope:function(){this.$$ngModelSet(this.$$scope,this.$modelValue);r(this.$viewChangeListeners,function(a){try{a()}catch(b){this.$$exceptionHandler(b)}},this)},$setViewValue:function(a,b){this.$viewValue=a;this.$options.getOption("updateOnDefault")&&this.$$debounceViewValueCommit(b)},$$debounceViewValueCommit:function(a){var b=this.$options.getOption("debounce");X(b[a])?b=b[a]:X(b["default"])&&-1===this.$options.getOption("updateOn").indexOf(a)?
+b=b["default"]:X(b["*"])&&(b=b["*"]);this.$$timeout.cancel(this.$$pendingDebounce);var d=this;0<b?this.$$pendingDebounce=this.$$timeout(function(){d.$commitViewValue()},b):this.$$rootScope.$$phase?this.$commitViewValue():this.$$scope.$apply(function(){d.$commitViewValue()})},$overrideModelOptions:function(a){this.$options=this.$options.createChild(a);this.$$setUpdateOnEvents()},$processModelValue:function(){var a=this.$$format();this.$viewValue!==a&&(this.$$updateEmptyClasses(a),this.$viewValue=this.$$lastCommittedViewValue=
+a,this.$render(),this.$$runValidators(this.$modelValue,this.$viewValue,E))},$$format:function(){for(var a=this.$formatters,b=a.length,d=this.$modelValue;b--;)d=a[b](d);return d},$$setModelValue:function(a){this.$modelValue=this.$$rawModelValue=a;this.$$parserValid=void 0;this.$processModelValue()},$$setUpdateOnEvents:function(){this.$$updateEvents&&this.$$element.off(this.$$updateEvents,this.$$updateEventHandler);if(this.$$updateEvents=this.$options.getOption("updateOn"))this.$$element.on(this.$$updateEvents,
+this.$$updateEventHandler)},$$updateEventHandler:function(a){this.$$debounceViewValueCommit(a&&a.type)}};ce({clazz:Sb,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]}});var uf=["$rootScope",function(a){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Sb,priority:1,compile:function(b){b.addClass(Za).addClass("ng-untouched").addClass(nb);return{pre:function(a,b,e,f){var g=f[0];b=f[1]||g.$$parentForm;if(f=f[2])g.$options=f.$options;g.$$initGetterSetters();b.$addControl(g);
+e.$observe("name",function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,a)});a.$on("$destroy",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,e,f){function g(){k.$setTouched()}var k=f[0];k.$$setUpdateOnEvents();c.on("blur",function(){k.$touched||(a.$$phase?b.$evalAsync(g):b.$apply(g))})}}}}}],Tb,Bh=/(\s+|^)default(\s+|$)/;Mc.prototype={getOption:function(a){return this.$$options[a]},createChild:function(a){var b=!1;a=S({},a);r(a,function(d,c){"$inherit"===d?"*"===c?b=!0:(a[c]=
+this.$$options[c],"updateOn"===c&&(a.updateOnDefault=this.$$options.updateOnDefault)):"updateOn"===c&&(a.updateOnDefault=!1,a[c]=V(d.replace(Bh,function(){a.updateOnDefault=!0;return" "})))},this);b&&(delete a["*"],ie(a,this.$$options));ie(a,Tb.$$options);return new Mc(a)}};Tb=new Mc({updateOn:"",updateOnDefault:!0,debounce:0,getterSetter:!1,allowInvalid:!1,timezone:null});var yf=function(){function a(a,d){this.$$attrs=a;this.$$scope=d}a.$inject=["$attrs","$scope"];a.prototype={$onInit:function(){var a=
+this.parentCtrl?this.parentCtrl.$options:Tb,d=this.$$scope.$eval(this.$$attrs.ngModelOptions);this.$options=a.createChild(d)}};return{restrict:"A",priority:10,require:{parentCtrl:"?^^ngModelOptions"},bindToController:!0,controller:a}},jf=Ra({terminal:!0,priority:1E3}),Ch=F("ngOptions"),Dh=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\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]+?))?$/,
+sf=["$compile","$document","$parse",function(a,b,d){function c(a,b,c){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}function f(a){var b;if(!r&&za(a))b=a;else{b=[];for(var c in a)a.hasOwnProperty(c)&&"$"!==c.charAt(0)&&b.push(c)}return b}var p=a.match(Dh);if(!p)throw Ch("iexp",a,Aa(b));var n=p[5]||p[7],r=p[6];a=/ as /.test(p[0])&&p[1];var q=p[9];b=d(p[2]?p[1]:n);var t=a&&d(a)||b,w=q&&d(q),v=q?function(a,b){return w(c,b)}:function(a){return La(a)},
+x=function(a,b){return v(a,B(a,b))},A=d(p[2]||p[1]),y=d(p[3]||""),J=d(p[4]||""),I=d(p[8]),z={},B=r?function(a,b){z[r]=b;z[n]=a;return z}:function(a){z[n]=a;return z};return{trackBy:q,getTrackByValue:x,getWatchables:d(I,function(a){var b=[];a=a||[];for(var d=f(a),e=d.length,g=0;g<e;g++){var k=a===d?g:d[g],l=a[k],k=B(l,k),l=v(l,k);b.push(l);if(p[2]||p[1])l=A(c,k),b.push(l);p[4]&&(k=J(c,k),b.push(k))}return b}),getOptions:function(){for(var a=[],b={},d=I(c)||[],g=f(d),k=g.length,n=0;n<k;n++){var p=d===
+g?n:g[n],r=B(d[p],p),s=t(c,r),p=v(s,r),w=A(c,r),z=y(c,r),r=J(c,r),s=new e(p,s,w,z,r);a.push(s);b[p]=s}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[x(a)]},getViewValueFromOption:function(a){return q?Ia(a.viewValue):a.viewValue}}}}}var e=z.document.createElement("option"),f=z.document.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=E},post:function(d,k,h,l){function m(a){var b=(a=v.getOptionFromViewValue(a))&&
+a.element;b&&!b.selected&&(b.selected=!0);return a}function p(a,b){a.element=b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,b.textContent=a.label);b.value=a.selectValue}var n=l[0],q=l[1],A=h.multiple;l=0;for(var t=k.children(),z=t.length;l<z;l++)if(""===t[l].value){n.hasEmptyOption=!0;n.emptyOption=t.eq(l);break}k.empty();l=!!n.emptyOption;x(e.cloneNode(!1)).val("?");var v,B=c(h.ngOptions,k,d),C=b[0].createDocumentFragment();n.generateUnknownOptionValue=function(a){return"?"};A?(n.writeValue=
+function(a){if(v){var b=a&&a.map(m)||[];v.items.forEach(function(a){a.element.selected&&-1===Array.prototype.indexOf.call(b,a)&&(a.element.selected=!1)})}},n.readValue=function(){var a=k.val()||[],b=[];r(a,function(a){(a=v.selectValueMap[a])&&!a.disabled&&b.push(v.getViewValueFromOption(a))});return b},B.trackBy&&d.$watchCollection(function(){if(H(q.$viewValue))return q.$viewValue.map(function(a){return B.getTrackByValue(a)})},function(){q.$render()})):(n.writeValue=function(a){if(v){var b=k[0].options[k[0].selectedIndex],
+c=v.getOptionFromViewValue(a);b&&b.removeAttribute("selected");c?(k[0].value!==c.selectValue&&(n.removeUnknownOption(),k[0].value=c.selectValue,c.element.selected=!0),c.element.setAttribute("selected","selected")):n.selectUnknownOrEmptyOption(a)}},n.readValue=function(){var a=v.selectValueMap[k.val()];return a&&!a.disabled?(n.unselectEmptyOption(),n.removeUnknownOption(),v.getViewValueFromOption(a)):null},B.trackBy&&d.$watch(function(){return B.getTrackByValue(q.$viewValue)},function(){q.$render()}));
+l&&(a(n.emptyOption)(d),k.prepend(n.emptyOption),8===n.emptyOption[0].nodeType?(n.hasEmptyOption=!1,n.registerOption=function(a,b){""===b.val()&&(n.hasEmptyOption=!0,n.emptyOption=b,n.emptyOption.removeClass("ng-scope"),q.$render(),b.on("$destroy",function(){var a=n.$isEmptyOptionSelected();n.hasEmptyOption=!1;n.emptyOption=void 0;a&&q.$render()}))}):n.emptyOption.removeClass("ng-scope"));d.$watchCollection(B.getWatchables,function(){var a=v&&n.readValue();if(v)for(var b=v.items.length-1;0<=b;b--){var c=
+v.items[b];w(c.group)?Gb(c.element.parentNode):Gb(c.element)}v=B.getOptions();var d={};v.items.forEach(function(a){var b;if(w(a.group)){b=d[a.group];b||(b=f.cloneNode(!1),C.appendChild(b),b.label=null===a.group?"null":a.group,d[a.group]=b);var c=e.cloneNode(!1);b.appendChild(c);p(a,c)}else b=e.cloneNode(!1),C.appendChild(b),p(a,b)});k[0].appendChild(C);q.$render();q.$isEmpty(a)||(b=n.readValue(),(B.trackBy||A?va(a,b):a===b)||(q.$setViewValue(b),q.$render()))})}}}}],kf=["$locale","$interpolate","$log",
+function(a,b,d){var c=/{}/g,e=/^when(Minus)?(.+)$/;return{link:function(f,g,k){function h(a){g.text(a||"")}var l=k.count,m=k.$attr.when&&g.attr(k.$attr.when),p=k.offset||0,n=f.$eval(m)||{},q={},w=b.startSymbol(),t=b.endSymbol(),x=w+l+"-"+p+t,v=ca.noop,z;r(k,function(a,b){var c=e.exec(b);c&&(c=(c[1]?"-":"")+K(c[2]),n[c]=g.attr(k.$attr[b]))});r(n,function(a,d){q[d]=b(a.replace(c,x))});f.$watch(l,function(b){var c=parseFloat(b),e=Y(c);e||c in n||(c=a.pluralCat(c-p));c===z||e&&Y(z)||(v(),e=q[c],A(e)?
+(null!=b&&d.debug("ngPluralize: no rule defined for '"+c+"' in "+m),v=E,h()):v=f.$watch(e,h),z=c)})}}}],ue=F("ngRef"),lf=["$parse",function(a){return{priority:-1,restrict:"A",compile:function(b,d){var c=xa(ua(b)),e=a(d.ngRef),f=e.assign||function(){throw ue("nonassign",d.ngRef);};return function(a,b,h){var l;if(h.hasOwnProperty("ngRefRead"))if("$element"===h.ngRefRead)l=b;else{if(l=b.data("$"+h.ngRefRead+"Controller"),!l)throw ue("noctrl",h.ngRefRead,d.ngRef);}else l=b.data("$"+c+"Controller");l=
+l||b;f(a,l);b.on("$destroy",function(){e(a)===l&&f(a,null)})}}}}],mf=["$parse","$animate","$compile",function(a,b,d){var c=F("ngRepeat"),e=function(a,b,c,d,e,f,g){a[c]=d;e&&(a[e]=f);a.$index=b;a.$first=0===b;a.$last=b===g-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(b&1))},f=function(a,b,c){return La(c)},g=function(a,b){return b};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(k,h){var l=h.ngRepeat,m=d.$$createComment("end ngRepeat",
+l),p=l.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);if(!p)throw c("iexp",l);var n=p[1],q=p[2],w=p[3],t=p[4],p=n.match(/^(?:(\s*[$\w]+)|\(\s*([$\w]+)\s*,\s*([$\w]+)\s*\))$/);if(!p)throw c("iidexp",n);var x=p[3]||p[1],v=p[2];if(w&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(w)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(w)))throw c("badident",w);var A;if(t){var z={$id:La},y=a(t);A=function(a,b,c,d){v&&
+(z[v]=b);z[x]=c;z.$index=d;return y(a,z)}}return function(a,d,h,k,n){var p=T();a.$watchCollection(q,function(h){var k,q,t=d[0],s,y=T(),B,C,E,D,H,F,K;w&&(a[w]=h);if(za(h))H=h,q=A||f;else for(K in q=A||g,H=[],h)ta.call(h,K)&&"$"!==K.charAt(0)&&H.push(K);B=H.length;K=Array(B);for(k=0;k<B;k++)if(C=h===H?k:H[k],E=h[C],D=q(a,C,E,k),p[D])F=p[D],delete p[D],y[D]=F,K[k]=F;else{if(y[D])throw r(K,function(a){a&&a.scope&&(p[a.id]=a)}),c("dupes",l,D,E);K[k]={id:D,scope:void 0,clone:void 0};y[D]=!0}z&&(z[x]=void 0);
+for(s in p){F=p[s];D=ub(F.clone);b.leave(D);if(D[0].parentNode)for(k=0,q=D.length;k<q;k++)D[k].$$NG_REMOVED=!0;F.scope.$destroy()}for(k=0;k<B;k++)if(C=h===H?k:H[k],E=h[C],F=K[k],F.scope){s=t;do s=s.nextSibling;while(s&&s.$$NG_REMOVED);F.clone[0]!==s&&b.move(ub(F.clone),null,t);t=F.clone[F.clone.length-1];e(F.scope,k,x,E,v,C,B)}else n(function(a,c){F.scope=c;var d=m.cloneNode(!1);a[a.length++]=d;b.enter(a,null,t);t=d;F.clone=a;y[F.id]=F;e(F.scope,k,x,E,v,C,B)});p=y})}}}}],nf=["$animate",function(a){return{restrict:"A",
+multiElement:!0,link:function(b,d,c){b.$watch(c.ngShow,function(b){a[b?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],ef=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngHide,function(b){a[b?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],of=Ra(function(a,b,d){a.$watchCollection(d.ngStyle,function(a,d){d&&a!==d&&r(d,function(a,c){b.css(c,"")});a&&b.css(a)})}),pf=["$animate","$compile",function(a,
+b){return{require:"ngSwitch",controller:["$scope",function(){this.cases={}}],link:function(d,c,e,f){var g=[],k=[],h=[],l=[],m=function(a,b){return function(c){!1!==c&&a.splice(b,1)}};d.$watch(e.ngSwitch||e.on,function(c){for(var d,e;h.length;)a.cancel(h.pop());d=0;for(e=l.length;d<e;++d){var q=ub(k[d].clone);l[d].$destroy();(h[d]=a.leave(q)).done(m(h,d))}k.length=0;l.length=0;(g=f.cases["!"+c]||f.cases["?"])&&r(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=b.$$createComment("end ngSwitchWhen");
+k.push({clone:d});a.enter(d,f.parent(),f)})})})}}}],qf=Ra({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){a=d.ngSwitchWhen.split(d.ngSwitchWhenSeparator).sort().filter(function(a,b,c){return c[b-1]!==a});r(a,function(a){c.cases["!"+a]=c.cases["!"+a]||[];c.cases["!"+a].push({transclude:e,element:b})})}}),rf=Ra({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){c.cases["?"]=c.cases["?"]||[];c.cases["?"].push({transclude:e,
+element:b})}}),Eh=F("ngTransclude"),tf=["$compile",function(a){return{restrict:"EAC",compile:function(b){var d=a(b.contents());b.empty();return function(a,b,f,g,k){function h(){d(a,function(a){b.append(a)})}if(!k)throw Eh("orphan",Aa(b));f.ngTransclude===f.$attr.ngTransclude&&(f.ngTransclude="");f=f.ngTransclude||f.ngTranscludeSlot;k(function(a,c){var d;if(d=a.length)a:{d=0;for(var f=a.length;d<f;d++){var g=a[d];if(g.nodeType!==Pa||g.nodeValue.trim()){d=!0;break a}}d=void 0}d?b.append(a):(h(),c.$destroy())},
+null,f);f&&!k.isSlotFilled(f)&&h()}}}}],Te=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,d){"text/ng-template"===d.type&&a.put(d.id,b[0].text)}}}],Fh={$setViewValue:E,$render:E},Gh=["$element","$scope",function(a,b){function d(){g||(g=!0,b.$$postDigest(function(){g=!1;e.ngModelCtrl.$render()}))}function c(a){k||(k=!0,b.$$postDigest(function(){b.$$destroyed||(k=!1,e.ngModelCtrl.$setViewValue(e.readValue()),a&&e.ngModelCtrl.$render())}))}var e=this,f=new Ib;e.selectValueMap=
+{};e.ngModelCtrl=Fh;e.multiple=!1;e.unknownOption=x(z.document.createElement("option"));e.hasEmptyOption=!1;e.emptyOption=void 0;e.renderUnknownOption=function(b){b=e.generateUnknownOptionValue(b);e.unknownOption.val(b);a.prepend(e.unknownOption);Oa(e.unknownOption,!0);a.val(b)};e.updateUnknownOption=function(b){b=e.generateUnknownOptionValue(b);e.unknownOption.val(b);Oa(e.unknownOption,!0);a.val(b)};e.generateUnknownOptionValue=function(a){return"? "+La(a)+" ?"};e.removeUnknownOption=function(){e.unknownOption.parent()&&
+e.unknownOption.remove()};e.selectEmptyOption=function(){e.emptyOption&&(a.val(""),Oa(e.emptyOption,!0))};e.unselectEmptyOption=function(){e.hasEmptyOption&&Oa(e.emptyOption,!1)};b.$on("$destroy",function(){e.renderUnknownOption=E});e.readValue=function(){var b=a.val(),b=b in e.selectValueMap?e.selectValueMap[b]:b;return e.hasOption(b)?b:null};e.writeValue=function(b){var c=a[0].options[a[0].selectedIndex];c&&Oa(x(c),!1);e.hasOption(b)?(e.removeUnknownOption(),c=La(b),a.val(c in e.selectValueMap?
+c:b),Oa(x(a[0].options[a[0].selectedIndex]),!0)):e.selectUnknownOrEmptyOption(b)};e.addOption=function(a,b){if(8!==b[0].nodeType){Ja(a,'"option value"');""===a&&(e.hasEmptyOption=!0,e.emptyOption=b);var c=f.get(a)||0;f.set(a,c+1);d()}};e.removeOption=function(a){var b=f.get(a);b&&(1===b?(f.delete(a),""===a&&(e.hasEmptyOption=!1,e.emptyOption=void 0)):f.set(a,b-1))};e.hasOption=function(a){return!!f.get(a)};e.$hasEmptyOption=function(){return e.hasEmptyOption};e.$isUnknownOptionSelected=function(){return a[0].options[0]===
+e.unknownOption[0]};e.$isEmptyOptionSelected=function(){return e.hasEmptyOption&&a[0].options[a[0].selectedIndex]===e.emptyOption[0]};e.selectUnknownOrEmptyOption=function(a){null==a&&e.emptyOption?(e.removeUnknownOption(),e.selectEmptyOption()):e.unknownOption.parent().length?e.updateUnknownOption(a):e.renderUnknownOption(a)};var g=!1,k=!1;e.registerOption=function(a,b,f,g,k){if(f.$attr.ngValue){var q,r;f.$observe("value",function(a){var d,f=b.prop("selected");w(r)&&(e.removeOption(q),delete e.selectValueMap[r],
+d=!0);r=La(a);q=a;e.selectValueMap[r]=a;e.addOption(a,b);b.attr("value",r);d&&f&&c()})}else g?f.$observe("value",function(a){e.readValue();var d,f=b.prop("selected");w(q)&&(e.removeOption(q),d=!0);q=a;e.addOption(a,b);d&&f&&c()}):k?a.$watch(k,function(a,d){f.$set("value",a);var g=b.prop("selected");d!==a&&e.removeOption(d);e.addOption(a,b);d&&g&&c()}):e.addOption(f.value,b);f.$observe("disabled",function(a){if("true"===a||a&&b.prop("selected"))e.multiple?c(!0):(e.ngModelCtrl.$setViewValue(null),e.ngModelCtrl.$render())});
+b.on("$destroy",function(){var a=e.readValue(),b=f.value;e.removeOption(b);d();(e.multiple&&a&&-1!==a.indexOf(b)||a===b)&&c(!0)})}}],Ue=function(){return{restrict:"E",require:["select","?ngModel"],controller:Gh,priority:1,link:{pre:function(a,b,d,c){var e=c[0],f=c[1];if(f){if(e.ngModelCtrl=f,b.on("change",function(){e.removeUnknownOption();a.$apply(function(){f.$setViewValue(e.readValue())})}),d.multiple){e.multiple=!0;e.readValue=function(){var a=[];r(b.find("option"),function(b){b.selected&&!b.disabled&&
+(b=b.value,a.push(b in e.selectValueMap?e.selectValueMap[b]:b))});return a};e.writeValue=function(a){r(b.find("option"),function(b){var c=!!a&&(-1!==Array.prototype.indexOf.call(a,b.value)||-1!==Array.prototype.indexOf.call(a,e.selectValueMap[b.value]));c!==b.selected&&Oa(x(b),c)})};var g,k=NaN;a.$watch(function(){k!==f.$viewValue||va(g,f.$viewValue)||(g=ja(f.$viewValue),f.$render());k=f.$viewValue});f.$isEmpty=function(a){return!a||0===a.length}}}else e.registerOption=E},post:function(a,b,d,c){var e=
+c[1];if(e){var f=c[0];e.$render=function(){f.writeValue(e.$viewValue)}}}}}},Ve=["$interpolate",function(a){return{restrict:"E",priority:100,compile:function(b,d){var c,e;w(d.ngValue)||(w(d.value)?c=a(d.value,!0):(e=a(b.text(),!0))||d.$set("value",b.text()));return function(a,b,d){var h=b.parent();(h=h.data("$selectController")||h.parent().data("$selectController"))&&h.registerOption(a,b,d,c,e)}}}}],bd=["$parse",function(a){return{restrict:"A",require:"?ngModel",link:function(b,d,c,e){if(e){var f=
+c.hasOwnProperty("required")||a(c.ngRequired)(b);c.ngRequired||(c.required=!0);e.$validators.required=function(a,b){return!f||!e.$isEmpty(b)};c.$observe("required",function(a){f!==a&&(f=a,e.$validate())})}}}}],ad=["$parse",function(a){return{restrict:"A",require:"?ngModel",compile:function(b,d){var c,e;d.ngPattern&&(c=d.ngPattern,e="/"===d.ngPattern.charAt(0)&&ke.test(d.ngPattern)?function(){return d.ngPattern}:a(d.ngPattern));return function(a,b,d,h){if(h){var l=d.pattern;d.ngPattern?l=e(a):c=d.pattern;
+var m=je(l,c,b);d.$observe("pattern",function(a){var d=m;m=je(a,c,b);(d&&d.toString())!==(m&&m.toString())&&h.$validate()});h.$validators.pattern=function(a,b){return h.$isEmpty(b)||A(m)||m.test(b)}}}}}}],dd=["$parse",function(a){return{restrict:"A",require:"?ngModel",link:function(b,d,c,e){if(e){var f=c.maxlength||a(c.ngMaxlength)(b),g=Ub(f);c.$observe("maxlength",function(a){f!==a&&(g=Ub(a),f=a,e.$validate())});e.$validators.maxlength=function(a,b){return 0>g||e.$isEmpty(b)||b.length<=g}}}}}],cd=
+["$parse",function(a){return{restrict:"A",require:"?ngModel",link:function(b,d,c,e){if(e){var f=c.minlength||a(c.ngMinlength)(b),g=Ub(f)||-1;c.$observe("minlength",function(a){f!==a&&(g=Ub(a)||-1,f=a,e.$validate())});e.$validators.minlength=function(a,b){return e.$isEmpty(b)||b.length>=g}}}}}];z.angular.bootstrap?z.console&&console.log("WARNING: Tried to load AngularJS more than once."):(Je(),Oe(ca),ca.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==
+b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),STANDALONEMONTH:"January February March April May June July August September October November December".split(" "),
+WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,
+c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),x(function(){Ee(z.document,Wc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend(window.angular.element("<style>").text('@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}'));
 //# sourceMappingURL=angular.min.js.map
diff --git a/civicrm/bower_components/angular/angular.min.js.gzip b/civicrm/bower_components/angular/angular.min.js.gzip
index 362cc06cad92dce54faa468c5caf5c1e7881c200..9ca10082cb1cf16cc79d7c36b0bfed4dda011fd9 100644
Binary files a/civicrm/bower_components/angular/angular.min.js.gzip and b/civicrm/bower_components/angular/angular.min.js.gzip differ
diff --git a/civicrm/bower_components/angular/angular.min.js.map b/civicrm/bower_components/angular/angular.min.js.map
index 29b6c2b1020cd20fc525a52b253db65c7a6eda8d..8ca7b87423b967fe809101987ac44e1802151d17 100644
--- a/civicrm/bower_components/angular/angular.min.js.map
+++ b/civicrm/bower_components/angular/angular.min.js.map
@@ -1,8 +1,8 @@
 {
 "version":3,
 "file":"angular.min.js",
-"lineCount":323,
-"mappings":"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",
+"lineCount":349,
+"mappings":"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",
 "sources":["angular.js"],
-"names":["window","minErr","isArrayLike","obj","isWindow","isArray","isString","jqLite","length","Object","isNumber","Array","item","forEach","iterator","context","key","isFunction","hasOwnProperty","call","isPrimitive","isBlankObject","forEachSorted","keys","sort","i","reverseParams","iteratorFn","value","nextUid","uid","baseExtend","dst","objs","deep","h","$$hashKey","ii","isObject","j","jj","src","isDate","Date","valueOf","isRegExp","RegExp","nodeName","cloneNode","isElement","clone","extend","slice","arguments","merge","toInt","str","parseInt","inherit","parent","extra","create","noop","identity","$","valueFn","valueRef","hasCustomToString","toString","isUndefined","isDefined","getPrototypeOf","isScope","$evalAsync","$watch","isBoolean","isTypedArray","TYPED_ARRAY_REGEXP","test","node","prop","attr","find","makeMap","items","split","nodeName_","element","lowercase","arrayRemove","array","index","indexOf","splice","copy","source","destination","copyRecurse","push","copyElement","stackSource","stackDest","ngMinErr","needsRecurse","copyType","undefined","constructor","buffer","byteOffset","copied","ArrayBuffer","byteLength","set","Uint8Array","re","match","lastIndex","type","equals","o1","o2","t1","t2","getTime","keySet","createMap","charAt","concat","array1","array2","bind","self","fn","curryArgs","startIndex","apply","toJsonReplacer","val","document","toJson","pretty","JSON","stringify","fromJson","json","parse","timezoneToOffset","timezone","fallback","replace","ALL_COLONS","requestedTimezoneOffset","isNumberNaN","convertTimezoneToLocal","date","reverse","dateTimezoneOffset","getTimezoneOffset","timezoneOffset","setMinutes","getMinutes","minutes","startingTag","empty","e","elemHtml","append","html","nodeType","NODE_TYPE_TEXT","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","splitPoint","substring","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ngAttrPrefixes","getAttribute","angularInit","bootstrap","appElement","module","config","prefix","name","hasAttribute","candidate","querySelector","isAutoBootstrapAllowed","strictDi","console","error","modules","defaultConfig","doBootstrap","injector","tag","unshift","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","bootstrapApply","scope","compile","$apply","data","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","resumeDeferredBootstrap","reloadWithDebugInfo","location","reload","getTestability","rootElement","get","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","bindJQueryFired","jqName","jq","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","cleanData","jQuery.cleanData","elems","events","elem","_data","$destroy","triggerHandler","JQLite","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockNodes","nodes","endNode","blockNodes","nextSibling","setupModuleLoader","ensure","factory","$injectorMinErr","$$minErr","requires","configFn","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","invokeLaterAndSetModuleName","recipeName","factoryFunction","$$moduleName","configBlocks","runBlocks","_invokeQueue","_configBlocks","_runBlocks","service","constant","decorator","animation","filter","directive","component","run","block","shallowCopy","publishExternalAPI","version","uppercase","$$counter","csp","angularModule","ngModule","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","a","htmlAnchorDirective","input","inputDirective","textarea","form","formDirective","script","scriptDirective","select","selectDirective","option","optionDirective","ngBind","ngBindDirective","ngBindHtml","ngBindHtmlDirective","ngBindTemplate","ngBindTemplateDirective","ngClass","ngClassDirective","ngClassEven","ngClassEvenDirective","ngClassOdd","ngClassOddDirective","ngCloak","ngCloakDirective","ngController","ngControllerDirective","ngForm","ngFormDirective","ngHide","ngHideDirective","ngIf","ngIfDirective","ngInclude","ngIncludeDirective","ngInit","ngInitDirective","ngNonBindable","ngNonBindableDirective","ngPluralize","ngPluralizeDirective","ngRepeat","ngRepeatDirective","ngShow","ngShowDirective","ngStyle","ngStyleDirective","ngSwitch","ngSwitchDirective","ngSwitchWhen","ngSwitchWhenDirective","ngSwitchDefault","ngSwitchDefaultDirective","ngOptions","ngOptionsDirective","ngTransclude","ngTranscludeDirective","ngModel","ngModelDirective","ngList","ngListDirective","ngChange","ngChangeDirective","pattern","patternDirective","ngPattern","required","requiredDirective","ngRequired","minlength","minlengthDirective","ngMinlength","maxlength","maxlengthDirective","ngMaxlength","ngValue","ngValueDirective","ngModelOptions","ngModelOptionsDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$anchorScroll","$AnchorScrollProvider","$animate","$AnimateProvider","$animateCss","$CoreAnimateCssProvider","$$animateJs","$$CoreAnimateJsProvider","$$animateQueue","$$CoreAnimateQueueProvider","$$AnimateRunner","$$AnimateRunnerFactoryProvider","$$animateAsyncRun","$$AnimateAsyncRunFactoryProvider","$browser","$BrowserProvider","$cacheFactory","$CacheFactoryProvider","$controller","$ControllerProvider","$document","$DocumentProvider","$exceptionHandler","$ExceptionHandlerProvider","$filter","$FilterProvider","$$forceReflow","$$ForceReflowProvider","$interpolate","$InterpolateProvider","$interval","$IntervalProvider","$http","$HttpProvider","$httpParamSerializer","$HttpParamSerializerProvider","$httpParamSerializerJQLike","$HttpParamSerializerJQLikeProvider","$httpBackend","$HttpBackendProvider","$xhrFactory","$xhrFactoryProvider","$jsonpCallbacks","$jsonpCallbacksProvider","$location","$LocationProvider","$log","$LogProvider","$parse","$ParseProvider","$rootScope","$RootScopeProvider","$q","$QProvider","$$q","$$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$templateCache","$TemplateCacheProvider","$templateRequest","$TemplateRequestProvider","$$testability","$$TestabilityProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$jqLite","$$jqLiteProvider","$$HashMap","$$HashMapProvider","$$cookieReader","$$CookieReaderProvider","camelCase","SPECIAL_CHARS_REGEXP","_","offset","toUpperCase","MOZ_HACK_REGEXP","jqLiteAcceptsData","NODE_TYPE_ELEMENT","NODE_TYPE_DOCUMENT","jqLiteBuildFragment","tmp","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","exec","wrap","wrapMap","_default","innerHTML","XHTML_TAG_REGEXP","lastChild","childNodes","firstChild","textContent","createTextNode","jqLiteWrapNode","wrapper","parentNode","replaceChild","argIsString","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteClone","jqLiteDealoc","onlyDescendants","jqLiteRemoveData","querySelectorAll","descendants","l","jqLiteOff","unsupported","expandoStore","jqLiteExpandoStore","handle","removeHandler","listenerFns","removeEventListener","MOUSE_EVENT_MAP","expandoId","ng339","jqCache","createIfNecessary","jqId","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","selector","jqLiteRemoveClass","cssClasses","setAttribute","cssClass","jqLiteAddClass","existingClasses","root","elements","jqLiteController","jqLiteInheritedData","documentElement","names","NODE_TYPE_DOCUMENT_FRAGMENT","host","jqLiteEmpty","removeChild","jqLiteRemove","keepData","jqLiteDocumentLoaded","action","win","readyState","setTimeout","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","createEventHandler","eventHandler","event","isDefaultPrevented","event.isDefaultPrevented","defaultPrevented","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","stopImmediatePropagation","event.stopImmediatePropagation","stopPropagation","isImmediatePropagationStopped","event.isImmediatePropagationStopped","handlerWrapper","specialHandlerWrapper","defaultHandlerWrapper","handler","specialMouseHandlerWrapper","target","related","relatedTarget","jqLiteContains","$get","this.$get","hasClass","classes","addClass","removeClass","hashKey","nextUidFn","objType","HashMap","isolatedUid","this.nextUid","put","extractArgs","fnText","Function","prototype","STRIP_COMMENTS","ARROW_ARG","FN_ARGS","anonFn","args","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","providerCache","providerSuffix","enforceReturnValue","enforcedReturnValue","result","instanceInjector","factoryFn","enforce","loadModules","moduleFn","runInvokeQueue","invokeArgs","loadedModules","message","stack","createInternalInjector","cache","getService","serviceName","caller","INSTANTIATING","err","shift","injectionArgs","locals","$inject","$$annotate","msie","Type","ctor","annotate","has","$injector","instanceCache","decorFn","origProvider","orig$get","origProvider.$get","origInstance","$delegate","protoInstanceInjector","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","getFirstAnchor","list","some","scrollTo","scrollIntoView","scroll","yOffset","getComputedStyle","style","position","getBoundingClientRect","bottom","elemTop","top","scrollBy","hash","elm","getElementById","getElementsByName","autoScrollWatch","autoScrollWatchAction","newVal","oldVal","mergeClasses","b","splitClasses","klass","prepareAnimateOptions","options","Browser","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","pop","cacheStateAndFireUrlChange","pendingLocation","cacheState","fireUrlChange","cachedState","getCurrentState","lastCachedState","lastBrowserUrl","url","lastHistoryState","urlChangeListeners","listener","history","clearTimeout","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","self.$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","self.notifyWhenNoOutstandingRequests","callback","href","baseElement","state","self.url","sameState","sameBase","stripHash","substr","self.state","urlChangeInit","onUrlChange","self.onUrlChange","$$applicationDestroyed","self.$$applicationDestroyed","off","$$checkUrlChange","baseHref","self.baseHref","defer","self.defer","delay","timeoutId","cancel","self.defer.cancel","deferId","cacheFactory","cacheId","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","id","capacity","Number","MAX_VALUE","lruHash","lruEntry","remove","removeAll","destroy","info","cacheFactory.info","cacheFactory.get","$$sanitizeUriProvider","parseIsolateBindings","directiveName","isController","LOCAL_REGEXP","bindings","definition","scopeName","bindingCache","$compileMinErr","mode","collection","optional","attrName","assertValidDirectiveName","getDirectiveRequire","require","REQUIRE_PREFIX_REGEXP","hasDirectives","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","Suffix","directives","priority","restrict","this.component","makeInjectable","tElement","tAttrs","$element","$attrs","template","templateUrl","ddo","controllerAs","identifierForController","transclude","bindToController","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","this.debugInfoEnabled","enabled","preAssignBindingsEnabled","this.preAssignBindingsEnabled","TTL","onChangesTtl","this.onChangesTtl","commentDirectivesEnabledConfig","commentDirectivesEnabled","this.commentDirectivesEnabled","cssClassDirectivesEnabledConfig","cssClassDirectivesEnabled","this.cssClassDirectivesEnabled","flushOnChangesQueue","onChangesQueue","errors","Attributes","attributesToCopy","$attr","$$element","setSpecialAttr","specialAttrHolder","attributes","attribute","removeNamedItem","setNamedItem","safeAddClass","className","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","NOT_EMPTY","domNode","nodeValue","compositeLinkFn","compileNodes","$$addScopeClass","namespace","publicLinkFn","cloneConnectFn","needsNewScope","$parent","$new","parentBoundTranscludeFn","transcludeControllers","futureParentElement","$$boundTransclude","$linkNode","wrapTemplate","controllerName","instance","$$addScopeInfo","nodeList","$rootElement","childLinkFn","childScope","childBoundTranscludeFn","stableNodeList","nodeLinkFnFound","linkFns","idx","nodeLinkFn","transcludeOnThisElement","createBoundTranscludeFn","templateOnThisElement","attrs","linkFnFound","collectDirectives","applyDirectivesToNode","terminal","previousBoundTranscludeFn","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","boundSlots","$$slots","slotName","attrsMap","addDirective","directiveNormalize","isNgAttr","nAttrs","attrStartName","attrEndName","ngAttrName","NG_ATTR_BINDING","PREFIX_REGEXP","multiElementMatch","MULTI_ELEMENT_DIR_RE","directiveIsMultiElement","nName","addAttrInterpolateDirective","animVal","addTextInterpolateDirective","NODE_TYPE_COMMENT","collectCommentDirectives","byPriority","groupScan","attrStart","attrEnd","depth","groupElementsLinkFnWrapper","linkFn","groupedElementsLink","compilationGenerator","eager","compiled","lazyCompilation","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","elementControllers","slotTranscludeFn","scopeToChild","controllerScope","newScopeDirective","isSlotFilled","transcludeFn.isSlotFilled","controllerDirectives","setupControllers","templateDirective","$$originalDirective","$$isolateBindings","scopeBindingInfo","initializeDirectiveBindings","removeWatches","$on","controllerDirective","$$bindings","bindingInfo","controllerResult","getControllers","controllerInstance","$onChanges","initialChanges","$onInit","$doCheck","$onDestroy","callOnDestroyHook","invokeLinkFn","$postLink","terminalPriority","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","didScanForMultipleTransclusion","mightHaveMultipleTransclusionError","directiveValue","$$start","$$end","assertNoDuplicate","$$tlb","scanningIndex","candidateDirective","$$createComment","replaceWith","$$parentNode","replaceDirective","slots","contents","slotMap","filledSlots","elementSelector","filled","$$newScope","denormalizeTemplate","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectiveScope","mergeTemplateAttributes","compileTemplateUrl","Math","max","inheritType","dataName","property","controllerKey","$scope","$transclude","newScope","tDirectives","startAttrName","endAttrName","multiElement","srcAttr","dstAttr","$set","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","then","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","$$destroyed","oldClasses","delayedNodeLinkFn","ignoreChildLinkFn","diff","what","previousDirective","wrapModuleNameIfDefined","moduleName","text","interpolateFn","textInterpolateCompileFn","templateNode","templateNodeParent","hasCompileParent","$$addBindingClass","textInterpolateLinkFn","$$addBindingInfo","expressions","interpolateFnWatchAction","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","trustedContext","allOrNothing","mustHaveExpression","attrInterpolatePreLinkFn","$$observers","newValue","$$inter","$$scope","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","hasData","annotation","recordChanges","currentValue","previousValue","$$postDigest","changes","triggerOnChangesHook","SimpleChange","removeWatchCollection","initializeBinding","lastValue","parentGet","parentSet","compare","removeWatch","$observe","_UNINITIALIZED_VALUE","literal","assign","parentValueWatch","parentValue","$stateful","$watchCollection","deepWatch","initialValue","parentValueWatchAction","SIMPLE_ATTR_NAME","$normalize","$addClass","classVal","$removeClass","newClasses","toAdd","tokenDifference","toRemove","writeAttr","booleanKey","aliasedKey","ALIASED_ATTR","observer","trimmedSrcset","srcPattern","rawUris","nbrUrisWith2parts","floor","innerIdx","lastTuple","removeAttr","listeners","startSymbol","endSymbol","binding","isolated","noTemplate","compile.$$createComment","comment","createComment","previous","current","str1","str2","values","tokens1","tokens2","token","jqNodes","ident","CNTRL_REG","globals","this.has","register","this.register","allowGlobals","this.allowGlobals","addIdentifier","identifier","expression","later","$controllerMinErr","controllerPrototype","$controllerInit","exception","cause","serializeValue","v","toISOString","ngParamSerializer","params","jQueryLikeParamSerializer","serialize","toSerialize","topLevel","defaultHttpResponseTransform","headers","tempData","JSON_PROTECTION_PREFIX","contentType","jsonStart","JSON_START","JSON_ENDS","parseHeaders","line","headerVal","headerKey","headersGetter","headersObj","transformData","status","fns","defaults","transformResponse","transformRequest","d","common","CONTENT_TYPE_APPLICATION_JSON","patch","xsrfCookieName","xsrfHeaderName","paramSerializer","useApplyAsync","this.useApplyAsync","useLegacyPromise","useLegacyPromiseExtensions","this.useLegacyPromiseExtensions","interceptorFactories","interceptors","requestConfig","chainInterceptors","promise","thenFn","rejectFn","executeHeaderFns","headerContent","processedHeaders","headerFn","header","response","resp","reject","mergeHeaders","defHeaders","reqHeaders","defHeaderName","lowercaseDefHeaderName","reqHeaderName","requestInterceptors","responseInterceptors","when","reversedInterceptors","interceptor","request","requestError","responseError","serverRequest","reqData","withCredentials","sendReq","success","promise.success","promise.error","$httpMinErrLegacyFn","createApplyHandlers","eventHandlers","applyHandlers","callEventHandler","$applyAsync","$$phase","done","headersString","statusText","resolveHttpPromise","resolvePromise","deferred","resolve","resolvePromiseWithResult","removePendingReq","pendingRequests","cachedResp","buildUrl","defaultCache","xsrfValue","urlIsSameOrigin","timeout","responseType","uploadEventHandlers","serializedParams","interceptorFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","createHttpBackend","$browserDefer","callbacks","rawDocument","jsonpReq","callbackPath","async","body","wasCalled","addEventListener","timeoutRequest","jsonpDone","xhr","abort","completeRequest","createCallback","getResponse","removeCallback","open","setRequestHeader","onload","xhr.onload","responseText","urlResolve","protocol","getAllResponseHeaders","onerror","onabort","ontimeout","upload","send","this.startSymbol","this.endSymbol","escape","ch","unescapeText","escapedStartRegexp","escapedEndRegexp","constantWatchDelegate","objectEquality","constantInterp","unwatch","constantInterpolateWatch","parseStringifyInterceptor","getTrusted","$interpolateMinErr","interr","unescapedText","exp","$$watchDelegate","endIndex","parseFns","textLength","expressionPositions","startSymbolLength","endSymbolLength","throwNoconcat","compute","interpolationFn","$watchGroup","interpolateFnWatcher","oldValues","currValue","$interpolate.startSymbol","$interpolate.endSymbol","interval","count","invokeApply","hasParams","iteration","setInterval","clearInterval","skipApply","$$intervalId","tick","notify","intervals","interval.cancel","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","DOUBLE_SLASH_REGEX","$locationMinErr","prefixed","$$path","pathname","$$search","search","$$hash","stripBaseUrl","base","trimEmptyHash","LocationHtml5Url","appBase","appBaseNoFile","basePrefix","$$html5","$$parse","this.$$parse","pathUrl","$$compose","this.$$compose","$$url","$$absUrl","$$parseLinkUrl","this.$$parseLinkUrl","relHref","appUrl","prevAppUrl","rewrittenUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","locationGetterSetter","preprocess","html5Mode","requireBase","rewriteLinks","this.hashPrefix","this.html5Mode","setBrowserUrlWithFallback","oldUrl","oldState","$$state","afterLocationChange","$broadcast","absUrl","LocationMode","initialUrl","lastIndexOf","IGNORE_URI_REGEXP","ctrlKey","metaKey","shiftKey","which","button","absHref","preventDefault","initializing","newUrl","newState","$digest","$locationWatch","currentReplace","$$replace","urlOrStateChanged","debug","debugEnabled","this.debugEnabled","flag","formatError","Error","sourceURL","consoleLog","logFn","log","hasApply","arg1","arg2","warn","ensureSafeMemberName","fullExpression","$parseMinErr","getStringValue","ensureSafeObject","children","ensureSafeFunction","CALL","APPLY","BIND","ensureSafeAssignContext","ARRAY_CTOR","BOOLEAN_CTOR","FUNCTION_CTOR","NUMBER_CTOR","OBJECT_CTOR","STRING_CTOR","ARRAY_CTOR_PROTO","BOOLEAN_CTOR_PROTO","FUNCTION_CTOR_PROTO","NUMBER_CTOR_PROTO","OBJECT_CTOR_PROTO","STRING_CTOR_PROTO","ifDefined","plusFn","r","findConstantAndWatchExpressions","ast","allConstants","argsToWatch","isStatelessFilter","AST","Program","expr","Literal","toWatch","UnaryExpression","argument","BinaryExpression","left","right","LogicalExpression","ConditionalExpression","alternate","consequent","Identifier","MemberExpression","object","computed","CallExpression","callee","AssignmentExpression","ArrayExpression","ObjectExpression","properties","ThisExpression","LocalsExpression","getInputs","lastExpression","isAssignable","assignableAST","NGValueParameter","operator","isLiteral","ASTCompiler","astBuilder","ASTInterpreter","isPossiblyDangerousMemberName","getValueOf","objectValueOf","cacheDefault","cacheExpensive","literals","identStart","identContinue","addLiteral","this.addLiteral","literalName","literalValue","setIdentifierFns","this.setIdentifierFns","identifierStart","identifierContinue","interceptorFn","expensiveChecks","parsedExpression","oneTime","cacheKey","runningChecksEnabled","parseOptions","$parseOptionsExpensive","$parseOptions","lexer","Lexer","parser","Parser","oneTimeLiteralWatchDelegate","oneTimeWatchDelegate","inputs","inputsWatchDelegate","expensiveChecksInterceptor","addInterceptor","expensiveCheckFn","expensiveCheckOldValue","expressionInputDirtyCheck","oldValueOfValue","prettyPrintExpression","inputExpressions","lastResult","oldInputValueOf","expressionInputWatch","newInputValue","oldInputValueOfValues","oldInputValues","expressionInputsWatch","changed","oneTimeWatch","oneTimeListener","old","isAllDefined","allDefined","constantWatch","watchDelegate","useInputs","regularInterceptedExpression","oneTimeInterceptedExpression","noUnsafeEval","isIdentifierStart","isIdentifierContinue","$$runningExpensiveChecks","$parse.$$runningExpensiveChecks","qFactory","nextTick","exceptionHandler","Deferred","simpleBind","Promise","scheduleProcessQueue","processScheduled","pending","handleCallback","resolver","callbackOutput","errback","progressBack","$Q","$qMinErr","resolveFn","TypeError","onFulfilled","onRejected","catch","finally","$$reject","$$resolve","that","rejectPromise","progress","all","promises","counter","results","race","requestAnimationFrame","webkitRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","supported","createChildScopeClass","ChildScope","$$watchers","$$nextSibling","$$childHead","$$childTail","$$listeners","$$listenerCount","$$watchersCount","$id","$$ChildScope","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","this.digestTtl","destroyChildScope","$event","currentScope","cleanUpScope","$$prevSibling","$root","Scope","beginPhase","phase","incrementWatchersCount","decrementListenerCount","initWatchVal","flushApplyAsync","applyAsyncQueue","scheduleApplyAsync","isolate","child","watchExp","watcher","last","eq","$$digestWatchIndex","deregisterWatch","watchExpressions","watchGroupAction","changeReactionScheduled","firstRun","newValues","deregisterFns","shouldCall","deregisterWatchGroup","unwatchFn","watchGroupSubAction","$watchCollectionInterceptor","_value","bothNaN","newItem","oldItem","internalArray","oldLength","changeDetected","newLength","internalObject","veryOldValue","trackVeryOldValue","changeDetector","initRun","$watchCollectionAction","watch","watchers","dirty","ttl","watchLog","logIdx","asyncTask","asyncQueuePosition","asyncQueue","$eval","msg","next","postDigestQueuePosition","postDigestQueue","eventName","this.$watchGroup","$applyAsyncExpression","namedListeners","indexOfListener","$emit","targetScope","listenerArgs","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","sanitizeUri","uri","isImage","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","escapeForRegexp","adjustMatchers","matchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","matchUrl","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","CSS","URL","JS","trustAs","Constructor","maybeTrusted","allowed","this.enabled","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","enumValue","lName","eventSupport","hasHistoryPushState","chrome","app","runtime","pushState","android","userAgent","navigator","boxee","vendorPrefix","vendorRegex","bodyStyle","transitions","animations","webkitTransition","webkitAnimation","hasEvent","divElm","httpOptions","this.httpOptions","handleRequestFn","tpl","ignoreRequestError","totalPendingRequests","getTrustedResourceUrl","transformer","handleError","$templateRequestMinErr","testability","testability.findBindings","opt_exactMatch","getElementsByClassName","matches","dataBinding","bindingName","testability.findModels","prefixes","attributeEquals","testability.getLocation","testability.setLocation","testability.whenStable","deferreds","$$timeoutId","timeout.cancel","urlParsingNode","requestUrl","originUrl","$$CookieReader","safeDecodeURIComponent","lastCookies","lastCookieString","cookieArray","cookie","currentCookieString","filters","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","anyPropertyKey","matchAgainstAnyProp","getTypeForFilter","expressionType","predicateFn","createPredicateFn","shouldMatchPrimitives","actual","expected","deepCompare","dontMatchWholeObject","actualType","expectedType","expectedVal","matchAnyProperty","actualVal","$locale","formats","NUMBER_FORMATS","amount","currencySymbol","fractionSize","CURRENCY_SYM","PATTERNS","maxFrac","formatNumber","GROUP_SEP","DECIMAL_SEP","number","numStr","exponent","digits","numberOfIntegerDigits","zeros","ZERO_CHAR","MAX_DIGITS","roundNumber","parsedNumber","minFrac","fractionLen","min","roundAt","digit","k","carry","reduceRight","groupSep","decimalSep","isNaN","isInfinity","isFinite","isZero","abs","formattedText","integerLen","decimals","reduce","groups","lgSize","gSize","negPre","negSuf","posPre","posSuf","padNumber","num","negWrap","neg","dateGetter","dateStrGetter","shortForm","standAlone","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","round","eraGetter","ERAS","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","s","ms","parseFloat","format","DATETIME_FORMATS","NUMBER_STRING","DATE_FORMATS_SPLIT","DATE_FORMATS","spacing","limit","begin","Infinity","sliceFn","end","processPredicates","sortPredicates","map","predicate","descending","defaultCompare","v1","v2","type1","type2","value1","value2","sortPredicate","reverseOrder","compareFn","predicates","compareValues","getComparisonObject","tieBreaker","predicateValues","doComparison","ngDirective","FormController","controls","$error","$$success","$pending","$name","$dirty","$pristine","$valid","$invalid","$submitted","$$parentForm","nullFormCtrl","$rollbackViewValue","form.$rollbackViewValue","control","$commitViewValue","form.$commitViewValue","$addControl","form.$addControl","$$renameControl","form.$$renameControl","newName","oldName","$removeControl","form.$removeControl","$setValidity","addSetValidityMethod","ctrl","unset","$setDirty","form.$setDirty","PRISTINE_CLASS","DIRTY_CLASS","$setPristine","form.$setPristine","setClass","SUBMITTED_CLASS","$setUntouched","form.$setUntouched","$setSubmitted","form.$setSubmitted","stringBasedInputType","$formatters","$isEmpty","baseInputType","composing","ev","ngTrim","$viewValue","$$hasNativeValidators","$setViewValue","deferListener","origValue","keyCode","PARTIAL_VALIDATION_TYPES","PARTIAL_VALIDATION_EVENTS","validity","origBadInput","badInput","origTypeMismatch","typeMismatch","$render","ctrl.$render","createDateParser","mapping","iso","ISO_DATE_REGEXP","yyyy","MM","dd","HH","getHours","mm","ss","getSeconds","sss","getMilliseconds","part","NaN","createDateInputType","parseDate","dynamicDateInputType","isValidDate","parseObservedDateValue","badInputChecker","$options","previousDate","$$parserName","$parsers","parsedDate","ngModelMinErr","ngMin","minVal","$validators","ctrl.$validators.min","$validate","ngMax","maxVal","ctrl.$validators.max","VALIDITY_STATE_PROPERTY","numberFormatterParser","NUMBER_REGEXP","parseNumberAttrVal","countDecimals","numString","decimalSymbolIndex","parseConstantExpr","parseFn","classDirective","arrayDifference","arrayClasses","addClasses","digestClassCounts","classCounts","classesToUpdate","updateClasses","ngClassWatchAction","$index","old$index","mod","cachedToggleClass","switchValue","classCache","toggleValidationCss","validationErrorKey","isValid","VALID_CLASS","INVALID_CLASS","setValidity","isObjectEmpty","PENDING_CLASS","combinedState","REGEX_STRING_REGEXP","documentMode","rules","ngCspElement","ngCspAttribute","noInlineStyle","name_","el","allowAutoBootstrap","currentScript","origin","full","major","minor","dot","codeName","expando","JQLite._data","mouseleave","mouseenter","optgroup","tbody","tfoot","colgroup","caption","thead","th","td","Node","contains","compareDocumentPosition","ready","trigger","fired","removeData","jqLiteHasData","jqLiteCleanData","removeAttribute","css","NODE_TYPE_ATTRIBUTE","lowercasedName","specified","getNamedItem","ret","getText","$dv","multiple","selected","nodeCount","jqLiteOn","types","addHandler","noEventListener","one","onFn","replaceNode","insertBefore","contentDocument","prepend","wrapNode","detach","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","extraParameters","dummyEvent","handlerArgs","eventFnsCopy","arg3","unbind","FN_ARG_SPLIT","FN_ARG","argDecl","underscore","$animateMinErr","postDigestElements","updateData","handleCSSClassChanges","existing","pin","domOperation","from","to","classesAdded","add","classesRemoved","runner","complete","$$registeredAnimations","classNameFilter","this.classNameFilter","$$classNameFilter","reservedRegex","NG_ANIMATE_CLASSNAME","domInsert","parentElement","afterElement","afterNode","ELEMENT_NODE","previousElementSibling","enter","move","leave","addclass","animate","tempClasses","waitForTick","waitQueue","passed","AnimateRunner","setHost","rafTick","_doneCallbacks","_tick","this._tick","doc","hidden","_state","chain","AnimateRunner.chain","AnimateRunner.all","runners","onProgress","DONE_COMPLETE_STATE","getPromise","resolveHandler","rejectHandler","pause","resume","_resolve","INITIAL_STATE","DONE_PENDING_STATE","initialOptions","closed","$$prepared","cleanupStyles","start","UNINITIALIZED_VALUE","isFirstChange","SimpleChange.prototype.isFirstChange","offsetWidth","APPLICATION_JSON","$httpMinErr","$interpolateMinErr.throwNoconcat","$interpolateMinErr.interr","callbackId","called","callbackMap","PATH_MATCH","locationPrototype","paramValue","Location","Location.prototype.state","OPERATORS","ESCAPE","lex","tokens","readString","peek","readNumber","peekMultichar","readIdent","is","isWhitespace","ch2","ch3","op2","op3","op1","throwError","chars","codePointAt","isValidIdentifierStart","isValidIdentifierContinue","cp","charCodeAt","cp1","cp2","isExpOperator","colStr","peekCh","quote","rawString","hex","String","fromCharCode","rep","ExpressionStatement","Property","program","expressionStatement","expect","filterChain","assignment","ternary","logicalOR","consume","logicalAND","equality","relational","additive","multiplicative","unary","primary","arrayDeclaration","selfReferential","parseArguments","baseExpression","peekToken","kind","e1","e2","e3","e4","peekAhead","t","nextId","vars","own","assignable","stage","computing","recurse","return_","generateFunction","fnKey","intoId","watchId","fnString","USE","STRICT","filterPrefix","watchFns","varsPrefix","section","nameId","recursionFn","skipWatchIdCheck","if_","lazyAssign","computedMember","lazyRecurse","plus","not","getHasOwnProperty","nonComputedMember","addEnsureSafeObject","notNull","addEnsureSafeAssignContext","addEnsureSafeMemberName","addEnsureSafeFunction","member","filterName","defaultValue","UNSAFE_CHARACTERS","SAFE_IDENTIFIER","stringEscapeFn","stringEscapeRegex","c","skip","init","fn.assign","rhs","lhs","unary+","unary-","unary!","binary+","binary-","binary*","binary/","binary%","binary===","binary!==","binary==","binary!=","binary<","binary>","binary<=","binary>=","binary&&","binary||","ternary?:","astCompiler","yy","y","MMMM","MMM","M","LLLL","H","hh","EEEE","EEE","ampmGetter","AMPMS","Z","timeZoneGetter","zone","paddedZone","ww","w","G","GG","GGG","GGGG","longEraGetter","ERANAMES","xlinkHref","propName","defaultLinkFn","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","nullFormRenameControl","formDirectiveFactory","isNgForm","getSetter","ngFormCompile","formElement","nameAttr","ngFormPreLink","ctrls","handleFormSubmission","setter","URL_REGEXP","EMAIL_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","hours","seconds","milliseconds","addDays","numberInputType","urlInputType","ctrl.$validators.url","modelValue","viewValue","emailInputType","email","ctrl.$validators.email","radioInputType","checked","rangeInputType","setInitialValueAndObserver","htmlAttrName","changeFn","minChange","$modelValue","supportsRange","elVal","maxChange","stepChange","stepVal","hasMinAttr","hasMaxAttr","hasStepAttr","step","originalRender","rangeUnderflow","rangeOverflow","rangeRender","noopMinValidator","minValidator","noopMaxValidator","maxValidator","nativeStepValidator","stepMismatch","stepValidator","stepBase","decimalCount","multiplier","pow","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrl.$isEmpty","CONSTANT_VALUE_REGEXP","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","ngBindHtmlGetter","ngBindHtmlWatch","sceValueOf","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","$viewChangeListeners","forceAsyncEvents","ngEventHandler","previousElements","ngIfWatchAction","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","trimValues","NgModelController","$$rawModelValue","$asyncValidators","$untouched","$touched","parsedNgModel","parsedNgModelAssign","ngModelGet","ngModelSet","pendingDebounce","parserValid","$$setOptions","this.$$setOptions","getterSetter","invokeModelGetter","invokeModelSetter","$$$p","this.$isEmpty","$$updateEmptyClasses","this.$$updateEmptyClasses","NOT_EMPTY_CLASS","EMPTY_CLASS","currentValidationRunId","this.$setPristine","this.$setDirty","this.$setUntouched","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","this.$setTouched","this.$rollbackViewValue","$$lastCommittedViewValue","this.$validate","prevValid","prevModelValue","allowInvalid","$$runValidators","allValid","$$writeModelToScope","this.$$runValidators","doneCallback","processSyncValidators","syncValidatorsValid","validator","processAsyncValidators","validatorPromises","validationDone","localValidationRunId","processParseErrors","errorKey","this.$commitViewValue","$$parseAndValidate","this.$$parseAndValidate","this.$$writeModelToScope","this.$setViewValue","updateOnDefault","$$debounceViewValueCommit","this.$$debounceViewValueCommit","debounceDelay","debounce","ngModelWatch","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","ngModelPostLink","updateOn","DEFAULT_REGEXP","NgModelOptionsController","ngOptionsMinErr","NG_OPTIONS_REGEXP","parseOptionsExpression","optionsExp","selectElement","Option","selectValue","label","group","disabled","getOptionValuesKeys","optionValues","optionValuesKeys","keyName","itemKey","valueName","selectAs","trackBy","viewValueFn","trackByFn","getTrackByValueFn","getHashOfValue","getTrackByValue","getLocals","displayFn","groupByFn","disableWhenFn","valuesFn","getWatchables","watchedArray","optionValuesLength","disableWhen","getOptions","optionItems","selectValueMap","optionItem","getOptionFromViewValue","getViewValueFromOption","optionTemplate","optGroupTemplate","ngOptionsPreLink","registerOption","ngOptionsPostLink","updateOptionElement","updateOptions","selectCtrl","readValue","groupElementMap","providedEmptyOption","emptyOption","addOption","groupElement","listFragment","optionElement","ngModelCtrl","nextValue","emptyOptionRendered","unknownOption","removeEmptyOption","ngModelCtrl.$isEmpty","writeValue","selectCtrl.writeValue","selectCtrl.readValue","selectedValues","selections","selectedOption","selectCtrl.registerOption","optionScope","optionEl","BRACE","IS_WHEN","updateElementText","newText","numberExp","whenExp","whens","whensExpFns","braceReplacement","watchRemover","lastCount","attributeName","tmpMatch","whenKey","ngPluralizeWatchAction","countIsNaN","pluralCat","whenExpFn","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","ngRepeatCompile","ngRepeatEndComment","aliasAs","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","hashFnLocals","ngRepeatLink","lastBlockMap","ngRepeatAction","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","NgSwitchController","cases","ngSwitchController","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngSwitchWhenSeparator","whenCase","ngTranscludeMinErr","ngTranscludeCompile","fallbackLinkFn","ngTranscludePostLink","useFallbackContent","ngTranscludeSlot","ngTranscludeCloneAttachFn","noopNgModelController","SelectController","optionsMap","renderUnknownOption","self.renderUnknownOption","unknownVal","removeUnknownOption","self.removeUnknownOption","self.readValue","self.writeValue","hasOption","self.addOption","removeOption","self.removeOption","self.hasOption","self.registerOption","optionAttrs","hasDynamicValueAttr","interpolateTextFn","valueAttributeObserveAction","interpolateWatchAction","selectPreLink","lastView","lastViewRef","selectMultipleWatch","selectPostLink","ngModelCtrl.$render","selectCtrlName","ctrl.$validators.required","patternExp","ctrl.$validators.pattern","intVal","ctrl.$validators.maxlength","ctrl.$validators.minlength","getDecimals","opt_precision","ONE","OTHER","$$csp","head"]
+"names":["window","errorHandlingConfig","config","isObject","isDefined","objectMaxDepth","minErrConfig","isValidObjectMaxDepth","NaN","urlErrorParamsEnabled","isBoolean","maxDepth","isNumber","minErr","isArrayLike","obj","isWindow","isArray","isString","jqLite","length","Object","item","forEach","iterator","context","key","isFunction","hasOwnProperty","call","isPrimitive","isBlankObject","forEachSorted","keys","sort","i","reverseParams","iteratorFn","value","nextUid","uid","baseExtend","dst","objs","deep","h","$$hashKey","ii","j","jj","src","isDate","Date","valueOf","isRegExp","RegExp","nodeName","cloneNode","isElement","clone","extend","slice","arguments","merge","toInt","str","parseInt","inherit","parent","extra","create","noop","identity","$","valueFn","valueRef","hasCustomToString","toString","isUndefined","getPrototypeOf","arr","Array","isError","tag","Error","isScope","$evalAsync","$watch","isTypedArray","TYPED_ARRAY_REGEXP","test","node","prop","attr","find","makeMap","items","split","nodeName_","element","lowercase","arrayRemove","array","index","indexOf","splice","copy","source","destination","copyRecurse","push","copyElement","stackSource","stackDest","ngMinErr","needsRecurse","copyType","undefined","constructor","buffer","byteOffset","copied","ArrayBuffer","byteLength","set","Uint8Array","re","match","lastIndex","type","simpleCompare","a","b","equals","o1","o2","t1","t2","getTime","keySet","createMap","charAt","concat","array1","array2","bind","self","fn","curryArgs","startIndex","apply","toJsonReplacer","val","document","toJson","pretty","JSON","stringify","fromJson","json","parse","timezoneToOffset","timezone","fallback","replace","ALL_COLONS","requestedTimezoneOffset","isNumberNaN","addDateMinutes","date","minutes","setMinutes","getMinutes","convertTimezoneToLocal","reverse","dateTimezoneOffset","getTimezoneOffset","timezoneOffset","startingTag","empty","elemHtml","append","html","nodeType","NODE_TYPE_TEXT","e","tryDecodeURIComponent","decodeURIComponent","parseKeyValue","keyValue","splitPoint","substring","toKeyValue","parts","arrayValue","encodeUriQuery","join","encodeUriSegment","pctEncodeSpaces","encodeURIComponent","getNgAttribute","ngAttr","ngAttrPrefixes","getAttribute","angularInit","bootstrap","appElement","module","prefix","name","hasAttribute","candidate","querySelector","isAutoBootstrapAllowed","strictDi","console","error","modules","defaultConfig","doBootstrap","injector","unshift","$provide","debugInfoEnabled","$compileProvider","createInjector","invoke","bootstrapApply","scope","compile","$apply","data","NG_ENABLE_DEBUG_INFO","NG_DEFER_BOOTSTRAP","angular","resumeBootstrap","angular.resumeBootstrap","extraModules","resumeDeferredBootstrap","reloadWithDebugInfo","location","reload","getTestability","rootElement","get","snake_case","separator","SNAKE_CASE_REGEXP","letter","pos","toLowerCase","bindJQuery","originalCleanData","bindJQueryFired","jqName","jq","jQuery","on","JQLitePrototype","isolateScope","controller","inheritedData","JQLite","cleanData","jqLite.cleanData","elems","events","elem","_data","$destroy","triggerHandler","UNSAFE_restoreLegacyJqLiteXHTMLReplacement","legacyXHTMLReplacement","assertArg","arg","reason","assertArgFn","acceptArrayAnnotation","assertNotHasOwnProperty","getter","path","bindFnToScope","lastInstance","len","getBlockNodes","nodes","endNode","blockNodes","nextSibling","setupModuleLoader","ensure","factory","$injectorMinErr","$$minErr","requires","configFn","info","invokeLater","provider","method","insertMethod","queue","invokeQueue","moduleInstance","invokeLaterAndSetModuleName","recipeName","factoryFunction","$$moduleName","configBlocks","runBlocks","_invokeQueue","_configBlocks","_runBlocks","service","constant","decorator","animation","filter","directive","component","run","block","shallowCopy","serializeObject","seen","publishExternalAPI","version","$$counter","csp","uppercase","angularModule","ngModule","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","htmlAnchorDirective","input","inputDirective","textarea","form","formDirective","script","scriptDirective","select","selectDirective","option","optionDirective","ngBind","ngBindDirective","ngBindHtml","ngBindHtmlDirective","ngBindTemplate","ngBindTemplateDirective","ngClass","ngClassDirective","ngClassEven","ngClassEvenDirective","ngClassOdd","ngClassOddDirective","ngCloak","ngCloakDirective","ngController","ngControllerDirective","ngForm","ngFormDirective","ngHide","ngHideDirective","ngIf","ngIfDirective","ngInclude","ngIncludeDirective","ngInit","ngInitDirective","ngNonBindable","ngNonBindableDirective","ngPluralize","ngPluralizeDirective","ngRef","ngRefDirective","ngRepeat","ngRepeatDirective","ngShow","ngShowDirective","ngStyle","ngStyleDirective","ngSwitch","ngSwitchDirective","ngSwitchWhen","ngSwitchWhenDirective","ngSwitchDefault","ngSwitchDefaultDirective","ngOptions","ngOptionsDirective","ngTransclude","ngTranscludeDirective","ngModel","ngModelDirective","ngList","ngListDirective","ngChange","ngChangeDirective","pattern","patternDirective","ngPattern","required","requiredDirective","ngRequired","minlength","minlengthDirective","ngMinlength","maxlength","maxlengthDirective","ngMaxlength","ngValue","ngValueDirective","ngModelOptions","ngModelOptionsDirective","ngIncludeFillContentDirective","hiddenInputBrowserCacheDirective","ngAttributeAliasDirectives","ngEventDirectives","$anchorScroll","$AnchorScrollProvider","$animate","$AnimateProvider","$animateCss","$CoreAnimateCssProvider","$$animateJs","$$CoreAnimateJsProvider","$$animateQueue","$$CoreAnimateQueueProvider","$$AnimateRunner","$$AnimateRunnerFactoryProvider","$$animateAsyncRun","$$AnimateAsyncRunFactoryProvider","$browser","$BrowserProvider","$cacheFactory","$CacheFactoryProvider","$controller","$ControllerProvider","$document","$DocumentProvider","$$isDocumentHidden","$$IsDocumentHiddenProvider","$exceptionHandler","$ExceptionHandlerProvider","$filter","$FilterProvider","$$forceReflow","$$ForceReflowProvider","$interpolate","$InterpolateProvider","$interval","$IntervalProvider","$$intervalFactory","$$IntervalFactoryProvider","$http","$HttpProvider","$httpParamSerializer","$HttpParamSerializerProvider","$httpParamSerializerJQLike","$HttpParamSerializerJQLikeProvider","$httpBackend","$HttpBackendProvider","$xhrFactory","$xhrFactoryProvider","$jsonpCallbacks","$jsonpCallbacksProvider","$location","$LocationProvider","$log","$LogProvider","$parse","$ParseProvider","$rootScope","$RootScopeProvider","$q","$QProvider","$$q","$$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$$taskTrackerFactory","$$TaskTrackerFactoryProvider","$templateCache","$TemplateCacheProvider","$templateRequest","$TemplateRequestProvider","$$testability","$$TestabilityProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$jqLite","$$jqLiteProvider","$$Map","$$MapProvider","$$cookieReader","$$CookieReaderProvider","angularVersion","fnCamelCaseReplace","all","toUpperCase","kebabToCamel","DASH_LOWERCASE_REGEXP","jqLiteAcceptsData","NODE_TYPE_ELEMENT","NODE_TYPE_DOCUMENT","jqLiteBuildFragment","tmp","finalHtml","fragment","createDocumentFragment","HTML_REGEXP","appendChild","createElement","TAG_NAME_REGEXP","exec","XHTML_TAG_REGEXP","msie","wrap","wrapMapIE9","_default","innerHTML","firstChild","wrapMap","childNodes","textContent","createTextNode","argIsString","trim","jqLiteMinErr","parsed","SINGLE_TAG_REGEXP","jqLiteAddNodes","jqLiteReady","jqLiteClone","jqLiteDealoc","onlyDescendants","querySelectorAll","isEmptyObject","removeIfEmptyData","expandoId","ng339","expandoStore","jqCache","jqLiteOff","unsupported","jqLiteExpandoStore","handle","removeHandler","listenerFns","removeEventListener","MOUSE_EVENT_MAP","jqLiteRemoveData","createIfNecessary","jqId","jqLiteData","isSimpleSetter","isSimpleGetter","massGetter","jqLiteHasClass","selector","jqLiteRemoveClass","cssClasses","setAttribute","existingClasses","newClasses","cssClass","jqLiteAddClass","root","elements","jqLiteController","jqLiteInheritedData","documentElement","names","parentNode","NODE_TYPE_DOCUMENT_FRAGMENT","host","jqLiteEmpty","removeChild","jqLiteRemove","keepData","jqLiteDocumentLoaded","action","win","readyState","setTimeout","trigger","addEventListener","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","createEventHandler","eventHandler","event","isDefaultPrevented","event.isDefaultPrevented","defaultPrevented","eventFns","eventFnsLength","immediatePropagationStopped","originalStopImmediatePropagation","stopImmediatePropagation","event.stopImmediatePropagation","stopPropagation","isImmediatePropagationStopped","event.isImmediatePropagationStopped","handlerWrapper","specialHandlerWrapper","defaultHandlerWrapper","handler","specialMouseHandlerWrapper","target","related","relatedTarget","jqLiteContains","$get","this.$get","hasClass","classes","addClass","removeClass","hashKey","nextUidFn","objType","NgMapShim","_keys","_values","_lastKey","_lastIndex","extractArgs","fnText","Function","prototype","STRIP_COMMENTS","ARROW_ARG","FN_ARGS","anonFn","args","modulesToLoad","supportObject","delegate","provider_","providerInjector","instantiate","providerCache","providerSuffix","enforceReturnValue","enforcedReturnValue","result","instanceInjector","factoryFn","enforce","loadModules","moduleFn","runInvokeQueue","invokeArgs","loadedModules","message","stack","createInternalInjector","cache","getService","serviceName","caller","INSTANTIATING","err","shift","injectionArgs","locals","$inject","$$annotate","func","$$ngIsClass","Type","ctor","annotate","has","NgMap","$injector","instanceCache","decorFn","origProvider","orig$get","origProvider.$get","origInstance","$delegate","protoInstanceInjector","loadNewModules","instanceInjector.loadNewModules","mods","autoScrollingEnabled","disableAutoScrolling","this.disableAutoScrolling","getFirstAnchor","list","some","scrollTo","scrollIntoView","offset","scroll","yOffset","getComputedStyle","style","position","getBoundingClientRect","bottom","elemTop","top","scrollBy","hash","elm","getElementById","getElementsByName","autoScrollWatch","autoScrollWatchAction","newVal","oldVal","mergeClasses","splitClasses","klass","prepareAnimateOptions","options","Browser","cacheStateAndFireUrlChange","pendingLocation","fireStateOrUrlChange","cacheState","cachedState","getCurrentState","lastCachedState","lastHistoryState","prevLastHistoryState","lastBrowserUrl","url","urlChangeListeners","listener","history","clearTimeout","pendingDeferIds","taskTracker","isMock","$$completeOutstandingRequest","completeTask","$$incOutstandingRequestCount","incTaskCount","notifyWhenNoOutstandingRequests","notifyWhenNoPendingTasks","href","baseElement","state","self.url","sameState","urlResolve","sameBase","stripHash","substr","self.state","urlChangeInit","onUrlChange","self.onUrlChange","callback","$$applicationDestroyed","self.$$applicationDestroyed","off","$$checkUrlChange","baseHref","self.baseHref","defer","self.defer","delay","taskType","timeoutId","DEFAULT_TASK_TYPE","cancel","self.defer.cancel","deferId","cacheFactory","cacheId","refresh","entry","freshEnd","staleEnd","n","link","p","nextEntry","prevEntry","caches","size","stats","id","capacity","Number","MAX_VALUE","lruHash","put","lruEntry","remove","removeAll","destroy","cacheFactory.info","cacheFactory.get","$$sanitizeUriProvider","parseIsolateBindings","directiveName","isController","LOCAL_REGEXP","bindings","definition","scopeName","bindingCache","$compileMinErr","mode","collection","optional","attrName","assertValidDirectiveName","getDirectiveRequire","require","REQUIRE_PREFIX_REGEXP","hasDirectives","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","ALL_OR_NOTHING_ATTRS","EVENT_HANDLER_ATTR_REGEXP","this.directive","registerDirective","directiveFactory","Suffix","directives","priority","restrict","this.component","registerComponent","makeInjectable","tElement","tAttrs","$element","$attrs","template","templateUrl","ddo","controllerAs","identifierForController","transclude","bindToController","aHrefSanitizationWhitelist","this.aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","this.imgSrcSanitizationWhitelist","this.debugInfoEnabled","enabled","strictComponentBindingsEnabled","this.strictComponentBindingsEnabled","TTL","onChangesTtl","this.onChangesTtl","commentDirectivesEnabledConfig","commentDirectivesEnabled","this.commentDirectivesEnabled","cssClassDirectivesEnabledConfig","cssClassDirectivesEnabled","this.cssClassDirectivesEnabled","PROP_CONTEXTS","addPropertySecurityContext","this.addPropertySecurityContext","elementName","propertyName","ctx","registerNativePropertyContexts","registerContext","values","v","SCE_CONTEXTS","HTML","CSS","URL","MEDIA_URL","RESOURCE_URL","flushOnChangesQueue","onChangesQueue","sanitizeSrcset","invokeType","trimmedSrcset","srcPattern","rawUris","nbrUrisWith2parts","Math","floor","innerIdx","getTrustedMediaUrl","lastTuple","Attributes","attributesToCopy","l","$attr","$$element","setSpecialAttr","specialAttrHolder","attributes","attribute","removeNamedItem","setNamedItem","safeAddClass","className","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","compositeLinkFn","compileNodes","$$addScopeClass","namespace","publicLinkFn","cloneConnectFn","needsNewScope","$parent","$new","parentBoundTranscludeFn","transcludeControllers","futureParentElement","$$boundTransclude","$linkNode","wrapTemplate","controllerName","instance","$$addScopeInfo","nodeList","$rootElement","childLinkFn","childScope","childBoundTranscludeFn","stableNodeList","nodeLinkFnFound","linkFns","idx","nodeLinkFn","transcludeOnThisElement","createBoundTranscludeFn","templateOnThisElement","notLiveList","attrs","linkFnFound","mergeConsecutiveTextNodes","collectDirectives","applyDirectivesToNode","terminal","sibling","nodeValue","previousBoundTranscludeFn","boundTranscludeFn","transcludedScope","cloneFn","controllers","containingScope","$$transcluded","boundSlots","$$slots","slotName","attrsMap","addDirective","directiveNormalize","nName","ngPrefixMatch","nAttrs","attrStartName","attrEndName","isNgAttr","isNgProp","isNgEvent","multiElementMatch","NG_PREFIX_BINDING","PREFIX_REGEXP","MULTI_ELEMENT_DIR_RE","directiveIsMultiElement","addPropertyDirective","createEventDirective","addAttrInterpolateDirective","animVal","addTextInterpolateDirective","NODE_TYPE_COMMENT","collectCommentDirectives","byPriority","groupScan","attrStart","attrEnd","depth","groupElementsLinkFnWrapper","linkFn","groupedElementsLink","compilationGenerator","eager","compiled","lazyCompilation","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","linkNode","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","elementControllers","slotTranscludeFn","scopeToChild","controllerScope","newScopeDirective","isSlotFilled","transcludeFn.isSlotFilled","controllerDirectives","setupControllers","templateDirective","$$originalDirective","$$isolateBindings","scopeBindingInfo","initializeDirectiveBindings","removeWatches","$on","controllerDirective","$$bindings","bindingInfo","getControllers","controllerInstance","$onChanges","initialChanges","$onInit","$doCheck","$onDestroy","callOnDestroyHook","invokeLinkFn","$postLink","terminalPriority","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","$template","childTranscludeFn","didScanForMultipleTransclusion","mightHaveMultipleTransclusionError","directiveValue","$$start","$$end","assertNoDuplicate","$$tlb","scanningIndex","candidateDirective","$$createComment","replaceWith","replaceDirective","slots","slotMap","filledSlots","elementSelector","contents","filled","slotCompileNodes","$$newScope","denormalizeTemplate","removeComments","templateNamespace","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectiveScope","mergeTemplateAttributes","compileTemplateUrl","max","inheritType","dataName","property","controllerKey","$scope","$transclude","newScope","tDirectives","startAttrName","endAttrName","multiElement","srcAttr","dstAttr","$set","linkQueue","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","then","content","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","$$destroyed","oldClasses","catch","delayedNodeLinkFn","ignoreChildLinkFn","diff","what","previousDirective","wrapModuleNameIfDefined","moduleName","text","interpolateFn","textInterpolateCompileFn","templateNode","templateNodeParent","hasCompileParent","$$addBindingClass","textInterpolateLinkFn","$$addBindingInfo","expressions","interpolateFnWatchAction","wrapper","getTrustedAttrContext","attrNormalizedName","getTrustedPropContext","propNormalizedName","sanitizeSrcsetPropertyValue","propName","trustedContext","sanitizer","getTrusted","ngPropCompileFn","_","ngPropGetter","ngPropWatch","sceValueOf","ngPropPreLinkFn","applyPropValue","propValue","allOrNothing","mustHaveExpression","attrInterpolatePreLinkFn","$$observers","newValue","$$inter","$$scope","oldValue","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","replaceChild","hasData","annotation","strictBindingsCheck","recordChanges","currentValue","previousValue","$$postDigest","changes","triggerOnChangesHook","SimpleChange","removeWatchCollection","initializeBinding","lastValue","parentGet","parentSet","compare","removeWatch","$observe","_UNINITIALIZED_VALUE","literal","assign","parentValueWatch","parentValue","$stateful","$watchCollection","isLiteral","initialValue","parentValueWatchAction","SIMPLE_ATTR_NAME","$normalize","$addClass","classVal","$removeClass","toAdd","tokenDifference","toRemove","writeAttr","booleanKey","aliasedKey","ALIASED_ATTR","observer","removeAttr","listeners","startSymbol","endSymbol","binding","isolated","noTemplate","compile.$$createComment","comment","createComment","previous","current","SPECIAL_CHARS_REGEXP","str1","str2","tokens1","tokens2","token","jqNodes","ident","CNTRL_REG","this.has","register","this.register","addIdentifier","identifier","expression","later","$controllerMinErr","controllerPrototype","$controllerInit","changeListener","hidden","doc","exception","cause","serializeValue","toISOString","ngParamSerializer","params","jQueryLikeParamSerializer","serialize","toSerialize","topLevel","defaultHttpResponseTransform","headers","tempData","JSON_PROTECTION_PREFIX","contentType","hasJsonContentType","APPLICATION_JSON","jsonStart","JSON_START","JSON_ENDS","$httpMinErr","parseHeaders","line","headerVal","headerKey","headersGetter","headersObj","transformData","status","fns","defaults","transformResponse","transformRequest","d","common","CONTENT_TYPE_APPLICATION_JSON","patch","xsrfCookieName","xsrfHeaderName","paramSerializer","jsonpCallbackParam","useApplyAsync","this.useApplyAsync","interceptorFactories","interceptors","xsrfWhitelistedOrigins","requestConfig","chainInterceptors","promise","thenFn","rejectFn","executeHeaderFns","headerContent","processedHeaders","headerFn","header","response","resp","reject","mergeHeaders","defHeaders","reqHeaders","defHeaderName","lowercaseDefHeaderName","reqHeaderName","requestInterceptors","responseInterceptors","resolve","reversedInterceptors","interceptor","request","requestError","responseError","serverRequest","reqData","withCredentials","sendReq","finally","completeOutstandingRequest","createApplyHandlers","eventHandlers","applyHandlers","callEventHandler","$applyAsync","$$phase","done","headersString","statusText","xhrStatus","resolveHttpPromise","resolvePromise","deferred","resolvePromiseWithResult","removePendingReq","pendingRequests","cachedResp","isJsonp","getTrustedResourceUrl","buildUrl","sanitizeJsonpCallbackParam","defaultCache","xsrfValue","urlIsAllowedOrigin","timeout","responseType","uploadEventHandlers","serializedParams","cbKey","interceptorFactory","urlIsAllowedOriginFactory","createShortMethods","createShortMethodsWithData","createXhr","XMLHttpRequest","createHttpBackend","$browserDefer","callbacks","rawDocument","jsonpReq","callbackPath","async","body","wasCalled","timeoutRequest","abortedByTimeout","jsonpDone","xhr","abort","completeRequest","createCallback","getResponse","removeCallback","open","setRequestHeader","onload","xhr.onload","responseText","protocol","getAllResponseHeaders","onerror","ontimeout","requestTimeout","onabort","requestAborted","upload","send","$$timeoutId","this.startSymbol","this.endSymbol","escape","ch","unescapeText","escapedStartRegexp","escapedEndRegexp","constantWatchDelegate","objectEquality","constantInterp","unwatch","constantInterpolateWatch","parseStringifyInterceptor","contextAllowsConcatenation","$interpolateMinErr","interr","unescapedText","exp","$$watchDelegate","endIndex","parseFns","textLength","expressionPositions","singleExpression","startSymbolLength","endSymbolLength","map","compute","throwNoconcat","interpolationFn","$watchGroup","interpolateFnWatcher","oldValues","currValue","$interpolate.startSymbol","$interpolate.endSymbol","intervals","clearIntervalFn","clearInterval","interval","setIntervalFn","tick","setInterval","interval.cancel","$intervalMinErr","$$intervalId","q","$$state","pur","intervalFactory","intervalFn","count","invokeApply","hasParams","iteration","skipApply","notify","parseAbsoluteUrl","absoluteUrl","locationObj","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","html5Mode","DOUBLE_SLASH_REGEX","$locationMinErr","prefixed","segments","pathname","$$path","$$search","search","$$hash","startsWith","stripBaseUrl","base","LocationHtml5Url","appBase","appBaseNoFile","basePrefix","$$html5","$$parse","this.$$parse","pathUrl","$$compose","$$normalizeUrl","this.$$normalizeUrl","$$parseLinkUrl","this.$$parseLinkUrl","relHref","appUrl","prevAppUrl","rewrittenUrl","LocationHashbangUrl","hashPrefix","withoutBaseUrl","withoutHashUrl","windowsFilePathExp","firstPathSegmentMatch","LocationHashbangInHtml5Url","locationGetter","locationGetterSetter","preprocess","requireBase","rewriteLinks","this.hashPrefix","this.html5Mode","urlsEqual","setBrowserUrlWithFallback","oldUrl","oldState","afterLocationChange","$broadcast","absUrl","LocationMode","initialUrl","lastIndexOf","IGNORE_URI_REGEXP","ctrlKey","metaKey","shiftKey","which","button","absHref","preventDefault","initializing","newUrl","newState","$digest","$locationWatch","$$urlUpdatedByLocation","currentReplace","$$replace","urlOrStateChanged","debug","debugEnabled","this.debugEnabled","flag","formatError","formatStackTrace","sourceURL","consoleLog","logFn","log","navigator","userAgent","warn","getStringValue","ifDefined","plusFn","r","isPure","parentIsPure","AST","MemberExpression","computed","UnaryExpression","PURITY_ABSOLUTE","BinaryExpression","operator","CallExpression","PURITY_RELATIVE","findConstantAndWatchExpressions","ast","allConstants","argsToWatch","astIsPure","Program","expr","Literal","toWatch","argument","left","right","LogicalExpression","ConditionalExpression","alternate","consequent","Identifier","object","isStatelessFilter","callee","AssignmentExpression","ArrayExpression","ObjectExpression","properties","ThisExpression","LocalsExpression","getInputs","lastExpression","isAssignable","assignableAST","NGValueParameter","ASTCompiler","ASTInterpreter","Parser","lexer","astCompiler","getValueOf","objectValueOf","literals","identStart","identContinue","addLiteral","this.addLiteral","literalName","literalValue","setIdentifierFns","this.setIdentifierFns","identifierStart","identifierContinue","interceptorFn","parsedExpression","cacheKey","Lexer","$parseOptions","parser","addWatchDelegate","addInterceptor","expressionInputDirtyCheck","oldValueOfValue","compareObjectIdentity","inputsWatchDelegate","prettyPrintExpression","inputExpressions","inputs","lastResult","oldInputValueOf","expressionInputWatch","newInputValue","oldInputValueOfValues","oldInputValues","expressionInputsWatch","changed","oneTimeWatchDelegate","unwatchIfDone","isDone","oneTimeWatch","useInputs","isAllDefined","$$intercepted","$$interceptor","allDefined","constantWatch","oneTime","first","second","chainedInterceptor","$$pure","depurifier","s","noUnsafeEval","isIdentifierStart","isIdentifierContinue","$$getAst","getAst","errorOnUnhandledRejections","qFactory","this.errorOnUnhandledRejections","nextTick","exceptionHandler","Deferred","Promise","this.resolve","this.reject","rejectPromise","this.notify","progress","notifyPromise","processChecks","queueSize","checkQueue","toCheck","errorMessage","scheduleProcessQueue","pending","processScheduled","$$passToExceptionHandler","$$reject","$qMinErr","$$resolve","doResolve","doReject","doNotify","handleCallback","resolver","callbackOutput","when","errback","progressBack","$Q","resolveFn","TypeError","onFulfilled","onRejected","promises","counter","results","race","requestAnimationFrame","webkitRequestAnimationFrame","cancelAnimationFrame","webkitCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","timer","supported","createChildScopeClass","ChildScope","$$watchers","$$nextSibling","$$childHead","$$childTail","$$listeners","$$listenerCount","$$watchersCount","$id","$$ChildScope","$$suspended","$rootScopeMinErr","lastDirtyWatch","applyAsyncId","digestTtl","this.digestTtl","destroyChildScope","$event","currentScope","cleanUpScope","$$prevSibling","$root","Scope","beginPhase","phase","incrementWatchersCount","decrementListenerCount","initWatchVal","flushApplyAsync","applyAsyncQueue","scheduleApplyAsync","isolate","child","watchExp","watcher","last","eq","$$digestWatchIndex","deregisterWatch","watchExpressions","watchGroupAction","changeReactionScheduled","firstRun","newValues","deregisterFns","shouldCall","deregisterWatchGroup","unwatchFn","watchGroupSubAction","$watchCollectionInterceptor","_value","bothNaN","newItem","oldItem","internalArray","oldLength","changeDetected","newLength","internalObject","veryOldValue","trackVeryOldValue","changeDetector","initRun","$watchCollectionAction","watch","watchers","dirty","ttl","asyncQueue","watchLog","logIdx","asyncTask","asyncQueuePosition","msg","next","postDigestQueuePosition","postDigestQueue","$suspend","$isSuspended","$resume","eventName","this.$watchGroup","$eval","$applyAsyncExpression","namedListeners","indexOfListener","$emit","targetScope","listenerArgs","$$asyncQueue","$$postDigestQueue","$$applyAsyncQueue","sanitizeUri","uri","isMediaUrl","regex","normalizedVal","adjustMatcher","matcher","$sceMinErr","escapeForRegexp","adjustMatchers","matchers","adjustedMatchers","resourceUrlWhitelist","resourceUrlBlacklist","this.resourceUrlWhitelist","this.resourceUrlBlacklist","matchUrl","baseURI","baseUrlParsingNode","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","this.$$unwrapTrustedValue","holderType.prototype.valueOf","holderType.prototype.toString","htmlSanitizer","trustedValueHolderBase","byType","JS","trustAs","Constructor","maybeTrusted","allowed","this.enabled","sce","isEnabled","sce.isEnabled","sce.getTrusted","parseAs","sce.parseAs","enumValue","lName","UNDERSCORE_LOWERCASE_REGEXP","eventSupport","hasHistoryPushState","nw","process","chrome","app","runtime","pushState","android","boxee","bodyStyle","transitions","animations","hasEvent","divElm","TaskTracker","getLastCallback","cbInfo","taskCallbacks","pop","cb","getLastCallbackForType","taskCounts","ALL_TASKS_TYPE","countForType","countForAll","getNextCallback","nextCb","httpOptions","this.httpOptions","handleRequestFn","tpl","ignoreRequestError","totalPendingRequests","transformer","handleError","$templateRequestMinErr","testability","testability.findBindings","opt_exactMatch","getElementsByClassName","matches","dataBinding","bindingName","testability.findModels","prefixes","attributeEquals","testability.getLocation","testability.setLocation","testability.whenStable","deferreds","timeout.cancel","$timeoutMinErr","urlParsingNode","ipv6InBrackets","whitelistedOriginUrls","parsedAllowedOriginUrls","originUrl","requestUrl","urlsAreSameOrigin","url1","url2","$$CookieReader","safeDecodeURIComponent","lastCookies","lastCookieString","cookieArray","cookie","currentCookieString","filters","suffix","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","anyPropertyKey","matchAgainstAnyProp","getTypeForFilter","expressionType","predicateFn","createPredicateFn","shouldMatchPrimitives","actual","expected","deepCompare","dontMatchWholeObject","actualType","expectedType","expectedVal","matchAnyProperty","actualVal","$locale","formats","NUMBER_FORMATS","amount","currencySymbol","fractionSize","CURRENCY_SYM","PATTERNS","maxFrac","currencySymbolRe","formatNumber","GROUP_SEP","DECIMAL_SEP","number","numStr","exponent","digits","numberOfIntegerDigits","zeros","ZERO_CHAR","MAX_DIGITS","roundNumber","parsedNumber","minFrac","fractionLen","min","roundAt","digit","k","carry","reduceRight","groupSep","decimalSep","isNaN","isInfinity","isFinite","isZero","abs","formattedText","integerLen","decimals","reduce","groups","lgSize","gSize","negPre","negSuf","posPre","posSuf","padNumber","num","negWrap","neg","dateGetter","dateStrGetter","shortForm","standAlone","getFirstThursdayOfYear","year","dayOfWeekOnFirst","getDay","weekGetter","firstThurs","getFullYear","thisThurs","getMonth","getDate","round","eraGetter","ERAS","jsonStringToDate","string","R_ISO8601_STR","tzHour","tzMin","dateSetter","setUTCFullYear","setFullYear","timeSetter","setUTCHours","setHours","m","ms","parseFloat","format","DATETIME_FORMATS","NUMBER_STRING","DATE_FORMATS_SPLIT","DATE_FORMATS","spacing","limit","begin","Infinity","sliceFn","end","processPredicates","sortPredicates","predicate","descending","defaultCompare","v1","v2","type1","type2","value1","value2","sortPredicate","reverseOrder","compareFn","predicates","compareValues","getComparisonObject","tieBreaker","predicateValues","doComparison","ngDirective","FormController","$$controls","$error","$$success","$pending","$name","$dirty","$valid","$pristine","$submitted","$invalid","$$parentForm","nullFormCtrl","$$animate","setupValidity","$$classCache","INVALID_CLASS","VALID_CLASS","addSetValidityMethod","cachedToggleClass","ctrl","switchValue","toggleValidationCss","validationErrorKey","isValid","unset","clazz","$setValidity","clazz.prototype.$setValidity","isObjectEmpty","PENDING_CLASS","combinedState","stringBasedInputType","$formatters","$isEmpty","baseInputType","composing","ev","ngTrim","$viewValue","$$hasNativeValidators","$setViewValue","deferListener","origValue","keyCode","PARTIAL_VALIDATION_TYPES","PARTIAL_VALIDATION_EVENTS","validity","origBadInput","badInput","origTypeMismatch","typeMismatch","$render","ctrl.$render","createDateParser","mapping","iso","previousDate","ISO_DATE_REGEXP","yyyy","MM","dd","HH","getHours","mm","ss","getSeconds","sss","getMilliseconds","part","createDateInputType","parseDate","dynamicDateInputType","isValidDate","parseObservedDateValue","parseDateAndConvertTimeZoneToLocal","$options","getOption","previousTimezone","parsedDate","badInputChecker","isTimeType","$parsers","$$parserName","ngModelMinErr","targetFormat","formatted","ngMin","minVal","parsedMinVal","$validators","ctrl.$validators.min","$validate","ngMax","maxVal","parsedMaxVal","ctrl.$validators.max","parserName","VALIDITY_STATE_PROPERTY","numberFormatterParser","NUMBER_REGEXP","parseNumberAttrVal","countDecimals","numString","decimalSymbolIndex","isValidForStep","viewValue","stepBase","step","isNonIntegerValue","isNonIntegerStepBase","isNonIntegerStep","valueDecimals","stepBaseDecimals","stepDecimals","decimalCount","multiplier","pow","parseConstantExpr","parseFn","classDirective","arrayDifference","toClassString","classValue","classString","indexWatchExpression","digestClassCounts","classArray","classesToUpdate","classCounts","ngClassIndexWatchAction","newModulo","oldClassString","oldModulo","moduloTwo","$index","ngClassWatchAction","newClassString","oldClassArray","newClassArray","toRemoveArray","toAddArray","toRemoveString","toAddString","forceAsync","ngEventHandler","NgModelController","$modelValue","$$rawModelValue","$asyncValidators","$viewChangeListeners","$untouched","$touched","defaultModelOptions","$$updateEvents","$$updateEventHandler","$$parsedNgModel","$$parsedNgModelAssign","$$ngModelGet","$$ngModelSet","$$pendingDebounce","$$parserValid","$$currentValidationRunId","$$rootScope","$$attr","$$timeout","$$exceptionHandler","setupModelWatcher","ngModelWatch","modelValue","$$setModelValue","ModelOptions","$$options","setOptionSelectedStatus","optionEl","parsePatternAttr","patternExp","parseLength","intVal","REGEX_STRING_REGEXP","documentMode","rules","ngCspElement","ngCspAttribute","noInlineStyle","name_","el","allowAutoBootstrap","currentScript","HTMLScriptElement","SVGScriptElement","srcs","getNamedItem","every","origin","full","major","minor","dot","codeName","expando","JQLite._data","MS_HACK_REGEXP","mouseleave","mouseenter","thead","col","tr","td","tbody","tfoot","colgroup","caption","th","wrapMapValueClosing","wrapMapValue","optgroup","Node","contains","compareDocumentPosition","ready","removeData","jqLiteHasData","jqLiteCleanData","removeAttribute","css","NODE_TYPE_ATTRIBUTE","lowercasedName","isBooleanAttr","ret","getText","$dv","multiple","selected","arg1","arg2","nodeCount","jqLiteOn","types","addHandler","noEventListener","one","onFn","replaceNode","insertBefore","children","contentDocument","prepend","wrapNode","detach","after","newElement","toggleClass","condition","classCondition","nextElementSibling","getElementsByTagName","extraParameters","dummyEvent","handlerArgs","eventFnsCopy","arg3","unbind","nanKey","_idx","_transformKey","delete","FN_ARG_SPLIT","FN_ARG","argDecl","underscore","$animateMinErr","postDigestElements","updateData","handleCSSClassChanges","existing","pin","domOperation","from","to","classesAdded","add","classesRemoved","runner","complete","classNameFilter","customFilter","$$registeredAnimations","this.customFilter","filterFn","this.classNameFilter","reservedRegex","NG_ANIMATE_CLASSNAME","domInsert","parentElement","afterElement","afterNode","ELEMENT_NODE","previousElementSibling","enter","move","leave","addclass","setClass","animate","tempClasses","waitForTick","waitQueue","passed","AnimateRunner","setHost","rafTick","_doneCallbacks","_tick","this._tick","_state","chain","AnimateRunner.chain","AnimateRunner.all","runners","onProgress","DONE_COMPLETE_STATE","getPromise","resolveHandler","rejectHandler","pause","resume","_resolve","INITIAL_STATE","DONE_PENDING_STATE","initialOptions","closed","$$prepared","cleanupStyles","start","UNINITIALIZED_VALUE","isFirstChange","SimpleChange.prototype.isFirstChange","domNode","offsetWidth","$interpolateMinErr.throwNoconcat","$interpolateMinErr.interr","callbackId","called","callbackMap","PATH_MATCH","locationPrototype","$$absUrl","hashValue","pathValue","$$url","paramValue","Location","Location.prototype.state","$parseMinErr","OPERATORS","ESCAPE","lex","tokens","readString","peek","readNumber","peekMultichar","readIdent","is","isWhitespace","ch2","ch3","op2","op3","op1","throwError","chars","codePointAt","isValidIdentifierStart","isValidIdentifierContinue","cp","charCodeAt","cp1","cp2","isExpOperator","colStr","peekCh","quote","rawString","hex","String","fromCharCode","rep","ExpressionStatement","Property","program","expressionStatement","expect","filterChain","assignment","ternary","logicalOR","consume","logicalAND","equality","relational","additive","multiplicative","unary","primary","arrayDeclaration","selfReferential","parseArguments","baseExpression","peekToken","kind","e1","e2","e3","e4","peekAhead","t","nextId","vars","own","assignable","stage","computing","recurse","return_","generateFunction","fnKey","intoId","watchId","fnString","USE","STRICT","filterPrefix","watchFns","varsPrefix","section","nameId","recursionFn","skipWatchIdCheck","if_","lazyAssign","computedMember","lazyRecurse","plus","not","getHasOwnProperty","isNull","nonComputedMember","notNull","member","filterName","defaultValue","UNSAFE_CHARACTERS","SAFE_IDENTIFIER","stringEscapeFn","stringEscapeRegex","c","skip","init","fn.assign","rhs","lhs","unary+","unary-","unary!","binary+","binary-","binary*","binary/","binary%","binary===","binary!==","binary==","binary!=","binary<","binary>","binary<=","binary>=","binary&&","binary||","ternary?:","yy","y","MMMM","MMM","M","LLLL","H","hh","EEEE","EEE","ampmGetter","AMPMS","Z","timeZoneGetter","zone","paddedZone","ww","w","G","GG","GGG","GGGG","longEraGetter","ERANAMES","xlinkHref","defaultLinkFn","normalized","ngBooleanAttrWatchAction","htmlAttr","ngAttrAliasWatchAction","$addControl","$getControls","$$renameControl","nullFormRenameControl","control","$removeControl","$setDirty","$setPristine","$setSubmitted","$$setSubmitted","$rollbackViewValue","$commitViewValue","newName","oldName","PRISTINE_CLASS","DIRTY_CLASS","SUBMITTED_CLASS","$setUntouched","rootForm","formDirectiveFactory","isNgForm","getSetter","ngFormCompile","formElement","nameAttr","ngFormPreLink","ctrls","handleFormSubmission","setter","URL_REGEXP","EMAIL_REGEXP","DATE_REGEXP","DATETIMELOCAL_REGEXP","WEEK_REGEXP","MONTH_REGEXP","TIME_REGEXP","inputType","textInputType","weekParser","isoWeek","existingDate","week","hours","seconds","milliseconds","addDays","numberInputType","ngStep","stepVal","parsedStepVal","ctrl.$validators.step","urlInputType","ctrl.$validators.url","emailInputType","email","ctrl.$validators.email","radioInputType","doTrim","checked","rangeInputType","setInitialValueAndObserver","htmlAttrName","changeFn","wrappedObserver","minChange","supportsRange","elVal","maxChange","stepChange","hasMinAttr","hasMaxAttr","hasStepAttr","originalRender","rangeUnderflow","rangeOverflow","rangeRender","noopMinValidator","minValidator","noopMaxValidator","maxValidator","nativeStepValidator","stepMismatch","stepValidator","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","ctrl.$isEmpty","valueProperty","configurable","enumerable","defineProperty","CONSTANT_VALUE_REGEXP","updateElementValue","tplAttr","ngValueConstantLink","ngValueLink","valueWatchAction","$compile","ngBindCompile","templateElement","ngBindLink","ngBindWatchAction","ngBindTemplateCompile","ngBindTemplateLink","ngBindHtmlCompile","ngBindHtmlGetter","ngBindHtmlWatch","ngBindHtmlLink","ngBindHtmlWatchAction","getTrustedHtml","forceAsyncEvents","previousElements","ngIfWatchAction","srcExp","onloadExp","autoScrollExp","autoscroll","changeCounter","previousElement","currentElement","cleanupLastIncludeContent","ngIncludeWatchAction","afterAnimation","thisChangeId","namespaceAdaptedClone","trimValues","$$initGetterSetters","invokeModelGetter","invokeModelSetter","this.$$ngModelGet","this.$$ngModelSet","$$$p","$$updateEmptyClasses","NOT_EMPTY_CLASS","EMPTY_CLASS","UNTOUCHED_CLASS","TOUCHED_CLASS","$setTouched","$$lastCommittedViewValue","prevValid","prevModelValue","allowInvalid","that","$$runValidators","allValid","$$writeModelToScope","doneCallback","processSyncValidators","syncValidatorsValid","validator","Boolean","setValidity","processAsyncValidators","validatorPromises","validationDone","localValidationRunId","processParseErrors","errorKey","$$parseAndValidate","$$debounceViewValueCommit","debounceDelay","$overrideModelOptions","createChild","$$setUpdateOnEvents","$processModelValue","$$format","formatters","ngModelCompile","ngModelPreLink","modelCtrl","formCtrl","optionsCtrl","ngModelPostLink","setTouched","DEFAULT_REGEXP","inheritAll","updateOnDefault","updateOn","debounce","getterSetter","NgModelOptionsController","$$attrs","parentOptions","parentCtrl","modelOptionsDefinition","ngOptionsMinErr","NG_OPTIONS_REGEXP","parseOptionsExpression","optionsExp","selectElement","Option","selectValue","label","group","disabled","getOptionValuesKeys","optionValues","optionValuesKeys","keyName","itemKey","valueName","selectAs","trackBy","viewValueFn","trackByFn","getTrackByValueFn","getHashOfValue","getTrackByValue","getLocals","displayFn","groupByFn","disableWhenFn","valuesFn","getWatchables","watchedArray","optionValuesLength","disableWhen","getOptions","optionItems","selectValueMap","optionItem","getOptionFromViewValue","getViewValueFromOption","optionTemplate","optGroupTemplate","ngOptionsPreLink","registerOption","ngOptionsPostLink","getAndUpdateSelectedOption","updateOptionElement","selectCtrl","ngModelCtrl","hasEmptyOption","emptyOption","providedEmptyOption","unknownOption","listFragment","generateUnknownOptionValue","selectCtrl.generateUnknownOptionValue","writeValue","selectCtrl.writeValue","selectedOptions","readValue","selectCtrl.readValue","selectedValues","selections","selectedOption","selectedIndex","removeUnknownOption","selectUnknownOrEmptyOption","unselectEmptyOption","selectCtrl.registerOption","optionScope","needsRerender","$isEmptyOptionSelected","updateOptions","groupElementMap","addOption","groupElement","optionElement","nextValue","BRACE","IS_WHEN","updateElementText","newText","numberExp","whenExp","whens","whensExpFns","braceReplacement","watchRemover","lastCount","attributeName","tmpMatch","whenKey","ngPluralizeWatchAction","countIsNaN","pluralCat","whenExpFn","ngRefMinErr","refValue","ngRefRead","ngRepeatMinErr","updateScope","valueIdentifier","keyIdentifier","arrayLength","$first","$last","$middle","$odd","$even","trackByIdArrayFn","trackByIdObjFn","ngRepeatCompile","ngRepeatEndComment","aliasAs","trackByExp","trackByIdExpFn","hashFnLocals","trackByExpGetter","ngRepeatLink","lastBlockMap","ngRepeatAction","previousNode","nextNode","nextBlockMap","collectionLength","trackById","collectionKeys","nextBlockOrder","trackByIdFn","blockKey","ngRepeatTransclude","ngShowWatchAction","NG_HIDE_CLASS","NG_HIDE_IN_PROGRESS_CLASS","ngHideWatchAction","ngStyleWatchAction","newStyles","oldStyles","NgSwitchController","cases","ngSwitchController","selectedTranscludes","selectedElements","previousLeaveAnimations","selectedScopes","spliceFactory","ngSwitchWatchAction","selectedTransclude","caseElement","selectedScope","anchor","ngSwitchWhenSeparator","whenCase","ngTranscludeMinErr","ngTranscludeCompile","fallbackLinkFn","ngTranscludePostLink","useFallbackContent","ngTranscludeSlot","ngTranscludeCloneAttachFn","noopNgModelController","SelectController","scheduleRender","renderScheduled","scheduleViewValueUpdate","renderAfter","updateScheduled","optionsMap","renderUnknownOption","self.renderUnknownOption","unknownVal","updateUnknownOption","self.updateUnknownOption","self.generateUnknownOptionValue","self.removeUnknownOption","selectEmptyOption","self.selectEmptyOption","self.unselectEmptyOption","self.readValue","realVal","hasOption","self.writeValue","currentlySelectedOption","hashedVal","self.addOption","removeOption","self.removeOption","self.hasOption","$hasEmptyOption","self.$hasEmptyOption","$isUnknownOptionSelected","self.$isUnknownOptionSelected","self.$isEmptyOptionSelected","self.selectUnknownOrEmptyOption","self.registerOption","optionAttrs","interpolateValueFn","interpolateTextFn","valueAttributeObserveAction","removal","previouslySelected","interpolateWatchAction","removeValue","selectPreLink","shouldBeSelected","lastView","lastViewRef","selectMultipleWatch","ngModelCtrl.$isEmpty","selectPostLink","ngModelCtrl.$render","selectCtrlName","ctrl.$validators.required","tElm","tAttr","attrVal","oldRegexp","ctrl.$validators.pattern","maxlengthParsed","ctrl.$validators.maxlength","minlengthParsed","ctrl.$validators.minlength","getDecimals","opt_precision","ONE","OTHER","$$csp","head"]
 }
diff --git a/civicrm/bower_components/angular/bower.json b/civicrm/bower_components/angular/bower.json
index a737d9bedda919fc71f40c2a162e8436c3bbada8..052eca119241eddddefa8d76444a9d6c45f68f32 100644
--- a/civicrm/bower_components/angular/bower.json
+++ b/civicrm/bower_components/angular/bower.json
@@ -1,6 +1,6 @@
 {
   "name": "angular",
-  "version": "1.5.11",
+  "version": "1.8.0",
   "license": "MIT",
   "main": "./angular.js",
   "ignore": [],
diff --git a/civicrm/bower_components/angular/package.json b/civicrm/bower_components/angular/package.json
index bf193710208e7ac4238372cd5a3e314dd456c53e..9e7cb7818dc961c772263919f929eb3ca237bd37 100644
--- a/civicrm/bower_components/angular/package.json
+++ b/civicrm/bower_components/angular/package.json
@@ -1,6 +1,6 @@
 {
   "name": "angular",
-  "version": "1.5.11",
+  "version": "1.8.0",
   "description": "HTML enhanced for web apps",
   "main": "index.js",
   "scripts": {
diff --git a/civicrm/civicrm-version.php b/civicrm/civicrm-version.php
index 7997fa7ef41e035fb4749b3efd1df38060fdb80d..ec6e2ec906918ce529ce9f10671c94ffd9d4ac48 100644
--- a/civicrm/civicrm-version.php
+++ b/civicrm/civicrm-version.php
@@ -1,7 +1,7 @@
 <?php
 /** @deprecated */
 function civicrmVersion( ) {
-  return array( 'version'  => '5.30.1',
+  return array( 'version'  => '5.31.0',
                 'cms'      => 'Wordpress',
                 'revision' => '' );
 }
diff --git a/civicrm/composer.json b/civicrm/composer.json
index 9dfefaa375a7725c4e1b1933a20c09efec8ddf0f..a7fd40d520727feb465bc282fcb1edcd28c154d7 100644
--- a/civicrm/composer.json
+++ b/civicrm/composer.json
@@ -52,6 +52,7 @@
     "symfony/event-dispatcher": "~3.0 || ~4.4",
     "symfony/filesystem": "~3.0 || ~4.4",
     "symfony/process": "~3.0 || ~4.4",
+    "symfony/var-dumper": "~3.0 || ~4.4 || ~5.1",
     "psr/log": "~1.0",
     "symfony/finder": "~3.0 || ~4.4",
     "tecnickcom/tcpdf" : "6.3.*",
@@ -71,7 +72,7 @@
     "cweagans/composer-patches": "~1.0",
     "pear/log": "1.13.2",
     "adrienrn/php-mimetyper": "0.2.2",
-    "civicrm/composer-downloads-plugin": "^2.0",
+    "civicrm/composer-downloads-plugin": "^3.0",
     "league/csv": "^9.2",
     "tplaner/when": "~3.0.0",
     "xkerman/restricted-unserialize": "~1.1",
@@ -79,7 +80,8 @@
     "brick/money": "~0.4",
     "ext-intl": "*",
     "pear/mail_mime": "~1.10",
-    "pear/db": "1.10"
+    "pear/db": "1.10",
+    "civicrm/composer-compile-lib": "~0.3 || ~1.0"
   },
   "scripts": {
     "post-install-cmd": [
@@ -124,7 +126,7 @@
         "path": "bower_components/{$id}"
       },
       "angular": {
-        "url": "https://github.com/angular/bower-angular/archive/v1.5.11.zip"
+        "url": "https://github.com/angular/bower-angular/archive/v1.8.0.zip"
       },
       "angular-bootstrap": {
         "url": "https://github.com/angular-ui/bootstrap-bower/archive/2.5.0.zip"
@@ -137,13 +139,13 @@
         "url": "https://github.com/totten/angular-jquery-dialog-service/archive/v0.8.0-civicrm-1.0.zip"
       },
       "angular-mocks": {
-        "url": "https://github.com/angular/bower-angular-mocks/archive/v1.5.11.zip"
+        "url": "https://github.com/angular/bower-angular-mocks/archive/v1.8.0.zip"
       },
       "angular-route": {
-        "url": "https://github.com/angular/bower-angular-route/archive/v1.5.11.zip"
+        "url": "https://github.com/angular/bower-angular-route/archive/v1.8.0.zip"
       },
       "angular-sanitize": {
-        "url": "https://github.com/angular/bower-angular-sanitize/archive/v1.5.11.zip"
+        "url": "https://github.com/angular/bower-angular-sanitize/archive/v1.8.0.zip"
       },
       "angular-ui-sortable": {
         "url": "https://github.com/angular-ui/ui-sortable/archive/v0.19.0.zip"
@@ -195,6 +197,12 @@
       "es6-promise": {
         "url": "https://github.com/components/es6-promise/archive/v4.2.4.zip"
       },
+      "ext-greenwich-bootstrap3": {
+        "url": "https://github.com/twbs/bootstrap-sass/archive/v{$version}.zip",
+        "path": "ext/greenwich/extern/bootstrap3",
+        "version": "3.4.1",
+        "ignore": ["test", "tasks", "lib"]
+      },
       "font-awesome": {
         "url": "https://github.com/FortAwesome/Font-Awesome/archive/v4.7.0.zip",
         "ignore": ["*/.*", "*.json", "src", "*.yml", "Gemfile", "Gemfile.lock", "*.md"]
@@ -273,6 +281,8 @@
       "zetacomponents/mail": {
         "CiviCRM Custom Patches for ZetaCompoents mail": "https://raw.githubusercontent.com/civicrm/civicrm-core/9d93748a36c7c5d44422911db1c98fb2f7067b34/tools/scripts/composer/patches/civicrm-custom-patches-zetacompoents-mail.patch"
       }
-    }
+    },
+    "compile-includes": ["ext/greenwich/composer.compile.json"],
+    "compile-whitelist": ["civicrm/composer-compile-lib"]
   }
 }
diff --git a/civicrm/composer.lock b/civicrm/composer.lock
index 44f39034684af8fe059b3ccc171784276190478f..473ef7a3276de2c94dac3d5ba912cc1ae7a2ceb9 100644
--- a/civicrm/composer.lock
+++ b/civicrm/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "46e891da51f0683373d9a6e62fb6f868",
+    "content-hash": "724a188bee13cc82b52f8bdf1da31595",
     "packages": [
         {
             "name": "adrienrn/php-mimetyper",
@@ -297,27 +297,135 @@
             "description": "RPC library for CiviConnect",
             "time": "2020-02-05T03:24:26+00:00"
         },
+        {
+            "name": "civicrm/composer-compile-lib",
+            "version": "v0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/civicrm/composer-compile-lib.git",
+                "reference": "980b26dcc3d51ecf47aa45c43564ab9b6dbac244"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/civicrm/composer-compile-lib/zipball/980b26dcc3d51ecf47aa45c43564ab9b6dbac244",
+                "reference": "980b26dcc3d51ecf47aa45c43564ab9b6dbac244",
+                "shasum": ""
+            },
+            "require": {
+                "civicrm/composer-compile-plugin": "~0.9 || ~1.0",
+                "padaliyajay/php-autoprefixer": "~1.2",
+                "scssphp/scssphp": "~1.2",
+                "symfony/filesystem": "~2.8 || ~3.4 || ~4.0 || ~5.0",
+                "tubalmartin/cssmin": "^4.1"
+            },
+            "type": "library",
+            "extra": {
+                "compile": [
+                    {
+                        "title": "Generate <comment>CCL</comment> wrapper functions",
+                        "run": [
+                            "@php-method \\CCL\\Tasks::template"
+                        ],
+                        "tpl-file": "src/StubsTpl.php",
+                        "tpl-items": {
+                            "CCL.php": true
+                        },
+                        "watch-files": [
+                            "src/StubsTpl.php",
+                            "src/Functions.php"
+                        ]
+                    }
+                ]
+            },
+            "autoload": {
+                "psr-0": {
+                    "CCL": ""
+                },
+                "psr-4": {
+                    "CCL\\": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "CiviCRM",
+                    "email": "info@civicrm.org"
+                }
+            ],
+            "description": "Small library of compilation helpers",
+            "time": "2020-10-03T00:11:18+00:00"
+        },
+        {
+            "name": "civicrm/composer-compile-plugin",
+            "version": "v0.12",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/civicrm/composer-compile-plugin.git",
+                "reference": "5ed863f2276a445775900ba18e99d14b15402640"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/civicrm/composer-compile-plugin/zipball/5ed863f2276a445775900ba18e99d14b15402640",
+                "reference": "5ed863f2276a445775900ba18e99d14b15402640",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.1 || ^2.0",
+                "php": ">=7.1",
+                "totten/lurkerlite": "^1.3"
+            },
+            "require-dev": {
+                "composer/composer": "~1.0",
+                "totten/process-helper": "^1.0.1"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "Civi\\CompilePlugin\\CompilePlugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "Civi\\CompilePlugin\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Tim Otten",
+                    "email": "info@civicrm.org"
+                }
+            ],
+            "description": "Define a 'compile' event for all packages in the dependency-graph",
+            "time": "2020-10-04T00:13:46+00:00"
+        },
         {
             "name": "civicrm/composer-downloads-plugin",
-            "version": "v2.1.1",
+            "version": "v3.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/civicrm/composer-downloads-plugin.git",
-                "reference": "8722bc7d547315be39397a3078bb51ee053ca269"
+                "reference": "3aabb6d259a86158d01829fc2c62a2afb9618877"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/civicrm/composer-downloads-plugin/zipball/8722bc7d547315be39397a3078bb51ee053ca269",
-                "reference": "8722bc7d547315be39397a3078bb51ee053ca269",
+                "url": "https://api.github.com/repos/civicrm/composer-downloads-plugin/zipball/3aabb6d259a86158d01829fc2c62a2afb9618877",
+                "reference": "3aabb6d259a86158d01829fc2c62a2afb9618877",
                 "shasum": ""
             },
             "require": {
-                "composer-plugin-api": "^1.1",
+                "composer-plugin-api": "^1.1 || ^2.0",
                 "php": ">=5.6",
                 "togos/gitignore": "~1.1.1"
             },
             "require-dev": {
-                "composer/composer": "~1.0",
+                "composer/composer": "~1.0 || ~2.0",
                 "friendsofphp/php-cs-fixer": "^2.3",
                 "phpunit/phpunit": "^5.7",
                 "totten/process-helper": "^1.0.1"
@@ -346,7 +454,7 @@
                 }
             ],
             "description": "Composer plugin for downloading additional files within any composer package.",
-            "time": "2019-08-28T00:33:51+00:00"
+            "time": "2020-11-02T04:00:42+00:00"
         },
         {
             "name": "cweagans/composer-patches",
@@ -861,6 +969,41 @@
             ],
             "time": "2016-11-19T14:58:11+00:00"
         },
+        {
+            "name": "padaliyajay/php-autoprefixer",
+            "version": "1.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/padaliyajay/php-autoprefixer.git",
+                "reference": "f05f374f0c1e463db62209613f52b38bf4b52430"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/padaliyajay/php-autoprefixer/zipball/f05f374f0c1e463db62209613f52b38bf4b52430",
+                "reference": "f05f374f0c1e463db62209613f52b38bf4b52430",
+                "shasum": ""
+            },
+            "require": {
+                "sabberworm/php-css-parser": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Padaliyajay\\PHPAutoprefixer\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jay padaliya"
+                }
+            ],
+            "description": "CSS Autoprefixer written in pure PHP.",
+            "time": "2019-11-26T09:55:37+00:00"
+        },
         {
             "name": "pclzip/pclzip",
             "version": "2.8.2",
@@ -2159,6 +2302,68 @@
             ],
             "time": "2020-06-01T09:10:00+00:00"
         },
+        {
+            "name": "scssphp/scssphp",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/scssphp/scssphp.git",
+                "reference": "a05ea68160b7286ebbfd6e5fd7ae9e1a946ad6e1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/scssphp/scssphp/zipball/a05ea68160b7286ebbfd6e5fd7ae9e1a946ad6e1",
+                "reference": "a05ea68160b7286ebbfd6e5fd7ae9e1a946ad6e1",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-json": "*",
+                "php": ">=5.6.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3",
+                "sass/sass-spec": "2020.08.10",
+                "squizlabs/php_codesniffer": "~3.5",
+                "twbs/bootstrap": "~4.3",
+                "zurb/foundation": "~6.5"
+            },
+            "bin": [
+                "bin/pscss"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "ScssPhp\\ScssPhp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Anthon Pang",
+                    "email": "apang@softwaredevelopment.ca",
+                    "homepage": "https://github.com/robocoder"
+                },
+                {
+                    "name": "Cédric Morin",
+                    "email": "cedric@yterium.com",
+                    "homepage": "https://github.com/Cerdic"
+                }
+            ],
+            "description": "scssphp is a compiler for SCSS written in PHP.",
+            "homepage": "http://scssphp.github.io/scssphp/",
+            "keywords": [
+                "css",
+                "less",
+                "sass",
+                "scss",
+                "stylesheet"
+            ],
+            "time": "2020-09-07T21:15:42+00:00"
+        },
         {
             "name": "symfony/config",
             "version": "v3.4.40",
@@ -2812,6 +3017,89 @@
             "homepage": "https://symfony.com",
             "time": "2020-04-12T14:33:46+00:00"
         },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v3.4.44",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "3e31b82077039b1ea3b5a203ec1e3016606f4484"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3e31b82077039b1ea3b5a203ec1e3016606f4484",
+                "reference": "3e31b82077039b1ea3b5a203ec1e3016606f4484",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+            },
+            "require-dev": {
+                "ext-iconv": "*",
+                "twig/twig": "~1.34|~2.4"
+            },
+            "suggest": {
+                "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+                "ext-intl": "To show region name in time zone dump",
+                "ext-symfony_debug": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "Resources/functions/dump.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\VarDumper\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony mechanism for exploring and dumping PHP variables",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "debug",
+                "dump"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-17T07:27:37+00:00"
+        },
         {
             "name": "tecnickcom/tcpdf",
             "version": "6.3.5",
@@ -2944,6 +3232,66 @@
             "homepage": "https://github.com/totten/ca_config",
             "time": "2017-05-10T20:08:17+00:00"
         },
+        {
+            "name": "totten/lurkerlite",
+            "version": "1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/totten/Lurker.git",
+                "reference": "a20c47142b486415b9117c76aa4c2117ff95b49a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/totten/Lurker/zipball/a20c47142b486415b9117c76aa4c2117ff95b49a",
+                "reference": "a20c47142b486415b9117c76aa4c2117ff95b49a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "replace": {
+                "henrikbjorn/lurker": "*"
+            },
+            "suggest": {
+                "ext-inotify": ">=0.1.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Lurker": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com"
+                },
+                {
+                    "name": "Yaroslav Kiliba",
+                    "email": "om.dattaya@gmail.com"
+                },
+                {
+                    "name": "Henrik Bjrnskov",
+                    "email": "henrik@bjrnskov.dk"
+                }
+            ],
+            "description": "Resource Watcher - Lightweight edition of henrikbjorn/lurker with no dependencies",
+            "keywords": [
+                "filesystem",
+                "resource",
+                "watching"
+            ],
+            "time": "2020-09-01T10:01:01+00:00"
+        },
         {
             "name": "tplaner/when",
             "version": "3.0.0+php53",
@@ -2981,6 +3329,59 @@
                 "time"
             ]
         },
+        {
+            "name": "tubalmartin/cssmin",
+            "version": "v4.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port.git",
+                "reference": "3cbf557f4079d83a06f9c3ff9b957c022d7805cf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/tubalmartin/YUI-CSS-compressor-PHP-port/zipball/3cbf557f4079d83a06f9c3ff9b957c022d7805cf",
+                "reference": "3cbf557f4079d83a06f9c3ff9b957c022d7805cf",
+                "shasum": ""
+            },
+            "require": {
+                "ext-pcre": "*",
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "cogpowered/finediff": "0.3.*",
+                "phpunit/phpunit": "4.8.*"
+            },
+            "bin": [
+                "cssmin"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "tubalmartin\\CssMin\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Túbal Martín",
+                    "homepage": "http://tubalmartin.me/"
+                }
+            ],
+            "description": "A PHP port of the YUI CSS compressor",
+            "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port",
+            "keywords": [
+                "compress",
+                "compressor",
+                "css",
+                "cssmin",
+                "minify",
+                "yui"
+            ],
+            "time": "2018-01-15T15:26:51+00:00"
+        },
         {
             "name": "typo3/phar-stream-wrapper",
             "version": "v3.1.4",
diff --git a/civicrm/css/api4-explorer.css b/civicrm/css/api4-explorer.css
index fa288280585d38e0f49e9fa684553ee6f0d69b17..6106870c6b450e66cef4e26d1db0b92d7ef478f7 100644
--- a/civicrm/css/api4-explorer.css
+++ b/civicrm/css/api4-explorer.css
@@ -75,7 +75,6 @@
 }
 
 #bootstrap-theme.api4-explorer-page fieldset legend {
-  background-color: white;
   font-size: 13px;
   margin: 0;
   width: auto;
@@ -83,12 +82,12 @@
   padding: 2px 5px;
   text-transform: capitalize;
 }
-#bootstrap-theme.api4-explorer-page fieldset > .btn-group {
+#bootstrap-theme.api4-explorer-page crm-api4-clause > .btn-group {
   position: absolute;
   right: 0;
-  top: 11px;
+  top: 0;
 }
-#bootstrap-theme.api4-explorer-page fieldset > .btn-group .btn {
+#bootstrap-theme.api4-explorer-page crm-api4-clause > .btn-group .btn {
   border: 0 none;
 }
 
diff --git a/civicrm/css/civicrm.css b/civicrm/css/civicrm.css
index a3264938b0ae2fb905b3f196bd04c03c89622f36..1a685a272970b4b5891a24f0334d692e7d52d492 100644
--- a/civicrm/css/civicrm.css
+++ b/civicrm/css/civicrm.css
@@ -1173,7 +1173,7 @@ input.crm-form-entityref {
   cursor: pointer;
 }
 
-#crm-container input.submit-link {
+#crm-container button.submit-link {
   color: #285286;
   background: none transparent;
   border: none;
@@ -1833,30 +1833,21 @@ input.crm-form-entityref {
   margin-left: .5em;
 }
 
-.crm-container .crm-button input {
-  background: none;
-  _background: #6C6C6C;
-  /* IE6 only */
-  border: medium none;
-  color: #FFF;
-  cursor: pointer;
-  font-size: 13px;
-  font-weight: normal;
-  margin: 0;
-  padding: 1px 8px 2px 4px;
-}
-
 .crm-container .crm-button-type-cancel,
 .crm-container .crm-button-type-back {
   margin-left: 20px;
 }
 
+/* Reset WP backend min-height for buttons */
+
+.wp-core-ui .crm-container .button {
+  min-height: 0;
+}
+
 .crm-container a.button,
 .crm-container a.button:link,
 .crm-container a.button:visited,
-.crm-container input.crm-form-submit,
 .crm-container .ui-dialog-buttonset .ui-button,
-.crm-container input[type=button],
 .crm-container .crm-button {
   text-shadow: 0 1px 0 black;
   background: #696969;
@@ -1868,50 +1859,15 @@ input.crm-form-entityref {
   text-decoration: none;
   cursor: pointer;
   border: 1px solid #3e3e3e;
-}
-
-.crm-container span.crm-button {
-  display: block;
-  float: left !important;
-  overflow: hidden;
-  padding: 1px;
-}
-
-.crm-container button.crm-button {
-  padding: 3px 6px;
-}
-
-.crm-container button.crm-button .icon {
-  margin-bottom: -4px;
-}
-
-.crm-container input.crm-form-submit,
-.crm-container input[type=button] {
-  padding: 2px 6px;
-}
-
-.crm-container .crm-button input[type=button],
-.crm-container .crm-button input.crm-form-submit {
-  padding: 3px 5px 2px;
-  margin: 0;
-  background: none;
-  _background: #6C6C6C;
-  /* IE6 only */
-  border: none;
-}
-
-.crm-container a.button,
-.crm-container a.button:link,
-.crm-container a.button:visited {
   display: block;
   float: left;
+  overflow: hidden;
   line-height: 135%;
+  border-radius: 3px;
 }
 
 .crm-container .crm-button:hover,
 .crm-container .crm-button:focus,
-.crm-container input[type=submit]:hover,
-.crm-container input[type=button]:hover,
 .crm-container .ui-dialog-buttonset .ui-button:hover,
 .crm-container .ui-dialog-buttonset .ui-button:focus,
 .crm-container a.button:hover,
@@ -1922,28 +1878,24 @@ input.crm-form-entityref {
 .crm-container .crm-button-disabled,
 .crm-container .crm-button.crm-button-disabled,
 .crm-container .ui-dialog-buttonset .ui-button[disabled],
-.crm-container input.crm-form-submit[disabled],
-.crm-container input[type=button][disabled],
 .crm-container .crm-button[disabled] {
   opacity: .6;
   cursor: default;
 }
 
-.crm-container .crm-button-disabled input[disabled] {
-  opacity: 1;
-}
-
 .crm-container .ui-dialog-buttonpane {
   background: linear-gradient(to bottom, #f2f2f2 0%,#ffffff 35%);
 }
 
-.crm-container .ui-dialog-buttonset .ui-button {
-  padding: 0;
-}
 .crm-container .ui-dialog-buttonset .ui-button .ui-icon {
   background-image: url("../i/icons/jquery-ui-FFFFFF.png");
 }
 
+/* Override of a line in crm-i.css that may not be important anymore */
+.crm-container .ui-dialog-buttonset .ui-button .ui-icon[class*=" fa-"] {
+  margin-top: 0;
+}
+
 /* No crm-button styling for PayPal Express buttons */
 .crm-container input#_qf_Register_upload_express,
 .crm-container input#_qf_Payment_upload_express,
@@ -2046,31 +1998,6 @@ input.crm-form-entityref {
   margin-left: 3px;
 }
 
-.crm-container .crm-button.crm-icon-button {
-  padding: 2px 2px 1px 4px;
-}
-
-.crm-container .crm-button.crm-icon-button input {
-  padding-left: 18px;
-}
-
-.crm-container .crm-button.button-crm-i {
-  padding: 2px 0 1px 5px;
-}
-
-.crm-container .crm-button.button-crm-i input {
-  padding-left: 0;
-}
-
-.crm-container .crm-button-icon {
-  background-image: url("../i/icons/jquery-ui-FFFFFF.png");
-  height: 16px;
-  width: 16px;
-  display: block;
-  position: absolute;
-  pointer-events: none;
-}
-
 .crm-container .delete-icon {
   background-position: -176px -96px;
 }
@@ -2117,22 +2044,6 @@ a.crm-i:hover {
   color: #86c661;
 }
 
-.crm-i-button {
-  position: relative;
-}
-
-.crm-i-button>.crm-i {
-  position: absolute;
-  pointer-events: none;
-  top: .4em;
-  left: .4em;
-}
-
-.crm-container .crm-button.crm-i-button input[type="button"],
-.crm-container .crm-button.crm-i-button input.crm-form-submit {
-  padding-left: 1.6em;
-}
-
 .crm-container a.helpicon {
   opacity: .8;
 }
@@ -2928,15 +2839,6 @@ tbody.scrollContent tr.alternateRow {
 }
 
 /* rounded corners */
-.crm-container .crm-button,
-.crm-container a.button,
-.crm-container a.button:link,
-.crm-container input.crm-form-submit,
-.crm-container input[type=button] {
-  border-radius: 3px;
-}
-
-
 .crm-container div.status,
 .crm-container #help,
 .crm-container .help,
diff --git a/civicrm/css/joomla.css b/civicrm/css/joomla.css
index a59b3a047ad519e61792ace10a87973f8d8c2cdd..80b9ad96f05343d1ffd645ef1df7724bbb6ac61f 100644
--- a/civicrm/css/joomla.css
+++ b/civicrm/css/joomla.css
@@ -352,7 +352,7 @@ div#toolbar-box, div#toolbar-box div.m{
 .crm-container input {
   height: auto;
 }
-.crm-container input[type=submit] {
+.crm-container button[type=submit] {
   height: auto;
 }
 
@@ -377,7 +377,7 @@ div#toolbar-box, div#toolbar-box div.m{
 }
 
 /* Remove Joomla subhead toolbar & whitespace border */
-	
+
 body.admin.com_civicrm .subhead-collapse {
 	display:none;
 }
diff --git a/civicrm/ext/afform/LICENSE.txt b/civicrm/ext/afform/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1cb1cd35cefe6d61c06a35ab9180c448f473002c
--- /dev/null
+++ b/civicrm/ext/afform/LICENSE.txt
@@ -0,0 +1,667 @@
+Package: org.civicrm.afform
+Copyright (C) 2018, CiviCRM LLC <info@civicrm.org>
+Licensed under the GNU Affero Public License 3.0 (below).
+
+-------------------------------------------------------------------------------
+
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/civicrm/ext/afform/README.md b/civicrm/ext/afform/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..97e890ad787b4905f9ba2de67767bab0c1e0b7e7
--- /dev/null
+++ b/civicrm/ext/afform/README.md
@@ -0,0 +1,62 @@
+# org.civicrm.afform (Early Proof of Concept)
+
+> You are looking at the `master` branch of a proof-of-concept module.  It
+> may change radically (without full curation of docs, etc).  For previous
+> iterations with more stable/cogent materials, check other branches (e.g.
+> `0.1`).
+
+![Screenshot](docs/sandbox/3-Free-Blocks-Parent.png)
+
+The Affable Administrative Angular Form Framework (`afform`) is a system for administering AngularJS-based forms
+in CiviCRM which:
+
+1. Allows developers to declaratively define a canonical, baseline form using AngularJS.
+2. Allows administrators (or administrative GUI tools) to use the CRUD API to customize the forms.
+3. Allows developers (or administrators/tools) to embed these forms in other CiviCRM-AngularJS apps.
+4. Allows developers to apply change-sets via hook. (*WIP; pending upstream support*)
+
+This extension is a proof-of-concept.  It aims to demonstrate the core model/concept -- however, there are 
+[known issues and additional components](docs/roadmap.md) to address, and some documentation will be easier to approach
+if you already have a basic understanding of CiviCRM API and AngularJS.  It is licensed under [AGPL-3.0](LICENSE.txt).
+
+## Requirements
+
+* PHP v7.0+
+* CiviCRM v5.22+
+
+<!--
+## Installation (Web UI)
+
+This extension has not yet been published for installation via the web UI.
+
+## Installation (CLI, Zip)
+
+Sysadmins and developers may download the `.zip` file for this extension and
+install it with the command-line tool [cv](https://github.com/civicrm/cv).
+
+```bash
+cd <extension-dir>
+cv dl org.civicrm.afform@https://github.com/totten/afform/archive/master.zip
+```
+-->
+
+## Installation (CLI, Git)
+
+Sysadmins and developers may clone the [Git](https://en.wikipedia.org/wiki/Git) repo for this extension and
+install it with the command-line tool [cv](https://github.com/civicrm/cv).
+
+```bash
+git clone https://lab.civicrm.org/extensions/afform.git
+cv en afform
+```
+
+## Developer Documentation
+
+* [Quick Start: Creating the canonical definition of a basic form](docs/quickstart.md)
+* [Writing Forms: Afform as basic AngularJS templates](docs/writing.md) (With example: *Contact Record*)
+* [Embedding Forms: Afform as reusable building-block](docs/embed.md) (With example: *Contact Record*)
+* [Form CRUD: Updating forms via programmatic API](docs/crud.md)
+* [Form Hooks: Updating forms via declarative selector](docs/alter.md) (*WIP; pending upstream support*)
+* [Full AngularJS: Integrating between Afform and vanilla AngularJS](docs/angular.md)
+* [Roadmap and Known Issues](docs/roadmap.md)
+* [Philosophy, Beliefs, Assumptions](docs/philosophy.md)
diff --git a/civicrm/ext/afform/auditor/backlog.md b/civicrm/ext/afform/auditor/backlog.md
new file mode 100644
index 0000000000000000000000000000000000000000..c5230b4150e9b48a2c1dfedff1bbe0b30fd07ae8
--- /dev/null
+++ b/civicrm/ext/afform/auditor/backlog.md
@@ -0,0 +1,20 @@
+# Afform Auditor Backlog
+
+The general design of validation mechanism is being discussed in https://github.com/totten/afform/issues/20
+
+For the moment, it's good to keep some notes on specific issues for the
+validator to catch. Loosely/informally:
+
+* HTML partials should be well-formed/parseable XML
+* Warnings about any unrecognized tags/attributes/classes.
+* `<af-form>`, `<af-entity>`, `<af-fieldset>`, `<af-field>` should have suitable relationships.
+* `<af-entity>` should reference legit entities.
+* `<af-field>` should reference legit fields.
+    * Future consideration: how to validate when it's part of a subform?
+* `<af-fieldset>` should reference a declared model.
+* `<af-field defn="...">` should contain an object.
+* `<a>` should have `href` or `ng-click` or `af-api4-action`
+* Accept a restricted subset of HTML (e.g. `p h1 h2 h3` but not `script` or `[onclick]`)
+* Accept a restricted subset of BootstrapCSS
+* Accept a restricted subset of Angular HTML
+* Accept directives created via Afform
diff --git a/civicrm/ext/afform/bin/test-all.sh b/civicrm/ext/afform/bin/test-all.sh
new file mode 100755
index 0000000000000000000000000000000000000000..fdb01887e11b06adfa2c050c08887021ae0d7b3f
--- /dev/null
+++ b/civicrm/ext/afform/bin/test-all.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+## Run all afform-related tests
+##
+## Usage: ./bin/test-all.sh
+
+set -e
+EXIT=0
+
+cv en afform afform_mock
+AFF_CORE=$(cv path -x afform)
+AFF_MOCK=$(cv path -x afform_mock)
+
+pushd "$AFF_CORE" >> /dev/null
+  if ! phpunit6 "$@" ; then
+    EXIT=1
+  fi
+popd >> /dev/null
+
+pushd "$AFF_MOCK" >> /dev/null
+  if ! phpunit6 --group e2e "$@" ; then
+    EXIT=1
+  fi
+popd >> /dev/null
+
+pushd "$AFF_MOCK" >> /dev/null
+  if ! phpunit6 --group headless "$@" ; then
+    EXIT=1
+  fi
+popd >> /dev/null
+
+exit "$EXIT"
diff --git a/civicrm/ext/afform/core/CRM/Afform/AfformScanner.php b/civicrm/ext/afform/core/CRM/Afform/AfformScanner.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ee84cbda433a2676ed8e1a80c5f849803ead7e4
--- /dev/null
+++ b/civicrm/ext/afform/core/CRM/Afform/AfformScanner.php
@@ -0,0 +1,243 @@
+<?php
+
+/**
+ * Class CRM_Afform_AfformScanner
+ *
+ * The AfformScanner searches the extensions and `civicrm.files` for subfolders
+ * named `afform`. Each item in there is interpreted as a form instance.
+ *
+ * To reduce file-scanning, we keep a cache of file paths.
+ */
+class CRM_Afform_AfformScanner {
+
+  const METADATA_FILE = 'aff.json';
+
+  const LAYOUT_FILE = 'aff.html';
+
+  const FILE_REGEXP = '/\.aff\.(json|html)$/';
+
+  const DEFAULT_REQUIRES = 'afCore';
+
+  /**
+   * @var CRM_Utils_Cache_Interface
+   */
+  protected $cache;
+
+  /**
+   * CRM_Afform_AfformScanner constructor.
+   */
+  public function __construct() {
+    $this->cache = Civi::cache('long');
+  }
+
+  /**
+   * Get a list of all forms and their file paths.
+   *
+   * @return array
+   *   Ex: ['view-individual' => ['/var/www/foo/afform/view-individual']]
+   */
+  public function findFilePaths() {
+    if (!CRM_Core_Config::singleton()->debug) {
+      // FIXME: Use a separate setting. Maybe use the asset-builder cache setting?
+      $paths = $this->cache->get('afformAllPaths');
+      if ($paths !== NULL) {
+        return $paths;
+      }
+    }
+
+    $paths = [];
+
+    $mapper = CRM_Extension_System::singleton()->getMapper();
+    foreach ($mapper->getModules() as $module) {
+      /** @var $module CRM_Core_Module */
+      try {
+        if ($module->is_active) {
+          $this->appendFilePaths($paths, dirname($mapper->keyToPath($module->name)) . DIRECTORY_SEPARATOR . 'ang', 20);
+        }
+      }
+      catch (CRM_Extension_Exception_MissingException $e) {
+        // If the extension is missing skip & continue.
+      }
+    }
+
+    $this->appendFilePaths($paths, $this->getSiteLocalPath(), 10);
+
+    $this->cache->set('afformAllPaths', $paths);
+    return $paths;
+  }
+
+  /**
+   * Get the full path to the given file.
+   *
+   * @param string $formName
+   *   Ex: 'view-individual'
+   * @param string $suffix
+   *   Ex: 'aff.json'
+   * @return string|NULL
+   *   Ex: '/var/www/sites/default/files/civicrm/afform/view-individual.aff.json'
+   */
+  public function findFilePath($formName, $suffix) {
+    $paths = $this->findFilePaths();
+
+    if (isset($paths[$formName])) {
+      foreach ($paths[$formName] as $path) {
+        if (file_exists($path . '.' . $suffix)) {
+          return $path . '.' . $suffix;
+        }
+      }
+    }
+
+    return NULL;
+  }
+
+  /**
+   * Determine the path where we can write our own customized/overriden
+   * version of a file.
+   *
+   * @param string $formName
+   *   Ex: 'view-individual'
+   * @param string $file
+   *   Ex: 'aff.json'
+   * @return string|NULL
+   *   Ex: '/var/www/sites/default/files/civicrm/afform/view-individual.aff.json'
+   */
+  public function createSiteLocalPath($formName, $file) {
+    return $this->getSiteLocalPath() . DIRECTORY_SEPARATOR . $formName . '.' . $file;
+  }
+
+  public function clear() {
+    $this->cache->delete('afformAllPaths');
+  }
+
+  /**
+   * Get the effective metadata for a form.
+   *
+   * @param string $name
+   *   Ex: 'view-individual'
+   * @return array
+   *   An array with some mix of the following keys: name, title, description, server_route, requires, is_public.
+   *   NOTE: This is only data available in *.aff.json. It does *NOT* include layout.
+   *   Ex: [
+   *     'name' => 'view-individual',
+   *     'title' => 'View an individual contact',
+   *     'server_route' => 'civicrm/view-individual',
+   *     'requires' => ['afform'],
+   *   ]
+   */
+  public function getMeta($name) {
+    // FIXME error checking
+
+    $defaults = [
+      'name' => $name,
+      'requires' => [],
+      'title' => '',
+      'description' => '',
+      'is_public' => FALSE,
+      'permission' => 'access CiviCRM',
+    ];
+
+    $metaFile = $this->findFilePath($name, self::METADATA_FILE);
+    if ($metaFile !== NULL) {
+      return array_merge($defaults, json_decode(file_get_contents($metaFile), 1));
+    }
+    elseif ($this->findFilePath($name, self::LAYOUT_FILE)) {
+      return $defaults;
+    }
+    else {
+      return NULL;
+    }
+  }
+
+  /**
+   * Adds has_local & has_base to an afform metadata record
+   *
+   * @param array $record
+   */
+  public function addComputedFields(&$record) {
+    $name = $record['name'];
+    // Ex: $allPaths['viewIndividual'][0] == '/var/www/foo/afform/view-individual'].
+    $allPaths = $this->findFilePaths()[$name];
+    // $activeLayoutPath = $this->findFilePath($name, self::LAYOUT_FILE);
+    // $activeMetaPath = $this->findFilePath($name, self::METADATA_FILE);
+    $localLayoutPath = $this->createSiteLocalPath($name, self::LAYOUT_FILE);
+    $localMetaPath = $this->createSiteLocalPath($name, self::METADATA_FILE);
+
+    $record['has_local'] = file_exists($localLayoutPath) || file_exists($localMetaPath);
+    if (!isset($record['has_base'])) {
+      $record['has_base'] = ($record['has_local'] && count($allPaths) > 1)
+        || (!$record['has_local'] && count($allPaths) > 0);
+    }
+  }
+
+  /**
+   * @param string $formName
+   *   Ex: 'view-individual'
+   * @return string|NULL
+   *   Ex: '<em>Hello world!</em>'
+   *   NULL if no layout exists
+   */
+  public function getLayout($formName) {
+    $filePath = $this->findFilePath($formName, self::LAYOUT_FILE);
+    return $filePath === NULL ? NULL : file_get_contents($filePath);
+  }
+
+  /**
+   * Get the effective metadata for all forms.
+   *
+   * @return array
+   *   A list of all forms, keyed by form name.
+   *   NOTE: This is only data available in *.aff.json. It does *NOT* include layout.
+   *   Ex: ['view-individual' => ['title' => 'View an individual contact', ...]]
+   */
+  public function getMetas() {
+    $result = [];
+    foreach (array_keys($this->findFilePaths()) as $name) {
+      $result[$name] = $this->getMeta($name);
+    }
+    return $result;
+  }
+
+  /**
+   * @param array $formPaths
+   *   List of all form paths.
+   *   Ex: ['foo' => [0 => '/var/www/org.example.foobar/ang']]
+   * @param string $parent
+   *   Ex: '/var/www/org.example.foobar/afform/'
+   * @param int $priority
+   *   Lower priority files override higher priority files.
+   */
+  private function appendFilePaths(&$formPaths, $parent, $priority) {
+    $files = preg_grep(self::FILE_REGEXP, (array) glob("$parent/*"));
+
+    foreach ($files as $file) {
+      $fileBase = preg_replace(self::FILE_REGEXP, '', $file);
+      $name = basename($fileBase);
+      $formPaths[$name][$priority] = $fileBase;
+      ksort($formPaths[$name]);
+    }
+  }
+
+  /**
+   * Get the path where site-local form customizations are stored.
+   *
+   * @return mixed|string
+   *   Ex: '/var/www/sites/default/files/civicrm/afform'.
+   */
+  private function getSiteLocalPath() {
+    // TODO Allow a setting override.
+    // return Civi::paths()->getPath(Civi::settings()->get('afformPath'));
+    return Civi::paths()->getPath('[civicrm.files]/ang');
+  }
+
+  /**
+   * @return string
+   */
+  private function getMarkerRegexp() {
+    static $v;
+    if ($v === NULL) {
+      $v = '/\.(' . preg_quote(self::LAYOUT_FILE, '/') . '|' . preg_quote(self::METADATA_FILE, '/') . ')$/';
+    }
+    return $v;
+  }
+
+}
diff --git a/civicrm/ext/afform/core/CRM/Afform/ArrayHtml.php b/civicrm/ext/afform/core/CRM/Afform/ArrayHtml.php
new file mode 100644
index 0000000000000000000000000000000000000000..464363f5bf691174c3ac3ac0f92a521bbc71d063
--- /dev/null
+++ b/civicrm/ext/afform/core/CRM/Afform/ArrayHtml.php
@@ -0,0 +1,386 @@
+<?php
+
+/**
+ * Class CRM_Afform_ArrayHtml
+ *
+ * FIXME This a quick-and-dirty array<=>html mapping.
+ * FIXME: Comment mapping.
+ */
+class CRM_Afform_ArrayHtml {
+
+  const DEFAULT_TAG = 'div';
+
+  private $indent = -1;
+
+  /**
+   * This is a minimalist/temporary placeholder for a schema definition.
+   * FIXME: It shouldn't be here or look like this.
+   *
+   * @var array
+   *   Ex: $protoSchema['my-tag']['my-attr'] = 'text';
+   */
+  private $protoSchema = [
+    '*' => [
+      '*' => 'text',
+      'af-fieldset' => 'text',
+    ],
+    'af-entity' => [
+      '#selfClose' => TRUE,
+      'name' => 'text',
+      'type' => 'text',
+      'data' => 'js',
+    ],
+    'af-field' => [
+      '#selfClose' => TRUE,
+      'name' => 'text',
+      'defn' => 'js',
+    ],
+    'area' => ['#selfClose' => TRUE],
+    'base' => ['#selfClose' => TRUE],
+    'br' => ['#selfClose' => TRUE],
+    'col' => ['#selfClose' => TRUE],
+    'command' => ['#selfClose' => TRUE],
+    'embed' => ['#selfClose' => TRUE],
+    'hr' => ['#selfClose' => TRUE],
+    'iframe' => ['#selfClose' => TRUE],
+    'img' => ['#selfClose' => TRUE],
+    'input' => ['#selfClose' => TRUE],
+    'keygen' => ['#selfClose' => TRUE],
+    'link' => ['#selfClose' => TRUE],
+    'meta' => ['#selfClose' => TRUE],
+    'param' => ['#selfClose' => TRUE],
+    'source' => ['#selfClose' => TRUE],
+    'track' => ['#selfClose' => TRUE],
+    'wbr' => ['#selfClose' => TRUE],
+  ];
+
+  /**
+   * @var bool
+   */
+  protected $deepCoding;
+  /**
+   * @var bool
+   */
+  protected $formatWhitespace;
+
+  /**
+   * CRM_Afform_ArrayHtml constructor.
+   * @param bool $deepCoding
+   * @param bool $formatWhitespace
+   */
+  public function __construct($deepCoding = TRUE, $formatWhitespace = FALSE) {
+    $this->deepCoding = $deepCoding;
+    $this->formatWhitespace = $formatWhitespace;
+  }
+
+  /**
+   * @param array $array
+   *   Ex: ['#tag' => 'div', 'class' => 'greeting', '#children' => ['Hello world']]
+   * @return string
+   *   Ex: '<div class="greeting">Hello world</div>'
+   */
+  public function convertArrayToHtml(array $array) {
+    if ($array === []) {
+      return '';
+    }
+    $indent = $this->formatWhitespace ? str_repeat('  ', $this->indent) : '';
+    $end = $this->formatWhitespace ? "\n" : '';
+
+    if (isset($array['#comment'])) {
+      if (strpos($array['#comment'], '-->')) {
+        Civi::log()->warning('Afform: Cannot store comment with text "-->". Munging.');
+        $array['#comment'] = str_replace('-->', '-- >', $array['#comment']);
+      }
+      return $indent . sprintf('<!--%s-->', $array['#comment']) . $end;
+    }
+
+    if (isset($array['#text'])) {
+      return $array['#text'];
+    }
+
+    $tag = empty($array['#tag']) ? self::DEFAULT_TAG : $array['#tag'];
+    unset($array['#tag']);
+    $children = empty($array['#children']) ? [] : $array['#children'];
+    unset($array['#children']);
+
+    $buf = $indent . '<' . $tag;
+    foreach ($array as $attrName => $attrValue) {
+      if ($attrName{0} === '#') {
+        continue;
+      }
+      if (!preg_match('/^[a-zA-Z0-9\-]+$/', $attrName)) {
+        throw new \RuntimeException("Malformed HTML attribute");
+      }
+
+      $type = $this->pickAttrType($tag, $attrName);
+      $encodedValue = $this->encodeAttrValue($type, $attrValue);
+      if ($encodedValue !== NULL) {
+        // ENT_COMPAT: Will convert double-quotes and leave single-quotes alone.
+        $buf .= sprintf(" %s=\"%s\"", $attrName, htmlentities($encodedValue, ENT_COMPAT | ENT_XHTML));
+      }
+      else {
+        Civi::log()->warning('Afform: Cannot serialize attribute {attrName}', [
+          'attrName' => $attrName,
+        ]);
+      }
+    }
+
+    if (isset($array['#markup']) && (!$this->formatWhitespace || strpos($array['#markup'], '<') === FALSE)) {
+      $buf .= '>' . $array['#markup'] . '</' . $tag . '>';
+    }
+    elseif (isset($array['#markup'])) {
+      $indent2 = str_repeat('  ', $this->indent + 1);
+      $buf .= '>' . $end . $indent2 . str_replace("\n<", "\n$indent2<", $array['#markup']) . $end . $indent . '</' . $tag . '>';
+    }
+    elseif (empty($children) && $this->isSelfClosing($tag)) {
+      $buf .= ' />';
+    }
+    else {
+      $contents = $this->convertArraysToHtml($children);
+      // No indentation if contents are only text
+      if (!$this->formatWhitespace || strpos($contents, '<') === FALSE) {
+        $buf .= '>' . $contents;
+      }
+      else {
+        $buf .= '>' . $end;
+        $buf .= $contents . $indent;
+      }
+      $buf .= '</' . $tag . '>';
+    }
+    return $buf . $end;
+  }
+
+  /**
+   * Converts a subset of items into html markup
+   *
+   * @param array $children
+   * @return string html
+   */
+  public function convertArraysToHtml($children) {
+    $buf = '';
+    $this->indent++;
+
+    foreach ($children as $child) {
+      if (is_string($child)) {
+        $buf .= htmlentities($child);
+      }
+      elseif (is_array($child)) {
+        $buf .= $this->convertArrayToHtml($child);
+      }
+    }
+
+    $this->indent--;
+    return $buf;
+  }
+
+  /**
+   * Converts a full array of items into html markup
+   *
+   * @param array $tree
+   * @return string html
+   */
+  public function convertTreeToHtml($tree) {
+    $this->indent = -1;
+    return $this->replaceUnicodeChars($this->convertArraysToHtml($tree));
+  }
+
+  /**
+   * @param string $html
+   *   Ex: '<div class="greeting">Hello world</div>'
+   * @return array
+   *   Ex: ['#tag' => 'div', 'class' => 'greeting', '#children' => ['Hello world']]
+   */
+  public function convertHtmlToArray($html) {
+    if ($html === '') {
+      return [];
+    }
+
+    $doc = new DOMDocument();
+    $doc->preserveWhiteSpace = !$this->formatWhitespace;
+    @$doc->loadHTML("<?xml encoding=\"utf-8\" ?><html><body>$html</body></html>");
+
+    // FIXME: Validate expected number of child nodes
+
+    foreach ($doc->childNodes as $htmlNode) {
+      if ($htmlNode instanceof DOMElement && $htmlNode->tagName === 'html') {
+        return $this->convertNodesToArray($htmlNode->firstChild->childNodes);
+      }
+    }
+
+    return NULL;
+  }
+
+  /**
+   * @param \DOMNode $node
+   * @return array|string
+   */
+  public function convertNodeToArray($node) {
+    if ($node instanceof DOMElement) {
+      $arr = ['#tag' => $node->tagName];
+      foreach ($node->attributes as $attribute) {
+        $txt = $attribute->textContent;
+        $type = $this->pickAttrType($node->tagName, $attribute->name);
+        $arr[$attribute->name] = $this->decodeAttrValue($type, $txt);
+      }
+      if ($node->childNodes->length > 0) {
+        // In shallow mode, return markup as-is if node isn't supported by the gui editor
+        if (!$this->deepCoding && !$this->isNodeEditable($arr)) {
+          $arr['#markup'] = '';
+          foreach ($node->childNodes as $child) {
+            $arr['#markup'] .= $this->replaceUnicodeChars($child->ownerDocument->saveXML($child));
+          }
+        }
+        else {
+          $arr['#children'] = $this->convertNodesToArray($node->childNodes);
+        }
+      }
+      return $arr;
+    }
+    elseif ($node instanceof DOMText) {
+      return ['#text' => $this->replaceUnicodeChars($node->textContent)];
+    }
+    elseif ($node instanceof DOMComment) {
+      return ['#comment' => $node->nodeValue];
+    }
+    else {
+      throw new \RuntimeException("Unrecognized DOM node");
+    }
+  }
+
+  /**
+   * @param array|DOMNodeList $nodes
+   *   List of DOMNodes
+   * @return array
+   */
+  protected function convertNodesToArray($nodes) {
+    $children = [];
+    foreach ($nodes as $childNode) {
+      $childArray = $this->convertNodeToArray($childNode);
+      // Remove extra whitespace
+      if ($this->formatWhitespace && isset($childArray['#text'])) {
+        $childArray['#text'] = trim($childArray['#text']);
+      }
+      if (!isset($childArray['#text']) || strlen($childArray['#text'])) {
+        $children[] = $childArray;
+      }
+    }
+    return $children;
+  }
+
+  /**
+   * @param string $tag
+   *   Ex: 'img', 'div'
+   * @return bool
+   *   TRUE if the tag should look like '<img/>'.
+   *   FALSE if the tag should look like '<div></div>'.
+   */
+  protected function isSelfClosing($tag) {
+    return $this->protoSchema[$tag]['#selfClose'] ?? FALSE;
+  }
+
+  /**
+   * Determine the type of data that is stored in an attribute.
+   *
+   * @param string $tag
+   *   Ex: 'af-entity'
+   * @param string $attrName
+   *   Ex: 'label'
+   * @return string
+   *   Ex: 'text' or 'js'
+   */
+  protected function pickAttrType($tag, $attrName) {
+    if (!$this->deepCoding) {
+      return 'text';
+    }
+
+    return $this->protoSchema[$tag][$attrName] ?? $this->protoSchema['*'][$attrName] ?? $this->protoSchema['*']['*'];
+  }
+
+  /**
+   * Given an array (deep) representation of an attribute, determine the
+   * attribute's content.
+   *
+   * @param string $type
+   *   Ex A: 'text'
+   *   Ex B: 'js'
+   * @param mixed $mixedAttrValue
+   *   The mixed (string/array/int) representation of the value in deep format
+   *   Ex A: 'hello'
+   *   Ex B: ['hello' => 123]
+   * @return string
+   *   An equivalent HTML attribute content (text).
+   *   Ex A: 'hello'
+   *   Ex B: '{hello: 123}'
+   */
+  protected function encodeAttrValue($type, $mixedAttrValue) {
+    switch ($type) {
+      case 'text':
+        return $mixedAttrValue;
+
+      case 'js':
+        $v = CRM_Utils_JS::writeObject($mixedAttrValue, TRUE);
+        return $v;
+
+      default:
+        return NULL;
+    }
+  }
+
+  /**
+   * Given a string representation of an attribute value, determine the
+   * equivalent array (deep) representation.
+   *
+   * @param string $type
+   *   Ex A: 'text'
+   *   Ex B: 'js'
+   * @param string $txtAttrValue
+   *   The textual representation of the value from HTML notation.
+   *   Ex A: 'hello'
+   *   Ex B: '{hello: 123}'
+   * @return mixed
+   *   The mixed (string/array/int) rerepresentation of the value in deep format
+   *   Ex A: 'hello'
+   *   Ex B: ['hello' => 123]
+   */
+  protected function decodeAttrValue($type, $txtAttrValue) {
+    if ($type == 'js') {
+      $attrValue = CRM_Utils_JS::decode($txtAttrValue);
+      return $attrValue;
+    }
+    else {
+      $attrValue = $txtAttrValue;
+      return $attrValue;
+    }
+  }
+
+  /**
+   * Convert non-breaking space character to html notation.
+   *
+   * Makes html files easier to read.
+   *
+   * Note: This function does NOT convert all html entities (< to &lt;, etc.)
+   * as the input string is assumed to already be valid markup.
+   *
+   * @param string $markup - some html
+   * @return string
+   */
+  public function replaceUnicodeChars($markup) {
+    return mb_convert_encoding($markup, 'HTML-ENTITIES', 'UTF-8');
+  }
+
+  /**
+   * Determine if a node is recognized by the gui editor.
+   *
+   * @param array $item
+   * @return bool
+   */
+  public function isNodeEditable(array $item) {
+    if ($item['#tag'] === 'af-field' || $item['#tag'] === 'af-form' || isset($item['af-fieldset']) || isset($item['af-join'])) {
+      return TRUE;
+    }
+    $editableClasses = ['af-container', 'af-text', 'af-button'];
+    $classes = explode(' ', $item['class'] ?? '');
+    return (bool) array_intersect($editableClasses, $classes);
+  }
+
+}
diff --git a/civicrm/ext/afform/core/CRM/Afform/Page/AfformBase.php b/civicrm/ext/afform/core/CRM/Afform/Page/AfformBase.php
new file mode 100644
index 0000000000000000000000000000000000000000..540b16fe9426166eff0ad95ba42dfae8cd54fd51
--- /dev/null
+++ b/civicrm/ext/afform/core/CRM/Afform/Page/AfformBase.php
@@ -0,0 +1,38 @@
+<?php
+use CRM_Afform_ExtensionUtil as E;
+
+class CRM_Afform_Page_AfformBase extends CRM_Core_Page {
+
+  public function run() {
+    list ($pagePath, $pageArgs) = func_get_args();
+
+    $afform = civicrm_api4('Afform', 'get', [
+      'checkPermissions' => FALSE,
+      'where' => [['name', '=', $pageArgs['afform']]],
+      'select' => ['title', 'module_name', 'directive_name'],
+    ], 0);
+
+    $this->set('afModule', $afform['module_name']);
+
+    $loader = new \Civi\Angular\AngularLoader();
+    $loader->setModules([$afform['module_name'], 'afformStandalone']);
+    $loader->setPageName(implode('/', $pagePath));
+    $loader->getRes()->addSetting([
+      'afform' => [
+        'open' => $afform['directive_name'],
+      ],
+    ])
+      // TODO: Allow afforms to declare their own theming requirements
+      ->addBundle('bootstrap3');
+    $loader->load();
+
+    if (!empty($afform['title'])) {
+      $title = strip_tags($afform['title']);
+      CRM_Utils_System::setTitle($title);
+      CRM_Utils_System::appendBreadCrumb([['title' => $title, 'url' => CRM_Utils_System::url(implode('/', $pagePath), NULL, FALSE, '/')]]);
+    }
+
+    parent::run();
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Afform/AHQ.php b/civicrm/ext/afform/core/Civi/Afform/AHQ.php
new file mode 100644
index 0000000000000000000000000000000000000000..be7d91bd7dc75c68d752e24164ba1b7656a60275
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Afform/AHQ.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Civi\Afform;
+
+/**
+ * AHQ: ArrayHtml Query
+ *
+ * These are helper functions for searching/digesting a form presented in
+ * in ArrayHtml format (shallow or deep).
+ */
+class AHQ {
+
+  /**
+   * Given a list of would-be child nodes, combine them under a common root.
+   *
+   * @param array $children
+   * @param string $tag
+   * @return array
+   */
+  public static function makeRoot($children, $tag = 'placeholder') {
+    return [
+      '#tag' => $tag,
+      '#children' => $children,
+    ];
+  }
+
+  /**
+   * Returns all tags with a certain tag name, e.g. 'af-entity'
+   *
+   * @param array|string $element
+   *   The ArrayHtml representation of a document/fragment.
+   * @param string $tagName
+   * @return array
+   */
+  public static function getTags($element, $tagName) {
+    if (!is_array($element) || !isset($element['#tag'])) {
+      return [];
+    }
+    $results = [];
+    if ($element['#tag'] == $tagName) {
+      $results[] = self::getProps($element);
+    }
+    foreach ($element['#children'] ?? [] as $child) {
+      $results = array_merge($results, self::getTags($child, $tagName));
+    }
+    return $results;
+  }
+
+  /**
+   * Returns all the real properties of a collection,
+   * filtering out any array keys that start with a hashtag
+   *
+   * @param array|string $element
+   *   The ArrayHtml representation of a document/fragment.
+   * @return array
+   */
+  public static function getProps($element) {
+    return array_filter($element, function($key) {
+      return substr($key, 0, 1) !== '#';
+    }, ARRAY_FILTER_USE_KEY);
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Afform/Event/AfformSubmitEvent.php b/civicrm/ext/afform/core/Civi/Afform/Event/AfformSubmitEvent.php
new file mode 100644
index 0000000000000000000000000000000000000000..4eff408c40ebbfc33e1b7a878dcb44f8bcccc840
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Afform/Event/AfformSubmitEvent.php
@@ -0,0 +1,54 @@
+<?php
+namespace Civi\Afform\Event;
+
+use Symfony\Component\EventDispatcher\Event;
+
+/**
+ * Class AfformSubmitEvent
+ * @package Civi\Afform\Event
+ *
+ * Handle submission of an "<af-form>".
+ * Listeners ought to take any recognized items from `entityValues`, handle
+ * them, and remove them.
+ *
+ * NOTE: I'm on the fence about whether to expose the arrays or more targeted
+ * methods. For the moment, this is only expected to be used internally,
+ * so KISS.
+ */
+class AfformSubmitEvent extends Event {
+
+  /**
+   * @var array
+   *   List of definitions of the entities.
+   *   $entityDefns['spouse'] = ['type' => 'Individual'];
+   */
+  public $entityDefns;
+
+  /**
+   * @var array
+   *   List of submitted entities to save.
+   *   $entityValues['Contact']['spouse'] = ['first_name' => 'Optimus Prime'];
+   */
+  public $entityValues;
+
+  /**
+   * AfformSubmitEvent constructor.
+   * @param $entityDefns
+   * @param array $entityValues
+   */
+  public function __construct($entityDefns, array $entityValues) {
+    $this->entityDefns = $entityDefns;
+    $this->entityValues = $entityValues;
+  }
+
+  /**
+   * List of entity types which need processing.
+   *
+   * @return array
+   *   Ex: ['Contact', 'Activity']
+   */
+  public function getTypes() {
+    return array_keys($this->entityValues);
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Afform/FormDataModel.php b/civicrm/ext/afform/core/Civi/Afform/FormDataModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..fc89bb267f2bfb92075244dacd27d15a668def9d
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Afform/FormDataModel.php
@@ -0,0 +1,85 @@
+<?php
+
+namespace Civi\Afform;
+
+use Civi\Api4\Afform;
+
+/**
+ * Class FormDataModel
+ * @package Civi\Afform
+ *
+ * Examines a form and determines the entities, fields & joins in use.
+ */
+class FormDataModel {
+
+  /**
+   * @var array
+   *   Ex: $entities['spouse']['type'] = 'Contact';
+   */
+  protected $entities;
+
+  /**
+   * @var array
+   */
+  protected $blocks = [];
+
+  public function __construct($layout) {
+    $root = AHQ::makeRoot($layout);
+    $this->entities = array_column(AHQ::getTags($root, 'af-entity'), NULL, 'name');
+    foreach (array_keys($this->entities) as $entity) {
+      $this->entities[$entity]['fields'] = $this->entities[$entity]['joins'] = [];
+    }
+    // Pre-load full list of afforms in case this layout embeds other afform directives
+    $this->blocks = (array) Afform::get()->setCheckPermissions(FALSE)->setSelect(['name', 'directive_name'])->execute()->indexBy('directive_name');
+    $this->parseFields($layout);
+  }
+
+  /**
+   * @param array $nodes
+   * @param string $entity
+   * @param string $join
+   */
+  protected function parseFields($nodes, $entity = NULL, $join = NULL) {
+    foreach ($nodes as $node) {
+      if (!is_array($node) || !isset($node['#tag'])) {
+        continue;
+      }
+      elseif (!empty($node['af-fieldset']) && !empty($node['#children'])) {
+        $this->parseFields($node['#children'], $node['af-fieldset'], $join);
+      }
+      elseif ($entity && $node['#tag'] === 'af-field') {
+        if ($join) {
+          $this->entities[$entity]['joins'][$join]['fields'][$node['name']] = AHQ::getProps($node);
+        }
+        else {
+          $this->entities[$entity]['fields'][$node['name']] = AHQ::getProps($node);
+        }
+      }
+      elseif ($entity && !empty($node['af-join'])) {
+        $this->entities[$entity]['joins'][$node['af-join']] = AHQ::getProps($node);
+        $this->parseFields($node['#children'] ?? [], $entity, $node['af-join']);
+      }
+      elseif (!empty($node['#children'])) {
+        $this->parseFields($node['#children'], $entity, $join);
+      }
+      // Recurse into embedded blocks
+      if (isset($this->blocks[$node['#tag']])) {
+        if (!isset($this->blocks[$node['#tag']]['layout'])) {
+          $this->blocks[$node['#tag']] = Afform::get()->setCheckPermissions(FALSE)->setSelect(['name', 'layout'])->addWhere('name', '=', $this->blocks[$node['#tag']]['name'])->execute()->first();
+        }
+        if (!empty($this->blocks[$node['#tag']]['layout'])) {
+          $this->parseFields($this->blocks[$node['#tag']]['layout'], $entity, $join);
+        }
+      }
+    }
+  }
+
+  /**
+   * @return array
+   *   Ex: $entities['spouse']['type'] = 'Contact';
+   */
+  public function getEntities() {
+    return $this->entities;
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Afform/Symbols.php b/civicrm/ext/afform/core/Civi/Afform/Symbols.php
new file mode 100644
index 0000000000000000000000000000000000000000..521f1bfde113174a0c0f8c23a87b627adfa9d83c
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Afform/Symbols.php
@@ -0,0 +1,96 @@
+<?php
+namespace Civi\Afform;
+
+/**
+ * Class Symbols
+ * @package Civi\Afform
+ *
+ * This class repesents a list of key symbols used by an
+ * HTML document, such as element (tag) names, attribute
+ * names, and CSS class names.
+ */
+class Symbols {
+
+  /**
+   * @var array
+   *   Array(string $element => int $count).
+   */
+  public $elements = [];
+
+  /**
+   * @var array
+   *   Array(string $class => int $count).
+   */
+  public $classes = [];
+
+  /**
+   * @var array
+   *   Array(string $attr => int $count).
+   */
+  public $attributes = [];
+
+  /**
+   * @param string $html
+   * @return static
+   */
+  public static function scan($html) {
+    $symbols = new static();
+    $doc = new \DOMDocumentWrapper($html, 'text/html');
+    $symbols->scanNode($doc->root);
+    return $symbols;
+  }
+
+  protected function scanNode(\DOMNode $node) {
+    if ($node instanceof \DOMElement) {
+
+      self::increment($this->elements, $node->tagName);
+
+      foreach ($node->childNodes as $childNode) {
+        $this->scanNode($childNode);
+      }
+
+      foreach ($node->attributes as $attribute) {
+        $this->scanNode($attribute);
+      }
+    }
+
+    elseif ($node instanceof \DOMAttr) {
+      self::increment($this->attributes, $node->nodeName);
+
+      if ($node->nodeName === 'class') {
+        $classes = $this->parseClasses($node->nodeValue);
+        foreach ($classes as $class) {
+          self::increment($this->classes, $class);
+        }
+      }
+    }
+  }
+
+  /**
+   * @param string $expr
+   *   Ex: 'crm-icon fa-mail'
+   * @return array
+   *   Ex: ['crm-icon', 'fa-mail']
+   */
+  protected function parseClasses($expr) {
+    if ($expr === '' || $expr === NULL || $expr === FALSE) {
+      return [];
+    }
+    if (strpos($expr, '{{') === FALSE) {
+      return explode(' ', $expr);
+    }
+    if (preg_match_all(';([a-zA-Z\-_]+|\{\{.*\}\}) ;U', "$expr ", $m)) {
+      return $m[1];
+    }
+    error_log("Failed to parse CSS classes: $expr");
+    return [];
+  }
+
+  private static function increment(&$arr, $key) {
+    if (!isset($arr[$key])) {
+      $arr[$key] = 0;
+    }
+    $arr[$key]++;
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php
new file mode 100644
index 0000000000000000000000000000000000000000..baa12b91e5a4be63da94d16c78ada16c13d99548
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/AbstractProcessor.php
@@ -0,0 +1,115 @@
+<?php
+
+namespace Civi\Api4\Action\Afform;
+
+use Civi\Afform\FormDataModel;
+use Civi\Api4\Generic\Result;
+
+/**
+ * Shared functionality for form submission processing.
+ * @package Civi\Api4\Action\Afform
+ */
+abstract class AbstractProcessor extends \Civi\Api4\Generic\AbstractAction {
+
+  /**
+   * Form name
+   * @var string
+   * @required
+   */
+  protected $name;
+
+  /**
+   * Arguments present when loading the form
+   * @var array
+   */
+  protected $args;
+
+  protected $_afform;
+
+  /**
+   * @var \Civi\Afform\FormDataModel
+   *   List of entities declared by this form.
+   */
+  protected $_formDataModel;
+
+  /**
+   * @param \Civi\Api4\Generic\Result $result
+   * @throws \API_Exception
+   */
+  public function _run(Result $result) {
+    // This will throw an exception if the form doesn't exist
+    $this->_afform = (array) civicrm_api4('Afform', 'get', ['checkPermissions' => FALSE, 'where' => [['name', '=', $this->name]]], 0);
+    if ($this->getCheckPermissions()) {
+      if (!\CRM_Core_Permission::check("@afform:" . $this->_afform['name'])) {
+        throw new \Civi\API\Exception\UnauthorizedException("Authorization failed: Cannot process form " . $this->_afform['name']);
+      }
+    }
+
+    $this->_formDataModel = new FormDataModel($this->_afform['layout']);
+    $this->validateArgs();
+    $result->exchangeArray($this->processForm());
+  }
+
+  /**
+   * Strip out arguments that are not allowed on this form
+   */
+  protected function validateArgs() {
+    $rawArgs = $this->args;
+    $entities = $this->_formDataModel->getEntities();
+    $this->args = [];
+    foreach ($rawArgs as $arg => $val) {
+      if (!empty($entities[$arg]['url-autofill'])) {
+        $this->args[$arg] = $val;
+      }
+    }
+  }
+
+  /**
+   * @return array
+   */
+  abstract protected function processForm();
+
+  /**
+   * @param $mainEntityName
+   * @param $joinEntityName
+   * @param $mainEntityId
+   * @return array
+   * @throws \API_Exception
+   */
+  protected static function getJoinWhereClause($mainEntityName, $joinEntityName, $mainEntityId) {
+    $params = [];
+    if (self::fieldExists($joinEntityName, 'entity_id')) {
+      $params[] = ['entity_id', '=', $mainEntityId];
+      if (self::fieldExists($joinEntityName, 'entity_table')) {
+        $params[] = ['entity_table', '=', 'civicrm_' . _civicrm_api_get_entity_name_from_camel($mainEntityName)];
+      }
+    }
+    else {
+      $mainEntityField = _civicrm_api_get_entity_name_from_camel($mainEntityName) . '_id';
+      $params[] = [$mainEntityField, '=', $mainEntityId];
+    }
+    return $params;
+  }
+
+  /**
+   * Check if a field exists for a given entity
+   *
+   * @param $entityName
+   * @param $fieldName
+   * @return bool
+   * @throws \API_Exception
+   */
+  public static function fieldExists($entityName, $fieldName) {
+    if (empty(\Civi::$statics[__CLASS__][__FUNCTION__][$entityName])) {
+      $fields = civicrm_api4($entityName, 'getFields', [
+        'checkPermissions' => FALSE,
+        'action' => 'create',
+        'select' => ['name'],
+        'includeCustom' => FALSE,
+      ]);
+      \Civi::$statics[__CLASS__][__FUNCTION__][$entityName] = $fields->column('name');
+    }
+    return in_array($fieldName, \Civi::$statics[__CLASS__][__FUNCTION__][$entityName]);
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Create.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Create.php
new file mode 100644
index 0000000000000000000000000000000000000000..30729f6eaff69f1f63a99785a370ceaa25edb92b
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Create.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Civi\Api4\Action\Afform;
+
+/**
+ * @inheritDoc
+ * @package Civi\Api4\Action\Afform
+ */
+class Create extends \Civi\Api4\Generic\BasicCreateAction {
+
+  use \Civi\Api4\Utils\AfformSaveTrait;
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Get.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Get.php
new file mode 100644
index 0000000000000000000000000000000000000000..5923017e2a2c96a22c5df9bee4c8e7f0ff20a463
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Get.php
@@ -0,0 +1,136 @@
+<?php
+
+namespace Civi\Api4\Action\Afform;
+
+use Civi\Api4\CustomField;
+use Civi\Api4\CustomGroup;
+
+/**
+ * @inheritDoc
+ * @package Civi\Api4\Action\Afform
+ */
+class Get extends \Civi\Api4\Generic\BasicGetAction {
+
+  use \Civi\Api4\Utils\AfformFormatTrait;
+
+  public function getRecords() {
+    /** @var \CRM_Afform_AfformScanner $scanner */
+    $scanner = \Civi::service('afform_scanner');
+    $getComputed = $this->_isFieldSelected('has_local') || $this->_isFieldSelected('has_base');
+    $getLayout = $this->_isFieldSelected('layout');
+
+    // This helps optimize lookups by file/module/directive name
+    $toGet = array_filter([
+      'name' => $this->_itemsToGet('name'),
+      'module_name' => $this->_itemsToGet('module_name'),
+      'directive_name' => $this->_itemsToGet('directive_name'),
+    ]);
+
+    $names = $toGet['name'] ?? array_keys($scanner->findFilePaths());
+
+    $values = $this->getAutoGenerated($names, $toGet, $getLayout);
+
+    foreach ($names as $name) {
+      $info = [
+        'name' => $name,
+        'module_name' => _afform_angular_module_name($name, 'camel'),
+        'directive_name' => _afform_angular_module_name($name, 'dash'),
+      ];
+      foreach ($toGet as $key => $get) {
+        if (!in_array($info[$key], $get)) {
+          continue;
+        }
+      }
+      $record = $scanner->getMeta($name);
+      if (!$record && !isset($values[$name])) {
+        continue;
+      }
+      $values[$name] = array_merge($values[$name] ?? [], $record ?? [], $info);
+      if ($getComputed) {
+        $scanner->addComputedFields($values[$name]);
+      }
+      if ($getLayout) {
+        $values[$name]['layout'] = $scanner->getLayout($name) ?? $values[$name]['layout'] ?? '';
+      }
+    }
+
+    if ($getLayout && $this->layoutFormat !== 'html') {
+      foreach ($values as $name => $record) {
+        $values[$name]['layout'] = $this->convertHtmlToOutput($record['layout']);
+      }
+    }
+
+    return $values;
+  }
+
+  /**
+   * Generates afform blocks from custom field sets.
+   *
+   * @param $names
+   * @param $toGet
+   * @param $getLayout
+   * @return array
+   * @throws \API_Exception
+   */
+  protected function getAutoGenerated(&$names, $toGet, $getLayout) {
+    $values = $groupNames = [];
+    foreach ($toGet['name'] ?? [] as $name) {
+      if (strpos($name, 'afjoinCustom_') === 0 && strlen($name) > 13) {
+        $groupNames[] = substr($name, 13);
+      }
+    }
+    // Early return if this api call is fetching afforms by name and those names are not custom-related
+    if ((!empty($toGet['name']) && !$groupNames)
+      || (!empty($toGet['module_name']) && !strstr(implode(' ', $toGet['module_name']), 'afjoinCustom'))
+      || (!empty($toGet['directive_name']) && !strstr(implode(' ', $toGet['directive_name']), 'afjoin-custom'))
+    ) {
+      return $values;
+    }
+    $customApi = CustomGroup::get()
+      ->setCheckPermissions(FALSE)
+      ->setSelect(['name', 'title', 'help_pre', 'help_post'])
+      ->addWhere('is_multiple', '=', 1)
+      ->addWhere('is_active', '=', 1);
+    if ($groupNames) {
+      $customApi->addWhere('name', 'IN', $groupNames);
+    }
+    if ($getLayout) {
+      $customApi->addSelect('help_pre')->addSelect('help_post');
+      $customApi->addChain('fields', CustomField::get()
+        ->setCheckPermissions(FALSE)
+        ->addSelect('name')
+        ->addWhere('custom_group_id', '=', '$id')
+        ->addWhere('is_active', '=', 1)
+        ->addOrderBy('weight', 'ASC')
+      );
+    }
+    foreach ($customApi->execute() as $custom) {
+      $name = 'afjoinCustom_' . $custom['name'];
+      if (!in_array($name, $names)) {
+        $names[] = $name;
+      }
+      $item = [
+        'name' => $name,
+        'requires' => [],
+        'title' => ts('%1 block (default)', [1 => $custom['title']]),
+        'description' => '',
+        'is_public' => FALSE,
+        'permission' => 'access CiviCRM',
+        'join' => 'Custom_' . $custom['name'],
+        'extends' => 'Contact',
+        'repeat' => TRUE,
+        'has_base' => TRUE,
+      ];
+      if ($getLayout) {
+        $item['layout'] = ($custom['help_pre'] ? '<div class="af-markup">' . $custom['help_pre'] . "</div>\n" : '');
+        foreach ($custom['fields'] as $field) {
+          $item['layout'] .= "<af-field name=\"{$field['name']}\" />\n";
+        }
+        $item['layout'] .= ($custom['help_post'] ? '<div class="af-markup">' . $custom['help_post'] . "</div>\n" : '');
+      }
+      $values[$name] = $item;
+    }
+    return $values;
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Prefill.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Prefill.php
new file mode 100644
index 0000000000000000000000000000000000000000..e4b93be85f42960a6038d5667c30db3d087600aa
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Prefill.php
@@ -0,0 +1,86 @@
+<?php
+
+namespace Civi\Api4\Action\Afform;
+
+/**
+ * Class Prefill
+ * @package Civi\Api4\Action\Afform
+ */
+class Prefill extends AbstractProcessor {
+
+  protected $_data = [];
+
+  protected function processForm() {
+    foreach ($this->_formDataModel->getEntities() as $entityName => $entity) {
+      // Load entities from args
+      if (!empty($this->args[$entityName])) {
+        $this->loadEntity($entity, $this->args[$entityName]);
+      }
+      // Load entities from autofill settings
+      elseif (!empty($entity['autofill'])) {
+        $this->autofillEntity($entity, $entity['autofill']);
+      }
+    }
+    $data = [];
+    foreach ($this->_data as $name => $values) {
+      $data[] = ['name' => $name, 'values' => $values];
+    }
+    return $data;
+  }
+
+  /**
+   * Fetch all data needed to display a given entity on this form
+   *
+   * @param $entity
+   * @param $id
+   * @throws \API_Exception
+   */
+  private function loadEntity($entity, $id) {
+    $checkPermissions = TRUE;
+    if ($entity['type'] == 'Contact' && !empty($this->args[$entity['name'] . '-cs'])) {
+      $checkSum = civicrm_api4('Contact', 'validateChecksum', [
+        'checksum' => $this->args[$entity['name'] . '-cs'],
+        'contactId' => $id,
+      ]);
+      $checkPermissions = empty($checkSum[0]['valid']);
+    }
+    $result = civicrm_api4($entity['type'], 'get', [
+      'where' => [['id', '=', $id]],
+      'select' => array_keys($entity['fields']),
+      'checkPermissions' => $checkPermissions,
+    ]);
+    foreach ($result as $item) {
+      $data = ['fields' => $item];
+      foreach ($entity['joins'] ?? [] as $joinEntity => $join) {
+        $data['joins'][$joinEntity] = (array) civicrm_api4($joinEntity, 'get', [
+          'where' => self::getJoinWhereClause($entity['type'], $joinEntity, $item['id']),
+          'limit' => !empty($join['af-repeat']) ? $join['max'] ?? 0 : 1,
+          'select' => array_keys($join['fields']),
+          'checkPermissions' => $checkPermissions,
+          'orderBy' => self::fieldExists($joinEntity, 'is_primary') ? ['is_primary' => 'DESC'] : [],
+        ]);
+      }
+      $this->_data[$entity['name']][] = $data;
+    }
+  }
+
+  /**
+   * Fetch an entity based on its autofill settings
+   *
+   * @param $entity
+   * @param $mode
+   * @throws \API_Exception
+   */
+  private function autoFillEntity($entity, $mode) {
+    $id = NULL;
+    if ($entity['type'] == 'Contact') {
+      if ($mode == 'user') {
+        $id = \CRM_Core_Session::getLoggedInContactID();
+      }
+    }
+    if ($id) {
+      $this->loadEntity($entity, $id);
+    }
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Save.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Save.php
new file mode 100644
index 0000000000000000000000000000000000000000..a3b683b08ac7f59ac519d36a69054843c040ac84
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Save.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Civi\Api4\Action\Afform;
+
+/**
+ * @inheritDoc
+ * @package Civi\Api4\Action\Afform
+ */
+class Save extends \Civi\Api4\Generic\BasicSaveAction {
+
+  use \Civi\Api4\Utils\AfformSaveTrait;
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php
new file mode 100644
index 0000000000000000000000000000000000000000..54a36f49d132ad2aaaff3add119f8a05e041fc4d
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Submit.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace Civi\Api4\Action\Afform;
+
+use Civi\Afform\Event\AfformSubmitEvent;
+
+/**
+ * Class Submit
+ * @package Civi\Api4\Action\Afform
+ */
+class Submit extends AbstractProcessor {
+
+  const EVENT_NAME = 'civi.afform.submit';
+
+  /**
+   * Submitted values
+   * @var array
+   * @required
+   */
+  protected $values;
+
+  protected function processForm() {
+    $entityValues = [];
+    foreach ($this->_formDataModel->getEntities() as $entityName => $entity) {
+      foreach ($this->values[$entityName] ?? [] as $values) {
+        $entityValues[$entity['type']][$entityName][] = $values + ['fields' => []];
+        // Predetermined values override submitted values
+        if (!empty($entity['af-values'])) {
+          foreach ($entityValues[$entity['type']][$entityName] as $index => $vals) {
+            $entityValues[$entity['type']][$entityName][$index]['fields'] = $entity['af-values'] + $vals['fields'];
+          }
+        }
+      }
+    }
+
+    $event = new AfformSubmitEvent($this->_formDataModel->getEntities(), $entityValues);
+    \Civi::dispatcher()->dispatch(self::EVENT_NAME, $event);
+    foreach ($event->entityValues as $entityType => $entities) {
+      if (!empty($entities)) {
+        throw new \API_Exception(sprintf("Failed to process entities (type=%s; name=%s)", $entityType, implode(',', array_keys($entities))));
+      }
+    }
+
+    // What should I return?
+    return [];
+  }
+
+  /**
+   * @param \Civi\Afform\Event\AfformSubmitEvent $event
+   * @throws \API_Exception
+   * @see afform_civicrm_config
+   */
+  public static function processContacts(AfformSubmitEvent $event) {
+    foreach ($event->entityValues['Contact'] ?? [] as $entityName => $contacts) {
+      foreach ($contacts as $contact) {
+        $saved = civicrm_api4('Contact', 'save', ['records' => [$contact['fields']]])->first();
+        self::saveJoins('Contact', $saved['id'], $contact['joins'] ?? []);
+      }
+    }
+    unset($event->entityValues['Contact']);
+  }
+
+  /**
+   * @param \Civi\Afform\Event\AfformSubmitEvent $event
+   * @throws \API_Exception
+   * @see afform_civicrm_config
+   */
+  public static function processGenericEntity(AfformSubmitEvent $event) {
+    foreach ($event->entityValues as $entityType => $entities) {
+      // Each record is an array of one or more items (can be > 1 if af-repeat is used)
+      foreach ($entities as $entityName => $records) {
+        foreach ($records as $record) {
+          $saved = civicrm_api4($entityType, 'save', ['records' => [$record['fields']]])->first();
+          self::saveJoins($entityType, $saved['id'], $record['joins'] ?? []);
+        }
+      }
+      unset($event->entityValues[$entityType]);
+    }
+  }
+
+  protected static function saveJoins($mainEntityName, $entityId, $joins) {
+    foreach ($joins as $joinEntityName => $join) {
+      $values = self::filterEmptyJoins($joinEntityName, $join);
+      // FIXME: Replace/delete should only be done to known contacts
+      if ($values) {
+        civicrm_api4($joinEntityName, 'replace', [
+          'where' => self::getJoinWhereClause($mainEntityName, $joinEntityName, $entityId),
+          'records' => $values,
+        ]);
+      }
+      else {
+        try {
+          civicrm_api4($joinEntityName, 'delete', [
+            'where' => self::getJoinWhereClause($mainEntityName, $joinEntityName, $entityId),
+          ]);
+        }
+        catch (\API_Exception $e) {
+          // No records to delete
+        }
+      }
+    }
+  }
+
+  /**
+   * Filter out joins that have been left blank on the form
+   *
+   * @param $entity
+   * @param $join
+   * @return array
+   */
+  private static function filterEmptyJoins($entity, $join) {
+    return array_filter($join, function($item) use($entity) {
+      switch ($entity) {
+        case 'Email':
+          return !empty($item['email']);
+
+        case 'Phone':
+          return !empty($item['phone']);
+
+        case 'IM':
+          return !empty($item['name']);
+
+        case 'Website':
+          return !empty($item['url']);
+
+        default:
+          \CRM_Utils_Array::remove($item, 'id', 'is_primary', 'location_type_id', 'entity_id', 'contact_id', 'entity_table');
+          return (bool) array_filter($item);
+      }
+    });
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Update.php b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Update.php
new file mode 100644
index 0000000000000000000000000000000000000000..b67b67761e18953b5a002b178d84ebef4c1b162c
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Action/Afform/Update.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Civi\Api4\Action\Afform;
+
+/**
+ * @inheritDoc
+ * @package Civi\Api4\Action\Afform
+ */
+class Update extends \Civi\Api4\Generic\BasicUpdateAction {
+
+  use \Civi\Api4\Utils\AfformSaveTrait;
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Afform.php b/civicrm/ext/afform/core/Civi/Api4/Afform.php
new file mode 100644
index 0000000000000000000000000000000000000000..3527442f4187186f026a72d6a721a03463042da9
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Afform.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace Civi\Api4;
+
+use Civi\Api4\Generic\BasicBatchAction;
+
+/**
+ * User-configurable forms.
+ *
+ * Afform stands for *The Affable Administrative Angular Form Framework*.
+ *
+ * This API provides actions for
+ *   1. **_Managing_ forms:**
+ *      The `create`, `get`, `save`, `update`, & `revert` actions read/write form html & json files.
+ *   2. **_Using_ forms:**
+ *      The `prefill` and `submit` actions are used for preparing forms and processing submissions.
+ *
+ * @see https://lab.civicrm.org/extensions/afform
+ * @package Civi\Api4
+ */
+class Afform extends Generic\AbstractEntity {
+
+  /**
+   * @param bool $checkPermissions
+   * @return Action\Afform\Get
+   */
+  public static function get($checkPermissions = TRUE) {
+    return (new Action\Afform\Get('Afform', __FUNCTION__))
+      ->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @param bool $checkPermissions
+   * @return Action\Afform\Create
+   */
+  public static function create($checkPermissions = TRUE) {
+    return (new Action\Afform\Create('Afform', __FUNCTION__))
+      ->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @param bool $checkPermissions
+   * @return Action\Afform\Update
+   */
+  public static function update($checkPermissions = TRUE) {
+    return (new Action\Afform\Update('Afform', __FUNCTION__, 'name'))
+      ->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @param bool $checkPermissions
+   * @return Action\Afform\Save
+   */
+  public static function save($checkPermissions = TRUE) {
+    return (new Action\Afform\Save('Afform', __FUNCTION__, 'name'))
+      ->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @param bool $checkPermissions
+   * @return Action\Afform\Prefill
+   */
+  public static function prefill($checkPermissions = TRUE) {
+    return (new Action\Afform\Prefill('Afform', __FUNCTION__))
+      ->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @param bool $checkPermissions
+   * @return Action\Afform\Submit
+   */
+  public static function submit($checkPermissions = TRUE) {
+    return (new Action\Afform\Submit('Afform', __FUNCTION__))
+      ->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @param bool $checkPermissions
+   * @return Generic\BasicBatchAction
+   */
+  public static function revert($checkPermissions = TRUE) {
+    return (new BasicBatchAction('Afform', __FUNCTION__, ['name'], function($item, BasicBatchAction $action) {
+      $scanner = \Civi::service('afform_scanner');
+      $files = [
+        \CRM_Afform_AfformScanner::METADATA_FILE,
+        \CRM_Afform_AfformScanner::LAYOUT_FILE,
+      ];
+
+      foreach ($files as $file) {
+        $metaPath = $scanner->createSiteLocalPath($item['name'], $file);
+        if (file_exists($metaPath)) {
+          if (!@unlink($metaPath)) {
+            throw new \API_Exception("Failed to remove afform overrides in $file");
+          }
+        }
+      }
+
+      // We may have changed list of files covered by the cache.
+      _afform_clear();
+
+      // FIXME if `server_route` changes, then flush the menu cache.
+      // FIXME if asset-caching is enabled, then flush the asset cache
+
+      return $item;
+    }))->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @param bool $checkPermissions
+   * @return Generic\BasicGetFieldsAction
+   */
+  public static function getFields($checkPermissions = TRUE) {
+    return (new Generic\BasicGetFieldsAction('Afform', __FUNCTION__, function($self) {
+      $fields = [
+        [
+          'name' => 'name',
+        ],
+        [
+          'name' => 'requires',
+        ],
+        [
+          'name' => 'block',
+        ],
+        [
+          'name' => 'join',
+        ],
+        [
+          'name' => 'title',
+          'required' => $self->getAction() === 'create',
+        ],
+        [
+          'name' => 'description',
+        ],
+        [
+          'name' => 'is_public',
+          'data_type' => 'Boolean',
+        ],
+        [
+          'name' => 'repeat',
+          'data_type' => 'Mixed',
+        ],
+        [
+          'name' => 'server_route',
+        ],
+        [
+          'name' => 'permission',
+        ],
+        [
+          'name' => 'layout',
+        ],
+      ];
+
+      if ($self->getAction() === 'get') {
+        $fields[] = [
+          'name' => 'module_name',
+        ];
+        $fields[] = [
+          'name' => 'directive_name',
+        ];
+        $fields[] = [
+          'name' => 'has_local',
+        ];
+        $fields[] = [
+          'name' => 'has_base',
+        ];
+      }
+
+      return $fields;
+    }))->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @return array
+   */
+  public static function permissions() {
+    return [
+      "meta" => ["access CiviCRM"],
+      "default" => ["administer CiviCRM"],
+      'prefill' => [],
+      'submit' => [],
+    ];
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/AfformPalette.php b/civicrm/ext/afform/core/Civi/Api4/AfformPalette.php
new file mode 100644
index 0000000000000000000000000000000000000000..981d5ad9a92106b6defb3f09e9a1037b0bd335b7
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/AfformPalette.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Civi\Api4;
+
+/**
+ * Class AfformPalette
+ * @package Civi\Api4
+ */
+class AfformPalette extends Generic\AbstractEntity {
+
+  /**
+   * @param bool $checkPermissions
+   * @return Generic\BasicGetAction
+   */
+  public static function get($checkPermissions = TRUE) {
+    return (new Generic\BasicGetAction('AfformPalette', __FUNCTION__, function() {
+      return [
+        [
+          'id' => 'Parent:afl-name',
+          'entity' => 'Parent',
+          'title' => 'Name',
+          'template' => '<afl-name contact-id="entities.parent.id" afl-label="Name"/>',
+        ],
+        [
+          'id' => 'Parent:afl-address',
+          'entity' => 'Parent',
+          'title' => 'Address',
+          'template' => '<afl-address contact-id="entities.parent.id" afl-label="Address"/>',
+        ],
+      ];
+    }))->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @param bool $checkPermissions
+   * @return Generic\BasicGetFieldsAction
+   */
+  public static function getFields($checkPermissions = TRUE) {
+    return (new Generic\BasicGetFieldsAction('AfformPalette', __FUNCTION__, function() {
+      return [
+        [
+          'name' => 'id',
+        ],
+        [
+          'name' => 'entity',
+        ],
+        [
+          'name' => 'title',
+        ],
+        [
+          'name' => 'template',
+        ],
+      ];
+    }))->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @return array
+   */
+  public static function permissions() {
+    return [
+      "meta" => ["access CiviCRM"],
+      "default" => ["administer CiviCRM"],
+    ];
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/AfformTag.php b/civicrm/ext/afform/core/Civi/Api4/AfformTag.php
new file mode 100644
index 0000000000000000000000000000000000000000..e2b5b77e93fc253fba1c573dd8fc5e5b0eb9b9a3
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/AfformTag.php
@@ -0,0 +1,60 @@
+<?php
+namespace Civi\Api4;
+
+/**
+ * Class AfformTag
+ * @package Civi\Api4
+ */
+class AfformTag extends Generic\AbstractEntity {
+
+  /**
+   * @param bool $checkPermissions
+   * @return Generic\BasicGetAction
+   */
+  public static function get($checkPermissions = TRUE) {
+    return (new Generic\BasicGetAction('AfformTag', __FUNCTION__, function() {
+      return [
+        [
+          'name' => 'afl-entity',
+          'attrs' => ['entity-name', 'matching-rule', 'assigned-values'],
+        ],
+        [
+          'name' => 'afl-name',
+          'attrs' => ['contact-id', 'afl-label'],
+        ],
+        [
+          'name' => 'afl-contact-email',
+          'attrs' => ['contact-id', 'afl-label'],
+        ],
+      ];
+    }))->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @param bool $checkPermissions
+   * @return Generic\BasicGetFieldsAction
+   */
+  public static function getFields($checkPermissions = TRUE) {
+    return (new Generic\BasicGetFieldsAction('AfformTag', __FUNCTION__, function() {
+      return [
+        [
+          'name' => 'name',
+        ],
+        [
+          'name' => 'attrs',
+        ],
+      ];
+    }))->setCheckPermissions($checkPermissions);
+  }
+
+  /**
+   * @return array
+   */
+  public static function permissions() {
+    return [
+      "meta" => ["access CiviCRM"],
+      "default" => ["administer CiviCRM"],
+    ];
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Utils/AfformFormatTrait.php b/civicrm/ext/afform/core/Civi/Api4/Utils/AfformFormatTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..f70b36143ed4911652a6897df6d44bcee7e3c0eb
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Utils/AfformFormatTrait.php
@@ -0,0 +1,64 @@
+<?php
+namespace Civi\Api4\Utils;
+
+/**
+ * Class AfformFormatTrait
+ * @package Civi\Api4\Utils
+ *
+ * @method $this setLayoutFormat(string $layoutFormat)
+ * @method string getLayoutFormat()
+ * @method $this setFormatWhitespace(string $formatWhitespace)
+ * @method string getFormatWhitespace()
+ */
+trait AfformFormatTrait {
+
+  /**
+   * Controls the return format of the "layout" property
+   *  - html will return layout html as-is.
+   *  - shallow will convert most html to an array, but leave tag attributes and af-markup containers alone.
+   *  - deep will attempt to convert all html to an array, including tag attributes.
+   *
+   * @var string
+   * @options html,shallow,deep
+   */
+  protected $layoutFormat = 'deep';
+
+  /**
+   * Optionally manage whitespace for the "layout" property
+   *
+   * This option will strip whitepace from the returned layout array for "get" actions,
+   * and will auto-indent the aff.html for "save" actions.
+   *
+   * Note: currently this has no affect on "get" with "html" return format, which returns html as-is.
+   *
+   * @var bool
+   */
+  protected $formatWhitespace = FALSE;
+
+  /**
+   * @param string $html
+   * @return mixed
+   * @throws \API_Exception
+   */
+  protected function convertHtmlToOutput($html) {
+    if ($this->layoutFormat === 'html') {
+      return $html;
+    }
+    $converter = new \CRM_Afform_ArrayHtml($this->layoutFormat !== 'shallow', $this->formatWhitespace);
+    return $converter->convertHtmlToArray($html);
+  }
+
+  /**
+   * @param mixed $mixed
+   * @return string
+   * @throws \API_Exception
+   */
+  protected function convertInputToHtml($mixed) {
+    if ($this->layoutFormat === 'html') {
+      return $mixed;
+    }
+    $converter = new \CRM_Afform_ArrayHtml($this->layoutFormat !== 'shallow', $this->formatWhitespace);
+    return $converter->convertTreeToHtml($mixed);
+  }
+
+}
diff --git a/civicrm/ext/afform/core/Civi/Api4/Utils/AfformSaveTrait.php b/civicrm/ext/afform/core/Civi/Api4/Utils/AfformSaveTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..d35689ce8a4ab8d4ab11fe440bfcbfbf6aeb4264
--- /dev/null
+++ b/civicrm/ext/afform/core/Civi/Api4/Utils/AfformSaveTrait.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace Civi\Api4\Utils;
+
+/**
+ * Class AfformSaveTrait
+ * @package Civi\Api4\Action\Afform
+ */
+trait AfformSaveTrait {
+
+  use AfformFormatTrait;
+
+  protected function writeRecord($item) {
+    /** @var \CRM_Afform_AfformScanner $scanner */
+    $scanner = \Civi::service('afform_scanner');
+
+    // If no name given, create a unique name based on the title
+    if (empty($item['name'])) {
+      $prefix = !empty($item['join']) ? "afjoin-{$item['join']}" : !empty($item['block']) ? 'afblock-' . str_replace('*', 'all', $item['block']) : 'afform';
+      $item['name'] = _afform_angular_module_name($prefix . '-' . \CRM_Utils_String::munge($item['title'], '-'));
+      $suffix = '';
+      while (
+        file_exists($scanner->createSiteLocalPath($item['name'] . $suffix, \CRM_Afform_AfformScanner::METADATA_FILE))
+        || file_exists($scanner->createSiteLocalPath($item['name'] . $suffix, 'aff.html'))
+      ) {
+        $suffix++;
+      }
+      $item['name'] .= $suffix;
+      $orig = NULL;
+    }
+    elseif (!preg_match('/^[a-zA-Z][-_a-zA-Z0-9]*$/', $item['name'])) {
+      throw new \API_Exception("Afform.{$this->getActionName()}: name should begin with a letter and only contain alphanumerics underscores and dashes.");
+    }
+    else {
+      // Fetch existing metadata
+      $fields = \Civi\Api4\Afform::getfields()->setCheckPermissions(FALSE)->setAction('create')->addSelect('name')->execute()->column('name');
+      unset($fields[array_search('layout', $fields)]);
+      $orig = \Civi\Api4\Afform::get()->setCheckPermissions(FALSE)->addWhere('name', '=', $item['name'])->setSelect($fields)->execute()->first();
+    }
+
+    // FIXME validate all field data.
+    $item = _afform_fields_filter($item);
+
+    // Create or update aff.html.
+    if (isset($item['layout'])) {
+      $layoutPath = $scanner->createSiteLocalPath($item['name'], 'aff.html');
+      \CRM_Utils_File::createDir(dirname($layoutPath));
+      file_put_contents($layoutPath, $this->convertInputToHtml($item['layout']));
+      // FIXME check for writability then success. Report errors.
+    }
+
+    $meta = $item + (array) $orig;
+    unset($meta['layout'], $meta['name']);
+    if (!empty($meta)) {
+      $metaPath = $scanner->createSiteLocalPath($item['name'], \CRM_Afform_AfformScanner::METADATA_FILE);
+      \CRM_Utils_File::createDir(dirname($metaPath));
+      file_put_contents($metaPath, json_encode($meta, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
+      // FIXME check for writability then success. Report errors.
+    }
+
+    // We may have changed list of files covered by the cache.
+    _afform_clear();
+
+    $isChanged = function($field) use ($item, $orig) {
+      return ($item[$field] ?? NULL) !== ($orig[$field] ?? NULL);
+    };
+    // Right now, permission-checks are completely on-demand.
+    if ($isChanged('server_route') /* || $isChanged('permission') */) {
+      \CRM_Core_Menu::store();
+      \CRM_Core_BAO_Navigation::resetNavigation();
+    }
+    // FIXME if asset-caching is enabled, then flush the asset cache.
+
+    $item['module_name'] = _afform_angular_module_name($item['name'], 'camel');
+    $item['directive_name'] = _afform_angular_module_name($item['name'], 'dash');
+    return $meta + $item;
+  }
+
+}
diff --git a/civicrm/ext/afform/core/LICENSE.txt b/civicrm/ext/afform/core/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..1cb1cd35cefe6d61c06a35ab9180c448f473002c
--- /dev/null
+++ b/civicrm/ext/afform/core/LICENSE.txt
@@ -0,0 +1,667 @@
+Package: org.civicrm.afform
+Copyright (C) 2018, CiviCRM LLC <info@civicrm.org>
+Licensed under the GNU Affero Public License 3.0 (below).
+
+-------------------------------------------------------------------------------
+
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/civicrm/ext/afform/core/afform.civix.php b/civicrm/ext/afform/core/afform.civix.php
new file mode 100644
index 0000000000000000000000000000000000000000..a43b055281f8ec09b4b95aedc6adf6fbd09d4e92
--- /dev/null
+++ b/civicrm/ext/afform/core/afform.civix.php
@@ -0,0 +1,477 @@
+<?php
+
+// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
+
+/**
+ * The ExtensionUtil class provides small stubs for accessing resources of this
+ * extension.
+ */
+class CRM_Afform_ExtensionUtil {
+  const SHORT_NAME = "afform";
+  const LONG_NAME = "org.civicrm.afform";
+  const CLASS_PREFIX = "CRM_Afform";
+
+  /**
+   * Translate a string using the extension's domain.
+   *
+   * If the extension doesn't have a specific translation
+   * for the string, fallback to the default translations.
+   *
+   * @param string $text
+   *   Canonical message text (generally en_US).
+   * @param array $params
+   * @return string
+   *   Translated text.
+   * @see ts
+   */
+  public static function ts($text, $params = []) {
+    if (!array_key_exists('domain', $params)) {
+      $params['domain'] = [self::LONG_NAME, NULL];
+    }
+    return ts($text, $params);
+  }
+
+  /**
+   * Get the URL of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo'.
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function url($file = NULL) {
+    if ($file === NULL) {
+      return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/');
+    }
+    return CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME, $file);
+  }
+
+  /**
+   * Get the path of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo'.
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function path($file = NULL) {
+    // return CRM_Core_Resources::singleton()->getPath(self::LONG_NAME, $file);
+    return __DIR__ . ($file === NULL ? '' : (DIRECTORY_SEPARATOR . $file));
+  }
+
+  /**
+   * Get the name of a class within this extension.
+   *
+   * @param string $suffix
+   *   Ex: 'Page_HelloWorld' or 'Page\\HelloWorld'.
+   * @return string
+   *   Ex: 'CRM_Foo_Page_HelloWorld'.
+   */
+  public static function findClass($suffix) {
+    return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix);
+  }
+
+}
+
+use CRM_Afform_ExtensionUtil as E;
+
+/**
+ * (Delegated) Implements hook_civicrm_config().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config
+ */
+function _afform_civix_civicrm_config(&$config = NULL) {
+  static $configured = FALSE;
+  if ($configured) {
+    return;
+  }
+  $configured = TRUE;
+
+  $template =& CRM_Core_Smarty::singleton();
+
+  $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
+  $extDir = $extRoot . 'templates';
+
+  if (is_array($template->template_dir)) {
+    array_unshift($template->template_dir, $extDir);
+  }
+  else {
+    $template->template_dir = [$extDir, $template->template_dir];
+  }
+
+  $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
+  set_include_path($include_path);
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_xmlMenu().
+ *
+ * @param $files array(string)
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu
+ */
+function _afform_civix_civicrm_xmlMenu(&$files) {
+  foreach (_afform_civix_glob(__DIR__ . '/xml/Menu/*.xml') as $file) {
+    $files[] = $file;
+  }
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+ */
+function _afform_civix_civicrm_install() {
+  _afform_civix_civicrm_config();
+  if ($upgrader = _afform_civix_upgrader()) {
+    $upgrader->onInstall();
+  }
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
+ */
+function _afform_civix_civicrm_postInstall() {
+  _afform_civix_civicrm_config();
+  if ($upgrader = _afform_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onPostInstall'])) {
+      $upgrader->onPostInstall();
+    }
+  }
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
+ */
+function _afform_civix_civicrm_uninstall() {
+  _afform_civix_civicrm_config();
+  if ($upgrader = _afform_civix_upgrader()) {
+    $upgrader->onUninstall();
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_enable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+ */
+function _afform_civix_civicrm_enable() {
+  _afform_civix_civicrm_config();
+  if ($upgrader = _afform_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onEnable'])) {
+      $upgrader->onEnable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_disable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
+ * @return mixed
+ */
+function _afform_civix_civicrm_disable() {
+  _afform_civix_civicrm_config();
+  if ($upgrader = _afform_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onDisable'])) {
+      $upgrader->onDisable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_upgrade().
+ *
+ * @param $op string, the type of operation being performed; 'check' or 'enqueue'
+ * @param $queue CRM_Queue_Queue, (for 'enqueue') the modifiable list of pending up upgrade tasks
+ *
+ * @return mixed
+ *   based on op. for 'check', returns array(boolean) (TRUE if upgrades are pending)
+ *   for 'enqueue', returns void
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade
+ */
+function _afform_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  if ($upgrader = _afform_civix_upgrader()) {
+    return $upgrader->onUpgrade($op, $queue);
+  }
+}
+
+/**
+ * @return CRM_Afform_Upgrader
+ */
+function _afform_civix_upgrader() {
+  if (!file_exists(__DIR__ . '/CRM/Afform/Upgrader.php')) {
+    return NULL;
+  }
+  else {
+    return CRM_Afform_Upgrader_Base::instance();
+  }
+}
+
+/**
+ * Search directory tree for files which match a glob pattern.
+ *
+ * Note: Dot-directories (like "..", ".git", or ".svn") will be ignored.
+ * Note: In Civi 4.3+, delegate to CRM_Utils_File::findFiles()
+ *
+ * @param string $dir base dir
+ * @param string $pattern , glob pattern, eg "*.txt"
+ *
+ * @return array
+ */
+function _afform_civix_find_files($dir, $pattern) {
+  if (is_callable(['CRM_Utils_File', 'findFiles'])) {
+    return CRM_Utils_File::findFiles($dir, $pattern);
+  }
+
+  $todos = [$dir];
+  $result = [];
+  while (!empty($todos)) {
+    $subdir = array_shift($todos);
+    foreach (_afform_civix_glob("$subdir/$pattern") as $match) {
+      if (!is_dir($match)) {
+        $result[] = $match;
+      }
+    }
+    if ($dh = opendir($subdir)) {
+      while (FALSE !== ($entry = readdir($dh))) {
+        $path = $subdir . DIRECTORY_SEPARATOR . $entry;
+        if ($entry[0] == '.') {
+        }
+        elseif (is_dir($path)) {
+          $todos[] = $path;
+        }
+      }
+      closedir($dh);
+    }
+  }
+  return $result;
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_managed().
+ *
+ * Find any *.mgd.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed
+ */
+function _afform_civix_civicrm_managed(&$entities) {
+  $mgdFiles = _afform_civix_find_files(__DIR__, '*.mgd.php');
+  sort($mgdFiles);
+  foreach ($mgdFiles as $file) {
+    $es = include $file;
+    foreach ($es as $e) {
+      if (empty($e['module'])) {
+        $e['module'] = E::LONG_NAME;
+      }
+      if (empty($e['params']['version'])) {
+        $e['params']['version'] = '3';
+      }
+      $entities[] = $e;
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_caseTypes().
+ *
+ * Find any and return any files matching "xml/case/*.xml"
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes
+ */
+function _afform_civix_civicrm_caseTypes(&$caseTypes) {
+  if (!is_dir(__DIR__ . '/xml/case')) {
+    return;
+  }
+
+  foreach (_afform_civix_glob(__DIR__ . '/xml/case/*.xml') as $file) {
+    $name = preg_replace('/\.xml$/', '', basename($file));
+    if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) {
+      $errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name));
+      throw new CRM_Core_Exception($errorMessage);
+    }
+    $caseTypes[$name] = [
+      'module' => E::LONG_NAME,
+      'name' => $name,
+      'file' => $file,
+    ];
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_angularModules().
+ *
+ * Find any and return any files matching "ang/*.ang.php"
+ *
+ * Note: This hook only runs in CiviCRM 4.5+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules
+ */
+function _afform_civix_civicrm_angularModules(&$angularModules) {
+  if (!is_dir(__DIR__ . '/ang')) {
+    return;
+  }
+
+  $files = _afform_civix_glob(__DIR__ . '/ang/*.ang.php');
+  foreach ($files as $file) {
+    $name = preg_replace(':\.ang\.php$:', '', basename($file));
+    $module = include $file;
+    if (empty($module['ext'])) {
+      $module['ext'] = E::LONG_NAME;
+    }
+    $angularModules[$name] = $module;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_themes().
+ *
+ * Find any and return any files matching "*.theme.php"
+ */
+function _afform_civix_civicrm_themes(&$themes) {
+  $files = _afform_civix_glob(__DIR__ . '/*.theme.php');
+  foreach ($files as $file) {
+    $themeMeta = include $file;
+    if (empty($themeMeta['name'])) {
+      $themeMeta['name'] = preg_replace(':\.theme\.php$:', '', basename($file));
+    }
+    if (empty($themeMeta['ext'])) {
+      $themeMeta['ext'] = E::LONG_NAME;
+    }
+    $themes[$themeMeta['name']] = $themeMeta;
+  }
+}
+
+/**
+ * Glob wrapper which is guaranteed to return an array.
+ *
+ * The documentation for glob() says, "On some systems it is impossible to
+ * distinguish between empty match and an error." Anecdotally, the return
+ * result for an empty match is sometimes array() and sometimes FALSE.
+ * This wrapper provides consistency.
+ *
+ * @link http://php.net/glob
+ * @param string $pattern
+ *
+ * @return array
+ */
+function _afform_civix_glob($pattern) {
+  $result = glob($pattern);
+  return is_array($result) ? $result : [];
+}
+
+/**
+ * Inserts a navigation menu item at a given place in the hierarchy.
+ *
+ * @param array $menu - menu hierarchy
+ * @param string $path - path to parent of this item, e.g. 'my_extension/submenu'
+ *    'Mailing', or 'Administer/System Settings'
+ * @param array $item - the item to insert (parent/child attributes will be
+ *    filled for you)
+ *
+ * @return bool
+ */
+function _afform_civix_insert_navigation_menu(&$menu, $path, $item) {
+  // If we are done going down the path, insert menu
+  if (empty($path)) {
+    $menu[] = [
+      'attributes' => array_merge([
+        'label'      => CRM_Utils_Array::value('name', $item),
+        'active'     => 1,
+      ], $item),
+    ];
+    return TRUE;
+  }
+  else {
+    // Find an recurse into the next level down
+    $found = FALSE;
+    $path = explode('/', $path);
+    $first = array_shift($path);
+    foreach ($menu as $key => &$entry) {
+      if ($entry['attributes']['name'] == $first) {
+        if (!isset($entry['child'])) {
+          $entry['child'] = [];
+        }
+        $found = _afform_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item);
+      }
+    }
+    return $found;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_navigationMenu().
+ */
+function _afform_civix_navigationMenu(&$nodes) {
+  if (!is_callable(['CRM_Core_BAO_Navigation', 'fixNavigationMenu'])) {
+    _afform_civix_fixNavigationMenu($nodes);
+  }
+}
+
+/**
+ * Given a navigation menu, generate navIDs for any items which are
+ * missing them.
+ */
+function _afform_civix_fixNavigationMenu(&$nodes) {
+  $maxNavID = 1;
+  array_walk_recursive($nodes, function($item, $key) use (&$maxNavID) {
+    if ($key === 'navID') {
+      $maxNavID = max($maxNavID, $item);
+    }
+  });
+  _afform_civix_fixNavigationMenuItems($nodes, $maxNavID, NULL);
+}
+
+function _afform_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $parentID) {
+  $origKeys = array_keys($nodes);
+  foreach ($origKeys as $origKey) {
+    if (!isset($nodes[$origKey]['attributes']['parentID']) && $parentID !== NULL) {
+      $nodes[$origKey]['attributes']['parentID'] = $parentID;
+    }
+    // If no navID, then assign navID and fix key.
+    if (!isset($nodes[$origKey]['attributes']['navID'])) {
+      $newKey = ++$maxNavID;
+      $nodes[$origKey]['attributes']['navID'] = $newKey;
+      $nodes[$newKey] = $nodes[$origKey];
+      unset($nodes[$origKey]);
+      $origKey = $newKey;
+    }
+    if (isset($nodes[$origKey]['child']) && is_array($nodes[$origKey]['child'])) {
+      _afform_civix_fixNavigationMenuItems($nodes[$origKey]['child'], $maxNavID, $nodes[$origKey]['attributes']['navID']);
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders
+ */
+function _afform_civix_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  $settingsDir = __DIR__ . DIRECTORY_SEPARATOR . 'settings';
+  if (!in_array($settingsDir, $metaDataFolders) && is_dir($settingsDir)) {
+    $metaDataFolders[] = $settingsDir;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_entityTypes().
+ *
+ * Find any *.entityType.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes
+ */
+function _afform_civix_civicrm_entityTypes(&$entityTypes) {
+  $entityTypes = array_merge($entityTypes, []);
+}
diff --git a/civicrm/ext/afform/core/afform.php b/civicrm/ext/afform/core/afform.php
new file mode 100644
index 0000000000000000000000000000000000000000..c78170823b88598d0f8c1bf6e6d22be1ed40ffdc
--- /dev/null
+++ b/civicrm/ext/afform/core/afform.php
@@ -0,0 +1,543 @@
+<?php
+
+require_once 'afform.civix.php';
+use CRM_Afform_ExtensionUtil as E;
+use Civi\Api4\Action\Afform\Submit;
+
+/**
+ * Filter the content of $params to only have supported afform fields.
+ *
+ * @param array $params
+ * @return array
+ */
+function _afform_fields_filter($params) {
+  $result = [];
+  $fields = \Civi\Api4\Afform::getfields()->setCheckPermissions(FALSE)->setAction('create')->execute()->indexBy('name');
+  foreach ($fields as $fieldName => $field) {
+    if (isset($params[$fieldName])) {
+      $result[$fieldName] = $params[$fieldName];
+
+      if ($field['data_type'] === 'Boolean' && !is_bool($params[$fieldName])) {
+        $result[$fieldName] = CRM_Utils_String::strtobool($params[$fieldName]);
+      }
+    }
+  }
+  return $result;
+}
+
+/**
+ * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
+ */
+function afform_civicrm_container($container) {
+  $container->addResource(new \Symfony\Component\Config\Resource\FileResource(__FILE__));
+  $container->setDefinition('afform_scanner', new \Symfony\Component\DependencyInjection\Definition(
+    'CRM_Afform_AfformScanner',
+    []
+  ))->setPublic(TRUE);
+}
+
+/**
+ * Implements hook_civicrm_config().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_config
+ */
+function afform_civicrm_config(&$config) {
+  _afform_civix_civicrm_config($config);
+
+  if (isset(Civi::$statics[__FUNCTION__])) {
+    return;
+  }
+  Civi::$statics[__FUNCTION__] = 1;
+
+  Civi::dispatcher()->addListener(Submit::EVENT_NAME, [Submit::class, 'processContacts'], 500);
+  Civi::dispatcher()->addListener(Submit::EVENT_NAME, [Submit::class, 'processGenericEntity'], -1000);
+  Civi::dispatcher()->addListener('hook_civicrm_angularModules', '_afform_civicrm_angularModules_autoReq', -1000);
+}
+
+/**
+ * Implements hook_civicrm_xmlMenu().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_xmlMenu
+ */
+function afform_civicrm_xmlMenu(&$files) {
+  _afform_civix_civicrm_xmlMenu($files);
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_install
+ */
+function afform_civicrm_install() {
+  _afform_civix_civicrm_install();
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_postInstall
+ */
+function afform_civicrm_postInstall() {
+  _afform_civix_civicrm_postInstall();
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_uninstall
+ */
+function afform_civicrm_uninstall() {
+  _afform_civix_civicrm_uninstall();
+}
+
+/**
+ * Implements hook_civicrm_enable().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_enable
+ */
+function afform_civicrm_enable() {
+  _afform_civix_civicrm_enable();
+}
+
+/**
+ * Implements hook_civicrm_disable().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_disable
+ */
+function afform_civicrm_disable() {
+  _afform_civix_civicrm_disable();
+}
+
+/**
+ * Implements hook_civicrm_upgrade().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_upgrade
+ */
+function afform_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  return _afform_civix_civicrm_upgrade($op, $queue);
+}
+
+/**
+ * Implements hook_civicrm_managed().
+ *
+ * Generate a list of entities to create/deactivate/delete when this module
+ * is installed, disabled, uninstalled.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_managed
+ */
+function afform_civicrm_managed(&$entities) {
+  _afform_civix_civicrm_managed($entities);
+}
+
+/**
+ * Implements hook_civicrm_caseTypes().
+ *
+ * Generate a list of case-types.
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_caseTypes
+ */
+function afform_civicrm_caseTypes(&$caseTypes) {
+  _afform_civix_civicrm_caseTypes($caseTypes);
+}
+
+/**
+ * Implements hook_civicrm_angularModules().
+ *
+ * Generate a list of Afform Angular modules.
+ */
+function afform_civicrm_angularModules(&$angularModules) {
+  _afform_civix_civicrm_angularModules($angularModules);
+
+  $afforms = \Civi\Api4\Afform::get(FALSE)
+    ->setSelect(['name', 'requires', 'module_name', 'directive_name'])
+    ->execute();
+
+  foreach ($afforms as $afform) {
+    $angularModules[$afform['module_name']] = [
+      'ext' => E::LONG_NAME,
+      'js' => ['assetBuilder://afform.js?name=' . urlencode($afform['name'])],
+      'requires' => $afform['requires'],
+      'basePages' => [],
+      'partialsCallback' => '_afform_get_partials',
+      '_afform' => $afform['name'],
+      'exports' => [
+        $afform['directive_name'] => 'AE',
+      ],
+    ];
+  }
+}
+
+/**
+ * Callback to retrieve partials for a given afform/angular module.
+ *
+ * @see afform_civicrm_angularModules
+ *
+ * @param string $moduleName
+ *   The module name.
+ * @param array $module
+ *   The module definition.
+ * @return array
+ *   Array(string $filename => string $html).
+ * @throws API_Exception
+ */
+function _afform_get_partials($moduleName, $module) {
+  $afform = civicrm_api4('Afform', 'get', [
+    'where' => [['name', '=', $module['_afform']]],
+    'select' => ['layout'],
+    'layoutFormat' => 'html',
+    'checkPermissions' => FALSE,
+  ], 0);
+  return [
+    "~/$moduleName/$moduleName.aff.html" => $afform['layout'],
+  ];
+}
+
+/**
+ * Scan the list of Angular modules and inject automatic-requirements.
+ *
+ * TLDR: if an afform uses element "<other-el/>", and if another module defines
+ * `$angularModules['otherMod']['exports']['el'][0] === 'other-el'`, then
+ * the 'otherMod' is automatically required.
+ *
+ * @param \Civi\Core\Event\GenericHookEvent $e
+ * @see CRM_Utils_Hook::angularModules()
+ */
+function _afform_civicrm_angularModules_autoReq($e) {
+  /** @var CRM_Afform_AfformScanner $scanner */
+  $scanner = Civi::service('afform_scanner');
+  $moduleEnvId = md5(\CRM_Core_Config_Runtime::getId() . implode(',', array_keys($e->angularModules)));
+  $depCache = CRM_Utils_Cache::create([
+    'name' => 'afdep_' . substr($moduleEnvId, 0, 32 - 6),
+    'type' => ['*memory*', 'SqlGroup', 'ArrayCache'],
+    'withArray' => 'fast',
+    'prefetch' => TRUE,
+  ]);
+  $depCacheTtl = 2 * 60 * 60;
+
+  $revMap = _afform_reverse_deps($e->angularModules);
+
+  $formNames = array_keys($scanner->findFilePaths());
+  foreach ($formNames as $formName) {
+    $angModule = _afform_angular_module_name($formName, 'camel');
+    $cacheLine = $depCache->get($formName, NULL);
+
+    $jFile = $scanner->findFilePath($formName, 'aff.json');
+    $hFile = $scanner->findFilePath($formName, 'aff.html');
+
+    $jStat = stat($jFile);
+    $hStat = stat($hFile);
+
+    if ($cacheLine === NULL) {
+      $needsUpdate = TRUE;
+    }
+    elseif ($jStat !== FALSE && $jStat['size'] !== $cacheLine['js']) {
+      $needsUpdate = TRUE;
+    }
+    elseif ($jStat !== FALSE && $jStat['mtime'] > $cacheLine['jm']) {
+      $needsUpdate = TRUE;
+    }
+    elseif ($hStat !== FALSE && $hStat['size'] !== $cacheLine['hs']) {
+      $needsUpdate = TRUE;
+    }
+    elseif ($hStat !== FALSE && $hStat['mtime'] > $cacheLine['hm']) {
+      $needsUpdate = TRUE;
+    }
+    else {
+      $needsUpdate = FALSE;
+    }
+
+    if ($needsUpdate) {
+      $cacheLine = [
+        'js' => $jStat['size'] ?? NULL,
+        'jm' => $jStat['mtime'] ?? NULL,
+        'hs' => $hStat['size'] ?? NULL,
+        'hm' => $hStat['mtime'] ?? NULL,
+        'r' => array_values(array_unique(array_merge(
+          [CRM_Afform_AfformScanner::DEFAULT_REQUIRES],
+          $e->angularModules[$angModule]['requires'] ?? [],
+          _afform_reverse_deps_find($formName, file_get_contents($hFile), $revMap)
+        ))),
+      ];
+      // print_r(['cache update:' . $formName => $cacheLine]);
+      $depCache->set($formName, $cacheLine, $depCacheTtl);
+    }
+
+    $e->angularModules[$angModule]['requires'] = $cacheLine['r'];
+  }
+}
+
+/**
+ * @param $angularModules
+ * @return array
+ *   'attr': array(string $attrName => string $angModuleName)
+ *   'el': array(string $elementName => string $angModuleName)
+ */
+function _afform_reverse_deps($angularModules) {
+  $revMap = ['attr' => [], 'el' => []];
+  foreach (array_keys($angularModules) as $module) {
+    if (!isset($angularModules[$module]['exports'])) {
+      continue;
+    }
+    foreach ($angularModules[$module]['exports'] as $symbolName => $symbolTypes) {
+      if (strpos($symbolTypes, 'A') !== FALSE) {
+        $revMap['attr'][$symbolName] = $module;
+      }
+      if (strpos($symbolTypes, 'E') !== FALSE) {
+        $revMap['el'][$symbolName] = $module;
+      }
+    }
+  }
+  return $revMap;
+}
+
+/**
+ * @param string $formName
+ * @param string $html
+ * @param array $revMap
+ *   The reverse-dependencies map from _afform_reverse_deps().
+ * @return array
+ * @see _afform_reverse_deps()
+ */
+function _afform_reverse_deps_find($formName, $html, $revMap) {
+  $symbols = \Civi\Afform\Symbols::scan($html);
+  $elems = array_intersect_key($revMap['el'], $symbols->elements);
+  $attrs = array_intersect_key($revMap['attr'], $symbols->attributes);
+  return array_values(array_unique(array_merge($elems, $attrs)));
+}
+
+/**
+ * @param \Civi\Angular\Manager $angular
+ * @see CRM_Utils_Hook::alterAngular()
+ */
+function afform_civicrm_alterAngular($angular) {
+  $fieldMetadata = \Civi\Angular\ChangeSet::create('fieldMetadata')
+    ->alterHtml(';\\.aff\\.html$;', function($doc, $path) {
+      try {
+        $module = \Civi::service('angular')->getModule(basename($path, '.aff.html'));
+        $meta = \Civi\Api4\Afform::get()->addWhere('name', '=', $module['_afform'])->setSelect(['join', 'block'])->setCheckPermissions(FALSE)->execute()->first();
+      }
+      catch (Exception $e) {
+      }
+
+      $blockEntity = $meta['join'] ?? $meta['block'] ?? NULL;
+      if (!$blockEntity) {
+        $entities = _afform_getMetadata($doc);
+      }
+
+      foreach (pq('af-field', $doc) as $afField) {
+        /** @var DOMElement $afField */
+        $entityName = pq($afField)->parents('[af-fieldset]')->attr('af-fieldset');
+        $joinName = pq($afField)->parents('[af-join]')->attr('af-join');
+        if (!$blockEntity && !preg_match(';^[a-zA-Z0-9\_\-\. ]+$;', $entityName)) {
+          throw new \CRM_Core_Exception("Cannot process $path: malformed entity name ($entityName)");
+        }
+        $entityType = $blockEntity ?? $entities[$entityName]['type'];
+        _af_fill_field_metadata($joinName ? $joinName : $entityType, $afField);
+      }
+    });
+  $angular->add($fieldMetadata);
+}
+
+/**
+ * Merge field definition metadata into an afform field's definition
+ *
+ * @param $entityType
+ * @param DOMElement $afField
+ * @throws API_Exception
+ */
+function _af_fill_field_metadata($entityType, DOMElement $afField) {
+  $params = [
+    'action' => 'create',
+    'where' => [['name', '=', $afField->getAttribute('name')]],
+    'select' => ['title', 'input_type', 'input_attrs', 'options'],
+    'loadOptions' => TRUE,
+  ];
+  if (in_array($entityType, CRM_Contact_BAO_ContactType::basicTypes(TRUE))) {
+    $params['values'] = ['contact_type' => $entityType];
+    $entityType = 'Contact';
+  }
+  $getFields = civicrm_api4($entityType, 'getFields', $params);
+  // Merge field definition data with whatever's already in the markup
+  $deep = ['input_attrs'];
+  foreach ($getFields as $fieldInfo) {
+    $existingFieldDefn = trim(pq($afField)->attr('defn') ?: '');
+    if ($existingFieldDefn && $existingFieldDefn[0] != '{') {
+      // If it's not an object, don't mess with it.
+      continue;
+    }
+    // TODO: Teach the api to return options in this format
+    if (!empty($fieldInfo['options'])) {
+      $fieldInfo['options'] = CRM_Utils_Array::makeNonAssociative($fieldInfo['options'], 'key', 'label');
+    }
+    // Default placeholder for select inputs
+    if ($fieldInfo['input_type'] === 'Select') {
+      $fieldInfo['input_attrs'] = ($fieldInfo['input_attrs'] ?? []) + ['placeholder' => ts('Select')];
+    }
+
+    $fieldDefn = $existingFieldDefn ? CRM_Utils_JS::getRawProps($existingFieldDefn) : [];
+    foreach ($fieldInfo as $name => $prop) {
+      // Merge array props 1 level deep
+      if (in_array($name, $deep) && !empty($fieldDefn[$name])) {
+        $fieldDefn[$name] = CRM_Utils_JS::writeObject(CRM_Utils_JS::getRawProps($fieldDefn[$name]) + array_map(['CRM_Utils_JS', 'encode'], $prop));
+      }
+      elseif (!isset($fieldDefn[$name])) {
+        $fieldDefn[$name] = CRM_Utils_JS::encode($prop);
+      }
+    }
+    pq($afField)->attr('defn', htmlspecialchars(CRM_Utils_JS::writeObject($fieldDefn)));
+  }
+}
+
+function _afform_getMetadata(phpQueryObject $doc) {
+  $entities = [];
+  foreach ($doc->find('af-entity') as $afmModelProp) {
+    $entities[$afmModelProp->getAttribute('name')] = [
+      'type' => $afmModelProp->getAttribute('type'),
+    ];
+  }
+  return $entities;
+}
+
+/**
+ * Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_alterSettingsFolders
+ */
+function afform_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  _afform_civix_civicrm_alterSettingsFolders($metaDataFolders);
+}
+
+/**
+ * Implements hook_civicrm_entityTypes().
+ *
+ * Declare entity types provided by this module.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_entityTypes
+ */
+function afform_civicrm_entityTypes(&$entityTypes) {
+  _afform_civix_civicrm_entityTypes($entityTypes);
+}
+
+/**
+ * Implements hook_civicrm_themes().
+ */
+function afform_civicrm_themes(&$themes) {
+  _afform_civix_civicrm_themes($themes);
+}
+
+/**
+ * Implements hook_civicrm_buildAsset().
+ */
+function afform_civicrm_buildAsset($asset, $params, &$mimeType, &$content) {
+  if ($asset !== 'afform.js') {
+    return;
+  }
+
+  if (empty($params['name'])) {
+    throw new RuntimeException("Missing required parameter: afform.js?name=NAME");
+  }
+
+  $moduleName = _afform_angular_module_name($params['name'], 'camel');
+  $smarty = CRM_Core_Smarty::singleton();
+  $smarty->assign('afform', [
+    'camel' => $moduleName,
+    'meta' => ['name' => $params['name']],
+    'templateUrl' => "~/$moduleName/$moduleName.aff.html",
+  ]);
+  $mimeType = 'text/javascript';
+  $content = $smarty->fetch('afform/AfformAngularModule.tpl');
+}
+
+/**
+ * Implements hook_civicrm_alterMenu().
+ */
+function afform_civicrm_alterMenu(&$items) {
+  if (Civi::container()->has('afform_scanner')) {
+    $scanner = Civi::service('afform_scanner');
+  }
+  else {
+    // During installation...
+    $scanner = new CRM_Afform_AfformScanner();
+  }
+  foreach ($scanner->getMetas() as $name => $meta) {
+    if (!empty($meta['server_route'])) {
+      $items[$meta['server_route']] = [
+        'page_callback' => 'CRM_Afform_Page_AfformBase',
+        'page_arguments' => 'afform=' . urlencode($name),
+        'title' => $meta['title'] ?? '',
+        'access_arguments' => [["@afform:$name"], 'and'],
+        'is_public' => $meta['is_public'],
+      ];
+    }
+  }
+}
+
+/**
+ * Implements hook_civicrm_permission_check().
+ *
+ * This extends the list of permissions available in `CRM_Core_Permission:check()`
+ * by introducing virtual-permissions named `@afform:myForm`. The evaluation
+ * of these virtual-permissions is dependent on the settings for `myForm`.
+ * `myForm` may be exposed/integrated through multiple subsystems (routing,
+ * nav-menu, API, etc), and the use of virtual-permissions makes easy to enforce
+ * consistent permissions across any relevant subsystems.
+ *
+ * @see CRM_Utils_Hook::permission_check()
+ */
+function afform_civicrm_permission_check($permission, &$granted, $contactId) {
+  if ($permission[0] !== '@') {
+    // Micro-optimization - this function may get hit a lot.
+    return;
+  }
+
+  if (preg_match('/^@afform:(.*)/', $permission, $m)) {
+    $name = $m[1];
+
+    $afform = \Civi\Api4\Afform::get()
+      ->setCheckPermissions(FALSE)
+      ->addWhere('name', '=', $name)
+      ->setSelect(['permission'])
+      ->execute()
+      ->first();
+    if ($afform) {
+      $granted = CRM_Core_Permission::check($afform['permission'], $contactId);
+    }
+  }
+}
+
+/**
+ * Clear any local/in-memory caches based on afform data.
+ */
+function _afform_clear() {
+  $container = \Civi::container();
+  $container->get('afform_scanner')->clear();
+  $container->get('angular')->clear();
+}
+
+/**
+ * @param string $fileBaseName
+ *   Ex: foo-bar
+ * @param string $format
+ *   'camel' or 'dash'.
+ * @return string
+ *   Ex: 'FooBar' or 'foo-bar'.
+ * @throws \Exception
+ */
+function _afform_angular_module_name($fileBaseName, $format = 'camel') {
+  switch ($format) {
+    case 'camel':
+      $camelCase = '';
+      foreach (preg_split('/[-_ ]/', $fileBaseName, NULL, PREG_SPLIT_NO_EMPTY) as $shortNamePart) {
+        $camelCase .= ucfirst($shortNamePart);
+      }
+      return strtolower($camelCase[0]) . substr($camelCase, 1);
+
+    case 'dash':
+      return strtolower(implode('-', preg_split('/[-_ ]|(?=[A-Z])/', $fileBaseName, NULL, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)));
+
+    default:
+      throw new \Exception("Unrecognized format");
+  }
+}
diff --git a/civicrm/ext/afform/core/ang/af.ang.php b/civicrm/ext/afform/core/ang/af.ang.php
new file mode 100644
index 0000000000000000000000000000000000000000..d927eb8a3493c6d6d11ef1469be281cfcae01696
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af.ang.php
@@ -0,0 +1,26 @@
+<?php
+// This file declares an Angular module which can be autoloaded
+// in CiviCRM. See also:
+// http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_angularModules
+
+return [
+  'js' => [
+    'ang/af.js',
+    'ang/af/*.js',
+    'ang/af/*/*.js',
+  ],
+  // 'css' => ['ang/af.css'],
+  'partials' => ['ang/af'],
+  'requires' => ['crmUtil'],
+  'settings' => [],
+  'basePages' => [],
+  'exports' => [
+    'af-entity' => 'E',
+    'af-fieldset' => 'A',
+    'af-form' => 'E',
+    'af-join' => 'A',
+    'af-repeat' => 'A',
+    'af-repeat-item' => 'A',
+    'af-field' => 'E',
+  ],
+];
diff --git a/civicrm/ext/afform/core/ang/af.js b/civicrm/ext/afform/core/ang/af.js
new file mode 100644
index 0000000000000000000000000000000000000000..bf8b47d5e615fc49d869beb03bf27c2035bfc90b
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af.js
@@ -0,0 +1,4 @@
+(function(angular, $, _) {
+  // Declare a list of dependencies.
+  angular.module('af', CRM.angRequires('af'));
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/af/Entity.js b/civicrm/ext/afform/core/ang/af/Entity.js
new file mode 100644
index 0000000000000000000000000000000000000000..2c522a603074035a243f3d58d2efd9476b554d92
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/Entity.js
@@ -0,0 +1,26 @@
+(function(angular, $, _) {
+  // Example usage: <af-form><af-entity name="Person" type="Contact" /> ... <fieldset af-fieldset="Person> ... </fieldset></af-form>
+  angular.module('af').directive('afEntity', function() {
+    // Whitelist of all allowed properties of an af-fieldset
+    // (at least the ones we care about client-side - other's can be added for server-side processing and we'll just ignore them)
+    var modelProps = {
+      type: '@',
+      data: '=',
+      modelName: '@name',
+      label: '@',
+      autofill: '@'
+    };
+    return {
+      restrict: 'E',
+      require: '^afForm',
+      scope: modelProps,
+      link: function($scope, $el, $attr, afFormCtrl) {
+        var ts = $scope.ts = CRM.ts('afform'),
+          entity = _.pick($scope, _.keys(modelProps));
+        entity.id = null;
+        afFormCtrl.registerEntity(entity);
+        // $scope.$watch('afEntity', function(newValue){$scope.myOptions = newValue;});
+      }
+    };
+  });
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/af/Field.js b/civicrm/ext/afform/core/ang/af/Field.js
new file mode 100644
index 0000000000000000000000000000000000000000..12c1726ad001936a3520a559638c1547fb54e285
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/Field.js
@@ -0,0 +1,78 @@
+(function(angular, $, _) {
+  var id = 0;
+  // Example usage: <div af-fieldset="myModel"><af-field name="do_not_email" /></div>
+  angular.module('af').directive('afField', function(crmApi4) {
+    return {
+      restrict: 'E',
+      require: ['^^afForm', '^^afFieldset', '?^^afJoin', '?^^afRepeatItem'],
+      templateUrl: '~/af/afField.html',
+      scope: {
+        fieldName: '@name',
+        defn: '='
+      },
+      link: function($scope, $el, $attr, ctrls) {
+        var ts = $scope.ts = CRM.ts('afform'),
+          closestController = $($el).closest('[af-fieldset],[af-join],[af-repeat-item]'),
+          afForm = ctrls[0],
+          boolOptions = [{key: true, label: ts('Yes')}, {key: false, label: ts('No')}],
+          // Only used for is_primary radio button
+          noOptions = [{key: true, label: ''}];
+        $scope.dataProvider = closestController.is('[af-repeat-item]') ? ctrls[3] : ctrls[2] || ctrls[1];
+        $scope.fieldId = afForm.getFormMeta().name + '-' + $scope.fieldName + '-' + id++;
+
+        $el.addClass('af-field-type-' + _.kebabCase($scope.defn.input_type));
+
+        $scope.getOptions = function() {
+          return $scope.defn.options || ($scope.fieldName === 'is_primary' && $scope.defn.input_type === 'Radio' ? noOptions : boolOptions);
+        };
+
+        $scope.select2Options = function() {
+          return {
+            results: _.transform($scope.getOptions(), function(result, opt) {
+              result.push({id: opt.key, text: opt.label});
+            }, [])
+          };
+        };
+
+        // is_primary field - watch others in this afRepeat block to ensure only one is selected
+        if ($scope.fieldName === 'is_primary' && 'repeatIndex' in $scope.dataProvider) {
+          $scope.$watch('dataProvider.afRepeat.getEntityController().getData()', function (items, prev) {
+            var index = $scope.dataProvider.repeatIndex;
+            // Set first item to primary if there isn't a primary
+            if (items && !index && !_.find(items, 'is_primary')) {
+              $scope.dataProvider.getFieldData().is_primary = true;
+            }
+            // Set this item to not primary if another has been selected
+            if (items && prev && items.length === prev.length && items[index].is_primary && prev[index].is_primary &&
+              _.filter(items, 'is_primary').length > 1
+            ) {
+              $scope.dataProvider.getFieldData().is_primary = false;
+            }
+          }, true);
+        }
+
+        // ChainSelect - watch control field & reload options as needed
+        if ($scope.defn.input_type === 'ChainSelect') {
+          $scope.$watch('dataProvider.getFieldData()[defn.input_attrs.controlField]', function(val) {
+            if (val) {
+              var params = {
+                where: [['name', '=', $scope.fieldName]],
+                select: ['options'],
+                loadOptions: true,
+                values: {}
+              };
+              params.values[$scope.defn.input_attrs.controlField] = val;
+              crmApi4($scope.dataProvider.getEntityType(), 'getFields', params, 0)
+                .then(function(data) {
+                  $scope.defn.options.length = 0;
+                  _.transform(data.options, function(options, label, key) {
+                    options.push({key: key, label: label});
+                  }, $scope.defn.options);
+                });
+            }
+          });
+        }
+      }
+    };
+  });
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/af/Fieldset.js b/civicrm/ext/afform/core/ang/af/Fieldset.js
new file mode 100644
index 0000000000000000000000000000000000000000..4294ee7c58ec728008a09ad5bf393c240d711802
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/Fieldset.js
@@ -0,0 +1,37 @@
+(function(angular, $, _) {
+  // Example usage: <af-form><af-entity name="Person" type="Contact" /> ... <fieldset af-fieldset="Person> ... </fieldset></af-form>
+  angular.module('af').directive('afFieldset', function() {
+    return {
+      restrict: 'A',
+      require: ['afFieldset', '^afForm'],
+      bindToController: {
+        modelName: '@afFieldset'
+      },
+      link: function($scope, $el, $attr, ctrls) {
+        var self = ctrls[0];
+        self.afFormCtrl = ctrls[1];
+      },
+      controller: function($scope){
+        this.getDefn = function() {
+          return this.afFormCtrl.getEntity(this.modelName);
+        };
+        this.getData = function() {
+          return this.afFormCtrl.getData(this.modelName);
+        };
+        this.getName = function() {
+          return this.modelName;
+        };
+        this.getEntityType = function() {
+          return this.afFormCtrl.getEntity(this.modelName).type;
+        };
+        this.getFieldData = function() {
+          var data = this.getData();
+          if (!data.length) {
+            data.push({fields: {}});
+          }
+          return data[0].fields;
+        };
+      }
+    };
+  });
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/af/Form.js b/civicrm/ext/afform/core/ang/af/Form.js
new file mode 100644
index 0000000000000000000000000000000000000000..06f3b9d18342b40908e3d2f4b23125d0238f20a6
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/Form.js
@@ -0,0 +1,64 @@
+(function(angular, $, _) {
+  // Example usage: <af-form ctrl="modelListCtrl">
+  angular.module('af').directive('afForm', function() {
+    return {
+      restrict: 'E',
+      scope: {
+        ctrl: '@'
+      },
+      link: {
+        post: function($scope, $el, $attr) {
+          $scope.myCtrl.loadData();
+        }
+      },
+      controller: function($scope, $routeParams, crmApi4, crmStatus) {
+        var schema = {}, data = {};
+
+        $scope.$parent[$scope.ctrl] = this;
+        // Maybe there's a better way to export this controller to scope?
+        $scope.myCtrl = this;
+
+        this.registerEntity = function registerEntity(entity) {
+          schema[entity.modelName] = entity;
+          data[entity.modelName] = [];
+        };
+        this.getEntity = function getEntity(name) {
+          return schema[name];
+        };
+        // Returns field values for a given entity
+        this.getData = function getData(name) {
+          return data[name];
+        };
+        this.getSchema = function getSchema(name) {
+          return schema[name];
+        };
+        // Returns the 'meta' record ('name', 'description', etc) of the active form.
+        this.getFormMeta = function getFormMeta() {
+          return $scope.$parent.meta;
+        };
+        this.loadData = function() {
+          var toLoad = 0;
+          _.each(schema, function(entity, entityName) {
+            if ($routeParams[entityName] || entity.autofill) {
+              toLoad++;
+            }
+          });
+          if (toLoad) {
+            crmApi4('Afform', 'prefill', {name: this.getFormMeta().name, args: $routeParams})
+              .then(function(result) {
+                _.each(result, function(item) {
+                  data[item.name] = data[item.name] || {};
+                  _.extend(data[item.name], item.values, schema[item.name].data || {});
+                });
+              });
+          }
+        };
+
+        this.submit = function submit() {
+          var submission = crmApi4('Afform', 'submit', {name: this.getFormMeta().name, args: $routeParams, values: data});
+          return crmStatus({start: ts('Saving'), success: ts('Saved')}, submission);
+        };
+      }
+    };
+  });
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/af/Join.js b/civicrm/ext/afform/core/ang/af/Join.js
new file mode 100644
index 0000000000000000000000000000000000000000..16de30079f8cb5eb5bc686ba44ef147fa55ca20a
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/Join.js
@@ -0,0 +1,50 @@
+(function(angular, $, _) {
+  // Example usage: <div af-join="Email" min="1" max="3" add-label="Add email" ><div join-email-default /></div>
+  angular.module('af')
+    .directive('afJoin', function() {
+      return {
+        restrict: 'A',
+        require: ['afJoin', '^^afFieldset', '?^^afRepeatItem'],
+        bindToController: {
+          entity: '@afJoin',
+        },
+        link: function($scope, $el, $attr, ctrls) {
+          var self = ctrls[0];
+          self.afFieldset = ctrls[1];
+          self.repeatItem = ctrls[2];
+        },
+        controller: function($scope) {
+          var self = this;
+          this.getEntityType = function() {
+            return this.entity;
+          };
+          this.getData = function() {
+            var data, fieldsetData;
+            if (self.repeatItem) {
+              data = self.repeatItem.item;
+            } else {
+              fieldsetData = self.afFieldset.getData();
+              if (!fieldsetData.length) {
+                fieldsetData.push({fields: {}, joins: {}});
+              }
+              data = fieldsetData[0];
+            }
+            if (!data.joins) {
+              data.joins = {};
+            }
+            if (!data.joins[self.entity]) {
+              data.joins[self.entity] = [];
+            }
+            return data.joins[self.entity];
+          };
+          this.getFieldData = function() {
+            var data = this.getData();
+            if (!data.length) {
+              data.push({});
+            }
+            return data[0];
+          };
+        }
+      };
+    });
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/af/Repeat.js b/civicrm/ext/afform/core/ang/af/Repeat.js
new file mode 100644
index 0000000000000000000000000000000000000000..2055f7edce47ba85dd3cd4c052ed1837775525a5
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/Repeat.js
@@ -0,0 +1,80 @@
+(function(angular, $, _) {
+  // Example usage: <div af-repeat="Email" min="1" max="3" add-label="Add email" ><div repeat-email-default /></div>
+  angular.module('af')
+    .directive('afRepeat', function() {
+      return {
+        restrict: 'A',
+        require: ['?afFieldset', '?afJoin'],
+        transclude: true,
+        scope: {
+          min: '=',
+          max: '=',
+          addLabel: '@afRepeat',
+          addIcon: '@'
+        },
+        templateUrl: '~/af/afRepeat.html',
+        link: function($scope, $el, $attr, ctrls) {
+          $scope.afFieldset = ctrls[0];
+          $scope.afJoin = ctrls[1];
+        },
+        controller: function($scope) {
+          this.getItems = $scope.getItems = function() {
+            var data = getEntityController().getData();
+            while ($scope.min && data.length < $scope.min) {
+              data.push(getRepeatType() === 'join' ? {} : {fields: {}, joins: {}});
+            }
+            return data;
+          };
+
+          function getRepeatType() {
+            return $scope.afJoin ? 'join' : 'fieldset';
+          }
+          this.getRepeatType = getRepeatType;
+
+          function getEntityController() {
+            return $scope.afJoin || $scope.afFieldset;
+          }
+          this.getEntityController = getEntityController;
+
+          $scope.addItem = function() {
+            $scope.getItems().push(getRepeatType() === 'join' ? {} : {fields: {}});
+          };
+
+          $scope.removeItem = function(index) {
+            $scope.getItems().splice(index, 1);
+          };
+
+          $scope.canAdd = function() {
+            return !$scope.max || $scope.getItems().length < $scope.max;
+          };
+
+          $scope.canRemove = function() {
+            return !$scope.min || $scope.getItems().length > $scope.min;
+          };
+        }
+      };
+    })
+    .directive('afRepeatItem', function() {
+      return {
+        restrict: 'A',
+        require: ['afRepeatItem', '^^afRepeat'],
+        bindToController: {
+          item: '=afRepeatItem',
+          repeatIndex: '='
+        },
+        link: function($scope, $el, $attr, ctrls) {
+          var self = ctrls[0];
+          self.afRepeat = ctrls[1];
+        },
+        controller: function($scope) {
+          this.getFieldData = function() {
+            return this.afRepeat.getRepeatType() === 'join' ? this.item : this.item.fields;
+          };
+
+          this.getEntityType = function() {
+            return this.afRepeat.getEntityController().getEntityType();
+          };
+        }
+      };
+    });
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/af/afField.html b/civicrm/ext/afform/core/ang/af/afField.html
new file mode 100644
index 0000000000000000000000000000000000000000..709a7cbefba61964784cfa81223e11ed9cfe8a61
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/afField.html
@@ -0,0 +1,6 @@
+<label class="crm-af-field-label" ng-if="defn.title" for="{{ fieldId }}">
+  {{ defn.title }}
+</label>
+<p class="crm-af-field-help-pre" ng-if="defn.help_pre">{{ defn.help_pre }}</p>
+<div class="crm-af-field" ng-include="'~/af/fields/' + defn.input_type + '.html'"></div>
+<p class="crm-af-field-help-post" ng-if="defn.help_post">{{ defn.help_post }}</p>
diff --git a/civicrm/ext/afform/core/ang/af/afRepeat.html b/civicrm/ext/afform/core/ang/af/afRepeat.html
new file mode 100644
index 0000000000000000000000000000000000000000..7c7ef36eb1ef4603ff864fa4d11892e1e4e3d41a
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/afRepeat.html
@@ -0,0 +1,5 @@
+<div af-repeat-item="item" repeat-index="$index" ng-repeat="item in getItems()">
+  <ng-transclude />
+  <button crm-icon="fa-ban" class="btn btn-xs af-repeat-remove-btn" ng-if="canRemove()" ng-click="removeItem($index)"></button>
+</div>
+<button crm-icon="{{ addIcon || 'fa-plus' }}" class="btn btn-sm af-repeat-add-btn" ng-if="canAdd()" ng-click="addItem()">{{ addLabel }}</button>
diff --git a/civicrm/ext/afform/core/ang/af/fields/ChainSelect.html b/civicrm/ext/afform/core/ang/af/fields/ChainSelect.html
new file mode 100644
index 0000000000000000000000000000000000000000..a3cb1e2abd7b480b34c306ad7571167e147ef129
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/fields/ChainSelect.html
@@ -0,0 +1 @@
+<input crm-ui-select="{data: select2Options, multiple: defn.input_attrs.multiple, placeholder: defn.input_attrs.placeholder}" id="{{ fieldId }}" ng-model="dataProvider.getFieldData()[fieldName]" />
diff --git a/civicrm/ext/afform/core/ang/af/fields/CheckBox.html b/civicrm/ext/afform/core/ang/af/fields/CheckBox.html
new file mode 100644
index 0000000000000000000000000000000000000000..8788043cb98d54482367d0ad04c8a988cf529a5e
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/fields/CheckBox.html
@@ -0,0 +1,7 @@
+<ul class="crm-checkbox-list" id="{{ fieldId }}" ng-if="defn.options">
+  <li ng-repeat="opt in defn.options track by opt.key" >
+    <input type="checkbox" checklist-model="dataProvider.getFieldData()[fieldName]" id="{{ fieldId + opt.key }}" checklist-value="opt.key" />
+    <label for="{{ fieldId + opt.key }}">{{ opt.label }}</label>
+  </li>
+</ul>
+<input type="checkbox" ng-if="!defn.options" id="{{ fieldId }}" ng-model="dataProvider.getFieldData()[fieldName]" />
diff --git a/civicrm/ext/afform/core/ang/af/fields/Date.html b/civicrm/ext/afform/core/ang/af/fields/Date.html
new file mode 100644
index 0000000000000000000000000000000000000000..5e7d7c21d7aa70dfd4e8ec78515b2fa8c11dfe5c
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/fields/Date.html
@@ -0,0 +1 @@
+<input crm-ui-datepicker="defn.input_attrs" id="{{ fieldId }}" ng-model="dataProvider.getFieldData()[fieldName]" />
diff --git a/civicrm/ext/afform/core/ang/af/fields/Number.html b/civicrm/ext/afform/core/ang/af/fields/Number.html
new file mode 100644
index 0000000000000000000000000000000000000000..111549c786546156d7c10ec05e84c4b92c7bba88
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/fields/Number.html
@@ -0,0 +1 @@
+<input class="crm-form-text" type="number" id="{{ fieldId }}" ng-model="dataProvider.getFieldData()[fieldName]" placeholder="{{ defn.input_attrs.placeholder }}" />
diff --git a/civicrm/ext/afform/core/ang/af/fields/Radio.html b/civicrm/ext/afform/core/ang/af/fields/Radio.html
new file mode 100644
index 0000000000000000000000000000000000000000..7237a698c5119c1afa89c687cbc4103b4b1f9436
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/fields/Radio.html
@@ -0,0 +1,4 @@
+<label ng-repeat="opt in getOptions() track by opt.key" >
+  <input class="crm-form-radio" type="radio" ng-model="dataProvider.getFieldData()[fieldName]" ng-value="opt.key" />
+  {{ opt.label }}
+</label>
diff --git a/civicrm/ext/afform/core/ang/af/fields/RichTextEditor.html b/civicrm/ext/afform/core/ang/af/fields/RichTextEditor.html
new file mode 100644
index 0000000000000000000000000000000000000000..e2dbc6e9d1d3abdc687c87ea3c93568eb4e30ee5
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/fields/RichTextEditor.html
@@ -0,0 +1 @@
+<textarea crm-ui-richtext id="{{ fieldId }}" ng-model="dataProvider.getFieldData()[fieldName]" ></textarea>
diff --git a/civicrm/ext/afform/core/ang/af/fields/Select.html b/civicrm/ext/afform/core/ang/af/fields/Select.html
new file mode 100644
index 0000000000000000000000000000000000000000..a3cb1e2abd7b480b34c306ad7571167e147ef129
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/fields/Select.html
@@ -0,0 +1 @@
+<input crm-ui-select="{data: select2Options, multiple: defn.input_attrs.multiple, placeholder: defn.input_attrs.placeholder}" id="{{ fieldId }}" ng-model="dataProvider.getFieldData()[fieldName]" />
diff --git a/civicrm/ext/afform/core/ang/af/fields/Text.html b/civicrm/ext/afform/core/ang/af/fields/Text.html
new file mode 100644
index 0000000000000000000000000000000000000000..008b3441c693525ee859a1eede5d70db0dc73194
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/fields/Text.html
@@ -0,0 +1 @@
+<input class="crm-form-text" type="text" id="{{ fieldId }}" ng-model="dataProvider.getFieldData()[fieldName]" placeholder="{{ defn.input_attrs.placeholder }}" />
diff --git a/civicrm/ext/afform/core/ang/af/fields/TextArea.html b/civicrm/ext/afform/core/ang/af/fields/TextArea.html
new file mode 100644
index 0000000000000000000000000000000000000000..66a2c5a37509f4b9bd0f73af6c0e34499a7e1a8b
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/af/fields/TextArea.html
@@ -0,0 +1 @@
+<textarea class="crm-form-textarea" id="{{ fieldId }}" ng-model="dataProvider.getFieldData()[fieldName]" ></textarea>
diff --git a/civicrm/ext/afform/core/ang/afCore.ang.php b/civicrm/ext/afform/core/ang/afCore.ang.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e9f4c505ec7c101573d7140823325be0ef71fdd
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afCore.ang.php
@@ -0,0 +1,17 @@
+<?php
+// This file declares an Angular module which can be autoloaded
+// in CiviCRM. See also:
+// http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_angularModules
+
+return [
+  'js' => [
+    'ang/afCore.js',
+    'ang/afCore/*.js',
+    'ang/afCore/*/*.js',
+  ],
+  'css' => ['ang/afCore.css'],
+  'requires' => ['crmUi', 'crmUtil', 'api4', 'checklist-model'],
+  'partials' => ['ang/afCore'],
+  'settings' => [],
+  'basePages' => [],
+];
diff --git a/civicrm/ext/afform/core/ang/afCore.css b/civicrm/ext/afform/core/ang/afCore.css
new file mode 100644
index 0000000000000000000000000000000000000000..59070b0df50e1858e179b29bbdc8a49f28262e2b
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afCore.css
@@ -0,0 +1,29 @@
+.af-api4-action-running {
+    cursor: not-allowed;
+    color: black;
+}
+a.af-api4-action-idle {
+    cursor: pointer;
+}
+
+.af-container.af-layout-cols {
+    display: flex;
+}
+.af-container.af-layout-cols > * {
+    flex: 1;
+}
+.af-container.af-layout-inline > * {
+    display: inline-block;
+    margin-right: .5em;
+    vertical-align: bottom;
+}
+
+[af-repeat-item] {
+  position: relative;
+}
+#bootstrap-theme [af-repeat-item] .af-repeat-remove-btn {
+  min-width: 30px;
+  position: absolute;
+  top: 0;
+  right: 0;
+}
diff --git a/civicrm/ext/afform/core/ang/afCore.js b/civicrm/ext/afform/core/ang/afCore.js
new file mode 100644
index 0000000000000000000000000000000000000000..7d43c99dccb629773aac3b7c15b9fc2f641cc869
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afCore.js
@@ -0,0 +1,25 @@
+(function(angular, $, _) {
+  // Declare a list of dependencies.
+  angular.module('afCore', CRM.angRequires('afCore'));
+
+  // Use `afCoreDirective(string name)` to generate an AngularJS directive.
+  angular.module('afCore').service('afCoreDirective', function($routeParams, crmApi4, crmStatus, crmUiAlert) {
+    return function(camelName, meta, d) {
+      d.restrict = 'AE';
+      d.scope = {};
+      d.scope.options = '=' + camelName;
+      d.link = {
+        pre: function($scope, $el, $attr) {
+          $scope.ts = CRM.ts(camelName);
+          $scope.routeParams = $routeParams;
+          $scope.meta = meta;
+          $scope.crmApi4 = crmApi4;
+          $scope.crmStatus = crmStatus;
+          $scope.crmUiAlert = crmUiAlert;
+          $scope.crmUrl = CRM.url;
+        }
+      };
+      return d;
+    };
+  });
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/afCore/Api3Ctrl.js b/civicrm/ext/afform/core/ang/afCore/Api3Ctrl.js
new file mode 100644
index 0000000000000000000000000000000000000000..98ce88d25d8c9560c7e9911cdd2f88de7893d33c
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afCore/Api3Ctrl.js
@@ -0,0 +1,51 @@
+(function(angular, $, _) {
+
+  angular.module('afCore').directive('afApi3Ctrl', function() {
+    return {
+      restrict: 'EA',
+      scope: {
+        afApi3Ctrl: '=',
+        afApi3: '@',
+        afApi3Refresh: '@',
+        onRefresh: '@'
+      },
+      controllerAs: 'afApi3Ctrl',
+      controller: function($scope, $parse, crmThrottle, crmApi) {
+        var ctrl = this;
+
+        // CONSIDER: Trade-offs of upfront vs ongoing evaluation.
+        var parts = $parse($scope.afApi3)($scope.$parent);
+        ctrl.entity = parts[0];
+        ctrl.action = parts[1];
+        ctrl.params = parts[2];
+        ctrl.result = {};
+        ctrl.loading = ctrl.firstLoad = true;
+
+        ctrl.refresh = function refresh() {
+          ctrl.loading = true;
+          crmThrottle(function () {
+            return crmApi(ctrl.entity, ctrl.action, ctrl.params)
+              .then(function (response) {
+                ctrl.result = response;
+                ctrl.loading = ctrl.firstLoad = false;
+                if ($scope.onRefresh) {
+                  $scope.$parent.$eval($scope.onRefresh, ctrl);
+                }
+              });
+          });
+        };
+
+        $scope.afApi3Ctrl = this;
+
+        var mode = $scope.afApi3Refresh ? $scope.afApi3Refresh : 'auto';
+        switch (mode) {
+          case 'auto': $scope.$watchCollection('afApi3Ctrl.params', ctrl.refresh); break;
+          case 'init': ctrl.refresh(); break;
+          case 'manual': break;
+          default: throw 'Unrecognized refresh mode: '+ mode;
+        }
+      }
+    };
+  });
+
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/afCore/Api3Ctrl.md b/civicrm/ext/afform/core/ang/afCore/Api3Ctrl.md
new file mode 100644
index 0000000000000000000000000000000000000000..cfb040d6a17eae3c849d67605b5a98aba2fa9a60
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afCore/Api3Ctrl.md
@@ -0,0 +1,73 @@
+# af-api3-ctrl
+
+This directive is designed for querying and displaying data from APIv3. Each API call is represented with an object like this:
+
+```js
+{
+  entity: 'Contact',
+  action: 'get',
+  params: {display_name: 'alice'},
+  result: {
+    is_error: 0,
+    count: 10,
+    values: {...}
+  },
+  refresh: function(){...}
+}
+```
+
+You can initialize this object using `<af-api3-ctrl>` and `<af-api3>`, as in:
+
+```html
+<div
+  af-api3-ctrl="apiData"
+  af-api3="['Contact','get', {display_name: ''}]">
+
+    <div crm-ui-debug="apiData"></div>
+
+    <div>
+      Filter by name: <input ng-model="apiData.params.display_name" />
+    </div>
+
+    <ul>
+      <li ng-repeat="value in apiData.result.values">{{value.display_name}}</li>
+    </ul>
+</div>
+```
+
+By default, the API call will refresh its results automatically - as soon as the filter parameters change.
+
+If you'd rather wait and trigger the refresh another way, then set the `af-api3-refresh` policy to `init` or `manual`. Don't forget to fire the refresh some other way, such as `ng-click`:
+
+```html
+<div
+  af-api3-ctrl="apiData"
+  af-api3="['Contact','get', {display_name: ''}]"
+  af-api3-refresh="init">
+
+    <div crm-ui-debug="apiData"></div>
+
+    <div>
+      Filter by name: <input ng-model="apiData.params.display_name" />
+      <button ng-click="apiData.refresh()">Search</button>
+    </div>
+
+    <ul>
+      <li ng-repeat="value in apiData.result.values">{{value.display_name}}</li>
+    </ul>
+
+</div>
+```
+
+And you conditionally execute some logic whenever a refresh occurs -- use
+`on-refresh`. Within the scope of this statement, you have access to the
+properties of the API object (`entity`, `action`, `params`, `result`).
+
+```html
+<div
+  af-api3-ctrl="apiData"
+  af-api3="['Contact','get', {display_name: ''}]"
+  on-refresh="doSomething(result)">
+  ...
+</div>
+```
diff --git a/civicrm/ext/afform/core/ang/afCore/Api4Action.js b/civicrm/ext/afform/core/ang/afCore/Api4Action.js
new file mode 100644
index 0000000000000000000000000000000000000000..20c47c824a58c6308abf59da02c55761eabd98fb
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afCore/Api4Action.js
@@ -0,0 +1,31 @@
+(function(angular, $, _) {
+
+  angular.module('afCore').directive('afApi4Action', function($parse, crmStatus, crmApi4) {
+    return {
+      restrict: 'A',
+      scope: {
+        afApi4Action: '@',
+        afApi4StartMsg: '=',
+        afApi4ErrorMsg: '=',
+        afApi4SuccessMsg: '=',
+        afApi4Success: '@',
+        onError: '@'
+      },
+      link: function($scope, $el, $attr) {
+        var ts = CRM.ts(null);
+        function running(x) {$el.toggleClass('af-api4-action-running', x).toggleClass('af-api4-action-idle', !x);}
+        running(false);
+        $el.click(function(){
+          var parts = $parse($scope.afApi4Action)($scope.$parent);
+          var msgs = {start: $scope.afApi4StartMsg || ts('Submitting...'), success: $scope.afApi4SuccessMsg, error: $scope.afApi4ErrorMsg};
+          running(true);
+          crmStatus(msgs, crmApi4(parts[0], parts[1], parts[2]))
+            .finally(function(){running(false);})
+            .then(function(response){$scope.$parent.$eval($scope.afApi4Success, {response: response});})
+            .catch(function(error){$scope.$parent.$eval($scope.onError, {error: error});});
+        });
+      }
+    };
+  });
+
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/afCore/Api4Action.md b/civicrm/ext/afform/core/ang/afCore/Api4Action.md
new file mode 100644
index 0000000000000000000000000000000000000000..7d62d740ff61b3b97effbc93b1b115fe978026c7
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afCore/Api4Action.md
@@ -0,0 +1,34 @@
+# af-api4-action
+
+This directive is designed for invoking an action via APIv4. Much like
+`ng-click`, one would use `api4-action` to add behavior to a button or link.
+
+```html
+<button
+  af-api4-action="['Contact','delete',{where:['id','=','100]}}]"
+  >Delete</button>
+```
+
+### Options
+
+Additional options may be used to manipulate the status messages and to
+trigger further actions on failure or success.
+
+```html
+<button
+  af-api4-action="['Contact','delete',{where:['id','=','100]}}]"
+  af-api4-start-msg="ts('Deleting...')"
+  af-api4-success-msg="ts('Deleted')"
+  af-api4-success="crmUiAlert({text:'Received ' + response.length + ' items'})"
+  af-api4-error="crmUiAlert({text:'Failure: ' + error})"
+>Delete</button>
+<!-- Automated flag with af-api4-action-{running -->
+```
+
+### Styling
+
+The `af-api4-action` element will have the follow classes
+toggled automatically:
+
+* `af-api4-action-running`: User has clicked to fire the action, and action is still running.
+* `af-api4-action-idle`: The action is not running.
diff --git a/civicrm/ext/afform/core/ang/afCore/Api4Ctrl.js b/civicrm/ext/afform/core/ang/afCore/Api4Ctrl.js
new file mode 100644
index 0000000000000000000000000000000000000000..48fcbf4fb5f3570155552528972a0af07b6b75a8
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afCore/Api4Ctrl.js
@@ -0,0 +1,58 @@
+(function(angular, $, _) {
+
+  angular.module('afCore').directive('afApi4Ctrl', function() {
+    return {
+      restrict: 'EA',
+      scope: {
+        afApi4Ctrl: '=',
+        afApi4: '@',
+        afApi4Refresh: '@',
+        onRefresh: '@'
+      },
+      controllerAs: 'afApi4Ctrl',
+      controller: function($scope, $parse, crmThrottle, crmApi4) {
+        var ctrl = this;
+
+        // CONSIDER: Trade-offs of upfront vs ongoing evaluation.
+        var parts = $parse($scope.afApi4)($scope.$parent);
+        ctrl.entity = parts[0];
+        ctrl.action = parts[1];
+        ctrl.params = parts[2];
+        ctrl.index = parts[3];
+        ctrl.result = {};
+        ctrl.loading = ctrl.firstLoad = true;
+
+        ctrl.refresh = function refresh() {
+          ctrl.loading = true;
+          crmThrottle(function () {
+            return crmApi4(ctrl.entity, ctrl.action, ctrl.params, ctrl.index)
+              .then(function (response) {
+                ctrl.result = response;
+                ctrl.loading = ctrl.firstLoad = false;
+                if ($scope.onRefresh) {
+                  $scope.$parent.$eval($scope.onRefresh, ctrl);
+                }
+              });
+          });
+        };
+
+        $scope.afApi4Ctrl = this;
+
+        var mode = $scope.afApi4Refresh ? $scope.afApi4Refresh : 'auto';
+        switch (mode) {
+          case 'auto':
+            // Note: Do NOT watch '.result' or '.loading' - causes infinite reloads.
+            $scope.$watchCollection('afApi4Ctrl.params', ctrl.refresh, true);
+            $scope.$watch('afApi4Ctrl.index', ctrl.refresh, true);
+            $scope.$watch('afApi4Ctrl.entity', ctrl.refresh, true);
+            $scope.$watch('afApi4Ctrl.action', ctrl.refresh, true);
+            break;
+          case 'init': ctrl.refresh(); break;
+          case 'manual': break;
+          default: throw 'Unrecognized refresh mode: '+ mode;
+        }
+      }
+    };
+  });
+
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/afblockNameHousehold.aff.html b/civicrm/ext/afform/core/ang/afblockNameHousehold.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..a4f7a4cb7a7e1e4325c302f6d32954402bf582bc
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afblockNameHousehold.aff.html
@@ -0,0 +1,4 @@
+<div class="af-container af-layout-inline">
+  <af-field name="household_name" />
+  <af-field name="nick_name" />
+</div>
diff --git a/civicrm/ext/afform/core/ang/afblockNameHousehold.aff.json b/civicrm/ext/afform/core/ang/afblockNameHousehold.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..dc0847fc135de740358d7b517322581513ad553e
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afblockNameHousehold.aff.json
@@ -0,0 +1,4 @@
+{
+  "title": "Household Name (default)",
+  "block": "Household"
+}
diff --git a/civicrm/ext/afform/core/ang/afblockNameIndividual.aff.html b/civicrm/ext/afform/core/ang/afblockNameIndividual.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..1142cd9d33b34caebcd517aaf1cc6d86ae87bf53
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afblockNameIndividual.aff.html
@@ -0,0 +1,5 @@
+<div class="af-container af-layout-inline">
+  <af-field name="first_name" />
+  <af-field name="middle_name" />
+  <af-field name="last_name" />
+</div>
diff --git a/civicrm/ext/afform/core/ang/afblockNameIndividual.aff.json b/civicrm/ext/afform/core/ang/afblockNameIndividual.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..3d05402fb0885a9539830d9068a5fb39a0bc38a4
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afblockNameIndividual.aff.json
@@ -0,0 +1,4 @@
+{
+  "title": "Individual Name (default)",
+  "block": "Individual"
+}
diff --git a/civicrm/ext/afform/core/ang/afblockNameOrganization.aff.html b/civicrm/ext/afform/core/ang/afblockNameOrganization.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..6ab5eb2b49d0795ee1a8d7e64a48bce9c0275edb
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afblockNameOrganization.aff.html
@@ -0,0 +1,5 @@
+<div class="af-container af-layout-inline">
+  <af-field name="organization_name" />
+  <af-field name="legal_name" />
+  <af-field name="nick_name" />
+</div>
diff --git a/civicrm/ext/afform/core/ang/afblockNameOrganization.aff.json b/civicrm/ext/afform/core/ang/afblockNameOrganization.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..34ab2fd53d6b31a19e972aacf417f5e39c944aa3
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afblockNameOrganization.aff.json
@@ -0,0 +1,4 @@
+{
+  "title": "Organization Name (default)",
+  "block": "Organization"
+}
diff --git a/civicrm/ext/afform/core/ang/afformStandalone.ang.php b/civicrm/ext/afform/core/ang/afformStandalone.ang.php
new file mode 100644
index 0000000000000000000000000000000000000000..6f5f89f8a01306099780d3e9b00c6df890df22ae
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afformStandalone.ang.php
@@ -0,0 +1,13 @@
+<?php
+// This file declares an Angular module which can be autoloaded
+// in CiviCRM. See also:
+// http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_angularModules
+
+return [
+  'js' => [
+    'ang/afformStandalone.js',
+  ],
+  'css' => [],
+  'settings' => [],
+  'requires' => ['ngRoute'],
+];
diff --git a/civicrm/ext/afform/core/ang/afformStandalone.js b/civicrm/ext/afform/core/ang/afformStandalone.js
new file mode 100644
index 0000000000000000000000000000000000000000..4d65f38090659d2461aef0a3b3b6591c72c74453
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afformStandalone.js
@@ -0,0 +1,16 @@
+(function(angular, $, _) {
+  // Declare a list of dependencies.
+  angular.module('afformStandalone', CRM.angRequires('afformStandalone'));
+
+  angular.module('afformStandalone', CRM.angular.modules)
+    .config(function($routeProvider) {
+      $routeProvider.when('/', {
+        controller: 'AfformStandalonePageCtrl',
+        template: function() {
+          return '<div ' + CRM.afform.open + '="{}"></div>';
+        }
+      });
+    })
+    .controller('AfformStandalonePageCtrl', function($scope) {});
+
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/core/ang/afjoinAddressDefault.aff.html b/civicrm/ext/afform/core/ang/afjoinAddressDefault.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..ddb1f017ed45524c6a38492ef5b914d0715e6cbf
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinAddressDefault.aff.html
@@ -0,0 +1,11 @@
+<div class="af-container af-layout-inline">
+  <af-field name="street_address" />
+  <af-field name="location_type_id" />
+  <af-field name="is_primary" />
+</div>
+<div class="af-container af-layout-inline">
+  <af-field name="city" />
+  <af-field name="state_province_id" />
+  <af-field name="country_id" />
+  <af-field name="postal_code" />
+</div>
diff --git a/civicrm/ext/afform/core/ang/afjoinAddressDefault.aff.json b/civicrm/ext/afform/core/ang/afjoinAddressDefault.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..2a26888f4a1fb133a9b5fa39250f9882c3756942
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinAddressDefault.aff.json
@@ -0,0 +1,6 @@
+{
+  "title": "Address Block (default)",
+  "block": "Contact",
+  "join": "Address",
+  "repeat": true
+}
diff --git a/civicrm/ext/afform/core/ang/afjoinEmailDefault.aff.html b/civicrm/ext/afform/core/ang/afjoinEmailDefault.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..9b1ed00145c198ad5b4389bdf1d145cf22482210
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinEmailDefault.aff.html
@@ -0,0 +1,5 @@
+<div class="af-container af-layout-inline">
+  <af-field name="email" />
+  <af-field name="location_type_id" />
+  <af-field name="is_primary" />
+</div>
diff --git a/civicrm/ext/afform/core/ang/afjoinEmailDefault.aff.json b/civicrm/ext/afform/core/ang/afjoinEmailDefault.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..b09da6a075b7cd4055fe5af11dec24d4c40486a9
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinEmailDefault.aff.json
@@ -0,0 +1,6 @@
+{
+  "title": "Email (default)",
+  "block": "Contact",
+  "join": "Email",
+  "repeat": true
+}
diff --git a/civicrm/ext/afform/core/ang/afjoinIMDefault.aff.html b/civicrm/ext/afform/core/ang/afjoinIMDefault.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..decf4c7af1ab1871cfd7f4540f814e2c74366961
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinIMDefault.aff.html
@@ -0,0 +1,6 @@
+<div class="af-container af-layout-inline">
+  <af-field name="name" />
+  <af-field name="location_type_id" />
+  <af-field name="provider_id" />
+  <af-field name="is_primary" />
+</div>
diff --git a/civicrm/ext/afform/core/ang/afjoinIMDefault.aff.json b/civicrm/ext/afform/core/ang/afjoinIMDefault.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..2ef6b577cba5c25fe11e0a3e34e514ac75c2a206
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinIMDefault.aff.json
@@ -0,0 +1,6 @@
+{
+  "title": "IM (default)",
+  "block": "Contact",
+  "join": "IM",
+  "repeat": true
+}
diff --git a/civicrm/ext/afform/core/ang/afjoinPhoneDefault.aff.html b/civicrm/ext/afform/core/ang/afjoinPhoneDefault.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..9d9ebc5108541bc9b2859dfc073bc69c0e18c691
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinPhoneDefault.aff.html
@@ -0,0 +1,6 @@
+<div class="af-container af-layout-inline">
+  <af-field name="phone" />
+  <af-field name="location_type_id" />
+  <af-field name="phone_type_id" />
+  <af-field name="is_primary" />
+</div>
diff --git a/civicrm/ext/afform/core/ang/afjoinPhoneDefault.aff.json b/civicrm/ext/afform/core/ang/afjoinPhoneDefault.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..c40af8dcb2ca8567b96dca37ed940221d083ffc1
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinPhoneDefault.aff.json
@@ -0,0 +1,6 @@
+{
+  "title": "Phone (default)",
+  "block": "Contact",
+  "join": "Phone",
+  "repeat": true
+}
diff --git a/civicrm/ext/afform/core/ang/afjoinWebsiteDefault.aff.html b/civicrm/ext/afform/core/ang/afjoinWebsiteDefault.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..f357a16f709e48c779eb7763e8f076748f67cbb2
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinWebsiteDefault.aff.html
@@ -0,0 +1,4 @@
+<div class="af-container af-layout-inline">
+  <af-field name="url" />
+  <af-field name="website_type_id" />
+</div>
diff --git a/civicrm/ext/afform/core/ang/afjoinWebsiteDefault.aff.json b/civicrm/ext/afform/core/ang/afjoinWebsiteDefault.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..4819bc92d84870e7e2b89c67da09fd34ac927d7f
--- /dev/null
+++ b/civicrm/ext/afform/core/ang/afjoinWebsiteDefault.aff.json
@@ -0,0 +1,6 @@
+{
+  "title": "Website (default)",
+  "block": "Contact",
+  "join": "Website",
+  "repeat": true
+}
diff --git a/civicrm/ext/afform/core/info.xml b/civicrm/ext/afform/core/info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a0c34129e1b8b56fa75fb98e1485ded551d6a471
--- /dev/null
+++ b/civicrm/ext/afform/core/info.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<extension key="org.civicrm.afform" type="module">
+  <file>afform</file>
+  <name>Afform: Core Runtime</name>
+  <description>Afform is the Affable Administrative AngularJS Form Framework</description>
+  <license>AGPL-3.0</license>
+  <maintainer>
+    <author>CiviCRM LLC</author>
+    <email>info@civicrm.org</email>
+  </maintainer>
+  <urls>
+    <url desc="Main Extension Page">http://FIXME</url>
+    <url desc="Documentation">http://FIXME</url>
+    <url desc="Support">http://FIXME</url>
+    <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
+  </urls>
+  <releaseDate>2020-01-09</releaseDate>
+  <version>0.5</version>
+  <develStage>alpha</develStage>
+  <compatibility>
+    <ver>5.23</ver>
+  </compatibility>
+  <requires>
+    <ext version="~4.5">org.civicrm.api4</ext>
+  </requires>
+  <comments>Core functionality for CiviCRM Afforms</comments>
+  <civix>
+    <namespace>CRM/Afform</namespace>
+  </civix>
+  <classloader>
+    <psr4 prefix="Civi\" path="Civi" />
+  </classloader>
+</extension>
diff --git a/civicrm/ext/afform/core/phpunit.xml.dist b/civicrm/ext/afform/core/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..0f9f25d307a9cd62aa26edb1928ddf2de81d249a
--- /dev/null
+++ b/civicrm/ext/afform/core/phpunit.xml.dist
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="false" bootstrap="tests/phpunit/bootstrap.php">
+  <testsuites>
+    <testsuite name="My Test Suite">
+      <directory>./tests/phpunit</directory>
+    </testsuite>
+  </testsuites>
+  <filter>
+    <whitelist>
+      <directory suffix=".php">./</directory>
+    </whitelist>
+  </filter>
+  <listeners>
+    <listener class="Civi\Test\CiviTestListener">
+      <arguments/>
+    </listener>
+  </listeners>
+</phpunit>
diff --git a/civicrm/ext/afform/core/templates/CRM/Afform/Page/AfformBase.tpl b/civicrm/ext/afform/core/templates/CRM/Afform/Page/AfformBase.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..0637db770d1e801e806a615620e6e57a639f1aaf
--- /dev/null
+++ b/civicrm/ext/afform/core/templates/CRM/Afform/Page/AfformBase.tpl
@@ -0,0 +1,5 @@
+{literal}
+  <div ng-app="afformStandalone">
+    <form ng-view></form>
+  </div>
+{/literal}
diff --git a/civicrm/ext/afform/core/templates/afform/AfformAngularModule.tpl b/civicrm/ext/afform/core/templates/afform/AfformAngularModule.tpl
new file mode 100644
index 0000000000000000000000000000000000000000..e4bc0ca8aa0806cbacd0e7bdf69b1c07a4e4aceb
--- /dev/null
+++ b/civicrm/ext/afform/core/templates/afform/AfformAngularModule.tpl
@@ -0,0 +1,16 @@
+{* This takes an $afform and generates an AngularJS module.
+
+ @param string $afform.camel     The full camel-case name of the AngularJS module being created
+ @param array  $afform.meta      Relevant form metadata
+ @param string $afform.layout    The template content (HTML)
+ *}
+{literal}
+(function(angular, $, _) {
+  angular.module('{/literal}{$afform.camel}{literal}', CRM.angRequires('{/literal}{$afform.camel}{literal}'));
+  angular.module('{/literal}{$afform.camel}{literal}').directive('{/literal}{$afform.camel}{literal}', function(afCoreDirective) {
+    return afCoreDirective({/literal}{$afform.camel|json}, {$afform.meta|@json_encode}{literal}, {
+      templateUrl: {/literal}{$afform.templateUrl|json}{literal}
+    });
+  });
+})(angular, CRM.$, CRM._);
+{/literal}
diff --git a/civicrm/ext/afform/core/tests/phpunit/CRM/Afform/UtilTest.php b/civicrm/ext/afform/core/tests/phpunit/CRM/Afform/UtilTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e3884febf7c48befba7c97f3d002636ce62e8819
--- /dev/null
+++ b/civicrm/ext/afform/core/tests/phpunit/CRM/Afform/UtilTest.php
@@ -0,0 +1,64 @@
+<?php
+
+use Civi\Test\HeadlessInterface;
+use Civi\Test\TransactionalInterface;
+
+/**
+ * @group headless
+ */
+class CRM_Afform_UtilTest extends \PHPUnit\Framework\TestCase implements HeadlessInterface, TransactionalInterface {
+
+  /**
+   * Civi\Test has many helpers, like install(), uninstall(), sql(), and sqlFile().
+   *
+   * See: https://github.com/civicrm/org.civicrm.testapalooza/blob/master/civi-test.md
+   *
+   * @throws \CRM_Extension_Exception_ParseException
+   */
+  public function setUpHeadless() {
+    return \Civi\Test::headless()
+      ->installMe(__DIR__)
+      ->install(version_compare(CRM_Utils_System::version(), '5.19.alpha1', '<') ? ['org.civicrm.api4'] : [])
+      ->apply();
+  }
+
+  public function getNameExamples() {
+    $exs = [];
+    $exs[] = ['ab-cd-ef', 'camel', 'abCdEf'];
+    $exs[] = ['abCd', 'camel', 'abCd'];
+    $exs[] = ['AbCd', 'camel', 'abCd'];
+    $exs[] = ['ab-cd', 'dash', 'ab-cd'];
+    $exs[] = ['abCd', 'dash', 'ab-cd'];
+    $exs[] = ['AbCd', 'dash', 'ab-cd'];
+
+    $exs[] = ['ab-cd-ef23', 'camel', 'abCdEf23'];
+    $exs[] = ['abCd23', 'camel', 'abCd23'];
+    $exs[] = ['AbCd23', 'camel', 'abCd23'];
+    $exs[] = ['ab-cd23', 'dash', 'ab-cd23'];
+    $exs[] = ['abCd23', 'dash', 'ab-cd23'];
+    $exs[] = ['AbCd23', 'dash', 'ab-cd23'];
+
+    $exs[] = ['Custom_fooBar', 'camel', 'customFooBar'];
+    $exs[] = ['Custom_Foo__Bar', 'camel', 'customFooBar'];
+    $exs[] = ['Custom Foo_ _Bar', 'camel', 'customFooBar'];
+    $exs[] = ['Custom_fooBar', 'dash', 'custom-foo-bar'];
+    $exs[] = ['Custom_Foo__Bar', 'dash', 'custom-foo-bar'];
+    $exs[] = ['Custom Foo_ _Bar', 'dash', 'custom-foo-bar'];
+
+    return $exs;
+  }
+
+  /**
+   * @param $inputFileName
+   * @param $toFormat
+   * @param $expected
+   *
+   * @dataProvider getNameExamples
+   * @throws \Exception
+   */
+  public function testNameConversion($inputFileName, $toFormat, $expected) {
+    $actual = _afform_angular_module_name($inputFileName, $toFormat);
+    $this->assertEquals($expected, $actual);
+  }
+
+}
diff --git a/civicrm/ext/afform/core/tests/phpunit/Civi/Afform/FilterTest.php b/civicrm/ext/afform/core/tests/phpunit/Civi/Afform/FilterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..fba7e5e028b352a71e1977334ef70e3574e86bcf
--- /dev/null
+++ b/civicrm/ext/afform/core/tests/phpunit/Civi/Afform/FilterTest.php
@@ -0,0 +1,74 @@
+<?php
+namespace Civi\Afform;
+
+use Civi\Test\HeadlessInterface;
+use Civi\Test\TransactionalInterface;
+
+/**
+ * Class FilterTest
+ *
+ * Ensure that the HTML post-processing/filtering works as expected.
+ *
+ * @package Civi\Afform
+ * @group headless
+ */
+class FilterTest extends \PHPUnit\Framework\TestCase implements HeadlessInterface, TransactionalInterface {
+
+  const PERSON_TPL = '<af-form ctrl="modelListCtrl" ><af-entity type="Contact" name="person" />%s</af-form>';
+
+  public function setUpHeadless() {
+    return \Civi\Test::headless()->installMe(__DIR__)->apply();
+  }
+
+  /**
+   * Apply any filters to an HTML partial.
+   *
+   * @param string $fileName
+   * @param string $html
+   *   Original HTML.
+   * @return string
+   *   Modified HTML.
+   */
+  private function htmlFilter($fileName, $html) {
+    $htmls = \Civi\Angular\ChangeSet::applyResourceFilters(\Civi::service('angular')->getChangeSets(), 'partials', [$fileName => $html]);
+    return $htmls[$fileName];
+  }
+
+  public function testDefnInjection() {
+    $inputHtml = sprintf(self::PERSON_TPL,
+      '<div af-fieldset="person"><af-field name="first_name" /></div>');
+    $filteredHtml = $this->htmlFilter('~/afform/MyForm.aff.html', $inputHtml);
+    $converter = new \CRM_Afform_ArrayHtml(TRUE);
+    $parsed = $converter->convertHtmlToArray($filteredHtml);
+
+    $myField = $parsed[0]['#children'][1]['#children'][0];
+    $this->assertEquals('af-field', $myField['#tag']);
+    $this->assertEquals('First Name', $myField['defn']['title']);
+  }
+
+  public function testDefnInjectionNested() {
+    $inputHtml = sprintf(self::PERSON_TPL,
+      '<span><div af-fieldset="person"><foo><af-field name="first_name" /></foo></div></span>');
+    $filteredHtml = $this->htmlFilter('~/afform/MyForm.aff.html', $inputHtml);
+    $converter = new \CRM_Afform_ArrayHtml(TRUE);
+    $parsed = $converter->convertHtmlToArray($filteredHtml);
+
+    $myField = $parsed[0]['#children'][1]['#children'][0]['#children'][0]['#children'][0];
+    $this->assertEquals('af-field', $myField['#tag']);
+    $this->assertEquals('First Name', $myField['defn']['title']);
+  }
+
+  public function testDefnOverrideTitle() {
+    $inputHtml = sprintf(self::PERSON_TPL,
+      '<div af-fieldset="person"><af-field name="first_name" defn="{title: \'Given name\'}" /></div>');
+    $filteredHtml = $this->htmlFilter('~/afform/MyForm.aff.html', $inputHtml);
+    $converter = new \CRM_Afform_ArrayHtml(TRUE);
+    $parsed = $converter->convertHtmlToArray($filteredHtml);
+
+    $myField = $parsed[0]['#children'][1]['#children'][0];
+    $this->assertEquals('af-field', $myField['#tag']);
+    $this->assertEquals('Given name', $myField['defn']['title']);
+    $this->assertEquals('Text', $myField['defn']['input_type']);
+  }
+
+}
diff --git a/civicrm/ext/afform/core/tests/phpunit/Civi/Afform/FormDataModelTest.php b/civicrm/ext/afform/core/tests/phpunit/Civi/Afform/FormDataModelTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..43a4a557440e613faa7cb55fffb4618c5e20ffd6
--- /dev/null
+++ b/civicrm/ext/afform/core/tests/phpunit/Civi/Afform/FormDataModelTest.php
@@ -0,0 +1,88 @@
+<?php
+namespace Civi\Afform;
+
+use Civi\Test\HeadlessInterface;
+use Civi\Test\TransactionalInterface;
+
+/**
+ * @group headless
+ */
+class FormDataModelTest extends \PHPUnit\Framework\TestCase implements HeadlessInterface, TransactionalInterface {
+
+  /**
+   * Civi\Test has many helpers, like install(), uninstall(), sql(), and sqlFile().
+   *
+   * See: https://github.com/civicrm/org.civicrm.testapalooza/blob/master/civi-test.md
+   *
+   * @throws \CRM_Extension_Exception_ParseException
+   */
+  public function setUpHeadless() {
+    return \Civi\Test::headless()->installMe(__DIR__)->apply();
+  }
+
+  public function getEntityExamples() {
+    $cases = [];
+
+    $cases[] = [
+      'html' => 'Hello world',
+      'entities' => [],
+    ];
+
+    $cases[] = [
+      'html' => '<div/>',
+      'entities' => [],
+    ];
+
+    $cases[] = [
+      'html' => '<div>Hello world</div>',
+      'entities' => [],
+    ];
+
+    $cases[] = [
+      'html' => '<af-form><af-entity type="Foo" name="foobar"/><div af-fieldset="foobar"><af-field name="propA" /><span><p><af-field name="propB" defn="{title: \'Whiz\'}" /></p></span></div></af-form>',
+      'entities' => [
+        'foobar' => [
+          'type' => 'Foo',
+          'name' => 'foobar',
+          'fields' => [
+            'propA' => ['name' => 'propA'],
+            'propB' => ['name' => 'propB', 'defn' => ['title' => 'Whiz']],
+          ],
+          'joins' => [],
+        ],
+      ],
+    ];
+
+    $cases[] = [
+      'html' => '<af-form><div><af-entity type="Foo" name="foobar"/><af-entity name="whiz_bang" type="Whiz" /></div></af-form>',
+      'entities' => [
+        'foobar' => [
+          'type' => 'Foo',
+          'name' => 'foobar',
+          'fields' => [],
+          'joins' => [],
+        ],
+        'whiz_bang' => [
+          'type' => 'Whiz',
+          'name' => 'whiz_bang',
+          'fields' => [],
+          'joins' => [],
+        ],
+      ],
+    ];
+
+    return $cases;
+  }
+
+  /**
+   * @param $html
+   * @param $expectEntities
+   * @dataProvider getEntityExamples
+   */
+  public function testGetEntities($html, $expectEntities) {
+    $parser = new \CRM_Afform_ArrayHtml();
+    $fdm = new FormDataModel($parser->convertHtmlToArray($html));
+    $this->assertEquals($expectEntities, $fdm->getEntities());
+  }
+
+}
diff --git a/civicrm/ext/afform/core/tests/phpunit/Civi/Afform/SymbolsTest.php b/civicrm/ext/afform/core/tests/phpunit/Civi/Afform/SymbolsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8074fc41f9ca53eacfc2bcdcb53b699e95e6cc0d
--- /dev/null
+++ b/civicrm/ext/afform/core/tests/phpunit/Civi/Afform/SymbolsTest.php
@@ -0,0 +1,103 @@
+<?php
+namespace Civi\Afform;
+
+use Civi\Test\HeadlessInterface;
+use Civi\Test\TransactionalInterface;
+
+/**
+ * @group headless
+ */
+class SymbolsTest extends \PHPUnit\Framework\TestCase implements HeadlessInterface, TransactionalInterface {
+
+  /**
+   * Civi\Test has many helpers, like install(), uninstall(), sql(), and sqlFile().
+   *
+   * See: https://github.com/civicrm/org.civicrm.testapalooza/blob/master/civi-test.md
+   *
+   * @throws \CRM_Extension_Exception_ParseException
+   */
+  public function setUpHeadless() {
+    return \Civi\Test::headless()->installMe(__DIR__)->apply();
+  }
+
+  public function getExamples() {
+    $exs = [];
+    $exs[] = [
+      '<div/>',
+      [
+        'e' => ['div' => 1, 'body' => 1],
+        'a' => [],
+        'c' => [],
+      ],
+    ];
+    $exs[] = [
+      '<my-tabset><my-tab id="1"/><my-tab id="2">foo</my-tab><my-tab id="3">bar</my-tab></my-tabset>',
+      [
+        'e' => ['my-tabset' => 1, 'my-tab' => 3, 'body' => 1],
+        'a' => ['id' => 3],
+        'c' => [],
+      ],
+    ];
+    $exs[] = [
+      '<div class="my-parent"><div class="my-child"><img class="special" src="foo.png"/></div></div>',
+      [
+        'e' => ['div' => 2, 'img' => 1, 'body' => 1],
+        'a' => ['class' => 3, 'src' => 1],
+        'c' => [
+          'my-parent' => 1,
+          'my-child' => 1,
+          'special' => 1,
+        ],
+      ],
+    ];
+    $exs[] = [
+      '<div class="my-parent foo bar">a<div class="my-child whiz bang {{ghost + stuff}} last">b</div>c</div>',
+      [
+        'e' => ['div' => 2, 'body' => 1],
+        'a' => ['class' => 2],
+        'c' => [
+          'my-parent' => 1,
+          'my-child' => 1,
+          'foo' => 1,
+          'bar' => 1,
+          'whiz' => 1,
+          'bang' => 1,
+          '{{ghost + stuff}}' => 1,
+          'last' => 1,
+        ],
+      ],
+    ];
+    $exs[] = [
+      '<div class="{{make[\'cheese\']}} {{ghost + stuff}} {{a}}_{{b}}"/>',
+      [
+        'e' => ['div' => 1, 'body' => 1],
+        'a' => ['class' => 1],
+        'c' => [
+          '{{ghost + stuff}}' => 1,
+          '{{make[\'cheese\']}}' => 1,
+          '{{a}}_{{b}}' => 1,
+        ],
+      ],
+    ];
+
+    return $exs;
+  }
+
+  /**
+   * @param string $html
+   * @param array $expect
+   *   List of expected symbol counts, by type.
+   *   Types are (e)lement, (a)ttribute, (c)lass
+   * @dataProvider getExamples
+   */
+  public function testSymbols($html, $expect) {
+    $expectDefaults = ['e' => [], 'a' => [], 'c' => []];
+    $expect = array_merge($expectDefaults, $expect);
+    $actual = Symbols::scan($html);
+
+    $this->assertEquals($expect['e'], $actual->elements);
+    $this->assertEquals($expect['a'], $actual->attributes);
+    $this->assertEquals($expect['c'], $actual->classes);
+  }
+
+}
diff --git a/civicrm/ext/afform/core/tests/phpunit/bootstrap.php b/civicrm/ext/afform/core/tests/phpunit/bootstrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..a5b49253c819c5ab65947070e7ee67d0cac48ea1
--- /dev/null
+++ b/civicrm/ext/afform/core/tests/phpunit/bootstrap.php
@@ -0,0 +1,63 @@
+<?php
+
+ini_set('memory_limit', '2G');
+ini_set('safe_mode', 0);
+// phpcs:disable
+eval(cv('php:boot --level=classloader', 'phpcode'));
+// phpcs:enable
+// Allow autoloading of PHPUnit helper classes in this extension.
+$loader = new \Composer\Autoload\ClassLoader();
+$loader->add('CRM_', __DIR__);
+$loader->add('Civi\\', __DIR__);
+$loader->add('api_', __DIR__);
+$loader->add('api\\', __DIR__);
+$loader->register();
+
+/**
+ * Call the "cv" command.
+ *
+ * @param string $cmd
+ *   The rest of the command to send.
+ * @param string $decode
+ *   Ex: 'json' or 'phpcode'.
+ * @return string
+ *   Response output (if the command executed normally).
+ * @throws \RuntimeException
+ *   If the command terminates abnormally.
+ */
+function cv($cmd, $decode = 'json') {
+  $cmd = 'cv ' . $cmd;
+  $descriptorSpec = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => STDERR);
+  $oldOutput = getenv('CV_OUTPUT');
+  putenv("CV_OUTPUT=json");
+
+  // Execute `cv` in the original folder. This is a work-around for
+  // phpunit/codeception, which seem to manipulate PWD.
+  $cmd = sprintf('cd %s; %s', escapeshellarg(getenv('PWD')), $cmd);
+
+  $process = proc_open($cmd, $descriptorSpec, $pipes, __DIR__);
+  putenv("CV_OUTPUT=$oldOutput");
+  fclose($pipes[0]);
+  $result = stream_get_contents($pipes[1]);
+  fclose($pipes[1]);
+  if (proc_close($process) !== 0) {
+    throw new RuntimeException("Command failed ($cmd):\n$result");
+  }
+  switch ($decode) {
+    case 'raw':
+      return $result;
+
+    case 'phpcode':
+      // If the last output is /*PHPCODE*/, then we managed to complete execution.
+      if (substr(trim($result), 0, 12) !== "/*BEGINPHP*/" || substr(trim($result), -10) !== "/*ENDPHP*/") {
+        throw new \RuntimeException("Command failed ($cmd):\n$result");
+      }
+      return $result;
+
+    case 'json':
+      return json_decode($result, 1);
+
+    default:
+      throw new RuntimeException("Bad decoder format ($decode)");
+  }
+}
diff --git a/civicrm/ext/afform/docs/alter.md b/civicrm/ext/afform/docs/alter.md
new file mode 100644
index 0000000000000000000000000000000000000000..f68c535404e46334d689760e47119324f6dfed66
--- /dev/null
+++ b/civicrm/ext/afform/docs/alter.md
@@ -0,0 +1,60 @@
+# Form Hooks: Updating forms via declarative selector
+
+> __WIP__ This describes functionality that is intended but not actual.
+> The hooks/change-sets currently work with core's `*.html` files; but we need
+> a little patching to make them work with afform's `*.html` files.
+
+Form hooks offer a different style of customization than [Form CRUD](docs/crud.md).  In the CRUD style, you use an API
+to save an updated form -- which stores the exact form (as designed by the user).  In the hook style, you wait until a
+form is being displayed; and, as part of the rendering process, you filter the output.
+
+## Example
+
+In this example, we use `hook_civicrm_alterAngular` to apply a filter to the file `~/crmMailing/BlockSummary.html` --
+the filter selects an element by CSS class (`crm-group`) and then appends a new field to the bottom of that element:
+
+```php
+function mailwords_civicrm_alterAngular(\Civi\Angular\Manager $angular) {
+  $changeSet = \Civi\Angular\ChangeSet::create('inject_mailwords')
+    // ->requires('crmMailing', 'mailwords')
+    ->alterHtml('~/crmMailing/BlockSummary.html',
+      function (phpQueryObject $doc) {
+        $doc->find('.crm-group')->append('
+          <div crm-ui-field="{name: \'subform.mailwords\', title: ts(\'Keywords\')}">
+            <input crm-ui-id="subform.mailwords" class="crm-form-text" name="mailwords" ng-model="mailing.template_options.keywords">
+          </div>
+        ');
+      });
+  $angular->add($changeSet);
+}
+```
+
+## Comparison: CRUD vs Hook
+
+Similarities:
+
+* Both styles have safe and unsafe use-cases.
+* The safety generally depends on the specific components being used.
+    * Ex: If you add a new `crm-ui-field` (via either style), that could be safe/maintainable (if `crm-ui-field` is supported, stable, widely used) or it could be risky/hard-to-maintain
+      (if `crm-ui-field` is undocumented and rarely used).
+* In either style, there are legitimate scenarios for someone to reference a safe or risky component.
+* In either style, it is difficult for a person to keep track of whether the referenced components are safe or risky. The list of experimental/supported/deprecated components will be long and will change over time. We'd rather have tooling to keep track of this.
+* Provided you abide by the code-style of the example, it is possible for the framework to build a list of all CRUD'd forms and all change-sets. In turn, it's possibile to loop through them, audit them, and warn about anything which appears unsafe.
+
+Differences:
+
+* CRUD is concrete. It saves what you tell it to save, and it doesn't do anything else. This makes it more suitable as the conceptual model for the users' GUI editor.
+* Change-sets are abstract. They can change many components (e.g. converting every `<h1>` to a `<div class="my-header-1">`).
+* The good and bad consequences of CRUD are limited to the specific things you manipulated.
+* The good and bad consequences of change-sets can apply across a wider range of things.
+* CRUD locks-in your changes and preferences. If there's an upgrade, your form should remain safely as it was before (provided the form relied on supported components).
+* Change-sets are adaptable. If there's an upgrade or edit to the underlying form, the change-set will be used on top of the latest revision. If the change-set is revised, then the latest change-set will be used without needing to edit the forms individually.
+
+I expect future people will develop better insight on the trade-offs (and may design other, more nuanced options). For an initial first-read on when to use each, my expectations are that:
+
+* CRUD is more appropriate when an *administrator* is expressing a *policy opinion* about the importance of information on a page.
+* Change-sets are more appropriate when a *developer* is changing an *implementation detail* (such as the CSS classes used to style all calendar widgets).
+
+## See also
+
+https://docs.civicrm.org/dev/en/latest/framework/angular/changeset/
diff --git a/civicrm/ext/afform/docs/angular.md b/civicrm/ext/afform/docs/angular.md
new file mode 100644
index 0000000000000000000000000000000000000000..e23ba26cd9994ef88c005b03cbb9522b15d1f60e
--- /dev/null
+++ b/civicrm/ext/afform/docs/angular.md
@@ -0,0 +1,17 @@
+# Full AngularJS: Integrating between Afform and vanilla AngularJS
+
+Afform is a subset of AngularJS -- it emphasizes the use of *directives* as a way to *choose and arrange* the parts of
+your form.  There is more to AngularJS -- such as client-side routing, controllers, services, etc.  What to do if you
+need these?  Here are few tricks:
+
+* You can create your own applications and pages with full AngularJS. (See also: [CiviCRM Developer Guide: AngularJS: Quick Start](https://docs.civicrm.org/dev/en/latest/framework/angular/quickstart/)).
+  Then embed the afform (like `hello-world`) in your page with these steps:
+    * Declare a dependency on module (`helloWorld`). This is usually done in `ang/MYMODULE.ang.php` and/or `ang/MYMODULE.js`.
+    * In your HTML template, use the directive `<div hello-world=""></div>`.
+    * If you want to provide extra data, services, or actions for the form author -- then pass them along.
+* You can write your own directives with full AngularJS (e.g. `civix generate:angular-directive`). These directives become available for use in other afforms.
+* If you start out distributing an `afform` and later find it too limiting, then you can change your mind and convert it to static code in full AngularJS.
+  As long as you name it consistently (`angular.module('helloWorld').directive('helloWorld')`), downstream consumers can use the static version as a drop-in replacement.
+
+> *(FIXME: But if you do convert to static, could you still permit downstream folks customize the HTML?  Let's
+> re-assess after we've patched core to allow full participation in the lifecycle of HTML partials.)*
diff --git a/civicrm/ext/afform/docs/crud.md b/civicrm/ext/afform/docs/crud.md
new file mode 100644
index 0000000000000000000000000000000000000000..7ba2f3c09dbd1d6fb6e4739a0903d4d4a728c8c6
--- /dev/null
+++ b/civicrm/ext/afform/docs/crud.md
@@ -0,0 +1,54 @@
+# Form CRUD: Updating forms via programmatic API
+
+Now that we've defined a baseline form, it's possible for administrators and
+GUI applications to inspect the form using the API:
+
+```
+$ cv api4 afform.get +w name=helloWorld
+{
+    "0": {
+        "name": "helloWorld",
+        "requires": [
+            "afCore"
+        ],
+        "title": "",
+        "description": "",
+        "is_public": false,
+        "server_route": "civicrm/hello-world",
+        "layout": {
+            "#tag": "div",
+            "#children": [
+                "Hello {{routeParams.name}}"
+            ]
+        },
+    }
+}
+```
+
+Additionally, you can also update the forms:
+
+```
+$ cv api4 afform.update +w name=helloWorld +v title="The Foo Bar Screen"
+{
+    "0": {
+        "name": "helloWorld",
+        "title": "The Foo Bar Screen"
+    }
+}
+```
+
+A few important things to note about this:
+
+* The changes made through the API are only applied on this site.
+* Once you make a change with the CRUD API, there will be two copies of the form:
+    * `[myextension]/ang/helloWorld.aff.html` is the default, canonical version.
+    * `[civicrm.files]/ang/helloWorld.aff.html` is the local, custom version.
+* The `layout` field is stored as an Angular-style HTML document (`helloWorld.aff.html`), so you can edit it on disk like
+  normal Angular code. However, when CRUD'ing the `layout` through the API, it is presented in JSON-style.
+
+To undo the change, you can use the `revert` API.  This will remove any local overrides so that the canonical content
+(`[myextension]/ang/helloWorld.aff.html`) is activated.
+
+```
+$ cv api4 afform.revert +w name=helloWorld
+```
diff --git a/civicrm/ext/afform/docs/embed.md b/civicrm/ext/afform/docs/embed.md
new file mode 100644
index 0000000000000000000000000000000000000000..3e291dab417c209c85a8d54cfaa0dc941da69d8c
--- /dev/null
+++ b/civicrm/ext/afform/docs/embed.md
@@ -0,0 +1,76 @@
+# Embedding Forms: Afform as reusable building-block
+
+In the [quick-start example](quickstart.md), we registered a new route (`"server_route": "civicrm/hello-world"`) -- this created a
+simple, standalone page with the sole purpose of displaying the `helloWorld` form.  What if we want to embed the form
+somewhere else -- e.g. as a dialog inside an event-listing or membership directory?  Afforms are actually *re-usable
+sub-forms*.
+
+How does this work?  Every `afform` is an *AngularJS directive*.  For example, `hello-world` can be embedded with:
+
+```html
+<div hello-world=""></div>
+```
+
+Moreover, you can pass options to `helloWorld`:
+
+```html
+<div hello-world="{phaseOfMoon: 'waxing'}"></div>
+```
+
+Now, in `ang/helloWorld.aff.html`, you can use `options.phaseOfMoon`:
+
+```html
+Hello, {{routeParams.name}}. The moon is currently {{options.phaseOfMoon}}.
+```
+
+## Example: Contact record
+
+Is this useful? Let's suppose you're building a contact record page.
+
+First, we should make a few building-blocks:
+
+1. `ang/myContactName.aff.html` displays a sub-form for editing first name, lastname, prefix, suffix, etc.
+2. `ang/myContactAddresses.aff.html` displays a sub-form for editing street addresses.
+3. `ang/myContactEmails.aff.html` displays a sub-form for editing email addresses.
+
+Next, we should create an overall `ang/myContact.aff.html` which uses these building-blocks:
+
+```html
+<div ng-form="contactForm">
+  <div crm-ui-accordion="{title: ts('Name')}">
+    <div my-contact-name="{cid: routeParams.cid}"></div>
+  </div>
+  <div crm-ui-accordion="{title: ts('Street Addresses')}">
+    <div my-contact-addresses="{cid: routeParams.cid}"></div>
+  </div>
+  <div crm-ui-accordion="{title: ts('Emails')}">
+    <div my-contact-emails="{cid: routeParams.cid}"></div>
+  </div>
+</div>
+```
+
+And we should create a `ang/myContact.aff.json` looking like
+
+```json
+{
+  "server_route": "civicrm/contact", 
+  "requires" : ["myContactName", "myContactEmails", "myContactAddresses"]
+}
+```
+> *(FIXME: In the parent form's `*.aff.json`, we need to manually add `myContactName`, `myContactAddresses`, `myContactEmails` to the `requires` list. We should autodetect these instead.)*
+
+We've created new files, so we'll need to flush the file-index
+
+```
+cv flush
+```
+
+and now we can open the page
+
+```
+cv open 'civicrm/contact?cid=100'
+```
+
+What does this buy us?  It means that a downstream admin (using APIs/GUIs) can fork `ang/myContactName.aff.html` --
+but all the other components can cleanly track the canonical release. This significantly reduces the costs and risks
+of managing upgrades and changes.
diff --git a/civicrm/ext/afform/docs/philosophy.md b/civicrm/ext/afform/docs/philosophy.md
new file mode 100644
index 0000000000000000000000000000000000000000..28768f32ab4ffe664a5bdfe6c4195f7c937b0522
--- /dev/null
+++ b/civicrm/ext/afform/docs/philosophy.md
@@ -0,0 +1,81 @@
+# Philosophy, Beliefs, Assumptions
+
+Afform is generally grounded in a few beliefs.
+
+## Leap by extension
+
+Afform represents a major conceptual change in how core forms are developed.  It is incubated as an extension that can
+be enabled or disabled to taste.  The aim is to write further extensions which (a) build on afform APIs in order to (b) incrementally override/replace particular forms in core.
+
+## Features and user-experiences evolve in funny workflows
+
+If we could sit down and define one true, correct version of a "Donation" form, then our lives as Civi devlopers would
+be easy: draw a mockup, write code, ship, and retire.  But we can't -- because Civi users / integrators / developers engage with
+the system creatively.  They aim to optimize conversion-rates, to integrate with donor journerys, to question how each
+detail makes sense in their situation, etc.  That means switching between open-ended donation amounts, sliders, radios,
+etc; revising the language and layout; maybe adding an informational question or newsletter opt-in.
+
+I believe that features and user-experiences evolve in funny workflows -- because the actual stories behind major
+improvements have not fit into a single mold.  A main ambition of `afform` is to allow multiple workflows in developing
+a common type of deliverable (*the forms*).  Thus, the architecture anticipates scenarios for developers defining forms
+concretely; for users defining forms concretely; for using GUIs or text-editors or IDEs or SCMs; for using
+cross-cutting hooks and selectors.  Compatibility with multiple workflows is a primary feature of the design.
+
+This is *not* an argument for maximal customization or maximal decentralization.  As participants in an ecosystem, we
+must still communicate and exercise judgment about the best way to approach each problem.  But there are legitimate
+instances for each workflow; given that each will be sought, we want them to be safe and somewhat consistent.
+
+The aims are *not* achieved by developing every feature in-house. Rather, this is conceived as an effort to use
+existing tools/frameworks while relaxing workflows.
+
+What distinguishes `afform` from the original form architecture (Civi's combination of HTML_Quickform, Smarty and
+Profiles)?  Each of those workflows has been given some consideration upfront with the aim of providing a *consistent,
+unified model* -- so that the same data-structure can be pushed through any of those common workflows.
+
+## Incremental and measurable strictness
+
+JavaScript, PHP, and HTML are forgiving, loosely-typed systems.  This can be viewed as a strength (wrt to learnability
+and prototyping), and it can be viewed as a weakness (allowing a number of common mistakes to go unidentified until a
+user runs into them).
+
+Personally, I think that strongly-typed languages are better for large, multi-person projects -- providing a fallback
+to protect against some common mistakes that arise people don't fully communicate or understand a change.  However,
+adopting a strongly-typed system is a major change, and it's not perfect, and I can respect the arguments in favor of
+loosely-typed systems.
+
+A compromise is to phase-in some static analysis incrementally.  For `afform`, this means that the main deliverables
+(HTML documents+changesets) should be encoded in an inspectable form -- it must be possible for the system to enumerate
+all documents+changesets and audit them (i.e.  identifying which form elements -- CSS classes and Angular directives --
+are officially supported or unsupported).  This, in turn, means that we can provide warnings and scores to identify
+which customizations are more maintainable or more experimental/suspect.
+
+## Don't reinvent the wheel; do use a wheel that fits
+
+The general philosophy and architecture in `afform` could be used with almost any form system that has a clear
+component hierarchy (such as AngularJS's HTML notation, Symfony Form's object graph, or Drupal Form API's array-trees).
+
+It specifically uses AngularJS.  Why?  In order of descending importance:
+
+* It can work across a wide range of existing deployment environments (D7, D8, WordPress, Backdrop, Joomla, Standalone).
+* It already exists.
+* I have experience with it.
+* The main Angular tutorials aimed at generalist web developers are reasonably slick.
+* The connection between the code you write and what's displayed in the browser is fairly concrete.
+
+It's by no means a perfect wheel.  Other wheels have strengths, too.  I checked the top-line requirement and grabbed
+the closest wheel that fit.
+
+## Fidelity to upstream
+
+The upstream AngularJS project canonically represents a form as an HTML file on disk; thus, `afform` does the same.
+The upstream project uses `ng-if` for a conditional element; thus, an `afform` instance should do the same.  The
+upstream project uses "directives" for composable building blocks; and `afform`, the same.
+
+This convention (a) helps to reduce bike-shedding, (b) helps us get some benefit out of re-using an existing wheel, and
+(c) practices what we preach with regard to "consistency" across the various workflows.
+
+## Generally comparable platform requirements
+
+If you can install CiviCRM on a server today, then you should be able to install `afform` and a personalized mix of
+extensions which build on it.  This means that the main workflows facilitated by `afform` can require PHP (and even
+MySQL), but they can't require (say) Redis or Ruby or NodeJS.
diff --git a/civicrm/ext/afform/docs/quickstart.md b/civicrm/ext/afform/docs/quickstart.md
new file mode 100644
index 0000000000000000000000000000000000000000..37917d7724a4d9f4e898e59884649f1d71034e6a
--- /dev/null
+++ b/civicrm/ext/afform/docs/quickstart.md
@@ -0,0 +1,38 @@
+# Quick Start: Creating the canonical definition of a basic form
+
+As an extension author, you can define a form along with its default,
+canonical content. Simply create a file  `ang/MYFORM.aff.html`. In
+this example, we create a form named `helloWorld`:
+
+```
+$ cd /path/to/my/own/extension
+$ mkdir ang
+$ echo '<div>Hello {{routeParams.name}}</div>' > ang/helloWorld.aff.html
+$ echo '{"server_route": "civicrm/hello-world"}' > ang/helloWorld.aff.json
+$ cv flush
+```
+
+A few things to note:
+
+* The `ang` folder is the typical location for AngularJS modules in CiviCRM extensions.
+* We defined a route `civicrm/hello-world`. This appears in the same routing system used by CiviCRM forms. It also supports properties such as `title` (page title) and `is_public` (defaults to `false`).
+* After creating a new form or file, we should flush the cache.
+* If you're going to actively edit/revise the content of the file, then you should navigate
+  to **Administer > System Settings > Debugging** and disable asset caching.
+* The extension `*.aff.html` represents an AngularJS HTML document. It has access to all the general features of Angular HTML (discussed more later).
+* In AngularJS, there is a distinction between a "module" (unit-of-code to be shared; usually appears as `camelCase`) and a "directive" (a custom
+  HTML element; may appear as `camelCase` or as `kebab-case` depending on context). Afform supports a [tactical simplification](angular.md) in which one
+  `*.aff.html` corresponds to one eponymous module and one eponymous directive.
+
+Now that we've created a form, we'll want to determine its URL. As with most
+CiviCRM forms, the URL depends on the CMS configuration. Here is an example
+from a local Drupal 7 site:
+
+```
+$ cv url "civicrm/hello-world"
+"http://dmaster.localhost/civicrm/hello-world"
+$ cv url "civicrm/hello-world/#!/?name=world"
+"http://dmaster.localhost/civicrm/hello-world/#/?name=world"
+```
+
+Open the URLs and see what you get.
diff --git a/civicrm/ext/afform/docs/roadmap.md b/civicrm/ext/afform/docs/roadmap.md
new file mode 100644
index 0000000000000000000000000000000000000000..3b0b0c6b1fc07d32f6219560a9163aac2aa1d94f
--- /dev/null
+++ b/civicrm/ext/afform/docs/roadmap.md
@@ -0,0 +1,56 @@
+# Roadmap
+
+The `afform` extension is a proof-of-concept.  It aims to demonstrate the core model/concept in which AngularJS
+provides the standard data-format and component-model shared by developers (working in code files) and administrators
+(working in a programmatic GUI).
+
+As a proof-of-concept, it is necessarily incomplete.  In particular: (a) some functionality is envisioned for
+additional extensions and (b) within this extension, there are known issues.
+
+## Suite of Extensions
+
+This extension is expected to be the base for a suite of related extensions:
+
+* `afform`: Base framework and runtime. Provides APIs for developers.
+* `afform_html`: Present web-based editor for customizing forms in HTML notation. Use Monaco or ACE.
+  (In the near term, it's a simple demonstration that forms can be edited by users in a browser; in the
+  long term, it occupies a smaller niche as a developer/power-admin tool.)
+* `afform_gui`: Present a web-based editor for customizing forms with drag-drop/multi-pane UX.
+  (In the long term, this is the main UI for admins.)
+* `afform_auditor`: Report on upgrade compatibility. Test changesets. Highlight dangerous/unknown/unsupported form elements.
+   Score maintainability of the system.
+
+## Documentation
+
+* Development and Refactoring: A guide for making changes to supported markup in a maintainable fashion.
+  (*What if I need to rename a tag? What if I need to deprecate a tag? Ad nauseum*)
+
+## Known Issues
+
+Within this extension, there are things which need updating/addressing:
+
+* Test coverage for key Angular directives (e.g. `af-api4-ctrl`, `af-api4-action`)
+* There are several `FIXME`/`TODO` declarations in the code for checking pre-conditions, reporting errors, handling edge-cases, etc.
+* Although afforms can be used in AngularJS, they don't fully support tooling like `cv ang:html:list`
+  and `hook_civicrm_alterAngular` changesets. We'll need a core patch to allow that. (Ex: Define partials via callback.)
+* We generally need to provide more services for managing/accessing data (e.g. `crm-api3`).
+* We need a formal way to enumerate the library of available tags/directives/attributes. This, in turn, will drive the
+  drag-drop UI and any validation/auditing.
+* Haven't decided if we should support a `client_route` property (i.e. defining a skeletal controller and route for any form).
+  On the plus side, make it easier to add items to the `civicrm/a` base-page. On the flipside, we don't currently have
+  a strong use-case, and developers can get the same effect with `civix generate:angular-page` and embedding `<div hello-world/>`.
+* Injecting an afform onto an existing Civi page is currently as difficult as injecting any other AngularJS widget --
+  which is to say that (a) it's fine for a Civi-Angular page and (b) it's lousy on a non-Angular page.
+* The data-storage of user-edited forms supports primitive branching and no merging or rebasing.  In an ideal world
+  (OHUPA-4), we'd incorporate a merge or rebase mechanism (and provide the diff/export on web+cli).  To reduce unnecessary
+  merge-conflicts and allow structured UI for bona-fide merge-conflicts, the diff/merge should be based on HTML elements and
+  IDs (rather than lines-of-text).
+* API Request Batching -- If a page makes multiple API calls at the same time, they fire as separate HTTP requests. This concern is somewhat
+  mitigated by HTTP/2, but not really -- because each subrequest requires a separate CMS+CRM bootstrap. Instead, the JS API adapter should
+  support batching (i.e. all API calls issued within a 5ms window are sent as a batch).
+* Default CSS: There's no mechanism for defining adhoc CSS. This is arguably a feature, though, because the CSS classes
+  should be validated (to ensure theme interoperability).
+* `Civi/Angular/ChangeSet.php` previously had an integrity check that activated in developer mode
+  (`\CRM_Core_Config::singleton()->debug && $coder->checkConsistentHtml($html)`). This has been removed because it was a bit brittle
+  about self-closing HTML tags. However, the general concept of HTML validation should be reinstated as part of the `afform_auditor`.
+* `hook_alterAngular` is used to inject APIv4 metadata for certain tags. This behavior needs a unit-test.
diff --git a/civicrm/ext/afform/docs/sandbox/1-Sketch.png b/civicrm/ext/afform/docs/sandbox/1-Sketch.png
new file mode 100644
index 0000000000000000000000000000000000000000..9fa002dd84af37ea5c1dbbc93e742d550f74a185
Binary files /dev/null and b/civicrm/ext/afform/docs/sandbox/1-Sketch.png differ
diff --git a/civicrm/ext/afform/docs/sandbox/2-Sketch.png b/civicrm/ext/afform/docs/sandbox/2-Sketch.png
new file mode 100644
index 0000000000000000000000000000000000000000..7e97da5583a21d0b1bb0d1bda5320f921fa4a122
Binary files /dev/null and b/civicrm/ext/afform/docs/sandbox/2-Sketch.png differ
diff --git a/civicrm/ext/afform/docs/sandbox/3-Free-Blocks-Parent.png b/civicrm/ext/afform/docs/sandbox/3-Free-Blocks-Parent.png
new file mode 100644
index 0000000000000000000000000000000000000000..7919d805ba4dc4975b5ab7bea2b1407f2a3e1043
Binary files /dev/null and b/civicrm/ext/afform/docs/sandbox/3-Free-Blocks-Parent.png differ
diff --git a/civicrm/ext/afform/docs/sandbox/4-Repeatable-Entity-Blocks-Parent.png b/civicrm/ext/afform/docs/sandbox/4-Repeatable-Entity-Blocks-Parent.png
new file mode 100644
index 0000000000000000000000000000000000000000..c18f9e23c8d65770951c5dbd53d281d065c4ccdd
Binary files /dev/null and b/civicrm/ext/afform/docs/sandbox/4-Repeatable-Entity-Blocks-Parent.png differ
diff --git a/civicrm/ext/afform/docs/sandbox/5-Repeatable-Entity-Blocks-Kid.png b/civicrm/ext/afform/docs/sandbox/5-Repeatable-Entity-Blocks-Kid.png
new file mode 100644
index 0000000000000000000000000000000000000000..d9c87436aa05bd7c13b5e770f4c78f9f042a73b1
Binary files /dev/null and b/civicrm/ext/afform/docs/sandbox/5-Repeatable-Entity-Blocks-Kid.png differ
diff --git a/civicrm/ext/afform/docs/sandbox/planning-v0.2.md b/civicrm/ext/afform/docs/sandbox/planning-v0.2.md
new file mode 100644
index 0000000000000000000000000000000000000000..0016f960a0dac3dc25a8aa4bb692a205496743dc
--- /dev/null
+++ b/civicrm/ext/afform/docs/sandbox/planning-v0.2.md
@@ -0,0 +1,170 @@
+## Example Use Case
+
+A school has an application process which begins when a parent fills out a
+form with basic details about:
+
+* Themselves
+* Their spouse/coparent (if applicable)
+* The kid
+* A meeting request
+
+The data is saved to 4 entities:
+
+* "Parent" (or "You" or "Me")
+* "Spouse"
+* "Kid"
+* "Activity" (of type "Phone Call" assigned to a particular person)
+
+## General Metadata
+
+```php
+// The tag library is a definition of available tags/directives. It can be
+// used to validate form definitions; to advise sysadmins; and (probably)
+// to generate the $palette.
+//
+// Must NOT be required at runtime. Only required for administration.
+//
+// CONSIDER: Specifying non-conventional names for design/props variants
+$afformTags = [
+  'afl-entity' =>[
+    'attrs' => ['entity-name', 'matching-rule', 'assigned-values'],
+  ],
+  'afl-name' => [
+    'attrs' => ['contact-id', 'afl-label'],
+  ],
+  'afl-contact-email' => [
+    'attrs' => ['contact-id', 'afl-label'],
+  ],
+];
+
+// The "palette" is a list of things that can be selected by a web-based
+// admin and added to a form.
+//
+// The canonical form is flat-ish array, but it will be requested in 2-level indexed
+// format (e.g. `entity,id`).
+//
+// Must NOT be required at runtime. Only required for administration.
+function computePalette($entityType) {
+  return [
+    [
+      'group' => 'Blocks',
+      'title' => 'Name',
+      'template' => '<afl-name entity="%%ENTITY%%" afl-label="Name"/>',
+    ],
+    [
+      'title' => 'Address',
+      'template' => '<afl-address entity="%%ENTITY%%" afl-label="Address"/>',
+    ], 
+    [
+      'group' => 'Fields',
+      'title' => 'First Name',
+      'template' => '<afl-api-field entity="%%ENTITY%%" afl-field="first_name" afl-label="First Name" afl-type="String" />',
+    ],
+  ];
+}
+```
+
+## Form Metadata: *.aff.json
+
+```json
+{
+  "server_route": "civicrm/hello-world",
+  "entities": {
+    "parent": {
+      "type": "Individual",
+      "set": {"favorite_color": "red"},
+      "matchingRule": "email_only"
+    }
+  }
+}
+```
+
+## Form Layout: *.aff.html
+
+```html
+<afl-form>
+  <crm-ui-tabset>
+
+    <crm-ui-tab>
+      <afl-entity name="parent">
+        <afl-name afl-label="Your Name" ng-required="true" name-style="First-Last" />
+        <afl-email afl-label="Your Email" ng-required="true" />
+      </afl-entity>
+    </crm-ui-tab>
+
+    <crm-ui-tab>
+      <afl-entity name="spouse">
+        <afl-name afl-label="Spouse Name" name-style="First-Last" />
+        <afl-email afl-label="Spouse Email" />
+      </afl-entity>
+    </crm-ui-tab>
+
+    <crm-ui-tab>
+      <afl-entity name="kid">
+        <afl-name afl-label="Kid Name" ng-required="true" name-style="First-Last" />
+      </afl-entity>      
+    </crm-ui-tab>
+  </crm-ui-tabset>
+
+  <button ng-click="save()">Save</button>
+</afl-form>
+```
+
+## Form Editor: Rendering the same layout
+
+```html
+<afl-form-af-design>
+  <crm-ui-tabset-af-design>
+    <crm-ui-tab-af-design>
+      
+    </crm-ui-tab-af-design>
+  </crm-ui-tabset-af-design>
+</afl-form-af-design>
+```
+
+## File Structure
+
+In v0.1, there was a convention of autoprefixing everything with `afform-`.
+This was generally tied to the goal of providing a strong symmetries in
+the names of folders/files/modules/directives/tags.
+
+In the long run, though, it doesn't seem sustainable force everything under
+the `afform-` prefix.
+
+* As we started spec'ing the standard library, it became clear that the
+  stdlib should have a diff namespace from the more business-oriented form defs.
+* As third parties start writing code, they're going to look for way to
+  make their own prefix.
+
+However, we still want to preserve the strong symmetries in the filesystem where:
+
+* The symbol in HTML (e.g.  `afform-email`) should match the file-name (e.g. 
+  `afform/Email/layout.html` or `afform-email.aff.html`)
+* The file name in the base-code provided by an extension should match
+  the file-name in the local override folder.
+
+The following file-structure preserves those parallels. It also:
+
+* Gives access to a full range of tag names
+* Is a bit easier with IDE file-opening (more unique file-names)
+* Is a bit harder to manually copy (e.g. `cp -r foo bar` => `mcp 'foo.*' 'bar.#1'`
+
+Which leads to this structure:
+
+```
+// A business-y form; in canonical definition and local override
+{ext:org.foobar}/ang/afform-edit-contact.aff.json
+{ext:org.foobar}/ang/afform-edit-contact.aff.html
+ {civicrm.files}/ang/afform-edit-contact.aff.json
+ {civicrm.files}/ang/afform-edit-contact.aff.html
+
+// An address block in the stdlib; in canonical definition and local override
+// Note: We also have the "design" and "props" variants
+{ext:org.foobar}/ang/afl-address.aff.json
+{ext:org.foobar}/ang/afl-address.aff.html
+{ext:org.foobar}/ang/afl-address.aff.props.html
+{ext:org.foobar}/ang/afl-address.aff.design.html
+ {civicrm.files}/ang/afl-address.aff.json
+ {civicrm.files}/ang/afl-address.aff.html
+```
+
diff --git a/civicrm/ext/afform/docs/sandbox/planning-v0.3.md b/civicrm/ext/afform/docs/sandbox/planning-v0.3.md
new file mode 100644
index 0000000000000000000000000000000000000000..18b33073cf2f77472af4c557602d6501e71322bc
--- /dev/null
+++ b/civicrm/ext/afform/docs/sandbox/planning-v0.3.md
@@ -0,0 +1,194 @@
+# Progression of sketches of canvas content
+
+```html
+<script class="afform-meta-1234abcd" type="text/json"> {
+  "entities": [
+    "parent": {
+      "title": "Parent",
+      "type": "Individual"
+    },
+    "spouse": {
+      "title": "Spouse".
+      "type": "Individual"
+    }
+  ]
+}
+</script>
+  
+<div afform-entity-ctrl="afform-meta-1234abcd">
+  <af-address contact-id="entities.parent.id" label="Address" ng-if="" ng-classes="{foo: name == 'Frank'}" />
+  <af-field entity="entities.parent" entity-type="contact" field="first_name" label="First Name"/>
+  <af-field entity="entities.parent" entity-type="contact" field="last_name" label="Last Name"/>
+</div>
+```
+
+
+-------------
+
+```html
+<div afform-entity-ctrl="myEntities">
+  <afform-entity type="Individual" name="parent" title="Parent" />
+  <afform-entity type="Individual" name="spouse" title="Spouse" />
+  
+  <af-name entity="myEntities.parent" label="Address" />
+  <af-address entity="myEntities.parent" label="Address" />
+  <af-field entity="myEntities.parent" entity-type="contact" field="first_name" label="First Name"/>
+  <af-field entity="myEntities.parent" entity-type="contact" field="last_name" label="Last Name"/>
+</div>
+```
+
+------------------
+
+```html
+<div afform-entity-ctrl="myEntities">
+
+  <af-entity type="Individual" name="parent" label="Parent">
+    <af-name label="Name" />
+    <af-email label="Email" />
+  </af-entity>
+  
+  <af-entity type="Individual" name="spouse" af-title="Spouse">
+    <af-name label="Spouse Name" />
+    <af-email label="Spouse Email" />
+  </af-entity>
+
+  <af-entity type="Individual" name="parent" af-title="Parent">
+    <af-address label="Address" />
+  </af-entity>
+
+</div>
+```
+
+---------
+
+```html
+<!-- 1. s/entity/model-->
+<af-form>
+
+  <af-fieldset type="Individual" model="parent" label="Parent">
+    <af-name label="Name" />
+    <af-email label="Email" />
+  </div>
+
+  <af-fieldset type="Individual" model="spouse" af-title="Spouse">
+    <af-name label="Spouse Name" />
+    <af-email label="Spouse Email" />
+  </div>
+
+  <af-fieldset type="Individual" model="parent" af-title="Parent">
+    <af-address label="Address" />
+  </div>
+
+</af-form>
+```
+
+--------------
+
+```html
+<af-form ctrl="modelListCtrl">
+  <af-entity
+    type="Individual"
+    name="parent"
+    label="Parent"
+    api4-params="{where: ['id','=', routeParams.cid]}"
+  />
+  <af-entity
+    type="Individual"
+    name="spouse"
+    label="Spouse"
+    contact-relationship="['Spouse of', 'parent']"
+  />
+  <!-- "parent" and "spouse" should be exported as variables in this scope -->
+
+  <div af-fieldset="parent">
+    <af-name label="Name" />
+    <af-email label="Email" />
+  </div>
+
+  <div af-fieldset="spouse">
+    <af-name label="Spouse Name" />
+    <af-email label="Spouse Email" only-primary="true" />
+  </div>
+
+  <p ng-if="spouse.display_name.contains('Thor')">
+    Your spouse should go to the gym.
+  </p>
+
+  <div af-fieldset="parent">
+    <af-address label="Address" />
+  </div>
+
+  <!-- General elements: FIELDSET, UL, BUTTON, P, H1 should work anywhere -->
+  <button ng-model="modelListCtrl.submit()">Submit</button>
+
+</af-form>
+```
+
+------
+
+```html
+<!-- afform/Blocks/Email.html -->
+<!-- input: options.parent.id -->
+<!-- Decision: These blocks are written in straight AngularJS rather than Afform -->
+<!--<af-form>-->
+  <!--<af-entity -->
+    <!--type="Email"-->
+    <!--name="email"-->
+    <!--label="Emails"-->
+    <!--api4-params="{where: ['contact_id', '=', options.parent.id]}"-->
+  <!--/>-->
+  <!--<div af-fieldset="email">-->
+    <!---->
+  <!--</div>-->
+<!--</af-form>-->
+
+```
+
+------
+
+```html
+<af-form ctrl="modelListCtrl">
+  <af-entity
+    type="Individual"
+    name="parent"
+    label="Parent"
+    api4-params="{where: ['id','=', routeParams.cid]}"
+  />
+  <af-entity
+    type="Individual"
+    name="spouse"
+    label="Spouse"
+    contact-relationship="['Spouse of', 'parent']"
+  />
+  <!-- "parent" and "spouse" should be exported as variables in this scope -->
+
+  <crm-ui-tab-set>
+    <crm-ui-tab title="About You">
+      <div af-fieldset="parent">
+        <af-std-contact-name label="Name" />
+        <af-std-contact-email label="Email" />
+        <af-field name="do_not_email" field-type="checkbox" field-default="1" />
+      </div>
+    </crm-ui-tab>
+    <crm-ui-tab title="Spouse">
+      <div af-fieldset="spouse">
+        <af-std-contact-name label="Spouse Name" />
+        <af-std-contact-email label="Spouse Email" only-primary="true" />
+        <af-field name="do_not_email" field-type="checkbox" field-default="1" />
+      </div>
+    </crm-ui-tab>
+  </crm-ui-tab-set>
+
+  <p ng-if="spouse.display_name.contains('Thor')">
+    Your spouse should go to the gym.
+  </p>
+
+  <div af-fieldset="parent">
+    <af-block-contact-address label="Address" />
+  </div>
+
+  <!-- General elements: FIELDSET, UL, BUTTON, P, H1 should work anywhere -->
+  <button ng-model="modelListCtrl.submit()">Submit</button>
+
+</af-form>
+```
diff --git a/civicrm/ext/afform/docs/sandbox/v0.2.bmpr b/civicrm/ext/afform/docs/sandbox/v0.2.bmpr
new file mode 100644
index 0000000000000000000000000000000000000000..85bc4a10ee5b6237e149d901a47e961484858f95
Binary files /dev/null and b/civicrm/ext/afform/docs/sandbox/v0.2.bmpr differ
diff --git a/civicrm/ext/afform/docs/style.md b/civicrm/ext/afform/docs/style.md
new file mode 100644
index 0000000000000000000000000000000000000000..5b9fb38abd72bdcb2525d1d8bbe8cf7ad9f89a05
--- /dev/null
+++ b/civicrm/ext/afform/docs/style.md
@@ -0,0 +1,26 @@
+# Code Style
+
+## Naming
+
+The following naming conventions apply to directives defined within `afform.git`:
+
+* Standalone directives (e.g. `afEntity` or `afField`), including forms (e.g. `afHtmlEditor`)
+    * The directive name must begin with the `af` prefix.
+    * Supplemental attributes SHOULD NOT begin with the `af` prefix.
+    * Example: `<af-entity type="Activity" name="myPhoneCall">`
+
+* Mix-in directives (e.g. `afMonaco` or `afApi4Action`)
+    * The directive name must begin with the `af` prefix.
+    * Supplemental attributes SHOULD begin with a prefix that matches the directive.
+    * Example: `<button af-api4-action="['Job', 'process_mailings', {}]` af-api4-success-msg="ts('Processed pending mailings')">
+
+__Discussion__: These differ in two ways:
+
+* Namespacing
+    * Standalone directives form an implicit namespace.
+      (*Anything passed to `<af-entity>` is implicitly about `af-entity`.)
+    * Mix-in directives must share a namespace with other potential mix-ins.
+      (*The *)
+* Directive arguments
+    * Standalone directives only take input on the supplemental attributes (`type="..."`).
+    * Mix-ins take inputs via the directive's attribute (`af-api4-action="..."`) and the supplemental attributes (`af-api4-success-msg="..."`).
diff --git a/civicrm/ext/afform/docs/writing.md b/civicrm/ext/afform/docs/writing.md
new file mode 100644
index 0000000000000000000000000000000000000000..5cc2ee64e04ef62822f00b87a6986192511850e2
--- /dev/null
+++ b/civicrm/ext/afform/docs/writing.md
@@ -0,0 +1,64 @@
+# Writing Forms: Afform as basic AngularJS templates
+
+In AngularJS, the primary language for composing a screen is HTML. You can do interesting things in Angular
+HTML, such as displaying variables and applying directives.
+
+One key concept is *scope* -- the *scope* determines the list of variables which you can access.  By default, `afform`
+creates a scope with these variables:
+
+* `routeParams`: This is a reference to the [$routeParams](https://docs.angularjs.org/api/ngRoute/service/$routeParams)
+  service. In the example, we used `routeParams` to get a reference to a `name` from the URL.
+* `meta`: Object which for now contains just the form name but could potentially have other metadata if needed.
+* `ts`: This is a utility function which translates strings, as in `{{ts('Hello world')}}`.
+
+Additionally, AngularJS allows *directives* -- these are extensions to HTML (custom tags and attributes) which create behavior. For example:
+
+* `ng-if` will conditionally create or destroy elements in the page.
+* `ng-repeat` will loop through data.
+* `ng-style` and `ng-class` will conditionally apply styling.
+
+A full explanation of these features is out-of-scope for this document, but the key point is that you can use standard
+AngularJS markup.
+
+## Example: Contact record
+
+Let's say we want `civicrm/hello-world` to become a basic "View Contact" page. A user
+would request a URL like:
+
+```
+http://dmaster.localhost/civicrm/hello-world/#/?cid=123
+```
+
+How do we use the `cid` to get information about the contact?  Update `helloWorld.aff.html` to fetch data with
+`Contact.get` API and call the [af-api3](https://github.com/totten/afform/blob/master/ang/afCore/Api3Ctrl.md) utility:
+
+```html
+<div ng-if="!routeParams.cid">
+  {{ts('Please provide the "cid"')}}
+</div>
+<div ng-if="routeParams.cid"
+  af-api3="['Contact', 'get', {id: routeParams.cid}]"
+  af-api3-ctrl="apiData">
+
+  <div ng-repeat="contact in apiData.result.values">
+    <h1 crm-page-title="">{{contact.display_name}}</h1>
+
+    <h3>Key Contact Fields</h3>
+
+    <div><strong>Contact ID</strong>: {{contact.contact_id}}</div>
+    <div><strong>Contact Type</strong>: {{contact.contact_type}}</div>
+    <div><strong>Display Name</strong>: {{contact.display_name}}</div>
+    <div><strong>First Name</strong>: {{contact.first_name}}</div>
+    <div><strong>Last Name</strong>: {{contact.last_name}}</div>
+
+    <h3>Full Contact record</h3>
+
+    <pre>{{contact|json}}</pre>
+  </div>
+</div>
+```
+
+This example is useful pedagogically and may be useful in a crunch -- but
+for typical user-managed forms, it would be better to use more high-level
+directives.  You can create such directives by [embedding forms](embed.md)
+or creating [conventional AngularJS directives](angular.md).
diff --git a/civicrm/ext/afform/gui/CRM/AfformGui/Upgrader.php b/civicrm/ext/afform/gui/CRM/AfformGui/Upgrader.php
new file mode 100644
index 0000000000000000000000000000000000000000..6b6871c9526a160bbcfa1428c700c972d18d7c86
--- /dev/null
+++ b/civicrm/ext/afform/gui/CRM/AfformGui/Upgrader.php
@@ -0,0 +1,51 @@
+<?php
+use CRM_AfformGui_ExtensionUtil as E;
+
+/**
+ * Collection of upgrade steps.
+ */
+class CRM_AfformGui_Upgrader extends CRM_AfformGui_Upgrader_Base {
+
+  // By convention, functions that look like "function upgrade_NNNN()" are
+  // upgrade tasks. They are executed in order (like Drupal's hook_update_N).
+
+  /**
+   * Setup navigation item on new installs.
+   *
+   * Note: this path is not in the menu.xml because it is handled by afform
+   */
+  public function install() {
+    try {
+      $existing = civicrm_api3('Navigation', 'getcount', [
+        'name' => 'afform_gui',
+        'domain_id' => CRM_Core_Config::domainID(),
+      ]);
+      if (!$existing) {
+        civicrm_api3('Navigation', 'create', [
+          'parent_id' => 'Customize Data and Screens',
+          'label' => ts('Forms'),
+          'weight' => 1,
+          'name' => 'afform_gui',
+          'permission' => 'administer CiviCRM',
+          'url' => 'civicrm/admin/afform',
+          'is_active' => 1,
+        ]);
+      }
+    }
+    catch (Exception $e) {
+      // Couldn't create menu item.
+    }
+  }
+
+  /**
+   * Cleanup navigation upon removal
+   */
+  public function uninstall() {
+    civicrm_api3('Navigation', 'get', [
+      'name' => 'afform_gui',
+      'return' => ['id'],
+      'api.Navigation.delete' => [],
+    ]);
+  }
+
+}
diff --git a/civicrm/ext/afform/gui/CRM/AfformGui/Upgrader/Base.php b/civicrm/ext/afform/gui/CRM/AfformGui/Upgrader/Base.php
new file mode 100644
index 0000000000000000000000000000000000000000..d9632679d7a5c48abc0d55de9985a9f2379f3cde
--- /dev/null
+++ b/civicrm/ext/afform/gui/CRM/AfformGui/Upgrader/Base.php
@@ -0,0 +1,397 @@
+<?php
+
+// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
+use CRM_AfformGui_ExtensionUtil as E;
+
+/**
+ * Base class which provides helpers to execute upgrade logic
+ */
+class CRM_AfformGui_Upgrader_Base {
+
+  /**
+   * @var CRM_AfformGui_Upgrader_Base
+   */
+  public static $instance;
+
+  /**
+   * @var CRM_Queue_TaskContext
+   */
+  protected $ctx;
+
+  /**
+   * @var string
+   *   eg 'com.example.myextension'
+   */
+  protected $extensionName;
+
+  /**
+   * @var string
+   *   full path to the extension's source tree
+   */
+  protected $extensionDir;
+
+  /**
+   * @var revisionNumber[]
+   *   sorted numerically
+   */
+  private $revisions;
+
+  /**
+   * @var bool
+   *   Flag to clean up extension revision data in civicrm_setting
+   */
+  private $revisionStorageIsDeprecated = FALSE;
+
+  /**
+   * Obtain a reference to the active upgrade handler.
+   */
+  public static function instance() {
+    if (!self::$instance) {
+      // FIXME auto-generate
+      self::$instance = new CRM_AfformGui_Upgrader(
+        'org.civicrm.afform-gui',
+        realpath(__DIR__ . '/../../../')
+      );
+    }
+    return self::$instance;
+  }
+
+  /**
+   * Adapter that lets you add normal (non-static) member functions to the queue.
+   *
+   * Note: Each upgrader instance should only be associated with one
+   * task-context; otherwise, this will be non-reentrant.
+   *
+   * ```
+   * CRM_AfformGui_Upgrader_Base::_queueAdapter($ctx, 'methodName', 'arg1', 'arg2');
+   * ```
+   */
+  public static function _queueAdapter() {
+    $instance = self::instance();
+    $args = func_get_args();
+    $instance->ctx = array_shift($args);
+    $instance->queue = $instance->ctx->queue;
+    $method = array_shift($args);
+    return call_user_func_array([$instance, $method], $args);
+  }
+
+  /**
+   * CRM_AfformGui_Upgrader_Base constructor.
+   *
+   * @param $extensionName
+   * @param $extensionDir
+   */
+  public function __construct($extensionName, $extensionDir) {
+    $this->extensionName = $extensionName;
+    $this->extensionDir = $extensionDir;
+  }
+
+  // ******** Task helpers ********
+
+  /**
+   * Run a CustomData file.
+   *
+   * @param string $relativePath
+   *   the CustomData XML file path (relative to this extension's dir)
+   * @return bool
+   */
+  public function executeCustomDataFile($relativePath) {
+    $xml_file = $this->extensionDir . '/' . $relativePath;
+    return $this->executeCustomDataFileByAbsPath($xml_file);
+  }
+
+  /**
+   * Run a CustomData file
+   *
+   * @param string $xml_file
+   *   the CustomData XML file path (absolute path)
+   *
+   * @return bool
+   */
+  protected function executeCustomDataFileByAbsPath($xml_file) {
+    $import = new CRM_Utils_Migrate_Import();
+    $import->run($xml_file);
+    return TRUE;
+  }
+
+  /**
+   * Run a SQL file.
+   *
+   * @param string $relativePath
+   *   the SQL file path (relative to this extension's dir)
+   *
+   * @return bool
+   */
+  public function executeSqlFile($relativePath) {
+    CRM_Utils_File::sourceSQLFile(
+      CIVICRM_DSN,
+      $this->extensionDir . DIRECTORY_SEPARATOR . $relativePath
+    );
+    return TRUE;
+  }
+
+  /**
+   * Run the sql commands in the specified file.
+   *
+   * @param string $tplFile
+   *   The SQL file path (relative to this extension's dir).
+   *   Ex: "sql/mydata.mysql.tpl".
+   *
+   * @return bool
+   * @throws \CRM_Core_Exception
+   */
+  public function executeSqlTemplate($tplFile) {
+    // Assign multilingual variable to Smarty.
+    $upgrade = new CRM_Upgrade_Form();
+
+    $tplFile = CRM_Utils_File::isAbsolute($tplFile) ? $tplFile : $this->extensionDir . DIRECTORY_SEPARATOR . $tplFile;
+    $smarty = CRM_Core_Smarty::singleton();
+    $smarty->assign('domainID', CRM_Core_Config::domainID());
+    CRM_Utils_File::sourceSQLFile(
+      CIVICRM_DSN, $smarty->fetch($tplFile), NULL, TRUE
+    );
+    return TRUE;
+  }
+
+  /**
+   * Run one SQL query.
+   *
+   * This is just a wrapper for CRM_Core_DAO::executeSql, but it
+   * provides syntactic sugar for queueing several tasks that
+   * run different queries
+   *
+   * @return bool
+   */
+  public function executeSql($query, $params = []) {
+    // FIXME verify that we raise an exception on error
+    CRM_Core_DAO::executeQuery($query, $params);
+    return TRUE;
+  }
+
+  /**
+   * Syntactic sugar for enqueuing a task which calls a function in this class.
+   *
+   * The task is weighted so that it is processed
+   * as part of the currently-pending revision.
+   *
+   * After passing the $funcName, you can also pass parameters that will go to
+   * the function. Note that all params must be serializable.
+   */
+  public function addTask($title) {
+    $args = func_get_args();
+    $title = array_shift($args);
+    $task = new CRM_Queue_Task(
+      [get_class($this), '_queueAdapter'],
+      $args,
+      $title
+    );
+    return $this->queue->createItem($task, ['weight' => -1]);
+  }
+
+  // ******** Revision-tracking helpers ********
+
+  /**
+   * Determine if there are any pending revisions.
+   *
+   * @return bool
+   */
+  public function hasPendingRevisions() {
+    $revisions = $this->getRevisions();
+    $currentRevision = $this->getCurrentRevision();
+
+    if (empty($revisions)) {
+      return FALSE;
+    }
+    if (empty($currentRevision)) {
+      return TRUE;
+    }
+
+    return ($currentRevision < max($revisions));
+  }
+
+  /**
+   * Add any pending revisions to the queue.
+   *
+   * @param CRM_Queue_Queue $queue
+   */
+  public function enqueuePendingRevisions(CRM_Queue_Queue $queue) {
+    $this->queue = $queue;
+
+    $currentRevision = $this->getCurrentRevision();
+    foreach ($this->getRevisions() as $revision) {
+      if ($revision > $currentRevision) {
+        $title = E::ts('Upgrade %1 to revision %2', [
+          1 => $this->extensionName,
+          2 => $revision,
+        ]);
+
+        // note: don't use addTask() because it sets weight=-1
+
+        $task = new CRM_Queue_Task(
+          [get_class($this), '_queueAdapter'],
+          ['upgrade_' . $revision],
+          $title
+        );
+        $this->queue->createItem($task);
+
+        $task = new CRM_Queue_Task(
+          [get_class($this), '_queueAdapter'],
+          ['setCurrentRevision', $revision],
+          $title
+        );
+        $this->queue->createItem($task);
+      }
+    }
+  }
+
+  /**
+   * Get a list of revisions.
+   *
+   * @return array
+   *   revisionNumbers sorted numerically
+   */
+  public function getRevisions() {
+    if (!is_array($this->revisions)) {
+      $this->revisions = [];
+
+      $clazz = new ReflectionClass(get_class($this));
+      $methods = $clazz->getMethods();
+      foreach ($methods as $method) {
+        if (preg_match('/^upgrade_(.*)/', $method->name, $matches)) {
+          $this->revisions[] = $matches[1];
+        }
+      }
+      sort($this->revisions, SORT_NUMERIC);
+    }
+
+    return $this->revisions;
+  }
+
+  public function getCurrentRevision() {
+    $revision = CRM_Core_BAO_Extension::getSchemaVersion($this->extensionName);
+    if (!$revision) {
+      $revision = $this->getCurrentRevisionDeprecated();
+    }
+    return $revision;
+  }
+
+  private function getCurrentRevisionDeprecated() {
+    $key = $this->extensionName . ':version';
+    if ($revision = \Civi::settings()->get($key)) {
+      $this->revisionStorageIsDeprecated = TRUE;
+    }
+    return $revision;
+  }
+
+  public function setCurrentRevision($revision) {
+    CRM_Core_BAO_Extension::setSchemaVersion($this->extensionName, $revision);
+    // clean up legacy schema version store (CRM-19252)
+    $this->deleteDeprecatedRevision();
+    return TRUE;
+  }
+
+  private function deleteDeprecatedRevision() {
+    if ($this->revisionStorageIsDeprecated) {
+      $setting = new CRM_Core_BAO_Setting();
+      $setting->name = $this->extensionName . ':version';
+      $setting->delete();
+      CRM_Core_Error::debug_log_message("Migrated extension schema revision ID for {$this->extensionName} from civicrm_setting (deprecated) to civicrm_extension.\n");
+    }
+  }
+
+  // ******** Hook delegates ********
+
+  /**
+   * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+   */
+  public function onInstall() {
+    $files = glob($this->extensionDir . '/sql/*_install.sql');
+    if (is_array($files)) {
+      foreach ($files as $file) {
+        CRM_Utils_File::sourceSQLFile(CIVICRM_DSN, $file);
+      }
+    }
+    $files = glob($this->extensionDir . '/sql/*_install.mysql.tpl');
+    if (is_array($files)) {
+      foreach ($files as $file) {
+        $this->executeSqlTemplate($file);
+      }
+    }
+    $files = glob($this->extensionDir . '/xml/*_install.xml');
+    if (is_array($files)) {
+      foreach ($files as $file) {
+        $this->executeCustomDataFileByAbsPath($file);
+      }
+    }
+    if (is_callable([$this, 'install'])) {
+      $this->install();
+    }
+  }
+
+  /**
+   * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
+   */
+  public function onPostInstall() {
+    $revisions = $this->getRevisions();
+    if (!empty($revisions)) {
+      $this->setCurrentRevision(max($revisions));
+    }
+    if (is_callable([$this, 'postInstall'])) {
+      $this->postInstall();
+    }
+  }
+
+  /**
+   * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
+   */
+  public function onUninstall() {
+    $files = glob($this->extensionDir . '/sql/*_uninstall.mysql.tpl');
+    if (is_array($files)) {
+      foreach ($files as $file) {
+        $this->executeSqlTemplate($file);
+      }
+    }
+    if (is_callable([$this, 'uninstall'])) {
+      $this->uninstall();
+    }
+    $files = glob($this->extensionDir . '/sql/*_uninstall.sql');
+    if (is_array($files)) {
+      foreach ($files as $file) {
+        CRM_Utils_File::sourceSQLFile(CIVICRM_DSN, $file);
+      }
+    }
+  }
+
+  /**
+   * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+   */
+  public function onEnable() {
+    // stub for possible future use
+    if (is_callable([$this, 'enable'])) {
+      $this->enable();
+    }
+  }
+
+  /**
+   * @see https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
+   */
+  public function onDisable() {
+    // stub for possible future use
+    if (is_callable([$this, 'disable'])) {
+      $this->disable();
+    }
+  }
+
+  public function onUpgrade($op, CRM_Queue_Queue $queue = NULL) {
+    switch ($op) {
+      case 'check':
+        return [$this->hasPendingRevisions()];
+
+      case 'enqueue':
+        return $this->enqueuePendingRevisions($queue);
+
+      default:
+    }
+  }
+
+}
diff --git a/civicrm/ext/afform/gui/LICENSE.txt b/civicrm/ext/afform/gui/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5d5da2f23320b9eefff57857e0526c2d24765f08
--- /dev/null
+++ b/civicrm/ext/afform/gui/LICENSE.txt
@@ -0,0 +1,667 @@
+Package: org.civicrm.afform-gui
+Copyright (C) 2019, Tim Otten <totten@civicrm.org>
+Licensed under the GNU Affero Public License 3.0 (below).
+
+-------------------------------------------------------------------------------
+
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/civicrm/ext/afform/gui/README.md b/civicrm/ext/afform/gui/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c1682405df662640ffd6d3860ec92d41a4763e1a
--- /dev/null
+++ b/civicrm/ext/afform/gui/README.md
@@ -0,0 +1,44 @@
+# org.civicrm.afform-gui
+
+![Screenshot](/images/screenshot.png)
+
+(*FIXME: In one or two paragraphs, describe what the extension does and why one would download it. *)
+
+The extension is licensed under [AGPL-3.0](LICENSE.txt).
+
+## Requirements
+
+* PHP v5.4+
+* CiviCRM (*FIXME: Version number*)
+
+## Installation (Web UI)
+
+This extension has not yet been published for installation via the web UI.
+
+## Installation (CLI, Zip)
+
+Sysadmins and developers may download the `.zip` file for this extension and
+install it with the command-line tool [cv](https://github.com/civicrm/cv).
+
+```bash
+cd <extension-dir>
+cv dl org.civicrm.afform-gui@https://github.com/FIXME/org.civicrm.afform-gui/archive/master.zip
+```
+
+## Installation (CLI, Git)
+
+Sysadmins and developers may clone the [Git](https://en.wikipedia.org/wiki/Git) repo for this extension and
+install it with the command-line tool [cv](https://github.com/civicrm/cv).
+
+```bash
+git clone https://github.com/FIXME/org.civicrm.afform-gui.git
+cv en afform_gui
+```
+
+## Usage
+
+(* FIXME: Where would a new user navigate to get started? What changes would they see? *)
+
+## Known Issues
+
+(* FIXME *)
diff --git a/civicrm/ext/afform/gui/afformEntities/Activity.php b/civicrm/ext/afform/gui/afformEntities/Activity.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d362f1fdac3b91cdbea1f36808f925025fffa6d
--- /dev/null
+++ b/civicrm/ext/afform/gui/afformEntities/Activity.php
@@ -0,0 +1,6 @@
+<?php
+return [
+  'entity' => 'Activity',
+  'label' => ts('Activity'),
+  'defaults' => "{'url-autofill': '1'}",
+];
diff --git a/civicrm/ext/afform/gui/afformEntities/Household.php b/civicrm/ext/afform/gui/afformEntities/Household.php
new file mode 100644
index 0000000000000000000000000000000000000000..0788e51fe1c890dd98834fb4030f61732ff68cb6
--- /dev/null
+++ b/civicrm/ext/afform/gui/afformEntities/Household.php
@@ -0,0 +1,12 @@
+<?php
+return [
+  'entity' => 'Contact',
+  'contact_type' => 'Household',
+  'defaults' => "{
+    data: {
+      contact_type: 'Household',
+      source: afform.title
+    },
+    'url-autofill': '1'
+  }",
+];
diff --git a/civicrm/ext/afform/gui/afformEntities/Individual.php b/civicrm/ext/afform/gui/afformEntities/Individual.php
new file mode 100644
index 0000000000000000000000000000000000000000..626518f3bf6590992a4852b396b580f87e4f09f6
--- /dev/null
+++ b/civicrm/ext/afform/gui/afformEntities/Individual.php
@@ -0,0 +1,12 @@
+<?php
+return [
+  'entity' => 'Contact',
+  'contact_type' => 'Individual',
+  'defaults' => "{
+    data: {
+      contact_type: 'Individual',
+      source: afform.title
+    },
+    'url-autofill': '1'
+  }",
+];
diff --git a/civicrm/ext/afform/gui/afformEntities/Organization.php b/civicrm/ext/afform/gui/afformEntities/Organization.php
new file mode 100644
index 0000000000000000000000000000000000000000..358dcf3cda0f9f544e7e37f9032424166b88f84d
--- /dev/null
+++ b/civicrm/ext/afform/gui/afformEntities/Organization.php
@@ -0,0 +1,12 @@
+<?php
+return [
+  'entity' => 'Contact',
+  'contact_type' => 'Organization',
+  'defaults' => "{
+    data: {
+      contact_type: 'Organization',
+      source: afform.title
+    },
+    'url-autofill': '1'
+  }",
+];
diff --git a/civicrm/ext/afform/gui/afform_gui.civix.php b/civicrm/ext/afform/gui/afform_gui.civix.php
new file mode 100644
index 0000000000000000000000000000000000000000..b384f42b276ce31c6760cec925d1ccb4e5d65afb
--- /dev/null
+++ b/civicrm/ext/afform/gui/afform_gui.civix.php
@@ -0,0 +1,477 @@
+<?php
+
+// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
+
+/**
+ * The ExtensionUtil class provides small stubs for accessing resources of this
+ * extension.
+ */
+class CRM_AfformGui_ExtensionUtil {
+  const SHORT_NAME = "afform_gui";
+  const LONG_NAME = "org.civicrm.afform-gui";
+  const CLASS_PREFIX = "CRM_AfformGui";
+
+  /**
+   * Translate a string using the extension's domain.
+   *
+   * If the extension doesn't have a specific translation
+   * for the string, fallback to the default translations.
+   *
+   * @param string $text
+   *   Canonical message text (generally en_US).
+   * @param array $params
+   * @return string
+   *   Translated text.
+   * @see ts
+   */
+  public static function ts($text, $params = []) {
+    if (!array_key_exists('domain', $params)) {
+      $params['domain'] = [self::LONG_NAME, NULL];
+    }
+    return ts($text, $params);
+  }
+
+  /**
+   * Get the URL of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo'.
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function url($file = NULL) {
+    if ($file === NULL) {
+      return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/');
+    }
+    return CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME, $file);
+  }
+
+  /**
+   * Get the path of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo'.
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function path($file = NULL) {
+    // return CRM_Core_Resources::singleton()->getPath(self::LONG_NAME, $file);
+    return __DIR__ . ($file === NULL ? '' : (DIRECTORY_SEPARATOR . $file));
+  }
+
+  /**
+   * Get the name of a class within this extension.
+   *
+   * @param string $suffix
+   *   Ex: 'Page_HelloWorld' or 'Page\\HelloWorld'.
+   * @return string
+   *   Ex: 'CRM_Foo_Page_HelloWorld'.
+   */
+  public static function findClass($suffix) {
+    return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix);
+  }
+
+}
+
+use CRM_AfformGui_ExtensionUtil as E;
+
+/**
+ * (Delegated) Implements hook_civicrm_config().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config
+ */
+function _afform_gui_civix_civicrm_config(&$config = NULL) {
+  static $configured = FALSE;
+  if ($configured) {
+    return;
+  }
+  $configured = TRUE;
+
+  $template =& CRM_Core_Smarty::singleton();
+
+  $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
+  $extDir = $extRoot . 'templates';
+
+  if (is_array($template->template_dir)) {
+    array_unshift($template->template_dir, $extDir);
+  }
+  else {
+    $template->template_dir = [$extDir, $template->template_dir];
+  }
+
+  $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
+  set_include_path($include_path);
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_xmlMenu().
+ *
+ * @param $files array(string)
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu
+ */
+function _afform_gui_civix_civicrm_xmlMenu(&$files) {
+  foreach (_afform_gui_civix_glob(__DIR__ . '/xml/Menu/*.xml') as $file) {
+    $files[] = $file;
+  }
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+ */
+function _afform_gui_civix_civicrm_install() {
+  _afform_gui_civix_civicrm_config();
+  if ($upgrader = _afform_gui_civix_upgrader()) {
+    $upgrader->onInstall();
+  }
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
+ */
+function _afform_gui_civix_civicrm_postInstall() {
+  _afform_gui_civix_civicrm_config();
+  if ($upgrader = _afform_gui_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onPostInstall'])) {
+      $upgrader->onPostInstall();
+    }
+  }
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
+ */
+function _afform_gui_civix_civicrm_uninstall() {
+  _afform_gui_civix_civicrm_config();
+  if ($upgrader = _afform_gui_civix_upgrader()) {
+    $upgrader->onUninstall();
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_enable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+ */
+function _afform_gui_civix_civicrm_enable() {
+  _afform_gui_civix_civicrm_config();
+  if ($upgrader = _afform_gui_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onEnable'])) {
+      $upgrader->onEnable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_disable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
+ * @return mixed
+ */
+function _afform_gui_civix_civicrm_disable() {
+  _afform_gui_civix_civicrm_config();
+  if ($upgrader = _afform_gui_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onDisable'])) {
+      $upgrader->onDisable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_upgrade().
+ *
+ * @param $op string, the type of operation being performed; 'check' or 'enqueue'
+ * @param $queue CRM_Queue_Queue, (for 'enqueue') the modifiable list of pending up upgrade tasks
+ *
+ * @return mixed
+ *   based on op. for 'check', returns array(boolean) (TRUE if upgrades are pending)
+ *   for 'enqueue', returns void
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade
+ */
+function _afform_gui_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  if ($upgrader = _afform_gui_civix_upgrader()) {
+    return $upgrader->onUpgrade($op, $queue);
+  }
+}
+
+/**
+ * @return CRM_AfformGui_Upgrader
+ */
+function _afform_gui_civix_upgrader() {
+  if (!file_exists(__DIR__ . '/CRM/AfformGui/Upgrader.php')) {
+    return NULL;
+  }
+  else {
+    return CRM_AfformGui_Upgrader_Base::instance();
+  }
+}
+
+/**
+ * Search directory tree for files which match a glob pattern.
+ *
+ * Note: Dot-directories (like "..", ".git", or ".svn") will be ignored.
+ * Note: In Civi 4.3+, delegate to CRM_Utils_File::findFiles()
+ *
+ * @param string $dir base dir
+ * @param string $pattern , glob pattern, eg "*.txt"
+ *
+ * @return array
+ */
+function _afform_gui_civix_find_files($dir, $pattern) {
+  if (is_callable(['CRM_Utils_File', 'findFiles'])) {
+    return CRM_Utils_File::findFiles($dir, $pattern);
+  }
+
+  $todos = [$dir];
+  $result = [];
+  while (!empty($todos)) {
+    $subdir = array_shift($todos);
+    foreach (_afform_gui_civix_glob("$subdir/$pattern") as $match) {
+      if (!is_dir($match)) {
+        $result[] = $match;
+      }
+    }
+    if ($dh = opendir($subdir)) {
+      while (FALSE !== ($entry = readdir($dh))) {
+        $path = $subdir . DIRECTORY_SEPARATOR . $entry;
+        if ($entry[0] == '.') {
+        }
+        elseif (is_dir($path)) {
+          $todos[] = $path;
+        }
+      }
+      closedir($dh);
+    }
+  }
+  return $result;
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_managed().
+ *
+ * Find any *.mgd.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed
+ */
+function _afform_gui_civix_civicrm_managed(&$entities) {
+  $mgdFiles = _afform_gui_civix_find_files(__DIR__, '*.mgd.php');
+  sort($mgdFiles);
+  foreach ($mgdFiles as $file) {
+    $es = include $file;
+    foreach ($es as $e) {
+      if (empty($e['module'])) {
+        $e['module'] = E::LONG_NAME;
+      }
+      if (empty($e['params']['version'])) {
+        $e['params']['version'] = '3';
+      }
+      $entities[] = $e;
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_caseTypes().
+ *
+ * Find any and return any files matching "xml/case/*.xml"
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes
+ */
+function _afform_gui_civix_civicrm_caseTypes(&$caseTypes) {
+  if (!is_dir(__DIR__ . '/xml/case')) {
+    return;
+  }
+
+  foreach (_afform_gui_civix_glob(__DIR__ . '/xml/case/*.xml') as $file) {
+    $name = preg_replace('/\.xml$/', '', basename($file));
+    if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) {
+      $errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name));
+      throw new CRM_Core_Exception($errorMessage);
+    }
+    $caseTypes[$name] = [
+      'module' => E::LONG_NAME,
+      'name' => $name,
+      'file' => $file,
+    ];
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_angularModules().
+ *
+ * Find any and return any files matching "ang/*.ang.php"
+ *
+ * Note: This hook only runs in CiviCRM 4.5+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules
+ */
+function _afform_gui_civix_civicrm_angularModules(&$angularModules) {
+  if (!is_dir(__DIR__ . '/ang')) {
+    return;
+  }
+
+  $files = _afform_gui_civix_glob(__DIR__ . '/ang/*.ang.php');
+  foreach ($files as $file) {
+    $name = preg_replace(':\.ang\.php$:', '', basename($file));
+    $module = include $file;
+    if (empty($module['ext'])) {
+      $module['ext'] = E::LONG_NAME;
+    }
+    $angularModules[$name] = $module;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_themes().
+ *
+ * Find any and return any files matching "*.theme.php"
+ */
+function _afform_gui_civix_civicrm_themes(&$themes) {
+  $files = _afform_gui_civix_glob(__DIR__ . '/*.theme.php');
+  foreach ($files as $file) {
+    $themeMeta = include $file;
+    if (empty($themeMeta['name'])) {
+      $themeMeta['name'] = preg_replace(':\.theme\.php$:', '', basename($file));
+    }
+    if (empty($themeMeta['ext'])) {
+      $themeMeta['ext'] = E::LONG_NAME;
+    }
+    $themes[$themeMeta['name']] = $themeMeta;
+  }
+}
+
+/**
+ * Glob wrapper which is guaranteed to return an array.
+ *
+ * The documentation for glob() says, "On some systems it is impossible to
+ * distinguish between empty match and an error." Anecdotally, the return
+ * result for an empty match is sometimes array() and sometimes FALSE.
+ * This wrapper provides consistency.
+ *
+ * @link http://php.net/glob
+ * @param string $pattern
+ *
+ * @return array
+ */
+function _afform_gui_civix_glob($pattern) {
+  $result = glob($pattern);
+  return is_array($result) ? $result : [];
+}
+
+/**
+ * Inserts a navigation menu item at a given place in the hierarchy.
+ *
+ * @param array $menu - menu hierarchy
+ * @param string $path - path to parent of this item, e.g. 'my_extension/submenu'
+ *    'Mailing', or 'Administer/System Settings'
+ * @param array $item - the item to insert (parent/child attributes will be
+ *    filled for you)
+ *
+ * @return bool
+ */
+function _afform_gui_civix_insert_navigation_menu(&$menu, $path, $item) {
+  // If we are done going down the path, insert menu
+  if (empty($path)) {
+    $menu[] = [
+      'attributes' => array_merge([
+        'label'      => CRM_Utils_Array::value('name', $item),
+        'active'     => 1,
+      ], $item),
+    ];
+    return TRUE;
+  }
+  else {
+    // Find an recurse into the next level down
+    $found = FALSE;
+    $path = explode('/', $path);
+    $first = array_shift($path);
+    foreach ($menu as $key => &$entry) {
+      if ($entry['attributes']['name'] == $first) {
+        if (!isset($entry['child'])) {
+          $entry['child'] = [];
+        }
+        $found = _afform_gui_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item);
+      }
+    }
+    return $found;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_navigationMenu().
+ */
+function _afform_gui_civix_navigationMenu(&$nodes) {
+  if (!is_callable(['CRM_Core_BAO_Navigation', 'fixNavigationMenu'])) {
+    _afform_gui_civix_fixNavigationMenu($nodes);
+  }
+}
+
+/**
+ * Given a navigation menu, generate navIDs for any items which are
+ * missing them.
+ */
+function _afform_gui_civix_fixNavigationMenu(&$nodes) {
+  $maxNavID = 1;
+  array_walk_recursive($nodes, function($item, $key) use (&$maxNavID) {
+    if ($key === 'navID') {
+      $maxNavID = max($maxNavID, $item);
+    }
+  });
+  _afform_gui_civix_fixNavigationMenuItems($nodes, $maxNavID, NULL);
+}
+
+function _afform_gui_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $parentID) {
+  $origKeys = array_keys($nodes);
+  foreach ($origKeys as $origKey) {
+    if (!isset($nodes[$origKey]['attributes']['parentID']) && $parentID !== NULL) {
+      $nodes[$origKey]['attributes']['parentID'] = $parentID;
+    }
+    // If no navID, then assign navID and fix key.
+    if (!isset($nodes[$origKey]['attributes']['navID'])) {
+      $newKey = ++$maxNavID;
+      $nodes[$origKey]['attributes']['navID'] = $newKey;
+      $nodes[$newKey] = $nodes[$origKey];
+      unset($nodes[$origKey]);
+      $origKey = $newKey;
+    }
+    if (isset($nodes[$origKey]['child']) && is_array($nodes[$origKey]['child'])) {
+      _afform_gui_civix_fixNavigationMenuItems($nodes[$origKey]['child'], $maxNavID, $nodes[$origKey]['attributes']['navID']);
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders
+ */
+function _afform_gui_civix_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  $settingsDir = __DIR__ . DIRECTORY_SEPARATOR . 'settings';
+  if (!in_array($settingsDir, $metaDataFolders) && is_dir($settingsDir)) {
+    $metaDataFolders[] = $settingsDir;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_entityTypes().
+ *
+ * Find any *.entityType.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes
+ */
+function _afform_gui_civix_civicrm_entityTypes(&$entityTypes) {
+  $entityTypes = array_merge($entityTypes, []);
+}
diff --git a/civicrm/ext/afform/gui/afform_gui.php b/civicrm/ext/afform/gui/afform_gui.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5fe4e3091257d7249aa16fe0c8b9cd537c3bf26
--- /dev/null
+++ b/civicrm/ext/afform/gui/afform_gui.php
@@ -0,0 +1,325 @@
+<?php
+
+require_once 'afform_gui.civix.php';
+use CRM_AfformGui_ExtensionUtil as E;
+
+/**
+ * Implements hook_civicrm_config().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_config
+ */
+function afform_gui_civicrm_config(&$config) {
+  _afform_gui_civix_civicrm_config($config);
+}
+
+/**
+ * Implements hook_civicrm_xmlMenu().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_xmlMenu
+ */
+function afform_gui_civicrm_xmlMenu(&$files) {
+  _afform_gui_civix_civicrm_xmlMenu($files);
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_install
+ */
+function afform_gui_civicrm_install() {
+  _afform_gui_civix_civicrm_install();
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_postInstall
+ */
+function afform_gui_civicrm_postInstall() {
+  _afform_gui_civix_civicrm_postInstall();
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_uninstall
+ */
+function afform_gui_civicrm_uninstall() {
+  _afform_gui_civix_civicrm_uninstall();
+}
+
+/**
+ * Implements hook_civicrm_enable().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_enable
+ */
+function afform_gui_civicrm_enable() {
+  _afform_gui_civix_civicrm_enable();
+}
+
+/**
+ * Implements hook_civicrm_disable().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_disable
+ */
+function afform_gui_civicrm_disable() {
+  _afform_gui_civix_civicrm_disable();
+}
+
+/**
+ * Implements hook_civicrm_upgrade().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_upgrade
+ */
+function afform_gui_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  return _afform_gui_civix_civicrm_upgrade($op, $queue);
+}
+
+/**
+ * Implements hook_civicrm_managed().
+ *
+ * Generate a list of entities to create/deactivate/delete when this module
+ * is installed, disabled, uninstalled.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_managed
+ */
+function afform_gui_civicrm_managed(&$entities) {
+  _afform_gui_civix_civicrm_managed($entities);
+}
+
+/**
+ * Implements hook_civicrm_caseTypes().
+ *
+ * Generate a list of case-types.
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_caseTypes
+ */
+function afform_gui_civicrm_caseTypes(&$caseTypes) {
+  _afform_gui_civix_civicrm_caseTypes($caseTypes);
+}
+
+/**
+ * Implements hook_civicrm_angularModules().
+ *
+ * Generate a list of Angular modules.
+ *
+ * Note: This hook only runs in CiviCRM 4.5+. It may
+ * use features only available in v4.6+.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_angularModules
+ */
+function afform_gui_civicrm_angularModules(&$angularModules) {
+  _afform_gui_civix_civicrm_angularModules($angularModules);
+}
+
+/**
+ * Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_alterSettingsFolders
+ */
+function afform_gui_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  _afform_gui_civix_civicrm_alterSettingsFolders($metaDataFolders);
+}
+
+/**
+ * Implements hook_civicrm_entityTypes().
+ *
+ * Declare entity types provided by this module.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_entityTypes
+ */
+function afform_gui_civicrm_entityTypes(&$entityTypes) {
+  _afform_gui_civix_civicrm_entityTypes($entityTypes);
+}
+
+/**
+ * Implements hook_civicrm_themes().
+ */
+function afform_gui_civicrm_themes(&$themes) {
+  _afform_gui_civix_civicrm_themes($themes);
+}
+
+/**
+ * Implements hook_civicrm_pageRun().
+ */
+function afform_gui_civicrm_pageRun(&$page) {
+  if (get_class($page) == 'CRM_Afform_Page_AfformBase' && $page->get('afModule') == 'afGuiAdmin') {
+    Civi::resources()->addScriptUrl(Civi::service('asset_builder')->getUrl('af-gui-vars.js'));
+  }
+}
+
+/**
+ * Implements hook_civicrm_buildAsset().
+ *
+ * Loads metadata to send to the gui editor.
+ *
+ * FIXME: This is a prototype and should get broken out into separate callbacks with hooks, events, etc.
+ */
+function afform_gui_civicrm_buildAsset($asset, $params, &$mimeType, &$content) {
+  if ($asset !== 'af-gui-vars.js') {
+    return;
+  }
+
+  $getFieldParams = [
+    'checkPermissions' => FALSE,
+    'includeCustom' => TRUE,
+    'loadOptions' => TRUE,
+    'action' => 'create',
+    'select' => ['name', 'title', 'input_type', 'input_attrs', 'required', 'options', 'help_pre', 'help_post', 'serialize', 'data_type'],
+    'where' => [['input_type', 'IS NOT NULL']],
+  ];
+
+  $data = [
+    'entities' => [
+      'Contact' => [
+        'entity' => 'Contact',
+        'label' => ts('Contact'),
+        'fields' => (array) civicrm_api4('Contact', 'getFields', $getFieldParams, 'name'),
+      ],
+    ],
+    'blocks' => [],
+  ];
+
+  $contactTypes = CRM_Contact_BAO_ContactType::basicTypeInfo();
+
+  // Scan all extensions for our list of supported entities
+  foreach (CRM_Extension_System::singleton()->getMapper()->getActiveModuleFiles() as $ext) {
+    $dir = CRM_Utils_File::addTrailingSlash(dirname($ext['filePath'])) . 'afformEntities';
+    if (is_dir($dir)) {
+      foreach (glob($dir . '/*.php') as $file) {
+        $entity = include $file;
+        // Skip disabled contact types
+        if (!empty($entity['contact_type']) && !isset($contactTypes[$entity['contact_type']])) {
+          continue;
+        }
+        if (!empty($entity['contact_type'])) {
+          $entity['label'] = $contactTypes[$entity['contact_type']]['label'];
+        }
+        // For Contact pseudo-entities (Individual, Organization, Household)
+        $values = array_intersect_key($entity, ['contact_type' => NULL]);
+        $afformEntity = $entity['contact_type'] ?? $entity['entity'];
+        $entity['fields'] = (array) civicrm_api4($entity['entity'], 'getFields', $getFieldParams + ['values' => $values], 'name');
+        $data['entities'][$afformEntity] = $entity;
+      }
+    }
+  }
+
+  // Load fields from afform blocks with joins
+  $blockData = \Civi\Api4\Afform::get()
+    ->setCheckPermissions(FALSE)
+    ->addWhere('join', 'IS NOT NULL')
+    ->setSelect(['join'])
+    ->execute();
+  foreach ($blockData as $block) {
+    if (!isset($data['entities'][$block['join']]['fields'])) {
+      $data['entities'][$block['join']]['entity'] = $block['join'];
+      // Normally you shouldn't pass variables to ts() but very common strings like "Email" should already exist
+      $data['entities'][$block['join']]['label'] = ts($block['join']);
+      $data['entities'][$block['join']]['fields'] = (array) civicrm_api4($block['join'], 'getFields', $getFieldParams, 'name');
+    }
+  }
+
+  // Todo: add method for extensions to define other elements
+  $data['elements'] = [
+    'container' => [
+      'title' => ts('Container'),
+      'element' => [
+        '#tag' => 'div',
+        'class' => 'af-container',
+        '#children' => [],
+      ],
+    ],
+    'text' => [
+      'title' => ts('Text box'),
+      'element' => [
+        '#tag' => 'p',
+        'class' => 'af-text',
+        '#children' => [
+          ['#text' => ts('Enter text')],
+        ],
+      ],
+    ],
+    'markup' => [
+      'title' => ts('Rich content'),
+      'element' => [
+        '#tag' => 'div',
+        'class' => 'af-markup',
+        '#markup' => FALSE,
+      ],
+    ],
+    'submit' => [
+      'title' => ts('Submit Button'),
+      'element' => [
+        '#tag' => 'button',
+        'class' => 'af-button btn-primary',
+        'crm-icon' => 'fa-check',
+        'ng-click' => 'afform.submit()',
+        '#children' => [
+          ['#text' => ts('Submit')],
+        ],
+      ],
+    ],
+    'fieldset' => [
+      'title' => ts('Fieldset'),
+      'element' => [
+        '#tag' => 'fieldset',
+        'af-fieldset' => NULL,
+        '#children' => [
+          [
+            '#tag' => 'legend',
+            'class' => 'af-text',
+            '#children' => [
+              [
+                '#text' => ts('Enter title'),
+              ],
+            ],
+          ],
+        ],
+      ],
+    ],
+  ];
+
+  // Reformat options
+  // TODO: Teach the api to return options in this format
+  foreach ($data['entities'] as $entityName => $entity) {
+    foreach ($entity['fields'] as $name => $field) {
+      if (!empty($field['options'])) {
+        $data['entities'][$entityName]['fields'][$name]['options'] = CRM_Utils_Array::makeNonAssociative($field['options'], 'key', 'label');
+      }
+      else {
+        unset($data['entities'][$entityName]['fields'][$name]['options']);
+      }
+    }
+  }
+
+  // Scan for input types
+  // FIXME: Need a way to load this from other extensions too
+  foreach (glob(__DIR__ . '/ang/afGuiEditor/inputType/*.html') as $file) {
+    $matches = [];
+    preg_match('/([-a-z_A-Z0-9]*).html/', $file, $matches);
+    $data['inputType'][$matches[1]] = $matches[1];
+  }
+
+  $data['styles'] = [
+    'default' => ts('Default'),
+    'primary' => ts('Primary'),
+    'success' => ts('Success'),
+    'info' => ts('Info'),
+    'warning' => ts('Warning'),
+    'danger' => ts('Danger'),
+  ];
+
+  $data['permissions'] = [];
+  foreach (CRM_Core_Permission::basicPermissions(TRUE, TRUE) as $name => $perm) {
+    $data['permissions'][] = [
+      'id' => $name,
+      'text' => $perm[0],
+      'description' => $perm[1] ?? NULL,
+    ];
+  }
+
+  $mimeType = 'text/javascript';
+  $content = "CRM.afformAdminData=" . json_encode($data, JSON_UNESCAPED_SLASHES) . ';';
+}
diff --git a/civicrm/ext/afform/gui/ang/afGuiAdmin.aff.html b/civicrm/ext/afform/gui/ang/afGuiAdmin.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..a87be4db0f83c3b408ea9e29d29ce380b30967c6
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiAdmin.aff.html
@@ -0,0 +1,7 @@
+<div ng-if="!routeParams.name">
+  <div af-gui-list=""></div>
+</div>
+
+<div ng-if="routeParams.name">
+  <div af-gui-editor="{name: routeParams.name}"></div>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiAdmin.aff.json b/civicrm/ext/afform/gui/ang/afGuiAdmin.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..2ad6e8c107a073d3f0261562dbf7bee0ff094e12
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiAdmin.aff.json
@@ -0,0 +1,9 @@
+{
+  "title": "Afform Administration",
+  "server_route": "civicrm/admin/afform",
+  "permission": "administer CiviCRM",
+  "requires": [
+    "afGuiEditor",
+    "ui.sortable"
+  ]
+}
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor.ang.php b/civicrm/ext/afform/gui/ang/afGuiEditor.ang.php
new file mode 100644
index 0000000000000000000000000000000000000000..cea47a8d19f268a8165632029330429278453482
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor.ang.php
@@ -0,0 +1,16 @@
+<?php
+// Angular module for afform gui editor
+return [
+  'js' => [
+    'ang/afGuiEditor.js',
+    'ang/afGuiEditor/*.js',
+  ],
+  'css' => ['ang/afGuiEditor.css'],
+  'partials' => ['ang/afGuiEditor'],
+  'requires' => ['crmUi', 'crmUtil', 'dialogService', 'api4'],
+  'settings' => [],
+  'basePages' => [],
+  'exports' => [
+    'af-gui-editor' => 'A',
+  ],
+];
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor.css b/civicrm/ext/afform/gui/ang/afGuiEditor.css
new file mode 100644
index 0000000000000000000000000000000000000000..fa0d8fddc997cdbe9770d586981815e42abdbc8d
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor.css
@@ -0,0 +1,486 @@
+#afGuiEditor {
+  display: flex;
+}
+
+#afGuiEditor #afGuiEditor-palette {
+  flex: 1;
+  margin-right: 5px;
+}
+
+#afGuiEditor #afGuiEditor-canvas {
+  flex: 1.5;
+  margin-left: 5px;
+}
+
+#afGuiEditor .panel-body {
+  padding: 5px 12px;
+  position: relative;
+}
+
+#afGuiEditor fieldset legend {
+  padding-top: 5px;
+  font-size: 16px;
+  margin-bottom: 5px !important;
+}
+
+#afGuiEditor-palette fieldset legend {
+  height: 30px;
+}
+
+#afGuiEditor hr {
+  margin-top: 15px;
+  margin-bottom: 10px;
+}
+
+#afGuiEditor #afGuiEditor-palette-tabs li {
+  top: 1px;
+}
+
+#afGuiEditor #afGuiEditor-palette-tabs li > a {
+  padding: 10px 15px;
+  font-size: 12px;
+}
+
+#afGuiEditor .af-gui-columns {
+  display: flex;
+  position: relative;
+  flex-wrap: wrap;
+}
+#afGuiEditor .af-gui-columns > * {
+  flex: 1;
+  min-width: 200px;
+}
+
+#afGuiEditor .af-gui-remove-entity {
+  position: absolute;
+  right: 3px;
+  top: 3px;
+}
+
+#afGuiEditor .crm-editable-enabled,
+#afGuiEditor-palette-tabs > li > a > span {
+  display: inline-block;
+  padding: 0 4px !important;
+  border: 2px solid transparent !important;
+}
+#afGuiEditor .crm-editable-enabled:hover:not(:focus) {
+  border: 2px dashed grey !important;
+}
+#afGuiEditor .crm-editable-enabled:before,
+#afGuiEditor .crm-editable-enabled:after {
+  content: '';
+  display: none;
+}
+
+#afGuiEditor-palette-config .af-gui-entity-values .form-inline {
+  margin-bottom: 10px;
+}
+
+#afGuiEditor-palette-config .form-inline label {
+  min-width: 110px;
+}
+
+#afGuiEditor-palette-config .af-gui-entity-palette [type=search] {
+  width: 120px;
+  padding: 3px 3px 3px 5px;
+  height: 25px;
+  font-weight: normal;
+  position: relative;
+  top: -3px;
+  font-size: 12px;
+}
+
+#afGuiEditor input[type=search]::placeholder {
+  font-family: FontAwesome;
+  text-align: right;
+}
+#afGuiEditor input[type=search]:-ms-input-placeholder {
+  font-family: FontAwesome;
+  text-align: right;
+}
+#afGuiEditor input[type=search]::-ms-input-placeholder {
+  font-family: FontAwesome;
+  text-align: right;
+}
+
+#afGuiEditor .af-gui-bar {
+  height: 22px;
+  width: 100%;
+  opacity: 0;
+  transition: opacity 1s 2s;
+  position:relative;
+  font-family: "Courier New", Courier, monospace;
+  font-size: 12px;
+}
+#afGuiEditor [ui-sortable] .af-gui-bar {
+  cursor: move;
+  background-color: #f2f2f2;
+  position: absolute;
+  top: 0;
+  left: 0;
+  padding-left: 15px;
+}
+#afGuiEditor-canvas:hover .af-gui-bar {
+  opacity: 1;
+  transition: opacity .2s;
+}
+
+#afGuiEditor .af-gui-bar .btn.active {
+  background-color: #b3b3b3;
+}
+
+#afGuiEditor .af-gui-element {
+  position: relative;
+  padding: 0 3px 3px;
+}
+
+#afGuiEditor .af-gui-container {
+  border: 2px dashed transparent;
+  position: relative;
+  padding: 22px 3px 3px;
+  min-height: 40px;
+}
+
+#afGuiEditor .af-gui-container-type-fieldset {
+  box-shadow: 0 0 5px #bbbbbb;
+}
+
+#afGuiEditor .af-gui-container:hover {
+  border: 2px dashed #757575;
+}
+
+#afGuiEditor .af-gui-markup {
+  padding: 22px 3px 3px;
+  position: relative;
+}
+
+#afGuiEditor div.af-gui-markup-content {
+  display: block;
+  position: relative;
+  padding: 0 !important;
+}
+
+#afGuiEditor .af-gui-markup-content-overlay {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+
+#afGuiEditor .af-gui-markup-content:hover .af-gui-markup-content-overlay {
+  background-color: rgba(255, 255, 255, .2);
+}
+
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected {
+  border: 2px dashed #0071bd;
+}
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar {
+  background-color: #0071bd;
+  opacity: 1;
+  transition: opacity 0s;
+}
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > button > span,
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > span {
+  color: white;
+}
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > button:hover > span,
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .open > button > span,
+#afGuiEditor #afGuiEditor-canvas .af-entity-selected > .af-gui-bar > .form-inline > button:focus > span {
+  color: #0071bd;
+}
+
+#afGuiEditor [ui-sortable] {
+  min-height: 25px;
+}
+
+#afGuiEditor .af-gui-entity-palette-select-list {
+  max-height: 400px;
+  overflow-y: auto;
+}
+
+#afGuiEditor .af-gui-entity-palette-select-list [ui-sortable] > div {
+  cursor: move;
+  padding-left: 10px;
+  position: relative;
+}
+#afGuiEditor .af-gui-entity-palette-select-list [ui-sortable] > div.disabled {
+  cursor: auto;
+}
+#afGuiEditor .af-gui-entity-palette-select-list [ui-sortable] > div:not(.disabled):hover {
+  background-color: #efefef;
+}
+/* grip handle */
+#afGuiEditor [ui-sortable] .af-gui-bar:before,
+#afGuiEditor .af-gui-entity-palette-select-list [ui-sortable] > div:not(.disabled):hover:before,
+#afGuiEditor [af-gui-edit-options] [ui-sortable] li:before {
+  background-size: cover;
+  background: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1IiBoZWlnaHQ9IjUiPgo8cmVjdCB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSIjODg4Ij48L3JlY3Q+Cjwvc3ZnPg==");
+  width: 10px;
+  height: 15px;
+  content: ' ';
+  display: block;
+  position: absolute;
+  left: 4px;
+  top: 5px;
+}
+#afGuiEditor .af-gui-add-element-button {
+  background-color: transparent;
+}
+#afGuiEditor .af-gui-add-element-button span {
+  display: inline-block;
+  width: 18px;
+  height: 18px;
+  color: #0071bd;
+}
+
+#afGuiEditor .af-gui-layout-icon {
+  width: 12px;
+  height: 11px;
+  display: block;
+  background-image: url('../images/icons.png');
+  background-repeat: no-repeat;
+  margin: 4px 1px;
+}
+#afGuiEditor .af-gui-layout-icon.af-layout-cols {
+  background-position: -12px 0;
+}
+#afGuiEditor .af-gui-layout-icon.af-layout-rows {
+  background-position: -24px 0;
+}
+
+#afGuiEditor .af-gui-layout.af-layout-cols {
+  display: flex;
+}
+#afGuiEditor .af-gui-layout.af-layout-cols > div {
+  flex: 1;
+}
+#afGuiEditor .af-gui-layout.af-layout-inline > div {
+  display: inline-block;
+  width: 300px;
+}
+
+#afGuiEditor-canvas .panel-heading .btn-group {
+  position: relative;
+  top: -8px;
+}
+
+#afGuiEditor .af-gui-button {
+  padding-left: 15px;
+}
+
+#afGuiEditor .af-gui-button > .btn.disabled {
+  cursor: default !important;
+  color: white !important;
+}
+#afGuiEditor .af-gui-button > .btn.disabled .crm-editable-enabled:hover:not(:focus) {
+  border-color: #f4f4f4 !important;
+}
+
+#afGuiEditor .af-gui-button > .btn-default.disabled {
+  background-color: lightgrey !important;
+}
+
+#afGuiEditor .af-gui-node-title {
+  margin-left: 5px;
+  margin-right: 20px;
+  position: relative;
+}
+
+#afGuiEditor .af-gui-field-required:after {
+  content: '*';
+  color: #cf3458;
+  position: relative;
+  left: -4px;
+}
+
+#afGuiEditor .dropdown-menu li {
+  cursor: default;
+}
+
+#afGuiEditor .dropdown-menu li .af-gui-field-select-in-dropdown {
+  padding: 2px 19px 2px 21px;
+  clear: both;
+  font-weight: 400;
+  line-height: 1.5384615385;
+  color: #4d4d69;
+  white-space: nowrap;
+}
+
+#afGuiEditor .dropdown-menu li > * > label {
+  font-weight: normal;
+  cursor: pointer;
+}
+
+#afGuiEditor .dropdown-menu li .af-gui-field-select-in-dropdown > select {
+  max-width: 120px;
+  padding-left: 5px;
+  padding-right: 5px;
+}
+
+#afGuiEditor li .af-gui-field-select-in-dropdown input[type=color] {
+  width: 30px;
+  padding: 2px 4px;
+}
+
+#afGuiEditor li .af-gui-field-select-in-dropdown input[type=number] {
+  width: 50px;
+  padding-right: 0;
+}
+
+/* For editing field placeholder text */
+#afGuiEditor .af-gui-field-input input[type=text].form-control {
+  color: #9a9a9a;
+}
+
+#afGuiEditor .af-gui-field-input-type-number input[type=text].form-control {
+  background-image: url('../images/number.png');
+  background-repeat: no-repeat;
+  background-position: center right 6px;
+}
+
+#afGuiEditor .af-gui-field-input input.crm-form-date {
+  width: 140px;
+  margin-right: -2px;
+}
+#afGuiEditor .af-gui-field-input input.crm-form-time {
+  width: 80px;
+}
+
+#afGuiEditor .af-gui-field-input-type-radio label.radio {
+  font-weight: normal;
+  margin-right: 10px;
+}
+#afGuiEditor .af-gui-field-input-type-radio label.radio input[type=radio] {
+  margin: 0;
+}
+#afGuiEditor .af-gui-field-input-type-select .input-group-btn {
+  position: initial;
+}
+#afGuiEditor .af-gui-field-input-type-chainselect .input-group .dropdown-toggle,
+#afGuiEditor .af-gui-field-input-type-select .input-group .dropdown-toggle {
+  padding: 3px 11px;
+}
+#afGuiEditor .af-gui-field-input-type-select .input-group .dropdown-menu {
+  width: 100%;
+  right: 0;
+}
+#afGuiEditor .af-gui-field-input-type-select .input-group .dropdown-menu a {
+  cursor: default;
+}
+
+#afGuiEditor .af-gui-text-h1 {
+  font-weight: bolder;
+  font-size: 16px;
+}
+
+#afGuiEditor .af-gui-text-h2 {
+  font-weight: bold;
+  font-size: 15px;
+}
+
+#afGuiEditor .af-gui-text-legend,
+#afGuiEditor .af-gui-text-h3 {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+#afGuiEditor .af-gui-text-legend {
+  text-decoration: underline;
+}
+
+#afGuiEditor .af-gui-text-h4 {
+  font-weight: bold;
+}
+
+#afGuiEditor .af-gui-text-h5 {
+  font-weight: 600;
+}
+
+#afGuiEditor .af-gui-text-h6 {
+  font-weight: 500;
+}
+
+#afGuiEditor .af-gui-field-help {
+  font-style: italic;
+}
+
+#afGuiEditor.af-gui-editing-content {
+  pointer-events: none;
+  cursor: default;
+}
+#afGuiEditor.af-gui-editing-content .panel-heading,
+#afGuiEditor.af-gui-editing-content .af-gui-element,
+#afGuiEditor.af-gui-editing-content .af-gui-markup-content,
+.af-gui-editing-content #afGuiEditor-palette .panel-body > * {
+  opacity: .5;
+}
+#afGuiEditor.af-gui-editing-content .af-gui-container {
+  border: 2px solid transparent;
+}
+#afGuiEditor.af-gui-editing-content .af-gui-bar {
+  visibility: hidden;
+}
+#afGuiEditor.af-gui-editing-content .af-gui-bar:before {
+  background: none;
+}
+
+#afGuiEditor .af-gui-content-editing-area {
+  pointer-events: auto;
+  cursor: auto;
+  padding-top: 35px;
+  position: relative;
+}
+
+#afGuiEditor [af-gui-edit-options] {
+  border: 2px solid #0071bd;
+}
+
+#afGuiEditor .af-gui-content-editing-area .af-gui-edit-options-bar {
+  height: 30px;
+  font-family: "Courier New", Courier, monospace;
+  font-size: 12px;
+  width: 100%;
+  background-color: #f2f2f2;
+  position: absolute;
+  top: 0;
+  left: 0;
+  padding-left: 15px;
+}
+#afGuiEditor .af-gui-edit-options-bar .btn-group-sm {
+  position: absolute;
+  top: 0;
+  right: 0;
+}
+#afGuiEditor [af-gui-edit-options] ul[ui-sortable] {
+  padding: 5px 20px 0;
+}
+#afGuiEditor [af-gui-edit-options] ul[ui-sortable] li {
+  list-style: none;
+  padding-left: 15px;
+  position: relative;
+  background-color:#e7ecf1;
+  cursor: move;
+}
+#afGuiEditor [af-gui-edit-options] ul[ui-sortable] li:nth-child(even) {
+  background-color:#f2f2f2;
+}
+#afGuiEditor [af-gui-edit-options] ul[ui-sortable] li > div {
+  width: calc(100% - 30px);
+  display: inline-block;
+}
+#afGuiEditor [af-gui-edit-options] ul.af-gui-edit-options-deleted li > div {
+  text-decoration: line-through;
+}
+#afGuiEditor [af-gui-edit-options] ul[ui-sortable] li .btn-xs {
+  border: 0 none;
+}
+#afGuiEditor [af-gui-edit-options] h5 {
+  margin-left: 20px;
+}
+
+#afGuiEditor .af-gui-dropzone {
+  background-color: #e9eeff;
+  border: 2px solid #0071bd;
+  min-height: 30px;
+}
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor.js b/civicrm/ext/afform/gui/ang/afGuiEditor.js
new file mode 100644
index 0000000000000000000000000000000000000000..d0c760f4f8e256d2f9cf08985898a8766ff6dc3e
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor.js
@@ -0,0 +1,1334 @@
+(function(angular, $, _) {
+  "use strict";
+  angular.module('afGuiEditor', CRM.angRequires('afGuiEditor'));
+
+  angular.module('afGuiEditor').directive('afGuiEditor', function(crmApi4, $parse, $timeout, $location) {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/main.html',
+      scope: {
+        afGuiEditor: '='
+      },
+      link: function($scope, element, attrs) {
+        // Shoehorn in a non-angular widget for picking icons
+        CRM.loadScript(CRM.config.resourceBase + 'js/jquery/jquery.crmIconPicker.js').done(function() {
+          $('#af-gui-icon-picker').crmIconPicker().change(function() {
+            if (editingIcon) {
+              $scope.$apply(function() {
+                editingIcon[editingIconProp] = $('#af-gui-icon-picker').val();
+                editingIcon = null;
+                $('#af-gui-icon-picker').val('').change();
+              });
+            }
+          });
+        });
+      },
+      controller: function($scope) {
+        var ts = $scope.ts = CRM.ts();
+        $scope.afform = null;
+        $scope.saving = false;
+        $scope.selectedEntityName = null;
+        $scope.meta = this.meta = CRM.afformAdminData;
+        this.scope = $scope;
+        var editor = $scope.editor = this;
+        var newForm = {
+          title: '',
+          permission: 'access CiviCRM',
+          layout: [{
+            '#tag': 'af-form',
+            ctrl: 'afform',
+            '#children': []
+          }]
+        };
+        // Fetch the current form plus all blocks
+        crmApi4('Afform', 'get', {where: [["OR", [["name", "=", $scope.afGuiEditor.name], ["block", "IS NOT NULL"]]]], layoutFormat: 'shallow', formatWhitespace: true})
+          .then(initialize);
+
+        // Initialize the current form + list of blocks
+        function initialize(afforms) {
+          $scope.meta.blocks = {};
+          _.each(afforms, function(form) {
+            evaluate(form.layout);
+            if (form.block) {
+              $scope.meta.blocks[form.directive_name] = form;
+            }
+            if (form.name === $scope.afGuiEditor.name) {
+              $scope.afform = form;
+            }
+          });
+          if (!$scope.afform) {
+            $scope.afform = _.cloneDeep(newForm);
+            if ($scope.afGuiEditor.name != '0') {
+              alert('Error: unknown form "' + $scope.afGuiEditor.name + '"');
+            }
+          }
+          $scope.layout = findRecursive($scope.afform.layout, {'#tag': 'af-form'})[0];
+          $scope.entities = findRecursive($scope.layout['#children'], {'#tag': 'af-entity'}, 'name');
+
+          if ($scope.afGuiEditor.name == '0') {
+            editor.addEntity('Individual');
+            $scope.layout['#children'].push($scope.meta.elements.submit.element);
+          }
+
+          // Set changesSaved to true on initial load, false thereafter whenever changes are made to the model
+          $scope.changesSaved = $scope.afGuiEditor.name == '0' ? false : 1;
+          $scope.$watch('afform', function () {
+            $scope.changesSaved = $scope.changesSaved === 1;
+          }, true);
+        }
+
+        this.addEntity = function(type) {
+          var meta = editor.meta.entities[type],
+            num = 1;
+          // Give this new entity a unique name
+          while (!!$scope.entities[type + num]) {
+            num++;
+          }
+          $scope.entities[type + num] = _.assign($parse(meta.defaults)($scope), {
+            '#tag': 'af-entity',
+            type: meta.entity,
+            name: type + num,
+            label: meta.label + ' ' + num
+          });
+          // Add this af-entity tag after the last existing one
+          var pos = 1 + _.findLastIndex($scope.layout['#children'], {'#tag': 'af-entity'});
+          $scope.layout['#children'].splice(pos, 0, $scope.entities[type + num]);
+          // Create a new af-fieldset container for the entity
+          var fieldset = _.cloneDeep(editor.meta.elements.fieldset.element);
+          fieldset['af-fieldset'] = type + num;
+          fieldset['#children'][0]['#children'][0]['#text'] = meta.label + ' ' + num;
+          // Add default contact name block
+          if (meta.entity === 'Contact') {
+            fieldset['#children'].push({'#tag': 'afblock-name-' + type.toLowerCase()});
+          }
+          // Attempt to place the new af-fieldset after the last one on the form
+          pos = 1 + _.findLastIndex($scope.layout['#children'], 'af-fieldset');
+          if (pos) {
+            $scope.layout['#children'].splice(pos, 0, fieldset);
+          } else {
+            $scope.layout['#children'].push(fieldset);
+          }
+          return type + num;
+        };
+
+        this.removeEntity = function(entityName) {
+          delete $scope.entities[entityName];
+          removeRecursive($scope.layout['#children'], {'#tag': 'af-entity', name: entityName});
+          removeRecursive($scope.layout['#children'], {'af-fieldset': entityName});
+          this.selectEntity(null);
+        };
+
+        this.selectEntity = function(entityName) {
+          $scope.selectedEntityName = entityName;
+        };
+
+        this.getField = function(entityType, fieldName) {
+          return $scope.meta.entities[entityType].fields[fieldName];
+        };
+
+        this.getEntity = function(entityName) {
+          return $scope.entities[entityName];
+        };
+
+        this.getSelectedEntityName = function() {
+          return $scope.selectedEntityName;
+        };
+
+        // Validates that a drag-n-drop action is allowed
+        this.onDrop = function(event, ui) {
+          var sort = ui.item.sortable;
+          // Check if this is a callback for an item dropped into a different container
+          // @see https://github.com/angular-ui/ui-sortable notes on canceling
+          if (!sort.received && sort.source[0] !== sort.droptarget[0]) {
+            var $source = $(sort.source[0]),
+              $target = $(sort.droptarget[0]),
+              $item = $(ui.item[0]);
+            // Fields cannot be dropped outside their own entity
+            if ($item.is('[af-gui-field]') || $item.has('[af-gui-field]').length) {
+              if ($source.closest('[data-entity]').attr('data-entity') !== $target.closest('[data-entity]').attr('data-entity')) {
+                return sort.cancel();
+              }
+            }
+            // Entity-fieldsets cannot be dropped into other entity-fieldsets
+            if ((sort.model['af-fieldset'] || $item.has('.af-gui-fieldset').length) && $target.closest('.af-gui-fieldset').length) {
+              return sort.cancel();
+            }
+          }
+        };
+
+        $scope.addEntity = function(entityType) {
+          var entityName = editor.addEntity(entityType);
+          editor.selectEntity(entityName);
+        };
+
+        $scope.save = function() {
+          $scope.saving = $scope.changesSaved = true;
+          crmApi4('Afform', 'save', {formatWhitespace: true, records: [JSON.parse(angular.toJson($scope.afform))]})
+            .then(function (data) {
+              $scope.saving = false;
+              $scope.afform.name = data[0].name;
+              // FIXME: This causes an unnecessary reload when saving a new form
+              $location.search('name', data[0].name);
+            });
+        };
+
+        $scope.$watch('afform.title', function(newTitle, oldTitle) {
+          if (typeof oldTitle === 'string') {
+            _.each($scope.entities, function(entity) {
+              if (entity.data && entity.data.source === oldTitle) {
+                entity.data.source = newTitle;
+              }
+            });
+          }
+        });
+
+        // Parse strings of javascript that php couldn't interpret
+        function evaluate(collection) {
+          _.each(collection, function(item) {
+            if (_.isPlainObject(item)) {
+              evaluate(item['#children']);
+              _.each(item, function(node, idx) {
+                if (_.isString(node)) {
+                  var str = _.trim(node);
+                  if (str[0] === '{' || str[0] === '[' || str.slice(0, 3) === 'ts(') {
+                    item[idx] = $parse(str)({ts: $scope.ts});
+                  }
+                }
+              });
+            }
+          });
+        }
+
+      }
+    };
+  });
+
+  // Recursively searches a collection and its children using _.filter
+  // Returns an array of all matches, or an object if the indexBy param is used
+  function findRecursive(collection, predicate, indexBy) {
+    var items = _.filter(collection, predicate);
+    _.each(collection, function(item) {
+      if (_.isPlainObject(item) && item['#children']) {
+        var childMatches = findRecursive(item['#children'], predicate);
+        if (childMatches.length) {
+          Array.prototype.push.apply(items, childMatches);
+        }
+      }
+    });
+    return indexBy ? _.indexBy(items, indexBy) : items;
+  }
+
+  // Applies _.remove() to an item and its children
+  function removeRecursive(collection, removeParams) {
+    _.remove(collection, removeParams);
+    _.each(collection, function(item) {
+      if (_.isPlainObject(item) && item['#children']) {
+        removeRecursive(item['#children'], removeParams);
+      }
+    });
+  }
+
+  // Turns a space-separated list (e.g. css classes) into an array
+  function splitClass(str) {
+    if (_.isArray(str)) {
+      return str;
+    }
+    return str ? _.unique(_.trim(str).split(/\s+/g)) : [];
+  }
+
+  angular.module('afGuiEditor').directive('afGuiEntity', function($timeout) {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/entity.html',
+      scope: {
+        entity: '=afGuiEntity'
+      },
+      require: '^^afGuiEditor',
+      link: function ($scope, element, attrs, editor) {
+        $scope.editor = editor;
+      },
+      controller: function ($scope) {
+        var ts = $scope.ts = CRM.ts();
+        $scope.controls = {};
+        $scope.fieldList = [];
+        $scope.blockList = [];
+        $scope.blockTitles = [];
+        $scope.elementList = [];
+        $scope.elementTitles = [];
+
+        function getEntityType() {
+          return $scope.entity.type === 'Contact' ? $scope.entity.data.contact_type : $scope.entity.type;
+        }
+
+        $scope.getMeta = function() {
+          return $scope.editor ? $scope.editor.meta.entities[getEntityType()] : {};
+        };
+
+        $scope.valuesFields = function() {
+          var fields = _.transform($scope.getMeta().fields, function(fields, field) {
+            fields.push({id: field.name, text: field.title, disabled: $scope.fieldInUse(field.name)});
+          }, []);
+          return {results: fields};
+        };
+
+        $scope.removeValue = function(entity, fieldName) {
+          delete entity.data[fieldName];
+        };
+
+        function buildPaletteLists() {
+          var search = $scope.controls.fieldSearch ? $scope.controls.fieldSearch.toLowerCase() : null;
+          buildFieldList(search);
+          buildBlockList(search);
+          buildElementList(search);
+        }
+
+        function buildFieldList(search) {
+          $scope.fieldList.length = 0;
+          $scope.fieldList.push({
+            entityName: $scope.entity.name,
+            entityType: getEntityType(),
+            label: ts('%1 Fields', {1: $scope.getMeta().label}),
+            fields: filterFields($scope.getMeta().fields)
+          });
+
+          _.each($scope.editor.meta.entities, function(entity, entityName) {
+            if (check($scope.editor.scope.layout['#children'], {'af-join': entityName})) {
+              $scope.fieldList.push({
+                entityName: $scope.entity.name + '-join-' + entityName,
+                entityType: entityName,
+                label: ts('%1 Fields', {1: entity.label}),
+                fields: filterFields(entity.fields)
+              });
+            }
+          });
+
+          function filterFields(fields) {
+            return _.transform(fields, function(fieldList, field) {
+              if (!search || _.contains(field.name, search) || _.contains(field.title.toLowerCase(), search)) {
+                fieldList.push({
+                  "#tag": "af-field",
+                  name: field.name
+                });
+              }
+            }, []);
+          }
+        }
+
+        function buildBlockList(search) {
+          $scope.blockList.length = 0;
+          $scope.blockTitles.length = 0;
+          _.each($scope.editor.meta.blocks, function(block, directive) {
+            if ((!search || _.contains(directive, search) || _.contains(block.name.toLowerCase(), search) || _.contains(block.title.toLowerCase(), search)) &&
+              (block.block === '*' || block.block === $scope.entity.type || ($scope.entity.type === 'Contact' && block.block === $scope.entity.data.contact_type))
+            ) {
+              var item = {"#tag": block.join ? "div" : directive};
+              if (block.join) {
+                item['af-join'] = block.join;
+                item['#children'] = [{"#tag": directive}];
+              }
+              if (block.repeat) {
+                item['af-repeat'] = ts('Add');
+                item.min = '1';
+                if (typeof block.repeat === 'number') {
+                  item.max = '' + block.repeat;
+                }
+              }
+              $scope.blockList.push(item);
+              $scope.blockTitles.push(block.title);
+            }
+          });
+        }
+
+        function buildElementList(search) {
+          $scope.elementList.length = 0;
+          $scope.elementTitles.length = 0;
+          _.each($scope.editor.meta.elements, function(element, name) {
+            if (!search || _.contains(name, search) || _.contains(element.title.toLowerCase(), search)) {
+              var node = _.cloneDeep(element.element);
+              if (name === 'fieldset') {
+                node['af-fieldset'] = $scope.entity.name;
+              }
+              $scope.elementList.push(node);
+              $scope.elementTitles.push(name === 'fieldset' ? ts('Fieldset for %1', {1: $scope.entity.label}) : element.title);
+            }
+          });
+        }
+
+        $scope.clearSearch = function() {
+          $scope.controls.fieldSearch = '';
+        };
+
+        // This gets called from jquery-ui so we have to manually apply changes to scope
+        $scope.buildPaletteLists = function() {
+          $timeout(function() {
+            $scope.$apply(function() {
+              buildPaletteLists();
+            });
+          });
+        };
+
+        // Checks if a field is on the form or set as a value
+        $scope.fieldInUse = function(fieldName) {
+          var data = $scope.entity.data || {};
+          if (fieldName in data) {
+            return true;
+          }
+          return check($scope.editor.scope.layout['#children'], {'#tag': 'af-field', name: fieldName});
+        };
+
+        $scope.blockInUse = function(block) {
+          if (block['af-join']) {
+            return check($scope.editor.scope.layout['#children'], {'af-join': block['af-join']});
+          }
+          var fieldsInBlock = _.pluck(findRecursive($scope.editor.meta.blocks[block['#tag']].layout, {'#tag': 'af-field'}), 'name');
+          return check($scope.editor.scope.layout['#children'], function(item) {
+            return item['#tag'] === 'af-field' && _.includes(fieldsInBlock, item.name);
+          });
+        };
+
+        // Check for a matching item for this entity
+        // Recursively checks the form layout, including block directives
+        function check(group, criteria, found) {
+          if (!found) {
+            found = {};
+          }
+          if (_.find(group, criteria)) {
+            found.match = true;
+            return true;
+          }
+          _.each(group, function(item) {
+            if (found.match) {
+              return false;
+            }
+            if (_.isPlainObject(item)) {
+              // Recurse through everything but skip fieldsets for other entities
+              if ((!item['af-fieldset'] || (item['af-fieldset'] === $scope.entity.name)) && item['#children']) {
+                check(item['#children'], criteria, found);
+              }
+              // Recurse into block directives
+              else if (item['#tag'] && item['#tag'] in $scope.editor.meta.blocks) {
+                check($scope.editor.meta.blocks[item['#tag']].layout, criteria, found);
+              }
+            }
+          });
+          return found.match;
+        }
+
+        $scope.$watch('controls.addValue', function(fieldName) {
+          if (fieldName) {
+            if (!$scope.entity.data) {
+              $scope.entity.data = {};
+            }
+            $scope.entity.data[fieldName] = '';
+            $scope.controls.addValue = '';
+          }
+        });
+
+        $scope.$watch('controls.fieldSearch', buildPaletteLists);
+      }
+    };
+  });
+
+  angular.module('afGuiEditor').directive('afGuiContainer', function(crmApi4, dialogService) {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/container.html',
+      scope: {
+        node: '=afGuiContainer',
+        join: '=',
+        entityName: '='
+      },
+      require: ['^^afGuiEditor', '?^^afGuiContainer'],
+      link: function($scope, element, attrs, ctrls) {
+        var ts = $scope.ts = CRM.ts();
+        $scope.editor = ctrls[0];
+        $scope.parentContainer = ctrls[1];
+
+        $scope.isSelectedFieldset = function(entityName) {
+          return entityName === $scope.editor.getSelectedEntityName();
+        };
+
+        $scope.selectEntity = function() {
+          if ($scope.node['af-fieldset']) {
+            $scope.editor.selectEntity($scope.node['af-fieldset']);
+          }
+        };
+
+        $scope.tags = {
+          div: ts('Container'),
+          fieldset: ts('Fieldset')
+        };
+
+        // Block settings
+        var block = {};
+        $scope.block = null;
+
+        $scope.getSetChildren = function(val) {
+          var collection = block.layout || ($scope.node && $scope.node['#children']);
+          return arguments.length ? (collection = val) : collection;
+        };
+
+        $scope.isRepeatable = function() {
+          return $scope.node['af-fieldset'] || (block.directive && $scope.editor.meta.blocks[block.directive].repeat) || $scope.join;
+        };
+
+        $scope.toggleRepeat = function() {
+          if ('af-repeat' in $scope.node) {
+            delete $scope.node.max;
+            delete $scope.node.min;
+            delete $scope.node['af-repeat'];
+            delete $scope.node['add-icon'];
+          } else {
+            $scope.node.min = '1';
+            $scope.node['af-repeat'] = ts('Add');
+          }
+        };
+
+        $scope.getSetMin = function(val) {
+          if (arguments.length) {
+            if ($scope.node.max && val > parseInt($scope.node.max, 10)) {
+              $scope.node.max = '' + val;
+            }
+            if (!val) {
+              delete $scope.node.min;
+            }
+            else {
+              $scope.node.min = '' + val;
+            }
+          }
+          return $scope.node.min ? parseInt($scope.node.min, 10) : null;
+        };
+
+        $scope.getSetMax = function(val) {
+          if (arguments.length) {
+            if ($scope.node.min && val && val < parseInt($scope.node.min, 10)) {
+              $scope.node.min = '' + val;
+            }
+            if (typeof val !== 'number') {
+              delete $scope.node.max;
+            }
+            else {
+              $scope.node.max = '' + val;
+            }
+          }
+          return $scope.node.max ? parseInt($scope.node.max, 10) : null;
+        };
+
+        $scope.pickAddIcon = function() {
+          openIconPicker($scope.node, 'add-icon');
+        };
+
+        function getBlockNode() {
+          return !$scope.join ? $scope.node : ($scope.node['#children'] && $scope.node['#children'].length === 1 ? $scope.node['#children'][0] : null);
+        }
+
+        function setBlockDirective(directive) {
+          if ($scope.join) {
+            $scope.node['#children'] = [{'#tag': directive}];
+          } else {
+            delete $scope.node['#children'];
+            delete $scope.node['class'];
+            $scope.node['#tag'] = directive;
+          }
+        }
+
+        function overrideBlockContents(layout) {
+          $scope.node['#children'] = layout || [];
+          if (!$scope.join) {
+            $scope.node['#tag'] = 'div';
+            $scope.node['class'] = 'af-container';
+          }
+          block.layout = block.directive = null;
+        }
+
+        $scope.layouts = {
+          'af-layout-rows': ts('Contents display as rows'),
+          'af-layout-cols': ts('Contents are evenly-spaced columns'),
+          'af-layout-inline': ts('Contents are arranged inline')
+        };
+
+        $scope.getLayout = function() {
+          if (!$scope.node) {
+            return '';
+          }
+          return _.intersection(splitClass($scope.node['class']), _.keys($scope.layouts))[0] || 'af-layout-rows';
+        };
+
+        $scope.setLayout = function(val) {
+          var classes = ['af-container'];
+          if (val !== 'af-layout-rows') {
+            classes.push(val);
+          }
+          modifyClasses($scope.node, _.keys($scope.layouts), classes);
+        };
+
+        $scope.selectBlockDirective = function() {
+          if (block.directive) {
+            block.layout = _.cloneDeep($scope.editor.meta.blocks[block.directive].layout);
+            block.original = block.directive;
+            setBlockDirective(block.directive);
+          }
+          else {
+            overrideBlockContents(block.layout);
+          }
+        };
+
+        if (($scope.node['#tag'] in $scope.editor.meta.blocks) || $scope.join) {
+          initializeBlockContainer();
+        }
+
+        function initializeBlockContainer() {
+
+          // Cancel the below $watch expressions if already set
+          _.each(block.listeners, function(deregister) {
+            deregister();
+          });
+
+          block = $scope.block = {
+            directive: null,
+            layout: null,
+            original: null,
+            options: [],
+            listeners: []
+          };
+
+          _.each($scope.editor.meta.blocks, function(blockInfo, directive) {
+            if (directive === $scope.node['#tag'] || blockInfo.join === $scope.container.getFieldEntityType()) {
+              block.options.push({
+                id: directive,
+                text: blockInfo.title
+              });
+            }
+          });
+
+          if (getBlockNode() && getBlockNode()['#tag'] in $scope.editor.meta.blocks) {
+            block.directive = block.original = getBlockNode()['#tag'];
+            block.layout = _.cloneDeep($scope.editor.meta.blocks[block.directive].layout);
+          }
+
+          block.listeners.push($scope.$watch('block.layout', function (layout, oldVal) {
+            if (block.directive && layout && layout !== oldVal && !angular.equals(layout, $scope.editor.meta.blocks[block.directive].layout)) {
+              overrideBlockContents(block.layout);
+            }
+          }, true));
+        }
+
+        $scope.saveBlock = function() {
+          var options = CRM.utils.adjustDialogDefaults({
+            width: '500px',
+            height: '300px',
+            autoOpen: false,
+            title: ts('Save block')
+          });
+          var model = {
+            title: '',
+            name: null,
+            layout: $scope.node['#children']
+          };
+          if ($scope.join) {
+            model.join = $scope.join;
+          }
+          if ($scope.block && $scope.block.original) {
+            model.title = $scope.editor.meta.blocks[$scope.block.original].title;
+            model.name = $scope.editor.meta.blocks[$scope.block.original].name;
+            model.block = $scope.editor.meta.blocks[$scope.block.original].block;
+          }
+          else {
+            model.block = $scope.container.getFieldEntityType() || '*';
+          }
+          dialogService.open('saveBlockDialog', '~/afGuiEditor/saveBlock.html', model, options)
+            .then(function(block) {
+              $scope.editor.meta.blocks[block.directive_name] = block;
+              setBlockDirective(block.directive_name);
+              initializeBlockContainer();
+            });
+        };
+
+      },
+      controller: function($scope) {
+        var container = $scope.container = this;
+        this.node = $scope.node;
+
+        this.getNodeType = function(node) {
+          if (!node) {
+            return null;
+          }
+          if (node['#tag'] === 'af-field') {
+            return 'field';
+          }
+          if (node['af-fieldset']) {
+            return 'fieldset';
+          }
+          if (node['af-join']) {
+            return 'join';
+          }
+          if (node['#tag'] && node['#tag'] in $scope.editor.meta.blocks) {
+            return 'container';
+          }
+          var classes = splitClass(node['class']),
+            types = ['af-container', 'af-text', 'af-button', 'af-markup'],
+            type = _.intersection(types, classes);
+          return type.length ? type[0].replace('af-', '') : null;
+        };
+
+        this.removeElement = function(element) {
+          removeRecursive($scope.getSetChildren(), {$$hashKey: element.$$hashKey});
+        };
+
+        this.getEntityName = function() {
+          return $scope.entityName.split('-join-')[0];
+        };
+
+        // Returns the primary entity type for this container e.g. "Contact"
+        this.getMainEntityType = function() {
+          return $scope.editor && $scope.editor.getEntity(container.getEntityName()).type;
+        };
+
+        // Returns the entity type for fields within this conainer (join entity type if this is a join, else the primary entity type)
+        this.getFieldEntityType = function() {
+          var joinType = $scope.entityName.split('-join-');
+          return joinType[1] || ($scope.editor && $scope.editor.getEntity(joinType[0]).type);
+        };
+
+      }
+    };
+  });
+
+  angular.module('afGuiEditor').controller('afGuiSaveBlock', function($scope, crmApi4, dialogService) {
+    var ts = $scope.ts = CRM.ts(),
+      model = $scope.model,
+      original = $scope.original = {
+        title: model.title,
+        name: model.name
+      };
+    if (model.name) {
+      $scope.$watch('model.name', function(val, oldVal) {
+        if (!val && model.title === original.title) {
+          model.title += ' ' + ts('(copy)');
+        }
+        else if (val === original.name && val !== oldVal) {
+          model.title = original.title;
+        }
+      });
+    }
+    $scope.cancel = function() {
+      dialogService.cancel('saveBlockDialog');
+    };
+    $scope.save = function() {
+      $('.ui-dialog:visible').block();
+      crmApi4('Afform', 'save', {formatWhitespace: true, records: [JSON.parse(angular.toJson(model))]})
+        .then(function(result) {
+          dialogService.close('saveBlockDialog', result[0]);
+        });
+    };
+  });
+
+  angular.module('afGuiEditor').directive('afGuiField', function() {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/field.html',
+      scope: {
+        node: '=afGuiField'
+      },
+      require: ['^^afGuiEditor', '^^afGuiContainer'],
+      link: function($scope, element, attrs, ctrls) {
+        $scope.editor = ctrls[0];
+        $scope.container = ctrls[1];
+      },
+      controller: function($scope) {
+        var ts = $scope.ts = CRM.ts();
+        $scope.editingOptions = false;
+        var yesNo = [
+          {key: '1', label: ts('Yes')},
+          {key: '0', label: ts('No')}
+        ];
+
+        $scope.getEntity = function() {
+          return $scope.editor ? $scope.editor.getEntity($scope.container.getEntityName()) : {};
+        };
+
+        $scope.getDefn = this.getDefn = function() {
+          return $scope.editor ? $scope.editor.getField($scope.container.getFieldEntityType(), $scope.node.name) : {};
+        };
+
+        $scope.hasOptions = function() {
+          var inputType = $scope.getProp('input_type');
+          return _.contains(['CheckBox', 'Radio', 'Select'], inputType) && !(inputType === 'CheckBox' && !$scope.getDefn().options);
+        };
+
+        $scope.getOptions = this.getOptions = function() {
+          if ($scope.node.defn && $scope.node.defn.options) {
+            return $scope.node.defn.options;
+          }
+          return $scope.getDefn().options || ($scope.getProp('input_type') === 'CheckBox' ? null : yesNo);
+        };
+
+        $scope.resetOptions = function() {
+          delete $scope.node.defn.options;
+        };
+
+        $scope.editOptions = function() {
+          $scope.editingOptions = true;
+          $('#afGuiEditor').addClass('af-gui-editing-content');
+        };
+
+        $scope.inputTypeCanBe = function(type) {
+          var defn = $scope.getDefn();
+          switch (type) {
+            case 'CheckBox':
+            case 'Radio':
+            case 'Select':
+              return !(!defn.options && defn.data_type !== 'Boolean');
+
+            case 'TextArea':
+            case 'RichTextEditor':
+              return (defn.data_type === 'Text' || defn.data_type === 'String');
+          }
+          return true;
+        };
+
+        // Returns a value from either the local field defn or the base defn
+        $scope.getProp = function(propName) {
+          var path = propName.split('.'),
+            item = path.pop(),
+            localDefn = drillDown($scope.node.defn || {}, path);
+          if (typeof localDefn[item] !== 'undefined') {
+            return localDefn[item];
+          }
+          return drillDown($scope.getDefn(), path)[item];
+        };
+
+        // Checks for a value in either the local field defn or the base defn
+        $scope.propIsset = function(propName) {
+          var val = $scope.getProp(propName);
+          return !(typeof val === 'undefined' || val === null);
+        };
+
+        $scope.toggleLabel = function() {
+          $scope.node.defn = $scope.node.defn || {};
+          if ($scope.node.defn.title === false) {
+            delete $scope.node.defn.title;
+          } else {
+            $scope.node.defn.title = false;
+          }
+        };
+
+        $scope.toggleRequired = function() {
+          getSet('required', !getSet('required'));
+          return false;
+        };
+
+        $scope.toggleHelp = function(position) {
+          getSet('help_' + position, $scope.propIsset('help_' + position) ? null : ($scope.getDefn()['help_' + position] || ts('Enter text')));
+          return false;
+        };
+
+        // Getter/setter for definition props
+        $scope.getSet = function(propName) {
+          return _.wrap(propName, getSet);
+        };
+
+        // Getter/setter callback
+        function getSet(propName, val) {
+          if (arguments.length > 1) {
+            var path = propName.split('.'),
+              item = path.pop(),
+              localDefn = drillDown($scope.node, ['defn'].concat(path)),
+              fieldDefn = drillDown($scope.getDefn(), path);
+            // Set the value if different than the field defn, otherwise unset it
+            if (typeof val !== 'undefined' && (val !== fieldDefn[item] && !(!val && !fieldDefn[item]))) {
+              localDefn[item] = val;
+            } else {
+              delete localDefn[item];
+              clearOut($scope.node, ['defn'].concat(path));
+            }
+            return val;
+          }
+          return $scope.getProp(propName);
+        }
+        this.getSet = getSet;
+
+        this.setEditingOptions = function(val) {
+          $scope.editingOptions = val;
+        };
+
+        // Returns a reference to a path n-levels deep within an object
+        function drillDown(parent, path) {
+          var container = parent;
+          _.each(path, function(level) {
+            container[level] = container[level] || {};
+            container = container[level];
+          });
+          return container;
+        }
+
+        // Recursively clears out empty arrays and objects
+        function clearOut(parent, path) {
+          var item;
+          while (path.length && _.every(drillDown(parent, path), _.isEmpty)) {
+            item = path.pop();
+            delete drillDown(parent, path)[item];
+          }
+        }
+      }
+    };
+  });
+
+  angular.module('afGuiEditor').directive('afGuiEditOptions', function() {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/editOptions.html',
+      scope: true,
+      require: '^^afGuiField',
+      link: function ($scope, element, attrs, afGuiField) {
+        $scope.field = afGuiField;
+        $scope.options = JSON.parse(angular.toJson(afGuiField.getOptions()));
+        var optionKeys = _.map($scope.options, 'key');
+        $scope.deletedOptions = _.filter(JSON.parse(angular.toJson(afGuiField.getDefn().options || [])), function(item) {
+          return !_.contains(optionKeys, item.key);
+        });
+        $scope.originalLabels = _.transform(afGuiField.getDefn().options || [], function(originalLabels, item) {
+          originalLabels[item.key] = item.label;
+        }, {});
+      },
+      controller: function ($scope) {
+        var ts = $scope.ts = CRM.ts();
+
+        $scope.deleteOption = function(option, $index) {
+          $scope.options.splice($index, 1);
+          $scope.deletedOptions.push(option);
+        };
+
+        $scope.restoreOption = function(option, $index) {
+          $scope.deletedOptions.splice($index, 1);
+          $scope.options.push(option);
+        };
+
+        $scope.save = function() {
+          $scope.field.getSet('options', JSON.parse(angular.toJson($scope.options)));
+          $scope.close();
+        };
+
+        $scope.close = function() {
+          $scope.field.setEditingOptions(false);
+          $('#afGuiEditor').removeClass('af-gui-editing-content');
+        };
+      }
+    };
+  });
+
+  angular.module('afGuiEditor').directive('afGuiText', function() {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/text.html',
+      scope: {
+        node: '=afGuiText'
+      },
+      require: '^^afGuiContainer',
+      link: function($scope, element, attrs, container) {
+        $scope.container = container;
+      },
+      controller: function($scope) {
+        var ts = $scope.ts = CRM.ts();
+
+        $scope.tags = {
+          p: ts('Normal Text'),
+          legend: ts('Fieldset Legend'),
+          h1: ts('Heading 1'),
+          h2: ts('Heading 2'),
+          h3: ts('Heading 3'),
+          h4: ts('Heading 4'),
+          h5: ts('Heading 5'),
+          h6: ts('Heading 6')
+        };
+
+        $scope.alignments = {
+          'text-left': ts('Align left'),
+          'text-center': ts('Align center'),
+          'text-right': ts('Align right'),
+          'text-justify': ts('Justify')
+        };
+
+        $scope.getAlign = function() {
+          return _.intersection(splitClass($scope.node['class']), _.keys($scope.alignments))[0] || 'text-left';
+        };
+
+        $scope.setAlign = function(val) {
+          modifyClasses($scope.node, _.keys($scope.alignments), val === 'text-left' ? null : val);
+        };
+
+        $scope.styles = _.transform(CRM.afformAdminData.styles, function(styles, val, key) {
+          styles['text-' + key] = val;
+        });
+
+        // Getter/setter for ng-model
+        $scope.getSetStyle = function(val) {
+          if (arguments.length) {
+            return modifyClasses($scope.node, _.keys($scope.styles), val === 'text-default' ? null : val);
+          }
+          return _.intersection(splitClass($scope.node['class']), _.keys($scope.styles))[0] || 'text-default';
+        };
+
+      }
+    };
+  });
+
+  var richtextId = 0;
+  angular.module('afGuiEditor').directive('afGuiMarkup', function($sce, $timeout) {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/markup.html',
+      scope: {
+        node: '=afGuiMarkup'
+      },
+      require: '^^afGuiContainer',
+      link: function($scope, element, attrs, container) {
+        $scope.container = container;
+        // CRM.wysiwyg doesn't work without a dom id
+        $scope.id = 'af-markup-editor-' + richtextId++;
+
+        // When creating a new markup container, go straight to edit mode
+        $timeout(function() {
+          if ($scope.node['#markup'] === false) {
+            $scope.edit();
+          }
+        });
+      },
+      controller: function($scope) {
+        var ts = $scope.ts = CRM.ts();
+
+        $scope.getMarkup = function() {
+          return $sce.trustAsHtml($scope.node['#markup'] || '');
+        };
+
+        $scope.edit = function() {
+          $('#afGuiEditor').addClass('af-gui-editing-content');
+          $scope.editingMarkup = true;
+          CRM.wysiwyg.create('#' + $scope.id);
+          CRM.wysiwyg.setVal('#' + $scope.id, $scope.node['#markup'] || '<p></p>');
+        };
+
+        $scope.save = function() {
+          $scope.node['#markup'] = CRM.wysiwyg.getVal('#' + $scope.id);
+          $scope.close();
+        };
+
+        $scope.close = function() {
+          CRM.wysiwyg.destroy('#' + $scope.id);
+          $('#afGuiEditor').removeClass('af-gui-editing-content');
+          // If a newly-added wysiwyg was canceled, just remove it
+          if ($scope.node['#markup'] === false) {
+            $scope.container.removeElement($scope.node);
+          } else {
+            $scope.editingMarkup = false;
+          }
+        };
+      }
+    };
+  });
+
+
+  angular.module('afGuiEditor').directive('afGuiButton', function() {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/button.html',
+      scope: {
+        node: '=afGuiButton'
+      },
+      require: '^^afGuiContainer',
+      link: function($scope, element, attrs, container) {
+        $scope.container = container;
+      },
+      controller: function($scope) {
+        var ts = $scope.ts = CRM.ts();
+
+        // TODO: Add action selector to UI
+        // $scope.actions = {
+        //   "afform.submit()": ts('Submit Form')
+        // };
+
+        $scope.styles = _.transform(CRM.afformAdminData.styles, function(styles, val, key) {
+          styles['btn-' + key] = val;
+        });
+
+        // Getter/setter for ng-model
+        $scope.getSetStyle = function(val) {
+          if (arguments.length) {
+            return modifyClasses($scope.node, _.keys($scope.styles), ['btn', val]);
+          }
+          return _.intersection(splitClass($scope.node['class']), _.keys($scope.styles))[0] || '';
+        };
+
+        $scope.pickIcon = function() {
+          openIconPicker($scope.node, 'crm-icon');
+        };
+
+      }
+    };
+  });
+
+  // Connect bootstrap dropdown.js with angular
+  // Allows menu content to be conditionally rendered only if open
+  // This gives a large performance boost for a page with lots of menus
+  angular.module('afGuiEditor').directive('afGuiMenu', function() {
+    return {
+      restrict: 'A',
+      link: function($scope, element, attrs) {
+        $scope.menu = {};
+        element
+          .on('show.bs.dropdown', function() {
+            $scope.$apply(function() {
+              $scope.menu.open = true;
+            });
+          })
+          .on('hidden.bs.dropdown', function() {
+            $scope.$apply(function() {
+              $scope.menu.open = false;
+            });
+          });
+      }
+    };
+  });
+
+  // Menu item to control the border property of a node
+  angular.module('afGuiEditor').directive('afGuiMenuItemBorder', function() {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/menu-item-border.html',
+      scope: {
+        node: '=afGuiMenuItemBorder'
+      },
+      link: function($scope, element, attrs) {
+        var ts = $scope.ts = CRM.ts();
+
+        $scope.getSetBorderWidth = function(width) {
+          return getSetBorderProp($scope.node, 0, arguments.length ? width : null);
+        };
+
+        $scope.getSetBorderStyle = function(style) {
+          return getSetBorderProp($scope.node, 1, arguments.length ? style : null);
+        };
+
+        $scope.getSetBorderColor = function(color) {
+          return getSetBorderProp($scope.node, 2, arguments.length ? color : null);
+        };
+
+        function getSetBorderProp(node, idx, val) {
+          var border = getBorder(node) || ['1px', '', '#000000'];
+          if (val === null) {
+            return border[idx];
+          }
+          border[idx] = val;
+          setStyle(node, 'border', val ? border.join(' ') : null);
+        }
+
+        function getBorder(node) {
+          var border = _.map((getStyles(node).border || '').split(' '), _.trim);
+          return border.length > 2 ? border : null;
+        }
+      }
+    };
+  });
+
+  // Menu item to control the background property of a node
+  angular.module('afGuiEditor').directive('afGuiMenuItemBackground', function() {
+    return {
+      restrict: 'A',
+      templateUrl: '~/afGuiEditor/menu-item-background.html',
+      scope: {
+        node: '=afGuiMenuItemBackground'
+      },
+      link: function($scope, element, attrs) {
+        var ts = $scope.ts = CRM.ts();
+
+        $scope.getSetBackgroundColor = function(color) {
+          if (!arguments.length) {
+            return getStyles($scope.node)['background-color'] || '#ffffff';
+          }
+          setStyle($scope.node, 'background-color', color);
+        };
+      }
+    };
+  });
+
+  // Editable titles using ngModel & html5 contenteditable
+  // Cribbed from ContactLayoutEditor
+  angular.module('afGuiEditor').directive("afGuiEditable", function() {
+    return {
+      restrict: "A",
+      require: "ngModel",
+      scope: {
+        defaultValue: '='
+      },
+      link: function(scope, element, attrs, ngModel) {
+        var ts = CRM.ts();
+
+        function read() {
+          var htmlVal = element.html();
+          if (!htmlVal) {
+            htmlVal = scope.defaultValue;
+            element.text(htmlVal);
+          }
+          ngModel.$setViewValue(htmlVal);
+        }
+
+        ngModel.$render = function() {
+          element.text(ngModel.$viewValue || scope.defaultValue);
+        };
+
+        // Special handling for enter and escape keys
+        element.on('keydown', function(e) {
+          // Enter: prevent line break and save
+          if (e.which === 13) {
+            e.preventDefault();
+            element.blur();
+          }
+          // Escape: undo
+          if (e.which === 27) {
+            element.html(ngModel.$viewValue || scope.defaultValue);
+            element.blur();
+          }
+        });
+
+        element.on("blur change", function() {
+          scope.$apply(read);
+        });
+
+        element.attr('contenteditable', 'true').addClass('crm-editable-enabled');
+      }
+    };
+  });
+
+  // Cribbed from the Api4 Explorer
+  angular.module('afGuiEditor').directive('afGuiFieldValue', function() {
+    return {
+      scope: {
+        field: '=afGuiFieldValue'
+      },
+      require: 'ngModel',
+      link: function (scope, element, attrs, ctrl) {
+        var ts = scope.ts = CRM.ts(),
+          multi;
+
+        function destroyWidget() {
+          var $el = $(element);
+          if ($el.is('.crm-form-date-wrapper .crm-hidden-date')) {
+            $el.crmDatepicker('destroy');
+          }
+          if ($el.is('.select2-container + input')) {
+            $el.crmEntityRef('destroy');
+          }
+          $(element).removeData().removeAttr('type').removeAttr('placeholder').show();
+        }
+
+        function makeWidget(field) {
+          var $el = $(element),
+            inputType = field.input_type,
+            dataType = field.data_type;
+          multi = field.serialize || dataType === 'Array';
+          if (inputType === 'Date') {
+            $el.crmDatepicker({time: (field.input_attrs && field.input_attrs.time) || false});
+          }
+          else if (field.fk_entity || field.options || dataType === 'Boolean') {
+            if (field.fk_entity) {
+              $el.crmEntityRef({entity: field.fk_entity, select:{multiple: multi}});
+            } else if (field.options) {
+              var options = _.transform(field.options, function(options, val) {
+                options.push({id: val.key, text: val.label});
+              }, []);
+              $el.select2({data: options, multiple: multi});
+            } else if (dataType === 'Boolean') {
+              $el.attr('placeholder', ts('- select -')).crmSelect2({allowClear: false, multiple: multi, placeholder: ts('- select -'), data: [
+                {id: '1', text: ts('Yes')},
+                {id: '0', text: ts('No')}
+              ]});
+            }
+          } else if (dataType === 'Integer' && !multi) {
+            $el.attr('type', 'number');
+          }
+        }
+
+        // Copied from ng-list but applied conditionally if field is multi-valued
+        var parseList = function(viewValue) {
+          // If the viewValue is invalid (say required but empty) it will be `undefined`
+          if (_.isUndefined(viewValue)) return;
+
+          if (!multi) {
+            return viewValue;
+          }
+
+          var list = [];
+
+          if (viewValue) {
+            _.each(viewValue.split(','), function(value) {
+              if (value) list.push(_.trim(value));
+            });
+          }
+
+          return list;
+        };
+
+        // Copied from ng-list
+        ctrl.$parsers.push(parseList);
+        ctrl.$formatters.push(function(value) {
+          return _.isArray(value) ? value.join(', ') : value;
+        });
+
+        // Copied from ng-list
+        ctrl.$isEmpty = function(value) {
+          return !value || !value.length;
+        };
+
+        scope.$watchCollection('field', function(field) {
+          destroyWidget();
+          if (field) {
+            makeWidget(field);
+          }
+        });
+      }
+    };
+  });
+
+  function getStyles(node) {
+    return !node || !node.style ? {} : _.transform(node.style.split(';'), function(styles, style) {
+      var keyVal = _.map(style.split(':'), _.trim);
+      if (keyVal.length > 1 && keyVal[1].length) {
+        styles[keyVal[0]] = keyVal[1];
+      }
+    }, {});
+  }
+
+  function setStyle(node, name, val) {
+    var styles = getStyles(node);
+    styles[name] = val;
+    if (!val) {
+      delete styles[name];
+    }
+    if (_.isEmpty(styles)) {
+      delete node.style;
+    } else {
+      node.style = _.transform(styles, function(combined, val, name) {
+        combined.push(name + ': ' + val);
+      }, []).join('; ');
+    }
+  }
+
+  function modifyClasses(node, toRemove, toAdd) {
+    var classes = splitClass(node['class']);
+    if (toRemove) {
+      classes = _.difference(classes, splitClass(toRemove));
+    }
+    if (toAdd) {
+      classes = _.unique(classes.concat(splitClass(toAdd)));
+    }
+    node['class'] = classes.join(' ');
+  }
+
+  var editingIcon, editingIconProp;
+  function openIconPicker(node, propName) {
+    editingIcon = node;
+    editingIconProp = propName;
+    $('#af-gui-icon-picker ~ .crm-icon-picker-button').click();
+  }
+
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/button-menu.html b/civicrm/ext/afform/gui/ang/afGuiEditor/button-menu.html
new file mode 100644
index 0000000000000000000000000000000000000000..6d32c415a75c60c0ad8b703640acb931a4387069
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/button-menu.html
@@ -0,0 +1,10 @@
+<li>
+  <div ng-click="$event.stopPropagation()" class="af-gui-field-select-in-dropdown form-inline" >
+    <label>{{ ts('Color:') }}</label>
+    <select class="form-control {{ getSetStyle().replace('btn', 'text') }}" ng-model="getSetStyle" ng-model-options="{getterSetter: true}" title="{{ ts('Button color scheme') }}">
+      <option ng-repeat="(style, label) in styles" class="{{ style.replace('btn', 'bg') }}" value="{{ style }}">{{ label }}</option>
+    </select>
+  </div>
+</li>
+<li role="separator" class="divider"></li>
+<li><a href ng-click="container.removeElement(node)"><span class="text-danger">{{ ts('Delete this button') }}</span></a></li>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/button.html b/civicrm/ext/afform/gui/ang/afGuiEditor/button.html
new file mode 100644
index 0000000000000000000000000000000000000000..3762917cd857d09d16841f33454855be11dea2cd
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/button.html
@@ -0,0 +1,18 @@
+<div class="af-gui-bar">
+  <div class="form-inline pull-right">
+    <div class="btn-group pull-right" af-gui-menu>
+      <button type="button" class="btn btn-default btn-xs dropdown-toggle af-gui-add-element-button" data-toggle="dropdown" title="{{ ts('Configure') }}">
+        <span><i class="crm-i fa-gear"></i></span>
+      </button>
+      <ul class="dropdown-menu" ng-if="menu.open" ng-include="'~/afGuiEditor/button-menu.html'"></ul>
+    </div>
+  </div>
+</div>
+<button type="button" class="btn {{ getSetStyle() }} disabled">
+  <span class="crm-editable-enabled" ng-click="pickIcon()" >
+    <i class="crm-i {{ node['crm-icon'] }}"></i>
+  </span>
+  <span af-gui-editable ng-model="node['#children'][0]['#text']" >
+    {{ node['#children'][0]['#text'] }}
+  </span>
+</button>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/canvas.html b/civicrm/ext/afform/gui/ang/afGuiEditor/canvas.html
new file mode 100644
index 0000000000000000000000000000000000000000..fc2553fb95858f579b94ecd1e3c49c81f1cb2be4
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/canvas.html
@@ -0,0 +1,18 @@
+<div class="panel panel-default">
+  <div class="panel-heading">
+    <form class="form-inline">
+      <div class="btn-group btn-group-md pull-right">
+        <button type="submit" class="btn" ng-class="{'btn-primary': !changesSaved && !saving, 'btn-warning': saving, 'btn-success': changesSaved}" ng-disabled="changesSaved || saving || !afform.title" ng-click="save()">
+          <i class="crm-i" ng-class="{'fa-check': !saving, 'fa-spin fa-spinner': saving}"></i>
+          <span ng-if="changesSaved && !saving">{{ ts('Saved') }}</span>
+          <span ng-if="!changesSaved && !saving">{{ ts('Save') }}</span>
+          <span ng-if="saving">{{ ts('Saving...') }}</span>
+        </button>
+      </div>
+      <div>{{ ts('Form Layout') }}</div>
+    </form>
+  </div>
+  <div id="afGuiEditor-canvas-body" class="panel-body">
+    <div ng-if="layout" af-gui-container="layout" entity-name="" />
+  </div>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/config-form.html b/civicrm/ext/afform/gui/ang/afGuiEditor/config-form.html
new file mode 100644
index 0000000000000000000000000000000000000000..a3169e8bb204d78f9b53cf1edb10cfa33d9f2731
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/config-form.html
@@ -0,0 +1,16 @@
+<label for="af_config_form_title">
+  {{ ts('Title:') }} <span class="crm-marker">*</span>
+</label>
+<input ng-model="afform.title" class="form-control" id="af_config_form_title" required />
+<label for="af_config_form_description">
+  {{ ts('Description:') }}
+</label>
+<textarea ng-model="afform.description" class="form-control" id="af_config_form_description" />
+<label for="af_config_form_server_route">
+  {{ ts('URL:') }}
+</label>
+<input ng-model="afform.server_route" class="form-control" id="af_config_form_server_route" />
+<label for="af_config_form_permission">
+  {{ ts('Permission:') }}
+</label>
+<input ng-model="afform.permission" class="form-control" id="af_config_form_permission" crm-ui-select="{data: editor.meta.permissions, placeholder: ts('Open access')}" />
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/container-menu.html b/civicrm/ext/afform/gui/ang/afGuiEditor/container-menu.html
new file mode 100644
index 0000000000000000000000000000000000000000..9dcf83487a7ef18d0eebde7ab18397fd17f1f576
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/container-menu.html
@@ -0,0 +1,36 @@
+<li ng-if="!node['af-fieldset'] && !block.layout"><a href ng-click="saveBlock()">{{ ts('Save as block') }}</a></li>
+<li ng-if="!node['af-fieldset'] && !block.layout" role="separator" class="divider"></li>
+<li ng-if="tags[node['#tag']]">
+  <div class="af-gui-field-select-in-dropdown form-inline" ng-click="$event.stopPropagation()">
+    {{ ts('Element:') }}
+    <select class="form-control" ng-model="node['#tag']" title="{{ ts('Container type') }}">
+      <option ng-repeat="(opt, label) in tags" value="{{ opt }}">{{ label }}</option>
+    </select>
+  </div>
+</li>
+<li ng-if="isRepeatable()" ng-click="$event.stopPropagation()">
+  <div class="af-gui-field-select-in-dropdown form-inline">
+    <label ng-click="toggleRepeat()">
+      <i class="crm-i fa-{{ node['af-repeat'] || node['af-repeat'] === '' ? 'check-' : '' }}square-o"></i>
+      {{ ts('Repeat') }}
+    </label>
+    <span ng-style="{visibility: node['af-repeat'] || node['af-repeat'] === '' ? 'visible' : 'hidden'}">
+      <input type="number" class="form-control" ng-model="getSetMin" ng-model-options="{getterSetter: true}" placeholder="{{ ts('min') }}" min="0" step="1" />
+      - <input type="number" class="form-control" ng-model="getSetMax" ng-model-options="{getterSetter: true}" placeholder="{{ ts('max') }}" min="2" step="1" />
+    </span>
+  </div>
+</li>
+<li ng-click="$event.stopPropagation()" ng-if="!block">
+  <div class="af-gui-field-select-in-dropdown form-inline">
+    {{ ts('Layout:') }}
+    <div class="btn-group btn-group-sm" role="group">
+      <button type="button" class="btn btn-default" ng-class="{active: opt === getLayout()}" ng-repeat="(opt, label) in layouts" ng-click="setLayout(opt)" title="{{ label }}">
+        <i class="af-gui-layout-icon {{ opt }}"></i>
+      </button>
+    </div>
+  </div>
+</li>
+<li af-gui-menu-item-border="node"></li>
+<li af-gui-menu-item-background="node"></li>
+<li role="separator" class="divider"></li>
+<li><a href ng-click="parentContainer.removeElement(node)"><span class="text-danger">{{ !block ? ts('Delete this container') : ts('Delete this block') }}</span></a></li>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/container.html b/civicrm/ext/afform/gui/ang/afGuiEditor/container.html
new file mode 100644
index 0000000000000000000000000000000000000000..450b6501d7dd7829b3ea83f5a2d2ff51b1015bb3
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/container.html
@@ -0,0 +1,37 @@
+<div class="af-gui-bar" ng-if="node['#tag'] !== 'af-form'" ng-click="selectEntity()" >
+  <div class="form-inline" af-gui-menu>
+    <span ng-if="container.getNodeType(node) == 'fieldset'">{{ editor.getEntity(entityName).label }}</span>
+    <span ng-if="block">{{ join ? ts(join) + ':' : ts('Block:') }}</span>
+    <span ng-if="!block">{{ tags[node['#tag']].toLowerCase() }}</span>
+    <select ng-if="block" ng-model="block.directive" ng-change="selectBlockDirective()">
+      <option value="">{{ ts('Custom') }}</option>
+      <option ng-value="option.id" ng-repeat="option in block.options track by option.id">{{ option.text }}</option>
+    </select>
+    <button type="button" class="btn btn-default btn-xs" ng-if="block && !block.layout" ng-click="saveBlock()">{{ ts('Save...') }}</button>
+    <button type="button" class="btn btn-default btn-xs dropdown-toggle af-gui-add-element-button pull-right" data-toggle="dropdown" title="{{ ts('Configure') }}">
+      <span><i class="crm-i fa-gear"></i></span>
+    </button>
+    <ul class="dropdown-menu dropdown-menu-right" ng-if="menu.open" ng-include="'~/afGuiEditor/container-menu.html'"></ul>
+  </div>
+</div>
+<div ui-sortable="{handle: '.af-gui-bar', connectWith: '[ui-sortable]', cancel: 'input,textarea,button,select,option,a,.dropdown-menu', placeholder: 'af-gui-dropzone', containment: '#afGuiEditor-canvas-body'}" ui-sortable-update="editor.onDrop" ng-model="getSetChildren" ng-model-options="{getterSetter: true}" class="af-gui-layout {{ getLayout() }}">
+  <div ng-repeat="item in getSetChildren()" >
+    <div ng-switch="container.getNodeType(item)">
+      <div ng-switch-when="fieldset" af-gui-container="item" style="{{ item.style }}" class="af-gui-container af-gui-fieldset af-gui-container-type-{{ item['#tag'] }}" ng-class="{'af-entity-selected': isSelectedFieldset(item['af-fieldset'])}" entity-name="item['af-fieldset']" data-entity="{{ item['af-fieldset'] }}" />
+      <div ng-switch-when="container" af-gui-container="item" style="{{ item.style }}" class="af-gui-container af-gui-container-type-{{ item['#tag'] }}" entity-name="entityName" data-entity="{{ entityName }}" />
+      <div ng-switch-when="join" af-gui-container="item"  style="{{ item.style }}" class="af-gui-container" join="item['af-join']" entity-name="entityName + '-join-' + item['af-join']" data-entity="{{ entityName + '-join-' + item['af-join'] }}" />
+      <div ng-switch-when="field" af-gui-field="item" />
+      <div ng-switch-when="text" af-gui-text="item" class="af-gui-element af-gui-text" />
+      <div ng-switch-when="markup" af-gui-markup="item" class="af-gui-markup" />
+      <div ng-switch-when="button" af-gui-button="item" class="af-gui-element af-gui-button" />
+    </div>
+  </div>
+</div>
+<div ng-if="node['af-repeat'] || node['af-repeat'] === ''" class="af-gui-button">
+  <button class="btn btn-xs btn-primary disabled">
+    <span class="crm-editable-enabled" ng-click="pickAddIcon()" >
+      <i class="crm-i {{ node['add-icon'] || 'fa-plus' }}"></i>
+    </span>
+    <span af-gui-editable ng-model="node['af-repeat']">{{ node['af-repeat'] }}</span>
+  </button>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/editOptions.html b/civicrm/ext/afform/gui/ang/afGuiEditor/editOptions.html
new file mode 100644
index 0000000000000000000000000000000000000000..38797ebbce21099a2a8c454968015d3f2872f426
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/editOptions.html
@@ -0,0 +1,30 @@
+<div class="af-gui-edit-options-bar" >
+  <h4 class="pull-left">{{ ts('Customize options') }}</h4>
+  <div class="btn-group-sm">
+    <button type="button" class="btn btn-default" ng-click="close()">
+      <i class="crm-i fa-times-circle"></i>
+      {{ ts('Cancel') }}
+    </button>
+    <button type="button" class="btn btn-success" ng-click="save()">
+      <i class="crm-i fa-check-circle"></i>
+      {{ ts('Done') }}
+    </button>
+  </div>
+</div>
+<ul ui-sortable="{connectWith: '.af-gui-edit-options-deleted', cancel: 'input,textarea,button,select,option,a,[contenteditable]'}" ng-model="options" class="af-gui-edit-options-enabled">
+  <li ng-repeat="option in options">
+    <div af-gui-editable ng-model="option.label" default-value="originalLabels[option.key]" >{{ option.label }}</div>
+    <button type="button" class="btn btn-danger-outline btn-xs pull-right" ng-click="deleteOption(option, $index)" title="{{ ts('Remove option') }}">
+      <i class="crm-i fa-trash"></i>
+    </button>
+  </li>
+</ul>
+<h5 ng-show="deletedOptions.length">{{ ts('Deleted options') }}</h5>
+<ul ng-if="deletedOptions.length" ui-sortable="{connectWith: '.af-gui-edit-options-enabled'}" ng-model="deletedOptions" class="af-gui-edit-options-deleted">
+  <li ng-repeat="option in deletedOptions">
+    <div>{{ option.label }}</div>
+    <button type="button" class="btn btn-success-outline btn-xs pull-right" ng-click="restoreOption(option, $index)" title="{{ ts('Restore option') }}">
+      <i class="crm-i fa-arrow-circle-o-up"></i>
+    </button>
+  </li>
+</ul>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/entity.html b/civicrm/ext/afform/gui/ang/afGuiEditor/entity.html
new file mode 100644
index 0000000000000000000000000000000000000000..f709cff6bdc362da23c5eb5dbd6dc259fb3831b9
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/entity.html
@@ -0,0 +1,60 @@
+<div class="af-gui-columns">
+  <fieldset class="af-gui-entity-values">
+    <legend>{{ ts('Values:') }}</legend>
+    <div class="form-inline" ng-if="getMeta().fields[fieldName]" ng-repeat="(fieldName, value) in entity.data">
+      <label>{{ getMeta().fields[fieldName].title }}:</label><br />
+      <input class="form-control" af-gui-field-value="editor.getField(entity.type, fieldName)" ng-model="entity.data[fieldName]" />
+      <a href ng-click="removeValue(entity, fieldName)">
+        <i class="crm-i fa-times"></i>
+      </a>
+    </div>
+    <hr />
+    <div class="form-inline">
+      <input class="form-control" ng-model="controls.addValue" crm-ui-select="{data: valuesFields}" placeholder="Add value" />
+    </div>
+  </fieldset>
+
+  <fieldset class="af-gui-entity-palette">
+    <legend class="form-inline">
+      {{ ts('Add:') }}
+      <input ng-model="controls.fieldSearch" class="form-control" type="search" placeholder="&#xf002" title="{{ ts('Search fields') }}" />
+    </legend>
+    <div class="af-gui-entity-palette-select-list">
+      <div ng-if="blockList.length">
+        <label>{{ ts('Blocks') }}</label>
+        <div ui-sortable="{update: buildPaletteLists, items: '&gt; div:not(.disabled)', connectWith: '[data-entity=' + entity.name + '] &gt; [ui-sortable]', placeholder: 'af-gui-dropzone'}" ui-sortable-update="editor.onDrop" ng-model="blockList">
+          <div ng-repeat="block in blockList" ng-class="{disabled: blockInUse(block)}">
+            {{ blockTitles[$index] }}
+          </div>
+        </div>
+      </div>
+      <div ng-if="elementList.length">
+        <label>{{ ts('Elements') }}</label>
+        <div ui-sortable="{update: buildPaletteLists, items: '&gt; div:not(.disabled)', connectWith: '[ui-sortable]', placeholder: 'af-gui-dropzone'}" ui-sortable-update="editor.onDrop" ng-model="elementList">
+          <div ng-repeat="element in elementList" >
+            {{ elementTitles[$index] }}
+          </div>
+        </div>
+      </div>
+      <div ng-repeat="fieldGroup in fieldList">
+        <div ng-if="fieldGroup.fields.length">
+          <label>{{ fieldGroup.label }}</label>
+          <div ui-sortable="{update: buildPaletteLists, items: '&gt; div:not(.disabled)', connectWith: '[data-entity=' + fieldGroup.entityName + '] &gt; [ui-sortable]', placeholder: 'af-gui-dropzone'}" ui-sortable-update="editor.onDrop" ng-model="fieldGroup.fields">
+            <div ng-repeat="field in fieldGroup.fields" ng-class="{disabled: fieldInUse(field.name)}">
+              {{ editor.getField(fieldGroup.entityType, field.name).title }}
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </fieldset>
+</div>
+
+<a href ng-click="editor.removeEntity(entity.name)" class="btn btn-sm btn-danger-outline af-gui-remove-entity" title="{{ ts('Remove %1', {1: getMeta().label}) }}">
+  <i class="crm-i fa-trash"></i>
+</a>
+
+<fieldset>
+  <legend>{{ ts('Options') }}</legend>
+  <div ng-include="'~/afGuiEditor/entityConfig/' + entity.type + '.html'"></div>
+</fieldset>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/entityConfig/Activity.html b/civicrm/ext/afform/gui/ang/afGuiEditor/entityConfig/Activity.html
new file mode 100644
index 0000000000000000000000000000000000000000..15e56f1cbeaca5a196830eb4e47707305d43ad69
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/entityConfig/Activity.html
@@ -0,0 +1 @@
+<div ng-include="'~/afGuiEditor/entityConfig/Generic.html'"></div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/entityConfig/Contact.html b/civicrm/ext/afform/gui/ang/afGuiEditor/entityConfig/Contact.html
new file mode 100644
index 0000000000000000000000000000000000000000..252b9c345795bddfce451254f4cfcf63274b2180
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/entityConfig/Contact.html
@@ -0,0 +1,10 @@
+<div ng-include="'~/afGuiEditor/entityConfig/Generic.html'"></div>
+<div class="form-inline">
+  <label>
+    {{ ts('Autofill as:') }}
+  </label>
+  <select ng-model="entity.autofill" class="form-control">
+    <option value="">{{ ts('None') }}</option>
+    <option value="user">{{ ts('Current User') }}</option>
+  </select>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/entityConfig/Generic.html b/civicrm/ext/afform/gui/ang/afGuiEditor/entityConfig/Generic.html
new file mode 100644
index 0000000000000000000000000000000000000000..88db90cd9cdff458d7a5baa644d7871f1487687c
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/entityConfig/Generic.html
@@ -0,0 +1,6 @@
+<div class="checkbox">
+  <label>
+    <input type="checkbox" ng-model="entity['url-autofill']" ng-true-value="'1'" ng-false-value="'0'" />
+    {{ ts('Allow url autofill') }}
+  </label>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/entityDefaults/Activity.json b/civicrm/ext/afform/gui/ang/afGuiEditor/entityDefaults/Activity.json
new file mode 100644
index 0000000000000000000000000000000000000000..41288d8351ef8366c5f7a4aa046ee8577d6fd733
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/entityDefaults/Activity.json
@@ -0,0 +1,5 @@
+// Default values for creating a new entity.
+// Note this is not strict JSON - it passes through angular.$parse - $scope variables are available.
+{
+  'url-autofill': '1'
+}
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/entityDefaults/Contact.json b/civicrm/ext/afform/gui/ang/afGuiEditor/entityDefaults/Contact.json
new file mode 100644
index 0000000000000000000000000000000000000000..2ffa077220892fd787361f168bdf574d9911f05e
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/entityDefaults/Contact.json
@@ -0,0 +1,9 @@
+// Default values for creating a new entity.
+// Note this is not strict JSON - it passes through angular.$parse - $scope variables are available.
+{
+  data: {
+    contact_type: 'Individual',
+    source: afform.title
+  },
+  'url-autofill': '1'
+}
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/field-menu.html b/civicrm/ext/afform/gui/ang/afGuiEditor/field-menu.html
new file mode 100644
index 0000000000000000000000000000000000000000..95b9925999dc4fc5c7e6d919ea88cdd1e6f7436d
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/field-menu.html
@@ -0,0 +1,51 @@
+<li>
+  <div href ng-click="$event.stopPropagation()" class="af-gui-field-select-in-dropdown">
+    <label>{{ ts('Type:') }}</label>
+    <select class="form-control" ng-model="getSet('input_type')" ng-model-options="{getterSetter: true}" title="{{ ts('Field type') }}">
+      <option ng-repeat="(type, label) in editor.meta.inputType" value="{{ type }}" ng-if="inputTypeCanBe(type)">{{ label }}</option>
+    </select>
+  </div>
+</li>
+<li>
+  <a href ng-click="toggleRequired(); $event.stopPropagation();" title="{{ ts('Require this field') }}">
+    <i class="crm-i" ng-class="{'fa-square-o': !getProp('required'), 'fa-check-square-o': getProp('required')}"></i>
+    {{ ts('Required') }}
+  </a>
+</li>
+<li>
+  <a href ng-click="toggleLabel(); $event.stopPropagation();" title="{{ ts('Show field label') }}">
+    <i class="crm-i" ng-class="{'fa-square-o': node.defn.title === false, 'fa-check-square-o': node.defn.title !== false}"></i>
+    {{ ts('Label') }}
+  </a>
+</li>
+<li>
+  <a href ng-click="toggleHelp('pre'); $event.stopPropagation();" title="{{ ts('Show help text above this field') }}">
+    <i class="crm-i" ng-class="{'fa-square-o': !propIsset('help_pre'), 'fa-check-square-o': propIsset('help_pre')}"></i>
+    {{ ts('Pre help text') }}
+  </a>
+</li>
+<li>
+  <a href ng-click="toggleHelp('post'); $event.stopPropagation();" title="{{ ts('Show help text below this field') }}">
+    <i class="crm-i" ng-class="{'fa-square-o': !propIsset('help_post'), 'fa-check-square-o': propIsset('help_post')}"></i>
+    {{ ts('Post help text') }}
+  </a>
+</li>
+<li role="separator" class="divider" ng-if="hasOptions()"></li>
+<li ng-if="hasOptions()" ng-click="$event.stopPropagation()">
+  <a href ng-click="resetOptions()" title="{{ ts('Reset the option list for this field') }}">
+    <i class="crm-i fa-{{ node.defn.options ? '' : 'check-' }}circle-o"></i>
+    {{ ts('Default option list') }}
+  </a>
+</li>
+<li ng-if="hasOptions()">
+  <a href ng-click="editOptions()" title="{{ ts('Customize the option list for this field') }}">
+    <i class="crm-i fa-{{ !node.defn.options ? '' : 'check-' }}circle-o"></i>
+    {{ ts('Customize options') }}
+  </a>
+</li>
+<li role="separator" class="divider"></li>
+<li>
+  <a href ng-click="container.removeElement(node)" title="{{ ts('Remove field from form') }}">
+    <span class="text-danger">{{ ts('Delete this field') }}</span>
+  </a>
+</li>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/field.html b/civicrm/ext/afform/gui/ang/afGuiEditor/field.html
new file mode 100644
index 0000000000000000000000000000000000000000..04f9c97eccc0590824a52fc267ab2a37aa8fdf9b
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/field.html
@@ -0,0 +1,23 @@
+<div af-gui-edit-options ng-if="editingOptions" class="af-gui-content-editing-area"></div>
+<div ng-if="!editingOptions" class="af-gui-element af-gui-field" >
+  <div class="af-gui-bar" title="{{ getEntity().label + ': ' + getDefn().title }}">
+    <div class="form-inline pull-right">
+      <div class="btn-group" af-gui-menu >
+        <button type="button" class="btn btn-default btn-xs dropdown-toggle af-gui-add-element-button" data-toggle="dropdown" title="{{ ts('Configure') }}">
+          <span><i class="crm-i fa-gear"></i></span>
+        </button>
+        <ul class="dropdown-menu dropdown-menu-right" ng-if="menu.open" ng-include="'~/afGuiEditor/field-menu.html'"></ul>
+      </div>
+    </div>
+  </div>
+  <label ng-style="{visibility: node.defn.title === false ? 'hidden' : 'visible'}" ng-class="{'af-gui-field-required': getProp('required')}" class="af-gui-node-title">
+    <span af-gui-editable ng-model="getSet('title')" ng-model-options="{getterSetter: true}" default-value="getDefn().title">{{ getProp('title') }}</span>
+  </label>
+  <div class="af-gui-field-help" ng-if="propIsset('help_pre')">
+    <span af-gui-editable ng-model="getSet('help_pre')" ng-model-options="{getterSetter: true}" default-value="getDefn().help_pre">{{ getProp('help_pre') }}</span>
+  </div>
+  <div class="af-gui-field-input af-gui-field-input-type-{{ getProp('input_type').toLowerCase() }}" ng-include="'~/afGuiEditor/inputType/' + getProp('input_type') + '.html'"></div>
+  <div class="af-gui-field-help" ng-if="propIsset('help_post')">
+    <span af-gui-editable ng-model="getSet('help_post')" ng-model-options="{getterSetter: true}" default-value="getDefn().help_post">{{ getProp('help_post') }}</span>
+  </div>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/ChainSelect.html b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/ChainSelect.html
new file mode 100644
index 0000000000000000000000000000000000000000..bca0c9474e973f081f14ce47a794b50982e75b21
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/ChainSelect.html
@@ -0,0 +1,8 @@
+<div class="form-inline">
+  <div class="input-group">
+    <input autocomplete="off" class="form-control" placeholder="{{ ts('Select') }}" title="{{ ts('Click to add placeholder text') }}" ng-model="getSet('input_attrs.placeholder')" ng-model-options="{getterSetter: true}" type="text" />
+    <div class="input-group-btn">
+      <button type="button" class="btn btn-default disabled dropdown-toggle"><i class="crm-i fa-caret-down"></i></button>
+    </div>
+  </div>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/CheckBox.html b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/CheckBox.html
new file mode 100644
index 0000000000000000000000000000000000000000..08baba1adec8c55bf39c690c95700fa55626db5b
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/CheckBox.html
@@ -0,0 +1,7 @@
+<ul class="crm-checkbox-list" id="{{ fieldId }}" ng-if="getOptions()">
+  <li ng-repeat="opt in getOptions()" >
+    <input type="checkbox" disabled />
+    <label>{{ opt.label }}</label>
+  </li>
+</ul>
+<input type="checkbox" disabled ng-if="!getOptions()" />
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Date.html b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Date.html
new file mode 100644
index 0000000000000000000000000000000000000000..a3d88733eb8ecf9cf22dcacd55fa818a54c68273
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Date.html
@@ -0,0 +1,5 @@
+<div class="form-inline">
+  <input autocomplete="off" class="form-control crm-form-date crm-placeholder-icon" placeholder="&#xF073" ng-model="getSet('input_attrs.placeholder')" ng-model-options="{getterSetter: true}" type="text" title="{{ ts('Click to add placeholder text') }}" />
+  <span class="addon fa fa-calendar"></span>
+  <input autocomplete="off" ng-if="getProp('input_attrs.time')" placeholder="&#xF017" class="form-control crm-form-time crm-placeholder-icon" ng-model="getSet('input_attrs.timePlaceholder')" ng-model-options="{getterSetter: true}" type="text" title="{{ ts('Click to add placeholder text') }}" />
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Number.html b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Number.html
new file mode 100644
index 0000000000000000000000000000000000000000..91c12c3a3b1d65f539cd3edc328766ab111cc4aa
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Number.html
@@ -0,0 +1 @@
+<input autocomplete="off" class="form-control" ng-model="getSet('input_attrs.placeholder')" ng-model-options="{getterSetter: true}" type="text" title="{{ ts('Click to add placeholder text') }}" />
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Radio.html b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Radio.html
new file mode 100644
index 0000000000000000000000000000000000000000..d1c47b073e2a8d3f485d3f24f840ad8ce2b72d56
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Radio.html
@@ -0,0 +1,6 @@
+<div class="form-inline">
+  <label ng-repeat="opt in getOptions()" class="radio" >
+    <input class="crm-form-radio" type="radio" disabled />
+    {{ opt.label }}
+  </label>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/RichTextEditor.html b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/RichTextEditor.html
new file mode 100644
index 0000000000000000000000000000000000000000..8c4a77d82ff821c87e3094f6c39591f39f9d2c6b
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/RichTextEditor.html
@@ -0,0 +1 @@
+<textarea autocomplete="off" class="crm-form-textarea" disabled ></textarea>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Select.html b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Select.html
new file mode 100644
index 0000000000000000000000000000000000000000..afebdae5704942c7e4ef6694f3ea3c4f5e35b0f1
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Select.html
@@ -0,0 +1,13 @@
+<div class="form-inline">
+  <div class="input-group">
+    <input autocomplete="off" class="form-control" placeholder="{{ ts('Select') }}" title="{{ ts('Click to add placeholder text') }}" ng-model="getSet('input_attrs.placeholder')" ng-model-options="{getterSetter: true}" type="text" />
+    <div class="input-group-btn" af-gui-menu>
+      <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><i class="crm-i fa-caret-down"></i></button>
+      <ul class="dropdown-menu" ng-if="menu.open">
+        <li ng-repeat="opt in getOptions()" >
+          <a href>{{ opt.label }}</a>
+        </li>
+      </ul>
+    </div>
+  </div>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Text.html b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Text.html
new file mode 100644
index 0000000000000000000000000000000000000000..91c12c3a3b1d65f539cd3edc328766ab111cc4aa
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/Text.html
@@ -0,0 +1 @@
+<input autocomplete="off" class="form-control" ng-model="getSet('input_attrs.placeholder')" ng-model-options="{getterSetter: true}" type="text" title="{{ ts('Click to add placeholder text') }}" />
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/TextArea.html b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/TextArea.html
new file mode 100644
index 0000000000000000000000000000000000000000..8c4a77d82ff821c87e3094f6c39591f39f9d2c6b
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/inputType/TextArea.html
@@ -0,0 +1 @@
+<textarea autocomplete="off" class="crm-form-textarea" disabled ></textarea>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/main.html b/civicrm/ext/afform/gui/ang/afGuiEditor/main.html
new file mode 100644
index 0000000000000000000000000000000000000000..f89bbe1283f9f0a74daa19f90afb39bc7b84eaa1
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/main.html
@@ -0,0 +1,13 @@
+<div crm-ui-debug="afform"></div>
+<div crm-ui-debug="layout"></div>
+<div crm-ui-debug="entities"></div>
+<div crm-ui-debug="meta"></div>
+<div id="bootstrap-theme">
+  <div id="afGuiEditor">
+    <div id="afGuiEditor-palette" ng-include="'~/afGuiEditor/palette.html'"></div>
+    <div id="afGuiEditor-canvas" ng-include="'~/afGuiEditor/canvas.html'"></div>
+  </div>
+  <div style="display:none;">
+    <input id="af-gui-icon-picker" title="{{ ts('Choose Icon') }}" />
+  </div>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/markup-menu.html b/civicrm/ext/afform/gui/ang/afGuiEditor/markup-menu.html
new file mode 100644
index 0000000000000000000000000000000000000000..80d1f4c10259559a3bae3336703643cd29a002bd
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/markup-menu.html
@@ -0,0 +1,10 @@
+<li>
+  <a href ng-click="edit()">{{ ts('Edit content') }}</a>
+</li>
+<li role="separator" class="divider"></li>
+<li af-gui-menu-item-border="node"></li>
+<li af-gui-menu-item-background="node"></li>
+<li role="separator" class="divider"></li>
+<li>
+  <a href ng-click="container.removeElement(node)"><span class="text-danger">{{ ts('Delete this content') }}</span></a>
+</li>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/markup.html b/civicrm/ext/afform/gui/ang/afGuiEditor/markup.html
new file mode 100644
index 0000000000000000000000000000000000000000..4831be286cfe2c84954115faba0c1d441674ccf2
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/markup.html
@@ -0,0 +1,30 @@
+<div class="af-gui-bar">
+  <div class="form-inline pull-right">
+    <div class="btn-group pull-right" af-gui-menu>
+      <button type="button" class="btn btn-default btn-xs dropdown-toggle af-gui-add-element-button" data-toggle="dropdown" title="{{ ts('Configure') }}">
+        <span><i class="crm-i fa-gear"></i></span>
+      </button>
+      <ul class="dropdown-menu" ng-if="menu.open" ng-include="'~/afGuiEditor/markup-menu.html'"></ul>
+    </div>
+  </div>
+</div>
+<div ng-if="!editingMarkup" ng-click="edit()" class="af-gui-markup-content crm-editable-enabled {{ node['class'] }}">
+  <div ng-bind-html="getMarkup()" style="{{ node.style }}"></div>
+  <div class="af-gui-markup-content-overlay"></div>
+</div>
+<div class="af-gui-content-editing-area">
+  <div class="af-gui-edit-options-bar" ng-if="editingMarkup">
+    <h4 class="pull-left">{{ ts('Editing content') }}</h4>
+    <div class="btn-group-sm pull-right">
+      <button type="button" class="btn btn-default" ng-click="close()">
+        <i class="crm-i fa-times-circle"></i>
+        {{ ts('Cancel') }}
+      </button>
+      <button type="button" class="btn btn-success" ng-click="save()">
+        <i class="crm-i fa-check-circle"></i>
+        {{ ts('Done') }}
+      </button>
+    </div>
+  </div>
+  <textarea id="{{ id }}" ng-show="editingMarkup"></textarea>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/menu-item-background.html b/civicrm/ext/afform/gui/ang/afGuiEditor/menu-item-background.html
new file mode 100644
index 0000000000000000000000000000000000000000..0fa451dccf9e1f171bb08e25e29bad98ac9bb968
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/menu-item-background.html
@@ -0,0 +1,7 @@
+<div class="af-gui-field-select-in-dropdown form-inline" ng-click="$event.stopPropagation()">
+  <label>{{ ts('Background:') }}</label>
+  <input type="color" class="form-control" ng-model="getSetBackgroundColor" ng-model-options="{getterSetter: true}"/>
+  <a href class="" ng-click="getSetBackgroundColor(null)" ng-if="container.getStyles(node)['background-color']">
+    <i class="crm-i fa-times"></i>
+  </a>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/menu-item-border.html b/civicrm/ext/afform/gui/ang/afGuiEditor/menu-item-border.html
new file mode 100644
index 0000000000000000000000000000000000000000..abb85c2f12f7650dd738a43376cee7a0997f3292
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/menu-item-border.html
@@ -0,0 +1,17 @@
+<div class="af-gui-field-select-in-dropdown form-inline" ng-click="$event.stopPropagation()">
+  <select class="form-control" ng-model="getSetBorderStyle" ng-model-options="{getterSetter: true}">
+    <option value="">{{ ts('No border') }}</option>
+    <option value="solid">{{ ts('Solid') }}</option>
+    <option value="dotted">{{ ts('Dotted') }}</option>
+    <option value="dashed">{{ ts('Dashed') }}</option>
+    <option value="double">{{ ts('Double') }}</option>
+    <option value="groove">{{ ts('Groove') }}</option>
+    <option value="ridge">{{ ts('Ridge') }}</option>
+    <option value="inset">{{ ts('Inset') }}</option>
+    <option value="outset">{{ ts('Outset') }}</option>
+  </select>
+  <select class="form-control" ng-if="getSetBorderStyle()" ng-model="getSetBorderWidth" ng-model-options="{getterSetter: true}">
+    <option ng-repeat="num in ['1px', '2px', '3px', '4px', '5px', '6px', '7px', '8px', '9px']" value="{{ num }}">{{ num }}</option>
+  </select>
+  <input type="color" class="form-control" ng-if="getSetBorderStyle()" ng-model="getSetBorderColor" ng-model-options="{getterSetter: true}"/>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/palette.html b/civicrm/ext/afform/gui/ang/afGuiEditor/palette.html
new file mode 100644
index 0000000000000000000000000000000000000000..e5855b8eb47c66f2d0a2b6905ac27f7ff99dd994
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/palette.html
@@ -0,0 +1,26 @@
+<div id="afGuiEditor-palette-config" class="panel panel-default">
+    <ul id="afGuiEditor-palette-tabs" class="panel-heading nav nav-tabs">
+      <li role="presentation" ng-class="{active: selectedEntityName === null}">
+        <a href ng-click="editor.selectEntity(null)">
+          <span>{{ ts('Form Settings') }}</span>
+        </a>
+      </li>
+      <li role="presentation" ng-repeat="entity in entities" ng-class="{active: selectedEntityName === entity.name}">
+        <a href ng-click="editor.selectEntity(entity.name)">
+          <span af-gui-editable ng-model="entity.label">{{ entity.label }}</span>
+        </a>
+      </li>
+      <li role="presentation" class="dropdown">
+        <a href class="dropdown-toggle" data-toggle="dropdown">
+          <span><i class="crm-i fa-plus"></i></span>
+        </a>
+        <ul class="dropdown-menu">
+          <li ng-repeat="(entityName, entity) in meta.entities" ng-if="entity.defaults">
+            <a href ng-click="addEntity(entityName)">{{ entity.label }}</a>
+          </li>
+        </ul>
+      </li>
+    </ul>
+  <div class="panel-body" ng-include="'~/afGuiEditor/config-form.html'" ng-if="selectedEntityName === null"></div>
+  <div class="panel-body" af-gui-entity="entity" ng-repeat="entity in entities" ng-if="selectedEntityName === entity.name"></div>
+</div>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/saveBlock.html b/civicrm/ext/afform/gui/ang/afGuiEditor/saveBlock.html
new file mode 100644
index 0000000000000000000000000000000000000000..d652b2ea8173c0d88e90ca2f5b0cdfc8ea0d6edf
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/saveBlock.html
@@ -0,0 +1,30 @@
+<form id="bootstrap-theme">
+  <div ng-controller="afGuiSaveBlock">
+    <div class="alert alert-info">
+      {{ ts('Saving a container as a block allows it to be reused across forms.') }}
+    </div>
+    <div>
+      <label for="af-gui-save-block-title">{{ ts('Title:') }} <span class="crm-marker">*</span></label>
+      <input id="af-gui-save-block-title" class="form-control" ng-model="model.title" required>
+    </div>
+    <div class="form-inline" ng-if="original.name">
+      <label>
+        <input type="radio" name="save-as" ng-value="original.name" ng-model="model.name" />
+        {{ ts('Update %1', {1: original.title}) }}
+      </label>
+      &nbsp;
+      <label>
+        <input type="radio" name="save-as" ng-value="null" ng-model="model.name" />
+        {{ ts('Save new block') }}
+      </label>
+    </div>
+    <div class="alert alert-warning" ng-show="model.name">
+      {{ ts('Affects every form that uses this block, system-wide.') }}
+    </div>
+    <hr />
+    <div class="buttons pull-right">
+      <button ng-click="save()" class="btn btn-primary" ng-disabled="!model.title">{{ ts('Save') }}</button>
+      <button ng-click="cancel()" class="btn btn-danger">{{ ts('Cancel') }}</button>
+    </div>
+  </div>
+</form>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/text-menu.html b/civicrm/ext/afform/gui/ang/afGuiEditor/text-menu.html
new file mode 100644
index 0000000000000000000000000000000000000000..7a06d8f447969623ccac8ab9dcfa9d777afd54d3
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/text-menu.html
@@ -0,0 +1,29 @@
+<li ng-click="$event.stopPropagation()">
+  <div class="af-gui-field-select-in-dropdown">
+    <label>{{ ts('Style:') }}</label>
+    <select class="form-control" ng-model="node['#tag']" title="{{ ts('Text style') }}">
+      <option ng-repeat="(opt, label) in tags" value="{{ opt }}">{{ label }}</option>
+    </select>
+  </div>
+</li>
+<li ng-click="$event.stopPropagation()">
+  <div class="af-gui-field-select-in-dropdown">
+    <div class="btn-group btn-group-sm" role="group">
+      <button type="button" class="btn btn-default" ng-class="{active: opt === getAlign()}" ng-repeat="(opt, label) in alignments" ng-click="setAlign(opt)" title="{{ label }}">
+        <i class="crm-i fa-{{ opt.replace('text', 'align') }}" ></i>
+      </button>
+    </div>
+  </div>
+</li>
+<li ng-click="$event.stopPropagation()">
+  <div class="af-gui-field-select-in-dropdown form-inline" >
+    <label>{{ ts('Color:') }}</label>
+    <select class="form-control {{ getSetStyle().replace('btn', 'text') }}" ng-model="getSetStyle" ng-model-options="{getterSetter: true}" title="{{ ts('Button color scheme') }}">
+      <option ng-repeat="(style, label) in styles" class="{{ style.replace('text', 'bg') }}" value="{{ style }}">{{ label }}</option>
+    </select>
+  </div>
+</li>
+<li role="separator" class="divider"></li>
+<li>
+  <a href ng-click="container.removeElement(node)"><span class="text-danger">{{ ts('Delete this text') }}</span></a>
+</li>
diff --git a/civicrm/ext/afform/gui/ang/afGuiEditor/text.html b/civicrm/ext/afform/gui/ang/afGuiEditor/text.html
new file mode 100644
index 0000000000000000000000000000000000000000..e7a0eb5e267443dfc2105b40e823812c629c74d4
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiEditor/text.html
@@ -0,0 +1,13 @@
+<div class="af-gui-bar">
+  <div class="form-inline pull-right">
+    <div class="btn-group pull-right" af-gui-menu>
+      <button type="button" class="btn btn-default btn-xs dropdown-toggle af-gui-add-element-button" data-toggle="dropdown" title="{{ ts('Configure') }}">
+        <span><i class="crm-i fa-gear"></i></span>
+      </button>
+      <ul class="dropdown-menu" ng-if="menu.open" ng-include="'~/afGuiEditor/text-menu.html'"></ul>
+    </div>
+  </div>
+</div>
+<p class="af-gui-node-title {{ node['class'] + ' af-gui-text-' + node['#tag'] }}" >
+  <span af-gui-editable ng-model="node['#children'][0]['#text']">{{ node['#children'][0]['#text'] }}</span>
+</p>
diff --git a/civicrm/ext/afform/gui/ang/afGuiList.aff.html b/civicrm/ext/afform/gui/ang/afGuiList.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..4fe9b37a137e1c7ee6fec8c803673e83b1c57933
--- /dev/null
+++ b/civicrm/ext/afform/gui/ang/afGuiList.aff.html
@@ -0,0 +1,55 @@
+<a href="#!/?name=0" class="btn btn-default">
+  <i class="crm-i fa-plus"></i> {{ ts('New Form') }}
+</a>
+<div
+  af-api4="['Afform', 'get', {select: ['name','title','is_public','server_route','has_local','has_base'], orderBy: {name:'ASC'}}]"
+  af-api4-ctrl="listCtrl">
+
+  <div ng-if="apiData.result.length == 0">
+    {{ts('There are no forms! Tell Aristotle!')}}
+  </div>
+
+  <table>
+    <thead>
+      <tr>
+        <th>{{ts('Name')}}</th>
+        <th>{{ts('Title')}}</th>
+        <th>{{ts('Server Route')}}</th>
+        <th>{{ts('Frontend?')}}</th>
+        <th></th>
+      </tr>
+    </thead>
+    <tbody>
+    <tr ng-repeat="availForm in listCtrl.result">
+      <td>
+        <a ng-href="#!/?name={{availForm.name}}">{{availForm.name}}</a>
+      </td>
+      <td>{{availForm.title}}</td>
+      <td>
+        <a ng-if="availForm.server_route" ng-href="{{crmUrl(availForm.server_route)}}" target="_blank">
+          <code>{{availForm.server_route}}</code>
+        </a>
+      </td>
+      <td>{{availForm.is_public ? ts('Frontend') : ts('Backend')}}</td>
+      <td>
+        <!--<a ng-click="crmStatus({start: ts('Reverting...'), success: ts('Reverted')}, crmApi4('Afform', 'revert', {where: [['name', '=', availForm.name]]}))">{{ts('Revert')}}</a>-->
+        <a af-api4-action="['Afform', 'revert', {where: [['name','=', availForm.name]]}]"
+           af-api4-start-msg="ts('Reverting...')"
+           af-api4-success-msg="ts('Reverted')"
+           af-api4-success="listCtrl.refresh()"
+           class="btn btn-xs btn-default"
+           ng-if="availForm.has_local && availForm.has_base"
+          >{{ts('Revert')}}</a>
+        <a af-api4-action="['Afform', 'revert', {where: [['name','=', availForm.name]]}]"
+           af-api4-start-msg="ts('Deleting...')"
+           af-api4-success-msg="ts('Deleted')"
+           af-api4-success="listCtrl.refresh()"
+           class="btn btn-xs btn-default"
+           ng-if="availForm.has_local && !availForm.has_base"
+        >{{ts('Delete')}}</a>
+      </td>
+    </tr>
+    </tbody>
+  </table>
+
+</div>
diff --git a/civicrm/ext/afform/gui/images/icons.png b/civicrm/ext/afform/gui/images/icons.png
new file mode 100644
index 0000000000000000000000000000000000000000..98fc24208e8e09ec316ea57406da0f9a6051bff2
Binary files /dev/null and b/civicrm/ext/afform/gui/images/icons.png differ
diff --git a/civicrm/ext/afform/gui/images/number.png b/civicrm/ext/afform/gui/images/number.png
new file mode 100644
index 0000000000000000000000000000000000000000..357b11c21dcc60cab120a300dcdb20d884b760b9
Binary files /dev/null and b/civicrm/ext/afform/gui/images/number.png differ
diff --git a/civicrm/ext/afform/gui/info.xml b/civicrm/ext/afform/gui/info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b03aca593ef88ea8d332e805af12abf66b1bf29b
--- /dev/null
+++ b/civicrm/ext/afform/gui/info.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0"?>
+<extension key="org.civicrm.afform-gui" type="module">
+  <file>afform_gui</file>
+  <name>Afform: Form Builder</name>
+  <description>GUI for designing forms</description>
+  <license>AGPL-3.0</license>
+  <maintainer>
+    <author>Tim Otten</author>
+    <email>totten@civicrm.org</email>
+  </maintainer>
+  <urls>
+    <url desc="Main Extension Page">http://FIXME</url>
+    <url desc="Documentation">http://FIXME</url>
+    <url desc="Support">http://FIXME</url>
+    <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
+  </urls>
+  <releaseDate>2020-01-09</releaseDate>
+  <version>0.5</version>
+  <develStage>alpha</develStage>
+  <compatibility>
+    <ver>5.23</ver>
+  </compatibility>
+  <comments>Drag-n-drop form builder for CiviCRM Afforms.</comments>
+  <requires>
+    <ext>org.civicrm.afform</ext>
+    <ext>org.civicrm.api4</ext>
+  </requires>
+  <civix>
+    <namespace>CRM/AfformGui</namespace>
+  </civix>
+</extension>
diff --git a/civicrm/ext/afform/gui/templates/CRM/AfformGui/afformBuilder.hlp b/civicrm/ext/afform/gui/templates/CRM/AfformGui/afformBuilder.hlp
new file mode 100644
index 0000000000000000000000000000000000000000..55a904ca6d2e512df779c0333287fc0b4f499493
--- /dev/null
+++ b/civicrm/ext/afform/gui/templates/CRM/AfformGui/afformBuilder.hlp
@@ -0,0 +1 @@
+{* help for Angular afformGui *}
diff --git a/civicrm/ext/afform/gui/templates/CRM/AfformGui/afformList.hlp b/civicrm/ext/afform/gui/templates/CRM/AfformGui/afformList.hlp
new file mode 100644
index 0000000000000000000000000000000000000000..55a904ca6d2e512df779c0333287fc0b4f499493
--- /dev/null
+++ b/civicrm/ext/afform/gui/templates/CRM/AfformGui/afformList.hlp
@@ -0,0 +1 @@
+{* help for Angular afformGui *}
diff --git a/civicrm/ext/afform/html/LICENSE.txt b/civicrm/ext/afform/html/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..cfd30320f42d6d332826523410b2848bc7fc4507
--- /dev/null
+++ b/civicrm/ext/afform/html/LICENSE.txt
@@ -0,0 +1,667 @@
+Package: org.civicrm.afform-html
+Copyright (C) 2019, Tim Otten <totten@civicrm.org>
+Licensed under the GNU Affero Public License 3.0 (below).
+
+-------------------------------------------------------------------------------
+
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/civicrm/ext/afform/html/README.md b/civicrm/ext/afform/html/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..25d971b7b0753b6642d794e422ffea03cc5133c5
--- /dev/null
+++ b/civicrm/ext/afform/html/README.md
@@ -0,0 +1,44 @@
+# org.civicrm.afform-html
+
+![Screenshot](/images/screenshot.png)
+
+This extension provides a UI for overriding the html in a flexible form. The UI  is accessible at the url civicrm/admin/afform-html
+
+The extension is licensed under [AGPL-3.0](LICENSE.txt).
+
+## Requirements
+
+* PHP v5.6+
+* CiviCRM (*FIXME: Version number*)
+
+## Installation (Web UI)
+
+This extension has not yet been published for installation via the web UI.
+
+## Installation (CLI, Zip)
+
+Sysadmins and developers may download the `.zip` file for this extension and
+install it with the command-line tool [cv](https://github.com/civicrm/cv).
+
+```bash
+cd <extension-dir>
+cv dl org.civicrm.afform-html@https://github.com/FIXME/org.civicrm.afform-html/archive/master.zip
+```
+
+## Installation (CLI, Git)
+
+Sysadmins and developers may clone the [Git](https://en.wikipedia.org/wiki/Git) repo for this extension and
+install it with the command-line tool [cv](https://github.com/civicrm/cv).
+
+```bash
+git clone https://github.com/FIXME/org.civicrm.afform-html.git
+cv en afform_html
+```
+
+## Usage
+
+(* FIXME: Where would a new user navigate to get started? What changes would they see? *)
+
+## Known Issues
+
+(* FIXME *)
diff --git a/civicrm/ext/afform/html/afform_html.civix.php b/civicrm/ext/afform/html/afform_html.civix.php
new file mode 100644
index 0000000000000000000000000000000000000000..948f0ce17b7ab3e47da272eeef59cf4191628c7e
--- /dev/null
+++ b/civicrm/ext/afform/html/afform_html.civix.php
@@ -0,0 +1,477 @@
+<?php
+
+// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
+
+/**
+ * The ExtensionUtil class provides small stubs for accessing resources of this
+ * extension.
+ */
+class CRM_AfformHtml_ExtensionUtil {
+  const SHORT_NAME = "afform_html";
+  const LONG_NAME = "org.civicrm.afform-html";
+  const CLASS_PREFIX = "CRM_AfformHtml";
+
+  /**
+   * Translate a string using the extension's domain.
+   *
+   * If the extension doesn't have a specific translation
+   * for the string, fallback to the default translations.
+   *
+   * @param string $text
+   *   Canonical message text (generally en_US).
+   * @param array $params
+   * @return string
+   *   Translated text.
+   * @see ts
+   */
+  public static function ts($text, $params = []) {
+    if (!array_key_exists('domain', $params)) {
+      $params['domain'] = [self::LONG_NAME, NULL];
+    }
+    return ts($text, $params);
+  }
+
+  /**
+   * Get the URL of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo'.
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function url($file = NULL) {
+    if ($file === NULL) {
+      return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/');
+    }
+    return CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME, $file);
+  }
+
+  /**
+   * Get the path of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo'.
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function path($file = NULL) {
+    // return CRM_Core_Resources::singleton()->getPath(self::LONG_NAME, $file);
+    return __DIR__ . ($file === NULL ? '' : (DIRECTORY_SEPARATOR . $file));
+  }
+
+  /**
+   * Get the name of a class within this extension.
+   *
+   * @param string $suffix
+   *   Ex: 'Page_HelloWorld' or 'Page\\HelloWorld'.
+   * @return string
+   *   Ex: 'CRM_Foo_Page_HelloWorld'.
+   */
+  public static function findClass($suffix) {
+    return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix);
+  }
+
+}
+
+use CRM_AfformHtml_ExtensionUtil as E;
+
+/**
+ * (Delegated) Implements hook_civicrm_config().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config
+ */
+function _afform_html_civix_civicrm_config(&$config = NULL) {
+  static $configured = FALSE;
+  if ($configured) {
+    return;
+  }
+  $configured = TRUE;
+
+  $template =& CRM_Core_Smarty::singleton();
+
+  $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
+  $extDir = $extRoot . 'templates';
+
+  if (is_array($template->template_dir)) {
+    array_unshift($template->template_dir, $extDir);
+  }
+  else {
+    $template->template_dir = [$extDir, $template->template_dir];
+  }
+
+  $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
+  set_include_path($include_path);
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_xmlMenu().
+ *
+ * @param $files array(string)
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu
+ */
+function _afform_html_civix_civicrm_xmlMenu(&$files) {
+  foreach (_afform_html_civix_glob(__DIR__ . '/xml/Menu/*.xml') as $file) {
+    $files[] = $file;
+  }
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+ */
+function _afform_html_civix_civicrm_install() {
+  _afform_html_civix_civicrm_config();
+  if ($upgrader = _afform_html_civix_upgrader()) {
+    $upgrader->onInstall();
+  }
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
+ */
+function _afform_html_civix_civicrm_postInstall() {
+  _afform_html_civix_civicrm_config();
+  if ($upgrader = _afform_html_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onPostInstall'])) {
+      $upgrader->onPostInstall();
+    }
+  }
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
+ */
+function _afform_html_civix_civicrm_uninstall() {
+  _afform_html_civix_civicrm_config();
+  if ($upgrader = _afform_html_civix_upgrader()) {
+    $upgrader->onUninstall();
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_enable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+ */
+function _afform_html_civix_civicrm_enable() {
+  _afform_html_civix_civicrm_config();
+  if ($upgrader = _afform_html_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onEnable'])) {
+      $upgrader->onEnable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_disable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
+ * @return mixed
+ */
+function _afform_html_civix_civicrm_disable() {
+  _afform_html_civix_civicrm_config();
+  if ($upgrader = _afform_html_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onDisable'])) {
+      $upgrader->onDisable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_upgrade().
+ *
+ * @param $op string, the type of operation being performed; 'check' or 'enqueue'
+ * @param $queue CRM_Queue_Queue, (for 'enqueue') the modifiable list of pending up upgrade tasks
+ *
+ * @return mixed
+ *   based on op. for 'check', returns array(boolean) (TRUE if upgrades are pending)
+ *   for 'enqueue', returns void
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade
+ */
+function _afform_html_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  if ($upgrader = _afform_html_civix_upgrader()) {
+    return $upgrader->onUpgrade($op, $queue);
+  }
+}
+
+/**
+ * @return CRM_AfformHtml_Upgrader
+ */
+function _afform_html_civix_upgrader() {
+  if (!file_exists(__DIR__ . '/CRM/AfformHtml/Upgrader.php')) {
+    return NULL;
+  }
+  else {
+    return CRM_AfformHtml_Upgrader_Base::instance();
+  }
+}
+
+/**
+ * Search directory tree for files which match a glob pattern.
+ *
+ * Note: Dot-directories (like "..", ".git", or ".svn") will be ignored.
+ * Note: In Civi 4.3+, delegate to CRM_Utils_File::findFiles()
+ *
+ * @param string $dir base dir
+ * @param string $pattern , glob pattern, eg "*.txt"
+ *
+ * @return array
+ */
+function _afform_html_civix_find_files($dir, $pattern) {
+  if (is_callable(['CRM_Utils_File', 'findFiles'])) {
+    return CRM_Utils_File::findFiles($dir, $pattern);
+  }
+
+  $todos = [$dir];
+  $result = [];
+  while (!empty($todos)) {
+    $subdir = array_shift($todos);
+    foreach (_afform_html_civix_glob("$subdir/$pattern") as $match) {
+      if (!is_dir($match)) {
+        $result[] = $match;
+      }
+    }
+    if ($dh = opendir($subdir)) {
+      while (FALSE !== ($entry = readdir($dh))) {
+        $path = $subdir . DIRECTORY_SEPARATOR . $entry;
+        if ($entry[0] == '.') {
+        }
+        elseif (is_dir($path)) {
+          $todos[] = $path;
+        }
+      }
+      closedir($dh);
+    }
+  }
+  return $result;
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_managed().
+ *
+ * Find any *.mgd.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed
+ */
+function _afform_html_civix_civicrm_managed(&$entities) {
+  $mgdFiles = _afform_html_civix_find_files(__DIR__, '*.mgd.php');
+  sort($mgdFiles);
+  foreach ($mgdFiles as $file) {
+    $es = include $file;
+    foreach ($es as $e) {
+      if (empty($e['module'])) {
+        $e['module'] = E::LONG_NAME;
+      }
+      if (empty($e['params']['version'])) {
+        $e['params']['version'] = '3';
+      }
+      $entities[] = $e;
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_caseTypes().
+ *
+ * Find any and return any files matching "xml/case/*.xml"
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes
+ */
+function _afform_html_civix_civicrm_caseTypes(&$caseTypes) {
+  if (!is_dir(__DIR__ . '/xml/case')) {
+    return;
+  }
+
+  foreach (_afform_html_civix_glob(__DIR__ . '/xml/case/*.xml') as $file) {
+    $name = preg_replace('/\.xml$/', '', basename($file));
+    if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) {
+      $errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name));
+      throw new CRM_Core_Exception($errorMessage);
+    }
+    $caseTypes[$name] = [
+      'module' => E::LONG_NAME,
+      'name' => $name,
+      'file' => $file,
+    ];
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_angularModules().
+ *
+ * Find any and return any files matching "ang/*.ang.php"
+ *
+ * Note: This hook only runs in CiviCRM 4.5+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules
+ */
+function _afform_html_civix_civicrm_angularModules(&$angularModules) {
+  if (!is_dir(__DIR__ . '/ang')) {
+    return;
+  }
+
+  $files = _afform_html_civix_glob(__DIR__ . '/ang/*.ang.php');
+  foreach ($files as $file) {
+    $name = preg_replace(':\.ang\.php$:', '', basename($file));
+    $module = include $file;
+    if (empty($module['ext'])) {
+      $module['ext'] = E::LONG_NAME;
+    }
+    $angularModules[$name] = $module;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_themes().
+ *
+ * Find any and return any files matching "*.theme.php"
+ */
+function _afform_html_civix_civicrm_themes(&$themes) {
+  $files = _afform_html_civix_glob(__DIR__ . '/*.theme.php');
+  foreach ($files as $file) {
+    $themeMeta = include $file;
+    if (empty($themeMeta['name'])) {
+      $themeMeta['name'] = preg_replace(':\.theme\.php$:', '', basename($file));
+    }
+    if (empty($themeMeta['ext'])) {
+      $themeMeta['ext'] = E::LONG_NAME;
+    }
+    $themes[$themeMeta['name']] = $themeMeta;
+  }
+}
+
+/**
+ * Glob wrapper which is guaranteed to return an array.
+ *
+ * The documentation for glob() says, "On some systems it is impossible to
+ * distinguish between empty match and an error." Anecdotally, the return
+ * result for an empty match is sometimes array() and sometimes FALSE.
+ * This wrapper provides consistency.
+ *
+ * @link http://php.net/glob
+ * @param string $pattern
+ *
+ * @return array
+ */
+function _afform_html_civix_glob($pattern) {
+  $result = glob($pattern);
+  return is_array($result) ? $result : [];
+}
+
+/**
+ * Inserts a navigation menu item at a given place in the hierarchy.
+ *
+ * @param array $menu - menu hierarchy
+ * @param string $path - path to parent of this item, e.g. 'my_extension/submenu'
+ *    'Mailing', or 'Administer/System Settings'
+ * @param array $item - the item to insert (parent/child attributes will be
+ *    filled for you)
+ *
+ * @return bool
+ */
+function _afform_html_civix_insert_navigation_menu(&$menu, $path, $item) {
+  // If we are done going down the path, insert menu
+  if (empty($path)) {
+    $menu[] = [
+      'attributes' => array_merge([
+        'label'      => CRM_Utils_Array::value('name', $item),
+        'active'     => 1,
+      ], $item),
+    ];
+    return TRUE;
+  }
+  else {
+    // Find an recurse into the next level down
+    $found = FALSE;
+    $path = explode('/', $path);
+    $first = array_shift($path);
+    foreach ($menu as $key => &$entry) {
+      if ($entry['attributes']['name'] == $first) {
+        if (!isset($entry['child'])) {
+          $entry['child'] = [];
+        }
+        $found = _afform_html_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item);
+      }
+    }
+    return $found;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_navigationMenu().
+ */
+function _afform_html_civix_navigationMenu(&$nodes) {
+  if (!is_callable(['CRM_Core_BAO_Navigation', 'fixNavigationMenu'])) {
+    _afform_html_civix_fixNavigationMenu($nodes);
+  }
+}
+
+/**
+ * Given a navigation menu, generate navIDs for any items which are
+ * missing them.
+ */
+function _afform_html_civix_fixNavigationMenu(&$nodes) {
+  $maxNavID = 1;
+  array_walk_recursive($nodes, function($item, $key) use (&$maxNavID) {
+    if ($key === 'navID') {
+      $maxNavID = max($maxNavID, $item);
+    }
+  });
+  _afform_html_civix_fixNavigationMenuItems($nodes, $maxNavID, NULL);
+}
+
+function _afform_html_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $parentID) {
+  $origKeys = array_keys($nodes);
+  foreach ($origKeys as $origKey) {
+    if (!isset($nodes[$origKey]['attributes']['parentID']) && $parentID !== NULL) {
+      $nodes[$origKey]['attributes']['parentID'] = $parentID;
+    }
+    // If no navID, then assign navID and fix key.
+    if (!isset($nodes[$origKey]['attributes']['navID'])) {
+      $newKey = ++$maxNavID;
+      $nodes[$origKey]['attributes']['navID'] = $newKey;
+      $nodes[$newKey] = $nodes[$origKey];
+      unset($nodes[$origKey]);
+      $origKey = $newKey;
+    }
+    if (isset($nodes[$origKey]['child']) && is_array($nodes[$origKey]['child'])) {
+      _afform_html_civix_fixNavigationMenuItems($nodes[$origKey]['child'], $maxNavID, $nodes[$origKey]['attributes']['navID']);
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders
+ */
+function _afform_html_civix_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  $settingsDir = __DIR__ . DIRECTORY_SEPARATOR . 'settings';
+  if (!in_array($settingsDir, $metaDataFolders) && is_dir($settingsDir)) {
+    $metaDataFolders[] = $settingsDir;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_entityTypes().
+ *
+ * Find any *.entityType.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes
+ */
+function _afform_html_civix_civicrm_entityTypes(&$entityTypes) {
+  $entityTypes = array_merge($entityTypes, []);
+}
diff --git a/civicrm/ext/afform/html/afform_html.php b/civicrm/ext/afform/html/afform_html.php
new file mode 100644
index 0000000000000000000000000000000000000000..8b45581d59a0d1bf5b7bd7f6b9cebe5f346484b3
--- /dev/null
+++ b/civicrm/ext/afform/html/afform_html.php
@@ -0,0 +1,162 @@
+<?php
+
+require_once 'afform_html.civix.php';
+use CRM_AfformHtml_ExtensionUtil as E;
+
+if (!defined('AFFORM_HTML_MONACO')) {
+  define('AFFORM_HTML_MONACO', 'node_modules/monaco-editor/min/vs');
+}
+
+/**
+ * Implements hook_civicrm_config().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_config
+ */
+function afform_html_civicrm_config(&$config) {
+  _afform_html_civix_civicrm_config($config);
+}
+
+/**
+ * Implements hook_civicrm_xmlMenu().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_xmlMenu
+ */
+function afform_html_civicrm_xmlMenu(&$files) {
+  _afform_html_civix_civicrm_xmlMenu($files);
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_install
+ */
+function afform_html_civicrm_install() {
+  _afform_html_civix_civicrm_install();
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_postInstall
+ */
+function afform_html_civicrm_postInstall() {
+  _afform_html_civix_civicrm_postInstall();
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_uninstall
+ */
+function afform_html_civicrm_uninstall() {
+  _afform_html_civix_civicrm_uninstall();
+}
+
+/**
+ * Implements hook_civicrm_enable().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_enable
+ */
+function afform_html_civicrm_enable() {
+  _afform_html_civix_civicrm_enable();
+}
+
+/**
+ * Implements hook_civicrm_disable().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_disable
+ */
+function afform_html_civicrm_disable() {
+  _afform_html_civix_civicrm_disable();
+}
+
+/**
+ * Implements hook_civicrm_upgrade().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_upgrade
+ */
+function afform_html_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  return _afform_html_civix_civicrm_upgrade($op, $queue);
+}
+
+/**
+ * Implements hook_civicrm_managed().
+ *
+ * Generate a list of entities to create/deactivate/delete when this module
+ * is installed, disabled, uninstalled.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_managed
+ */
+function afform_html_civicrm_managed(&$entities) {
+  _afform_html_civix_civicrm_managed($entities);
+}
+
+/**
+ * Implements hook_civicrm_caseTypes().
+ *
+ * Generate a list of case-types.
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_caseTypes
+ */
+function afform_html_civicrm_caseTypes(&$caseTypes) {
+  _afform_html_civix_civicrm_caseTypes($caseTypes);
+}
+
+/**
+ * Implements hook_civicrm_angularModules().
+ *
+ * Generate a list of Angular modules.
+ *
+ * Note: This hook only runs in CiviCRM 4.5+. It may
+ * use features only available in v4.6+.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_angularModules
+ */
+function afform_html_civicrm_angularModules(&$angularModules) {
+  _afform_html_civix_civicrm_angularModules($angularModules);
+}
+
+/**
+ * Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_alterSettingsFolders
+ */
+function afform_html_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  _afform_html_civix_civicrm_alterSettingsFolders($metaDataFolders);
+}
+
+/**
+ * Implements hook_civicrm_entityTypes().
+ *
+ * Declare entity types provided by this module.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_entityTypes
+ */
+function afform_html_civicrm_entityTypes(&$entityTypes) {
+  _afform_html_civix_civicrm_entityTypes($entityTypes);
+}
+
+/**
+ * Implements hook_civicrm_themes().
+ */
+function afform_html_civicrm_themes(&$themes) {
+  _afform_html_civix_civicrm_themes($themes);
+}
+
+/**
+ * Implements hook_civicrm_check().
+ */
+function afform_html_civicrm_check(&$messages) {
+  $dir = E::path(AFFORM_HTML_MONACO);
+  if (!file_exists($dir)) {
+    $messages[] = new CRM_Utils_Check_Message(
+      'afform_html_monaco',
+      ts('Afform HTML is missing its "node_modules" folder. Please consult the README.md for current installation instructions.'),
+      ts('Afform HTML: Packages are missing'),
+      \Psr\Log\LogLevel::CRITICAL,
+      'fa-chain-broken'
+    );
+  }
+}
diff --git a/civicrm/ext/afform/html/ang/afHtmlAdmin.aff.html b/civicrm/ext/afform/html/ang/afHtmlAdmin.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..2f463b86a771503018d45ae8d103998903f1f415
--- /dev/null
+++ b/civicrm/ext/afform/html/ang/afHtmlAdmin.aff.html
@@ -0,0 +1,7 @@
+<div ng-if="!routeParams.name">
+  <div af-html-list=""></div>
+</div>
+
+<div ng-if="routeParams.name">
+  <div af-html-editor="{name: routeParams.name}"></div>
+</div>
diff --git a/civicrm/ext/afform/html/ang/afHtmlAdmin.aff.json b/civicrm/ext/afform/html/ang/afHtmlAdmin.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..4feaa980aa9d227da641c8ca687b4bc7f6ca3948
--- /dev/null
+++ b/civicrm/ext/afform/html/ang/afHtmlAdmin.aff.json
@@ -0,0 +1,5 @@
+{
+  "title": "Afform HTML Administration",
+  "server_route": "civicrm/admin/afform-html",
+  "permission": "administer CiviCRM"
+}
diff --git a/civicrm/ext/afform/html/ang/afHtmlEditor.aff.html b/civicrm/ext/afform/html/ang/afHtmlEditor.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..0cbca87fd24174c052d8d3d7decc6cabc3f7cbf5
--- /dev/null
+++ b/civicrm/ext/afform/html/ang/afHtmlEditor.aff.html
@@ -0,0 +1,35 @@
+<div af-api4-ctrl="apiData" af-api4="['Afform', 'get', {layoutFormat: 'html', where: [['name', '=', options.name]]}]">
+
+  <div ng-if="apiData.result.length == 0">
+    {{ts('Failed to find requested form.')}}
+  </div>
+
+  <div ng-repeat="resultForm in apiData.result" ng-if="apiData.result.length > 0">
+    <div crm-ui-debug="resultForm"></div>
+
+    <div>
+      <a ng-href="#!/">{{ts('Back')}}</a>
+      |
+      <a af-api4-action="['Afform', 'update', {layoutFormat: 'html', where: [['name', '=', resultForm.name]], values:resultForm}]">{{ts('Save')}}</a>
+      <span ng-if="resultForm.server_route">
+        | <a target="_blank" ng-href="{{crmUrl(resultForm.server_route)}}">Open</a>
+      </span>
+    </div>
+
+    <fieldset>
+      <legend>{{ts('Properties')}}</legend>
+      <div><label>{{ts('Name')}}:</label> {{resultForm.name}}</div>
+      <div><label>{{ts('Title')}}:</label> <input ng-model="resultForm.title" type="text" /></div>
+      <div><label>{{ts('Server Route')}}:</label> <input ng-model="resultForm.server_route" type="text" /></div>
+      <div><label>{{ts('Permission')}}:</label> <input ng-model="resultForm.permission" type="text" /></div>
+      <div><label>{{ts('Description')}}:</label> <textarea ng-model="resultForm.description"></textarea></div>
+    </fieldset>
+
+    <fieldset>
+      <legend>{{ts('Layout')}}</legend>
+      <div af-monaco ng-model="resultForm.layout"></div>
+    </fieldset>
+
+  </div>
+
+</div>
diff --git a/civicrm/ext/afform/html/ang/afHtmlList.aff.html b/civicrm/ext/afform/html/ang/afHtmlList.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..ad66cc579063f9b341c724f08d419f29d50da22a
--- /dev/null
+++ b/civicrm/ext/afform/html/ang/afHtmlList.aff.html
@@ -0,0 +1,52 @@
+<div
+  af-api4="['Afform', 'get', {select: ['name','title','is_public','server_route', 'has_local', 'has_base'], orderBy: {name:'ASC'}}]"
+  af-api4-ctrl="listCtrl">
+
+  <div ng-if="apiData.result.length == 0">
+    {{ts('There are no forms! Tell Aristotle!')}}
+  </div>
+
+  <table>
+    <thead>
+      <tr>
+        <th>{{ts('Name')}}</th>
+        <th>{{ts('Title')}}</th>
+        <th>{{ts('Server Route')}}</th>
+        <th>{{ts('Frontend?')}}</th>
+        <th></th>
+      </tr>
+    </thead>
+    <tbody>
+    <tr ng-repeat="availForm in listCtrl.result">
+      <td>
+        <a ng-href="#!/?name={{availForm.name}}">{{availForm.name}}</a>
+      </td>
+      <td>{{availForm.title}}</td>
+      <td>
+        <a ng-if="availForm.server_route" ng-href="{{crmUrl(availForm.server_route)}}" target="_blank">
+          <code>{{availForm.server_route}}</code>
+        </a>
+      </td>
+      <td>{{availForm.is_public ? ts('Frontend') : ts('Backend')}}</td>
+      <td>
+        <!--<a ng-click="crmStatus({start: ts('Reverting...'), success: ts('Reverted')}, crmApi4('Afform', 'revert', {where: [['name', '=', availForm.name]]}))">{{ts('Revert')}}</a>-->
+        <a af-api4-action="['Afform', 'revert', {where: [['name','=', availForm.name]]}]"
+           af-api4-start-msg="ts('Reverting...')"
+           af-api4-success-msg="ts('Reverted')"
+           af-api4-success="listCtrl.refresh()"
+           class="btn btn-xs btn-default"
+           ng-if="availForm.has_local && availForm.has_base"
+          >{{ts('Revert')}}</a>
+        <a af-api4-action="['Afform', 'revert', {where: [['name','=', availForm.name]]}]"
+           af-api4-start-msg="ts('Deleting...')"
+           af-api4-success-msg="ts('Deleted')"
+           af-api4-success="listCtrl.refresh()"
+           class="btn btn-xs btn-default"
+           ng-if="availForm.has_local && !availForm.has_base"
+        >{{ts('Delete')}}</a>
+      </td>
+    </tr>
+    </tbody>
+  </table>
+
+</div>
diff --git a/civicrm/ext/afform/html/ang/afMonaco.ang.php b/civicrm/ext/afform/html/ang/afMonaco.ang.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c99071e213f9d036c2bd99940771f8bc900bde6
--- /dev/null
+++ b/civicrm/ext/afform/html/ang/afMonaco.ang.php
@@ -0,0 +1,25 @@
+<?php
+// This file declares an Angular module which can be autoloaded
+// in CiviCRM. See also:
+// http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_angularModules
+
+return array(
+  'js' => [
+    AFFORM_HTML_MONACO . '/loader.js',
+    'ang/afMonaco.js',
+    //    'ang/afMonaco/*.js',
+    //    'ang/afMonaco/*/*.js',
+  ],
+  'css' => ['ang/afMonaco.css'],
+  // 'partials' => ['ang/afMonaco'],
+  'requires' => ['crmUi', 'crmUtil'],
+  'settings' => [
+    'paths' => [
+      'vs' => CRM_AfformHtml_ExtensionUtil::url(AFFORM_HTML_MONACO),
+    ],
+  ],
+  'basePages' => [],
+  'exports' => [
+    'af-monaco' => 'A',
+  ],
+);
diff --git a/civicrm/ext/afform/html/ang/afMonaco.css b/civicrm/ext/afform/html/ang/afMonaco.css
new file mode 100644
index 0000000000000000000000000000000000000000..01029b1f2b8d83be4e6815b6d421ac86cbdae76f
--- /dev/null
+++ b/civicrm/ext/afform/html/ang/afMonaco.css
@@ -0,0 +1,4 @@
+/* Add any CSS rules for Angular module "afMonaco" */
+.af-monaco-container {
+    border:1px solid grey;
+}
\ No newline at end of file
diff --git a/civicrm/ext/afform/html/ang/afMonaco.js b/civicrm/ext/afform/html/ang/afMonaco.js
new file mode 100644
index 0000000000000000000000000000000000000000..3e0009b7af6841daf94f58b603f333ee61d6b4a0
--- /dev/null
+++ b/civicrm/ext/afform/html/ang/afMonaco.js
@@ -0,0 +1,78 @@
+(function(angular, $, _) {
+  angular.module('afMonaco', CRM.angRequires('afMonaco'));
+
+  // "afMonaco" is a basic skeletal directive.
+  // Example usage: <div af-monaco ng-model="my.content"></div>
+  angular.module('afMonaco').directive('afMonaco', function($timeout) {
+    return {
+      restrict: 'AE',
+      require: 'ngModel',
+      template: '<div class="af-monaco-container"></div>',
+      link: function($scope, $el, $attr, ngModel) {
+        var heightPct = 0.70;
+        var editor;
+        require.config({paths: CRM.afMonaco.paths});
+        require(['vs/editor/editor.main'], function() {
+          var editorEl = $el.find('.af-monaco-container');
+          editorEl.css({height: Math.round(heightPct * $(window).height())});
+          editor = monaco.editor.create(editorEl[0], {
+            value: ngModel.$modelValue,
+            language: 'html',
+            // theme: 'vs-dark',
+            theme: 'vs',
+            minimap: {
+              enabled: false
+            },
+            automaticLayout: true,
+            scrollbar: {
+              useShadows: false,
+              verticalHasArrows: true,
+              horizontalHasArrows: true,
+              vertical: 'visible',
+              horizontal: 'visible',
+              verticalScrollbarSize: 17,
+              horizontalScrollbarSize: 17,
+              arrowSize: 30
+            }
+          });
+
+          editor.onDidChangeModelContent(_.debounce(function () {
+            $scope.$apply(function () {
+              ngModel.$setViewValue(editor.getValue());
+            });
+          }, 150));
+
+          ngModel.$render = function() {
+            if (editor) {
+              editor.setValue(ngModel.$modelValue);
+            }
+            // FIXME: else: retry?
+          };
+
+          // FIXME: This makes vertical scrolling much better, but horizontal is still weird.
+          var origOverflow;
+          function bodyScrollSuspend() {
+            if (origOverflow !== undefined) return;
+            origOverflow = $('body').css('overflow');
+            $('body').css('overflow', 'hidden');
+          }
+          function bodyScrollRestore() {
+            if (origOverflow === undefined) return;
+            $('body').css('overflow', origOverflow);
+            origOverflow = undefined;
+          }
+          editorEl.on('mouseenter', bodyScrollSuspend);
+          editorEl.on('mouseleave', bodyScrollRestore);
+          editor.onDidFocusEditorWidget(bodyScrollSuspend);
+          editor.onDidBlurEditorWidget(bodyScrollRestore);
+
+          $scope.$on('$destroy', function () {
+            bodyScrollRestore();
+            if (editor) editor.dispose();
+          });
+        });
+      }
+    };
+  });
+
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/html/bin/add-zip-regex.php b/civicrm/ext/afform/html/bin/add-zip-regex.php
new file mode 100755
index 0000000000000000000000000000000000000000..3ec29eb4acafdd51b5e941675d649379ca8c61ed
--- /dev/null
+++ b/civicrm/ext/afform/html/bin/add-zip-regex.php
@@ -0,0 +1,37 @@
+#!/usr/bin/php
+<?php
+
+## This script allows you to add to a ZIP file -- while filtering the filename.
+## For example, suppose you want to inject a prefix to put everything in a subdir;
+## match the start of the name (^) and put in the new sub dir:
+##
+## find -type f | add-zip-regex.php myfile.zip :^: 'the-new-sub-dir/'
+
+if (PHP_SAPI !== 'cli') {
+  die("This tool can only be run from command line.");
+}
+
+if (empty($argv[1]) || empty($argv[2])) {
+  die(sprintf("usage: cat files.txt | %s <zipfile> <old-prefix> <new-prefix>\n", $argv[0]));
+}
+
+$zip = new ZipArchive();
+$zip->open($argv[1], ZipArchive::CREATE);
+$zip->addEmptyDir($argv[3]);
+
+$files = explode("\n", file_get_contents('php://stdin'));
+foreach ($files as $file) {
+  if (empty($file)) {
+    continue;
+  }
+  $file = preg_replace(':^\./:', '', $file);
+  $internalName = preg_replace($argv[2], $argv[3], $file);
+  if (file_exists($file) && is_dir($file)) {
+    $zip->addEmptyDir($internalName);
+  }
+  else {
+    $zip->addFile($file, $internalName);
+  }
+}
+
+$zip->close();
diff --git a/civicrm/ext/afform/html/bin/setup.sh b/civicrm/ext/afform/html/bin/setup.sh
new file mode 100755
index 0000000000000000000000000000000000000000..ed1e89b4d4ee59ae59f1e7bfaececac26858c436
--- /dev/null
+++ b/civicrm/ext/afform/html/bin/setup.sh
@@ -0,0 +1,105 @@
+#!/usr/bin/env bash
+set -e
+
+EXTROOT=$(cd `dirname $0`/..; pwd)
+EXTKEY="org.civicrm.afform-html"
+
+##############################
+function do_help() {
+  echo "usage: $0 [options]"
+  echo "example: $0"
+  echo "  -h     (Help)           Show this help screen"
+  echo "  -D     (Download)       Download dependencies"
+  echo "  -z     (Zip)            Build installable ZIP file"
+}
+
+##############################
+function use_civiroot() {
+  if [ -z "$CIVIROOT" ]; then
+    CIVIROOT=$(cv ev 'echo $GLOBALS["civicrm_root"];')
+    if [ -z "$CIVIROOT" -o ! -d "$CIVIROOT" ]; then
+      do_help
+      echo ""
+      echo "ERROR: invalid civicrm-dir: [$CIVIROOT]"
+      exit
+    fi
+  fi
+}
+
+##############################
+function cleanup() {
+  use_civiroot
+  ## No DAOs or XML build to cleanup
+}
+
+##############################
+function do_download() {
+  pushd "$EXTROOT" >> /dev/null
+    npm install
+  popd >> /dev/null
+}
+
+##############################
+## Build installable ZIP file
+function do_zipfile() {
+  local canary="$EXTROOT/node_modules/monaco-editor/package.json"
+  if [ ! -f "$canary" ]; then
+    echo "Error: File $canary missing. Are you sure the build is ready?"
+    exit 1
+  fi
+
+  local zipfile="$EXTROOT/build/$EXTKEY.zip"
+  [ -f "$zipfile" ] && rm -f "$zipfile"
+  [ ! -d "$EXTROOT/build" ] && mkdir "$EXTROOT/build"
+  pushd "$EXTROOT" >> /dev/null
+    ## Build a list of files to include.
+    ## Put the files into the *.zip, using a $EXTKEY as a prefix.
+    {
+       ## Get any files in the project root, except for dotfiles.
+       find . -mindepth 1 -maxdepth 1 -type f -o -type d | grep -v '^\./\.'
+       ## Get any files in the main subfolders.
+       #find CRM/ ang/ api/ bin/ css/ js/ sql/ sass/ settings/ templates/ tests/ xml/ -type f -o -type d
+       find bin/ xml/ -type f -o -type d
+       ## Get the distributable files for Monaco.
+       find node_modules/monaco-editor/LICENSE node_modules/monaco-editor/min -type f -o -type d
+    } \
+      | grep -v '~$' \
+      | php bin/add-zip-regex.php "$zipfile" ":^:" "$EXTKEY/"
+  popd >> /dev/null
+  echo "Created: $zipfile"
+}
+
+##############################
+## Main
+HAS_ACTION=
+
+while getopts "aDghz" opt; do
+  case $opt in
+    h)
+      do_help
+      HAS_ACTION=1
+      ;;
+    D)
+      do_download
+      HAS_ACTION=1
+      ;;
+    z)
+      do_zipfile
+      HAS_ACTION=1
+      ;;
+    \?)
+      do_help
+      echo "Invalid option: -$OPTARG" >&2
+      exit 1
+      ;;
+    :)
+      echo "Option -$OPTARG requires an argument." >&2
+      exit 1
+      ;;
+  esac
+done
+
+if [ -z "$HAS_ACTION" ]; then
+  do_help
+  exit 2
+fi
diff --git a/civicrm/ext/afform/html/images/screenshot.png b/civicrm/ext/afform/html/images/screenshot.png
new file mode 100644
index 0000000000000000000000000000000000000000..6765b696fa03249ac2cd605d5f0e4aa000ad6dad
Binary files /dev/null and b/civicrm/ext/afform/html/images/screenshot.png differ
diff --git a/civicrm/ext/afform/html/info.xml b/civicrm/ext/afform/html/info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fca64082a3fa0c6e24656c7270f90403770f2c1a
--- /dev/null
+++ b/civicrm/ext/afform/html/info.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<extension key="org.civicrm.afform-html" type="module">
+  <file>afform_html</file>
+  <name>Afform: HTML</name>
+  <description>Power-tool for editing Afform as HTML</description>
+  <license>AGPL-3.0</license>
+  <maintainer>
+    <author>Tim Otten</author>
+    <email>totten@civicrm.org</email>
+  </maintainer>
+  <urls>
+    <url desc="Main Extension Page">http://FIXME</url>
+    <url desc="Documentation">http://FIXME</url>
+    <url desc="Support">http://FIXME</url>
+    <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
+  </urls>
+  <releaseDate>2020-01-09</releaseDate>
+  <version>0.5</version>
+  <develStage>alpha</develStage>
+  <compatibility>
+    <ver>5.23</ver>
+  </compatibility>
+  <requires>
+    <ext>org.civicrm.afform</ext>
+  </requires>
+  <comments>Code-based form editor for CiviCRM Afforms.</comments>
+  <civix>
+    <namespace>CRM/AfformHtml</namespace>
+  </civix>
+</extension>
diff --git a/civicrm/ext/afform/html/package-lock.json b/civicrm/ext/afform/html/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..7a3ea026d20f4f168d7be6e59b13fd9c76293ee1
--- /dev/null
+++ b/civicrm/ext/afform/html/package-lock.json
@@ -0,0 +1,13 @@
+{
+  "name": "afform_html",
+  "version": "0.0.1",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "monaco-editor": {
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.16.2.tgz",
+      "integrity": "sha512-NtGrFzf54jADe7qsWh3lazhS7Kj0XHkJUGBq9fA/Jbwc+sgVcyfsYF6z2AQ7hPqDC+JmdOt/OwFjBnRwqXtx6w=="
+    }
+  }
+}
diff --git a/civicrm/ext/afform/html/package.json b/civicrm/ext/afform/html/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..d7e8a1b5cf222bbf2f54ecf23821d6153b18666b
--- /dev/null
+++ b/civicrm/ext/afform/html/package.json
@@ -0,0 +1,15 @@
+{
+  "name": "afform_html",
+  "version": "0.0.1",
+  "description": "![Screenshot](/images/screenshot.png)",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "repository": "https://github.com/totten/afform",
+  "license": "AGPL-3.0",
+  "dependencies": {
+    "monaco-editor": "^0.16.2"
+  }
+}
diff --git a/civicrm/ext/afform/mock/LICENSE.txt b/civicrm/ext/afform/mock/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d47d1d287c46ba432ce49d93f49a2ad08426df36
--- /dev/null
+++ b/civicrm/ext/afform/mock/LICENSE.txt
@@ -0,0 +1,667 @@
+Package: org.civicrm.afform-mock
+Copyright (C) 2019, Tim Otten <totten@civicrm.org>
+Licensed under the GNU Affero Public License 3.0 (below).
+
+-------------------------------------------------------------------------------
+
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/civicrm/ext/afform/mock/README.md b/civicrm/ext/afform/mock/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..52363f7221fbc0c2ecf45ea1e201fb23fa272159
--- /dev/null
+++ b/civicrm/ext/afform/mock/README.md
@@ -0,0 +1,9 @@
+# org.civicrm.afform-mock
+
+This is a dummy extension used for integration testing.
+
+```
+cd afform/mock
+cv en afform_mock
+phpunit5
+```
diff --git a/civicrm/ext/afform/mock/afform_mock.civix.php b/civicrm/ext/afform/mock/afform_mock.civix.php
new file mode 100644
index 0000000000000000000000000000000000000000..32aad3e5563d02c3fcb87e68ea1ec0744ddc6519
--- /dev/null
+++ b/civicrm/ext/afform/mock/afform_mock.civix.php
@@ -0,0 +1,477 @@
+<?php
+
+// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
+
+/**
+ * The ExtensionUtil class provides small stubs for accessing resources of this
+ * extension.
+ */
+class CRM_AfformMock_ExtensionUtil {
+  const SHORT_NAME = "afform_mock";
+  const LONG_NAME = "org.civicrm.afform-mock";
+  const CLASS_PREFIX = "CRM_AfformMock";
+
+  /**
+   * Translate a string using the extension's domain.
+   *
+   * If the extension doesn't have a specific translation
+   * for the string, fallback to the default translations.
+   *
+   * @param string $text
+   *   Canonical message text (generally en_US).
+   * @param array $params
+   * @return string
+   *   Translated text.
+   * @see ts
+   */
+  public static function ts($text, $params = []) {
+    if (!array_key_exists('domain', $params)) {
+      $params['domain'] = [self::LONG_NAME, NULL];
+    }
+    return ts($text, $params);
+  }
+
+  /**
+   * Get the URL of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo'.
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function url($file = NULL) {
+    if ($file === NULL) {
+      return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/');
+    }
+    return CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME, $file);
+  }
+
+  /**
+   * Get the path of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo'.
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function path($file = NULL) {
+    // return CRM_Core_Resources::singleton()->getPath(self::LONG_NAME, $file);
+    return __DIR__ . ($file === NULL ? '' : (DIRECTORY_SEPARATOR . $file));
+  }
+
+  /**
+   * Get the name of a class within this extension.
+   *
+   * @param string $suffix
+   *   Ex: 'Page_HelloWorld' or 'Page\\HelloWorld'.
+   * @return string
+   *   Ex: 'CRM_Foo_Page_HelloWorld'.
+   */
+  public static function findClass($suffix) {
+    return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix);
+  }
+
+}
+
+use CRM_AfformMock_ExtensionUtil as E;
+
+/**
+ * (Delegated) Implements hook_civicrm_config().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config
+ */
+function _afform_mock_civix_civicrm_config(&$config = NULL) {
+  static $configured = FALSE;
+  if ($configured) {
+    return;
+  }
+  $configured = TRUE;
+
+  $template =& CRM_Core_Smarty::singleton();
+
+  $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
+  $extDir = $extRoot . 'templates';
+
+  if (is_array($template->template_dir)) {
+    array_unshift($template->template_dir, $extDir);
+  }
+  else {
+    $template->template_dir = [$extDir, $template->template_dir];
+  }
+
+  $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
+  set_include_path($include_path);
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_xmlMenu().
+ *
+ * @param $files array(string)
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu
+ */
+function _afform_mock_civix_civicrm_xmlMenu(&$files) {
+  foreach (_afform_mock_civix_glob(__DIR__ . '/xml/Menu/*.xml') as $file) {
+    $files[] = $file;
+  }
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+ */
+function _afform_mock_civix_civicrm_install() {
+  _afform_mock_civix_civicrm_config();
+  if ($upgrader = _afform_mock_civix_upgrader()) {
+    $upgrader->onInstall();
+  }
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
+ */
+function _afform_mock_civix_civicrm_postInstall() {
+  _afform_mock_civix_civicrm_config();
+  if ($upgrader = _afform_mock_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onPostInstall'])) {
+      $upgrader->onPostInstall();
+    }
+  }
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
+ */
+function _afform_mock_civix_civicrm_uninstall() {
+  _afform_mock_civix_civicrm_config();
+  if ($upgrader = _afform_mock_civix_upgrader()) {
+    $upgrader->onUninstall();
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_enable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+ */
+function _afform_mock_civix_civicrm_enable() {
+  _afform_mock_civix_civicrm_config();
+  if ($upgrader = _afform_mock_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onEnable'])) {
+      $upgrader->onEnable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_disable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
+ * @return mixed
+ */
+function _afform_mock_civix_civicrm_disable() {
+  _afform_mock_civix_civicrm_config();
+  if ($upgrader = _afform_mock_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onDisable'])) {
+      $upgrader->onDisable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_upgrade().
+ *
+ * @param $op string, the type of operation being performed; 'check' or 'enqueue'
+ * @param $queue CRM_Queue_Queue, (for 'enqueue') the modifiable list of pending up upgrade tasks
+ *
+ * @return mixed
+ *   based on op. for 'check', returns array(boolean) (TRUE if upgrades are pending)
+ *   for 'enqueue', returns void
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade
+ */
+function _afform_mock_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  if ($upgrader = _afform_mock_civix_upgrader()) {
+    return $upgrader->onUpgrade($op, $queue);
+  }
+}
+
+/**
+ * @return CRM_AfformMock_Upgrader
+ */
+function _afform_mock_civix_upgrader() {
+  if (!file_exists(__DIR__ . '/CRM/AfformMock/Upgrader.php')) {
+    return NULL;
+  }
+  else {
+    return CRM_AfformMock_Upgrader_Base::instance();
+  }
+}
+
+/**
+ * Search directory tree for files which match a glob pattern.
+ *
+ * Note: Dot-directories (like "..", ".git", or ".svn") will be ignored.
+ * Note: In Civi 4.3+, delegate to CRM_Utils_File::findFiles()
+ *
+ * @param string $dir base dir
+ * @param string $pattern , glob pattern, eg "*.txt"
+ *
+ * @return array
+ */
+function _afform_mock_civix_find_files($dir, $pattern) {
+  if (is_callable(['CRM_Utils_File', 'findFiles'])) {
+    return CRM_Utils_File::findFiles($dir, $pattern);
+  }
+
+  $todos = [$dir];
+  $result = [];
+  while (!empty($todos)) {
+    $subdir = array_shift($todos);
+    foreach (_afform_mock_civix_glob("$subdir/$pattern") as $match) {
+      if (!is_dir($match)) {
+        $result[] = $match;
+      }
+    }
+    if ($dh = opendir($subdir)) {
+      while (FALSE !== ($entry = readdir($dh))) {
+        $path = $subdir . DIRECTORY_SEPARATOR . $entry;
+        if ($entry[0] == '.') {
+        }
+        elseif (is_dir($path)) {
+          $todos[] = $path;
+        }
+      }
+      closedir($dh);
+    }
+  }
+  return $result;
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_managed().
+ *
+ * Find any *.mgd.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed
+ */
+function _afform_mock_civix_civicrm_managed(&$entities) {
+  $mgdFiles = _afform_mock_civix_find_files(__DIR__, '*.mgd.php');
+  sort($mgdFiles);
+  foreach ($mgdFiles as $file) {
+    $es = include $file;
+    foreach ($es as $e) {
+      if (empty($e['module'])) {
+        $e['module'] = E::LONG_NAME;
+      }
+      if (empty($e['params']['version'])) {
+        $e['params']['version'] = '3';
+      }
+      $entities[] = $e;
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_caseTypes().
+ *
+ * Find any and return any files matching "xml/case/*.xml"
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes
+ */
+function _afform_mock_civix_civicrm_caseTypes(&$caseTypes) {
+  if (!is_dir(__DIR__ . '/xml/case')) {
+    return;
+  }
+
+  foreach (_afform_mock_civix_glob(__DIR__ . '/xml/case/*.xml') as $file) {
+    $name = preg_replace('/\.xml$/', '', basename($file));
+    if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) {
+      $errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name));
+      throw new CRM_Core_Exception($errorMessage);
+    }
+    $caseTypes[$name] = [
+      'module' => E::LONG_NAME,
+      'name' => $name,
+      'file' => $file,
+    ];
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_angularModules().
+ *
+ * Find any and return any files matching "ang/*.ang.php"
+ *
+ * Note: This hook only runs in CiviCRM 4.5+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules
+ */
+function _afform_mock_civix_civicrm_angularModules(&$angularModules) {
+  if (!is_dir(__DIR__ . '/ang')) {
+    return;
+  }
+
+  $files = _afform_mock_civix_glob(__DIR__ . '/ang/*.ang.php');
+  foreach ($files as $file) {
+    $name = preg_replace(':\.ang\.php$:', '', basename($file));
+    $module = include $file;
+    if (empty($module['ext'])) {
+      $module['ext'] = E::LONG_NAME;
+    }
+    $angularModules[$name] = $module;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_themes().
+ *
+ * Find any and return any files matching "*.theme.php"
+ */
+function _afform_mock_civix_civicrm_themes(&$themes) {
+  $files = _afform_mock_civix_glob(__DIR__ . '/*.theme.php');
+  foreach ($files as $file) {
+    $themeMeta = include $file;
+    if (empty($themeMeta['name'])) {
+      $themeMeta['name'] = preg_replace(':\.theme\.php$:', '', basename($file));
+    }
+    if (empty($themeMeta['ext'])) {
+      $themeMeta['ext'] = E::LONG_NAME;
+    }
+    $themes[$themeMeta['name']] = $themeMeta;
+  }
+}
+
+/**
+ * Glob wrapper which is guaranteed to return an array.
+ *
+ * The documentation for glob() says, "On some systems it is impossible to
+ * distinguish between empty match and an error." Anecdotally, the return
+ * result for an empty match is sometimes array() and sometimes FALSE.
+ * This wrapper provides consistency.
+ *
+ * @link http://php.net/glob
+ * @param string $pattern
+ *
+ * @return array
+ */
+function _afform_mock_civix_glob($pattern) {
+  $result = glob($pattern);
+  return is_array($result) ? $result : [];
+}
+
+/**
+ * Inserts a navigation menu item at a given place in the hierarchy.
+ *
+ * @param array $menu - menu hierarchy
+ * @param string $path - path to parent of this item, e.g. 'my_extension/submenu'
+ *    'Mailing', or 'Administer/System Settings'
+ * @param array $item - the item to insert (parent/child attributes will be
+ *    filled for you)
+ *
+ * @return bool
+ */
+function _afform_mock_civix_insert_navigation_menu(&$menu, $path, $item) {
+  // If we are done going down the path, insert menu
+  if (empty($path)) {
+    $menu[] = [
+      'attributes' => array_merge([
+        'label'      => CRM_Utils_Array::value('name', $item),
+        'active'     => 1,
+      ], $item),
+    ];
+    return TRUE;
+  }
+  else {
+    // Find an recurse into the next level down
+    $found = FALSE;
+    $path = explode('/', $path);
+    $first = array_shift($path);
+    foreach ($menu as $key => &$entry) {
+      if ($entry['attributes']['name'] == $first) {
+        if (!isset($entry['child'])) {
+          $entry['child'] = [];
+        }
+        $found = _afform_mock_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item);
+      }
+    }
+    return $found;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_navigationMenu().
+ */
+function _afform_mock_civix_navigationMenu(&$nodes) {
+  if (!is_callable(['CRM_Core_BAO_Navigation', 'fixNavigationMenu'])) {
+    _afform_mock_civix_fixNavigationMenu($nodes);
+  }
+}
+
+/**
+ * Given a navigation menu, generate navIDs for any items which are
+ * missing them.
+ */
+function _afform_mock_civix_fixNavigationMenu(&$nodes) {
+  $maxNavID = 1;
+  array_walk_recursive($nodes, function($item, $key) use (&$maxNavID) {
+    if ($key === 'navID') {
+      $maxNavID = max($maxNavID, $item);
+    }
+  });
+  _afform_mock_civix_fixNavigationMenuItems($nodes, $maxNavID, NULL);
+}
+
+function _afform_mock_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $parentID) {
+  $origKeys = array_keys($nodes);
+  foreach ($origKeys as $origKey) {
+    if (!isset($nodes[$origKey]['attributes']['parentID']) && $parentID !== NULL) {
+      $nodes[$origKey]['attributes']['parentID'] = $parentID;
+    }
+    // If no navID, then assign navID and fix key.
+    if (!isset($nodes[$origKey]['attributes']['navID'])) {
+      $newKey = ++$maxNavID;
+      $nodes[$origKey]['attributes']['navID'] = $newKey;
+      $nodes[$newKey] = $nodes[$origKey];
+      unset($nodes[$origKey]);
+      $origKey = $newKey;
+    }
+    if (isset($nodes[$origKey]['child']) && is_array($nodes[$origKey]['child'])) {
+      _afform_mock_civix_fixNavigationMenuItems($nodes[$origKey]['child'], $maxNavID, $nodes[$origKey]['attributes']['navID']);
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders
+ */
+function _afform_mock_civix_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  $settingsDir = __DIR__ . DIRECTORY_SEPARATOR . 'settings';
+  if (!in_array($settingsDir, $metaDataFolders) && is_dir($settingsDir)) {
+    $metaDataFolders[] = $settingsDir;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_entityTypes().
+ *
+ * Find any *.entityType.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes
+ */
+function _afform_mock_civix_civicrm_entityTypes(&$entityTypes) {
+  $entityTypes = array_merge($entityTypes, []);
+}
diff --git a/civicrm/ext/afform/mock/afform_mock.php b/civicrm/ext/afform/mock/afform_mock.php
new file mode 100644
index 0000000000000000000000000000000000000000..578aed00f9c9ec5d958793b1d1c9077b66edd3b9
--- /dev/null
+++ b/civicrm/ext/afform/mock/afform_mock.php
@@ -0,0 +1,142 @@
+<?php
+
+require_once 'afform_mock.civix.php';
+use CRM_AfformMock_ExtensionUtil as E;
+
+/**
+ * Implements hook_civicrm_config().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_config
+ */
+function afform_mock_civicrm_config(&$config) {
+  _afform_mock_civix_civicrm_config($config);
+}
+
+/**
+ * Implements hook_civicrm_xmlMenu().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_xmlMenu
+ */
+function afform_mock_civicrm_xmlMenu(&$files) {
+  _afform_mock_civix_civicrm_xmlMenu($files);
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_install
+ */
+function afform_mock_civicrm_install() {
+  _afform_mock_civix_civicrm_install();
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_postInstall
+ */
+function afform_mock_civicrm_postInstall() {
+  _afform_mock_civix_civicrm_postInstall();
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_uninstall
+ */
+function afform_mock_civicrm_uninstall() {
+  _afform_mock_civix_civicrm_uninstall();
+}
+
+/**
+ * Implements hook_civicrm_enable().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_enable
+ */
+function afform_mock_civicrm_enable() {
+  _afform_mock_civix_civicrm_enable();
+}
+
+/**
+ * Implements hook_civicrm_disable().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_disable
+ */
+function afform_mock_civicrm_disable() {
+  _afform_mock_civix_civicrm_disable();
+}
+
+/**
+ * Implements hook_civicrm_upgrade().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_upgrade
+ */
+function afform_mock_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  return _afform_mock_civix_civicrm_upgrade($op, $queue);
+}
+
+/**
+ * Implements hook_civicrm_managed().
+ *
+ * Generate a list of entities to create/deactivate/delete when this module
+ * is installed, disabled, uninstalled.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_managed
+ */
+function afform_mock_civicrm_managed(&$entities) {
+  _afform_mock_civix_civicrm_managed($entities);
+}
+
+/**
+ * Implements hook_civicrm_caseTypes().
+ *
+ * Generate a list of case-types.
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_caseTypes
+ */
+function afform_mock_civicrm_caseTypes(&$caseTypes) {
+  _afform_mock_civix_civicrm_caseTypes($caseTypes);
+}
+
+/**
+ * Implements hook_civicrm_angularModules().
+ *
+ * Generate a list of Angular modules.
+ *
+ * Note: This hook only runs in CiviCRM 4.5+. It may
+ * use features only available in v4.6+.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_angularModules
+ */
+function afform_mock_civicrm_angularModules(&$angularModules) {
+  _afform_mock_civix_civicrm_angularModules($angularModules);
+}
+
+/**
+ * Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_alterSettingsFolders
+ */
+function afform_mock_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  _afform_mock_civix_civicrm_alterSettingsFolders($metaDataFolders);
+}
+
+/**
+ * Implements hook_civicrm_entityTypes().
+ *
+ * Declare entity types provided by this module.
+ *
+ * @link http://wiki.civicrm.org/confluence/display/CRMDOC/hook_civicrm_entityTypes
+ */
+function afform_mock_civicrm_entityTypes(&$entityTypes) {
+  _afform_mock_civix_civicrm_entityTypes($entityTypes);
+}
+
+/**
+ * Implements hook_civicrm_themes().
+ */
+function afform_mock_civicrm_themes(&$themes) {
+  _afform_mock_civix_civicrm_themes($themes);
+}
diff --git a/civicrm/ext/afform/mock/ang/afex.aff.html b/civicrm/ext/afform/mock/ang/afex.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..1cc0a26dbd5941f10cab34664e146ea92671e7d5
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/afex.aff.html
@@ -0,0 +1,32 @@
+<af-form ctrl="modelListCtrl">
+  <!-- FIXME: Distinguish "Individual"s from "Household"s -->
+  <af-entity type="Contact" name="parent" label="Parent" api4-params="{where: ['id','=', routeParams.cid]}" />
+  <af-entity type="Contact" name="spouse" label="Spouse" contact-relationship="['Spouse of', 'parent']" />
+  <af-entity type="Contact" name="home" label="Home" />
+
+  <!-- "parent" and "spouse" should be exported as variables in this scope -->
+
+  <div af-fieldset="parent">
+    <af-block-contact-name label="My Name" />
+    <af-block-contact-email label="My Email" />
+    <af-field name="do_not_email" />
+  </div>
+
+  <div af-fieldset="spouse">
+    <af-block-contact-name label="Spouse Name" />
+    <af-block-contact-email label="Spouse Email" only-primary="true" />
+    <af-field name="do_not_email" defn="{type: 'checkbox', default: 1}" />
+  </div>
+
+  <div af-fieldset="home">
+    <af-block-contact-name label="Home Name" />
+  </div>
+
+  <div af-fieldset="parent">
+    <af-block-contact-address label="My Address" />
+  </div>
+
+  <!-- General elements: FIELDSET, UL, BUTTON, P, H1 should work anywhere -->
+  <button ng-click="modelListCtrl.submit()">Submit</button>
+
+</af-form>
diff --git a/civicrm/ext/afform/mock/ang/afex.aff.json b/civicrm/ext/afform/mock/ang/afex.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..e0dc03664d14394649fcda695fe922a1cbbe258a
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/afex.aff.json
@@ -0,0 +1,4 @@
+{
+  "server_route": "civicrm/afex",
+  "requires":["mockFoo", "mockBareFile", "af"]
+}
diff --git a/civicrm/ext/afform/mock/ang/mock-weird-name.aff.html b/civicrm/ext/afform/mock/ang/mock-weird-name.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..a7c626d6d5b55f6d2171d7ec1f9f677d5c7abc56
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mock-weird-name.aff.html
@@ -0,0 +1 @@
+<em>This is just an HTML file with a weird name.</em>
diff --git a/civicrm/ext/afform/mock/ang/mock-weird-name.aff.json b/civicrm/ext/afform/mock/ang/mock-weird-name.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..f047ea604f7072128f3e779b54271508ccf2ab51
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mock-weird-name.aff.json
@@ -0,0 +1,3 @@
+{
+  "title": "Weird Name"
+}
diff --git a/civicrm/ext/afform/mock/ang/mockBareFile.aff.html b/civicrm/ext/afform/mock/ang/mockBareFile.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..15827e4aeaf21222eb7596c815be476bda1d8ba3
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mockBareFile.aff.html
@@ -0,0 +1 @@
+<em>This is just an HTML file without any metadata.</em>
diff --git a/civicrm/ext/afform/mock/ang/mockBespoke.ang.php b/civicrm/ext/afform/mock/ang/mockBespoke.ang.php
new file mode 100644
index 0000000000000000000000000000000000000000..467b5894df5f1544e8cf5663386bf11bbfdfdf01
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mockBespoke.ang.php
@@ -0,0 +1,27 @@
+<?php
+// This file declares an Angular module which can be autoloaded
+// in CiviCRM. See also:
+// \https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules/n
+return [
+  'js' =>
+    [
+      0 => 'ang/mockBespoke.js',
+      1 => 'ang/mockBespoke/*.js',
+      2 => 'ang/mockBespoke/*/*.js',
+    ],
+  'css' =>
+    [
+      0 => 'ang/mockBespoke.css',
+    ],
+  'partials' =>
+    [
+      0 => 'ang/mockBespoke',
+    ],
+  'requires' =>
+    [
+      0 => 'crmUi',
+      1 => 'crmUtil',
+      2 => 'ngRoute',
+    ],
+  'settings' => [],
+];
diff --git a/civicrm/ext/afform/mock/ang/mockBespoke.css b/civicrm/ext/afform/mock/ang/mockBespoke.css
new file mode 100644
index 0000000000000000000000000000000000000000..3e347a353378faf5345e73feabc7d0b9cd5e1cce
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mockBespoke.css
@@ -0,0 +1 @@
+/* Add any CSS rules for Angular module "mockBespoke" */
diff --git a/civicrm/ext/afform/mock/ang/mockBespoke.js b/civicrm/ext/afform/mock/ang/mockBespoke.js
new file mode 100644
index 0000000000000000000000000000000000000000..9eaf76640f30d4266c02d73ea103142fa05177a2
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mockBespoke.js
@@ -0,0 +1,4 @@
+(function(angular, $, _) {
+  // Declare a list of dependencies.
+  angular.module('mockBespoke', CRM.angRequires('mockBespoke'));
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/afform/mock/ang/mockFoo.aff.html b/civicrm/ext/afform/mock/ang/mockFoo.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..0c4807bcc347959e36b83d95c234808ba5a08748
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mockFoo.aff.html
@@ -0,0 +1 @@
+<em>the foo bar stuff</em>
diff --git a/civicrm/ext/afform/mock/ang/mockFoo.aff.json b/civicrm/ext/afform/mock/ang/mockFoo.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..0967ef424bce6791893e9a57bb952f80fd536e93
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mockFoo.aff.json
@@ -0,0 +1 @@
+{}
diff --git a/civicrm/ext/afform/mock/ang/mockPage.aff.html b/civicrm/ext/afform/mock/ang/mockPage.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..d3300ca8b7dd50bae1ea55d186f7e9559b6ac625
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mockPage.aff.html
@@ -0,0 +1,3 @@
+<div>Hello {{routeParams.name}}.</div>
+<div>The foo says "<span mock-foo/>".</div>
+<div>The bare file says "<span mock-bare-file/>"</div>
diff --git a/civicrm/ext/afform/mock/ang/mockPage.aff.json b/civicrm/ext/afform/mock/ang/mockPage.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..2bdf31cc781f78408650f25c760ef65c26989073
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/mockPage.aff.json
@@ -0,0 +1 @@
+{"server_route": "civicrm/mock-page", "requires":["mockBespoke"], "permission": "access Foobar" }
diff --git a/civicrm/ext/afform/mock/ang/testAfform.aff.html b/civicrm/ext/afform/mock/ang/testAfform.aff.html
new file mode 100644
index 0000000000000000000000000000000000000000..3a105a319043bd217db39337a70594b31cee89fa
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/testAfform.aff.html
@@ -0,0 +1,31 @@
+<af-form ctrl="modelListCtrl" >
+  <div crm-ui-debug="modelListCtrl.getEntity('parent')" />
+  <div crm-ui-debug="modelListCtrl.getData('parent')" />
+  <af-entity type="Contact" data="{contact_type: 'Individual'}" name="parent" label="Parent" url-autofill="1" autofill="user" />
+  <af-entity type="Contact" data="{contact_type: 'Individual'}" name="spouse" label="Spouse" contact-relationship="['Spouse of', 'parent']" />
+
+  <fieldset af-fieldset="parent">
+    <legend class="af-text">About You</legend>
+
+    <div class="af-container af-layout-inline">
+      <af-field name="first_name" />
+      <af-field name="last_name" />
+    </div>
+    <af-field name="gender_id" defn="{options: [{key: 1, label: 'Girl'}, {key: 2, label: 'Boy'}, {key: 3, label: 'Other'}]}"/>
+    <af-field name="constituent_information.Marital_Status" />
+    <af-field name="constituent_information.Marriage_Date" />
+    <af-field name="constituent_information.Most_Important_Issue" />
+  </fieldset>
+
+  <div af-fieldset="spouse" ng-if="modelListCtrl.getData('parent')['constituent_information.Marital_Status'] == 'M'">
+    <h3 class="af-text text-center">About Your Spouse</h3>
+    <p class="af-text">Only visible if you are married.</p>
+    <af-field name="first_name" defn='{title: ts("Spouse First Name")}' />
+    <af-field name="last_name" defn='{title: ts("Spouse Last Name")}' />
+    <af-field name="do_not_email" />
+  </div>
+
+  <!-- General elements: FIELDSET, UL, BUTTON, P, H1 should work anywhere -->
+  <button class="af-button btn btn-primary" crm-icon="fa-check" ng-click="modelListCtrl.submit()">Submit</button>
+
+</af-form>
diff --git a/civicrm/ext/afform/mock/ang/testAfform.aff.json b/civicrm/ext/afform/mock/ang/testAfform.aff.json
new file mode 100644
index 0000000000000000000000000000000000000000..6c8684eee761f6dd35620c8d58f50ffaee14ff74
--- /dev/null
+++ b/civicrm/ext/afform/mock/ang/testAfform.aff.json
@@ -0,0 +1,4 @@
+{
+  "server_route": "civicrm/test-afform",
+  "title": "This is a test"
+}
diff --git a/civicrm/ext/afform/mock/info.xml b/civicrm/ext/afform/mock/info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7fefe5b47e539dcf1aa3de7e07d895b15b87eb10
--- /dev/null
+++ b/civicrm/ext/afform/mock/info.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<extension key="org.civicrm.afform-mock" type="module">
+  <file>afform_mock</file>
+  <name>Afform: Mocks</name>
+  <description>Mock extension used for testing the framework</description>
+  <license>AGPL-3.0</license>
+  <maintainer>
+    <author>Tim Otten</author>
+    <email>totten@civicrm.org</email>
+  </maintainer>
+  <urls>
+    <url desc="Main Extension Page">http://FIXME</url>
+    <url desc="Documentation">http://FIXME</url>
+    <url desc="Support">http://FIXME</url>
+    <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
+  </urls>
+  <releaseDate>2020-01-09</releaseDate>
+  <version>0.5</version>
+  <develStage>alpha</develStage>
+  <compatibility>
+    <ver>5.23</ver>
+  </compatibility>
+  <requires>
+    <ext>org.civicrm.afform</ext>
+  </requires>
+  <comments>Examples and tests for CiviCRM Afforms.</comments>
+  <civix>
+    <namespace>CRM/AfformMock</namespace>
+  </civix>
+</extension>
diff --git a/civicrm/ext/afform/mock/phpunit.xml.dist b/civicrm/ext/afform/mock/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..0f9f25d307a9cd62aa26edb1928ddf2de81d249a
--- /dev/null
+++ b/civicrm/ext/afform/mock/phpunit.xml.dist
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="false" bootstrap="tests/phpunit/bootstrap.php">
+  <testsuites>
+    <testsuite name="My Test Suite">
+      <directory>./tests/phpunit</directory>
+    </testsuite>
+  </testsuites>
+  <filter>
+    <whitelist>
+      <directory suffix=".php">./</directory>
+    </whitelist>
+  </filter>
+  <listeners>
+    <listener class="Civi\Test\CiviTestListener">
+      <arguments/>
+    </listener>
+  </listeners>
+</phpunit>
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformPaletteTest.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformPaletteTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f2ec858779e1f9ec956bdaedb47feb53b301d11
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformPaletteTest.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * AfformPalette API Test
+ * @group headless
+ */
+class api_v4_AfformPaletteTest extends api_v4_AfformTestCase {
+
+  public function testGetPalette() {
+    $r = Civi\Api4\AfformPalette::get()
+      ->addWhere('id', '=', 'Parent:afl-name')
+      ->execute();
+    $this->assertEquals(1, $r->count());
+
+    $r = Civi\Api4\AfformPalette::get()
+      ->setLimit(10)
+      ->execute();
+    $this->assertTrue($r->count() > 1);
+  }
+
+}
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformRoutingTest.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformRoutingTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3fd74d34e1f81aa4edc2df96b35270e9400b6992
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformRoutingTest.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * Ensure that the routes created by Afform are working.
+ * @group e2e
+ */
+class api_v4_AfformRoutingTest extends \PHPUnit\Framework\TestCase implements \Civi\Test\EndToEndInterface {
+
+  protected $formName = 'mockPage';
+
+  public static function setUpBeforeClass() {
+    \Civi\Test::e2e()
+      ->install(['org.civicrm.afform', 'org.civicrm.afform-mock'])
+      ->apply();
+  }
+
+  public function setUp() {
+    parent::setUp();
+    Civi\Api4\Afform::revert()
+      ->setCheckPermissions(FALSE)
+      ->addWhere('name', '=', $this->formName)
+      ->execute();
+  }
+
+  public function tearDown() {
+    parent::tearDown();
+    Civi\Api4\Afform::revert()
+      ->setCheckPermissions(FALSE)
+      ->addWhere('name', '=', $this->formName)
+      ->execute();
+  }
+
+  public function testChangingPermissions() {
+    $http = new \GuzzleHttp\Client(['http_errors' => FALSE]);
+    $url = function ($path, $query = NULL) {
+      return CRM_Utils_System::url($path, $query, TRUE, NULL, FALSE);
+    };
+
+    $result = $http->get($url('civicrm/mock-page'));
+    $this->assertNotAuthorized($result);
+
+    Civi\Api4\Afform::update()
+      ->setCheckPermissions(FALSE)
+      ->addWhere('name', '=', $this->formName)
+      ->addValue('permission', CRM_Core_Permission::ALWAYS_ALLOW_PERMISSION)
+      ->execute();
+
+    $result = $http->get($url('civicrm/mock-page'));
+    $this->assertOpensPage($result, 'mock-page');
+  }
+
+  public function testChangingPath() {
+    $http = new \GuzzleHttp\Client(['http_errors' => FALSE]);
+    $url = function ($path, $query = NULL) {
+      return CRM_Utils_System::url($path, $query, TRUE, NULL, FALSE);
+    };
+
+    Civi\Api4\Afform::update()
+      ->setCheckPermissions(FALSE)
+      ->addWhere('name', '=', $this->formName)
+      ->addValue('permission', CRM_Core_Permission::ALWAYS_ALLOW_PERMISSION)
+      ->execute();
+
+    $this->assertOpensPage($http->get($url('civicrm/mock-page')), 'mock-page');
+    $this->assertNotAuthorized($http->get($url('civicrm/mock-page-renamed')));
+
+    Civi\Api4\Afform::update()
+      ->setCheckPermissions(FALSE)
+      ->addWhere('name', '=', $this->formName)
+      ->addValue('server_route', 'civicrm/mock-page-renamed')
+      ->execute();
+
+    $this->assertNotAuthorized($http->get($url('civicrm/mock-page')));
+    $this->assertOpensPage($http->get($url('civicrm/mock-page-renamed')), 'mock-page');
+  }
+
+  /**
+   * @param $result
+   */
+  private function assertNotAuthorized(Psr\Http\Message\ResponseInterface $result) {
+    $contents = $result->getBody()->getContents();
+    $this->assertEquals(403, $result->getStatusCode());
+    $this->assertRegExp(';You are not authorized to access;', $contents);
+    $this->assertNotRegExp(';afform":\{"open":".*"\};', $contents);
+  }
+
+  /**
+   * @param $result
+   * @param string $directive
+   *   The name of the directive which auto-opens.
+   */
+  private function assertOpensPage(Psr\Http\Message\ResponseInterface $result, $directive) {
+    $contents = $result->getBody()->getContents();
+    $this->assertEquals(200, $result->getStatusCode());
+    $this->assertNotRegExp(';You are not authorized to access;', $contents);
+    $this->assertRegExp(';afform":\{"open":"' . preg_quote($directive, ';') . '"\};', $contents);
+  }
+
+}
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformTest.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..19de132180d31787e8d7980da7e8bb8a65eedd75
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformTest.php
@@ -0,0 +1,242 @@
+<?php
+
+/**
+ * Afform.Get API Test Case
+ * This is a generic test class implemented with PHPUnit.
+ * @group headless
+ */
+class api_v4_AfformTest extends api_v4_AfformTestCase {
+  use \Civi\Test\Api3TestTrait;
+  use \Civi\Test\ContactTestTrait;
+
+  /**
+   * DOMDocument outputs some tags a little different than they were input.
+   * It's not really a problem but can trip up tests.
+   *
+   * @param array|string $markup
+   * @return array|string
+   */
+  private function fudgeMarkup($markup) {
+    if (is_array($markup)) {
+      foreach ($markup as $idx => $item) {
+        $markup[$idx] = $this->fudgeMarkup($item);
+      }
+      return $markup;
+    }
+    else {
+      return str_replace([' />', '/>'], ['/>', ' />'], $markup);
+    }
+  }
+
+  public function getBasicDirectives() {
+    return [
+      ['mockPage', ['title' => '', 'description' => '', 'server_route' => 'civicrm/mock-page', 'permission' => 'access Foobar']],
+      ['mockBareFile', ['title' => '', 'description' => '', 'permission' => 'access CiviCRM']],
+      ['mockFoo', ['title' => '', 'description' => '', 'permission' => 'access CiviCRM']],
+      ['mock-weird-name', ['title' => 'Weird Name', 'description' => '', 'permission' => 'access CiviCRM']],
+    ];
+  }
+
+  /**
+   * This takes the bundled `example-page` and performs some API calls on it.
+   *
+   * @param string $formName
+   *   The symbolic name of the form.
+   * @param array $originalMetadata
+   * @dataProvider getBasicDirectives
+   */
+  public function testGetUpdateRevert($formName, $originalMetadata) {
+    $get = function($arr, $key) {
+      return isset($arr[$key]) ? $arr[$key] : NULL;
+    };
+
+    Civi\Api4\Afform::revert()->addWhere('name', '=', $formName)->execute();
+
+    $message = 'The initial Afform.get should return default data';
+    $result = Civi\Api4\Afform::get()->addWhere('name', '=', $formName)->execute();
+    $this->assertEquals($formName, $result[0]['name'], $message);
+    $this->assertEquals($get($originalMetadata, 'title'), $get($result[0], 'title'), $message);
+    $this->assertEquals($get($originalMetadata, 'description'), $get($result[0], 'description'), $message);
+    $this->assertEquals($get($originalMetadata, 'server_route'), $get($result[0], 'server_route'), $message);
+    $this->assertEquals($get($originalMetadata, 'permission'), $get($result[0], 'permission'), $message);
+    $this->assertTrue(is_array($result[0]['layout']), $message);
+    $this->assertEquals(TRUE, $get($result[0], 'has_base'), $message);
+    $this->assertEquals(FALSE, $get($result[0], 'has_local'), $message);
+
+    $message = 'After updating with Afform.create, the revised data should be returned';
+    $result = Civi\Api4\Afform::update()
+      ->addWhere('name', '=', $formName)
+      ->addValue('description', 'The temporary description')
+      ->addValue('permission', 'access foo')
+      ->execute();
+    $this->assertEquals($formName, $result[0]['name'], $message);
+    $this->assertEquals('The temporary description', $result[0]['description'], $message);
+
+    $message = 'After updating, the Afform.get API should return blended data';
+    $result = Civi\Api4\Afform::get()->addWhere('name', '=', $formName)->execute();
+    $this->assertEquals($formName, $result[0]['name'], $message);
+    $this->assertEquals($get($originalMetadata, 'title'), $get($result[0], 'title'), $message);
+    $this->assertEquals('The temporary description', $get($result[0], 'description'), $message);
+    $this->assertEquals($get($originalMetadata, 'server_route'), $get($result[0], 'server_route'), $message);
+    $this->assertEquals('access foo', $get($result[0], 'permission'), $message);
+    $this->assertTrue(is_array($result[0]['layout']), $message);
+    $this->assertEquals(TRUE, $get($result[0], 'has_base'), $message);
+    $this->assertEquals(TRUE, $get($result[0], 'has_local'), $message);
+
+    Civi\Api4\Afform::revert()->addWhere('name', '=', $formName)->execute();
+    $message = 'After reverting, the final Afform.get should return default data';
+    $result = Civi\Api4\Afform::get()->addWhere('name', '=', $formName)->execute();
+    $this->assertEquals($formName, $result[0]['name'], $message);
+    $this->assertEquals($get($originalMetadata, 'title'), $get($result[0], 'title'), $message);
+    $this->assertEquals($get($originalMetadata, 'description'), $get($result[0], 'description'), $message);
+    $this->assertEquals($get($originalMetadata, 'server_route'), $get($result[0], 'server_route'), $message);
+    $this->assertEquals($get($originalMetadata, 'permission'), $get($result[0], 'permission'), $message);
+    $this->assertTrue(is_array($result[0]['layout']), $message);
+    $this->assertEquals(TRUE, $get($result[0], 'has_base'), $message);
+    $this->assertEquals(FALSE, $get($result[0], 'has_local'), $message);
+  }
+
+  public function getFormatExamples() {
+    $ex = [];
+    $formats = ['html', 'shallow', 'deep'];
+    foreach (glob(__DIR__ . '/formatExamples/*.php') as $exampleFile) {
+      $example = require $exampleFile;
+      if (isset($example['deep'])) {
+        foreach ($formats as $updateFormat) {
+          foreach ($formats as $readFormat) {
+            $ex[] = ['mockBareFile', $updateFormat, $example[$updateFormat], $readFormat, $example[$readFormat], $exampleFile];
+          }
+        }
+      }
+    }
+    return $ex;
+  }
+
+  /**
+   * In this test, we update the layout and in one format and then read it back
+   * in another format.
+   *
+   * @param string $formName
+   *   The symbolic name of the form.
+   * @param string $updateFormat
+   *   The format with which to write the data.
+   *   'html' or 'array'
+   * @param mixed $updateLayout
+   *   The new value to set
+   * @param string $readFormat
+   *   The format with which to read the data.
+   *   'html' or 'array'
+   * @param mixed $readLayout
+   *   The value that we expect to read.
+   * @param string $exampleName
+   *   (For debug messages) A symbolic name of the example data-set being tested.
+   * @dataProvider getFormatExamples
+   */
+  public function testUpdateAndGetFormat($formName, $updateFormat, $updateLayout, $readFormat, $readLayout, $exampleName) {
+    Civi\Api4\Afform::revert()->addWhere('name', '=', $formName)->execute();
+
+    Civi\Api4\Afform::update()
+      ->addWhere('name', '=', $formName)
+      ->setLayoutFormat($updateFormat)
+      ->setValues(['layout' => $updateLayout])
+      ->execute();
+
+    $result = Civi\Api4\Afform::get()
+      ->addWhere('name', '=', $formName)
+      ->setLayoutFormat($readFormat)
+      ->execute();
+
+    $this->assertEquals($readLayout, $this->fudgeMarkup($result[0]['layout']), "Based on \"$exampleName\", writing content as \"$updateFormat\" and reading back as \"$readFormat\".");
+
+    Civi\Api4\Afform::revert()->addWhere('name', '=', $formName)->execute();
+  }
+
+  public function getWhitespaceExamples() {
+    $ex = [];
+    foreach (glob(__DIR__ . '/formatExamples/*.php') as $exampleFile) {
+      $example = require $exampleFile;
+      if (isset($example['pretty'])) {
+        $ex[] = ['mockBareFile', $example, $exampleFile];
+      }
+    }
+    return $ex;
+  }
+
+  /**
+   * This tests that a non-pretty html string will have its whitespace stripped & reformatted
+   * when using the "formatWhitespace" option.
+   *
+   * @dataProvider getWhitespaceExamples
+   */
+  public function testWhitespaceFormat($directiveName, $example, $exampleName) {
+    Civi\Api4\Afform::save()
+      ->addRecord(['name' => $directiveName, 'layout' => $example['html']])
+      ->setLayoutFormat('html')
+      ->execute();
+
+    $result = Civi\Api4\Afform::get()
+      ->addWhere('name', '=', $directiveName)
+      ->setLayoutFormat('shallow')
+      ->setFormatWhitespace(TRUE)
+      ->execute()
+      ->first();
+
+    $this->assertEquals($example['stripped'] ?? $example['shallow'], $this->fudgeMarkup($result['layout']));
+
+    Civi\Api4\Afform::save()
+      ->addRecord(['name' => $directiveName, 'layout' => $result['layout']])
+      ->setLayoutFormat('shallow')
+      ->setFormatWhitespace(TRUE)
+      ->execute();
+
+    $result = Civi\Api4\Afform::get()
+      ->addWhere('name', '=', $directiveName)
+      ->setLayoutFormat('html')
+      ->execute()
+      ->first();
+
+    $this->assertEquals($example['pretty'], $this->fudgeMarkup($result['layout']));
+  }
+
+  public function testAutoRequires() {
+    $formName = 'mockPage';
+    $this->createLoggedInUser();
+
+    // The default mockPage has 1 explicit requirement + 2 automatic requirements.
+    Civi\Api4\Afform::revert()->addWhere('name', '=', $formName)->execute();
+    $angModule = Civi::service('angular')->getModule($formName);
+    $this->assertEquals(['afCore', 'mockBespoke', 'mockBareFile', 'mockFoo'], $angModule['requires']);
+    $storedRequires = Civi\Api4\Afform::get()->addWhere('name', '=', $formName)->addSelect('requires')->execute();
+    $this->assertEquals(['mockBespoke'], $storedRequires[0]['requires']);
+
+    // Knock down to 1 explicit + 1 automatic.
+    Civi\Api4\Afform::update()
+      ->addWhere('name', '=', $formName)
+      ->setLayoutFormat('html')
+      ->setValues(['layout' => '<div>The bare file says "<span mock-bare-file/>"</div>'])
+      ->execute();
+    $angModule = Civi::service('angular')->getModule($formName);
+    $this->assertEquals(['afCore', 'mockBespoke', 'mockBareFile'], $angModule['requires']);
+    $storedRequires = Civi\Api4\Afform::get()->addWhere('name', '=', $formName)->addSelect('requires')->execute();
+    $this->assertEquals(['mockBespoke'], $storedRequires[0]['requires']);
+
+    // Remove the last explict and implicit requirements.
+    Civi\Api4\Afform::update()
+      ->addWhere('name', '=', $formName)
+      ->setLayoutFormat('html')
+      ->setValues([
+        'layout' => '<div>The file has nothing! <strong>NOTHING!</strong> <em>JUST RANTING!</em></div>',
+        'requires' => [],
+      ])
+      ->execute();
+    $angModule = Civi::service('angular')->getModule($formName);
+    $this->assertEquals(['afCore'], $angModule['requires']);
+    $storedRequires = Civi\Api4\Afform::get()->addWhere('name', '=', $formName)->addSelect('requires')->execute();
+    $this->assertEquals([], $storedRequires[0]['requires']);
+
+    Civi\Api4\Afform::revert()->addWhere('name', '=', $formName)->execute();
+    $angModule = Civi::service('angular')->getModule($formName);
+    $this->assertEquals(['afCore', 'mockBespoke', 'mockBareFile', 'mockFoo'], $angModule['requires']);
+  }
+
+}
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformTestCase.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformTestCase.php
new file mode 100644
index 0000000000000000000000000000000000000000..4847abf604e1445c84bb3ea08253fa12b930c0cc
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformTestCase.php
@@ -0,0 +1,39 @@
+<?php
+
+use Civi\Test\HeadlessInterface;
+use Civi\Test\TransactionalInterface;
+
+/**
+ * Base class for Afform API tests.
+ */
+abstract class api_v4_AfformTestCase extends \PHPUnit\Framework\TestCase implements HeadlessInterface, TransactionalInterface {
+
+  /**
+   * Civi\Test has many helpers, like install(), uninstall(), sql(), and sqlFile().
+   * See: https://github.com/civicrm/org.civicrm.testapalooza/blob/master/civi-test.md
+   */
+  public function setUpHeadless() {
+    return \Civi\Test::headless()
+      ->install(version_compare(CRM_Utils_System::version(), '5.19.alpha1', '<') ? ['org.civicrm.api4'] : [])
+      ->install(['org.civicrm.afform', 'org.civicrm.afform-mock'])
+      ->apply();
+  }
+
+  /**
+   * The setup() method is executed before the test is executed (optional).
+   */
+  public function setUp() {
+    parent::setUp();
+    CRM_Core_Config::singleton()->userPermissionTemp = new CRM_Core_Permission_Temp();
+    CRM_Core_Config::singleton()->userPermissionTemp->grant('administer CiviCRM');
+  }
+
+  /**
+   * The tearDown() method is executed after the test was executed (optional)
+   * This can be used for cleanup.
+   */
+  public function tearDown() {
+    parent::tearDown();
+  }
+
+}
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformUsageTest.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformUsageTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b79d9d532facaf7d3cf94b974768d8c89e7f69c3
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/AfformUsageTest.php
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * Test case for Afform.prefill and Afform.submit.
+ *
+ * @group headless
+ */
+class api_v4_AfformUsageTest extends api_v4_AfformTestCase {
+  use \Civi\Test\Api3TestTrait;
+  use \Civi\Test\ContactTestTrait;
+
+  protected static $layouts = [];
+
+  protected $formName;
+
+  public static function setUpBeforeClass() {
+    parent::setUpBeforeClass();
+    self::$layouts['aboutMe'] = <<<EOHTML
+<af-form ctrl="modelListCtrl">
+  <af-entity type="Contact" data="{contact_type: 'Individual'}" name="me" label="Myself" url-autofill="1" autofill="user" />
+  <fieldset af-fieldset="me">
+      <af-field name="first_name" />
+      <af-field name="last_name" />
+  </fieldset>
+</af-form>
+EOHTML;
+  }
+
+  public function setUp() {
+    parent::setUp();
+    $this->formName = 'mock' . rand(0, 100000);
+  }
+
+  public function tearDown() {
+    Civi\Api4\Afform::revert()
+      ->setCheckPermissions(FALSE)
+      ->addWhere('name', '=', $this->formName)
+      ->execute();
+    parent::tearDown();
+  }
+
+  public function testAboutMeAllowed() {
+    $this->useValues([
+      'layout' => self::$layouts['aboutMe'],
+      'permission' => CRM_Core_Permission::ALWAYS_ALLOW_PERMISSION,
+    ]);
+
+    $cid = $this->createLoggedInUser();
+    CRM_Core_Config::singleton()->userPermissionTemp = new CRM_Core_Permission_Temp();
+
+    $prefill = Civi\Api4\Afform::prefill()
+      ->setName($this->formName)
+      ->setArgs([])
+      ->execute()
+      ->indexBy('name');
+    $this->assertEquals('Logged In', $prefill['me']['values'][0]['fields']['first_name']);
+    $this->assertRegExp('/^User/', $prefill['me']['values'][0]['fields']['last_name']);
+
+    $me = $prefill['me']['values'];
+    $me[0]['fields']['first_name'] = 'Firsty';
+    $me[0]['fields']['last_name'] = 'Lasty';
+
+    Civi\Api4\Afform::submit()
+      ->setName($this->formName)
+      ->setArgs([])
+      ->setValues(['me' => $me])
+      ->execute();
+
+    $contact = Civi\Api4\Contact::get()->setCheckPermissions(FALSE)->addWhere('id', '=', $cid)->execute()->first();
+    $this->assertEquals('Firsty', $contact['first_name']);
+    $this->assertEquals('Lasty', $contact['last_name']);
+  }
+
+  public function testAboutMeForbidden() {
+    $this->useValues([
+      'layout' => self::$layouts['aboutMe'],
+      'permission' => CRM_Core_Permission::ALWAYS_DENY_PERMISSION,
+    ]);
+
+    $this->createLoggedInUser();
+    CRM_Core_Config::singleton()->userPermissionTemp = new CRM_Core_Permission_Temp();
+
+    try {
+      Civi\Api4\Afform::prefill()
+        ->setName($this->formName)
+        ->setArgs([])
+        ->execute()
+        ->indexBy('name');
+      $this->fail('Expected authorization exception from Afform.prefill');
+    }
+    catch (\Civi\API\Exception\UnauthorizedException $e) {
+      $this->assertRegExp(';Authorization failed: Cannot process form mock\d+;', $e->getMessage());
+    }
+
+    try {
+      Civi\Api4\Afform::submit()
+        ->setName($this->formName)
+        ->setArgs([])
+        ->setValues([
+          'does.n' => 'tmatter',
+        ])
+        ->execute();
+      $this->fail('Expected authorization exception from Afform.submit');
+    }
+    catch (\Civi\API\Exception\UnauthorizedException $e) {
+      $this->assertRegExp(';Authorization failed: Cannot process form mock\d+;', $e->getMessage());
+    }
+  }
+
+  protected function useValues($values) {
+    $defaults = [
+      'title' => 'My form',
+      'name' => $this->formName,
+    ];
+    $full = array_merge($defaults, $values);
+    Civi\Api4\Afform::create()
+      ->setCheckPermissions(FALSE)
+      ->setLayoutFormat('html')
+      ->setValues($full)
+      ->execute();
+  }
+
+}
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/apple.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/apple.php
new file mode 100644
index 0000000000000000000000000000000000000000..b082ae0a5a74c1a3cee5f60ca0c76f15c2b802f2
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/apple.php
@@ -0,0 +1,12 @@
+<?php
+
+return [
+  'html' => '<strong>New &nbsp; text!</strong>',
+  'pretty' => "<strong>New &nbsp; text!</strong>\n",
+  'shallow' => [
+    ['#tag' => 'strong', '#markup' => 'New &nbsp; text!'],
+  ],
+  'deep' => [
+    ['#tag' => 'strong', '#children' => [['#text' => 'New &nbsp; text!']]],
+  ],
+];
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/banana.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/banana.php
new file mode 100644
index 0000000000000000000000000000000000000000..6d70851f39b6db29e873fa7af92c1eb4e80c1b39
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/banana.php
@@ -0,0 +1,44 @@
+<?php
+
+return [
+  'html' => '<div class="af-container"><strong>  New text!</strong><strong class="af-text"> &nbsp; Get a trim! </strong><af-field name="do_not_sms" defn="{label: \'Do not do any of the emailing\'}" /></div>',
+  'pretty' => '<div class="af-container">
+  <strong>  New text!</strong>
+  <strong class="af-text">&nbsp; Get a trim!</strong>
+  <af-field name="do_not_sms" defn="{label: \'Do not do any of the emailing\'}" />
+</div>
+',
+  'stripped' => [
+    [
+      '#tag' => 'div',
+      'class' => 'af-container',
+      '#children' => [
+        ['#tag' => 'strong', '#markup' => '  New text!'],
+        ['#tag' => 'strong', 'class' => 'af-text', '#children' => [['#text' => "&nbsp; Get a trim!"]]],
+        ['#tag' => 'af-field', 'name' => 'do_not_sms', 'defn' => "{label: 'Do not do any of the emailing'}"],
+      ],
+    ],
+  ],
+  'shallow' => [
+    [
+      '#tag' => 'div',
+      'class' => 'af-container',
+      '#children' => [
+        ['#tag' => 'strong', '#markup' => '  New text!'],
+        ['#tag' => 'strong', 'class' => 'af-text', '#children' => [['#text' => " &nbsp; Get a trim! "]]],
+        ['#tag' => 'af-field', 'name' => 'do_not_sms', 'defn' => "{label: 'Do not do any of the emailing'}"],
+      ],
+    ],
+  ],
+  'deep' => [
+    [
+      '#tag' => 'div',
+      'class' => 'af-container',
+      '#children' => [
+        ['#tag' => 'strong', '#children' => [['#text' => '  New text!']]],
+        ['#tag' => 'strong', 'class' => 'af-text', '#children' => [['#text' => " &nbsp; Get a trim! "]]],
+        ['#tag' => 'af-field', 'name' => 'do_not_sms', 'defn' => ['label' => 'Do not do any of the emailing']],
+      ],
+    ],
+  ],
+];
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/cherry.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/cherry.php
new file mode 100644
index 0000000000000000000000000000000000000000..4060cfb6c87a3d7f0670d2226da0ba8a49b8307e
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/cherry.php
@@ -0,0 +1,21 @@
+<?php
+
+return [
+  'html' => '<span>First</span>   <span>Second</span>',
+  'pretty' => "<span>First</span>
+<span>Second</span>\n",
+  'stripped' => [
+    ['#tag' => 'span', '#markup' => 'First'],
+    ['#tag' => 'span', '#markup' => 'Second'],
+  ],
+  'shallow' => [
+    ['#tag' => 'span', '#markup' => 'First'],
+    ['#text' => '   '],
+    ['#tag' => 'span', '#markup' => 'Second'],
+  ],
+  'deep' => [
+    ['#tag' => 'span', '#children' => [['#text' => 'First']]],
+    ['#text' => '   '],
+    ['#tag' => 'span', '#children' => [['#text' => 'Second']]],
+  ],
+];
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/comments.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/comments.php
new file mode 100644
index 0000000000000000000000000000000000000000..e060fb6b53c09dfd50e6bde1409b39c9af8f8a5e
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/comments.php
@@ -0,0 +1,25 @@
+<?php
+
+return [
+  'html' => '<div>One<!-- uno --> Two <!--dos & so on --> Three</div><!--tres-a--b---c-->',
+  'shallow' => [
+    [
+      '#tag' => 'div',
+      '#markup' => 'One<!-- uno --> Two <!--dos & so on --> Three',
+    ],
+    ['#comment' => 'tres-a--b---c'],
+  ],
+  'deep' => [
+    [
+      '#tag' => 'div',
+      '#children' => [
+        ['#text' => 'One'],
+        ['#comment' => ' uno '],
+        ['#text' => ' Two '],
+        ['#comment' => 'dos & so on '],
+        ['#text' => ' Three'],
+      ],
+    ],
+    ['#comment' => 'tres-a--b---c'],
+  ],
+];
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/empty.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/empty.php
new file mode 100644
index 0000000000000000000000000000000000000000..c8010a5b9bab6c2b4580e70524e9cfd003887e33
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/empty.php
@@ -0,0 +1,8 @@
+<?php
+
+return [
+  'html' => '',
+  'pretty' => '',
+  'shallow' => [],
+  'deep' => [],
+];
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/self-closing.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/self-closing.php
new file mode 100644
index 0000000000000000000000000000000000000000..3132e0b4c25a6ea057590081d276ad6d1eb8faed
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/self-closing.php
@@ -0,0 +1,27 @@
+<?php
+
+return [
+  'html' => '<span class="one"></span><img class="two" /><div><br class="three" /><br /></div>',
+  'pretty' => '<span class="one"></span>
+<img class="two" />
+<div>
+  <br class="three" /><br />
+</div>
+',
+  'shallow' => [
+    ['#tag' => 'span', 'class' => 'one'],
+    ['#tag' => 'img', 'class' => 'two'],
+    ['#tag' => 'div', '#markup' => '<br class="three" /><br />'],
+  ],
+  'deep' => [
+    ['#tag' => 'span', 'class' => 'one'],
+    ['#tag' => 'img', 'class' => 'two'],
+    [
+      '#tag' => 'div',
+      '#children' => [
+        ['#tag' => 'br', 'class' => 'three'],
+        ['#tag' => 'br'],
+      ],
+    ],
+  ],
+];
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/string.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/string.php
new file mode 100644
index 0000000000000000000000000000000000000000..28537729f9be13514ce9bc29c697bbef3f0b17e4
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/string.php
@@ -0,0 +1,8 @@
+<?php
+
+return [
+  'html' => 'hello world',
+  'pretty' => 'hello world',
+  'shallow' => [['#text' => 'hello world']],
+  'deep' => [['#text' => 'hello world']],
+];
diff --git a/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/stylized.php b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/stylized.php
new file mode 100644
index 0000000000000000000000000000000000000000..65aaede619ffc5b5da8a9202aac9a6dc708be8a6
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/api/v4/formatExamples/stylized.php
@@ -0,0 +1,22 @@
+<?php
+
+return [
+  'html' => '<p><strong>Stylized</strong> text is <em>wonky</em> text!</p>',
+  'pretty' => "<p>
+  <strong>Stylized</strong> text is <em>wonky</em> text!
+</p>\n",
+  'shallow' => [
+    ['#tag' => 'p', '#markup' => '<strong>Stylized</strong> text is <em>wonky</em> text!'],
+  ],
+  'deep' => [
+    [
+      '#tag' => 'p',
+      '#children' => [
+        ['#tag' => 'strong', '#children' => [['#text' => 'Stylized']]],
+        ['#text' => ' text is '],
+        ['#tag' => 'em', '#children' => [['#text' => 'wonky']]],
+        ['#text' => ' text!'],
+      ],
+    ],
+  ],
+];
diff --git a/civicrm/ext/afform/mock/tests/phpunit/bootstrap.php b/civicrm/ext/afform/mock/tests/phpunit/bootstrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..bc7558e582fc97c1b0452df38a15250076af5e5f
--- /dev/null
+++ b/civicrm/ext/afform/mock/tests/phpunit/bootstrap.php
@@ -0,0 +1,66 @@
+<?php
+
+ini_set('memory_limit', '2G');
+ini_set('safe_mode', 0);
+// phpcs:disable
+eval(cv('php:boot --level=classloader', 'phpcode'));
+// phpcs:enable
+
+// Allow autoloading of PHPUnit helper classes in this extension.
+foreach ([__DIR__] as $dir) {
+  $loader = new \Composer\Autoload\ClassLoader();
+  $loader->add('CRM_', $dir);
+  $loader->add('Civi\\', $dir);
+  $loader->add('api_', $dir);
+  $loader->add('api\\', $dir);
+  $loader->register();
+}
+
+/**
+ * Call the "cv" command.
+ *
+ * @param string $cmd
+ *   The rest of the command to send.
+ * @param string $decode
+ *   Ex: 'json' or 'phpcode'.
+ * @return string
+ *   Response output (if the command executed normally).
+ * @throws \RuntimeException
+ *   If the command terminates abnormally.
+ */
+function cv($cmd, $decode = 'json') {
+  $cmd = 'cv ' . $cmd;
+  $descriptorSpec = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => STDERR);
+  $oldOutput = getenv('CV_OUTPUT');
+  putenv("CV_OUTPUT=json");
+
+  // Execute `cv` in the original folder. This is a work-around for
+  // phpunit/codeception, which seem to manipulate PWD.
+  $cmd = sprintf('cd %s; %s', escapeshellarg(getenv('PWD')), $cmd);
+
+  $process = proc_open($cmd, $descriptorSpec, $pipes, __DIR__);
+  putenv("CV_OUTPUT=$oldOutput");
+  fclose($pipes[0]);
+  $result = stream_get_contents($pipes[1]);
+  fclose($pipes[1]);
+  if (proc_close($process) !== 0) {
+    throw new RuntimeException("Command failed ($cmd):\n$result");
+  }
+  switch ($decode) {
+    case 'raw':
+      return $result;
+
+    case 'phpcode':
+      // If the last output is /*PHPCODE*/, then we managed to complete execution.
+      if (substr(trim($result), 0, 12) !== "/*BEGINPHP*/" || substr(trim($result), -10) !== "/*ENDPHP*/") {
+        throw new \RuntimeException("Command failed ($cmd):\n$result");
+      }
+      return $result;
+
+    case 'json':
+      return json_decode($result, 1);
+
+    default:
+      throw new RuntimeException("Bad decoder format ($decode)");
+  }
+}
diff --git a/civicrm/ext/ewaysingle/CRM/Core/Payment/eWAY.mgd.php b/civicrm/ext/ewaysingle/CRM/Core/Payment/eWAY.mgd.php
new file mode 100644
index 0000000000000000000000000000000000000000..978303bc60ec5cf716a6f82715b433183a7d33bb
--- /dev/null
+++ b/civicrm/ext/ewaysingle/CRM/Core/Payment/eWAY.mgd.php
@@ -0,0 +1,24 @@
+<?php
+// This file declares a managed database record of type "ReportTemplate".
+// The record will be automatically inserted, updated, or deleted from the
+// database as appropriate. For more details, see "hook_civicrm_managed" at:
+// http://wiki.civicrm.org/confluence/display/CRMDOC42/Hook+Reference
+return array(
+  0 => array(
+    'name' => 'eWAY',
+    'entity' => 'PaymentProcessorType',
+    'params' => array(
+      'version' => 3,
+      'name' => 'eWAY',
+      'title' => 'eWAY (Single Currency)',
+      'description' => '',
+      'user_name_label' => 'Customer ID',
+      'class_name' => 'Payment_eWAY',
+      'billing_mode' => 1,
+      'url_site_default' => 'https://www.eway.com.au/gateway_cvn/xmlpayment.asp',
+      'payment_type' => 1,
+      'is_recur' => 0,
+      'url_site_test_default' => 'https://www.eway.com.au/gateway_cvn/xmltest/testpage.asp',
+    ),
+  ),
+);
diff --git a/civicrm/CRM/Core/Payment/eWAY.php b/civicrm/ext/ewaysingle/CRM/Core/Payment/eWAY.php
similarity index 87%
rename from civicrm/CRM/Core/Payment/eWAY.php
rename to civicrm/ext/ewaysingle/CRM/Core/Payment/eWAY.php
index e8ec19da0dab8711c3d8b4e8f083cefef9ec1a17..a50389ffd33bbb7bb8d5232d441e41d487540d68 100644
--- a/civicrm/CRM/Core/Payment/eWAY.php
+++ b/civicrm/ext/ewaysingle/CRM/Core/Payment/eWAY.php
@@ -77,16 +77,22 @@
  */
 
 use Civi\Payment\Exception\PaymentProcessorException;
+use CRM_Ewaysingle_ExtensionUtil as E;
 
 // require Standard eWAY API libraries
-require_once 'eWAY/eWAY_GatewayRequest.php';
-require_once 'eWAY/eWAY_GatewayResponse.php';
+require_once E::path('lib/eWAY/eWAY_GatewayRequest.php');
+require_once E::path('lib/eWAY/eWAY_GatewayResponse.php');
 
 /**
  * Class CRM_Core_Payment_eWAY.
  */
 class CRM_Core_Payment_eWAY extends CRM_Core_Payment {
 
+  /**
+   * @var GuzzleHttp\Client
+   */
+  protected $guzzleClient;
+
   /**
    * *******************************************************
    * Constructor
@@ -105,6 +111,20 @@ class CRM_Core_Payment_eWAY extends CRM_Core_Payment {
     $this->_paymentProcessor = $paymentProcessor;
   }
 
+  /**
+   * @return \GuzzleHttp\Client
+   */
+  public function getGuzzleClient(): \GuzzleHttp\Client {
+    return $this->guzzleClient ?? new \GuzzleHttp\Client();
+  }
+
+  /**
+   * @param \GuzzleHttp\Client $guzzleClient
+   */
+  public function setGuzzleClient(\GuzzleHttp\Client $guzzleClient) {
+    $this->guzzleClient = $guzzleClient;
+  }
+
   /**
    * Sends request and receive response from eWAY payment process.
    *
@@ -245,50 +265,13 @@ class CRM_Core_Payment_eWAY extends CRM_Core_Payment {
     //----------------------------------------------------------------------------------------------------
     $requestxml = $eWAYRequest->ToXML();
 
-    $submit = curl_init($gateway_URL);
-
-    if (!$submit) {
-      throw new PaymentProcessorException('Could not initiate connection to payment gateway', 9004);
-    }
-
-    curl_setopt($submit, CURLOPT_POST, TRUE);
-    // return the result on success, FALSE on failure
-    curl_setopt($submit, CURLOPT_RETURNTRANSFER, TRUE);
-    curl_setopt($submit, CURLOPT_POSTFIELDS, $requestxml);
-    curl_setopt($submit, CURLOPT_TIMEOUT, 36000);
-    // if open_basedir or safe_mode are enabled in PHP settings CURLOPT_FOLLOWLOCATION won't work so don't apply it
-    // it's not really required CRM-5841
-    if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')) {
-      // ensures any Location headers are followed
-      curl_setopt($submit, CURLOPT_FOLLOWLOCATION, 1);
-    }
-
-    // Send the data out over the wire
-    //--------------------------------
-    $responseData = curl_exec($submit);
-
-    //----------------------------------------------------------------------------------------------------
-    // See if we had a curl error - if so tell 'em and bail out
-    //
-    // NOTE: curl_error does not return a logical value (see its documentation), but
-    //       a string, which is empty when there was no error.
-    //----------------------------------------------------------------------------------------------------
-    if ((curl_errno($submit) > 0) || (strlen(curl_error($submit)) > 0)) {
-      $errorNum = curl_errno($submit);
-      $errorDesc = curl_error($submit);
-
-      // Paranoia - in the unlikley event that 'curl' errno fails
-      if ($errorNum == 0) {
-        $errorNum = 9005;
-      }
-
-      // Paranoia - in the unlikley event that 'curl' error fails
-      if (strlen($errorDesc) == 0) {
-        $errorDesc = 'Connection to eWAY payment gateway failed';
-      }
-
-      throw new PaymentProcessorException($errorDesc, $errorNum);
-    }
+    $responseData = (string) $this->getGuzzleClient()->post($this->_paymentProcessor['url_site'], [
+      'body' => $requestxml,
+      'curl' => [
+        CURLOPT_RETURNTRANSFER => TRUE,
+        CURLOPT_SSL_VERIFYPEER => Civi::settings()->get('verifySSL'),
+      ],
+    ])->getBody();
 
     //----------------------------------------------------------------------------------------------------
     // If null data returned - tell 'em and bail out
@@ -307,11 +290,6 @@ class CRM_Core_Payment_eWAY extends CRM_Core_Payment {
       throw new PaymentProcessorException('Error: No data returned from payment gateway.', 9007);
     }
 
-    //----------------------------------------------------------------------------------------------------
-    // Success so far - close the curl and check the data
-    //----------------------------------------------------------------------------------------------------
-    curl_close($submit);
-
     //----------------------------------------------------------------------------------------------------
     // Payment successfully sent to gateway - process the response now
     //----------------------------------------------------------------------------------------------------
diff --git a/civicrm/ext/ewaysingle/LICENSE.txt b/civicrm/ext/ewaysingle/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..5ceb74b891103adb4f67cf5a3a8b08a205543fdb
--- /dev/null
+++ b/civicrm/ext/ewaysingle/LICENSE.txt
@@ -0,0 +1,667 @@
+Package: ewaysingle
+Copyright (C) 2020, Seamus Lee <seamuslee001@gmail.com>
+Licensed under the GNU Affero Public License 3.0 (below).
+
+-------------------------------------------------------------------------------
+
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/civicrm/ext/ewaysingle/README.md b/civicrm/ext/ewaysingle/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..81ddd1e7a6bac0212d0d66b6e4af6dfa6ed410fa
--- /dev/null
+++ b/civicrm/ext/ewaysingle/README.md
@@ -0,0 +1,32 @@
+# ewaysingle
+
+![Screenshot](/images/screenshot.png)
+
+This extension is aimed at containing the original Core eWAY (Single Currency) Payment Processor Type that is legacy. See known issues below
+
+The extension is licensed under [AGPL-3.0](LICENSE.txt).
+
+## Requirements
+
+* PHP v7.1+
+* CiviCRM 5.31
+
+## Installation (Web UI)
+
+Navigate to the Extensions Page and install the extension.
+
+## Installation (CLI)
+
+To enable this extension in the CLI do the following
+
+```bash
+cv en ewaysingle
+```
+
+## Usage
+
+The eWAY (Single Currency) Payment Processor Type will show up as one of the options when your adding in a PaymentProcessor.
+
+## Known Issues
+
+This Payment Processor does not do any kind of recurring payments at all for that you would need another extension e.g. [Agileware Eway Recurring](https://github.com/agileware/au.com.agileware.ewayrecurring)
diff --git a/civicrm/ext/ewaysingle/ewaysingle.civix.php b/civicrm/ext/ewaysingle/ewaysingle.civix.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a71b5bdba5e8175ea318d925b33022d40ae3ecc
--- /dev/null
+++ b/civicrm/ext/ewaysingle/ewaysingle.civix.php
@@ -0,0 +1,477 @@
+<?php
+
+// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
+
+/**
+ * The ExtensionUtil class provides small stubs for accessing resources of this
+ * extension.
+ */
+class CRM_Ewaysingle_ExtensionUtil {
+  const SHORT_NAME = "ewaysingle";
+  const LONG_NAME = "ewaysingle";
+  const CLASS_PREFIX = "CRM_Ewaysingle";
+
+  /**
+   * Translate a string using the extension's domain.
+   *
+   * If the extension doesn't have a specific translation
+   * for the string, fallback to the default translations.
+   *
+   * @param string $text
+   *   Canonical message text (generally en_US).
+   * @param array $params
+   * @return string
+   *   Translated text.
+   * @see ts
+   */
+  public static function ts($text, $params = []) {
+    if (!array_key_exists('domain', $params)) {
+      $params['domain'] = [self::LONG_NAME, NULL];
+    }
+    return ts($text, $params);
+  }
+
+  /**
+   * Get the URL of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo'.
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function url($file = NULL) {
+    if ($file === NULL) {
+      return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/');
+    }
+    return CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME, $file);
+  }
+
+  /**
+   * Get the path of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo'.
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function path($file = NULL) {
+    // return CRM_Core_Resources::singleton()->getPath(self::LONG_NAME, $file);
+    return __DIR__ . ($file === NULL ? '' : (DIRECTORY_SEPARATOR . $file));
+  }
+
+  /**
+   * Get the name of a class within this extension.
+   *
+   * @param string $suffix
+   *   Ex: 'Page_HelloWorld' or 'Page\\HelloWorld'.
+   * @return string
+   *   Ex: 'CRM_Foo_Page_HelloWorld'.
+   */
+  public static function findClass($suffix) {
+    return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix);
+  }
+
+}
+
+use CRM_Ewaysingle_ExtensionUtil as E;
+
+/**
+ * (Delegated) Implements hook_civicrm_config().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config
+ */
+function _ewaysingle_civix_civicrm_config(&$config = NULL) {
+  static $configured = FALSE;
+  if ($configured) {
+    return;
+  }
+  $configured = TRUE;
+
+  $template =& CRM_Core_Smarty::singleton();
+
+  $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
+  $extDir = $extRoot . 'templates';
+
+  if (is_array($template->template_dir)) {
+    array_unshift($template->template_dir, $extDir);
+  }
+  else {
+    $template->template_dir = [$extDir, $template->template_dir];
+  }
+
+  $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
+  set_include_path($include_path);
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_xmlMenu().
+ *
+ * @param $files array(string)
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu
+ */
+function _ewaysingle_civix_civicrm_xmlMenu(&$files) {
+  foreach (_ewaysingle_civix_glob(__DIR__ . '/xml/Menu/*.xml') as $file) {
+    $files[] = $file;
+  }
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+ */
+function _ewaysingle_civix_civicrm_install() {
+  _ewaysingle_civix_civicrm_config();
+  if ($upgrader = _ewaysingle_civix_upgrader()) {
+    $upgrader->onInstall();
+  }
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
+ */
+function _ewaysingle_civix_civicrm_postInstall() {
+  _ewaysingle_civix_civicrm_config();
+  if ($upgrader = _ewaysingle_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onPostInstall'])) {
+      $upgrader->onPostInstall();
+    }
+  }
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
+ */
+function _ewaysingle_civix_civicrm_uninstall() {
+  _ewaysingle_civix_civicrm_config();
+  if ($upgrader = _ewaysingle_civix_upgrader()) {
+    $upgrader->onUninstall();
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_enable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+ */
+function _ewaysingle_civix_civicrm_enable() {
+  _ewaysingle_civix_civicrm_config();
+  if ($upgrader = _ewaysingle_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onEnable'])) {
+      $upgrader->onEnable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_disable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
+ * @return mixed
+ */
+function _ewaysingle_civix_civicrm_disable() {
+  _ewaysingle_civix_civicrm_config();
+  if ($upgrader = _ewaysingle_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onDisable'])) {
+      $upgrader->onDisable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_upgrade().
+ *
+ * @param $op string, the type of operation being performed; 'check' or 'enqueue'
+ * @param $queue CRM_Queue_Queue, (for 'enqueue') the modifiable list of pending up upgrade tasks
+ *
+ * @return mixed
+ *   based on op. for 'check', returns array(boolean) (TRUE if upgrades are pending)
+ *   for 'enqueue', returns void
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade
+ */
+function _ewaysingle_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  if ($upgrader = _ewaysingle_civix_upgrader()) {
+    return $upgrader->onUpgrade($op, $queue);
+  }
+}
+
+/**
+ * @return CRM_Ewaysingle_Upgrader
+ */
+function _ewaysingle_civix_upgrader() {
+  if (!file_exists(__DIR__ . '/CRM/Ewaysingle/Upgrader.php')) {
+    return NULL;
+  }
+  else {
+    return CRM_Ewaysingle_Upgrader_Base::instance();
+  }
+}
+
+/**
+ * Search directory tree for files which match a glob pattern.
+ *
+ * Note: Dot-directories (like "..", ".git", or ".svn") will be ignored.
+ * Note: In Civi 4.3+, delegate to CRM_Utils_File::findFiles()
+ *
+ * @param string $dir base dir
+ * @param string $pattern , glob pattern, eg "*.txt"
+ *
+ * @return array
+ */
+function _ewaysingle_civix_find_files($dir, $pattern) {
+  if (is_callable(['CRM_Utils_File', 'findFiles'])) {
+    return CRM_Utils_File::findFiles($dir, $pattern);
+  }
+
+  $todos = [$dir];
+  $result = [];
+  while (!empty($todos)) {
+    $subdir = array_shift($todos);
+    foreach (_ewaysingle_civix_glob("$subdir/$pattern") as $match) {
+      if (!is_dir($match)) {
+        $result[] = $match;
+      }
+    }
+    if ($dh = opendir($subdir)) {
+      while (FALSE !== ($entry = readdir($dh))) {
+        $path = $subdir . DIRECTORY_SEPARATOR . $entry;
+        if ($entry[0] == '.') {
+        }
+        elseif (is_dir($path)) {
+          $todos[] = $path;
+        }
+      }
+      closedir($dh);
+    }
+  }
+  return $result;
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_managed().
+ *
+ * Find any *.mgd.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed
+ */
+function _ewaysingle_civix_civicrm_managed(&$entities) {
+  $mgdFiles = _ewaysingle_civix_find_files(__DIR__, '*.mgd.php');
+  sort($mgdFiles);
+  foreach ($mgdFiles as $file) {
+    $es = include $file;
+    foreach ($es as $e) {
+      if (empty($e['module'])) {
+        $e['module'] = E::LONG_NAME;
+      }
+      if (empty($e['params']['version'])) {
+        $e['params']['version'] = '3';
+      }
+      $entities[] = $e;
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_caseTypes().
+ *
+ * Find any and return any files matching "xml/case/*.xml"
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes
+ */
+function _ewaysingle_civix_civicrm_caseTypes(&$caseTypes) {
+  if (!is_dir(__DIR__ . '/xml/case')) {
+    return;
+  }
+
+  foreach (_ewaysingle_civix_glob(__DIR__ . '/xml/case/*.xml') as $file) {
+    $name = preg_replace('/\.xml$/', '', basename($file));
+    if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) {
+      $errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name));
+      throw new CRM_Core_Exception($errorMessage);
+    }
+    $caseTypes[$name] = [
+      'module' => E::LONG_NAME,
+      'name' => $name,
+      'file' => $file,
+    ];
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_angularModules().
+ *
+ * Find any and return any files matching "ang/*.ang.php"
+ *
+ * Note: This hook only runs in CiviCRM 4.5+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules
+ */
+function _ewaysingle_civix_civicrm_angularModules(&$angularModules) {
+  if (!is_dir(__DIR__ . '/ang')) {
+    return;
+  }
+
+  $files = _ewaysingle_civix_glob(__DIR__ . '/ang/*.ang.php');
+  foreach ($files as $file) {
+    $name = preg_replace(':\.ang\.php$:', '', basename($file));
+    $module = include $file;
+    if (empty($module['ext'])) {
+      $module['ext'] = E::LONG_NAME;
+    }
+    $angularModules[$name] = $module;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_themes().
+ *
+ * Find any and return any files matching "*.theme.php"
+ */
+function _ewaysingle_civix_civicrm_themes(&$themes) {
+  $files = _ewaysingle_civix_glob(__DIR__ . '/*.theme.php');
+  foreach ($files as $file) {
+    $themeMeta = include $file;
+    if (empty($themeMeta['name'])) {
+      $themeMeta['name'] = preg_replace(':\.theme\.php$:', '', basename($file));
+    }
+    if (empty($themeMeta['ext'])) {
+      $themeMeta['ext'] = E::LONG_NAME;
+    }
+    $themes[$themeMeta['name']] = $themeMeta;
+  }
+}
+
+/**
+ * Glob wrapper which is guaranteed to return an array.
+ *
+ * The documentation for glob() says, "On some systems it is impossible to
+ * distinguish between empty match and an error." Anecdotally, the return
+ * result for an empty match is sometimes array() and sometimes FALSE.
+ * This wrapper provides consistency.
+ *
+ * @link http://php.net/glob
+ * @param string $pattern
+ *
+ * @return array
+ */
+function _ewaysingle_civix_glob($pattern) {
+  $result = glob($pattern);
+  return is_array($result) ? $result : [];
+}
+
+/**
+ * Inserts a navigation menu item at a given place in the hierarchy.
+ *
+ * @param array $menu - menu hierarchy
+ * @param string $path - path to parent of this item, e.g. 'my_extension/submenu'
+ *    'Mailing', or 'Administer/System Settings'
+ * @param array $item - the item to insert (parent/child attributes will be
+ *    filled for you)
+ *
+ * @return bool
+ */
+function _ewaysingle_civix_insert_navigation_menu(&$menu, $path, $item) {
+  // If we are done going down the path, insert menu
+  if (empty($path)) {
+    $menu[] = [
+      'attributes' => array_merge([
+        'label'      => CRM_Utils_Array::value('name', $item),
+        'active'     => 1,
+      ], $item),
+    ];
+    return TRUE;
+  }
+  else {
+    // Find an recurse into the next level down
+    $found = FALSE;
+    $path = explode('/', $path);
+    $first = array_shift($path);
+    foreach ($menu as $key => &$entry) {
+      if ($entry['attributes']['name'] == $first) {
+        if (!isset($entry['child'])) {
+          $entry['child'] = [];
+        }
+        $found = _ewaysingle_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item);
+      }
+    }
+    return $found;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_navigationMenu().
+ */
+function _ewaysingle_civix_navigationMenu(&$nodes) {
+  if (!is_callable(['CRM_Core_BAO_Navigation', 'fixNavigationMenu'])) {
+    _ewaysingle_civix_fixNavigationMenu($nodes);
+  }
+}
+
+/**
+ * Given a navigation menu, generate navIDs for any items which are
+ * missing them.
+ */
+function _ewaysingle_civix_fixNavigationMenu(&$nodes) {
+  $maxNavID = 1;
+  array_walk_recursive($nodes, function($item, $key) use (&$maxNavID) {
+    if ($key === 'navID') {
+      $maxNavID = max($maxNavID, $item);
+    }
+  });
+  _ewaysingle_civix_fixNavigationMenuItems($nodes, $maxNavID, NULL);
+}
+
+function _ewaysingle_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $parentID) {
+  $origKeys = array_keys($nodes);
+  foreach ($origKeys as $origKey) {
+    if (!isset($nodes[$origKey]['attributes']['parentID']) && $parentID !== NULL) {
+      $nodes[$origKey]['attributes']['parentID'] = $parentID;
+    }
+    // If no navID, then assign navID and fix key.
+    if (!isset($nodes[$origKey]['attributes']['navID'])) {
+      $newKey = ++$maxNavID;
+      $nodes[$origKey]['attributes']['navID'] = $newKey;
+      $nodes[$newKey] = $nodes[$origKey];
+      unset($nodes[$origKey]);
+      $origKey = $newKey;
+    }
+    if (isset($nodes[$origKey]['child']) && is_array($nodes[$origKey]['child'])) {
+      _ewaysingle_civix_fixNavigationMenuItems($nodes[$origKey]['child'], $maxNavID, $nodes[$origKey]['attributes']['navID']);
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders
+ */
+function _ewaysingle_civix_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  $settingsDir = __DIR__ . DIRECTORY_SEPARATOR . 'settings';
+  if (!in_array($settingsDir, $metaDataFolders) && is_dir($settingsDir)) {
+    $metaDataFolders[] = $settingsDir;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_entityTypes().
+ *
+ * Find any *.entityType.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes
+ */
+function _ewaysingle_civix_civicrm_entityTypes(&$entityTypes) {
+  $entityTypes = array_merge($entityTypes, []);
+}
diff --git a/civicrm/ext/ewaysingle/ewaysingle.php b/civicrm/ext/ewaysingle/ewaysingle.php
new file mode 100644
index 0000000000000000000000000000000000000000..d3f2932d6a0055830a04eb6bba385033db101782
--- /dev/null
+++ b/civicrm/ext/ewaysingle/ewaysingle.php
@@ -0,0 +1,172 @@
+<?php
+
+require_once 'ewaysingle.civix.php';
+// phpcs:disable
+use CRM_Ewaysingle_ExtensionUtil as E;
+// phpcs:enable
+
+/**
+ * Implements hook_civicrm_config().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config/
+ */
+function ewaysingle_civicrm_config(&$config) {
+  _ewaysingle_civix_civicrm_config($config);
+}
+
+/**
+ * Implements hook_civicrm_xmlMenu().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu
+ */
+function ewaysingle_civicrm_xmlMenu(&$files) {
+  _ewaysingle_civix_civicrm_xmlMenu($files);
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+ */
+function ewaysingle_civicrm_install() {
+  _ewaysingle_civix_civicrm_install();
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
+ */
+function ewaysingle_civicrm_postInstall() {
+  _ewaysingle_civix_civicrm_postInstall();
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
+ */
+function ewaysingle_civicrm_uninstall() {
+  _ewaysingle_civix_civicrm_uninstall();
+}
+
+/**
+ * Implements hook_civicrm_enable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+ */
+function ewaysingle_civicrm_enable() {
+  _ewaysingle_civix_civicrm_enable();
+}
+
+/**
+ * Implements hook_civicrm_disable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
+ */
+function ewaysingle_civicrm_disable() {
+  _ewaysingle_civix_civicrm_disable();
+}
+
+/**
+ * Implements hook_civicrm_upgrade().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade
+ */
+function ewaysingle_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  return _ewaysingle_civix_civicrm_upgrade($op, $queue);
+}
+
+/**
+ * Implements hook_civicrm_managed().
+ *
+ * Generate a list of entities to create/deactivate/delete when this module
+ * is installed, disabled, uninstalled.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed
+ */
+function ewaysingle_civicrm_managed(&$entities) {
+  _ewaysingle_civix_civicrm_managed($entities);
+}
+
+/**
+ * Implements hook_civicrm_caseTypes().
+ *
+ * Generate a list of case-types.
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes
+ */
+function ewaysingle_civicrm_caseTypes(&$caseTypes) {
+  _ewaysingle_civix_civicrm_caseTypes($caseTypes);
+}
+
+/**
+ * Implements hook_civicrm_angularModules().
+ *
+ * Generate a list of Angular modules.
+ *
+ * Note: This hook only runs in CiviCRM 4.5+. It may
+ * use features only available in v4.6+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules
+ */
+function ewaysingle_civicrm_angularModules(&$angularModules) {
+  _ewaysingle_civix_civicrm_angularModules($angularModules);
+}
+
+/**
+ * Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders
+ */
+function ewaysingle_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  _ewaysingle_civix_civicrm_alterSettingsFolders($metaDataFolders);
+}
+
+/**
+ * Implements hook_civicrm_entityTypes().
+ *
+ * Declare entity types provided by this module.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes
+ */
+function ewaysingle_civicrm_entityTypes(&$entityTypes) {
+  _ewaysingle_civix_civicrm_entityTypes($entityTypes);
+}
+
+/**
+ * Implements hook_civicrm_thems().
+ */
+function ewaysingle_civicrm_themes(&$themes) {
+  _ewaysingle_civix_civicrm_themes($themes);
+}
+
+// --- Functions below this ship commented out. Uncomment as required. ---
+
+/**
+ * Implements hook_civicrm_preProcess().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_preProcess
+ */
+//function ewaysingle_civicrm_preProcess($formName, &$form) {
+//
+//}
+
+/**
+ * Implements hook_civicrm_navigationMenu().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_navigationMenu
+ */
+//function ewaysingle_civicrm_navigationMenu(&$menu) {
+//  _ewaysingle_civix_insert_navigation_menu($menu, 'Mailings', array(
+//    'label' => E::ts('New subliminal message'),
+//    'name' => 'mailing_subliminal_message',
+//    'url' => 'civicrm/mailing/subliminal',
+//    'permission' => 'access CiviMail',
+//    'operator' => 'OR',
+//    'separator' => 0,
+//  ));
+//  _ewaysingle_civix_navigationMenu($menu);
+//}
diff --git a/civicrm/ext/ewaysingle/images/screenshot.png b/civicrm/ext/ewaysingle/images/screenshot.png
new file mode 100644
index 0000000000000000000000000000000000000000..6765b696fa03249ac2cd605d5f0e4aa000ad6dad
Binary files /dev/null and b/civicrm/ext/ewaysingle/images/screenshot.png differ
diff --git a/civicrm/ext/ewaysingle/info.xml b/civicrm/ext/ewaysingle/info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7e9daa1dd5bad7a9bb2beae521981ee5d4bbdd07
--- /dev/null
+++ b/civicrm/ext/ewaysingle/info.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<extension key="ewaysingle" type="module">
+  <file>ewaysingle</file>
+  <name>eway Single currency extension</name>
+  <description>Extension to contain the eWAY single currency Payment Processor.</description>
+  <license>AGPL-3.0</license>
+  <maintainer>
+    <author>Seamus Lee</author>
+    <email>seamuslee001@gmail.com</email>
+  </maintainer>
+  <urls>
+    <url desc="Main Extension Page">https://github.com/civicrm/civicrm-core/blob/master/ext/ewayrecurring</url>
+    <url desc="Documentation">https://github.com/civicrm/civicrm-core/blob/master/ext/ewayrecurring</url>
+    <url desc="Support">https://github.com/civicrm/civicrm-core/blob/master/ext/ewayrecurring</url>
+    <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
+  </urls>
+  <releaseDate>2020-10-07</releaseDate>
+  <version>1.0</version>
+  <tags>
+    <tag>mgmt:hidden</tag>
+  </tags>
+  <develStage>stable</develStage>
+  <compatibility>
+    <ver>5.31</ver>
+  </compatibility>
+  <comments>This is an extension to contain the eWAY Single Currency Payment Processor</comments>
+  <classloader>
+    <psr4 prefix="Civi\" path="Civi"/>
+  </classloader>
+  <civix>
+    <namespace>CRM/Ewaysingle</namespace>
+  </civix>
+</extension>
diff --git a/civicrm/ext/ewaysingle/lib/eWAY/eWAY_GatewayRequest.php b/civicrm/ext/ewaysingle/lib/eWAY/eWAY_GatewayRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b977ceb21a88ef24b3f846bbf420a15e0afb32c
--- /dev/null
+++ b/civicrm/ext/ewaysingle/lib/eWAY/eWAY_GatewayRequest.php
@@ -0,0 +1,235 @@
+<?php
+
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 5                                                  |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM is distributed in the hope that it will be useful, but     |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of         |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
+ | See the GNU Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License and the CiviCRM Licensing Exception along                  |
+ | with this program; if not, contact CiviCRM LLC                     |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Licensed to CiviCRM under the Academic Free License version 3.0
+ * Written & Contributed by Dolphin Software P/L - March 2008
+ *
+ * 'eWAY_GatewayRequest.php' - Based on the standard supplied eWay sample code 'GatewayResponse.php'
+ *
+ * The only significant change from the original is that the 'CVN' field is uncommented,
+ * unlike the distributed sample code.
+ *
+ * ALSO: Added a 'GetTransactionNumber' function.
+ *
+ */
+use CRM_Ewaysingle_ExtensionUtil as E;
+
+class GatewayRequest {
+  public $txCustomerID = "";
+
+  public $txAmount = 0;
+
+  public $txCardholderName = "";
+
+  public $txCardNumber = "";
+
+  public $txCardExpiryMonth = "01";
+
+  public $txCardExpiryYear = "00";
+
+  public $txTransactionNumber = "";
+
+  public $txCardholderFirstName = "";
+
+  public $txCardholderLastName = "";
+
+  public $txCardholderEmailAddress = "";
+
+  public $txCardholderAddress = "";
+
+  public $txCardholderPostalCode = "";
+
+  public $txInvoiceReference = "";
+
+  public $txInvoiceDescription = "";
+
+  public $txCVN = "";
+
+  public $txOption1 = "";
+
+  public $txOption2 = "";
+
+  public $txOption3 = "";
+
+  public $txCustomerBillingCountry = "";
+
+  public $txCustomerIPAddress = "";
+
+  public function __construct() {
+    // Empty Constructor
+  }
+
+  public function GetTransactionNumber() {
+    return $this->txTransactionNumber;
+  }
+
+  public function EwayCustomerID($value) {
+    $this->txCustomerID = $value;
+  }
+
+  public function InvoiceAmount($value) {
+    $this->txAmount = $value;
+  }
+
+  public function CardHolderName($value) {
+    $this->txCardholderName = $value;
+  }
+
+  public function CardExpiryMonth($value) {
+    $this->txCardExpiryMonth = $value;
+  }
+
+  public function CardExpiryYear($value) {
+    $this->txCardExpiryYear = $value;
+  }
+
+  public function TransactionNumber($value) {
+    $this->txTransactionNumber = $value;
+  }
+
+  public function PurchaserFirstName($value) {
+    $this->txCardholderFirstName = $value;
+  }
+
+  public function PurchaserLastName($value) {
+    $this->txCardholderLastName = $value;
+  }
+
+  public function CardNumber($value) {
+    $this->txCardNumber = $value;
+  }
+
+  public function PurchaserAddress($value) {
+    $this->txCardholderAddress = $value;
+  }
+
+  public function PurchaserPostalCode($value) {
+    $this->txCardholderPostalCode = $value;
+  }
+
+  public function PurchaserEmailAddress($value) {
+    $this->txCardholderEmailAddress = $value;
+  }
+
+  public function InvoiceReference($value) {
+    $this->txInvoiceReference = $value;
+  }
+
+  public function InvoiceDescription($value) {
+    $this->txInvoiceDescription = $value;
+  }
+
+  public function CVN($value) {
+    $this->txCVN = $value;
+  }
+
+  public function EwayOption1($value) {
+    $this->txOption1 = $value;
+  }
+
+  public function EwayOption2($value) {
+    $this->txOption2 = $value;
+  }
+
+  public function EwayOption3($value) {
+    $this->txOption3 = $value;
+  }
+
+  public function CustomerBillingCountry($value) {
+    $this->txCustomerBillingCountry = $value;
+  }
+
+  public function CustomerIPAddress($value) {
+    $this->txCustomerIPAddress = $value;
+  }
+
+  public function ToXml() {
+    // We don't really need the overhead of creating an XML DOM object
+    // to really just concatenate a string together.
+
+    $xml = "<ewaygateway>";
+    $xml .= $this->CreateNode("ewayCustomerID", $this->txCustomerID);
+    $xml .= $this->CreateNode("ewayTotalAmount", $this->txAmount);
+    $xml .= $this->CreateNode("ewayCardHoldersName", $this->txCardholderName);
+    $xml .= $this->CreateNode("ewayCardNumber", $this->txCardNumber);
+    $xml .= $this->CreateNode("ewayCardExpiryMonth", $this->txCardExpiryMonth);
+    $xml .= $this->CreateNode("ewayCardExpiryYear", $this->txCardExpiryYear);
+    $xml .= $this->CreateNode("ewayTrxnNumber", $this->txTransactionNumber);
+    $xml .= $this->CreateNode("ewayCustomerInvoiceDescription", $this->txInvoiceDescription);
+    $xml .= $this->CreateNode("ewayCustomerFirstName", $this->txCardholderFirstName);
+    $xml .= $this->CreateNode("ewayCustomerLastName", $this->txCardholderLastName);
+    $xml .= $this->CreateNode("ewayCustomerEmail", $this->txCardholderEmailAddress);
+    $xml .= $this->CreateNode("ewayCustomerAddress", $this->txCardholderAddress);
+    $xml .= $this->CreateNode("ewayCustomerPostcode", $this->txCardholderPostalCode);
+    $xml .= $this->CreateNode("ewayCustomerInvoiceRef", $this->txInvoiceReference);
+    $xml .= $this->CreateNode("ewayCVN", $this->txCVN);
+    $xml .= $this->CreateNode("ewayOption1", $this->txOption1);
+    $xml .= $this->CreateNode("ewayOption2", $this->txOption2);
+    $xml .= $this->CreateNode("ewayOption3", $this->txOption3);
+    $xml .= $this->CreateNode("ewayCustomerIPAddress", $this->txCustomerIPAddress);
+    $xml .= $this->CreateNode("ewayCustomerBillingCountry", $this->txCustomerBillingCountry);
+    $xml .= "</ewaygateway>";
+
+    return $xml;
+  }
+
+  /**
+   * Builds a simple XML Node
+   *
+   * 'NodeName' is the anem of the node being created.
+   * 'NodeValue' is its value
+   *
+   */
+  public function CreateNode($NodeName, $NodeValue) {
+    $node = "<" . $NodeName . ">" . self::replaceEntities($NodeValue) . "</" . $NodeName . ">";
+    return $node;
+  }
+
+  /**
+   * replace XML entities
+   *
+   * <code>
+   * // replace XML entites:
+   * $string = self::replaceEntities('This string contains < & >.');
+   * </code>
+   *
+   * @param string $string          string where XML special chars
+   *                                should be replaced
+   *
+   * @return string string with replaced chars
+   */
+  public static function replaceEntities($string) {
+    return strtr($string, [
+      '&'  => '&amp;',
+      '>'  => '&gt;',
+      '<'  => '&lt;',
+      '"'  => '&quot;',
+      '\'' => '&apos;',
+    ]);
+  }
+
+}
diff --git a/civicrm/ext/ewaysingle/lib/eWAY/eWAY_GatewayResponse.php b/civicrm/ext/ewaysingle/lib/eWAY/eWAY_GatewayResponse.php
new file mode 100644
index 0000000000000000000000000000000000000000..08c16b284dc7efaa32ba3e6cd27bd6035f6dd195
--- /dev/null
+++ b/civicrm/ext/ewaysingle/lib/eWAY/eWAY_GatewayResponse.php
@@ -0,0 +1,150 @@
+<?php
+
+/*
+ +--------------------------------------------------------------------+
+ | CiviCRM version 5                                                  |
+ +--------------------------------------------------------------------+
+ | This file is a part of CiviCRM.                                    |
+ |                                                                    |
+ | CiviCRM is free software; you can copy, modify, and distribute it  |
+ | under the terms of the GNU Affero General Public License           |
+ | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
+ |                                                                    |
+ | CiviCRM is distributed in the hope that it will be useful, but     |
+ | WITHOUT ANY WARRANTY; without even the implied warranty of         |
+ | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
+ | See the GNU Affero General Public License for more details.        |
+ |                                                                    |
+ | You should have received a copy of the GNU Affero General Public   |
+ | License and the CiviCRM Licensing Exception along                  |
+ | with this program; if not, contact CiviCRM LLC                     |
+ | at info[AT]civicrm[DOT]org. If you have questions about the        |
+ | GNU Affero General Public License or the licensing of CiviCRM,     |
+ | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
+ +--------------------------------------------------------------------+
+ */
+
+/**
+ * Licensed to CiviCRM under the Academic Free License version 3.0
+ * Written & Contributed by Dolphin Software P/L - March 2008
+ *
+ * 'eWAY_GatewayResponse.php' - Loosley based on the standard supplied eWay sample code 'GatewayResponse.php'
+ *
+ * The 'simplexml_load_string' has been removed as it was causing major issues
+ * with Drupal V5.7 / CiviCRM 1.9 installtion's Home page.
+ * Filling the Home page with "Warning: session_start() [function.session-start]: Node no longer exists in ..." messages
+ *
+ * Found web reference indicating 'simplexml_load_string' was a probable cause.
+ * As soon as 'simplexml_load_string' was removed the problem fixed itself.
+ *
+ * Additionally the '$txStatus' var has been set as a string rather than a boolean.
+ * This is because the returned $params['trxn_result_code'] is in fact a string and not a boolean.
+ */
+class GatewayResponse {
+  public $txAmount              = 0;
+  public $txTransactionNumber   = "";
+  public $txInvoiceReference    = "";
+  public $txOption1             = "";
+  public $txOption2             = "";
+  public $txOption3             = "";
+  public $txStatus              = "";
+  public $txAuthCode            = "";
+  public $txError               = "";
+  public $txBeagleScore         = "";
+
+  public function __construct() {
+    // Empty Constructor
+  }
+
+  public function ProcessResponse($Xml) {
+    //$xtr = simplexml_load_string($Xml) or die ("Unable to load XML string!");
+
+    //$this->txError             = $xtr->ewayTrxnError;
+    //$this->txStatus            = $xtr->ewayTrxnStatus;
+    //$this->txTransactionNumber = $xtr->ewayTrxnNumber;
+    //$this->txOption1           = $xtr->ewayTrxnOption1;
+    //$this->txOption2           = $xtr->ewayTrxnOption2;
+    //$this->txOption3           = $xtr->ewayTrxnOption3;
+    //$this->txAmount            = $xtr->ewayReturnAmount;
+    //$this->txAuthCode          = $xtr->ewayAuthCode;
+    //$this->txInvoiceReference  = $xtr->ewayTrxnReference;
+
+    $this->txError             = self::GetNodeValue("ewayTrxnError", $Xml);
+    $this->txStatus            = self::GetNodeValue("ewayTrxnStatus", $Xml);
+    $this->txTransactionNumber = self::GetNodeValue("ewayTrxnNumber", $Xml);
+    $this->txOption1           = self::GetNodeValue("ewayTrxnOption1", $Xml);
+    $this->txOption2           = self::GetNodeValue("ewayTrxnOption2", $Xml);
+    $this->txOption3           = self::GetNodeValue("ewayTrxnOption3", $Xml);
+    $amount                    = self::GetNodeValue("ewayReturnAmount", $Xml);
+    $this->txAuthCode          = self::GetNodeValue("ewayAuthCode", $Xml);
+    $this->txInvoiceReference  = self::GetNodeValue("ewayTrxnReference", $Xml);
+    $this->txBeagleScore       = self::GetNodeValue("ewayBeagleScore", $Xml);
+    $this->txAmount = (int) $amount;
+  }
+
+  /**
+   * Simple function to use in place of the 'simplexml_load_string' call.
+   *
+   * It returns the NodeValue for a given NodeName
+   * or returns and empty string.
+   */
+  public function GetNodeValue($NodeName, &$strXML) {
+    $OpeningNodeName = "<" . $NodeName . ">";
+    $ClosingNodeName = "</" . $NodeName . ">";
+
+    $pos1 = stripos($strXML, $OpeningNodeName);
+    $pos2 = stripos($strXML, $ClosingNodeName);
+
+    if (($pos1 === FALSE) || ($pos2 === FALSE)) {
+      return "";
+    }
+
+    $pos1 += strlen($OpeningNodeName);
+    $len   = $pos2 - $pos1;
+
+    $return = substr($strXML, $pos1, $len);
+
+    return ($return);
+  }
+
+  public function TransactionNumber() {
+    return $this->txTransactionNumber;
+  }
+
+  public function InvoiceReference() {
+    return $this->txInvoiceReference;
+  }
+
+  public function Option1() {
+    return $this->txOption1;
+  }
+
+  public function Option2() {
+    return $this->txOption2;
+  }
+
+  public function Option3() {
+    return $this->txOption3;
+  }
+
+  public function AuthorisationCode() {
+    return $this->txAuthCode;
+  }
+
+  public function Error() {
+    return $this->txError;
+  }
+
+  public function Amount() {
+    return $this->txAmount;
+  }
+
+  public function Status() {
+    return $this->txStatus;
+  }
+
+  public function BeagleScore () {
+    return $this->txBeagleScore;
+  }
+
+}
diff --git a/civicrm/ext/ewaysingle/phpunit.xml.dist b/civicrm/ext/ewaysingle/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..fc8f870b723b86a3cdf77609656b6ce38d0288ce
--- /dev/null
+++ b/civicrm/ext/ewaysingle/phpunit.xml.dist
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" bootstrap="tests/phpunit/bootstrap.php">
+  <testsuites>
+    <testsuite name="My Test Suite">
+      <directory>./tests/phpunit</directory>
+    </testsuite>
+  </testsuites>
+  <filter>
+    <whitelist>
+      <directory suffix=".php">./</directory>
+    </whitelist>
+  </filter>
+  <listeners>
+    <listener class="Civi\Test\CiviTestListener">
+      <arguments/>
+    </listener>
+  </listeners>
+</phpunit>
diff --git a/civicrm/ext/ewaysingle/tests/phpunit/CRM/Core/Payment/EwayTest.php b/civicrm/ext/ewaysingle/tests/phpunit/CRM/Core/Payment/EwayTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..6591c5bb16766a14576ff07e30193f4df1079d82
--- /dev/null
+++ b/civicrm/ext/ewaysingle/tests/phpunit/CRM/Core/Payment/EwayTest.php
@@ -0,0 +1,212 @@
+<?php
+
+use CRM_Ewaysingle_ExtensionUtil as E;
+use Civi\Test\HeadlessInterface;
+use Civi\Test\HookInterface;
+
+/**
+ * FIXME - Add test description.
+ *
+ * Tips:
+ *  - With HookInterface, you may implement CiviCRM hooks directly in the test class.
+ *    Simply create corresponding functions (e.g. "hook_civicrm_post(...)" or similar).
+ *  - With TransactionalInterface, any data changes made by setUp() or test****() functions will
+ *    rollback automatically -- as long as you don't manipulate schema or truncate tables.
+ *    If this test needs to manipulate schema or truncate tables, then either:
+ *       a. Do all that using setupHeadless() and Civi\Test.
+ *       b. Disable TransactionalInterface, and handle all setup/teardown yourself.
+ *
+ * @group headless
+ */
+class CRM_Core_Payment_EwayTest extends \PHPUnit\Framework\TestCase implements HeadlessInterface, HookInterface {
+
+  use \Civi\Test\GuzzleTestTrait;
+  use \Civi\Test\Api3TestTrait;
+
+  public function setUpHeadless() {
+    // Civi\Test has many helpers, like install(), uninstall(), sql(), and sqlFile().
+    // See: https://docs.civicrm.org/dev/en/latest/testing/phpunit/#civitest
+    return \Civi\Test::headless()
+      ->installMe(__DIR__)
+      ->apply();
+  }
+
+  public function setUp() {
+    $this->setUpEwayProcessor();
+    $this->processor = \Civi\Payment\System::singleton()->getById($this->ids['PaymentProcessor']['eWAY']);
+    parent::setUp();
+  }
+
+  public function tearDown() {
+    $this->callAPISuccess('PaymentProcessor', 'delete', ['id' => $this->ids['PaymentProcessor']['eWAY']]);
+    parent::tearDown();
+  }
+
+  /**
+   * Test making a once off payment
+   */
+  public function testSinglePayment() {
+    $this->setupMockHandler();
+    $params = $this->getBillingParams();
+    $params['amount'] = 10.00;
+    $params['currency'] = 'AUD';
+    $params['description'] = 'Test Contribution';
+    $params['invoiceID'] = 'xyz';
+    $params['email'] = 'unittesteway@civicrm.org';
+    $params['ip_address'] = '127.0.0.1';
+    foreach ($params as $key => $value) {
+      // Paypal is super special and requires this. Leaving out of the more generic
+      // get billing params for now to make it more obvious.
+      // When/if PropertyBag supports all the params paypal needs we can convert & simplify this.
+      $params[str_replace('-5', '', str_replace('billing_', '', $key))] = $value;
+    }
+    $params['state_province'] = 'NSW';
+    $params['country'] = 'AUS';
+    $this->processor->doPayment($params);
+    $this->assertEquals($this->getExpectedSinglePaymentRequests(), $this->getRequestBodies());
+  }
+
+  /**
+   * Test making a failed once off payment
+   */
+  public function testErrorSinglePayment() {
+    $this->setupMockHandler(NULL, TRUE);
+    $params = $this->getBillingParams();
+    $params['amount'] = 5.24;
+    $params['currency'] = 'AUD';
+    $params['description'] = 'Test Contribution';
+    $params['invoiceID'] = 'xyz';
+    $params['email'] = 'unittesteway@civicrm.org';
+    $params['ip_address'] = '127.0.0.1';
+    foreach ($params as $key => $value) {
+      // Paypal is super special and requires this. Leaving out of the more generic
+      // get billing params for now to make it more obvious.
+      // When/if PropertyBag supports all the params paypal needs we can convert & simplify this.
+      $params[str_replace('-5', '', str_replace('billing_', '', $key))] = $value;
+    }
+    $params['state_province'] = 'NSW';
+    $params['country'] = 'AUS';
+    try {
+      $this->processor->doPayment($params);
+      $this->fail('Test was meant to throw an exception');
+    }
+    catch (\Civi\Payment\Exception\PaymentProcessorException $e) {
+      $this->assertEquals('Error: [24] - Do Not Honour(Test Gateway).', $e->getMessage());
+      $this->assertEquals(9008, $e->getErrorCode());
+    }
+  }
+
+  /**
+   * Get some basic billing parameters.
+   *
+   * These are what are entered by the form-filler.
+   *
+   * @return array
+   */
+  protected function getBillingParams(): array {
+    return [
+      'billing_first_name' => 'John',
+      'billing_middle_name' => '',
+      'billing_last_name' => "O'Connor",
+      'billing_street_address-5' => '8 Hobbitton Road',
+      'billing_city-5' => 'The Shire',
+      'billing_state_province_id-5' => 1012,
+      'billing_postal_code-5' => 5010,
+      'billing_country_id-5' => 1228,
+      'credit_card_number' => '4444333322221111',
+      'cvv2' => 123,
+      'credit_card_exp_date' => [
+        'M' => 9,
+        'Y' => 2025,
+      ],
+      'credit_card_type' => 'Visa',
+      'year' => 2022,
+      'month' => 10,
+    ];
+  }
+
+  public function setUpEwayProcessor() {
+    $params = [
+      'name' => 'demo',
+      'domain_id' => CRM_Core_Config::domainID(),
+      'payment_processor_type_id' => 'eWAY',
+      'is_active' => 1,
+      'is_default' => 0,
+      'is_test' => 0,
+      'user_name' => '87654321',
+      'url_site' => 'https://www.eway.com.au/gateway/xmltest/testpage.asp',
+      'class_name' => 'Payment_eWAY',
+      'billing_mode' => 1,
+      'financial_type_id' => 1,
+      'financial_account_id' => 12,
+      // Credit card = 1 so can pass 'by accident'.
+      'payment_instrument_id' => 'Debit Card',
+    ];
+    if (!is_numeric($params['payment_processor_type_id'])) {
+      // really the api should handle this through getoptions but it's not exactly api call so lets just sort it
+      //here
+      $params['payment_processor_type_id'] = $this->callAPISuccess('payment_processor_type', 'getvalue', [
+        'name' => $params['payment_processor_type_id'],
+        'return' => 'id',
+      ], 'integer');
+    }
+    $result = $this->callAPISuccess('payment_processor', 'create', $params);
+    $processorID = $result['id'];
+    $this->setupMockHandler($processorID);
+    $this->ids['PaymentProcessor']['eWAY'] = $processorID;
+  }
+
+  /**
+   * Add a mock handler to the paypal Pro processor for testing.
+   *
+   * @param int|null $id
+   * @param bool $error
+   *
+   * @throws \CiviCRM_API3_Exception
+   */
+  protected function setupMockHandler($id = NULL, $error = FALSE) {
+    if ($id) {
+      $this->processor = Civi\Payment\System::singleton()->getById($id);
+    }
+    $responses = $error ? $this->getExpectedSinglePaymentErrorResponses() : $this->getExpectedSinglePaymentResponses();
+    // Comment the next line out when trying to capture the response.
+    // see https://github.com/civicrm/civicrm-core/pull/18350
+    $this->createMockHandler($responses);
+    $this->setUpClientWithHistoryContainer();
+    $this->processor->setGuzzleClient($this->getGuzzleClient());
+  }
+
+  /**
+   * Get the expected response from eWAY for a single payment.
+   *
+   * @return array
+   */
+  public function getExpectedSinglePaymentResponses() {
+    return [
+      '<ewayResponse><ewayTrxnStatus>True</ewayTrxnStatus><ewayTrxnNumber>10002</ewayTrxnNumber><ewayTrxnReference>xyz</ewayTrxnReference><ewayTrxnOption1/><ewayTrxnOption2/><ewayTrxnOption3/><ewayAuthCode>123456</ewayAuthCode><ewayReturnAmount>1000</ewayReturnAmount><ewayTrxnError>00,Transaction Approved(Test Gateway)</ewayTrxnError></ewayResponse>',
+    ];
+  }
+
+  /**
+   *  Get the expected request from eWAY.
+   *
+   * @return array
+   */
+  public function getExpectedSinglePaymentRequests() {
+    return [
+      '<ewaygateway><ewayCustomerID>87654321</ewayCustomerID><ewayTotalAmount>1000</ewayTotalAmount><ewayCardHoldersName>John O&apos;Connor</ewayCardHoldersName><ewayCardNumber>4444333322221111</ewayCardNumber><ewayCardExpiryMonth>10</ewayCardExpiryMonth><ewayCardExpiryYear>22</ewayCardExpiryYear><ewayTrxnNumber>xyz</ewayTrxnNumber><ewayCustomerInvoiceDescription>Test Contribution</ewayCustomerInvoiceDescription><ewayCustomerFirstName>John</ewayCustomerFirstName><ewayCustomerLastName>O&apos;Connor</ewayCustomerLastName><ewayCustomerEmail>unittesteway@civicrm.org</ewayCustomerEmail><ewayCustomerAddress>8 Hobbitton Road, The Shire, NSW.</ewayCustomerAddress><ewayCustomerPostcode>5010</ewayCustomerPostcode><ewayCustomerInvoiceRef>xyz</ewayCustomerInvoiceRef><ewayCVN>123</ewayCVN><ewayOption1></ewayOption1><ewayOption2></ewayOption2><ewayOption3></ewayOption3><ewayCustomerIPAddress>127.0.0.1</ewayCustomerIPAddress><ewayCustomerBillingCountry>AUS</ewayCustomerBillingCountry></ewaygateway>',
+    ];
+  }
+
+  /**
+   * Get the expected response from eWAY for a single payment.
+   *
+   * @return array
+   */
+  public function getExpectedSinglePaymentErrorResponses() {
+    return [
+      '<ewayResponse><ewayTrxnStatus>False</ewayTrxnStatus><ewayTrxnNumber>10003</ewayTrxnNumber><ewayTrxnReference>xyz</ewayTrxnReference><ewayTrxnOption1/><ewayTrxnOption2/><ewayTrxnOption3/><ewayAuthCode>123456</ewayAuthCode><ewayReturnAmount>524</ewayReturnAmount><ewayTrxnError>24,Do Not Honour(Test Gateway)</ewayTrxnError></ewayResponse>',
+    ];
+  }
+
+}
diff --git a/civicrm/ext/ewaysingle/tests/phpunit/bootstrap.php b/civicrm/ext/ewaysingle/tests/phpunit/bootstrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..a5b49253c819c5ab65947070e7ee67d0cac48ea1
--- /dev/null
+++ b/civicrm/ext/ewaysingle/tests/phpunit/bootstrap.php
@@ -0,0 +1,63 @@
+<?php
+
+ini_set('memory_limit', '2G');
+ini_set('safe_mode', 0);
+// phpcs:disable
+eval(cv('php:boot --level=classloader', 'phpcode'));
+// phpcs:enable
+// Allow autoloading of PHPUnit helper classes in this extension.
+$loader = new \Composer\Autoload\ClassLoader();
+$loader->add('CRM_', __DIR__);
+$loader->add('Civi\\', __DIR__);
+$loader->add('api_', __DIR__);
+$loader->add('api\\', __DIR__);
+$loader->register();
+
+/**
+ * Call the "cv" command.
+ *
+ * @param string $cmd
+ *   The rest of the command to send.
+ * @param string $decode
+ *   Ex: 'json' or 'phpcode'.
+ * @return string
+ *   Response output (if the command executed normally).
+ * @throws \RuntimeException
+ *   If the command terminates abnormally.
+ */
+function cv($cmd, $decode = 'json') {
+  $cmd = 'cv ' . $cmd;
+  $descriptorSpec = array(0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => STDERR);
+  $oldOutput = getenv('CV_OUTPUT');
+  putenv("CV_OUTPUT=json");
+
+  // Execute `cv` in the original folder. This is a work-around for
+  // phpunit/codeception, which seem to manipulate PWD.
+  $cmd = sprintf('cd %s; %s', escapeshellarg(getenv('PWD')), $cmd);
+
+  $process = proc_open($cmd, $descriptorSpec, $pipes, __DIR__);
+  putenv("CV_OUTPUT=$oldOutput");
+  fclose($pipes[0]);
+  $result = stream_get_contents($pipes[1]);
+  fclose($pipes[1]);
+  if (proc_close($process) !== 0) {
+    throw new RuntimeException("Command failed ($cmd):\n$result");
+  }
+  switch ($decode) {
+    case 'raw':
+      return $result;
+
+    case 'phpcode':
+      // If the last output is /*PHPCODE*/, then we managed to complete execution.
+      if (substr(trim($result), 0, 12) !== "/*BEGINPHP*/" || substr(trim($result), -10) !== "/*ENDPHP*/") {
+        throw new \RuntimeException("Command failed ($cmd):\n$result");
+      }
+      return $result;
+
+    case 'json':
+      return json_decode($result, 1);
+
+    default:
+      throw new RuntimeException("Bad decoder format ($decode)");
+  }
+}
diff --git a/civicrm/ext/financialacls/financialacls.php b/civicrm/ext/financialacls/financialacls.php
index b079114d9f6f775872bcf5c7c47598130daee7c5..c0edae5e58c12b4ff95002b722496cf4742fff0b 100644
--- a/civicrm/ext/financialacls/financialacls.php
+++ b/civicrm/ext/financialacls/financialacls.php
@@ -146,7 +146,7 @@ function financialacls_civicrm_themes(&$themes) {
 /**
  * Intervene to prevent deletion, where permissions block it.
  *
- * @param \CRM_Core_DAO $op
+ * @param string $op
  * @param string $objectName
  * @param int|null $id
  * @param array $params
@@ -155,14 +155,15 @@ function financialacls_civicrm_themes(&$themes) {
  * @throws \CRM_Core_Exception
  */
 function financialacls_civicrm_pre($op, $objectName, $id, &$params) {
-  if ($objectName === 'LineItem' && $op === 'delete' && !empty($params['check_permissions'])) {
+  if ($objectName === 'LineItem' && !empty($params['check_permissions'])) {
     if (CRM_Financial_BAO_FinancialType::isACLFinancialTypeStatus()) {
-      CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($types, CRM_Core_Action::DELETE);
+      $operationMap = ['delete' => CRM_Core_Action::DELETE, 'edit' => CRM_Core_Action::UPDATE, 'create' => CRM_Core_Action::ADD];
+      CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($types, $operationMap[$op]);
       if (empty($params['financial_type_id'])) {
         $params['financial_type_id'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_LineItem', $params['id'], 'financial_type_id');
       }
       if (!in_array($params['financial_type_id'], array_keys($types))) {
-        throw new API_Exception('You do not have permission to delete this line item');
+        throw new API_Exception('You do not have permission to ' . $op . ' this line item');
       }
     }
   }
diff --git a/civicrm/ext/financialacls/tests/phpunit/LineItemTest.php b/civicrm/ext/financialacls/tests/phpunit/LineItemTest.php
index 71eb6380c4d084b8183cacce60b2aa8ed20741b8..0c4c4b9c720fa8bd45b215f999d683207b582da6 100644
--- a/civicrm/ext/financialacls/tests/phpunit/LineItemTest.php
+++ b/civicrm/ext/financialacls/tests/phpunit/LineItemTest.php
@@ -39,11 +39,12 @@ class LineItemTest extends \PHPUnit\Framework\TestCase implements HeadlessInterf
 
   /**
    * Test api applies permissions on line item actions (delete & get).
+   * @dataProvider versionThreeAndFour
    */
-  public function testLineItemApiPermissions() {
+  public function testLineItemApiPermissions($version) {
     $contact1 = $this->individualCreate();
     $defaultPriceFieldID = $this->getDefaultPriceFieldID();
-    $this->callAPISuccess('Order', 'create', [
+    $order = $this->callAPISuccess('Order', 'create', [
       'financial_type_id' => 'Donation',
       'contact_id' => $contact1,
       'line_items' => [
@@ -65,6 +66,7 @@ class LineItemTest extends \PHPUnit\Framework\TestCase implements HeadlessInterf
         ],
       ],
     ]);
+    $this->_apiversion = $version;
 
     $this->setPermissions([
       'access CiviCRM',
@@ -73,6 +75,8 @@ class LineItemTest extends \PHPUnit\Framework\TestCase implements HeadlessInterf
       'delete in CiviContribute',
       'view contributions of type Donation',
       'delete contributions of type Donation',
+      'add contributions of type Donation',
+      'edit contributions of type Donation',
     ]);
     Civi::settings()->set('acl_financial_type', TRUE);
     $this->createLoggedInUser();
@@ -83,6 +87,22 @@ class LineItemTest extends \PHPUnit\Framework\TestCase implements HeadlessInterf
 
     $this->callAPISuccess('LineItem', 'Delete', ['check_permissions' => TRUE, 'id' => $lineItems[0]['id']]);
     $this->callAPIFailure('LineItem', 'Delete', ['check_permissions' => TRUE, 'id' => $lineItems[1]['id']]);
+    $lineParams = [
+      'entity_id' => $order['id'],
+      'entity_table' => 'civicrm_contribution',
+      'line_total' => 20,
+      'unit_price' => 20,
+      'price_field_id' => $defaultPriceFieldID,
+      'qty' => 1,
+      'financial_type_id' => 'Donation',
+      'check_permissions' => TRUE,
+    ];
+    $line = $this->callAPISuccess('LineItem', 'Create', $lineParams);
+    $lineParams['financial_type_id'] = 'Event Fee';
+    $this->callAPIFailure('LineItem', 'Create', $lineParams);
+
+    $this->callAPIFailure('LineItem', 'Create', ['id' => $line['id'], 'check_permissions' => TRUE, 'financial_type_id' => 'Event Fee']);
+    $this->callAPISuccess('LineItem', 'Create', ['id' => $line['id'], 'check_permissions' => TRUE, 'financial_type_id' => 'Donation']);
   }
 
   /**
diff --git a/civicrm/ext/greenwich/LICENSE.txt b/civicrm/ext/greenwich/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..eb71841a860d232b98804a8820254d2eedda212f
--- /dev/null
+++ b/civicrm/ext/greenwich/LICENSE.txt
@@ -0,0 +1,667 @@
+Package: greenwich
+Copyright (C) 2020, Tim Otten <totten@civicrm.org>
+Licensed under the GNU Affero Public License 3.0 (below).
+
+-------------------------------------------------------------------------------
+
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero General Public License from time to time.  Such new versions
+will be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<http://www.gnu.org/licenses/>.
diff --git a/civicrm/ext/greenwich/README.md b/civicrm/ext/greenwich/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c72c25d12df686a2d0384e772bf5c33f0bedaeb0
--- /dev/null
+++ b/civicrm/ext/greenwich/README.md
@@ -0,0 +1,20 @@
+# greenwich
+
+The `greenwich` theme-extension is bundled into `civicrm-core`.
+
+## Development
+
+This extension includes compiled (S)CSS content. It is compiled automatically via `composer`.
+Compiled files should *not* be committed to git. They will be generated during `composer install`.
+
+These commands will help during development:
+
+```bash
+cd /path/to/my/composer/root
+
+## Compile (S)CSS - one time
+composer compile
+
+## Compile (S)CSS - and continue watching for changes
+composer compile:watch
+```
diff --git a/civicrm/ext/greenwich/composer.compile.json b/civicrm/ext/greenwich/composer.compile.json
new file mode 100644
index 0000000000000000000000000000000000000000..5ddfeb155344ae51bd688bdbf260277a01c1cded
--- /dev/null
+++ b/civicrm/ext/greenwich/composer.compile.json
@@ -0,0 +1,14 @@
+{
+  "compile": [
+    {
+      "title": "Greenwich CSS (<comment>dist/bootstrap3.css</comment>)",
+      "run": [
+        "@php-eval \\CCL::copy('../../bower_components/select2/select2-bootstrap.css', 'extern/select2/select2-bootstrap.scss');",
+        "@php-method \\CCL\\Tasks::scss"
+      ],
+      "watch-files": ["scss", "../../bower_components/select2/select2-bootstrap.css"],
+      "scss-files": {"dist/bootstrap3.css": "scss/main.scss"},
+      "scss-imports": ["scss", "extern/bootstrap3/assets/stylesheets", "extern/select2"]
+    }
+  ]
+}
diff --git a/civicrm/ext/greenwich/dist/bootstrap3.css b/civicrm/ext/greenwich/dist/bootstrap3.css
new file mode 100644
index 0000000000000000000000000000000000000000..4d9b7f1efd089164ca21de63fffa5faf8903fc97
--- /dev/null
+++ b/civicrm/ext/greenwich/dist/bootstrap3.css
@@ -0,0 +1,7335 @@
+
+#bootstrap-theme {}
+
+#bootstrap-theme html {
+	font-family: sans-serif;
+	-ms-text-size-adjust: 100%;
+	-webkit-text-size-adjust: 100%;
+}
+
+#bootstrap-theme body {
+	margin: 0;
+}
+
+#bootstrap-theme article, #bootstrap-theme aside, #bootstrap-theme details, #bootstrap-theme figcaption, #bootstrap-theme figure, #bootstrap-theme footer, #bootstrap-theme header, #bootstrap-theme hgroup, #bootstrap-theme main, #bootstrap-theme menu, #bootstrap-theme nav, #bootstrap-theme section, #bootstrap-theme summary {
+	display: block;
+}
+
+#bootstrap-theme audio, #bootstrap-theme canvas, #bootstrap-theme progress, #bootstrap-theme video {
+	display: inline-block;
+	vertical-align: baseline;
+}
+
+#bootstrap-theme audio:not([controls]) {
+	display: none;
+	height: 0;
+}
+
+#bootstrap-theme [hidden], #bootstrap-theme template {
+	display: none;
+}
+
+#bootstrap-theme a {
+	background-color: transparent;
+}
+
+#bootstrap-theme a:active, #bootstrap-theme a:hover {
+	outline: 0;
+}
+
+#bootstrap-theme abbr[title] {
+	border-bottom: none;
+	text-decoration: underline;
+	text-decoration: underline dotted;
+}
+
+#bootstrap-theme b, #bootstrap-theme strong {
+	font-weight: bold;
+}
+
+#bootstrap-theme dfn {
+	font-style: italic;
+}
+
+#bootstrap-theme h1 {
+	font-size: 2em;
+	margin: .67em 0;
+}
+
+#bootstrap-theme mark {
+	background: #ff0;
+	color: #000;
+}
+
+#bootstrap-theme small {
+	font-size: 80%;
+}
+
+#bootstrap-theme sub, #bootstrap-theme sup {
+	font-size: 75%;
+	line-height: 0;
+	position: relative;
+	vertical-align: baseline;
+}
+
+#bootstrap-theme sup {
+	top: -.5em;
+}
+
+#bootstrap-theme sub {
+	bottom: -.25em;
+}
+
+#bootstrap-theme img {
+	border: 0;
+}
+
+#bootstrap-theme svg:not(:root) {
+	overflow: hidden;
+}
+
+#bootstrap-theme figure {
+	margin: 1em 40px;
+}
+
+#bootstrap-theme hr {
+	box-sizing: content-box;
+	height: 0;
+}
+
+#bootstrap-theme pre {
+	overflow: auto;
+}
+
+#bootstrap-theme code, #bootstrap-theme kbd, #bootstrap-theme pre, #bootstrap-theme samp {
+	font-family: monospace, monospace;
+	font-size: 1em;
+}
+
+#bootstrap-theme button, #bootstrap-theme input, #bootstrap-theme optgroup, #bootstrap-theme select, #bootstrap-theme textarea {
+	color: inherit;
+	font: inherit;
+	margin: 0;
+}
+
+#bootstrap-theme button {
+	overflow: visible;
+}
+
+#bootstrap-theme button, #bootstrap-theme select {
+	text-transform: none;
+}
+
+#bootstrap-theme button, #bootstrap-theme html input[type="button"], #bootstrap-theme input[type="reset"], #bootstrap-theme input[type="submit"] {
+	-webkit-appearance: button;
+	cursor: pointer;
+}
+
+#bootstrap-theme button[disabled], #bootstrap-theme html input[disabled] {
+	cursor: default;
+}
+
+#bootstrap-theme button::-moz-focus-inner, #bootstrap-theme input::-moz-focus-inner {
+	border: 0;
+	padding: 0;
+}
+
+#bootstrap-theme input {
+	line-height: normal;
+}
+
+#bootstrap-theme input[type="checkbox"], #bootstrap-theme input[type="radio"] {
+	box-sizing: border-box;
+	padding: 0;
+}
+
+#bootstrap-theme input[type="number"]::-webkit-inner-spin-button, #bootstrap-theme input[type="number"]::-webkit-outer-spin-button {
+	height: auto;
+}
+
+#bootstrap-theme input[type="search"] {
+	-webkit-appearance: textfield;
+	box-sizing: content-box;
+}
+
+#bootstrap-theme input[type="search"]::-webkit-search-cancel-button, #bootstrap-theme input[type="search"]::-webkit-search-decoration {
+	-webkit-appearance: none;
+}
+
+#bootstrap-theme fieldset {
+	border: 1px solid #c0c0c0;
+	margin: 0 2px;
+	padding: .35em .625em .75em;
+}
+
+#bootstrap-theme legend {
+	border: 0;
+	padding: 0;
+}
+
+#bootstrap-theme textarea {
+	overflow: auto;
+}
+
+#bootstrap-theme optgroup {
+	font-weight: bold;
+}
+
+#bootstrap-theme table {
+	border-collapse: collapse;
+	border-spacing: 0;
+}
+
+#bootstrap-theme td, #bootstrap-theme th {
+	padding: 0;
+}
+
+@media print {
+	#bootstrap-theme *, #bootstrap-theme *:before, #bootstrap-theme *:after {
+		color: #000 !important;
+		text-shadow: none !important;
+		background: transparent !important;
+		box-shadow: none !important;
+	}
+	
+	#bootstrap-theme a, #bootstrap-theme a:visited {
+		text-decoration: underline;
+	}
+	
+	#bootstrap-theme a[href]:after {
+		content: " (" attr(href) ")";
+	}
+	
+	#bootstrap-theme abbr[title]:after {
+		content: " (" attr(title) ")";
+	}
+	
+	#bootstrap-theme a[href^="#"]:after, #bootstrap-theme a[href^="javascript:"]:after {
+		content: "";
+	}
+	
+	#bootstrap-theme pre, #bootstrap-theme blockquote {
+		border: 1px solid #999;
+		page-break-inside: avoid;
+	}
+	
+	#bootstrap-theme thead {
+		display: table-header-group;
+	}
+	
+	#bootstrap-theme tr, #bootstrap-theme img {
+		page-break-inside: avoid;
+	}
+	
+	#bootstrap-theme img {
+		max-width: 100% !important;
+	}
+	
+	#bootstrap-theme p, #bootstrap-theme h2, #bootstrap-theme h3 {
+		orphans: 3;
+		widows: 3;
+	}
+	
+	#bootstrap-theme h2, #bootstrap-theme h3 {
+		page-break-after: avoid;
+	}
+	
+	#bootstrap-theme .navbar {
+		display: none;
+	}
+	
+	#bootstrap-theme .btn > .caret, #bootstrap-theme .dropup > .btn > .caret {
+		border-top-color: #000 !important;
+	}
+	
+	#bootstrap-theme .label {
+		border: 1px solid #000;
+	}
+	
+	#bootstrap-theme .table {
+		border-collapse: collapse !important;
+	}
+	
+	#bootstrap-theme .table td, #bootstrap-theme .table th {
+		background-color: #fff !important;
+	}
+	
+	#bootstrap-theme .table-bordered th, #bootstrap-theme .table-bordered td {
+		border: 1px solid #ddd !important;
+	}
+}
+
+@font-face {
+	font-family: "Glyphicons Halflings";
+	src: url("../fonts/glyphicons-halflings-regular.eot");
+	src: url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/glyphicons-halflings-regular.woff2") format("woff2"), url("../fonts/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg");
+}
+
+#bootstrap-theme .glyphicon {
+	position: relative;
+	top: 1px;
+	display: inline-block;
+	font-family: "Glyphicons Halflings";
+	font-style: normal;
+	font-weight: 400;
+	line-height: 1;
+	-webkit-font-smoothing: antialiased;
+	-moz-osx-font-smoothing: grayscale;
+}
+
+#bootstrap-theme .glyphicon-asterisk:before {
+	content: "*";
+}
+
+#bootstrap-theme .glyphicon-plus:before {
+	content: "+";
+}
+
+#bootstrap-theme .glyphicon-euro:before, #bootstrap-theme .glyphicon-eur:before {
+	content: "€";
+}
+
+#bootstrap-theme .glyphicon-minus:before {
+	content: "−";
+}
+
+#bootstrap-theme .glyphicon-cloud:before {
+	content: "☁";
+}
+
+#bootstrap-theme .glyphicon-envelope:before {
+	content: "✉";
+}
+
+#bootstrap-theme .glyphicon-pencil:before {
+	content: "✏";
+}
+
+#bootstrap-theme .glyphicon-glass:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-music:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-search:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-heart:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-star:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-star-empty:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-user:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-film:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-th-large:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-th:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-th-list:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-ok:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-remove:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-zoom-in:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-zoom-out:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-off:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-signal:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-cog:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-trash:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-home:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-file:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-time:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-road:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-download-alt:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-download:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-upload:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-inbox:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-play-circle:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-repeat:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-refresh:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-list-alt:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-lock:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-flag:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-headphones:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-volume-off:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-volume-down:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-volume-up:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-qrcode:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-barcode:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-tag:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-tags:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-book:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-bookmark:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-print:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-camera:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-font:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-bold:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-italic:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-text-height:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-text-width:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-align-left:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-align-center:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-align-right:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-align-justify:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-list:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-indent-left:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-indent-right:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-facetime-video:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-picture:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-map-marker:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-adjust:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-tint:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-edit:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-share:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-check:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-move:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-step-backward:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-fast-backward:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-backward:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-play:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-pause:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-stop:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-forward:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-fast-forward:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-step-forward:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-eject:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-chevron-left:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-chevron-right:before {
+	content: "î‚€";
+}
+
+#bootstrap-theme .glyphicon-plus-sign:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-minus-sign:before {
+	content: "î‚‚";
+}
+
+#bootstrap-theme .glyphicon-remove-sign:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-ok-sign:before {
+	content: "î‚„";
+}
+
+#bootstrap-theme .glyphicon-question-sign:before {
+	content: "î‚…";
+}
+
+#bootstrap-theme .glyphicon-info-sign:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-screenshot:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-remove-circle:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-ok-circle:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-ban-circle:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-arrow-left:before {
+	content: "î‚‘";
+}
+
+#bootstrap-theme .glyphicon-arrow-right:before {
+	content: "î‚’";
+}
+
+#bootstrap-theme .glyphicon-arrow-up:before {
+	content: "î‚“";
+}
+
+#bootstrap-theme .glyphicon-arrow-down:before {
+	content: "î‚”";
+}
+
+#bootstrap-theme .glyphicon-share-alt:before {
+	content: "î‚•";
+}
+
+#bootstrap-theme .glyphicon-resize-full:before {
+	content: "î‚–";
+}
+
+#bootstrap-theme .glyphicon-resize-small:before {
+	content: "î‚—";
+}
+
+#bootstrap-theme .glyphicon-exclamation-sign:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-gift:before {
+	content: "î„‚";
+}
+
+#bootstrap-theme .glyphicon-leaf:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-fire:before {
+	content: "î„„";
+}
+
+#bootstrap-theme .glyphicon-eye-open:before {
+	content: "î„…";
+}
+
+#bootstrap-theme .glyphicon-eye-close:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-warning-sign:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-plane:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-calendar:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-random:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-comment:before {
+	content: "î„‘";
+}
+
+#bootstrap-theme .glyphicon-magnet:before {
+	content: "î„’";
+}
+
+#bootstrap-theme .glyphicon-chevron-up:before {
+	content: "î„“";
+}
+
+#bootstrap-theme .glyphicon-chevron-down:before {
+	content: "î„”";
+}
+
+#bootstrap-theme .glyphicon-retweet:before {
+	content: "î„•";
+}
+
+#bootstrap-theme .glyphicon-shopping-cart:before {
+	content: "î„–";
+}
+
+#bootstrap-theme .glyphicon-folder-close:before {
+	content: "î„—";
+}
+
+#bootstrap-theme .glyphicon-folder-open:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-resize-vertical:before {
+	content: "î„™";
+}
+
+#bootstrap-theme .glyphicon-resize-horizontal:before {
+	content: "î„ ";
+}
+
+#bootstrap-theme .glyphicon-hdd:before {
+	content: "î„¡";
+}
+
+#bootstrap-theme .glyphicon-bullhorn:before {
+	content: "î„¢";
+}
+
+#bootstrap-theme .glyphicon-bell:before {
+	content: "î„£";
+}
+
+#bootstrap-theme .glyphicon-certificate:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-thumbs-up:before {
+	content: "î„¥";
+}
+
+#bootstrap-theme .glyphicon-thumbs-down:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-hand-right:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-hand-left:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-hand-up:before {
+	content: "î„©";
+}
+
+#bootstrap-theme .glyphicon-hand-down:before {
+	content: "î„°";
+}
+
+#bootstrap-theme .glyphicon-circle-arrow-right:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-circle-arrow-left:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-circle-arrow-up:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-circle-arrow-down:before {
+	content: "î„´";
+}
+
+#bootstrap-theme .glyphicon-globe:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-wrench:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-tasks:before {
+	content: "î„·";
+}
+
+#bootstrap-theme .glyphicon-filter:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-briefcase:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-fullscreen:before {
+	content: "î…€";
+}
+
+#bootstrap-theme .glyphicon-dashboard:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-paperclip:before {
+	content: "î…‚";
+}
+
+#bootstrap-theme .glyphicon-heart-empty:before {
+	content: "î…ƒ";
+}
+
+#bootstrap-theme .glyphicon-link:before {
+	content: "î…„";
+}
+
+#bootstrap-theme .glyphicon-phone:before {
+	content: "î……";
+}
+
+#bootstrap-theme .glyphicon-pushpin:before {
+	content: "î…†";
+}
+
+#bootstrap-theme .glyphicon-usd:before {
+	content: "î…ˆ";
+}
+
+#bootstrap-theme .glyphicon-gbp:before {
+	content: "î…‰";
+}
+
+#bootstrap-theme .glyphicon-sort:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-sort-by-alphabet:before {
+	content: "î…‘";
+}
+
+#bootstrap-theme .glyphicon-sort-by-alphabet-alt:before {
+	content: "î…’";
+}
+
+#bootstrap-theme .glyphicon-sort-by-order:before {
+	content: "î…“";
+}
+
+#bootstrap-theme .glyphicon-sort-by-order-alt:before {
+	content: "î…”";
+}
+
+#bootstrap-theme .glyphicon-sort-by-attributes:before {
+	content: "î…•";
+}
+
+#bootstrap-theme .glyphicon-sort-by-attributes-alt:before {
+	content: "î…–";
+}
+
+#bootstrap-theme .glyphicon-unchecked:before {
+	content: "î…—";
+}
+
+#bootstrap-theme .glyphicon-expand:before {
+	content: "î…˜";
+}
+
+#bootstrap-theme .glyphicon-collapse-down:before {
+	content: "î…™";
+}
+
+#bootstrap-theme .glyphicon-collapse-up:before {
+	content: "î… ";
+}
+
+#bootstrap-theme .glyphicon-log-in:before {
+	content: "î…¡";
+}
+
+#bootstrap-theme .glyphicon-flash:before {
+	content: "î…¢";
+}
+
+#bootstrap-theme .glyphicon-log-out:before {
+	content: "î…£";
+}
+
+#bootstrap-theme .glyphicon-new-window:before {
+	content: "î…¤";
+}
+
+#bootstrap-theme .glyphicon-record:before {
+	content: "î…¥";
+}
+
+#bootstrap-theme .glyphicon-save:before {
+	content: "î…¦";
+}
+
+#bootstrap-theme .glyphicon-open:before {
+	content: "î…§";
+}
+
+#bootstrap-theme .glyphicon-saved:before {
+	content: "î…¨";
+}
+
+#bootstrap-theme .glyphicon-import:before {
+	content: "î…©";
+}
+
+#bootstrap-theme .glyphicon-export:before {
+	content: "î…°";
+}
+
+#bootstrap-theme .glyphicon-send:before {
+	content: "î…±";
+}
+
+#bootstrap-theme .glyphicon-floppy-disk:before {
+	content: "î…²";
+}
+
+#bootstrap-theme .glyphicon-floppy-saved:before {
+	content: "î…³";
+}
+
+#bootstrap-theme .glyphicon-floppy-remove:before {
+	content: "î…´";
+}
+
+#bootstrap-theme .glyphicon-floppy-save:before {
+	content: "î…µ";
+}
+
+#bootstrap-theme .glyphicon-floppy-open:before {
+	content: "î…¶";
+}
+
+#bootstrap-theme .glyphicon-credit-card:before {
+	content: "î…·";
+}
+
+#bootstrap-theme .glyphicon-transfer:before {
+	content: "î…¸";
+}
+
+#bootstrap-theme .glyphicon-cutlery:before {
+	content: "î…¹";
+}
+
+#bootstrap-theme .glyphicon-header:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-compressed:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-earphone:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-phone-alt:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-tower:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-stats:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-sd-video:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-hd-video:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-subtitles:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-sound-stereo:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-sound-dolby:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-sound-5-1:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-sound-6-1:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-sound-7-1:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-copyright-mark:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-registration-mark:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-cloud-download:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-cloud-upload:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-tree-conifer:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-tree-deciduous:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-cd:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-save-file:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-open-file:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-level-up:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-copy:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-paste:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-alert:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-equalizer:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-king:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-queen:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-pawn:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-bishop:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-knight:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-baby-formula:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-tent:before {
+	content: "⛺";
+}
+
+#bootstrap-theme .glyphicon-blackboard:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-bed:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-apple:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-erase:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-hourglass:before {
+	content: "⌛";
+}
+
+#bootstrap-theme .glyphicon-lamp:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-duplicate:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-piggy-bank:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-scissors:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-bitcoin:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-btc:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-xbt:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-yen:before {
+	content: "Â¥";
+}
+
+#bootstrap-theme .glyphicon-jpy:before {
+	content: "Â¥";
+}
+
+#bootstrap-theme .glyphicon-ruble:before {
+	content: "₽";
+}
+
+#bootstrap-theme .glyphicon-rub:before {
+	content: "₽";
+}
+
+#bootstrap-theme .glyphicon-scale:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-ice-lolly:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-ice-lolly-tasted:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-education:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-option-horizontal:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-option-vertical:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-menu-hamburger:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-modal-window:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-oil:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-grain:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-sunglasses:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-text-size:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-text-color:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-text-background:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-object-align-top:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-object-align-bottom:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-object-align-horizontal:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-object-align-left:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-object-align-vertical:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-object-align-right:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-triangle-right:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-triangle-left:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-triangle-bottom:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-triangle-top:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-console:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-superscript:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-subscript:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-menu-left:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-menu-right:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-menu-down:before {
+	content: "";
+}
+
+#bootstrap-theme .glyphicon-menu-up:before {
+	content: "";
+}
+
+#bootstrap-theme * {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}
+
+#bootstrap-theme *:before, #bootstrap-theme *:after {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}
+
+#bootstrap-theme html {
+	font-size: 10px;
+	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+#bootstrap-theme body {
+	font-family: "Verdana", "Helvetica Neue", Helvetica, Arial, sans-serif;
+	font-size: 14px;
+	line-height: 1.428571429;
+	color: #555;
+	background-color: white;
+}
+
+#bootstrap-theme input, #bootstrap-theme button, #bootstrap-theme select, #bootstrap-theme textarea {
+	font-family: inherit;
+	font-size: inherit;
+	line-height: inherit;
+}
+
+#bootstrap-theme a {
+	color: black;
+	text-decoration: none;
+}
+
+#bootstrap-theme a:hover, #bootstrap-theme a:focus {
+	color: black;
+	text-decoration: underline;
+}
+
+#bootstrap-theme a:focus {
+	outline: 5px auto -webkit-focus-ring-color;
+	outline-offset: -2px;
+}
+
+#bootstrap-theme figure {
+	margin: 0;
+}
+
+#bootstrap-theme img {
+	vertical-align: middle;
+}
+
+#bootstrap-theme .img-responsive {
+	display: block;
+	max-width: 100%;
+	height: auto;
+}
+
+#bootstrap-theme .img-rounded {
+	border-radius: 6px;
+}
+
+#bootstrap-theme .img-thumbnail {
+	padding: 4px;
+	line-height: 1.428571429;
+	background-color: white;
+	border: 1px solid #ddd;
+	border-radius: 4px;
+	-webkit-transition: all .2s ease-in-out;
+	-o-transition: all .2s ease-in-out;
+	transition: all .2s ease-in-out;
+	display: inline-block;
+	max-width: 100%;
+	height: auto;
+}
+
+#bootstrap-theme .img-circle {
+	border-radius: 50%;
+}
+
+#bootstrap-theme hr {
+	margin-top: 20px;
+	margin-bottom: 20px;
+	border: 0;
+	border-top: 1px solid #eee;
+}
+
+#bootstrap-theme .sr-only {
+	position: absolute;
+	width: 1px;
+	height: 1px;
+	padding: 0;
+	margin: -1px;
+	overflow: hidden;
+	clip: rect(0, 0, 0, 0);
+	border: 0;
+}
+
+#bootstrap-theme .sr-only-focusable:active, #bootstrap-theme .sr-only-focusable:focus {
+	position: static;
+	width: auto;
+	height: auto;
+	margin: 0;
+	overflow: visible;
+	clip: auto;
+}
+
+#bootstrap-theme [role="button"] {
+	cursor: pointer;
+}
+
+#bootstrap-theme h1, #bootstrap-theme h2, #bootstrap-theme h3, #bootstrap-theme h4, #bootstrap-theme h5, #bootstrap-theme h6, #bootstrap-theme .h1, #bootstrap-theme .h2, #bootstrap-theme .h3, #bootstrap-theme .h4, #bootstrap-theme .h5, #bootstrap-theme .h6 {
+	font-family: "Verdana", "Helvetica Neue", Helvetica, Arial, sans-serif;
+	font-weight: 500;
+	line-height: 1.2;
+	color: black;
+}
+
+#bootstrap-theme h1 small, #bootstrap-theme h1 .small, #bootstrap-theme h2 small, #bootstrap-theme h2 .small, #bootstrap-theme h3 small, #bootstrap-theme h3 .small, #bootstrap-theme h4 small, #bootstrap-theme h4 .small, #bootstrap-theme h5 small, #bootstrap-theme h5 .small, #bootstrap-theme h6 small, #bootstrap-theme h6 .small, #bootstrap-theme .h1 small, #bootstrap-theme .h1 .small, #bootstrap-theme .h2 small, #bootstrap-theme .h2 .small, #bootstrap-theme .h3 small, #bootstrap-theme .h3 .small, #bootstrap-theme .h4 small, #bootstrap-theme .h4 .small, #bootstrap-theme .h5 small, #bootstrap-theme .h5 .small, #bootstrap-theme .h6 small, #bootstrap-theme .h6 .small {
+	font-weight: 400;
+	line-height: 1;
+	color: #999;
+}
+
+#bootstrap-theme h1, #bootstrap-theme .h1, #bootstrap-theme h2, #bootstrap-theme .h2, #bootstrap-theme h3, #bootstrap-theme .h3 {
+	margin-top: 20px;
+	margin-bottom: 10px;
+}
+
+#bootstrap-theme h1 small, #bootstrap-theme h1 .small, #bootstrap-theme .h1 small, #bootstrap-theme .h1 .small, #bootstrap-theme h2 small, #bootstrap-theme h2 .small, #bootstrap-theme .h2 small, #bootstrap-theme .h2 .small, #bootstrap-theme h3 small, #bootstrap-theme h3 .small, #bootstrap-theme .h3 small, #bootstrap-theme .h3 .small {
+	font-size: 65%;
+}
+
+#bootstrap-theme h4, #bootstrap-theme .h4, #bootstrap-theme h5, #bootstrap-theme .h5, #bootstrap-theme h6, #bootstrap-theme .h6 {
+	margin-top: 10px;
+	margin-bottom: 10px;
+}
+
+#bootstrap-theme h4 small, #bootstrap-theme h4 .small, #bootstrap-theme .h4 small, #bootstrap-theme .h4 .small, #bootstrap-theme h5 small, #bootstrap-theme h5 .small, #bootstrap-theme .h5 small, #bootstrap-theme .h5 .small, #bootstrap-theme h6 small, #bootstrap-theme h6 .small, #bootstrap-theme .h6 small, #bootstrap-theme .h6 .small {
+	font-size: 75%;
+}
+
+#bootstrap-theme h1, #bootstrap-theme .h1 {
+	font-size: 36px;
+}
+
+#bootstrap-theme h2, #bootstrap-theme .h2 {
+	font-size: 30px;
+}
+
+#bootstrap-theme h3, #bootstrap-theme .h3 {
+	font-size: 24px;
+}
+
+#bootstrap-theme h4, #bootstrap-theme .h4 {
+	font-size: 18px;
+}
+
+#bootstrap-theme h5, #bootstrap-theme .h5 {
+	font-size: 14px;
+}
+
+#bootstrap-theme h6, #bootstrap-theme .h6 {
+	font-size: 12px;
+}
+
+#bootstrap-theme p {
+	margin: 0 0 10px;
+}
+
+#bootstrap-theme .lead {
+	margin-bottom: 20px;
+	font-size: 16px;
+	font-weight: 300;
+	line-height: 1.4;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .lead {
+		font-size: 21px;
+	}
+}
+
+#bootstrap-theme small, #bootstrap-theme .small {
+	font-size: 85%;
+}
+
+#bootstrap-theme mark, #bootstrap-theme .mark {
+	padding: .2em;
+	background-color: #fcf8e3;
+}
+
+#bootstrap-theme .text-left {
+	text-align: left;
+}
+
+#bootstrap-theme .text-right {
+	text-align: right;
+}
+
+#bootstrap-theme .text-center {
+	text-align: center;
+}
+
+#bootstrap-theme .text-justify {
+	text-align: justify;
+}
+
+#bootstrap-theme .text-nowrap {
+	white-space: nowrap;
+}
+
+#bootstrap-theme .text-lowercase {
+	text-transform: lowercase;
+}
+
+#bootstrap-theme .text-uppercase, #bootstrap-theme .initialism {
+	text-transform: uppercase;
+}
+
+#bootstrap-theme .text-capitalize {
+	text-transform: capitalize;
+}
+
+#bootstrap-theme .text-muted {
+	color: #999;
+}
+
+#bootstrap-theme .text-primary {
+	color: black;
+}
+
+#bootstrap-theme a.text-primary:hover, #bootstrap-theme a.text-primary:focus {
+	color: black;
+}
+
+#bootstrap-theme .text-success {
+	color: #468847;
+}
+
+#bootstrap-theme a.text-success:hover, #bootstrap-theme a.text-success:focus {
+	color: #356635;
+}
+
+#bootstrap-theme .text-info {
+	color: #3a87ad;
+}
+
+#bootstrap-theme a.text-info:hover, #bootstrap-theme a.text-info:focus {
+	color: #2d6987;
+}
+
+#bootstrap-theme .text-warning {
+	color: #c09853;
+}
+
+#bootstrap-theme a.text-warning:hover, #bootstrap-theme a.text-warning:focus {
+	color: #a47e3c;
+}
+
+#bootstrap-theme .text-danger {
+	color: #b94a48;
+}
+
+#bootstrap-theme a.text-danger:hover, #bootstrap-theme a.text-danger:focus {
+	color: #953b39;
+}
+
+#bootstrap-theme .bg-primary {
+	color: #fff;
+}
+
+#bootstrap-theme .bg-primary {
+	background-color: black;
+}
+
+#bootstrap-theme a.bg-primary:hover, #bootstrap-theme a.bg-primary:focus {
+	background-color: black;
+}
+
+#bootstrap-theme .bg-success {
+	background-color: #dff0d8;
+}
+
+#bootstrap-theme a.bg-success:hover, #bootstrap-theme a.bg-success:focus {
+	background-color: #c1e2b3;
+}
+
+#bootstrap-theme .bg-info {
+	background-color: #d9edf7;
+}
+
+#bootstrap-theme a.bg-info:hover, #bootstrap-theme a.bg-info:focus {
+	background-color: #afd9ee;
+}
+
+#bootstrap-theme .bg-warning {
+	background-color: #fcf8e3;
+}
+
+#bootstrap-theme a.bg-warning:hover, #bootstrap-theme a.bg-warning:focus {
+	background-color: #f7ecb5;
+}
+
+#bootstrap-theme .bg-danger {
+	background-color: #f2dede;
+}
+
+#bootstrap-theme a.bg-danger:hover, #bootstrap-theme a.bg-danger:focus {
+	background-color: #e4b9b9;
+}
+
+#bootstrap-theme .page-header {
+	padding-bottom: 9px;
+	margin: 40px 0 20px;
+	border-bottom: 1px solid #eee;
+}
+
+#bootstrap-theme ul, #bootstrap-theme ol {
+	margin-top: 0;
+	margin-bottom: 10px;
+}
+
+#bootstrap-theme ul ul, #bootstrap-theme ul ol, #bootstrap-theme ol ul, #bootstrap-theme ol ol {
+	margin-bottom: 0;
+}
+
+#bootstrap-theme .list-unstyled {
+	padding-left: 0;
+	list-style: none;
+}
+
+#bootstrap-theme .list-inline {
+	padding-left: 0;
+	list-style: none;
+	margin-left: -5px;
+}
+
+#bootstrap-theme .list-inline > li {
+	display: inline-block;
+	padding-right: 5px;
+	padding-left: 5px;
+}
+
+#bootstrap-theme dl {
+	margin-top: 0;
+	margin-bottom: 20px;
+}
+
+#bootstrap-theme dt, #bootstrap-theme dd {
+	line-height: 1.428571429;
+}
+
+#bootstrap-theme dt {
+	font-weight: 700;
+}
+
+#bootstrap-theme dd {
+	margin-left: 0;
+}
+
+#bootstrap-theme .dl-horizontal dd:before, #bootstrap-theme .dl-horizontal dd:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .dl-horizontal dd:after {
+	clear: both;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .dl-horizontal dt {
+		float: left;
+		width: 160px;
+		clear: left;
+		text-align: right;
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+	
+	#bootstrap-theme .dl-horizontal dd {
+		margin-left: 180px;
+	}
+}
+
+#bootstrap-theme abbr[title], #bootstrap-theme abbr[data-original-title] {
+	cursor: help;
+}
+
+#bootstrap-theme .initialism {
+	font-size: 90%;
+}
+
+#bootstrap-theme blockquote {
+	padding: 10px 20px;
+	margin: 0 0 20px;
+	font-size: 17.5px;
+	border-left: 5px solid #eee;
+}
+
+#bootstrap-theme blockquote p:last-child, #bootstrap-theme blockquote ul:last-child, #bootstrap-theme blockquote ol:last-child {
+	margin-bottom: 0;
+}
+
+#bootstrap-theme blockquote footer, #bootstrap-theme blockquote small, #bootstrap-theme blockquote .small {
+	display: block;
+	font-size: 80%;
+	line-height: 1.428571429;
+	color: #999;
+}
+
+#bootstrap-theme blockquote footer:before, #bootstrap-theme blockquote small:before, #bootstrap-theme blockquote .small:before {
+	content: "—  ";
+}
+
+#bootstrap-theme .blockquote-reverse, #bootstrap-theme blockquote.pull-right {
+	padding-right: 15px;
+	padding-left: 0;
+	text-align: right;
+	border-right: 5px solid #eee;
+	border-left: 0;
+}
+
+#bootstrap-theme .blockquote-reverse footer:before, #bootstrap-theme .blockquote-reverse small:before, #bootstrap-theme .blockquote-reverse .small:before, #bootstrap-theme blockquote.pull-right footer:before, #bootstrap-theme blockquote.pull-right small:before, #bootstrap-theme blockquote.pull-right .small:before {
+	content: "";
+}
+
+#bootstrap-theme .blockquote-reverse footer:after, #bootstrap-theme .blockquote-reverse small:after, #bootstrap-theme .blockquote-reverse .small:after, #bootstrap-theme blockquote.pull-right footer:after, #bootstrap-theme blockquote.pull-right small:after, #bootstrap-theme blockquote.pull-right .small:after {
+	content: "  —";
+}
+
+#bootstrap-theme address {
+	margin-bottom: 20px;
+	font-style: normal;
+	line-height: 1.428571429;
+}
+
+#bootstrap-theme code, #bootstrap-theme kbd, #bootstrap-theme pre, #bootstrap-theme samp {
+	font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+
+#bootstrap-theme code {
+	padding: 2px 4px;
+	font-size: 90%;
+	color: #c7254e;
+	background-color: #f9f2f4;
+	border-radius: 4px;
+}
+
+#bootstrap-theme kbd {
+	padding: 2px 4px;
+	font-size: 90%;
+	color: white;
+	background-color: #333;
+	border-radius: 3px;
+	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+}
+
+#bootstrap-theme kbd kbd {
+	padding: 0;
+	font-size: 100%;
+	font-weight: 700;
+	box-shadow: none;
+}
+
+#bootstrap-theme pre {
+	display: block;
+	padding: 9.5px;
+	margin: 0 0 10px;
+	font-size: 13px;
+	line-height: 1.428571429;
+	color: #333;
+	-ms-word-break: break-all;
+	word-break: break-all;
+	word-wrap: break-word;
+	background-color: whitesmoke;
+	border: 1px solid #ccc;
+	border-radius: 4px;
+}
+
+#bootstrap-theme pre code {
+	padding: 0;
+	font-size: inherit;
+	color: inherit;
+	white-space: pre-wrap;
+	background-color: transparent;
+	border-radius: 0;
+}
+
+#bootstrap-theme .pre-scrollable {
+	max-height: 340px;
+	overflow-y: scroll;
+}
+
+#bootstrap-theme .container {
+	padding-right: 15px;
+	padding-left: 15px;
+	margin-right: auto;
+	margin-left: auto;
+}
+
+#bootstrap-theme .container:before, #bootstrap-theme .container:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .container:after {
+	clear: both;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .container {
+		width: 750px;
+	}
+}
+
+@media (min-width: 992px) {
+	#bootstrap-theme .container {
+		width: 970px;
+	}
+}
+
+@media (min-width: 1200px) {
+	#bootstrap-theme .container {
+		width: 1170px;
+	}
+}
+
+#bootstrap-theme .container-fluid {
+	padding-right: 15px;
+	padding-left: 15px;
+	margin-right: auto;
+	margin-left: auto;
+}
+
+#bootstrap-theme .container-fluid:before, #bootstrap-theme .container-fluid:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .container-fluid:after {
+	clear: both;
+}
+
+#bootstrap-theme .row {
+	margin-right: -15px;
+	margin-left: -15px;
+}
+
+#bootstrap-theme .row:before, #bootstrap-theme .row:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .row:after {
+	clear: both;
+}
+
+#bootstrap-theme .row-no-gutters {
+	margin-right: 0;
+	margin-left: 0;
+}
+
+#bootstrap-theme .row-no-gutters [class*="col-"] {
+	padding-right: 0;
+	padding-left: 0;
+}
+
+#bootstrap-theme .col-xs-1, #bootstrap-theme .col-sm-1, #bootstrap-theme .col-md-1, #bootstrap-theme .col-lg-1, #bootstrap-theme .col-xs-2, #bootstrap-theme .col-sm-2, #bootstrap-theme .col-md-2, #bootstrap-theme .col-lg-2, #bootstrap-theme .col-xs-3, #bootstrap-theme .col-sm-3, #bootstrap-theme .col-md-3, #bootstrap-theme .col-lg-3, #bootstrap-theme .col-xs-4, #bootstrap-theme .col-sm-4, #bootstrap-theme .col-md-4, #bootstrap-theme .col-lg-4, #bootstrap-theme .col-xs-5, #bootstrap-theme .col-sm-5, #bootstrap-theme .col-md-5, #bootstrap-theme .col-lg-5, #bootstrap-theme .col-xs-6, #bootstrap-theme .col-sm-6, #bootstrap-theme .col-md-6, #bootstrap-theme .col-lg-6, #bootstrap-theme .col-xs-7, #bootstrap-theme .col-sm-7, #bootstrap-theme .col-md-7, #bootstrap-theme .col-lg-7, #bootstrap-theme .col-xs-8, #bootstrap-theme .col-sm-8, #bootstrap-theme .col-md-8, #bootstrap-theme .col-lg-8, #bootstrap-theme .col-xs-9, #bootstrap-theme .col-sm-9, #bootstrap-theme .col-md-9, #bootstrap-theme .col-lg-9, #bootstrap-theme .col-xs-10, #bootstrap-theme .col-sm-10, #bootstrap-theme .col-md-10, #bootstrap-theme .col-lg-10, #bootstrap-theme .col-xs-11, #bootstrap-theme .col-sm-11, #bootstrap-theme .col-md-11, #bootstrap-theme .col-lg-11, #bootstrap-theme .col-xs-12, #bootstrap-theme .col-sm-12, #bootstrap-theme .col-md-12, #bootstrap-theme .col-lg-12 {
+	position: relative;
+	min-height: 1px;
+	padding-right: 15px;
+	padding-left: 15px;
+}
+
+#bootstrap-theme .col-xs-1, #bootstrap-theme .col-xs-2, #bootstrap-theme .col-xs-3, #bootstrap-theme .col-xs-4, #bootstrap-theme .col-xs-5, #bootstrap-theme .col-xs-6, #bootstrap-theme .col-xs-7, #bootstrap-theme .col-xs-8, #bootstrap-theme .col-xs-9, #bootstrap-theme .col-xs-10, #bootstrap-theme .col-xs-11, #bootstrap-theme .col-xs-12 {
+	float: left;
+}
+
+#bootstrap-theme .col-xs-1 {
+	width: 8.3333333333%;
+}
+
+#bootstrap-theme .col-xs-2 {
+	width: 16.6666666667%;
+}
+
+#bootstrap-theme .col-xs-3 {
+	width: 25%;
+}
+
+#bootstrap-theme .col-xs-4 {
+	width: 33.3333333333%;
+}
+
+#bootstrap-theme .col-xs-5 {
+	width: 41.6666666667%;
+}
+
+#bootstrap-theme .col-xs-6 {
+	width: 50%;
+}
+
+#bootstrap-theme .col-xs-7 {
+	width: 58.3333333333%;
+}
+
+#bootstrap-theme .col-xs-8 {
+	width: 66.6666666667%;
+}
+
+#bootstrap-theme .col-xs-9 {
+	width: 75%;
+}
+
+#bootstrap-theme .col-xs-10 {
+	width: 83.3333333333%;
+}
+
+#bootstrap-theme .col-xs-11 {
+	width: 91.6666666667%;
+}
+
+#bootstrap-theme .col-xs-12 {
+	width: 100%;
+}
+
+#bootstrap-theme .col-xs-pull-0 {
+	right: auto;
+}
+
+#bootstrap-theme .col-xs-pull-1 {
+	right: 8.3333333333%;
+}
+
+#bootstrap-theme .col-xs-pull-2 {
+	right: 16.6666666667%;
+}
+
+#bootstrap-theme .col-xs-pull-3 {
+	right: 25%;
+}
+
+#bootstrap-theme .col-xs-pull-4 {
+	right: 33.3333333333%;
+}
+
+#bootstrap-theme .col-xs-pull-5 {
+	right: 41.6666666667%;
+}
+
+#bootstrap-theme .col-xs-pull-6 {
+	right: 50%;
+}
+
+#bootstrap-theme .col-xs-pull-7 {
+	right: 58.3333333333%;
+}
+
+#bootstrap-theme .col-xs-pull-8 {
+	right: 66.6666666667%;
+}
+
+#bootstrap-theme .col-xs-pull-9 {
+	right: 75%;
+}
+
+#bootstrap-theme .col-xs-pull-10 {
+	right: 83.3333333333%;
+}
+
+#bootstrap-theme .col-xs-pull-11 {
+	right: 91.6666666667%;
+}
+
+#bootstrap-theme .col-xs-pull-12 {
+	right: 100%;
+}
+
+#bootstrap-theme .col-xs-push-0 {
+	left: auto;
+}
+
+#bootstrap-theme .col-xs-push-1 {
+	left: 8.3333333333%;
+}
+
+#bootstrap-theme .col-xs-push-2 {
+	left: 16.6666666667%;
+}
+
+#bootstrap-theme .col-xs-push-3 {
+	left: 25%;
+}
+
+#bootstrap-theme .col-xs-push-4 {
+	left: 33.3333333333%;
+}
+
+#bootstrap-theme .col-xs-push-5 {
+	left: 41.6666666667%;
+}
+
+#bootstrap-theme .col-xs-push-6 {
+	left: 50%;
+}
+
+#bootstrap-theme .col-xs-push-7 {
+	left: 58.3333333333%;
+}
+
+#bootstrap-theme .col-xs-push-8 {
+	left: 66.6666666667%;
+}
+
+#bootstrap-theme .col-xs-push-9 {
+	left: 75%;
+}
+
+#bootstrap-theme .col-xs-push-10 {
+	left: 83.3333333333%;
+}
+
+#bootstrap-theme .col-xs-push-11 {
+	left: 91.6666666667%;
+}
+
+#bootstrap-theme .col-xs-push-12 {
+	left: 100%;
+}
+
+#bootstrap-theme .col-xs-offset-0 {
+	margin-left: 0%;
+}
+
+#bootstrap-theme .col-xs-offset-1 {
+	margin-left: 8.3333333333%;
+}
+
+#bootstrap-theme .col-xs-offset-2 {
+	margin-left: 16.6666666667%;
+}
+
+#bootstrap-theme .col-xs-offset-3 {
+	margin-left: 25%;
+}
+
+#bootstrap-theme .col-xs-offset-4 {
+	margin-left: 33.3333333333%;
+}
+
+#bootstrap-theme .col-xs-offset-5 {
+	margin-left: 41.6666666667%;
+}
+
+#bootstrap-theme .col-xs-offset-6 {
+	margin-left: 50%;
+}
+
+#bootstrap-theme .col-xs-offset-7 {
+	margin-left: 58.3333333333%;
+}
+
+#bootstrap-theme .col-xs-offset-8 {
+	margin-left: 66.6666666667%;
+}
+
+#bootstrap-theme .col-xs-offset-9 {
+	margin-left: 75%;
+}
+
+#bootstrap-theme .col-xs-offset-10 {
+	margin-left: 83.3333333333%;
+}
+
+#bootstrap-theme .col-xs-offset-11 {
+	margin-left: 91.6666666667%;
+}
+
+#bootstrap-theme .col-xs-offset-12 {
+	margin-left: 100%;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .col-sm-1, #bootstrap-theme .col-sm-2, #bootstrap-theme .col-sm-3, #bootstrap-theme .col-sm-4, #bootstrap-theme .col-sm-5, #bootstrap-theme .col-sm-6, #bootstrap-theme .col-sm-7, #bootstrap-theme .col-sm-8, #bootstrap-theme .col-sm-9, #bootstrap-theme .col-sm-10, #bootstrap-theme .col-sm-11, #bootstrap-theme .col-sm-12 {
+		float: left;
+	}
+	
+	#bootstrap-theme .col-sm-1 {
+		width: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-2 {
+		width: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-3 {
+		width: 25%;
+	}
+	
+	#bootstrap-theme .col-sm-4 {
+		width: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-5 {
+		width: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-6 {
+		width: 50%;
+	}
+	
+	#bootstrap-theme .col-sm-7 {
+		width: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-8 {
+		width: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-9 {
+		width: 75%;
+	}
+	
+	#bootstrap-theme .col-sm-10 {
+		width: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-11 {
+		width: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-12 {
+		width: 100%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-0 {
+		right: auto;
+	}
+	
+	#bootstrap-theme .col-sm-pull-1 {
+		right: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-2 {
+		right: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-3 {
+		right: 25%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-4 {
+		right: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-5 {
+		right: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-6 {
+		right: 50%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-7 {
+		right: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-8 {
+		right: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-9 {
+		right: 75%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-10 {
+		right: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-11 {
+		right: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-pull-12 {
+		right: 100%;
+	}
+	
+	#bootstrap-theme .col-sm-push-0 {
+		left: auto;
+	}
+	
+	#bootstrap-theme .col-sm-push-1 {
+		left: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-push-2 {
+		left: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-push-3 {
+		left: 25%;
+	}
+	
+	#bootstrap-theme .col-sm-push-4 {
+		left: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-push-5 {
+		left: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-push-6 {
+		left: 50%;
+	}
+	
+	#bootstrap-theme .col-sm-push-7 {
+		left: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-push-8 {
+		left: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-push-9 {
+		left: 75%;
+	}
+	
+	#bootstrap-theme .col-sm-push-10 {
+		left: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-push-11 {
+		left: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-push-12 {
+		left: 100%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-0 {
+		margin-left: 0%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-1 {
+		margin-left: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-2 {
+		margin-left: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-3 {
+		margin-left: 25%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-4 {
+		margin-left: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-5 {
+		margin-left: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-6 {
+		margin-left: 50%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-7 {
+		margin-left: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-8 {
+		margin-left: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-9 {
+		margin-left: 75%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-10 {
+		margin-left: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-11 {
+		margin-left: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-sm-offset-12 {
+		margin-left: 100%;
+	}
+}
+
+@media (min-width: 992px) {
+	#bootstrap-theme .col-md-1, #bootstrap-theme .col-md-2, #bootstrap-theme .col-md-3, #bootstrap-theme .col-md-4, #bootstrap-theme .col-md-5, #bootstrap-theme .col-md-6, #bootstrap-theme .col-md-7, #bootstrap-theme .col-md-8, #bootstrap-theme .col-md-9, #bootstrap-theme .col-md-10, #bootstrap-theme .col-md-11, #bootstrap-theme .col-md-12 {
+		float: left;
+	}
+	
+	#bootstrap-theme .col-md-1 {
+		width: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-2 {
+		width: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-3 {
+		width: 25%;
+	}
+	
+	#bootstrap-theme .col-md-4 {
+		width: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-5 {
+		width: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-6 {
+		width: 50%;
+	}
+	
+	#bootstrap-theme .col-md-7 {
+		width: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-8 {
+		width: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-9 {
+		width: 75%;
+	}
+	
+	#bootstrap-theme .col-md-10 {
+		width: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-11 {
+		width: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-12 {
+		width: 100%;
+	}
+	
+	#bootstrap-theme .col-md-pull-0 {
+		right: auto;
+	}
+	
+	#bootstrap-theme .col-md-pull-1 {
+		right: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-pull-2 {
+		right: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-pull-3 {
+		right: 25%;
+	}
+	
+	#bootstrap-theme .col-md-pull-4 {
+		right: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-pull-5 {
+		right: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-pull-6 {
+		right: 50%;
+	}
+	
+	#bootstrap-theme .col-md-pull-7 {
+		right: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-pull-8 {
+		right: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-pull-9 {
+		right: 75%;
+	}
+	
+	#bootstrap-theme .col-md-pull-10 {
+		right: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-pull-11 {
+		right: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-pull-12 {
+		right: 100%;
+	}
+	
+	#bootstrap-theme .col-md-push-0 {
+		left: auto;
+	}
+	
+	#bootstrap-theme .col-md-push-1 {
+		left: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-push-2 {
+		left: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-push-3 {
+		left: 25%;
+	}
+	
+	#bootstrap-theme .col-md-push-4 {
+		left: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-push-5 {
+		left: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-push-6 {
+		left: 50%;
+	}
+	
+	#bootstrap-theme .col-md-push-7 {
+		left: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-push-8 {
+		left: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-push-9 {
+		left: 75%;
+	}
+	
+	#bootstrap-theme .col-md-push-10 {
+		left: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-push-11 {
+		left: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-push-12 {
+		left: 100%;
+	}
+	
+	#bootstrap-theme .col-md-offset-0 {
+		margin-left: 0%;
+	}
+	
+	#bootstrap-theme .col-md-offset-1 {
+		margin-left: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-offset-2 {
+		margin-left: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-offset-3 {
+		margin-left: 25%;
+	}
+	
+	#bootstrap-theme .col-md-offset-4 {
+		margin-left: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-offset-5 {
+		margin-left: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-offset-6 {
+		margin-left: 50%;
+	}
+	
+	#bootstrap-theme .col-md-offset-7 {
+		margin-left: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-offset-8 {
+		margin-left: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-offset-9 {
+		margin-left: 75%;
+	}
+	
+	#bootstrap-theme .col-md-offset-10 {
+		margin-left: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-md-offset-11 {
+		margin-left: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-md-offset-12 {
+		margin-left: 100%;
+	}
+}
+
+@media (min-width: 1200px) {
+	#bootstrap-theme .col-lg-1, #bootstrap-theme .col-lg-2, #bootstrap-theme .col-lg-3, #bootstrap-theme .col-lg-4, #bootstrap-theme .col-lg-5, #bootstrap-theme .col-lg-6, #bootstrap-theme .col-lg-7, #bootstrap-theme .col-lg-8, #bootstrap-theme .col-lg-9, #bootstrap-theme .col-lg-10, #bootstrap-theme .col-lg-11, #bootstrap-theme .col-lg-12 {
+		float: left;
+	}
+	
+	#bootstrap-theme .col-lg-1 {
+		width: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-2 {
+		width: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-3 {
+		width: 25%;
+	}
+	
+	#bootstrap-theme .col-lg-4 {
+		width: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-5 {
+		width: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-6 {
+		width: 50%;
+	}
+	
+	#bootstrap-theme .col-lg-7 {
+		width: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-8 {
+		width: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-9 {
+		width: 75%;
+	}
+	
+	#bootstrap-theme .col-lg-10 {
+		width: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-11 {
+		width: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-12 {
+		width: 100%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-0 {
+		right: auto;
+	}
+	
+	#bootstrap-theme .col-lg-pull-1 {
+		right: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-2 {
+		right: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-3 {
+		right: 25%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-4 {
+		right: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-5 {
+		right: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-6 {
+		right: 50%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-7 {
+		right: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-8 {
+		right: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-9 {
+		right: 75%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-10 {
+		right: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-11 {
+		right: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-pull-12 {
+		right: 100%;
+	}
+	
+	#bootstrap-theme .col-lg-push-0 {
+		left: auto;
+	}
+	
+	#bootstrap-theme .col-lg-push-1 {
+		left: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-push-2 {
+		left: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-push-3 {
+		left: 25%;
+	}
+	
+	#bootstrap-theme .col-lg-push-4 {
+		left: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-push-5 {
+		left: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-push-6 {
+		left: 50%;
+	}
+	
+	#bootstrap-theme .col-lg-push-7 {
+		left: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-push-8 {
+		left: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-push-9 {
+		left: 75%;
+	}
+	
+	#bootstrap-theme .col-lg-push-10 {
+		left: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-push-11 {
+		left: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-push-12 {
+		left: 100%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-0 {
+		margin-left: 0%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-1 {
+		margin-left: 8.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-2 {
+		margin-left: 16.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-3 {
+		margin-left: 25%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-4 {
+		margin-left: 33.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-5 {
+		margin-left: 41.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-6 {
+		margin-left: 50%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-7 {
+		margin-left: 58.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-8 {
+		margin-left: 66.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-9 {
+		margin-left: 75%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-10 {
+		margin-left: 83.3333333333%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-11 {
+		margin-left: 91.6666666667%;
+	}
+	
+	#bootstrap-theme .col-lg-offset-12 {
+		margin-left: 100%;
+	}
+}
+
+#bootstrap-theme table {
+	background-color: transparent;
+}
+
+#bootstrap-theme table col[class*="col-"] {
+	position: static;
+	display: table-column;
+	float: none;
+}
+
+#bootstrap-theme table td[class*="col-"], #bootstrap-theme table th[class*="col-"] {
+	position: static;
+	display: table-cell;
+	float: none;
+}
+
+#bootstrap-theme caption {
+	padding-top: 8px;
+	padding-bottom: 8px;
+	color: #999;
+	text-align: left;
+}
+
+#bootstrap-theme th {
+	text-align: left;
+}
+
+#bootstrap-theme .table {
+	width: 100%;
+	max-width: 100%;
+	margin-bottom: 20px;
+}
+
+#bootstrap-theme .table > thead > tr > th, #bootstrap-theme .table > thead > tr > td, #bootstrap-theme .table > tbody > tr > th, #bootstrap-theme .table > tbody > tr > td, #bootstrap-theme .table > tfoot > tr > th, #bootstrap-theme .table > tfoot > tr > td {
+	padding: 8px;
+	line-height: 1.428571429;
+	vertical-align: top;
+	border-top: 1px solid #ddd;
+}
+
+#bootstrap-theme .table > thead > tr > th {
+	vertical-align: bottom;
+	border-bottom: 2px solid #ddd;
+}
+
+#bootstrap-theme .table > caption + thead > tr:first-child > th, #bootstrap-theme .table > caption + thead > tr:first-child > td, #bootstrap-theme .table > colgroup + thead > tr:first-child > th, #bootstrap-theme .table > colgroup + thead > tr:first-child > td, #bootstrap-theme .table > thead:first-child > tr:first-child > th, #bootstrap-theme .table > thead:first-child > tr:first-child > td {
+	border-top: 0;
+}
+
+#bootstrap-theme .table > tbody + tbody {
+	border-top: 2px solid #ddd;
+}
+
+#bootstrap-theme .table .table {
+	background-color: white;
+}
+
+#bootstrap-theme .table-condensed > thead > tr > th, #bootstrap-theme .table-condensed > thead > tr > td, #bootstrap-theme .table-condensed > tbody > tr > th, #bootstrap-theme .table-condensed > tbody > tr > td, #bootstrap-theme .table-condensed > tfoot > tr > th, #bootstrap-theme .table-condensed > tfoot > tr > td {
+	padding: 5px;
+}
+
+#bootstrap-theme .table-bordered {
+	border: 1px solid #ddd;
+}
+
+#bootstrap-theme .table-bordered > thead > tr > th, #bootstrap-theme .table-bordered > thead > tr > td, #bootstrap-theme .table-bordered > tbody > tr > th, #bootstrap-theme .table-bordered > tbody > tr > td, #bootstrap-theme .table-bordered > tfoot > tr > th, #bootstrap-theme .table-bordered > tfoot > tr > td {
+	border: 1px solid #ddd;
+}
+
+#bootstrap-theme .table-bordered > thead > tr > th, #bootstrap-theme .table-bordered > thead > tr > td {
+	border-bottom-width: 2px;
+}
+
+#bootstrap-theme .table-striped > tbody > tr:nth-of-type(odd) {
+	background-color: #f9f9f9;
+}
+
+#bootstrap-theme .table-hover > tbody > tr:hover {
+	background-color: whitesmoke;
+}
+
+#bootstrap-theme .table > thead > tr > td.active, #bootstrap-theme .table > thead > tr > th.active, #bootstrap-theme .table > thead > tr.active > td, #bootstrap-theme .table > thead > tr.active > th, #bootstrap-theme .table > tbody > tr > td.active, #bootstrap-theme .table > tbody > tr > th.active, #bootstrap-theme .table > tbody > tr.active > td, #bootstrap-theme .table > tbody > tr.active > th, #bootstrap-theme .table > tfoot > tr > td.active, #bootstrap-theme .table > tfoot > tr > th.active, #bootstrap-theme .table > tfoot > tr.active > td, #bootstrap-theme .table > tfoot > tr.active > th {
+	background-color: whitesmoke;
+}
+
+#bootstrap-theme .table-hover > tbody > tr > td.active:hover, #bootstrap-theme .table-hover > tbody > tr > th.active:hover, #bootstrap-theme .table-hover > tbody > tr.active:hover > td, #bootstrap-theme .table-hover > tbody > tr:hover > .active, #bootstrap-theme .table-hover > tbody > tr.active:hover > th {
+	background-color: #e8e8e8;
+}
+
+#bootstrap-theme .table > thead > tr > td.success, #bootstrap-theme .table > thead > tr > th.success, #bootstrap-theme .table > thead > tr.success > td, #bootstrap-theme .table > thead > tr.success > th, #bootstrap-theme .table > tbody > tr > td.success, #bootstrap-theme .table > tbody > tr > th.success, #bootstrap-theme .table > tbody > tr.success > td, #bootstrap-theme .table > tbody > tr.success > th, #bootstrap-theme .table > tfoot > tr > td.success, #bootstrap-theme .table > tfoot > tr > th.success, #bootstrap-theme .table > tfoot > tr.success > td, #bootstrap-theme .table > tfoot > tr.success > th {
+	background-color: #dff0d8;
+}
+
+#bootstrap-theme .table-hover > tbody > tr > td.success:hover, #bootstrap-theme .table-hover > tbody > tr > th.success:hover, #bootstrap-theme .table-hover > tbody > tr.success:hover > td, #bootstrap-theme .table-hover > tbody > tr:hover > .success, #bootstrap-theme .table-hover > tbody > tr.success:hover > th {
+	background-color: #d0e9c6;
+}
+
+#bootstrap-theme .table > thead > tr > td.info, #bootstrap-theme .table > thead > tr > th.info, #bootstrap-theme .table > thead > tr.info > td, #bootstrap-theme .table > thead > tr.info > th, #bootstrap-theme .table > tbody > tr > td.info, #bootstrap-theme .table > tbody > tr > th.info, #bootstrap-theme .table > tbody > tr.info > td, #bootstrap-theme .table > tbody > tr.info > th, #bootstrap-theme .table > tfoot > tr > td.info, #bootstrap-theme .table > tfoot > tr > th.info, #bootstrap-theme .table > tfoot > tr.info > td, #bootstrap-theme .table > tfoot > tr.info > th {
+	background-color: #d9edf7;
+}
+
+#bootstrap-theme .table-hover > tbody > tr > td.info:hover, #bootstrap-theme .table-hover > tbody > tr > th.info:hover, #bootstrap-theme .table-hover > tbody > tr.info:hover > td, #bootstrap-theme .table-hover > tbody > tr:hover > .info, #bootstrap-theme .table-hover > tbody > tr.info:hover > th {
+	background-color: #c4e3f3;
+}
+
+#bootstrap-theme .table > thead > tr > td.warning, #bootstrap-theme .table > thead > tr > th.warning, #bootstrap-theme .table > thead > tr.warning > td, #bootstrap-theme .table > thead > tr.warning > th, #bootstrap-theme .table > tbody > tr > td.warning, #bootstrap-theme .table > tbody > tr > th.warning, #bootstrap-theme .table > tbody > tr.warning > td, #bootstrap-theme .table > tbody > tr.warning > th, #bootstrap-theme .table > tfoot > tr > td.warning, #bootstrap-theme .table > tfoot > tr > th.warning, #bootstrap-theme .table > tfoot > tr.warning > td, #bootstrap-theme .table > tfoot > tr.warning > th {
+	background-color: #fcf8e3;
+}
+
+#bootstrap-theme .table-hover > tbody > tr > td.warning:hover, #bootstrap-theme .table-hover > tbody > tr > th.warning:hover, #bootstrap-theme .table-hover > tbody > tr.warning:hover > td, #bootstrap-theme .table-hover > tbody > tr:hover > .warning, #bootstrap-theme .table-hover > tbody > tr.warning:hover > th {
+	background-color: #faf2cc;
+}
+
+#bootstrap-theme .table > thead > tr > td.danger, #bootstrap-theme .table > thead > tr > th.danger, #bootstrap-theme .table > thead > tr.danger > td, #bootstrap-theme .table > thead > tr.danger > th, #bootstrap-theme .table > tbody > tr > td.danger, #bootstrap-theme .table > tbody > tr > th.danger, #bootstrap-theme .table > tbody > tr.danger > td, #bootstrap-theme .table > tbody > tr.danger > th, #bootstrap-theme .table > tfoot > tr > td.danger, #bootstrap-theme .table > tfoot > tr > th.danger, #bootstrap-theme .table > tfoot > tr.danger > td, #bootstrap-theme .table > tfoot > tr.danger > th {
+	background-color: #f2dede;
+}
+
+#bootstrap-theme .table-hover > tbody > tr > td.danger:hover, #bootstrap-theme .table-hover > tbody > tr > th.danger:hover, #bootstrap-theme .table-hover > tbody > tr.danger:hover > td, #bootstrap-theme .table-hover > tbody > tr:hover > .danger, #bootstrap-theme .table-hover > tbody > tr.danger:hover > th {
+	background-color: #ebcccc;
+}
+
+#bootstrap-theme .table-responsive {
+	min-height: .01%;
+	overflow-x: auto;
+}
+
+@media screen and (max-width: 767px) {
+	#bootstrap-theme .table-responsive {
+		width: 100%;
+		margin-bottom: 15px;
+		overflow-y: hidden;
+		-ms-overflow-style: -ms-autohiding-scrollbar;
+		border: 1px solid #ddd;
+	}
+	
+	#bootstrap-theme .table-responsive > .table {
+		margin-bottom: 0;
+	}
+	
+	#bootstrap-theme .table-responsive > .table > thead > tr > th, #bootstrap-theme .table-responsive > .table > thead > tr > td, #bootstrap-theme .table-responsive > .table > tbody > tr > th, #bootstrap-theme .table-responsive > .table > tbody > tr > td, #bootstrap-theme .table-responsive > .table > tfoot > tr > th, #bootstrap-theme .table-responsive > .table > tfoot > tr > td {
+		white-space: nowrap;
+	}
+	
+	#bootstrap-theme .table-responsive > .table-bordered {
+		border: 0;
+	}
+	
+	#bootstrap-theme .table-responsive > .table-bordered > thead > tr > th:first-child, #bootstrap-theme .table-responsive > .table-bordered > thead > tr > td:first-child, #bootstrap-theme .table-responsive > .table-bordered > tbody > tr > th:first-child, #bootstrap-theme .table-responsive > .table-bordered > tbody > tr > td:first-child, #bootstrap-theme .table-responsive > .table-bordered > tfoot > tr > th:first-child, #bootstrap-theme .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+		border-left: 0;
+	}
+	
+	#bootstrap-theme .table-responsive > .table-bordered > thead > tr > th:last-child, #bootstrap-theme .table-responsive > .table-bordered > thead > tr > td:last-child, #bootstrap-theme .table-responsive > .table-bordered > tbody > tr > th:last-child, #bootstrap-theme .table-responsive > .table-bordered > tbody > tr > td:last-child, #bootstrap-theme .table-responsive > .table-bordered > tfoot > tr > th:last-child, #bootstrap-theme .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+		border-right: 0;
+	}
+	
+	#bootstrap-theme .table-responsive > .table-bordered > tbody > tr:last-child > th, #bootstrap-theme .table-responsive > .table-bordered > tbody > tr:last-child > td, #bootstrap-theme .table-responsive > .table-bordered > tfoot > tr:last-child > th, #bootstrap-theme .table-responsive > .table-bordered > tfoot > tr:last-child > td {
+		border-bottom: 0;
+	}
+}
+
+#bootstrap-theme fieldset {
+	min-width: 0;
+	padding: 0;
+	margin: 0;
+	border: 0;
+}
+
+#bootstrap-theme legend {
+	display: block;
+	width: 100%;
+	padding: 0;
+	margin-bottom: 20px;
+	font-size: 21px;
+	line-height: inherit;
+	color: #555;
+	border: 0;
+	border-bottom: 1px solid #e5e5e5;
+}
+
+#bootstrap-theme label {
+	display: inline-block;
+	max-width: 100%;
+	margin-bottom: 5px;
+	font-weight: 700;
+}
+
+#bootstrap-theme input[type="search"] {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+	-webkit-appearance: none;
+	-moz-appearance: none;
+	appearance: none;
+}
+
+#bootstrap-theme input[type="radio"], #bootstrap-theme input[type="checkbox"] {
+	margin: 4px 0 0;
+	margin-top: 1px \9;
+	line-height: normal;
+}
+
+#bootstrap-theme input[type="radio"][disabled], #bootstrap-theme input[type="radio"].disabled, fieldset[disabled] #bootstrap-theme input[type="radio"], #bootstrap-theme input[type="checkbox"][disabled], #bootstrap-theme input[type="checkbox"].disabled, fieldset[disabled] #bootstrap-theme input[type="checkbox"] {
+	cursor: not-allowed;
+}
+
+#bootstrap-theme input[type="file"] {
+	display: block;
+}
+
+#bootstrap-theme input[type="range"] {
+	display: block;
+	width: 100%;
+}
+
+#bootstrap-theme select[multiple], #bootstrap-theme select[size] {
+	height: auto;
+}
+
+#bootstrap-theme input[type="file"]:focus, #bootstrap-theme input[type="radio"]:focus, #bootstrap-theme input[type="checkbox"]:focus {
+	outline: 5px auto -webkit-focus-ring-color;
+	outline-offset: -2px;
+}
+
+#bootstrap-theme output {
+	display: block;
+	padding-top: 5px;
+	font-size: 14px;
+	line-height: 1.428571429;
+	color: #555;
+}
+
+#bootstrap-theme .form-control {
+	display: block;
+	width: 100%;
+	height: 30px;
+	padding: 4px 8px;
+	font-size: 14px;
+	line-height: 1.428571429;
+	color: #555;
+	background-color: white;
+	background-image: none;
+	border: 1px solid #ccc;
+	border-radius: 4px;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+	-webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+	-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+	transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
+}
+
+#bootstrap-theme .form-control:focus {
+	border-color: #66afe9;
+	outline: 0;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px rgba(102, 175, 233, .6);
+}
+
+#bootstrap-theme .form-control::-moz-placeholder {
+	color: #999;
+	opacity: 1;
+}
+
+#bootstrap-theme .form-control:-ms-input-placeholder {
+	color: #999;
+}
+
+#bootstrap-theme .form-control::-webkit-input-placeholder {
+	color: #999;
+}
+
+#bootstrap-theme .form-control::-ms-expand {
+	background-color: transparent;
+	border: 0;
+}
+
+#bootstrap-theme .form-control[disabled], #bootstrap-theme .form-control[readonly], fieldset[disabled] #bootstrap-theme .form-control {
+	background-color: #eee;
+	opacity: 1;
+}
+
+#bootstrap-theme .form-control[disabled], fieldset[disabled] #bootstrap-theme .form-control {
+	cursor: not-allowed;
+}
+
+#bootstrap-theme textarea.form-control {
+	height: auto;
+}
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+	#bootstrap-theme input[type="date"].form-control, #bootstrap-theme input[type="time"].form-control, #bootstrap-theme input[type="datetime-local"].form-control, #bootstrap-theme input[type="month"].form-control {
+		line-height: 30px;
+	}
+	
+	#bootstrap-theme input[type="date"].input-sm, #bootstrap-theme .input-group-sm > input.form-control[type="date"], #bootstrap-theme .input-group-sm > input.input-group-addon[type="date"], #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="date"], .input-group-sm #bootstrap-theme input[type="date"], #bootstrap-theme input[type="time"].input-sm, #bootstrap-theme .input-group-sm > input.form-control[type="time"], #bootstrap-theme .input-group-sm > input.input-group-addon[type="time"], #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="time"], .input-group-sm #bootstrap-theme input[type="time"], #bootstrap-theme input[type="datetime-local"].input-sm, #bootstrap-theme .input-group-sm > input.form-control[type="datetime-local"], #bootstrap-theme .input-group-sm > input.input-group-addon[type="datetime-local"], #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="datetime-local"], .input-group-sm #bootstrap-theme input[type="datetime-local"], #bootstrap-theme input[type="month"].input-sm, #bootstrap-theme .input-group-sm > input.form-control[type="month"], #bootstrap-theme .input-group-sm > input.input-group-addon[type="month"], #bootstrap-theme .input-group-sm > .input-group-btn > input.btn[type="month"], .input-group-sm #bootstrap-theme input[type="month"] {
+		line-height: 30px;
+	}
+	
+	#bootstrap-theme input[type="date"].input-lg, #bootstrap-theme .input-group-lg > input.form-control[type="date"], #bootstrap-theme .input-group-lg > input.input-group-addon[type="date"], #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="date"], .input-group-lg #bootstrap-theme input[type="date"], #bootstrap-theme input[type="time"].input-lg, #bootstrap-theme .input-group-lg > input.form-control[type="time"], #bootstrap-theme .input-group-lg > input.input-group-addon[type="time"], #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="time"], .input-group-lg #bootstrap-theme input[type="time"], #bootstrap-theme input[type="datetime-local"].input-lg, #bootstrap-theme .input-group-lg > input.form-control[type="datetime-local"], #bootstrap-theme .input-group-lg > input.input-group-addon[type="datetime-local"], #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="datetime-local"], .input-group-lg #bootstrap-theme input[type="datetime-local"], #bootstrap-theme input[type="month"].input-lg, #bootstrap-theme .input-group-lg > input.form-control[type="month"], #bootstrap-theme .input-group-lg > input.input-group-addon[type="month"], #bootstrap-theme .input-group-lg > .input-group-btn > input.btn[type="month"], .input-group-lg #bootstrap-theme input[type="month"] {
+		line-height: 54px;
+	}
+}
+
+#bootstrap-theme .form-group {
+	margin-bottom: 15px;
+}
+
+#bootstrap-theme .radio, #bootstrap-theme .checkbox {
+	position: relative;
+	display: block;
+	margin-top: 10px;
+	margin-bottom: 10px;
+}
+
+#bootstrap-theme .radio.disabled label, fieldset[disabled] #bootstrap-theme .radio label, #bootstrap-theme .checkbox.disabled label, fieldset[disabled] #bootstrap-theme .checkbox label {
+	cursor: not-allowed;
+}
+
+#bootstrap-theme .radio label, #bootstrap-theme .checkbox label {
+	min-height: 20px;
+	padding-left: 20px;
+	margin-bottom: 0;
+	font-weight: 400;
+	cursor: pointer;
+}
+
+#bootstrap-theme .radio input[type="radio"], #bootstrap-theme .radio-inline input[type="radio"], #bootstrap-theme .checkbox input[type="checkbox"], #bootstrap-theme .checkbox-inline input[type="checkbox"] {
+	position: absolute;
+	margin-top: 4px \9;
+	margin-left: -20px;
+}
+
+#bootstrap-theme .radio + .radio, #bootstrap-theme .checkbox + .checkbox {
+	margin-top: -5px;
+}
+
+#bootstrap-theme .radio-inline, #bootstrap-theme .checkbox-inline {
+	position: relative;
+	display: inline-block;
+	padding-left: 20px;
+	margin-bottom: 0;
+	font-weight: 400;
+	vertical-align: middle;
+	cursor: pointer;
+}
+
+#bootstrap-theme .radio-inline.disabled, fieldset[disabled] #bootstrap-theme .radio-inline, #bootstrap-theme .checkbox-inline.disabled, fieldset[disabled] #bootstrap-theme .checkbox-inline {
+	cursor: not-allowed;
+}
+
+#bootstrap-theme .radio-inline + .radio-inline, #bootstrap-theme .checkbox-inline + .checkbox-inline {
+	margin-top: 0;
+	margin-left: 10px;
+}
+
+#bootstrap-theme .form-control-static {
+	min-height: 34px;
+	padding-top: 5px;
+	padding-bottom: 5px;
+	margin-bottom: 0;
+}
+
+#bootstrap-theme .form-control-static.input-lg, #bootstrap-theme .input-group-lg > .form-control-static.form-control, #bootstrap-theme .input-group-lg > .form-control-static.input-group-addon, #bootstrap-theme .input-group-lg > .input-group-btn > .form-control-static.btn, #bootstrap-theme .form-control-static.input-sm, #bootstrap-theme .input-group-sm > .form-control-static.form-control, #bootstrap-theme .input-group-sm > .form-control-static.input-group-addon, #bootstrap-theme .input-group-sm > .input-group-btn > .form-control-static.btn {
+	padding-right: 0;
+	padding-left: 0;
+}
+
+#bootstrap-theme .input-sm, #bootstrap-theme .input-group-sm > .form-control, #bootstrap-theme .input-group-sm > .input-group-addon, #bootstrap-theme .input-group-sm > .input-group-btn > .btn {
+	height: 30px;
+	padding: 5px 10px;
+	font-size: 12px;
+	line-height: 1.5;
+	border-radius: 3px;
+}
+
+#bootstrap-theme select.input-sm, #bootstrap-theme .input-group-sm > select.form-control, #bootstrap-theme .input-group-sm > select.input-group-addon, #bootstrap-theme .input-group-sm > .input-group-btn > select.btn {
+	height: 30px;
+	line-height: 30px;
+}
+
+#bootstrap-theme textarea.input-sm, #bootstrap-theme .input-group-sm > textarea.form-control, #bootstrap-theme .input-group-sm > textarea.input-group-addon, #bootstrap-theme .input-group-sm > .input-group-btn > textarea.btn, #bootstrap-theme select[multiple].input-sm, #bootstrap-theme .input-group-sm > select.form-control[multiple], #bootstrap-theme .input-group-sm > select.input-group-addon[multiple], #bootstrap-theme .input-group-sm > .input-group-btn > select.btn[multiple] {
+	height: auto;
+}
+
+#bootstrap-theme .form-group-sm .form-control {
+	height: 30px;
+	padding: 5px 10px;
+	font-size: 12px;
+	line-height: 1.5;
+	border-radius: 3px;
+}
+
+#bootstrap-theme .form-group-sm select.form-control {
+	height: 30px;
+	line-height: 30px;
+}
+
+#bootstrap-theme .form-group-sm textarea.form-control, #bootstrap-theme .form-group-sm select[multiple].form-control {
+	height: auto;
+}
+
+#bootstrap-theme .form-group-sm .form-control-static {
+	height: 30px;
+	min-height: 32px;
+	padding: 6px 10px;
+	font-size: 12px;
+	line-height: 1.5;
+}
+
+#bootstrap-theme .input-lg, #bootstrap-theme .input-group-lg > .form-control, #bootstrap-theme .input-group-lg > .input-group-addon, #bootstrap-theme .input-group-lg > .input-group-btn > .btn {
+	height: 54px;
+	padding: 14px 16px;
+	font-size: 18px;
+	line-height: 1.3333333;
+	border-radius: 6px;
+}
+
+#bootstrap-theme select.input-lg, #bootstrap-theme .input-group-lg > select.form-control, #bootstrap-theme .input-group-lg > select.input-group-addon, #bootstrap-theme .input-group-lg > .input-group-btn > select.btn {
+	height: 54px;
+	line-height: 54px;
+}
+
+#bootstrap-theme textarea.input-lg, #bootstrap-theme .input-group-lg > textarea.form-control, #bootstrap-theme .input-group-lg > textarea.input-group-addon, #bootstrap-theme .input-group-lg > .input-group-btn > textarea.btn, #bootstrap-theme select[multiple].input-lg, #bootstrap-theme .input-group-lg > select.form-control[multiple], #bootstrap-theme .input-group-lg > select.input-group-addon[multiple], #bootstrap-theme .input-group-lg > .input-group-btn > select.btn[multiple] {
+	height: auto;
+}
+
+#bootstrap-theme .form-group-lg .form-control {
+	height: 54px;
+	padding: 14px 16px;
+	font-size: 18px;
+	line-height: 1.3333333;
+	border-radius: 6px;
+}
+
+#bootstrap-theme .form-group-lg select.form-control {
+	height: 54px;
+	line-height: 54px;
+}
+
+#bootstrap-theme .form-group-lg textarea.form-control, #bootstrap-theme .form-group-lg select[multiple].form-control {
+	height: auto;
+}
+
+#bootstrap-theme .form-group-lg .form-control-static {
+	height: 54px;
+	min-height: 38px;
+	padding: 15px 16px;
+	font-size: 18px;
+	line-height: 1.3333333;
+}
+
+#bootstrap-theme .has-feedback {
+	position: relative;
+}
+
+#bootstrap-theme .has-feedback .form-control {
+	padding-right: 37.5px;
+}
+
+#bootstrap-theme .form-control-feedback {
+	position: absolute;
+	top: 0;
+	right: 0;
+	z-index: 2;
+	display: block;
+	width: 30px;
+	height: 30px;
+	line-height: 30px;
+	text-align: center;
+	pointer-events: none;
+}
+
+#bootstrap-theme .input-lg + .form-control-feedback, #bootstrap-theme .input-group-lg > .form-control + .form-control-feedback, #bootstrap-theme .input-group-lg > .input-group-addon + .form-control-feedback, #bootstrap-theme .input-group-lg > .input-group-btn > .btn + .form-control-feedback, #bootstrap-theme .input-group-lg + .form-control-feedback, #bootstrap-theme .form-group-lg .form-control + .form-control-feedback {
+	width: 54px;
+	height: 54px;
+	line-height: 54px;
+}
+
+#bootstrap-theme .input-sm + .form-control-feedback, #bootstrap-theme .input-group-sm > .form-control + .form-control-feedback, #bootstrap-theme .input-group-sm > .input-group-addon + .form-control-feedback, #bootstrap-theme .input-group-sm > .input-group-btn > .btn + .form-control-feedback, #bootstrap-theme .input-group-sm + .form-control-feedback, #bootstrap-theme .form-group-sm .form-control + .form-control-feedback {
+	width: 30px;
+	height: 30px;
+	line-height: 30px;
+}
+
+#bootstrap-theme .has-success .help-block, #bootstrap-theme .has-success .control-label, #bootstrap-theme .has-success .radio, #bootstrap-theme .has-success .checkbox, #bootstrap-theme .has-success .radio-inline, #bootstrap-theme .has-success .checkbox-inline, #bootstrap-theme .has-success.radio label, #bootstrap-theme .has-success.checkbox label, #bootstrap-theme .has-success.radio-inline label, #bootstrap-theme .has-success.checkbox-inline label {
+	color: #468847;
+}
+
+#bootstrap-theme .has-success .form-control {
+	border-color: #468847;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+
+#bootstrap-theme .has-success .form-control:focus {
+	border-color: #356635;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #7aba7b;
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #7aba7b;
+}
+
+#bootstrap-theme .has-success .input-group-addon {
+	color: #468847;
+	background-color: #dff0d8;
+	border-color: #468847;
+}
+
+#bootstrap-theme .has-success .form-control-feedback {
+	color: #468847;
+}
+
+#bootstrap-theme .has-warning .help-block, #bootstrap-theme .has-warning .control-label, #bootstrap-theme .has-warning .radio, #bootstrap-theme .has-warning .checkbox, #bootstrap-theme .has-warning .radio-inline, #bootstrap-theme .has-warning .checkbox-inline, #bootstrap-theme .has-warning.radio label, #bootstrap-theme .has-warning.checkbox label, #bootstrap-theme .has-warning.radio-inline label, #bootstrap-theme .has-warning.checkbox-inline label {
+	color: #c09853;
+}
+
+#bootstrap-theme .has-warning .form-control {
+	border-color: #c09853;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+
+#bootstrap-theme .has-warning .form-control:focus {
+	border-color: #a47e3c;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #dbc59e;
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #dbc59e;
+}
+
+#bootstrap-theme .has-warning .input-group-addon {
+	color: #c09853;
+	background-color: #fcf8e3;
+	border-color: #c09853;
+}
+
+#bootstrap-theme .has-warning .form-control-feedback {
+	color: #c09853;
+}
+
+#bootstrap-theme .has-error .help-block, #bootstrap-theme .has-error .control-label, #bootstrap-theme .has-error .radio, #bootstrap-theme .has-error .checkbox, #bootstrap-theme .has-error .radio-inline, #bootstrap-theme .has-error .checkbox-inline, #bootstrap-theme .has-error.radio label, #bootstrap-theme .has-error.checkbox label, #bootstrap-theme .has-error.radio-inline label, #bootstrap-theme .has-error.checkbox-inline label {
+	color: #b94a48;
+}
+
+#bootstrap-theme .has-error .form-control {
+	border-color: #b94a48;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
+}
+
+#bootstrap-theme .has-error .form-control:focus {
+	border-color: #953b39;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #d59392;
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #d59392;
+}
+
+#bootstrap-theme .has-error .input-group-addon {
+	color: #b94a48;
+	background-color: #f2dede;
+	border-color: #b94a48;
+}
+
+#bootstrap-theme .has-error .form-control-feedback {
+	color: #b94a48;
+}
+
+#bootstrap-theme .has-feedback label ~ .form-control-feedback {
+	top: 25px;
+}
+
+#bootstrap-theme .has-feedback label.sr-only ~ .form-control-feedback {
+	top: 0;
+}
+
+#bootstrap-theme .help-block {
+	display: block;
+	margin-top: 5px;
+	margin-bottom: 10px;
+	color: #959595;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .form-inline .form-group {
+		display: inline-block;
+		margin-bottom: 0;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .form-inline .form-control {
+		display: inline-block;
+		width: auto;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .form-inline .form-control-static {
+		display: inline-block;
+	}
+	
+	#bootstrap-theme .form-inline .input-group {
+		display: inline-table;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .form-inline .input-group .input-group-addon, #bootstrap-theme .form-inline .input-group .input-group-btn, #bootstrap-theme .form-inline .input-group .form-control {
+		width: auto;
+	}
+	
+	#bootstrap-theme .form-inline .input-group > .form-control {
+		width: 100%;
+	}
+	
+	#bootstrap-theme .form-inline .control-label {
+		margin-bottom: 0;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .form-inline .radio, #bootstrap-theme .form-inline .checkbox {
+		display: inline-block;
+		margin-top: 0;
+		margin-bottom: 0;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .form-inline .radio label, #bootstrap-theme .form-inline .checkbox label {
+		padding-left: 0;
+	}
+	
+	#bootstrap-theme .form-inline .radio input[type="radio"], #bootstrap-theme .form-inline .checkbox input[type="checkbox"] {
+		position: relative;
+		margin-left: 0;
+	}
+	
+	#bootstrap-theme .form-inline .has-feedback .form-control-feedback {
+		top: 0;
+	}
+}
+
+#bootstrap-theme .form-horizontal .radio, #bootstrap-theme .form-horizontal .checkbox, #bootstrap-theme .form-horizontal .radio-inline, #bootstrap-theme .form-horizontal .checkbox-inline {
+	padding-top: 5px;
+	margin-top: 0;
+	margin-bottom: 0;
+}
+
+#bootstrap-theme .form-horizontal .radio, #bootstrap-theme .form-horizontal .checkbox {
+	min-height: 25px;
+}
+
+#bootstrap-theme .form-horizontal .form-group {
+	margin-right: -15px;
+	margin-left: -15px;
+}
+
+#bootstrap-theme .form-horizontal .form-group:before, #bootstrap-theme .form-horizontal .form-group:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .form-horizontal .form-group:after {
+	clear: both;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .form-horizontal .control-label {
+		padding-top: 5px;
+		margin-bottom: 0;
+		text-align: right;
+	}
+}
+
+#bootstrap-theme .form-horizontal .has-feedback .form-control-feedback {
+	right: 15px;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .form-horizontal .form-group-lg .control-label {
+		padding-top: 15px;
+		font-size: 18px;
+	}
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .form-horizontal .form-group-sm .control-label {
+		padding-top: 6px;
+		font-size: 12px;
+	}
+}
+
+#bootstrap-theme .btn {
+	display: inline-block;
+	margin-bottom: 0;
+	font-weight: normal;
+	text-align: center;
+	white-space: nowrap;
+	vertical-align: middle;
+	touch-action: manipulation;
+	cursor: pointer;
+	background-image: none;
+	border: 1px solid transparent;
+	padding: 4px 8px;
+	font-size: 14px;
+	line-height: 1.428571429;
+	border-radius: 4px;
+	-webkit-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+}
+
+#bootstrap-theme .btn:focus, #bootstrap-theme .btn.focus, #bootstrap-theme .btn:active:focus, #bootstrap-theme .btn:active.focus, #bootstrap-theme .btn.active:focus, #bootstrap-theme .btn.active.focus {
+	outline: 5px auto -webkit-focus-ring-color;
+	outline-offset: -2px;
+}
+
+#bootstrap-theme .btn:hover, #bootstrap-theme .btn:focus, #bootstrap-theme .btn.focus {
+	color: white;
+	text-decoration: none;
+}
+
+#bootstrap-theme .btn:active, #bootstrap-theme .btn.active {
+	background-image: none;
+	outline: 0;
+	-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+	box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+
+#bootstrap-theme .btn.disabled, #bootstrap-theme .btn[disabled], fieldset[disabled] #bootstrap-theme .btn {
+	cursor: not-allowed;
+	-webkit-filter: alpha(opacity=65);
+	filter: alpha(opacity=65);
+	opacity: .65;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+
+#bootstrap-theme a.btn.disabled, fieldset[disabled] #bootstrap-theme a.btn {
+	pointer-events: none;
+}
+
+#bootstrap-theme .btn-default {
+	color: white;
+	background-color: #70716b;
+	border-color: rgba(0, 0, 0, .1);
+}
+
+#bootstrap-theme .btn-default:focus, #bootstrap-theme .btn-default.focus {
+	color: white;
+	background-color: #565752;
+	border-color: rgba(0, 0, 0, .1);
+}
+
+#bootstrap-theme .btn-default:hover {
+	color: white;
+	background-color: #565752;
+	border-color: rgba(0, 0, 0, .1);
+}
+
+#bootstrap-theme .btn-default:active, #bootstrap-theme .btn-default.active, .open > #bootstrap-theme .btn-default.dropdown-toggle {
+	color: white;
+	background-color: #565752;
+	background-image: none;
+	border-color: rgba(0, 0, 0, .1);
+}
+
+#bootstrap-theme .btn-default:active:hover, #bootstrap-theme .btn-default:active:focus, #bootstrap-theme .btn-default:active.focus, #bootstrap-theme .btn-default.active:hover, #bootstrap-theme .btn-default.active:focus, #bootstrap-theme .btn-default.active.focus, .open > #bootstrap-theme .btn-default.dropdown-toggle:hover, .open > #bootstrap-theme .btn-default.dropdown-toggle:focus, .open > #bootstrap-theme .btn-default.dropdown-toggle.focus {
+	color: white;
+	background-color: #444441;
+	border-color: rgba(0, 0, 0, .1);
+}
+
+#bootstrap-theme .btn-default.disabled:hover, #bootstrap-theme .btn-default.disabled:focus, #bootstrap-theme .btn-default.disabled.focus, #bootstrap-theme .btn-default[disabled]:hover, #bootstrap-theme .btn-default[disabled]:focus, #bootstrap-theme .btn-default[disabled].focus, fieldset[disabled] #bootstrap-theme .btn-default:hover, fieldset[disabled] #bootstrap-theme .btn-default:focus, fieldset[disabled] #bootstrap-theme .btn-default.focus {
+	background-color: #70716b;
+	border-color: rgba(0, 0, 0, .1);
+}
+
+#bootstrap-theme .btn-default .badge {
+	color: #70716b;
+	background-color: white;
+}
+
+#bootstrap-theme .btn-primary {
+	color: white;
+	background-color: #70716b;
+	border-color: #70716b;
+}
+
+#bootstrap-theme .btn-primary:focus, #bootstrap-theme .btn-primary.focus {
+	color: white;
+	background-color: #565752;
+	border-color: #2f302d;
+}
+
+#bootstrap-theme .btn-primary:hover {
+	color: white;
+	background-color: #565752;
+	border-color: #51524d;
+}
+
+#bootstrap-theme .btn-primary:active, #bootstrap-theme .btn-primary.active, .open > #bootstrap-theme .btn-primary.dropdown-toggle {
+	color: white;
+	background-color: #565752;
+	background-image: none;
+	border-color: #51524d;
+}
+
+#bootstrap-theme .btn-primary:active:hover, #bootstrap-theme .btn-primary:active:focus, #bootstrap-theme .btn-primary:active.focus, #bootstrap-theme .btn-primary.active:hover, #bootstrap-theme .btn-primary.active:focus, #bootstrap-theme .btn-primary.active.focus, .open > #bootstrap-theme .btn-primary.dropdown-toggle:hover, .open > #bootstrap-theme .btn-primary.dropdown-toggle:focus, .open > #bootstrap-theme .btn-primary.dropdown-toggle.focus {
+	color: white;
+	background-color: #444441;
+	border-color: #2f302d;
+}
+
+#bootstrap-theme .btn-primary.disabled:hover, #bootstrap-theme .btn-primary.disabled:focus, #bootstrap-theme .btn-primary.disabled.focus, #bootstrap-theme .btn-primary[disabled]:hover, #bootstrap-theme .btn-primary[disabled]:focus, #bootstrap-theme .btn-primary[disabled].focus, fieldset[disabled] #bootstrap-theme .btn-primary:hover, fieldset[disabled] #bootstrap-theme .btn-primary:focus, fieldset[disabled] #bootstrap-theme .btn-primary.focus {
+	background-color: #70716b;
+	border-color: #70716b;
+}
+
+#bootstrap-theme .btn-primary .badge {
+	color: #70716b;
+	background-color: white;
+}
+
+#bootstrap-theme .btn-success {
+	color: white;
+	background-color: #73a839;
+	border-color: #73a839;
+}
+
+#bootstrap-theme .btn-success:focus, #bootstrap-theme .btn-success.focus {
+	color: white;
+	background-color: #59822c;
+	border-color: #324919;
+}
+
+#bootstrap-theme .btn-success:hover {
+	color: white;
+	background-color: #59822c;
+	border-color: #547a29;
+}
+
+#bootstrap-theme .btn-success:active, #bootstrap-theme .btn-success.active, .open > #bootstrap-theme .btn-success.dropdown-toggle {
+	color: white;
+	background-color: #59822c;
+	background-image: none;
+	border-color: #547a29;
+}
+
+#bootstrap-theme .btn-success:active:hover, #bootstrap-theme .btn-success:active:focus, #bootstrap-theme .btn-success:active.focus, #bootstrap-theme .btn-success.active:hover, #bootstrap-theme .btn-success.active:focus, #bootstrap-theme .btn-success.active.focus, .open > #bootstrap-theme .btn-success.dropdown-toggle:hover, .open > #bootstrap-theme .btn-success.dropdown-toggle:focus, .open > #bootstrap-theme .btn-success.dropdown-toggle.focus {
+	color: white;
+	background-color: #476723;
+	border-color: #324919;
+}
+
+#bootstrap-theme .btn-success.disabled:hover, #bootstrap-theme .btn-success.disabled:focus, #bootstrap-theme .btn-success.disabled.focus, #bootstrap-theme .btn-success[disabled]:hover, #bootstrap-theme .btn-success[disabled]:focus, #bootstrap-theme .btn-success[disabled].focus, fieldset[disabled] #bootstrap-theme .btn-success:hover, fieldset[disabled] #bootstrap-theme .btn-success:focus, fieldset[disabled] #bootstrap-theme .btn-success.focus {
+	background-color: #73a839;
+	border-color: #73a839;
+}
+
+#bootstrap-theme .btn-success .badge {
+	color: #73a839;
+	background-color: white;
+}
+
+#bootstrap-theme .btn-info {
+	color: white;
+	background-color: #cde8fe;
+	border-color: #cde8fe;
+}
+
+#bootstrap-theme .btn-info:focus, #bootstrap-theme .btn-info.focus {
+	color: white;
+	background-color: #9bd1fd;
+	border-color: #50affc;
+}
+
+#bootstrap-theme .btn-info:hover {
+	color: white;
+	background-color: #9bd1fd;
+	border-color: #91ccfd;
+}
+
+#bootstrap-theme .btn-info:active, #bootstrap-theme .btn-info.active, .open > #bootstrap-theme .btn-info.dropdown-toggle {
+	color: white;
+	background-color: #9bd1fd;
+	background-image: none;
+	border-color: #91ccfd;
+}
+
+#bootstrap-theme .btn-info:active:hover, #bootstrap-theme .btn-info:active:focus, #bootstrap-theme .btn-info:active.focus, #bootstrap-theme .btn-info.active:hover, #bootstrap-theme .btn-info.active:focus, #bootstrap-theme .btn-info.active.focus, .open > #bootstrap-theme .btn-info.dropdown-toggle:hover, .open > #bootstrap-theme .btn-info.dropdown-toggle:focus, .open > #bootstrap-theme .btn-info.dropdown-toggle.focus {
+	color: white;
+	background-color: #78c1fc;
+	border-color: #50affc;
+}
+
+#bootstrap-theme .btn-info.disabled:hover, #bootstrap-theme .btn-info.disabled:focus, #bootstrap-theme .btn-info.disabled.focus, #bootstrap-theme .btn-info[disabled]:hover, #bootstrap-theme .btn-info[disabled]:focus, #bootstrap-theme .btn-info[disabled].focus, fieldset[disabled] #bootstrap-theme .btn-info:hover, fieldset[disabled] #bootstrap-theme .btn-info:focus, fieldset[disabled] #bootstrap-theme .btn-info.focus {
+	background-color: #cde8fe;
+	border-color: #cde8fe;
+}
+
+#bootstrap-theme .btn-info .badge {
+	color: #cde8fe;
+	background-color: white;
+}
+
+#bootstrap-theme .btn-warning {
+	color: white;
+	background-color: #dd5600;
+	border-color: #dd5600;
+}
+
+#bootstrap-theme .btn-warning:focus, #bootstrap-theme .btn-warning.focus {
+	color: white;
+	background-color: #aa4200;
+	border-color: #5e2400;
+}
+
+#bootstrap-theme .btn-warning:hover {
+	color: white;
+	background-color: #aa4200;
+	border-color: #a03e00;
+}
+
+#bootstrap-theme .btn-warning:active, #bootstrap-theme .btn-warning.active, .open > #bootstrap-theme .btn-warning.dropdown-toggle {
+	color: white;
+	background-color: #aa4200;
+	background-image: none;
+	border-color: #a03e00;
+}
+
+#bootstrap-theme .btn-warning:active:hover, #bootstrap-theme .btn-warning:active:focus, #bootstrap-theme .btn-warning:active.focus, #bootstrap-theme .btn-warning.active:hover, #bootstrap-theme .btn-warning.active:focus, #bootstrap-theme .btn-warning.active.focus, .open > #bootstrap-theme .btn-warning.dropdown-toggle:hover, .open > #bootstrap-theme .btn-warning.dropdown-toggle:focus, .open > #bootstrap-theme .btn-warning.dropdown-toggle.focus {
+	color: white;
+	background-color: #863400;
+	border-color: #5e2400;
+}
+
+#bootstrap-theme .btn-warning.disabled:hover, #bootstrap-theme .btn-warning.disabled:focus, #bootstrap-theme .btn-warning.disabled.focus, #bootstrap-theme .btn-warning[disabled]:hover, #bootstrap-theme .btn-warning[disabled]:focus, #bootstrap-theme .btn-warning[disabled].focus, fieldset[disabled] #bootstrap-theme .btn-warning:hover, fieldset[disabled] #bootstrap-theme .btn-warning:focus, fieldset[disabled] #bootstrap-theme .btn-warning.focus {
+	background-color: #dd5600;
+	border-color: #dd5600;
+}
+
+#bootstrap-theme .btn-warning .badge {
+	color: #dd5600;
+	background-color: white;
+}
+
+#bootstrap-theme .btn-danger {
+	color: white;
+	background-color: #c71c22;
+	border-color: #c71c22;
+}
+
+#bootstrap-theme .btn-danger:focus, #bootstrap-theme .btn-danger.focus {
+	color: white;
+	background-color: #9a161a;
+	border-color: #570c0f;
+}
+
+#bootstrap-theme .btn-danger:hover {
+	color: white;
+	background-color: #9a161a;
+	border-color: #911419;
+}
+
+#bootstrap-theme .btn-danger:active, #bootstrap-theme .btn-danger.active, .open > #bootstrap-theme .btn-danger.dropdown-toggle {
+	color: white;
+	background-color: #9a161a;
+	background-image: none;
+	border-color: #911419;
+}
+
+#bootstrap-theme .btn-danger:active:hover, #bootstrap-theme .btn-danger:active:focus, #bootstrap-theme .btn-danger:active.focus, #bootstrap-theme .btn-danger.active:hover, #bootstrap-theme .btn-danger.active:focus, #bootstrap-theme .btn-danger.active.focus, .open > #bootstrap-theme .btn-danger.dropdown-toggle:hover, .open > #bootstrap-theme .btn-danger.dropdown-toggle:focus, .open > #bootstrap-theme .btn-danger.dropdown-toggle.focus {
+	color: white;
+	background-color: #7b1115;
+	border-color: #570c0f;
+}
+
+#bootstrap-theme .btn-danger.disabled:hover, #bootstrap-theme .btn-danger.disabled:focus, #bootstrap-theme .btn-danger.disabled.focus, #bootstrap-theme .btn-danger[disabled]:hover, #bootstrap-theme .btn-danger[disabled]:focus, #bootstrap-theme .btn-danger[disabled].focus, fieldset[disabled] #bootstrap-theme .btn-danger:hover, fieldset[disabled] #bootstrap-theme .btn-danger:focus, fieldset[disabled] #bootstrap-theme .btn-danger.focus {
+	background-color: #c71c22;
+	border-color: #c71c22;
+}
+
+#bootstrap-theme .btn-danger .badge {
+	color: #c71c22;
+	background-color: white;
+}
+
+#bootstrap-theme .btn-link {
+	font-weight: 400;
+	color: black;
+	border-radius: 0;
+}
+
+#bootstrap-theme .btn-link, #bootstrap-theme .btn-link:active, #bootstrap-theme .btn-link.active, #bootstrap-theme .btn-link[disabled], fieldset[disabled] #bootstrap-theme .btn-link {
+	background-color: transparent;
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+
+#bootstrap-theme .btn-link, #bootstrap-theme .btn-link:hover, #bootstrap-theme .btn-link:focus, #bootstrap-theme .btn-link:active {
+	border-color: transparent;
+}
+
+#bootstrap-theme .btn-link:hover, #bootstrap-theme .btn-link:focus {
+	color: black;
+	text-decoration: underline;
+	background-color: transparent;
+}
+
+#bootstrap-theme .btn-link[disabled]:hover, #bootstrap-theme .btn-link[disabled]:focus, fieldset[disabled] #bootstrap-theme .btn-link:hover, fieldset[disabled] #bootstrap-theme .btn-link:focus {
+	color: #999;
+	text-decoration: none;
+}
+
+#bootstrap-theme .btn-lg, #bootstrap-theme .btn-group-lg > .btn {
+	padding: 14px 16px;
+	font-size: 18px;
+	line-height: 1.3333333;
+	border-radius: 6px;
+}
+
+#bootstrap-theme .btn-sm, #bootstrap-theme .btn-group-sm > .btn {
+	padding: 5px 10px;
+	font-size: 12px;
+	line-height: 1.5;
+	border-radius: 3px;
+}
+
+#bootstrap-theme .btn-xs, #bootstrap-theme .btn-group-xs > .btn {
+	padding: 1px 5px;
+	font-size: 12px;
+	line-height: 1.5;
+	border-radius: 3px;
+}
+
+#bootstrap-theme .btn-block {
+	display: block;
+	width: 100%;
+}
+
+#bootstrap-theme .btn-block + .btn-block {
+	margin-top: 5px;
+}
+
+#bootstrap-theme input[type="submit"].btn-block, #bootstrap-theme input[type="reset"].btn-block, #bootstrap-theme input[type="button"].btn-block {
+	width: 100%;
+}
+
+#bootstrap-theme .fade {
+	opacity: 0;
+	-webkit-transition: opacity .15s linear;
+	-o-transition: opacity .15s linear;
+	transition: opacity .15s linear;
+}
+
+#bootstrap-theme .fade.in {
+	opacity: 1;
+}
+
+#bootstrap-theme .collapse {
+	display: none;
+}
+
+#bootstrap-theme .collapse.in {
+	display: block;
+}
+
+#bootstrap-theme tr.collapse.in {
+	display: table-row;
+}
+
+#bootstrap-theme tbody.collapse.in {
+	display: table-row-group;
+}
+
+#bootstrap-theme .collapsing {
+	position: relative;
+	height: 0;
+	overflow: hidden;
+	-webkit-transition-property: height, visibility;
+	transition-property: height, visibility;
+	-webkit-transition-duration: .35s;
+	transition-duration: .35s;
+	-webkit-transition-timing-function: ease;
+	transition-timing-function: ease;
+}
+
+#bootstrap-theme .caret {
+	display: inline-block;
+	width: 0;
+	height: 0;
+	margin-left: 2px;
+	vertical-align: middle;
+	border-top: 4px dashed;
+	border-top: 4px solid \9;
+	border-right: 4px solid transparent;
+	border-left: 4px solid transparent;
+}
+
+#bootstrap-theme .dropup, #bootstrap-theme .dropdown {
+	position: relative;
+}
+
+#bootstrap-theme .dropdown-toggle:focus {
+	outline: 0;
+}
+
+#bootstrap-theme .dropdown-menu {
+	position: absolute;
+	top: 100%;
+	left: 0;
+	z-index: 1000;
+	display: none;
+	float: left;
+	min-width: 160px;
+	padding: 5px 0;
+	margin: 2px 0 0;
+	font-size: 14px;
+	text-align: left;
+	list-style: none;
+	background-color: white;
+	-webkit-background-clip: padding-box;
+	background-clip: padding-box;
+	border: 1px solid #ccc;
+	border: 1px solid rgba(0, 0, 0, .15);
+	border-radius: 4px;
+	-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+	box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
+}
+
+#bootstrap-theme .dropdown-menu.pull-right {
+	right: 0;
+	left: auto;
+}
+
+#bootstrap-theme .dropdown-menu .divider {
+	height: 1px;
+	margin: 9px 0;
+	overflow: hidden;
+	background-color: #e5e5e5;
+}
+
+#bootstrap-theme .dropdown-menu > li > a {
+	display: block;
+	padding: 3px 20px;
+	clear: both;
+	font-weight: 400;
+	line-height: 1.428571429;
+	color: #333;
+	white-space: nowrap;
+}
+
+#bootstrap-theme .dropdown-menu > li > a:hover, #bootstrap-theme .dropdown-menu > li > a:focus {
+	color: white;
+	text-decoration: none;
+	background-color: black;
+}
+
+#bootstrap-theme .dropdown-menu > .active > a, #bootstrap-theme .dropdown-menu > .active > a:hover, #bootstrap-theme .dropdown-menu > .active > a:focus {
+	color: white;
+	text-decoration: none;
+	background-color: black;
+	outline: 0;
+}
+
+#bootstrap-theme .dropdown-menu > .disabled > a, #bootstrap-theme .dropdown-menu > .disabled > a:hover, #bootstrap-theme .dropdown-menu > .disabled > a:focus {
+	color: #999;
+}
+
+#bootstrap-theme .dropdown-menu > .disabled > a:hover, #bootstrap-theme .dropdown-menu > .disabled > a:focus {
+	text-decoration: none;
+	cursor: not-allowed;
+	background-color: transparent;
+	background-image: none;
+	-webkit-filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+	filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
+}
+
+#bootstrap-theme .open > .dropdown-menu {
+	display: block;
+}
+
+#bootstrap-theme .open > a {
+	outline: 0;
+}
+
+#bootstrap-theme .dropdown-menu-right {
+	right: 0;
+	left: auto;
+}
+
+#bootstrap-theme .dropdown-menu-left {
+	right: auto;
+	left: 0;
+}
+
+#bootstrap-theme .dropdown-header {
+	display: block;
+	padding: 3px 20px;
+	font-size: 12px;
+	line-height: 1.428571429;
+	color: #999;
+	white-space: nowrap;
+}
+
+#bootstrap-theme .dropdown-backdrop {
+	position: fixed;
+	top: 0;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	z-index: 990;
+}
+
+#bootstrap-theme .pull-right > .dropdown-menu {
+	right: 0;
+	left: auto;
+}
+
+#bootstrap-theme .dropup .caret, #bootstrap-theme .navbar-fixed-bottom .dropdown .caret {
+	content: "";
+	border-top: 0;
+	border-bottom: 4px dashed;
+	border-bottom: 4px solid \9;
+}
+
+#bootstrap-theme .dropup .dropdown-menu, #bootstrap-theme .navbar-fixed-bottom .dropdown .dropdown-menu {
+	top: auto;
+	bottom: 100%;
+	margin-bottom: 2px;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-right .dropdown-menu {
+		right: 0;
+		left: auto;
+	}
+	
+	#bootstrap-theme .navbar-right .dropdown-menu-left {
+		left: 0;
+		right: auto;
+	}
+}
+
+#bootstrap-theme .btn-group, #bootstrap-theme .btn-group-vertical {
+	position: relative;
+	display: inline-block;
+	vertical-align: middle;
+}
+
+#bootstrap-theme .btn-group > .btn, #bootstrap-theme .btn-group-vertical > .btn {
+	position: relative;
+	float: left;
+}
+
+#bootstrap-theme .btn-group > .btn:hover, #bootstrap-theme .btn-group > .btn:focus, #bootstrap-theme .btn-group > .btn:active, #bootstrap-theme .btn-group > .btn.active, #bootstrap-theme .btn-group-vertical > .btn:hover, #bootstrap-theme .btn-group-vertical > .btn:focus, #bootstrap-theme .btn-group-vertical > .btn:active, #bootstrap-theme .btn-group-vertical > .btn.active {
+	z-index: 2;
+}
+
+#bootstrap-theme .btn-group .btn + .btn, #bootstrap-theme .btn-group .btn + .btn-group, #bootstrap-theme .btn-group .btn-group + .btn, #bootstrap-theme .btn-group .btn-group + .btn-group {
+	margin-left: -1px;
+}
+
+#bootstrap-theme .btn-toolbar {
+	margin-left: -5px;
+}
+
+#bootstrap-theme .btn-toolbar:before, #bootstrap-theme .btn-toolbar:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .btn-toolbar:after {
+	clear: both;
+}
+
+#bootstrap-theme .btn-toolbar .btn, #bootstrap-theme .btn-toolbar .btn-group, #bootstrap-theme .btn-toolbar .input-group {
+	float: left;
+}
+
+#bootstrap-theme .btn-toolbar > .btn, #bootstrap-theme .btn-toolbar > .btn-group, #bootstrap-theme .btn-toolbar > .input-group {
+	margin-left: 5px;
+}
+
+#bootstrap-theme .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+	border-radius: 0;
+}
+
+#bootstrap-theme .btn-group > .btn:first-child {
+	margin-left: 0;
+}
+
+#bootstrap-theme .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
+	border-top-right-radius: 0;
+	border-bottom-right-radius: 0;
+}
+
+#bootstrap-theme .btn-group > .btn:last-child:not(:first-child), #bootstrap-theme .btn-group > .dropdown-toggle:not(:first-child) {
+	border-top-left-radius: 0;
+	border-bottom-left-radius: 0;
+}
+
+#bootstrap-theme .btn-group > .btn-group {
+	float: left;
+}
+
+#bootstrap-theme .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+	border-radius: 0;
+}
+
+#bootstrap-theme .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, #bootstrap-theme .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+	border-top-right-radius: 0;
+	border-bottom-right-radius: 0;
+}
+
+#bootstrap-theme .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+	border-top-left-radius: 0;
+	border-bottom-left-radius: 0;
+}
+
+#bootstrap-theme .btn-group .dropdown-toggle:active, #bootstrap-theme .btn-group.open .dropdown-toggle {
+	outline: 0;
+}
+
+#bootstrap-theme .btn-group > .btn + .dropdown-toggle {
+	padding-right: 8px;
+	padding-left: 8px;
+}
+
+#bootstrap-theme .btn-group > .btn-lg + .dropdown-toggle, #bootstrap-theme .btn-group-lg.btn-group > .btn + .dropdown-toggle, #bootstrap-theme .btn-group-lg > .btn-group > .btn + .dropdown-toggle {
+	padding-right: 12px;
+	padding-left: 12px;
+}
+
+#bootstrap-theme .btn-group.open .dropdown-toggle {
+	-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+	box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
+}
+
+#bootstrap-theme .btn-group.open .dropdown-toggle.btn-link {
+	-webkit-box-shadow: none;
+	box-shadow: none;
+}
+
+#bootstrap-theme .btn .caret {
+	margin-left: 0;
+}
+
+#bootstrap-theme .btn-lg .caret, #bootstrap-theme .btn-group-lg > .btn .caret {
+	border-width: 5px 5px 0;
+	border-bottom-width: 0;
+}
+
+#bootstrap-theme .dropup .btn-lg .caret, #bootstrap-theme .dropup .btn-group-lg > .btn .caret {
+	border-width: 0 5px 5px;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn, #bootstrap-theme .btn-group-vertical > .btn-group, #bootstrap-theme .btn-group-vertical > .btn-group > .btn {
+	display: block;
+	float: none;
+	width: 100%;
+	max-width: 100%;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn-group:before, #bootstrap-theme .btn-group-vertical > .btn-group:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .btn-group-vertical > .btn-group:after {
+	clear: both;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn-group > .btn {
+	float: none;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn + .btn, #bootstrap-theme .btn-group-vertical > .btn + .btn-group, #bootstrap-theme .btn-group-vertical > .btn-group + .btn, #bootstrap-theme .btn-group-vertical > .btn-group + .btn-group {
+	margin-top: -1px;
+	margin-left: 0;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn:not(:first-child):not(:last-child) {
+	border-radius: 0;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn:first-child:not(:last-child) {
+	border-top-left-radius: 4px;
+	border-top-right-radius: 4px;
+	border-bottom-right-radius: 0;
+	border-bottom-left-radius: 0;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn:last-child:not(:first-child) {
+	border-top-left-radius: 0;
+	border-top-right-radius: 0;
+	border-bottom-right-radius: 4px;
+	border-bottom-left-radius: 4px;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+	border-radius: 0;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, #bootstrap-theme .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
+	border-bottom-right-radius: 0;
+	border-bottom-left-radius: 0;
+}
+
+#bootstrap-theme .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+	border-top-left-radius: 0;
+	border-top-right-radius: 0;
+}
+
+#bootstrap-theme .btn-group-justified {
+	display: table;
+	width: 100%;
+	table-layout: fixed;
+	border-collapse: separate;
+}
+
+#bootstrap-theme .btn-group-justified > .btn, #bootstrap-theme .btn-group-justified > .btn-group {
+	display: table-cell;
+	float: none;
+	width: 1%;
+}
+
+#bootstrap-theme .btn-group-justified > .btn-group .btn {
+	width: 100%;
+}
+
+#bootstrap-theme .btn-group-justified > .btn-group .dropdown-menu {
+	left: auto;
+}
+
+#bootstrap-theme [data-toggle="buttons"] > .btn input[type="radio"], #bootstrap-theme [data-toggle="buttons"] > .btn input[type="checkbox"], #bootstrap-theme [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], #bootstrap-theme [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
+	position: absolute;
+	clip: rect(0, 0, 0, 0);
+	pointer-events: none;
+}
+
+#bootstrap-theme .input-group {
+	position: relative;
+	display: table;
+	border-collapse: separate;
+}
+
+#bootstrap-theme .input-group[class*="col-"] {
+	float: none;
+	padding-right: 0;
+	padding-left: 0;
+}
+
+#bootstrap-theme .input-group .form-control {
+	position: relative;
+	z-index: 2;
+	float: left;
+	width: 100%;
+	margin-bottom: 0;
+}
+
+#bootstrap-theme .input-group .form-control:focus {
+	z-index: 3;
+}
+
+#bootstrap-theme .input-group-addon, #bootstrap-theme .input-group-btn, #bootstrap-theme .input-group .form-control {
+	display: table-cell;
+}
+
+#bootstrap-theme .input-group-addon:not(:first-child):not(:last-child), #bootstrap-theme .input-group-btn:not(:first-child):not(:last-child), #bootstrap-theme .input-group .form-control:not(:first-child):not(:last-child) {
+	border-radius: 0;
+}
+
+#bootstrap-theme .input-group-addon, #bootstrap-theme .input-group-btn {
+	width: 1%;
+	white-space: nowrap;
+	vertical-align: middle;
+}
+
+#bootstrap-theme .input-group-addon {
+	padding: 4px 8px;
+	font-size: 14px;
+	font-weight: 400;
+	line-height: 1;
+	color: #555;
+	text-align: center;
+	background-color: #eee;
+	border: 1px solid #ccc;
+	border-radius: 4px;
+}
+
+#bootstrap-theme .input-group-addon.input-sm, #bootstrap-theme .input-group-sm > .input-group-addon.form-control, #bootstrap-theme .input-group-sm > .input-group-addon, #bootstrap-theme .input-group-sm > .input-group-btn > .input-group-addon.btn {
+	padding: 5px 10px;
+	font-size: 12px;
+	border-radius: 3px;
+}
+
+#bootstrap-theme .input-group-addon.input-lg, #bootstrap-theme .input-group-lg > .input-group-addon.form-control, #bootstrap-theme .input-group-lg > .input-group-addon, #bootstrap-theme .input-group-lg > .input-group-btn > .input-group-addon.btn {
+	padding: 14px 16px;
+	font-size: 18px;
+	border-radius: 6px;
+}
+
+#bootstrap-theme .input-group-addon input[type="radio"], #bootstrap-theme .input-group-addon input[type="checkbox"] {
+	margin-top: 0;
+}
+
+#bootstrap-theme .input-group .form-control:first-child, #bootstrap-theme .input-group-addon:first-child, #bootstrap-theme .input-group-btn:first-child > .btn, #bootstrap-theme .input-group-btn:first-child > .btn-group > .btn, #bootstrap-theme .input-group-btn:first-child > .dropdown-toggle, #bootstrap-theme .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), #bootstrap-theme .input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+	border-top-right-radius: 0;
+	border-bottom-right-radius: 0;
+}
+
+#bootstrap-theme .input-group-addon:first-child {
+	border-right: 0;
+}
+
+#bootstrap-theme .input-group .form-control:last-child, #bootstrap-theme .input-group-addon:last-child, #bootstrap-theme .input-group-btn:last-child > .btn, #bootstrap-theme .input-group-btn:last-child > .btn-group > .btn, #bootstrap-theme .input-group-btn:last-child > .dropdown-toggle, #bootstrap-theme .input-group-btn:first-child > .btn:not(:first-child), #bootstrap-theme .input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+	border-top-left-radius: 0;
+	border-bottom-left-radius: 0;
+}
+
+#bootstrap-theme .input-group-addon:last-child {
+	border-left: 0;
+}
+
+#bootstrap-theme .input-group-btn {
+	position: relative;
+	font-size: 0;
+	white-space: nowrap;
+}
+
+#bootstrap-theme .input-group-btn > .btn {
+	position: relative;
+}
+
+#bootstrap-theme .input-group-btn > .btn + .btn {
+	margin-left: -1px;
+}
+
+#bootstrap-theme .input-group-btn > .btn:hover, #bootstrap-theme .input-group-btn > .btn:focus, #bootstrap-theme .input-group-btn > .btn:active {
+	z-index: 2;
+}
+
+#bootstrap-theme .input-group-btn:first-child > .btn, #bootstrap-theme .input-group-btn:first-child > .btn-group {
+	margin-right: -1px;
+}
+
+#bootstrap-theme .input-group-btn:last-child > .btn, #bootstrap-theme .input-group-btn:last-child > .btn-group {
+	z-index: 2;
+	margin-left: -1px;
+}
+
+#bootstrap-theme .nav {
+	padding-left: 0;
+	margin-bottom: 0;
+	list-style: none;
+}
+
+#bootstrap-theme .nav:before, #bootstrap-theme .nav:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .nav:after {
+	clear: both;
+}
+
+#bootstrap-theme .nav > li {
+	position: relative;
+	display: block;
+}
+
+#bootstrap-theme .nav > li > a {
+	position: relative;
+	display: block;
+	padding: 10px 15px;
+}
+
+#bootstrap-theme .nav > li > a:hover, #bootstrap-theme .nav > li > a:focus {
+	text-decoration: none;
+	background-color: #eee;
+}
+
+#bootstrap-theme .nav > li.disabled > a {
+	color: #999;
+}
+
+#bootstrap-theme .nav > li.disabled > a:hover, #bootstrap-theme .nav > li.disabled > a:focus {
+	color: #999;
+	text-decoration: none;
+	cursor: not-allowed;
+	background-color: transparent;
+}
+
+#bootstrap-theme .nav .open > a, #bootstrap-theme .nav .open > a:hover, #bootstrap-theme .nav .open > a:focus {
+	background-color: #eee;
+	border-color: black;
+}
+
+#bootstrap-theme .nav .nav-divider {
+	height: 1px;
+	margin: 9px 0;
+	overflow: hidden;
+	background-color: #e5e5e5;
+}
+
+#bootstrap-theme .nav > li > a > img {
+	max-width: none;
+}
+
+#bootstrap-theme .nav-tabs {
+	border-bottom: 1px solid #ddd;
+}
+
+#bootstrap-theme .nav-tabs > li {
+	float: left;
+	margin-bottom: -1px;
+}
+
+#bootstrap-theme .nav-tabs > li > a {
+	margin-right: 2px;
+	line-height: 1.428571429;
+	border: 1px solid transparent;
+	border-radius: 4px 4px 0 0;
+}
+
+#bootstrap-theme .nav-tabs > li > a:hover {
+	border-color: #eee #eee #ddd;
+}
+
+#bootstrap-theme .nav-tabs > li.active > a, #bootstrap-theme .nav-tabs > li.active > a:hover, #bootstrap-theme .nav-tabs > li.active > a:focus {
+	color: #555;
+	cursor: default;
+	background-color: white;
+	border: 1px solid #ddd;
+	border-bottom-color: transparent;
+}
+
+#bootstrap-theme .nav-pills > li {
+	float: left;
+}
+
+#bootstrap-theme .nav-pills > li > a {
+	border-radius: 4px;
+}
+
+#bootstrap-theme .nav-pills > li + li {
+	margin-left: 2px;
+}
+
+#bootstrap-theme .nav-pills > li.active > a, #bootstrap-theme .nav-pills > li.active > a:hover, #bootstrap-theme .nav-pills > li.active > a:focus {
+	color: white;
+	background-color: black;
+}
+
+#bootstrap-theme .nav-stacked > li {
+	float: none;
+}
+
+#bootstrap-theme .nav-stacked > li + li {
+	margin-top: 2px;
+	margin-left: 0;
+}
+
+#bootstrap-theme .nav-justified, #bootstrap-theme .nav-tabs.nav-justified {
+	width: 100%;
+}
+
+#bootstrap-theme .nav-justified > li, #bootstrap-theme .nav-tabs.nav-justified > li {
+	float: none;
+}
+
+#bootstrap-theme .nav-justified > li > a, #bootstrap-theme .nav-tabs.nav-justified > li > a {
+	margin-bottom: 5px;
+	text-align: center;
+}
+
+#bootstrap-theme .nav-justified > .dropdown .dropdown-menu, #bootstrap-theme .nav-tabs.nav-justified > .dropdown .dropdown-menu {
+	top: auto;
+	left: auto;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .nav-justified > li, #bootstrap-theme .nav-tabs.nav-justified > li {
+		display: table-cell;
+		width: 1%;
+	}
+	
+	#bootstrap-theme .nav-justified > li > a, #bootstrap-theme .nav-tabs.nav-justified > li > a {
+		margin-bottom: 0;
+	}
+}
+
+#bootstrap-theme .nav-tabs-justified, #bootstrap-theme .nav-tabs.nav-justified {
+	border-bottom: 0;
+}
+
+#bootstrap-theme .nav-tabs-justified > li > a, #bootstrap-theme .nav-tabs.nav-justified > li > a {
+	margin-right: 0;
+	border-radius: 4px;
+}
+
+#bootstrap-theme .nav-tabs-justified > .active > a, #bootstrap-theme .nav-tabs.nav-justified > .active > a, #bootstrap-theme .nav-tabs-justified > .active > a:hover, #bootstrap-theme .nav-tabs.nav-justified > .active > a:hover, #bootstrap-theme .nav-tabs-justified > .active > a:focus, #bootstrap-theme .nav-tabs.nav-justified > .active > a:focus {
+	border: 1px solid #ddd;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .nav-tabs-justified > li > a, #bootstrap-theme .nav-tabs.nav-justified > li > a {
+		border-bottom: 1px solid #ddd;
+		border-radius: 4px 4px 0 0;
+	}
+	
+	#bootstrap-theme .nav-tabs-justified > .active > a, #bootstrap-theme .nav-tabs.nav-justified > .active > a, #bootstrap-theme .nav-tabs-justified > .active > a:hover, #bootstrap-theme .nav-tabs.nav-justified > .active > a:hover, #bootstrap-theme .nav-tabs-justified > .active > a:focus, #bootstrap-theme .nav-tabs.nav-justified > .active > a:focus {
+		border-bottom-color: white;
+	}
+}
+
+#bootstrap-theme .tab-content > .tab-pane {
+	display: none;
+}
+
+#bootstrap-theme .tab-content > .active {
+	display: block;
+}
+
+#bootstrap-theme .nav-tabs .dropdown-menu {
+	margin-top: -1px;
+	border-top-left-radius: 0;
+	border-top-right-radius: 0;
+}
+
+#bootstrap-theme .navbar {
+	position: relative;
+	min-height: 50px;
+	margin-bottom: 20px;
+	border: 1px solid transparent;
+}
+
+#bootstrap-theme .navbar:before, #bootstrap-theme .navbar:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .navbar:after {
+	clear: both;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar {
+		border-radius: 4px;
+	}
+}
+
+#bootstrap-theme .navbar-header:before, #bootstrap-theme .navbar-header:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .navbar-header:after {
+	clear: both;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-header {
+		float: left;
+	}
+}
+
+#bootstrap-theme .navbar-collapse {
+	padding-right: 15px;
+	padding-left: 15px;
+	overflow-x: visible;
+	border-top: 1px solid transparent;
+	box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+	-webkit-overflow-scrolling: touch;
+}
+
+#bootstrap-theme .navbar-collapse:before, #bootstrap-theme .navbar-collapse:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .navbar-collapse:after {
+	clear: both;
+}
+
+#bootstrap-theme .navbar-collapse.in {
+	overflow-y: auto;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-collapse {
+		width: auto;
+		border-top: 0;
+		box-shadow: none;
+	}
+	
+	#bootstrap-theme .navbar-collapse.collapse {
+		display: block !important;
+		height: auto !important;
+		padding-bottom: 0;
+		overflow: visible !important;
+	}
+	
+	#bootstrap-theme .navbar-collapse.in {
+		overflow-y: visible;
+	}
+	
+	.navbar-fixed-top #bootstrap-theme .navbar-collapse, .navbar-static-top #bootstrap-theme .navbar-collapse, .navbar-fixed-bottom #bootstrap-theme .navbar-collapse {
+		padding-right: 0;
+		padding-left: 0;
+	}
+}
+
+#bootstrap-theme .navbar-fixed-top, #bootstrap-theme .navbar-fixed-bottom {
+	position: fixed;
+	right: 0;
+	left: 0;
+	z-index: 1030;
+}
+
+#bootstrap-theme .navbar-fixed-top .navbar-collapse, #bootstrap-theme .navbar-fixed-bottom .navbar-collapse {
+	max-height: 340px;
+}
+
+@media (max-device-width: 480px) and (orientation: landscape) {
+	#bootstrap-theme .navbar-fixed-top .navbar-collapse, #bootstrap-theme .navbar-fixed-bottom .navbar-collapse {
+		max-height: 200px;
+	}
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-fixed-top, #bootstrap-theme .navbar-fixed-bottom {
+		border-radius: 0;
+	}
+}
+
+#bootstrap-theme .navbar-fixed-top {
+	top: 0;
+	border-width: 0 0 1px;
+}
+
+#bootstrap-theme .navbar-fixed-bottom {
+	bottom: 0;
+	margin-bottom: 0;
+	border-width: 1px 0 0;
+}
+
+#bootstrap-theme .container > .navbar-header, #bootstrap-theme .container > .navbar-collapse, #bootstrap-theme .container-fluid > .navbar-header, #bootstrap-theme .container-fluid > .navbar-collapse {
+	margin-right: -15px;
+	margin-left: -15px;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .container > .navbar-header, #bootstrap-theme .container > .navbar-collapse, #bootstrap-theme .container-fluid > .navbar-header, #bootstrap-theme .container-fluid > .navbar-collapse {
+		margin-right: 0;
+		margin-left: 0;
+	}
+}
+
+#bootstrap-theme .navbar-static-top {
+	z-index: 1000;
+	border-width: 0 0 1px;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-static-top {
+		border-radius: 0;
+	}
+}
+
+#bootstrap-theme .navbar-brand {
+	float: left;
+	height: 50px;
+	padding: 15px 15px;
+	font-size: 18px;
+	line-height: 20px;
+}
+
+#bootstrap-theme .navbar-brand:hover, #bootstrap-theme .navbar-brand:focus {
+	text-decoration: none;
+}
+
+#bootstrap-theme .navbar-brand > img {
+	display: block;
+}
+
+@media (min-width: 768px) {
+	.navbar > .container #bootstrap-theme .navbar-brand, .navbar > .container-fluid #bootstrap-theme .navbar-brand {
+		margin-left: -15px;
+	}
+}
+
+#bootstrap-theme .navbar-toggle {
+	position: relative;
+	float: right;
+	padding: 9px 10px;
+	margin-right: 15px;
+	margin-top: 8px;
+	margin-bottom: 8px;
+	background-color: transparent;
+	background-image: none;
+	border: 1px solid transparent;
+	border-radius: 4px;
+}
+
+#bootstrap-theme .navbar-toggle:focus {
+	outline: 0;
+}
+
+#bootstrap-theme .navbar-toggle .icon-bar {
+	display: block;
+	width: 22px;
+	height: 2px;
+	border-radius: 1px;
+}
+
+#bootstrap-theme .navbar-toggle .icon-bar + .icon-bar {
+	margin-top: 4px;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-toggle {
+		display: none;
+	}
+}
+
+#bootstrap-theme .navbar-nav {
+	margin: 7.5px -15px;
+}
+
+#bootstrap-theme .navbar-nav > li > a {
+	padding-top: 10px;
+	padding-bottom: 10px;
+	line-height: 20px;
+}
+
+@media (max-width: 767px) {
+	#bootstrap-theme .navbar-nav .open .dropdown-menu {
+		position: static;
+		float: none;
+		width: auto;
+		margin-top: 0;
+		background-color: transparent;
+		border: 0;
+		box-shadow: none;
+	}
+	
+	#bootstrap-theme .navbar-nav .open .dropdown-menu > li > a, #bootstrap-theme .navbar-nav .open .dropdown-menu .dropdown-header {
+		padding: 5px 15px 5px 25px;
+	}
+	
+	#bootstrap-theme .navbar-nav .open .dropdown-menu > li > a {
+		line-height: 20px;
+	}
+	
+	#bootstrap-theme .navbar-nav .open .dropdown-menu > li > a:hover, #bootstrap-theme .navbar-nav .open .dropdown-menu > li > a:focus {
+		background-image: none;
+	}
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-nav {
+		float: left;
+		margin: 0;
+	}
+	
+	#bootstrap-theme .navbar-nav > li {
+		float: left;
+	}
+	
+	#bootstrap-theme .navbar-nav > li > a {
+		padding-top: 15px;
+		padding-bottom: 15px;
+	}
+}
+
+#bootstrap-theme .navbar-form {
+	padding: 10px 15px;
+	margin-right: -15px;
+	margin-left: -15px;
+	border-top: 1px solid transparent;
+	border-bottom: 1px solid transparent;
+	-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+	box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+	margin-top: 10px;
+	margin-bottom: 10px;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-form .form-group {
+		display: inline-block;
+		margin-bottom: 0;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .navbar-form .form-control {
+		display: inline-block;
+		width: auto;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .navbar-form .form-control-static {
+		display: inline-block;
+	}
+	
+	#bootstrap-theme .navbar-form .input-group {
+		display: inline-table;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .navbar-form .input-group .input-group-addon, #bootstrap-theme .navbar-form .input-group .input-group-btn, #bootstrap-theme .navbar-form .input-group .form-control {
+		width: auto;
+	}
+	
+	#bootstrap-theme .navbar-form .input-group > .form-control {
+		width: 100%;
+	}
+	
+	#bootstrap-theme .navbar-form .control-label {
+		margin-bottom: 0;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .navbar-form .radio, #bootstrap-theme .navbar-form .checkbox {
+		display: inline-block;
+		margin-top: 0;
+		margin-bottom: 0;
+		vertical-align: middle;
+	}
+	
+	#bootstrap-theme .navbar-form .radio label, #bootstrap-theme .navbar-form .checkbox label {
+		padding-left: 0;
+	}
+	
+	#bootstrap-theme .navbar-form .radio input[type="radio"], #bootstrap-theme .navbar-form .checkbox input[type="checkbox"] {
+		position: relative;
+		margin-left: 0;
+	}
+	
+	#bootstrap-theme .navbar-form .has-feedback .form-control-feedback {
+		top: 0;
+	}
+}
+
+@media (max-width: 767px) {
+	#bootstrap-theme .navbar-form .form-group {
+		margin-bottom: 5px;
+	}
+	
+	#bootstrap-theme .navbar-form .form-group:last-child {
+		margin-bottom: 0;
+	}
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-form {
+		width: auto;
+		padding-top: 0;
+		padding-bottom: 0;
+		margin-right: 0;
+		margin-left: 0;
+		border: 0;
+		-webkit-box-shadow: none;
+		box-shadow: none;
+	}
+}
+
+#bootstrap-theme .navbar-nav > li > .dropdown-menu {
+	margin-top: 0;
+	border-top-left-radius: 0;
+	border-top-right-radius: 0;
+}
+
+#bootstrap-theme .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+	margin-bottom: 0;
+	border-top-left-radius: 4px;
+	border-top-right-radius: 4px;
+	border-bottom-right-radius: 0;
+	border-bottom-left-radius: 0;
+}
+
+#bootstrap-theme .navbar-btn {
+	margin-top: 10px;
+	margin-bottom: 10px;
+}
+
+#bootstrap-theme .navbar-btn.btn-sm, #bootstrap-theme .btn-group-sm > .navbar-btn.btn {
+	margin-top: 10px;
+	margin-bottom: 10px;
+}
+
+#bootstrap-theme .navbar-btn.btn-xs, #bootstrap-theme .btn-group-xs > .navbar-btn.btn {
+	margin-top: 14px;
+	margin-bottom: 14px;
+}
+
+#bootstrap-theme .navbar-text {
+	margin-top: 15px;
+	margin-bottom: 15px;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-text {
+		float: left;
+		margin-right: 15px;
+		margin-left: 15px;
+	}
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .navbar-left {
+		float: left !important;
+	}
+	
+	#bootstrap-theme .navbar-right {
+		float: right !important;
+		margin-right: -15px;
+	}
+	
+	#bootstrap-theme .navbar-right ~ .navbar-right {
+		margin-right: 0;
+	}
+}
+
+#bootstrap-theme .navbar-default {
+	background-color: black;
+	border-color: black;
+}
+
+#bootstrap-theme .navbar-default .navbar-brand {
+	color: white;
+}
+
+#bootstrap-theme .navbar-default .navbar-brand:hover, #bootstrap-theme .navbar-default .navbar-brand:focus {
+	color: white;
+	background-color: none;
+}
+
+#bootstrap-theme .navbar-default .navbar-text {
+	color: #ddd;
+}
+
+#bootstrap-theme .navbar-default .navbar-nav > li > a {
+	color: white;
+}
+
+#bootstrap-theme .navbar-default .navbar-nav > li > a:hover, #bootstrap-theme .navbar-default .navbar-nav > li > a:focus {
+	color: white;
+	background-color: black;
+}
+
+#bootstrap-theme .navbar-default .navbar-nav > .active > a, #bootstrap-theme .navbar-default .navbar-nav > .active > a:hover, #bootstrap-theme .navbar-default .navbar-nav > .active > a:focus {
+	color: white;
+	background-color: black;
+}
+
+#bootstrap-theme .navbar-default .navbar-nav > .disabled > a, #bootstrap-theme .navbar-default .navbar-nav > .disabled > a:hover, #bootstrap-theme .navbar-default .navbar-nav > .disabled > a:focus {
+	color: #ddd;
+	background-color: transparent;
+}
+
+#bootstrap-theme .navbar-default .navbar-nav > .open > a, #bootstrap-theme .navbar-default .navbar-nav > .open > a:hover, #bootstrap-theme .navbar-default .navbar-nav > .open > a:focus {
+	color: white;
+	background-color: black;
+}
+
+@media (max-width: 767px) {
+	#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+		color: white;
+	}
+	
+	#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+		color: white;
+		background-color: black;
+	}
+	
+	#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .active > a, #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+		color: white;
+		background-color: black;
+	}
+	
+	#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, #bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+		color: #ddd;
+		background-color: transparent;
+	}
+}
+
+#bootstrap-theme .navbar-default .navbar-toggle {
+	border-color: black;
+}
+
+#bootstrap-theme .navbar-default .navbar-toggle:hover, #bootstrap-theme .navbar-default .navbar-toggle:focus {
+	background-color: black;
+}
+
+#bootstrap-theme .navbar-default .navbar-toggle .icon-bar {
+	background-color: white;
+}
+
+#bootstrap-theme .navbar-default .navbar-collapse, #bootstrap-theme .navbar-default .navbar-form {
+	border-color: black;
+}
+
+#bootstrap-theme .navbar-default .navbar-link {
+	color: white;
+}
+
+#bootstrap-theme .navbar-default .navbar-link:hover {
+	color: white;
+}
+
+#bootstrap-theme .navbar-default .btn-link {
+	color: white;
+}
+
+#bootstrap-theme .navbar-default .btn-link:hover, #bootstrap-theme .navbar-default .btn-link:focus {
+	color: white;
+}
+
+#bootstrap-theme .navbar-default .btn-link[disabled]:hover, #bootstrap-theme .navbar-default .btn-link[disabled]:focus, fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:hover, fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:focus {
+	color: #ddd;
+}
+
+#bootstrap-theme .navbar-inverse {
+	background-color: #cde8fe;
+	border-color: #b4ddfe;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-brand {
+	color: white;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-brand:hover, #bootstrap-theme .navbar-inverse .navbar-brand:focus {
+	color: white;
+	background-color: none;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-text {
+	color: white;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-nav > li > a {
+	color: white;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-nav > li > a:hover, #bootstrap-theme .navbar-inverse .navbar-nav > li > a:focus {
+	color: white;
+	background-color: #b4ddfe;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-nav > .active > a, #bootstrap-theme .navbar-inverse .navbar-nav > .active > a:hover, #bootstrap-theme .navbar-inverse .navbar-nav > .active > a:focus {
+	color: white;
+	background-color: #b4ddfe;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-nav > .disabled > a, #bootstrap-theme .navbar-inverse .navbar-nav > .disabled > a:hover, #bootstrap-theme .navbar-inverse .navbar-nav > .disabled > a:focus {
+	color: #ccc;
+	background-color: transparent;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-nav > .open > a, #bootstrap-theme .navbar-inverse .navbar-nav > .open > a:hover, #bootstrap-theme .navbar-inverse .navbar-nav > .open > a:focus {
+	color: white;
+	background-color: #b4ddfe;
+}
+
+@media (max-width: 767px) {
+	#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+		border-color: #b4ddfe;
+	}
+	
+	#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+		background-color: #b4ddfe;
+	}
+	
+	#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+		color: white;
+	}
+	
+	#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+		color: white;
+		background-color: #b4ddfe;
+	}
+	
+	#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+		color: white;
+		background-color: #b4ddfe;
+	}
+	
+	#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, #bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+		color: #ccc;
+		background-color: transparent;
+	}
+}
+
+#bootstrap-theme .navbar-inverse .navbar-toggle {
+	border-color: #b4ddfe;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-toggle:hover, #bootstrap-theme .navbar-inverse .navbar-toggle:focus {
+	background-color: #b4ddfe;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-toggle .icon-bar {
+	background-color: white;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-collapse, #bootstrap-theme .navbar-inverse .navbar-form {
+	border-color: #aad8fd;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-link {
+	color: white;
+}
+
+#bootstrap-theme .navbar-inverse .navbar-link:hover {
+	color: white;
+}
+
+#bootstrap-theme .navbar-inverse .btn-link {
+	color: white;
+}
+
+#bootstrap-theme .navbar-inverse .btn-link:hover, #bootstrap-theme .navbar-inverse .btn-link:focus {
+	color: white;
+}
+
+#bootstrap-theme .navbar-inverse .btn-link[disabled]:hover, #bootstrap-theme .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:hover, fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:focus {
+	color: #ccc;
+}
+
+#bootstrap-theme .breadcrumb {
+	padding: 8px 15px;
+	margin-bottom: 20px;
+	list-style: none;
+	background-color: whitesmoke;
+	border-radius: 4px;
+}
+
+#bootstrap-theme .breadcrumb > li {
+	display: inline-block;
+}
+
+#bootstrap-theme .breadcrumb > li + li:before {
+	padding: 0 5px;
+	color: #ccc;
+	content: "/ ";
+}
+
+#bootstrap-theme .breadcrumb > .active {
+	color: #999;
+}
+
+#bootstrap-theme .pagination {
+	display: inline-block;
+	padding-left: 0;
+	margin: 20px 0;
+	border-radius: 4px;
+}
+
+#bootstrap-theme .pagination > li {
+	display: inline;
+}
+
+#bootstrap-theme .pagination > li > a, #bootstrap-theme .pagination > li > span {
+	position: relative;
+	float: left;
+	padding: 4px 8px;
+	margin-left: -1px;
+	line-height: 1.428571429;
+	color: black;
+	text-decoration: none;
+	background-color: white;
+	border: 1px solid #ddd;
+}
+
+#bootstrap-theme .pagination > li > a:hover, #bootstrap-theme .pagination > li > a:focus, #bootstrap-theme .pagination > li > span:hover, #bootstrap-theme .pagination > li > span:focus {
+	z-index: 2;
+	color: black;
+	background-color: #eee;
+	border-color: #ddd;
+}
+
+#bootstrap-theme .pagination > li:first-child > a, #bootstrap-theme .pagination > li:first-child > span {
+	margin-left: 0;
+	border-top-left-radius: 4px;
+	border-bottom-left-radius: 4px;
+}
+
+#bootstrap-theme .pagination > li:last-child > a, #bootstrap-theme .pagination > li:last-child > span {
+	border-top-right-radius: 4px;
+	border-bottom-right-radius: 4px;
+}
+
+#bootstrap-theme .pagination > .active > a, #bootstrap-theme .pagination > .active > a:hover, #bootstrap-theme .pagination > .active > a:focus, #bootstrap-theme .pagination > .active > span, #bootstrap-theme .pagination > .active > span:hover, #bootstrap-theme .pagination > .active > span:focus {
+	z-index: 3;
+	color: #999;
+	cursor: default;
+	background-color: whitesmoke;
+	border-color: #ddd;
+}
+
+#bootstrap-theme .pagination > .disabled > span, #bootstrap-theme .pagination > .disabled > span:hover, #bootstrap-theme .pagination > .disabled > span:focus, #bootstrap-theme .pagination > .disabled > a, #bootstrap-theme .pagination > .disabled > a:hover, #bootstrap-theme .pagination > .disabled > a:focus {
+	color: #999;
+	cursor: not-allowed;
+	background-color: white;
+	border-color: #ddd;
+}
+
+#bootstrap-theme .pagination-lg > li > a, #bootstrap-theme .pagination-lg > li > span {
+	padding: 14px 16px;
+	font-size: 18px;
+	line-height: 1.3333333;
+}
+
+#bootstrap-theme .pagination-lg > li:first-child > a, #bootstrap-theme .pagination-lg > li:first-child > span {
+	border-top-left-radius: 6px;
+	border-bottom-left-radius: 6px;
+}
+
+#bootstrap-theme .pagination-lg > li:last-child > a, #bootstrap-theme .pagination-lg > li:last-child > span {
+	border-top-right-radius: 6px;
+	border-bottom-right-radius: 6px;
+}
+
+#bootstrap-theme .pagination-sm > li > a, #bootstrap-theme .pagination-sm > li > span {
+	padding: 5px 10px;
+	font-size: 12px;
+	line-height: 1.5;
+}
+
+#bootstrap-theme .pagination-sm > li:first-child > a, #bootstrap-theme .pagination-sm > li:first-child > span {
+	border-top-left-radius: 3px;
+	border-bottom-left-radius: 3px;
+}
+
+#bootstrap-theme .pagination-sm > li:last-child > a, #bootstrap-theme .pagination-sm > li:last-child > span {
+	border-top-right-radius: 3px;
+	border-bottom-right-radius: 3px;
+}
+
+#bootstrap-theme .pager {
+	padding-left: 0;
+	margin: 20px 0;
+	text-align: center;
+	list-style: none;
+}
+
+#bootstrap-theme .pager:before, #bootstrap-theme .pager:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .pager:after {
+	clear: both;
+}
+
+#bootstrap-theme .pager li {
+	display: inline;
+}
+
+#bootstrap-theme .pager li > a, #bootstrap-theme .pager li > span {
+	display: inline-block;
+	padding: 5px 14px;
+	background-color: white;
+	border: 1px solid #ddd;
+	border-radius: 15px;
+}
+
+#bootstrap-theme .pager li > a:hover, #bootstrap-theme .pager li > a:focus {
+	text-decoration: none;
+	background-color: #eee;
+}
+
+#bootstrap-theme .pager .next > a, #bootstrap-theme .pager .next > span {
+	float: right;
+}
+
+#bootstrap-theme .pager .previous > a, #bootstrap-theme .pager .previous > span {
+	float: left;
+}
+
+#bootstrap-theme .pager .disabled > a, #bootstrap-theme .pager .disabled > a:hover, #bootstrap-theme .pager .disabled > a:focus, #bootstrap-theme .pager .disabled > span {
+	color: #999;
+	cursor: not-allowed;
+	background-color: white;
+}
+
+#bootstrap-theme .label {
+	display: inline;
+	padding: .2em .6em .3em;
+	font-size: 75%;
+	font-weight: 700;
+	line-height: 1;
+	color: white;
+	text-align: center;
+	white-space: nowrap;
+	vertical-align: baseline;
+	border-radius: .25em;
+}
+
+#bootstrap-theme .label:empty {
+	display: none;
+}
+
+.btn #bootstrap-theme .label {
+	position: relative;
+	top: -1px;
+}
+
+#bootstrap-theme a.label:hover, #bootstrap-theme a.label:focus {
+	color: white;
+	text-decoration: none;
+	cursor: pointer;
+}
+
+#bootstrap-theme .label-default {
+	background-color: #999;
+}
+
+#bootstrap-theme .label-default[href]:hover, #bootstrap-theme .label-default[href]:focus {
+	background-color: gray;
+}
+
+#bootstrap-theme .label-primary {
+	background-color: black;
+}
+
+#bootstrap-theme .label-primary[href]:hover, #bootstrap-theme .label-primary[href]:focus {
+	background-color: black;
+}
+
+#bootstrap-theme .label-success {
+	background-color: #73a839;
+}
+
+#bootstrap-theme .label-success[href]:hover, #bootstrap-theme .label-success[href]:focus {
+	background-color: #59822c;
+}
+
+#bootstrap-theme .label-info {
+	background-color: #cde8fe;
+}
+
+#bootstrap-theme .label-info[href]:hover, #bootstrap-theme .label-info[href]:focus {
+	background-color: #9bd1fd;
+}
+
+#bootstrap-theme .label-warning {
+	background-color: #dd5600;
+}
+
+#bootstrap-theme .label-warning[href]:hover, #bootstrap-theme .label-warning[href]:focus {
+	background-color: #aa4200;
+}
+
+#bootstrap-theme .label-danger {
+	background-color: #c71c22;
+}
+
+#bootstrap-theme .label-danger[href]:hover, #bootstrap-theme .label-danger[href]:focus {
+	background-color: #9a161a;
+}
+
+#bootstrap-theme .badge {
+	display: inline-block;
+	min-width: 10px;
+	padding: 3px 7px;
+	font-size: 12px;
+	font-weight: bold;
+	line-height: 1;
+	color: white;
+	text-align: center;
+	white-space: nowrap;
+	vertical-align: middle;
+	background-color: black;
+	border-radius: 10px;
+}
+
+#bootstrap-theme .badge:empty {
+	display: none;
+}
+
+.btn #bootstrap-theme .badge {
+	position: relative;
+	top: -1px;
+}
+
+.btn-xs #bootstrap-theme .badge, #bootstrap-theme .btn-group-xs > .btn #bootstrap-theme .badge, .btn-group-xs > .btn #bootstrap-theme .badge {
+	top: 0;
+	padding: 1px 5px;
+}
+
+.list-group-item.active > #bootstrap-theme .badge, .nav-pills > .active > a > #bootstrap-theme .badge {
+	color: black;
+	background-color: white;
+}
+
+.list-group-item > #bootstrap-theme .badge {
+	float: right;
+}
+
+.list-group-item > #bootstrap-theme .badge + #bootstrap-theme .badge {
+	margin-right: 5px;
+}
+
+.nav-pills > li > a > #bootstrap-theme .badge {
+	margin-left: 3px;
+}
+
+#bootstrap-theme a.badge:hover, #bootstrap-theme a.badge:focus {
+	color: white;
+	text-decoration: none;
+	cursor: pointer;
+}
+
+#bootstrap-theme .jumbotron {
+	padding-top: 30px;
+	padding-bottom: 30px;
+	margin-bottom: 30px;
+	color: inherit;
+	background-color: #eee;
+}
+
+#bootstrap-theme .jumbotron h1, #bootstrap-theme .jumbotron .h1 {
+	color: inherit;
+}
+
+#bootstrap-theme .jumbotron p {
+	margin-bottom: 15px;
+	font-size: 21px;
+	font-weight: 200;
+}
+
+#bootstrap-theme .jumbotron > hr {
+	border-top-color: #d5d5d5;
+}
+
+.container #bootstrap-theme .jumbotron, .container-fluid #bootstrap-theme .jumbotron {
+	padding-right: 15px;
+	padding-left: 15px;
+	border-radius: 6px;
+}
+
+#bootstrap-theme .jumbotron .container {
+	max-width: 100%;
+}
+
+@media screen and (min-width: 768px) {
+	#bootstrap-theme .jumbotron {
+		padding-top: 48px;
+		padding-bottom: 48px;
+	}
+	
+	.container #bootstrap-theme .jumbotron, .container-fluid #bootstrap-theme .jumbotron {
+		padding-right: 60px;
+		padding-left: 60px;
+	}
+	
+	#bootstrap-theme .jumbotron h1, #bootstrap-theme .jumbotron .h1 {
+		font-size: 63px;
+	}
+}
+
+#bootstrap-theme .thumbnail {
+	display: block;
+	padding: 4px;
+	margin-bottom: 20px;
+	line-height: 1.428571429;
+	background-color: white;
+	border: 1px solid #ddd;
+	border-radius: 4px;
+	-webkit-transition: border .2s ease-in-out;
+	-o-transition: border .2s ease-in-out;
+	transition: border .2s ease-in-out;
+}
+
+#bootstrap-theme .thumbnail > img, #bootstrap-theme .thumbnail a > img {
+	display: block;
+	max-width: 100%;
+	height: auto;
+	margin-right: auto;
+	margin-left: auto;
+}
+
+#bootstrap-theme .thumbnail .caption {
+	padding: 9px;
+	color: #555;
+}
+
+#bootstrap-theme a.thumbnail:hover, #bootstrap-theme a.thumbnail:focus, #bootstrap-theme a.thumbnail.active {
+	border-color: black;
+}
+
+#bootstrap-theme .alert {
+	padding: 15px;
+	margin-bottom: 20px;
+	border: 1px solid transparent;
+	border-radius: 4px;
+}
+
+#bootstrap-theme .alert h4 {
+	margin-top: 0;
+	color: inherit;
+}
+
+#bootstrap-theme .alert .alert-link {
+	font-weight: bold;
+}
+
+#bootstrap-theme .alert > p, #bootstrap-theme .alert > ul {
+	margin-bottom: 0;
+}
+
+#bootstrap-theme .alert > p + p {
+	margin-top: 5px;
+}
+
+#bootstrap-theme .alert-dismissable, #bootstrap-theme .alert-dismissible {
+	padding-right: 35px;
+}
+
+#bootstrap-theme .alert-dismissable .close, #bootstrap-theme .alert-dismissible .close {
+	position: relative;
+	top: -2px;
+	right: -21px;
+	color: inherit;
+}
+
+#bootstrap-theme .alert-success {
+	color: #468847;
+	background-color: #dff0d8;
+	border-color: #d6e9c6;
+}
+
+#bootstrap-theme .alert-success hr {
+	border-top-color: #c9e2b3;
+}
+
+#bootstrap-theme .alert-success .alert-link {
+	color: #356635;
+}
+
+#bootstrap-theme .alert-info {
+	color: #3a87ad;
+	background-color: #d9edf7;
+	border-color: #bce8f1;
+}
+
+#bootstrap-theme .alert-info hr {
+	border-top-color: #a6e1ec;
+}
+
+#bootstrap-theme .alert-info .alert-link {
+	color: #2d6987;
+}
+
+#bootstrap-theme .alert-warning {
+	color: #c09853;
+	background-color: #fcf8e3;
+	border-color: #fbeed5;
+}
+
+#bootstrap-theme .alert-warning hr {
+	border-top-color: #f8e5be;
+}
+
+#bootstrap-theme .alert-warning .alert-link {
+	color: #a47e3c;
+}
+
+#bootstrap-theme .alert-danger {
+	color: #b94a48;
+	background-color: #f2dede;
+	border-color: #eed3d7;
+}
+
+#bootstrap-theme .alert-danger hr {
+	border-top-color: #e6c1c7;
+}
+
+#bootstrap-theme .alert-danger .alert-link {
+	color: #953b39;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+	from {
+		background-position: 40px 0;
+	}
+	
+	to {
+		background-position: 0 0;
+	}
+}
+
+@keyframes progress-bar-stripes {
+	from {
+		background-position: 40px 0;
+	}
+	
+	to {
+		background-position: 0 0;
+	}
+}
+
+#bootstrap-theme .progress {
+	height: 20px;
+	margin-bottom: 20px;
+	overflow: hidden;
+	background-color: whitesmoke;
+	border-radius: 4px;
+	-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+	box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
+}
+
+#bootstrap-theme .progress-bar {
+	float: left;
+	width: 0%;
+	height: 100%;
+	font-size: 12px;
+	line-height: 20px;
+	color: white;
+	text-align: center;
+	background-color: black;
+	-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+	box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
+	-webkit-transition: width .6s ease;
+	-o-transition: width .6s ease;
+	transition: width .6s ease;
+}
+
+#bootstrap-theme .progress-striped .progress-bar, #bootstrap-theme .progress-bar-striped {
+	background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-size: 40px 40px;
+}
+
+#bootstrap-theme .progress.active .progress-bar, #bootstrap-theme .progress-bar.active {
+	-webkit-animation: progress-bar-stripes 2s linear infinite;
+	-o-animation: progress-bar-stripes 2s linear infinite;
+	animation: progress-bar-stripes 2s linear infinite;
+}
+
+#bootstrap-theme .progress-bar-success {
+	background-color: #73a839;
+}
+
+.progress-striped #bootstrap-theme .progress-bar-success {
+	background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+
+#bootstrap-theme .progress-bar-info {
+	background-color: #cde8fe;
+}
+
+.progress-striped #bootstrap-theme .progress-bar-info {
+	background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+
+#bootstrap-theme .progress-bar-warning {
+	background-color: #dd5600;
+}
+
+.progress-striped #bootstrap-theme .progress-bar-warning {
+	background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+
+#bootstrap-theme .progress-bar-danger {
+	background-color: #c71c22;
+}
+
+.progress-striped #bootstrap-theme .progress-bar-danger {
+	background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+	background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
+}
+
+#bootstrap-theme .media {
+	margin-top: 15px;
+}
+
+#bootstrap-theme .media:first-child {
+	margin-top: 0;
+}
+
+#bootstrap-theme .media, #bootstrap-theme .media-body {
+	overflow: hidden;
+	zoom: 1;
+}
+
+#bootstrap-theme .media-body {
+	width: 10000px;
+}
+
+#bootstrap-theme .media-object {
+	display: block;
+}
+
+#bootstrap-theme .media-object.img-thumbnail {
+	max-width: none;
+}
+
+#bootstrap-theme .media-right, #bootstrap-theme .media > .pull-right {
+	padding-left: 10px;
+}
+
+#bootstrap-theme .media-left, #bootstrap-theme .media > .pull-left {
+	padding-right: 10px;
+}
+
+#bootstrap-theme .media-left, #bootstrap-theme .media-right, #bootstrap-theme .media-body {
+	display: table-cell;
+	vertical-align: top;
+}
+
+#bootstrap-theme .media-middle {
+	vertical-align: middle;
+}
+
+#bootstrap-theme .media-bottom {
+	vertical-align: bottom;
+}
+
+#bootstrap-theme .media-heading {
+	margin-top: 0;
+	margin-bottom: 5px;
+}
+
+#bootstrap-theme .media-list {
+	padding-left: 0;
+	list-style: none;
+}
+
+#bootstrap-theme .list-group {
+	padding-left: 0;
+	margin-bottom: 20px;
+}
+
+#bootstrap-theme .list-group-item {
+	position: relative;
+	display: block;
+	padding: 10px 15px;
+	margin-bottom: -1px;
+	background-color: white;
+	border: 1px solid #ddd;
+}
+
+#bootstrap-theme .list-group-item:first-child {
+	border-top-left-radius: 4px;
+	border-top-right-radius: 4px;
+}
+
+#bootstrap-theme .list-group-item:last-child {
+	margin-bottom: 0;
+	border-bottom-right-radius: 4px;
+	border-bottom-left-radius: 4px;
+}
+
+#bootstrap-theme .list-group-item.disabled, #bootstrap-theme .list-group-item.disabled:hover, #bootstrap-theme .list-group-item.disabled:focus {
+	color: #999;
+	cursor: not-allowed;
+	background-color: #eee;
+}
+
+#bootstrap-theme .list-group-item.disabled .list-group-item-heading, #bootstrap-theme .list-group-item.disabled:hover .list-group-item-heading, #bootstrap-theme .list-group-item.disabled:focus .list-group-item-heading {
+	color: inherit;
+}
+
+#bootstrap-theme .list-group-item.disabled .list-group-item-text, #bootstrap-theme .list-group-item.disabled:hover .list-group-item-text, #bootstrap-theme .list-group-item.disabled:focus .list-group-item-text {
+	color: #999;
+}
+
+#bootstrap-theme .list-group-item.active, #bootstrap-theme .list-group-item.active:hover, #bootstrap-theme .list-group-item.active:focus {
+	z-index: 2;
+	color: white;
+	background-color: black;
+	border-color: black;
+}
+
+#bootstrap-theme .list-group-item.active .list-group-item-heading, #bootstrap-theme .list-group-item.active .list-group-item-heading > small, #bootstrap-theme .list-group-item.active .list-group-item-heading > .small, #bootstrap-theme .list-group-item.active:hover .list-group-item-heading, #bootstrap-theme .list-group-item.active:hover .list-group-item-heading > small, #bootstrap-theme .list-group-item.active:hover .list-group-item-heading > .small, #bootstrap-theme .list-group-item.active:focus .list-group-item-heading, #bootstrap-theme .list-group-item.active:focus .list-group-item-heading > small, #bootstrap-theme .list-group-item.active:focus .list-group-item-heading > .small {
+	color: inherit;
+}
+
+#bootstrap-theme .list-group-item.active .list-group-item-text, #bootstrap-theme .list-group-item.active:hover .list-group-item-text, #bootstrap-theme .list-group-item.active:focus .list-group-item-text {
+	color: #666;
+}
+
+#bootstrap-theme a.list-group-item, #bootstrap-theme button.list-group-item {
+	color: #555;
+}
+
+#bootstrap-theme a.list-group-item .list-group-item-heading, #bootstrap-theme button.list-group-item .list-group-item-heading {
+	color: #333;
+}
+
+#bootstrap-theme a.list-group-item:hover, #bootstrap-theme a.list-group-item:focus, #bootstrap-theme button.list-group-item:hover, #bootstrap-theme button.list-group-item:focus {
+	color: #555;
+	text-decoration: none;
+	background-color: whitesmoke;
+}
+
+#bootstrap-theme button.list-group-item {
+	width: 100%;
+	text-align: left;
+}
+
+#bootstrap-theme .list-group-item-success {
+	color: #468847;
+	background-color: #dff0d8;
+}
+
+#bootstrap-theme a.list-group-item-success, #bootstrap-theme button.list-group-item-success {
+	color: #468847;
+}
+
+#bootstrap-theme a.list-group-item-success .list-group-item-heading, #bootstrap-theme button.list-group-item-success .list-group-item-heading {
+	color: inherit;
+}
+
+#bootstrap-theme a.list-group-item-success:hover, #bootstrap-theme a.list-group-item-success:focus, #bootstrap-theme button.list-group-item-success:hover, #bootstrap-theme button.list-group-item-success:focus {
+	color: #468847;
+	background-color: #d0e9c6;
+}
+
+#bootstrap-theme a.list-group-item-success.active, #bootstrap-theme a.list-group-item-success.active:hover, #bootstrap-theme a.list-group-item-success.active:focus, #bootstrap-theme button.list-group-item-success.active, #bootstrap-theme button.list-group-item-success.active:hover, #bootstrap-theme button.list-group-item-success.active:focus {
+	color: #fff;
+	background-color: #468847;
+	border-color: #468847;
+}
+
+#bootstrap-theme .list-group-item-info {
+	color: #3a87ad;
+	background-color: #d9edf7;
+}
+
+#bootstrap-theme a.list-group-item-info, #bootstrap-theme button.list-group-item-info {
+	color: #3a87ad;
+}
+
+#bootstrap-theme a.list-group-item-info .list-group-item-heading, #bootstrap-theme button.list-group-item-info .list-group-item-heading {
+	color: inherit;
+}
+
+#bootstrap-theme a.list-group-item-info:hover, #bootstrap-theme a.list-group-item-info:focus, #bootstrap-theme button.list-group-item-info:hover, #bootstrap-theme button.list-group-item-info:focus {
+	color: #3a87ad;
+	background-color: #c4e3f3;
+}
+
+#bootstrap-theme a.list-group-item-info.active, #bootstrap-theme a.list-group-item-info.active:hover, #bootstrap-theme a.list-group-item-info.active:focus, #bootstrap-theme button.list-group-item-info.active, #bootstrap-theme button.list-group-item-info.active:hover, #bootstrap-theme button.list-group-item-info.active:focus {
+	color: #fff;
+	background-color: #3a87ad;
+	border-color: #3a87ad;
+}
+
+#bootstrap-theme .list-group-item-warning {
+	color: #c09853;
+	background-color: #fcf8e3;
+}
+
+#bootstrap-theme a.list-group-item-warning, #bootstrap-theme button.list-group-item-warning {
+	color: #c09853;
+}
+
+#bootstrap-theme a.list-group-item-warning .list-group-item-heading, #bootstrap-theme button.list-group-item-warning .list-group-item-heading {
+	color: inherit;
+}
+
+#bootstrap-theme a.list-group-item-warning:hover, #bootstrap-theme a.list-group-item-warning:focus, #bootstrap-theme button.list-group-item-warning:hover, #bootstrap-theme button.list-group-item-warning:focus {
+	color: #c09853;
+	background-color: #faf2cc;
+}
+
+#bootstrap-theme a.list-group-item-warning.active, #bootstrap-theme a.list-group-item-warning.active:hover, #bootstrap-theme a.list-group-item-warning.active:focus, #bootstrap-theme button.list-group-item-warning.active, #bootstrap-theme button.list-group-item-warning.active:hover, #bootstrap-theme button.list-group-item-warning.active:focus {
+	color: #fff;
+	background-color: #c09853;
+	border-color: #c09853;
+}
+
+#bootstrap-theme .list-group-item-danger {
+	color: #b94a48;
+	background-color: #f2dede;
+}
+
+#bootstrap-theme a.list-group-item-danger, #bootstrap-theme button.list-group-item-danger {
+	color: #b94a48;
+}
+
+#bootstrap-theme a.list-group-item-danger .list-group-item-heading, #bootstrap-theme button.list-group-item-danger .list-group-item-heading {
+	color: inherit;
+}
+
+#bootstrap-theme a.list-group-item-danger:hover, #bootstrap-theme a.list-group-item-danger:focus, #bootstrap-theme button.list-group-item-danger:hover, #bootstrap-theme button.list-group-item-danger:focus {
+	color: #b94a48;
+	background-color: #ebcccc;
+}
+
+#bootstrap-theme a.list-group-item-danger.active, #bootstrap-theme a.list-group-item-danger.active:hover, #bootstrap-theme a.list-group-item-danger.active:focus, #bootstrap-theme button.list-group-item-danger.active, #bootstrap-theme button.list-group-item-danger.active:hover, #bootstrap-theme button.list-group-item-danger.active:focus {
+	color: #fff;
+	background-color: #b94a48;
+	border-color: #b94a48;
+}
+
+#bootstrap-theme .list-group-item-heading {
+	margin-top: 0;
+	margin-bottom: 5px;
+}
+
+#bootstrap-theme .list-group-item-text {
+	margin-bottom: 0;
+	line-height: 1.3;
+}
+
+#bootstrap-theme .panel {
+	margin-bottom: 20px;
+	background-color: white;
+	border: 1px solid transparent;
+	border-radius: 4px;
+	-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+	box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
+}
+
+#bootstrap-theme .panel-body {
+	padding: 15px;
+}
+
+#bootstrap-theme .panel-body:before, #bootstrap-theme .panel-body:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .panel-body:after {
+	clear: both;
+}
+
+#bootstrap-theme .panel-heading {
+	padding: 10px 15px;
+	border-bottom: 1px solid transparent;
+	border-top-left-radius: 3px;
+	border-top-right-radius: 3px;
+}
+
+#bootstrap-theme .panel-heading > .dropdown .dropdown-toggle {
+	color: inherit;
+}
+
+#bootstrap-theme .panel-title {
+	margin-top: 0;
+	margin-bottom: 0;
+	font-size: 16px;
+	color: inherit;
+}
+
+#bootstrap-theme .panel-title > a, #bootstrap-theme .panel-title > small, #bootstrap-theme .panel-title > .small, #bootstrap-theme .panel-title > small > a, #bootstrap-theme .panel-title > .small > a {
+	color: inherit;
+}
+
+#bootstrap-theme .panel-footer {
+	padding: 10px 15px;
+	background-color: whitesmoke;
+	border-top: 1px solid #ddd;
+	border-bottom-right-radius: 3px;
+	border-bottom-left-radius: 3px;
+}
+
+#bootstrap-theme .panel > .list-group, #bootstrap-theme .panel > .panel-collapse > .list-group {
+	margin-bottom: 0;
+}
+
+#bootstrap-theme .panel > .list-group .list-group-item, #bootstrap-theme .panel > .panel-collapse > .list-group .list-group-item {
+	border-width: 1px 0;
+	border-radius: 0;
+}
+
+#bootstrap-theme .panel > .list-group:first-child .list-group-item:first-child, #bootstrap-theme .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
+	border-top: 0;
+	border-top-left-radius: 3px;
+	border-top-right-radius: 3px;
+}
+
+#bootstrap-theme .panel > .list-group:last-child .list-group-item:last-child, #bootstrap-theme .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
+	border-bottom: 0;
+	border-bottom-right-radius: 3px;
+	border-bottom-left-radius: 3px;
+}
+
+#bootstrap-theme .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {
+	border-top-left-radius: 0;
+	border-top-right-radius: 0;
+}
+
+#bootstrap-theme .panel-heading + .list-group .list-group-item:first-child {
+	border-top-width: 0;
+}
+
+#bootstrap-theme .list-group + .panel-footer {
+	border-top-width: 0;
+}
+
+#bootstrap-theme .panel > .table, #bootstrap-theme .panel > .table-responsive > .table, #bootstrap-theme .panel > .panel-collapse > .table {
+	margin-bottom: 0;
+}
+
+#bootstrap-theme .panel > .table caption, #bootstrap-theme .panel > .table-responsive > .table caption, #bootstrap-theme .panel > .panel-collapse > .table caption {
+	padding-right: 15px;
+	padding-left: 15px;
+}
+
+#bootstrap-theme .panel > .table:first-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child {
+	border-top-left-radius: 3px;
+	border-top-right-radius: 3px;
+}
+
+#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child, #bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
+	border-top-left-radius: 3px;
+	border-top-right-radius: 3px;
+}
+
+#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, #bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, #bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, #bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+	border-top-left-radius: 3px;
+}
+
+#bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, #bootstrap-theme .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, #bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, #bootstrap-theme .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, #bootstrap-theme .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+	border-top-right-radius: 3px;
+}
+
+#bootstrap-theme .panel > .table:last-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child {
+	border-bottom-right-radius: 3px;
+	border-bottom-left-radius: 3px;
+}
+
+#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child, #bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
+	border-bottom-right-radius: 3px;
+	border-bottom-left-radius: 3px;
+}
+
+#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, #bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, #bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, #bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+	border-bottom-left-radius: 3px;
+}
+
+#bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, #bootstrap-theme .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, #bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, #bootstrap-theme .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, #bootstrap-theme .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+	border-bottom-right-radius: 3px;
+}
+
+#bootstrap-theme .panel > .panel-body + .table, #bootstrap-theme .panel > .panel-body + .table-responsive, #bootstrap-theme .panel > .table + .panel-body, #bootstrap-theme .panel > .table-responsive + .panel-body {
+	border-top: 1px solid #ddd;
+}
+
+#bootstrap-theme .panel > .table > tbody:first-child > tr:first-child th, #bootstrap-theme .panel > .table > tbody:first-child > tr:first-child td {
+	border-top: 0;
+}
+
+#bootstrap-theme .panel > .table-bordered, #bootstrap-theme .panel > .table-responsive > .table-bordered {
+	border: 0;
+}
+
+#bootstrap-theme .panel > .table-bordered > thead > tr > th:first-child, #bootstrap-theme .panel > .table-bordered > thead > tr > td:first-child, #bootstrap-theme .panel > .table-bordered > tbody > tr > th:first-child, #bootstrap-theme .panel > .table-bordered > tbody > tr > td:first-child, #bootstrap-theme .panel > .table-bordered > tfoot > tr > th:first-child, #bootstrap-theme .panel > .table-bordered > tfoot > tr > td:first-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
+	border-left: 0;
+}
+
+#bootstrap-theme .panel > .table-bordered > thead > tr > th:last-child, #bootstrap-theme .panel > .table-bordered > thead > tr > td:last-child, #bootstrap-theme .panel > .table-bordered > tbody > tr > th:last-child, #bootstrap-theme .panel > .table-bordered > tbody > tr > td:last-child, #bootstrap-theme .panel > .table-bordered > tfoot > tr > th:last-child, #bootstrap-theme .panel > .table-bordered > tfoot > tr > td:last-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, #bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
+	border-right: 0;
+}
+
+#bootstrap-theme .panel > .table-bordered > thead > tr:first-child > td, #bootstrap-theme .panel > .table-bordered > thead > tr:first-child > th, #bootstrap-theme .panel > .table-bordered > tbody > tr:first-child > td, #bootstrap-theme .panel > .table-bordered > tbody > tr:first-child > th, #bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, #bootstrap-theme .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, #bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, #bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+	border-bottom: 0;
+}
+
+#bootstrap-theme .panel > .table-bordered > tbody > tr:last-child > td, #bootstrap-theme .panel > .table-bordered > tbody > tr:last-child > th, #bootstrap-theme .panel > .table-bordered > tfoot > tr:last-child > td, #bootstrap-theme .panel > .table-bordered > tfoot > tr:last-child > th, #bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, #bootstrap-theme .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, #bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, #bootstrap-theme .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+	border-bottom: 0;
+}
+
+#bootstrap-theme .panel > .table-responsive {
+	margin-bottom: 0;
+	border: 0;
+}
+
+#bootstrap-theme .panel-group {
+	margin-bottom: 20px;
+}
+
+#bootstrap-theme .panel-group .panel {
+	margin-bottom: 0;
+	border-radius: 4px;
+}
+
+#bootstrap-theme .panel-group .panel + .panel {
+	margin-top: 5px;
+}
+
+#bootstrap-theme .panel-group .panel-heading {
+	border-bottom: 0;
+}
+
+#bootstrap-theme .panel-group .panel-heading + .panel-collapse > .panel-body, #bootstrap-theme .panel-group .panel-heading + .panel-collapse > .list-group {
+	border-top: 1px solid #ddd;
+}
+
+#bootstrap-theme .panel-group .panel-footer {
+	border-top: 0;
+}
+
+#bootstrap-theme .panel-group .panel-footer + .panel-collapse .panel-body {
+	border-bottom: 1px solid #ddd;
+}
+
+#bootstrap-theme .panel-default {
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-default > .panel-heading {
+	color: #555;
+	background-color: whitesmoke;
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-default > .panel-heading + .panel-collapse > .panel-body {
+	border-top-color: #ddd;
+}
+
+#bootstrap-theme .panel-default > .panel-heading .badge {
+	color: whitesmoke;
+	background-color: #555;
+}
+
+#bootstrap-theme .panel-default > .panel-footer + .panel-collapse > .panel-body {
+	border-bottom-color: #ddd;
+}
+
+#bootstrap-theme .panel-primary {
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-primary > .panel-heading {
+	color: white;
+	background-color: black;
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-primary > .panel-heading + .panel-collapse > .panel-body {
+	border-top-color: #ddd;
+}
+
+#bootstrap-theme .panel-primary > .panel-heading .badge {
+	color: black;
+	background-color: white;
+}
+
+#bootstrap-theme .panel-primary > .panel-footer + .panel-collapse > .panel-body {
+	border-bottom-color: #ddd;
+}
+
+#bootstrap-theme .panel-success {
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-success > .panel-heading {
+	color: #468847;
+	background-color: #73a839;
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-success > .panel-heading + .panel-collapse > .panel-body {
+	border-top-color: #ddd;
+}
+
+#bootstrap-theme .panel-success > .panel-heading .badge {
+	color: #73a839;
+	background-color: #468847;
+}
+
+#bootstrap-theme .panel-success > .panel-footer + .panel-collapse > .panel-body {
+	border-bottom-color: #ddd;
+}
+
+#bootstrap-theme .panel-info {
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-info > .panel-heading {
+	color: #3a87ad;
+	background-color: #cde8fe;
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-info > .panel-heading + .panel-collapse > .panel-body {
+	border-top-color: #ddd;
+}
+
+#bootstrap-theme .panel-info > .panel-heading .badge {
+	color: #cde8fe;
+	background-color: #3a87ad;
+}
+
+#bootstrap-theme .panel-info > .panel-footer + .panel-collapse > .panel-body {
+	border-bottom-color: #ddd;
+}
+
+#bootstrap-theme .panel-warning {
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-warning > .panel-heading {
+	color: #c09853;
+	background-color: #dd5600;
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-warning > .panel-heading + .panel-collapse > .panel-body {
+	border-top-color: #ddd;
+}
+
+#bootstrap-theme .panel-warning > .panel-heading .badge {
+	color: #dd5600;
+	background-color: #c09853;
+}
+
+#bootstrap-theme .panel-warning > .panel-footer + .panel-collapse > .panel-body {
+	border-bottom-color: #ddd;
+}
+
+#bootstrap-theme .panel-danger {
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-danger > .panel-heading {
+	color: #b94a48;
+	background-color: #c71c22;
+	border-color: #ddd;
+}
+
+#bootstrap-theme .panel-danger > .panel-heading + .panel-collapse > .panel-body {
+	border-top-color: #ddd;
+}
+
+#bootstrap-theme .panel-danger > .panel-heading .badge {
+	color: #c71c22;
+	background-color: #b94a48;
+}
+
+#bootstrap-theme .panel-danger > .panel-footer + .panel-collapse > .panel-body {
+	border-bottom-color: #ddd;
+}
+
+#bootstrap-theme .embed-responsive {
+	position: relative;
+	display: block;
+	height: 0;
+	padding: 0;
+	overflow: hidden;
+}
+
+#bootstrap-theme .embed-responsive .embed-responsive-item, #bootstrap-theme .embed-responsive iframe, #bootstrap-theme .embed-responsive embed, #bootstrap-theme .embed-responsive object, #bootstrap-theme .embed-responsive video {
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	border: 0;
+}
+
+#bootstrap-theme .embed-responsive-16by9 {
+	padding-bottom: 56.25%;
+}
+
+#bootstrap-theme .embed-responsive-4by3 {
+	padding-bottom: 75%;
+}
+
+#bootstrap-theme .well {
+	min-height: 20px;
+	padding: 19px;
+	margin-bottom: 20px;
+	background-color: whitesmoke;
+	border: 1px solid #e3e3e3;
+	border-radius: 4px;
+	-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+	box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
+}
+
+#bootstrap-theme .well blockquote {
+	border-color: #ddd;
+	border-color: rgba(0, 0, 0, .15);
+}
+
+#bootstrap-theme .well-lg {
+	padding: 24px;
+	border-radius: 6px;
+}
+
+#bootstrap-theme .well-sm {
+	padding: 9px;
+	border-radius: 3px;
+}
+
+#bootstrap-theme .close {
+	float: right;
+	font-size: 21px;
+	font-weight: bold;
+	line-height: 1;
+	color: black;
+	text-shadow: 0 1px 0 #fff;
+	-webkit-filter: alpha(opacity=20);
+	filter: alpha(opacity=20);
+	opacity: .2;
+}
+
+#bootstrap-theme .close:hover, #bootstrap-theme .close:focus {
+	color: black;
+	text-decoration: none;
+	cursor: pointer;
+	-webkit-filter: alpha(opacity=50);
+	filter: alpha(opacity=50);
+	opacity: .5;
+}
+
+#bootstrap-theme button.close {
+	padding: 0;
+	cursor: pointer;
+	background: transparent;
+	border: 0;
+	-webkit-appearance: none;
+	-moz-appearance: none;
+	appearance: none;
+}
+
+#bootstrap-theme .modal-open {
+	overflow: hidden;
+}
+
+#bootstrap-theme .modal {
+	position: fixed;
+	top: 0;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	z-index: 1050;
+	display: none;
+	overflow: hidden;
+	-webkit-overflow-scrolling: touch;
+	outline: 0;
+}
+
+#bootstrap-theme .modal.fade .modal-dialog {
+	-webkit-transform: translate(0, -25%);
+	-ms-transform: translate(0, -25%);
+	-o-transform: translate(0, -25%);
+	transform: translate(0, -25%);
+	-webkit-transition: -webkit-transform .3s ease-out;
+	-moz-transition: -moz-transform .3s ease-out;
+	-o-transition: -o-transform .3s ease-out;
+	transition: -ms-transform .3s ease-out;
+	transition: -webkit-transform .3s ease-out;
+	transition: transform .3s ease-out;
+}
+
+#bootstrap-theme .modal.in .modal-dialog {
+	-webkit-transform: translate(0, 0);
+	-ms-transform: translate(0, 0);
+	-o-transform: translate(0, 0);
+	transform: translate(0, 0);
+}
+
+#bootstrap-theme .modal-open .modal {
+	overflow-x: hidden;
+	overflow-y: auto;
+}
+
+#bootstrap-theme .modal-dialog {
+	position: relative;
+	width: auto;
+	margin: 10px;
+}
+
+#bootstrap-theme .modal-content {
+	position: relative;
+	background-color: white;
+	-webkit-background-clip: padding-box;
+	background-clip: padding-box;
+	border: 1px solid #999;
+	border: 1px solid rgba(0, 0, 0, .2);
+	border-radius: 6px;
+	-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+	box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
+	outline: 0;
+}
+
+#bootstrap-theme .modal-backdrop {
+	position: fixed;
+	top: 0;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	z-index: 1040;
+	background-color: black;
+}
+
+#bootstrap-theme .modal-backdrop.fade {
+	-webkit-filter: alpha(opacity=0);
+	filter: alpha(opacity=0);
+	opacity: 0;
+}
+
+#bootstrap-theme .modal-backdrop.in {
+	-webkit-filter: alpha(opacity=50);
+	filter: alpha(opacity=50);
+	opacity: .5;
+}
+
+#bootstrap-theme .modal-header {
+	padding: 15px;
+	border-bottom: 1px solid #e5e5e5;
+}
+
+#bootstrap-theme .modal-header:before, #bootstrap-theme .modal-header:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .modal-header:after {
+	clear: both;
+}
+
+#bootstrap-theme .modal-header .close {
+	margin-top: -2px;
+}
+
+#bootstrap-theme .modal-title {
+	margin: 0;
+	line-height: 1.428571429;
+}
+
+#bootstrap-theme .modal-body {
+	position: relative;
+	padding: 20px;
+}
+
+#bootstrap-theme .modal-footer {
+	padding: 20px;
+	text-align: right;
+	border-top: 1px solid #e5e5e5;
+}
+
+#bootstrap-theme .modal-footer:before, #bootstrap-theme .modal-footer:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .modal-footer:after {
+	clear: both;
+}
+
+#bootstrap-theme .modal-footer .btn + .btn {
+	margin-bottom: 0;
+	margin-left: 5px;
+}
+
+#bootstrap-theme .modal-footer .btn-group .btn + .btn {
+	margin-left: -1px;
+}
+
+#bootstrap-theme .modal-footer .btn-block + .btn-block {
+	margin-left: 0;
+}
+
+#bootstrap-theme .modal-scrollbar-measure {
+	position: absolute;
+	top: -9999px;
+	width: 50px;
+	height: 50px;
+	overflow: scroll;
+}
+
+@media (min-width: 768px) {
+	#bootstrap-theme .modal-dialog {
+		width: 600px;
+		margin: 30px auto;
+	}
+	
+	#bootstrap-theme .modal-content {
+		-webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+		box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
+	}
+	
+	#bootstrap-theme .modal-sm {
+		width: 300px;
+	}
+}
+
+@media (min-width: 992px) {
+	#bootstrap-theme .modal-lg {
+		width: 900px;
+	}
+}
+
+#bootstrap-theme .tooltip {
+	position: absolute;
+	z-index: 1070;
+	display: block;
+	font-family: "Verdana", "Helvetica Neue", Helvetica, Arial, sans-serif;
+	font-style: normal;
+	font-weight: 400;
+	line-height: 1.428571429;
+	line-break: auto;
+	text-align: left;
+	text-align: start;
+	text-decoration: none;
+	text-shadow: none;
+	text-transform: none;
+	letter-spacing: normal;
+	-ms-word-break: normal;
+	word-break: normal;
+	word-spacing: normal;
+	word-wrap: normal;
+	white-space: normal;
+	font-size: 12px;
+	-webkit-filter: alpha(opacity=0);
+	filter: alpha(opacity=0);
+	opacity: 0;
+}
+
+#bootstrap-theme .tooltip.in {
+	-webkit-filter: alpha(opacity=90);
+	filter: alpha(opacity=90);
+	opacity: .9;
+}
+
+#bootstrap-theme .tooltip.top {
+	padding: 5px 0;
+	margin-top: -3px;
+}
+
+#bootstrap-theme .tooltip.right {
+	padding: 0 5px;
+	margin-left: 3px;
+}
+
+#bootstrap-theme .tooltip.bottom {
+	padding: 5px 0;
+	margin-top: 3px;
+}
+
+#bootstrap-theme .tooltip.left {
+	padding: 0 5px;
+	margin-left: -3px;
+}
+
+#bootstrap-theme .tooltip.top .tooltip-arrow {
+	bottom: 0;
+	left: 50%;
+	margin-left: -5px;
+	border-width: 5px 5px 0;
+	border-top-color: black;
+}
+
+#bootstrap-theme .tooltip.top-left .tooltip-arrow {
+	right: 5px;
+	bottom: 0;
+	margin-bottom: -5px;
+	border-width: 5px 5px 0;
+	border-top-color: black;
+}
+
+#bootstrap-theme .tooltip.top-right .tooltip-arrow {
+	bottom: 0;
+	left: 5px;
+	margin-bottom: -5px;
+	border-width: 5px 5px 0;
+	border-top-color: black;
+}
+
+#bootstrap-theme .tooltip.right .tooltip-arrow {
+	top: 50%;
+	left: 0;
+	margin-top: -5px;
+	border-width: 5px 5px 5px 0;
+	border-right-color: black;
+}
+
+#bootstrap-theme .tooltip.left .tooltip-arrow {
+	top: 50%;
+	right: 0;
+	margin-top: -5px;
+	border-width: 5px 0 5px 5px;
+	border-left-color: black;
+}
+
+#bootstrap-theme .tooltip.bottom .tooltip-arrow {
+	top: 0;
+	left: 50%;
+	margin-left: -5px;
+	border-width: 0 5px 5px;
+	border-bottom-color: black;
+}
+
+#bootstrap-theme .tooltip.bottom-left .tooltip-arrow {
+	top: 0;
+	right: 5px;
+	margin-top: -5px;
+	border-width: 0 5px 5px;
+	border-bottom-color: black;
+}
+
+#bootstrap-theme .tooltip.bottom-right .tooltip-arrow {
+	top: 0;
+	left: 5px;
+	margin-top: -5px;
+	border-width: 0 5px 5px;
+	border-bottom-color: black;
+}
+
+#bootstrap-theme .tooltip-inner {
+	max-width: 200px;
+	padding: 3px 8px;
+	color: white;
+	text-align: center;
+	background-color: black;
+	border-radius: 4px;
+}
+
+#bootstrap-theme .tooltip-arrow {
+	position: absolute;
+	width: 0;
+	height: 0;
+	border-color: transparent;
+	border-style: solid;
+}
+
+#bootstrap-theme .popover {
+	position: absolute;
+	top: 0;
+	left: 0;
+	z-index: 1060;
+	display: none;
+	max-width: 276px;
+	padding: 1px;
+	font-family: "Verdana", "Helvetica Neue", Helvetica, Arial, sans-serif;
+	font-style: normal;
+	font-weight: 400;
+	line-height: 1.428571429;
+	line-break: auto;
+	text-align: left;
+	text-align: start;
+	text-decoration: none;
+	text-shadow: none;
+	text-transform: none;
+	letter-spacing: normal;
+	-ms-word-break: normal;
+	word-break: normal;
+	word-spacing: normal;
+	word-wrap: normal;
+	white-space: normal;
+	font-size: 14px;
+	background-color: white;
+	-webkit-background-clip: padding-box;
+	background-clip: padding-box;
+	border: 1px solid #ccc;
+	border: 1px solid rgba(0, 0, 0, .2);
+	border-radius: 6px;
+	-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+	box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
+}
+
+#bootstrap-theme .popover.top {
+	margin-top: -10px;
+}
+
+#bootstrap-theme .popover.right {
+	margin-left: 10px;
+}
+
+#bootstrap-theme .popover.bottom {
+	margin-top: 10px;
+}
+
+#bootstrap-theme .popover.left {
+	margin-left: -10px;
+}
+
+#bootstrap-theme .popover > .arrow {
+	border-width: 11px;
+}
+
+#bootstrap-theme .popover > .arrow, #bootstrap-theme .popover > .arrow:after {
+	position: absolute;
+	display: block;
+	width: 0;
+	height: 0;
+	border-color: transparent;
+	border-style: solid;
+}
+
+#bootstrap-theme .popover > .arrow:after {
+	content: "";
+	border-width: 10px;
+}
+
+#bootstrap-theme .popover.top > .arrow {
+	bottom: -11px;
+	left: 50%;
+	margin-left: -11px;
+	border-top-color: #999;
+	border-top-color: rgba(0, 0, 0, .25);
+	border-bottom-width: 0;
+}
+
+#bootstrap-theme .popover.top > .arrow:after {
+	bottom: 1px;
+	margin-left: -10px;
+	content: " ";
+	border-top-color: white;
+	border-bottom-width: 0;
+}
+
+#bootstrap-theme .popover.right > .arrow {
+	top: 50%;
+	left: -11px;
+	margin-top: -11px;
+	border-right-color: #999;
+	border-right-color: rgba(0, 0, 0, .25);
+	border-left-width: 0;
+}
+
+#bootstrap-theme .popover.right > .arrow:after {
+	bottom: -10px;
+	left: 1px;
+	content: " ";
+	border-right-color: white;
+	border-left-width: 0;
+}
+
+#bootstrap-theme .popover.bottom > .arrow {
+	top: -11px;
+	left: 50%;
+	margin-left: -11px;
+	border-top-width: 0;
+	border-bottom-color: #999;
+	border-bottom-color: rgba(0, 0, 0, .25);
+}
+
+#bootstrap-theme .popover.bottom > .arrow:after {
+	top: 1px;
+	margin-left: -10px;
+	content: " ";
+	border-top-width: 0;
+	border-bottom-color: white;
+}
+
+#bootstrap-theme .popover.left > .arrow {
+	top: 50%;
+	right: -11px;
+	margin-top: -11px;
+	border-right-width: 0;
+	border-left-color: #999;
+	border-left-color: rgba(0, 0, 0, .25);
+}
+
+#bootstrap-theme .popover.left > .arrow:after {
+	right: 1px;
+	bottom: -10px;
+	content: " ";
+	border-right-width: 0;
+	border-left-color: white;
+}
+
+#bootstrap-theme .popover-title {
+	padding: 8px 14px;
+	margin: 0;
+	font-size: 14px;
+	background-color: #f7f7f7;
+	border-bottom: 1px solid #ebebeb;
+	border-radius: 5px 5px 0 0;
+}
+
+#bootstrap-theme .popover-content {
+	padding: 9px 14px;
+}
+
+#bootstrap-theme .carousel {
+	position: relative;
+}
+
+#bootstrap-theme .carousel-inner {
+	position: relative;
+	width: 100%;
+	overflow: hidden;
+}
+
+#bootstrap-theme .carousel-inner > .item {
+	position: relative;
+	display: none;
+	-webkit-transition: .6s ease-in-out left;
+	-o-transition: .6s ease-in-out left;
+	transition: .6s ease-in-out left;
+}
+
+#bootstrap-theme .carousel-inner > .item > img, #bootstrap-theme .carousel-inner > .item > a > img {
+	display: block;
+	max-width: 100%;
+	height: auto;
+	line-height: 1;
+}
+
+@media (transform-3d), (-webkit-transform-3d) {
+	#bootstrap-theme .carousel-inner > .item {
+		-webkit-transition: -webkit-transform .6s ease-in-out;
+		-moz-transition: -moz-transform .6s ease-in-out;
+		-o-transition: -o-transform .6s ease-in-out;
+		transition: -ms-transform .6s ease-in-out;
+		transition: -webkit-transform .6s ease-in-out;
+		transition: transform .6s ease-in-out;
+		-webkit-backface-visibility: hidden;
+		-moz-backface-visibility: hidden;
+		backface-visibility: hidden;
+		-webkit-perspective: 1000px;
+		-moz-perspective: 1000px;
+		perspective: 1000px;
+	}
+	
+	#bootstrap-theme .carousel-inner > .item.next, #bootstrap-theme .carousel-inner > .item.active.right {
+		-webkit-transform: translate3d(100%, 0, 0);
+		-ms-transform: translate3d(100%, 0, 0);
+		transform: translate3d(100%, 0, 0);
+		left: 0;
+	}
+	
+	#bootstrap-theme .carousel-inner > .item.prev, #bootstrap-theme .carousel-inner > .item.active.left {
+		-webkit-transform: translate3d(-100%, 0, 0);
+		-ms-transform: translate3d(-100%, 0, 0);
+		transform: translate3d(-100%, 0, 0);
+		left: 0;
+	}
+	
+	#bootstrap-theme .carousel-inner > .item.next.left, #bootstrap-theme .carousel-inner > .item.prev.right, #bootstrap-theme .carousel-inner > .item.active {
+		-webkit-transform: translate3d(0, 0, 0);
+		-ms-transform: translate3d(0, 0, 0);
+		transform: translate3d(0, 0, 0);
+		left: 0;
+	}
+}
+
+#bootstrap-theme .carousel-inner > .active, #bootstrap-theme .carousel-inner > .next, #bootstrap-theme .carousel-inner > .prev {
+	display: block;
+}
+
+#bootstrap-theme .carousel-inner > .active {
+	left: 0;
+}
+
+#bootstrap-theme .carousel-inner > .next, #bootstrap-theme .carousel-inner > .prev {
+	position: absolute;
+	top: 0;
+	width: 100%;
+}
+
+#bootstrap-theme .carousel-inner > .next {
+	left: 100%;
+}
+
+#bootstrap-theme .carousel-inner > .prev {
+	left: -100%;
+}
+
+#bootstrap-theme .carousel-inner > .next.left, #bootstrap-theme .carousel-inner > .prev.right {
+	left: 0;
+}
+
+#bootstrap-theme .carousel-inner > .active.left {
+	left: -100%;
+}
+
+#bootstrap-theme .carousel-inner > .active.right {
+	left: 100%;
+}
+
+#bootstrap-theme .carousel-control {
+	position: absolute;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	width: 15%;
+	font-size: 20px;
+	color: white;
+	text-align: center;
+	text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+	background-color: rgba(0, 0, 0, 0);
+	-webkit-filter: alpha(opacity=50);
+	filter: alpha(opacity=50);
+	opacity: .5;
+}
+
+#bootstrap-theme .carousel-control.left {
+	background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+	background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+	background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
+	-webkit-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000", endColorstr="#00000000", GradientType=1);
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000", endColorstr="#00000000", GradientType=1);
+	background-repeat: repeat-x;
+}
+
+#bootstrap-theme .carousel-control.right {
+	right: 0;
+	left: auto;
+	background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+	background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+	background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
+	-webkit-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000", endColorstr="#80000000", GradientType=1);
+	filter: progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000", endColorstr="#80000000", GradientType=1);
+	background-repeat: repeat-x;
+}
+
+#bootstrap-theme .carousel-control:hover, #bootstrap-theme .carousel-control:focus {
+	color: white;
+	text-decoration: none;
+	outline: 0;
+	-webkit-filter: alpha(opacity=90);
+	filter: alpha(opacity=90);
+	opacity: .9;
+}
+
+#bootstrap-theme .carousel-control .icon-prev, #bootstrap-theme .carousel-control .icon-next, #bootstrap-theme .carousel-control .glyphicon-chevron-left, #bootstrap-theme .carousel-control .glyphicon-chevron-right {
+	position: absolute;
+	top: 50%;
+	z-index: 5;
+	display: inline-block;
+	margin-top: -10px;
+}
+
+#bootstrap-theme .carousel-control .icon-prev, #bootstrap-theme .carousel-control .glyphicon-chevron-left {
+	left: 50%;
+	margin-left: -10px;
+}
+
+#bootstrap-theme .carousel-control .icon-next, #bootstrap-theme .carousel-control .glyphicon-chevron-right {
+	right: 50%;
+	margin-right: -10px;
+}
+
+#bootstrap-theme .carousel-control .icon-prev, #bootstrap-theme .carousel-control .icon-next {
+	width: 20px;
+	height: 20px;
+	font-family: serif;
+	line-height: 1;
+}
+
+#bootstrap-theme .carousel-control .icon-prev:before {
+	content: "‹";
+}
+
+#bootstrap-theme .carousel-control .icon-next:before {
+	content: "›";
+}
+
+#bootstrap-theme .carousel-indicators {
+	position: absolute;
+	bottom: 10px;
+	left: 50%;
+	z-index: 15;
+	width: 60%;
+	padding-left: 0;
+	margin-left: -30%;
+	text-align: center;
+	list-style: none;
+}
+
+#bootstrap-theme .carousel-indicators li {
+	display: inline-block;
+	width: 10px;
+	height: 10px;
+	margin: 1px;
+	text-indent: -999px;
+	cursor: pointer;
+	background-color: #000 \9;
+	background-color: rgba(0, 0, 0, 0);
+	border: 1px solid white;
+	border-radius: 10px;
+}
+
+#bootstrap-theme .carousel-indicators .active {
+	width: 12px;
+	height: 12px;
+	margin: 0;
+	background-color: white;
+}
+
+#bootstrap-theme .carousel-caption {
+	position: absolute;
+	right: 15%;
+	bottom: 20px;
+	left: 15%;
+	z-index: 10;
+	padding-top: 20px;
+	padding-bottom: 20px;
+	color: white;
+	text-align: center;
+	text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
+}
+
+#bootstrap-theme .carousel-caption .btn {
+	text-shadow: none;
+}
+
+@media screen and (min-width: 768px) {
+	#bootstrap-theme .carousel-control .glyphicon-chevron-left, #bootstrap-theme .carousel-control .glyphicon-chevron-right, #bootstrap-theme .carousel-control .icon-prev, #bootstrap-theme .carousel-control .icon-next {
+		width: 30px;
+		height: 30px;
+		margin-top: -10px;
+		font-size: 30px;
+	}
+	
+	#bootstrap-theme .carousel-control .glyphicon-chevron-left, #bootstrap-theme .carousel-control .icon-prev {
+		margin-left: -10px;
+	}
+	
+	#bootstrap-theme .carousel-control .glyphicon-chevron-right, #bootstrap-theme .carousel-control .icon-next {
+		margin-right: -10px;
+	}
+	
+	#bootstrap-theme .carousel-caption {
+		right: 20%;
+		left: 20%;
+		padding-bottom: 30px;
+	}
+	
+	#bootstrap-theme .carousel-indicators {
+		bottom: 20px;
+	}
+}
+
+#bootstrap-theme .clearfix:before, #bootstrap-theme .clearfix:after {
+	display: table;
+	content: " ";
+}
+
+#bootstrap-theme .clearfix:after {
+	clear: both;
+}
+
+#bootstrap-theme .center-block {
+	display: block;
+	margin-right: auto;
+	margin-left: auto;
+}
+
+#bootstrap-theme .pull-right {
+	float: right !important;
+}
+
+#bootstrap-theme .pull-left {
+	float: left !important;
+}
+
+#bootstrap-theme .hide {
+	display: none !important;
+}
+
+#bootstrap-theme .show {
+	display: block !important;
+}
+
+#bootstrap-theme .invisible {
+	visibility: hidden;
+}
+
+#bootstrap-theme .text-hide {
+	font: 0/0 a;
+	color: transparent;
+	text-shadow: none;
+	background-color: transparent;
+	border: 0;
+}
+
+#bootstrap-theme .hidden {
+	display: none !important;
+}
+
+#bootstrap-theme .affix {
+	position: fixed;
+}
+
+@-ms-viewport {
+	width: device-width;
+}
+
+#bootstrap-theme .visible-xs {
+	display: none !important;
+}
+
+#bootstrap-theme .visible-sm {
+	display: none !important;
+}
+
+#bootstrap-theme .visible-md {
+	display: none !important;
+}
+
+#bootstrap-theme .visible-lg {
+	display: none !important;
+}
+
+#bootstrap-theme .visible-xs-block, #bootstrap-theme .visible-xs-inline, #bootstrap-theme .visible-xs-inline-block, #bootstrap-theme .visible-sm-block, #bootstrap-theme .visible-sm-inline, #bootstrap-theme .visible-sm-inline-block, #bootstrap-theme .visible-md-block, #bootstrap-theme .visible-md-inline, #bootstrap-theme .visible-md-inline-block, #bootstrap-theme .visible-lg-block, #bootstrap-theme .visible-lg-inline, #bootstrap-theme .visible-lg-inline-block {
+	display: none !important;
+}
+
+@media (max-width: 767px) {
+	#bootstrap-theme .visible-xs {
+		display: block !important;
+	}
+	
+	#bootstrap-theme table.visible-xs {
+		display: table !important;
+	}
+	
+	#bootstrap-theme tr.visible-xs {
+		display: table-row !important;
+	}
+	
+	#bootstrap-theme th.visible-xs, #bootstrap-theme td.visible-xs {
+		display: table-cell !important;
+	}
+}
+
+@media (max-width: 767px) {
+	#bootstrap-theme .visible-xs-block {
+		display: block !important;
+	}
+}
+
+@media (max-width: 767px) {
+	#bootstrap-theme .visible-xs-inline {
+		display: inline !important;
+	}
+}
+
+@media (max-width: 767px) {
+	#bootstrap-theme .visible-xs-inline-block {
+		display: inline-block !important;
+	}
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+	#bootstrap-theme .visible-sm {
+		display: block !important;
+	}
+	
+	#bootstrap-theme table.visible-sm {
+		display: table !important;
+	}
+	
+	#bootstrap-theme tr.visible-sm {
+		display: table-row !important;
+	}
+	
+	#bootstrap-theme th.visible-sm, #bootstrap-theme td.visible-sm {
+		display: table-cell !important;
+	}
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+	#bootstrap-theme .visible-sm-block {
+		display: block !important;
+	}
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+	#bootstrap-theme .visible-sm-inline {
+		display: inline !important;
+	}
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+	#bootstrap-theme .visible-sm-inline-block {
+		display: inline-block !important;
+	}
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+	#bootstrap-theme .visible-md {
+		display: block !important;
+	}
+	
+	#bootstrap-theme table.visible-md {
+		display: table !important;
+	}
+	
+	#bootstrap-theme tr.visible-md {
+		display: table-row !important;
+	}
+	
+	#bootstrap-theme th.visible-md, #bootstrap-theme td.visible-md {
+		display: table-cell !important;
+	}
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+	#bootstrap-theme .visible-md-block {
+		display: block !important;
+	}
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+	#bootstrap-theme .visible-md-inline {
+		display: inline !important;
+	}
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+	#bootstrap-theme .visible-md-inline-block {
+		display: inline-block !important;
+	}
+}
+
+@media (min-width: 1200px) {
+	#bootstrap-theme .visible-lg {
+		display: block !important;
+	}
+	
+	#bootstrap-theme table.visible-lg {
+		display: table !important;
+	}
+	
+	#bootstrap-theme tr.visible-lg {
+		display: table-row !important;
+	}
+	
+	#bootstrap-theme th.visible-lg, #bootstrap-theme td.visible-lg {
+		display: table-cell !important;
+	}
+}
+
+@media (min-width: 1200px) {
+	#bootstrap-theme .visible-lg-block {
+		display: block !important;
+	}
+}
+
+@media (min-width: 1200px) {
+	#bootstrap-theme .visible-lg-inline {
+		display: inline !important;
+	}
+}
+
+@media (min-width: 1200px) {
+	#bootstrap-theme .visible-lg-inline-block {
+		display: inline-block !important;
+	}
+}
+
+@media (max-width: 767px) {
+	#bootstrap-theme .hidden-xs {
+		display: none !important;
+	}
+}
+
+@media (min-width: 768px) and (max-width: 991px) {
+	#bootstrap-theme .hidden-sm {
+		display: none !important;
+	}
+}
+
+@media (min-width: 992px) and (max-width: 1199px) {
+	#bootstrap-theme .hidden-md {
+		display: none !important;
+	}
+}
+
+@media (min-width: 1200px) {
+	#bootstrap-theme .hidden-lg {
+		display: none !important;
+	}
+}
+
+#bootstrap-theme .visible-print {
+	display: none !important;
+}
+
+@media print {
+	#bootstrap-theme .visible-print {
+		display: block !important;
+	}
+	
+	#bootstrap-theme table.visible-print {
+		display: table !important;
+	}
+	
+	#bootstrap-theme tr.visible-print {
+		display: table-row !important;
+	}
+	
+	#bootstrap-theme th.visible-print, #bootstrap-theme td.visible-print {
+		display: table-cell !important;
+	}
+}
+
+#bootstrap-theme .visible-print-block {
+	display: none !important;
+}
+
+@media print {
+	#bootstrap-theme .visible-print-block {
+		display: block !important;
+	}
+}
+
+#bootstrap-theme .visible-print-inline {
+	display: none !important;
+}
+
+@media print {
+	#bootstrap-theme .visible-print-inline {
+		display: inline !important;
+	}
+}
+
+#bootstrap-theme .visible-print-inline-block {
+	display: none !important;
+}
+
+@media print {
+	#bootstrap-theme .visible-print-inline-block {
+		display: inline-block !important;
+	}
+}
+
+@media print {
+	#bootstrap-theme .hidden-print {
+		display: none !important;
+	}
+}
+
+#bootstrap-theme .form-control .select2-choice {
+	border: 0;
+	border-radius: 2px;
+}
+
+#bootstrap-theme .form-control .select2-choice .select2-arrow {
+	border-radius: 0 2px 2px 0;
+}
+
+#bootstrap-theme .form-control.select2-container {
+	height: auto !important;
+	padding: 0;
+}
+
+#bootstrap-theme .form-control.select2-container.select2-dropdown-open {
+	border-color: #5897fb;
+	border-radius: 3px 3px 0 0;
+}
+
+#bootstrap-theme .form-control .select2-container.select2-dropdown-open .select2-choices {
+	border-radius: 3px 3px 0 0;
+}
+
+#bootstrap-theme .form-control.select2-container .select2-choices {
+	border: 0 !important;
+	border-radius: 3px;
+}
+
+#bootstrap-theme .control-group.warning .select2-container .select2-choice, #bootstrap-theme .control-group.warning .select2-container .select2-choices, #bootstrap-theme .control-group.warning .select2-container-active .select2-choice, #bootstrap-theme .control-group.warning .select2-container-active .select2-choices, #bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice, #bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices, #bootstrap-theme .control-group.warning .select2-container-multi.select2-container-active .select2-choices {
+	border: 1px solid #c09853 !important;
+}
+
+#bootstrap-theme .control-group.warning .select2-container .select2-choice div {
+	border-left: 1px solid #c09853 !important;
+	background: #fcf8e3 !important;
+}
+
+#bootstrap-theme .control-group.error .select2-container .select2-choice, #bootstrap-theme .control-group.error .select2-container .select2-choices, #bootstrap-theme .control-group.error .select2-container-active .select2-choice, #bootstrap-theme .control-group.error .select2-container-active .select2-choices, #bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice, #bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices, #bootstrap-theme .control-group.error .select2-container-multi.select2-container-active .select2-choices {
+	border: 1px solid #b94a48 !important;
+}
+
+#bootstrap-theme .control-group.error .select2-container .select2-choice div {
+	border-left: 1px solid #b94a48 !important;
+	background: #f2dede !important;
+}
+
+#bootstrap-theme .control-group.info .select2-container .select2-choice, #bootstrap-theme .control-group.info .select2-container .select2-choices, #bootstrap-theme .control-group.info .select2-container-active .select2-choice, #bootstrap-theme .control-group.info .select2-container-active .select2-choices, #bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice, #bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices, #bootstrap-theme .control-group.info .select2-container-multi.select2-container-active .select2-choices {
+	border: 1px solid #3a87ad !important;
+}
+
+#bootstrap-theme .control-group.info .select2-container .select2-choice div {
+	border-left: 1px solid #3a87ad !important;
+	background: #d9edf7 !important;
+}
+
+#bootstrap-theme .control-group.success .select2-container .select2-choice, #bootstrap-theme .control-group.success .select2-container .select2-choices, #bootstrap-theme .control-group.success .select2-container-active .select2-choice, #bootstrap-theme .control-group.success .select2-container-active .select2-choices, #bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice, #bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices, #bootstrap-theme .control-group.success .select2-container-multi.select2-container-active .select2-choices {
+	border: 1px solid #468847 !important;
+}
+
+#bootstrap-theme .control-group.success .select2-container .select2-choice div {
+	border-left: 1px solid #468847 !important;
+	background: #dff0d8 !important;
+}
diff --git a/civicrm/ext/greenwich/dist/bootstrap3.min.css b/civicrm/ext/greenwich/dist/bootstrap3.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..b3829486bffddae1d72a5f5acf7c52d5acf67643
--- /dev/null
+++ b/civicrm/ext/greenwich/dist/bootstrap3.min.css
@@ -0,0 +1 @@
+#bootstrap-theme html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}#bootstrap-theme body{margin:0}#bootstrap-theme article,#bootstrap-theme aside,#bootstrap-theme details,#bootstrap-theme figcaption,#bootstrap-theme figure,#bootstrap-theme footer,#bootstrap-theme header,#bootstrap-theme hgroup,#bootstrap-theme main,#bootstrap-theme menu,#bootstrap-theme nav,#bootstrap-theme section,#bootstrap-theme summary{display:block}#bootstrap-theme audio,#bootstrap-theme canvas,#bootstrap-theme progress,#bootstrap-theme video{display:inline-block;vertical-align:baseline}#bootstrap-theme audio:not([controls]){display:none;height:0}#bootstrap-theme [hidden],#bootstrap-theme template{display:none}#bootstrap-theme a{background-color:transparent}#bootstrap-theme a:active,#bootstrap-theme a:hover{outline:0}#bootstrap-theme abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}#bootstrap-theme b,#bootstrap-theme strong{font-weight:700}#bootstrap-theme dfn{font-style:italic}#bootstrap-theme h1{font-size:2em;margin:.67em 0}#bootstrap-theme mark{background:#ff0;color:#000}#bootstrap-theme small{font-size:80%}#bootstrap-theme sub,#bootstrap-theme sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}#bootstrap-theme sup{top:-.5em}#bootstrap-theme sub{bottom:-.25em}#bootstrap-theme img{border:0}#bootstrap-theme svg:not(:root){overflow:hidden}#bootstrap-theme figure{margin:1em 40px}#bootstrap-theme hr{box-sizing:content-box;height:0}#bootstrap-theme pre{overflow:auto}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:monospace,monospace;font-size:1em}#bootstrap-theme button,#bootstrap-theme input,#bootstrap-theme optgroup,#bootstrap-theme select,#bootstrap-theme textarea{color:inherit;font:inherit;margin:0}#bootstrap-theme button{overflow:visible}#bootstrap-theme button,#bootstrap-theme select{text-transform:none}#bootstrap-theme button,#bootstrap-theme html input[type=button],#bootstrap-theme input[type=reset],#bootstrap-theme input[type=submit]{-webkit-appearance:button;cursor:pointer}#bootstrap-theme button[disabled],#bootstrap-theme html input[disabled]{cursor:default}#bootstrap-theme button::-moz-focus-inner,#bootstrap-theme input::-moz-focus-inner{border:0;padding:0}#bootstrap-theme input{line-height:normal}#bootstrap-theme input[type=checkbox],#bootstrap-theme input[type=radio]{box-sizing:border-box;padding:0}#bootstrap-theme input[type=number]::-webkit-inner-spin-button,#bootstrap-theme input[type=number]::-webkit-outer-spin-button{height:auto}#bootstrap-theme input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}#bootstrap-theme input[type=search]::-webkit-search-cancel-button,#bootstrap-theme input[type=search]::-webkit-search-decoration{-webkit-appearance:none}#bootstrap-theme fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}#bootstrap-theme legend{border:0;padding:0}#bootstrap-theme textarea{overflow:auto}#bootstrap-theme optgroup{font-weight:700}#bootstrap-theme table{border-collapse:collapse;border-spacing:0}#bootstrap-theme td,#bootstrap-theme th{padding:0}@media print{#bootstrap-theme *,#bootstrap-theme *:before,#bootstrap-theme *:after{color:#000 !important;text-shadow:none !important;background:0 0 !important;box-shadow:none !important}#bootstrap-theme a,#bootstrap-theme a:visited{text-decoration:underline}#bootstrap-theme a[href]:after{content:" (" attr(href) ")"}#bootstrap-theme abbr[title]:after{content:" (" attr(title) ")"}#bootstrap-theme a[href^="#"]:after,#bootstrap-theme a[href^="javascript:"]:after{content:""}#bootstrap-theme pre,#bootstrap-theme blockquote{border:1px solid #999;page-break-inside:avoid}#bootstrap-theme thead{display:table-header-group}#bootstrap-theme tr,#bootstrap-theme img{page-break-inside:avoid}#bootstrap-theme img{max-width:100% !important}#bootstrap-theme p,#bootstrap-theme h2,#bootstrap-theme h3{orphans:3;widows:3}#bootstrap-theme h2,#bootstrap-theme h3{page-break-after:avoid}#bootstrap-theme .navbar{display:none}#bootstrap-theme .btn>.caret,#bootstrap-theme .dropup>.btn>.caret{border-top-color:#000 !important}#bootstrap-theme .label{border:1px solid #000}#bootstrap-theme .table{border-collapse:collapse !important}#bootstrap-theme .table td,#bootstrap-theme .table th{background-color:#fff !important}#bootstrap-theme .table-bordered th,#bootstrap-theme .table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:"Glyphicons Halflings";src:url("../fonts/glyphicons-halflings-regular.eot");src:url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/glyphicons-halflings-regular.woff2") format("woff2"),url("../fonts/glyphicons-halflings-regular.woff") format("woff"),url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"),url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg")}#bootstrap-theme .glyphicon{position:relative;top:1px;display:inline-block;font-family:"Glyphicons Halflings";font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#bootstrap-theme .glyphicon-asterisk:before{content:"*"}#bootstrap-theme .glyphicon-plus:before{content:"+"}#bootstrap-theme .glyphicon-euro:before,#bootstrap-theme .glyphicon-eur:before{content:"€"}#bootstrap-theme .glyphicon-minus:before{content:"−"}#bootstrap-theme .glyphicon-cloud:before{content:"☁"}#bootstrap-theme .glyphicon-envelope:before{content:"✉"}#bootstrap-theme .glyphicon-pencil:before{content:"✏"}#bootstrap-theme .glyphicon-glass:before{content:""}#bootstrap-theme .glyphicon-music:before{content:""}#bootstrap-theme .glyphicon-search:before{content:""}#bootstrap-theme .glyphicon-heart:before{content:""}#bootstrap-theme .glyphicon-star:before{content:""}#bootstrap-theme .glyphicon-star-empty:before{content:""}#bootstrap-theme .glyphicon-user:before{content:""}#bootstrap-theme .glyphicon-film:before{content:""}#bootstrap-theme .glyphicon-th-large:before{content:""}#bootstrap-theme .glyphicon-th:before{content:""}#bootstrap-theme .glyphicon-th-list:before{content:""}#bootstrap-theme .glyphicon-ok:before{content:""}#bootstrap-theme .glyphicon-remove:before{content:""}#bootstrap-theme .glyphicon-zoom-in:before{content:""}#bootstrap-theme .glyphicon-zoom-out:before{content:""}#bootstrap-theme .glyphicon-off:before{content:""}#bootstrap-theme .glyphicon-signal:before{content:""}#bootstrap-theme .glyphicon-cog:before{content:""}#bootstrap-theme .glyphicon-trash:before{content:""}#bootstrap-theme .glyphicon-home:before{content:""}#bootstrap-theme .glyphicon-file:before{content:""}#bootstrap-theme .glyphicon-time:before{content:""}#bootstrap-theme .glyphicon-road:before{content:""}#bootstrap-theme .glyphicon-download-alt:before{content:""}#bootstrap-theme .glyphicon-download:before{content:""}#bootstrap-theme .glyphicon-upload:before{content:""}#bootstrap-theme .glyphicon-inbox:before{content:""}#bootstrap-theme .glyphicon-play-circle:before{content:""}#bootstrap-theme .glyphicon-repeat:before{content:""}#bootstrap-theme .glyphicon-refresh:before{content:""}#bootstrap-theme .glyphicon-list-alt:before{content:""}#bootstrap-theme .glyphicon-lock:before{content:""}#bootstrap-theme .glyphicon-flag:before{content:""}#bootstrap-theme .glyphicon-headphones:before{content:""}#bootstrap-theme .glyphicon-volume-off:before{content:""}#bootstrap-theme .glyphicon-volume-down:before{content:""}#bootstrap-theme .glyphicon-volume-up:before{content:""}#bootstrap-theme .glyphicon-qrcode:before{content:""}#bootstrap-theme .glyphicon-barcode:before{content:""}#bootstrap-theme .glyphicon-tag:before{content:""}#bootstrap-theme .glyphicon-tags:before{content:""}#bootstrap-theme .glyphicon-book:before{content:""}#bootstrap-theme .glyphicon-bookmark:before{content:""}#bootstrap-theme .glyphicon-print:before{content:""}#bootstrap-theme .glyphicon-camera:before{content:""}#bootstrap-theme .glyphicon-font:before{content:""}#bootstrap-theme .glyphicon-bold:before{content:""}#bootstrap-theme .glyphicon-italic:before{content:""}#bootstrap-theme .glyphicon-text-height:before{content:""}#bootstrap-theme .glyphicon-text-width:before{content:""}#bootstrap-theme .glyphicon-align-left:before{content:""}#bootstrap-theme .glyphicon-align-center:before{content:""}#bootstrap-theme .glyphicon-align-right:before{content:""}#bootstrap-theme .glyphicon-align-justify:before{content:""}#bootstrap-theme .glyphicon-list:before{content:""}#bootstrap-theme .glyphicon-indent-left:before{content:""}#bootstrap-theme .glyphicon-indent-right:before{content:""}#bootstrap-theme .glyphicon-facetime-video:before{content:""}#bootstrap-theme .glyphicon-picture:before{content:""}#bootstrap-theme .glyphicon-map-marker:before{content:""}#bootstrap-theme .glyphicon-adjust:before{content:""}#bootstrap-theme .glyphicon-tint:before{content:""}#bootstrap-theme .glyphicon-edit:before{content:""}#bootstrap-theme .glyphicon-share:before{content:""}#bootstrap-theme .glyphicon-check:before{content:""}#bootstrap-theme .glyphicon-move:before{content:""}#bootstrap-theme .glyphicon-step-backward:before{content:""}#bootstrap-theme .glyphicon-fast-backward:before{content:""}#bootstrap-theme .glyphicon-backward:before{content:""}#bootstrap-theme .glyphicon-play:before{content:""}#bootstrap-theme .glyphicon-pause:before{content:""}#bootstrap-theme .glyphicon-stop:before{content:""}#bootstrap-theme .glyphicon-forward:before{content:""}#bootstrap-theme .glyphicon-fast-forward:before{content:""}#bootstrap-theme .glyphicon-step-forward:before{content:""}#bootstrap-theme .glyphicon-eject:before{content:""}#bootstrap-theme .glyphicon-chevron-left:before{content:""}#bootstrap-theme .glyphicon-chevron-right:before{content:""}#bootstrap-theme .glyphicon-plus-sign:before{content:""}#bootstrap-theme .glyphicon-minus-sign:before{content:""}#bootstrap-theme .glyphicon-remove-sign:before{content:""}#bootstrap-theme .glyphicon-ok-sign:before{content:""}#bootstrap-theme .glyphicon-question-sign:before{content:""}#bootstrap-theme .glyphicon-info-sign:before{content:""}#bootstrap-theme .glyphicon-screenshot:before{content:""}#bootstrap-theme .glyphicon-remove-circle:before{content:""}#bootstrap-theme .glyphicon-ok-circle:before{content:""}#bootstrap-theme .glyphicon-ban-circle:before{content:""}#bootstrap-theme .glyphicon-arrow-left:before{content:""}#bootstrap-theme .glyphicon-arrow-right:before{content:""}#bootstrap-theme .glyphicon-arrow-up:before{content:""}#bootstrap-theme .glyphicon-arrow-down:before{content:""}#bootstrap-theme .glyphicon-share-alt:before{content:""}#bootstrap-theme .glyphicon-resize-full:before{content:""}#bootstrap-theme .glyphicon-resize-small:before{content:""}#bootstrap-theme .glyphicon-exclamation-sign:before{content:""}#bootstrap-theme .glyphicon-gift:before{content:""}#bootstrap-theme .glyphicon-leaf:before{content:""}#bootstrap-theme .glyphicon-fire:before{content:""}#bootstrap-theme .glyphicon-eye-open:before{content:""}#bootstrap-theme .glyphicon-eye-close:before{content:""}#bootstrap-theme .glyphicon-warning-sign:before{content:""}#bootstrap-theme .glyphicon-plane:before{content:""}#bootstrap-theme .glyphicon-calendar:before{content:""}#bootstrap-theme .glyphicon-random:before{content:""}#bootstrap-theme .glyphicon-comment:before{content:""}#bootstrap-theme .glyphicon-magnet:before{content:""}#bootstrap-theme .glyphicon-chevron-up:before{content:""}#bootstrap-theme .glyphicon-chevron-down:before{content:""}#bootstrap-theme .glyphicon-retweet:before{content:""}#bootstrap-theme .glyphicon-shopping-cart:before{content:""}#bootstrap-theme .glyphicon-folder-close:before{content:""}#bootstrap-theme .glyphicon-folder-open:before{content:""}#bootstrap-theme .glyphicon-resize-vertical:before{content:""}#bootstrap-theme .glyphicon-resize-horizontal:before{content:""}#bootstrap-theme .glyphicon-hdd:before{content:""}#bootstrap-theme .glyphicon-bullhorn:before{content:""}#bootstrap-theme .glyphicon-bell:before{content:""}#bootstrap-theme .glyphicon-certificate:before{content:""}#bootstrap-theme .glyphicon-thumbs-up:before{content:""}#bootstrap-theme .glyphicon-thumbs-down:before{content:""}#bootstrap-theme .glyphicon-hand-right:before{content:""}#bootstrap-theme .glyphicon-hand-left:before{content:""}#bootstrap-theme .glyphicon-hand-up:before{content:""}#bootstrap-theme .glyphicon-hand-down:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-right:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-left:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-up:before{content:""}#bootstrap-theme .glyphicon-circle-arrow-down:before{content:""}#bootstrap-theme .glyphicon-globe:before{content:""}#bootstrap-theme .glyphicon-wrench:before{content:""}#bootstrap-theme .glyphicon-tasks:before{content:""}#bootstrap-theme .glyphicon-filter:before{content:""}#bootstrap-theme .glyphicon-briefcase:before{content:""}#bootstrap-theme .glyphicon-fullscreen:before{content:""}#bootstrap-theme .glyphicon-dashboard:before{content:""}#bootstrap-theme .glyphicon-paperclip:before{content:""}#bootstrap-theme .glyphicon-heart-empty:before{content:""}#bootstrap-theme .glyphicon-link:before{content:""}#bootstrap-theme .glyphicon-phone:before{content:""}#bootstrap-theme .glyphicon-pushpin:before{content:""}#bootstrap-theme .glyphicon-usd:before{content:""}#bootstrap-theme .glyphicon-gbp:before{content:""}#bootstrap-theme .glyphicon-sort:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet:before{content:""}#bootstrap-theme .glyphicon-sort-by-alphabet-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-order:before{content:""}#bootstrap-theme .glyphicon-sort-by-order-alt:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes:before{content:""}#bootstrap-theme .glyphicon-sort-by-attributes-alt:before{content:""}#bootstrap-theme .glyphicon-unchecked:before{content:""}#bootstrap-theme .glyphicon-expand:before{content:""}#bootstrap-theme .glyphicon-collapse-down:before{content:""}#bootstrap-theme .glyphicon-collapse-up:before{content:""}#bootstrap-theme .glyphicon-log-in:before{content:""}#bootstrap-theme .glyphicon-flash:before{content:""}#bootstrap-theme .glyphicon-log-out:before{content:""}#bootstrap-theme .glyphicon-new-window:before{content:""}#bootstrap-theme .glyphicon-record:before{content:""}#bootstrap-theme .glyphicon-save:before{content:""}#bootstrap-theme .glyphicon-open:before{content:""}#bootstrap-theme .glyphicon-saved:before{content:""}#bootstrap-theme .glyphicon-import:before{content:""}#bootstrap-theme .glyphicon-export:before{content:""}#bootstrap-theme .glyphicon-send:before{content:""}#bootstrap-theme .glyphicon-floppy-disk:before{content:""}#bootstrap-theme .glyphicon-floppy-saved:before{content:""}#bootstrap-theme .glyphicon-floppy-remove:before{content:""}#bootstrap-theme .glyphicon-floppy-save:before{content:""}#bootstrap-theme .glyphicon-floppy-open:before{content:""}#bootstrap-theme .glyphicon-credit-card:before{content:""}#bootstrap-theme .glyphicon-transfer:before{content:""}#bootstrap-theme .glyphicon-cutlery:before{content:""}#bootstrap-theme .glyphicon-header:before{content:""}#bootstrap-theme .glyphicon-compressed:before{content:""}#bootstrap-theme .glyphicon-earphone:before{content:""}#bootstrap-theme .glyphicon-phone-alt:before{content:""}#bootstrap-theme .glyphicon-tower:before{content:""}#bootstrap-theme .glyphicon-stats:before{content:""}#bootstrap-theme .glyphicon-sd-video:before{content:""}#bootstrap-theme .glyphicon-hd-video:before{content:""}#bootstrap-theme .glyphicon-subtitles:before{content:""}#bootstrap-theme .glyphicon-sound-stereo:before{content:""}#bootstrap-theme .glyphicon-sound-dolby:before{content:""}#bootstrap-theme .glyphicon-sound-5-1:before{content:""}#bootstrap-theme .glyphicon-sound-6-1:before{content:""}#bootstrap-theme .glyphicon-sound-7-1:before{content:""}#bootstrap-theme .glyphicon-copyright-mark:before{content:""}#bootstrap-theme .glyphicon-registration-mark:before{content:""}#bootstrap-theme .glyphicon-cloud-download:before{content:""}#bootstrap-theme .glyphicon-cloud-upload:before{content:""}#bootstrap-theme .glyphicon-tree-conifer:before{content:""}#bootstrap-theme .glyphicon-tree-deciduous:before{content:""}#bootstrap-theme .glyphicon-cd:before{content:""}#bootstrap-theme .glyphicon-save-file:before{content:""}#bootstrap-theme .glyphicon-open-file:before{content:""}#bootstrap-theme .glyphicon-level-up:before{content:""}#bootstrap-theme .glyphicon-copy:before{content:""}#bootstrap-theme .glyphicon-paste:before{content:""}#bootstrap-theme .glyphicon-alert:before{content:""}#bootstrap-theme .glyphicon-equalizer:before{content:""}#bootstrap-theme .glyphicon-king:before{content:""}#bootstrap-theme .glyphicon-queen:before{content:""}#bootstrap-theme .glyphicon-pawn:before{content:""}#bootstrap-theme .glyphicon-bishop:before{content:""}#bootstrap-theme .glyphicon-knight:before{content:""}#bootstrap-theme .glyphicon-baby-formula:before{content:""}#bootstrap-theme .glyphicon-tent:before{content:"⛺"}#bootstrap-theme .glyphicon-blackboard:before{content:""}#bootstrap-theme .glyphicon-bed:before{content:""}#bootstrap-theme .glyphicon-apple:before{content:""}#bootstrap-theme .glyphicon-erase:before{content:""}#bootstrap-theme .glyphicon-hourglass:before{content:"⌛"}#bootstrap-theme .glyphicon-lamp:before{content:""}#bootstrap-theme .glyphicon-duplicate:before{content:""}#bootstrap-theme .glyphicon-piggy-bank:before{content:""}#bootstrap-theme .glyphicon-scissors:before{content:""}#bootstrap-theme .glyphicon-bitcoin:before{content:""}#bootstrap-theme .glyphicon-btc:before{content:""}#bootstrap-theme .glyphicon-xbt:before{content:""}#bootstrap-theme .glyphicon-yen:before{content:"¥"}#bootstrap-theme .glyphicon-jpy:before{content:"¥"}#bootstrap-theme .glyphicon-ruble:before{content:"₽"}#bootstrap-theme .glyphicon-rub:before{content:"₽"}#bootstrap-theme .glyphicon-scale:before{content:""}#bootstrap-theme .glyphicon-ice-lolly:before{content:""}#bootstrap-theme .glyphicon-ice-lolly-tasted:before{content:""}#bootstrap-theme .glyphicon-education:before{content:""}#bootstrap-theme .glyphicon-option-horizontal:before{content:""}#bootstrap-theme .glyphicon-option-vertical:before{content:""}#bootstrap-theme .glyphicon-menu-hamburger:before{content:""}#bootstrap-theme .glyphicon-modal-window:before{content:""}#bootstrap-theme .glyphicon-oil:before{content:""}#bootstrap-theme .glyphicon-grain:before{content:""}#bootstrap-theme .glyphicon-sunglasses:before{content:""}#bootstrap-theme .glyphicon-text-size:before{content:""}#bootstrap-theme .glyphicon-text-color:before{content:""}#bootstrap-theme .glyphicon-text-background:before{content:""}#bootstrap-theme .glyphicon-object-align-top:before{content:""}#bootstrap-theme .glyphicon-object-align-bottom:before{content:""}#bootstrap-theme .glyphicon-object-align-horizontal:before{content:""}#bootstrap-theme .glyphicon-object-align-left:before{content:""}#bootstrap-theme .glyphicon-object-align-vertical:before{content:""}#bootstrap-theme .glyphicon-object-align-right:before{content:""}#bootstrap-theme .glyphicon-triangle-right:before{content:""}#bootstrap-theme .glyphicon-triangle-left:before{content:""}#bootstrap-theme .glyphicon-triangle-bottom:before{content:""}#bootstrap-theme .glyphicon-triangle-top:before{content:""}#bootstrap-theme .glyphicon-console:before{content:""}#bootstrap-theme .glyphicon-superscript:before{content:""}#bootstrap-theme .glyphicon-subscript:before{content:""}#bootstrap-theme .glyphicon-menu-left:before{content:""}#bootstrap-theme .glyphicon-menu-right:before{content:""}#bootstrap-theme .glyphicon-menu-down:before{content:""}#bootstrap-theme .glyphicon-menu-up:before{content:""}#bootstrap-theme *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme *:before,#bootstrap-theme *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#bootstrap-theme html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}#bootstrap-theme body{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff}#bootstrap-theme input,#bootstrap-theme button,#bootstrap-theme select,#bootstrap-theme textarea{font-family:inherit;font-size:inherit;line-height:inherit}#bootstrap-theme a{color:#000;text-decoration:none}#bootstrap-theme a:hover,#bootstrap-theme a:focus{color:#000;text-decoration:underline}#bootstrap-theme a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme figure{margin:0}#bootstrap-theme img{vertical-align:middle}#bootstrap-theme .img-responsive{display:block;max-width:100%;height:auto}#bootstrap-theme .img-rounded{border-radius:6px}#bootstrap-theme .img-thumbnail{padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}#bootstrap-theme .img-circle{border-radius:50%}#bootstrap-theme hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}#bootstrap-theme .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}#bootstrap-theme .sr-only-focusable:active,#bootstrap-theme .sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}#bootstrap-theme [role=button]{cursor:pointer}#bootstrap-theme h1,#bootstrap-theme h2,#bootstrap-theme h3,#bootstrap-theme h4,#bootstrap-theme h5,#bootstrap-theme h6,#bootstrap-theme .h1,#bootstrap-theme .h2,#bootstrap-theme .h3,#bootstrap-theme .h4,#bootstrap-theme .h5,#bootstrap-theme .h6{font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.2;color:#000}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-weight:400;line-height:1;color:#999}#bootstrap-theme h1,#bootstrap-theme .h1,#bootstrap-theme h2,#bootstrap-theme .h2,#bootstrap-theme h3,#bootstrap-theme .h3{margin-top:20px;margin-bottom:10px}#bootstrap-theme h1 small,#bootstrap-theme h1 .small,#bootstrap-theme .h1 small,#bootstrap-theme .h1 .small,#bootstrap-theme h2 small,#bootstrap-theme h2 .small,#bootstrap-theme .h2 small,#bootstrap-theme .h2 .small,#bootstrap-theme h3 small,#bootstrap-theme h3 .small,#bootstrap-theme .h3 small,#bootstrap-theme .h3 .small{font-size:65%}#bootstrap-theme h4,#bootstrap-theme .h4,#bootstrap-theme h5,#bootstrap-theme .h5,#bootstrap-theme h6,#bootstrap-theme .h6{margin-top:10px;margin-bottom:10px}#bootstrap-theme h4 small,#bootstrap-theme h4 .small,#bootstrap-theme .h4 small,#bootstrap-theme .h4 .small,#bootstrap-theme h5 small,#bootstrap-theme h5 .small,#bootstrap-theme .h5 small,#bootstrap-theme .h5 .small,#bootstrap-theme h6 small,#bootstrap-theme h6 .small,#bootstrap-theme .h6 small,#bootstrap-theme .h6 .small{font-size:75%}#bootstrap-theme h1,#bootstrap-theme .h1{font-size:36px}#bootstrap-theme h2,#bootstrap-theme .h2{font-size:30px}#bootstrap-theme h3,#bootstrap-theme .h3{font-size:24px}#bootstrap-theme h4,#bootstrap-theme .h4{font-size:18px}#bootstrap-theme h5,#bootstrap-theme .h5{font-size:14px}#bootstrap-theme h6,#bootstrap-theme .h6{font-size:12px}#bootstrap-theme p{margin:0 0 10px}#bootstrap-theme .lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){#bootstrap-theme .lead{font-size:21px}}#bootstrap-theme small,#bootstrap-theme .small{font-size:85%}#bootstrap-theme mark,#bootstrap-theme .mark{padding:.2em;background-color:#fcf8e3}#bootstrap-theme .text-left{text-align:left}#bootstrap-theme .text-right{text-align:right}#bootstrap-theme .text-center{text-align:center}#bootstrap-theme .text-justify{text-align:justify}#bootstrap-theme .text-nowrap{white-space:nowrap}#bootstrap-theme .text-lowercase{text-transform:lowercase}#bootstrap-theme .text-uppercase,#bootstrap-theme .initialism{text-transform:uppercase}#bootstrap-theme .text-capitalize{text-transform:capitalize}#bootstrap-theme .text-muted{color:#999}#bootstrap-theme .text-primary{color:#000}#bootstrap-theme a.text-primary:hover,#bootstrap-theme a.text-primary:focus{color:#000}#bootstrap-theme .text-success{color:#468847}#bootstrap-theme a.text-success:hover,#bootstrap-theme a.text-success:focus{color:#356635}#bootstrap-theme .text-info{color:#3a87ad}#bootstrap-theme a.text-info:hover,#bootstrap-theme a.text-info:focus{color:#2d6987}#bootstrap-theme .text-warning{color:#c09853}#bootstrap-theme a.text-warning:hover,#bootstrap-theme a.text-warning:focus{color:#a47e3c}#bootstrap-theme .text-danger{color:#b94a48}#bootstrap-theme a.text-danger:hover,#bootstrap-theme a.text-danger:focus{color:#953b39}#bootstrap-theme .bg-primary{color:#fff}#bootstrap-theme .bg-primary{background-color:#000}#bootstrap-theme a.bg-primary:hover,#bootstrap-theme a.bg-primary:focus{background-color:#000}#bootstrap-theme .bg-success{background-color:#dff0d8}#bootstrap-theme a.bg-success:hover,#bootstrap-theme a.bg-success:focus{background-color:#c1e2b3}#bootstrap-theme .bg-info{background-color:#d9edf7}#bootstrap-theme a.bg-info:hover,#bootstrap-theme a.bg-info:focus{background-color:#afd9ee}#bootstrap-theme .bg-warning{background-color:#fcf8e3}#bootstrap-theme a.bg-warning:hover,#bootstrap-theme a.bg-warning:focus{background-color:#f7ecb5}#bootstrap-theme .bg-danger{background-color:#f2dede}#bootstrap-theme a.bg-danger:hover,#bootstrap-theme a.bg-danger:focus{background-color:#e4b9b9}#bootstrap-theme .page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}#bootstrap-theme ul,#bootstrap-theme ol{margin-top:0;margin-bottom:10px}#bootstrap-theme ul ul,#bootstrap-theme ul ol,#bootstrap-theme ol ul,#bootstrap-theme ol ol{margin-bottom:0}#bootstrap-theme .list-unstyled{padding-left:0;list-style:none}#bootstrap-theme .list-inline{padding-left:0;list-style:none;margin-left:-5px}#bootstrap-theme .list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}#bootstrap-theme dl{margin-top:0;margin-bottom:20px}#bootstrap-theme dt,#bootstrap-theme dd{line-height:1.428571429}#bootstrap-theme dt{font-weight:700}#bootstrap-theme dd{margin-left:0}#bootstrap-theme .dl-horizontal dd:before,#bootstrap-theme .dl-horizontal dd:after{display:table;content:" "}#bootstrap-theme .dl-horizontal dd:after{clear:both}@media (min-width:768px){#bootstrap-theme .dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#bootstrap-theme .dl-horizontal dd{margin-left:180px}}#bootstrap-theme abbr[title],#bootstrap-theme abbr[data-original-title]{cursor:help}#bootstrap-theme .initialism{font-size:90%}#bootstrap-theme blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}#bootstrap-theme blockquote p:last-child,#bootstrap-theme blockquote ul:last-child,#bootstrap-theme blockquote ol:last-child{margin-bottom:0}#bootstrap-theme blockquote footer,#bootstrap-theme blockquote small,#bootstrap-theme blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}#bootstrap-theme blockquote footer:before,#bootstrap-theme blockquote small:before,#bootstrap-theme blockquote .small:before{content:"—  "}#bootstrap-theme .blockquote-reverse,#bootstrap-theme blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}#bootstrap-theme .blockquote-reverse footer:before,#bootstrap-theme .blockquote-reverse small:before,#bootstrap-theme .blockquote-reverse .small:before,#bootstrap-theme blockquote.pull-right footer:before,#bootstrap-theme blockquote.pull-right small:before,#bootstrap-theme blockquote.pull-right .small:before{content:""}#bootstrap-theme .blockquote-reverse footer:after,#bootstrap-theme .blockquote-reverse small:after,#bootstrap-theme .blockquote-reverse .small:after,#bootstrap-theme blockquote.pull-right footer:after,#bootstrap-theme blockquote.pull-right small:after,#bootstrap-theme blockquote.pull-right .small:after{content:"  —"}#bootstrap-theme address{margin-bottom:20px;font-style:normal;line-height:1.428571429}#bootstrap-theme code,#bootstrap-theme kbd,#bootstrap-theme pre,#bootstrap-theme samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}#bootstrap-theme code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}#bootstrap-theme kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}#bootstrap-theme kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}#bootstrap-theme pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;-ms-word-break:break-all;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}#bootstrap-theme pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}#bootstrap-theme .pre-scrollable{max-height:340px;overflow-y:scroll}#bootstrap-theme .container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container:before,#bootstrap-theme .container:after{display:table;content:" "}#bootstrap-theme .container:after{clear:both}@media (min-width:768px){#bootstrap-theme .container{width:750px}}@media (min-width:992px){#bootstrap-theme .container{width:970px}}@media (min-width:1200px){#bootstrap-theme .container{width:1170px}}#bootstrap-theme .container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}#bootstrap-theme .container-fluid:before,#bootstrap-theme .container-fluid:after{display:table;content:" "}#bootstrap-theme .container-fluid:after{clear:both}#bootstrap-theme .row{margin-right:-15px;margin-left:-15px}#bootstrap-theme .row:before,#bootstrap-theme .row:after{display:table;content:" "}#bootstrap-theme .row:after{clear:both}#bootstrap-theme .row-no-gutters{margin-right:0;margin-left:0}#bootstrap-theme .row-no-gutters [class*=col-]{padding-right:0;padding-left:0}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-sm-1,#bootstrap-theme .col-md-1,#bootstrap-theme .col-lg-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-md-2,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-md-3,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-md-4,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-md-5,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-md-6,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-md-7,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-md-8,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-md-9,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-md-10,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-md-11,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-xs-12,#bootstrap-theme .col-sm-12,#bootstrap-theme .col-md-12,#bootstrap-theme .col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}#bootstrap-theme .col-xs-1,#bootstrap-theme .col-xs-2,#bootstrap-theme .col-xs-3,#bootstrap-theme .col-xs-4,#bootstrap-theme .col-xs-5,#bootstrap-theme .col-xs-6,#bootstrap-theme .col-xs-7,#bootstrap-theme .col-xs-8,#bootstrap-theme .col-xs-9,#bootstrap-theme .col-xs-10,#bootstrap-theme .col-xs-11,#bootstrap-theme .col-xs-12{float:left}#bootstrap-theme .col-xs-1{width:8.3333333333%}#bootstrap-theme .col-xs-2{width:16.6666666667%}#bootstrap-theme .col-xs-3{width:25%}#bootstrap-theme .col-xs-4{width:33.3333333333%}#bootstrap-theme .col-xs-5{width:41.6666666667%}#bootstrap-theme .col-xs-6{width:50%}#bootstrap-theme .col-xs-7{width:58.3333333333%}#bootstrap-theme .col-xs-8{width:66.6666666667%}#bootstrap-theme .col-xs-9{width:75%}#bootstrap-theme .col-xs-10{width:83.3333333333%}#bootstrap-theme .col-xs-11{width:91.6666666667%}#bootstrap-theme .col-xs-12{width:100%}#bootstrap-theme .col-xs-pull-0{right:auto}#bootstrap-theme .col-xs-pull-1{right:8.3333333333%}#bootstrap-theme .col-xs-pull-2{right:16.6666666667%}#bootstrap-theme .col-xs-pull-3{right:25%}#bootstrap-theme .col-xs-pull-4{right:33.3333333333%}#bootstrap-theme .col-xs-pull-5{right:41.6666666667%}#bootstrap-theme .col-xs-pull-6{right:50%}#bootstrap-theme .col-xs-pull-7{right:58.3333333333%}#bootstrap-theme .col-xs-pull-8{right:66.6666666667%}#bootstrap-theme .col-xs-pull-9{right:75%}#bootstrap-theme .col-xs-pull-10{right:83.3333333333%}#bootstrap-theme .col-xs-pull-11{right:91.6666666667%}#bootstrap-theme .col-xs-pull-12{right:100%}#bootstrap-theme .col-xs-push-0{left:auto}#bootstrap-theme .col-xs-push-1{left:8.3333333333%}#bootstrap-theme .col-xs-push-2{left:16.6666666667%}#bootstrap-theme .col-xs-push-3{left:25%}#bootstrap-theme .col-xs-push-4{left:33.3333333333%}#bootstrap-theme .col-xs-push-5{left:41.6666666667%}#bootstrap-theme .col-xs-push-6{left:50%}#bootstrap-theme .col-xs-push-7{left:58.3333333333%}#bootstrap-theme .col-xs-push-8{left:66.6666666667%}#bootstrap-theme .col-xs-push-9{left:75%}#bootstrap-theme .col-xs-push-10{left:83.3333333333%}#bootstrap-theme .col-xs-push-11{left:91.6666666667%}#bootstrap-theme .col-xs-push-12{left:100%}#bootstrap-theme .col-xs-offset-0{margin-left:0}#bootstrap-theme .col-xs-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-xs-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-xs-offset-3{margin-left:25%}#bootstrap-theme .col-xs-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-xs-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-xs-offset-6{margin-left:50%}#bootstrap-theme .col-xs-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-xs-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-xs-offset-9{margin-left:75%}#bootstrap-theme .col-xs-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-xs-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-xs-offset-12{margin-left:100%}@media (min-width:768px){#bootstrap-theme .col-sm-1,#bootstrap-theme .col-sm-2,#bootstrap-theme .col-sm-3,#bootstrap-theme .col-sm-4,#bootstrap-theme .col-sm-5,#bootstrap-theme .col-sm-6,#bootstrap-theme .col-sm-7,#bootstrap-theme .col-sm-8,#bootstrap-theme .col-sm-9,#bootstrap-theme .col-sm-10,#bootstrap-theme .col-sm-11,#bootstrap-theme .col-sm-12{float:left}#bootstrap-theme .col-sm-1{width:8.3333333333%}#bootstrap-theme .col-sm-2{width:16.6666666667%}#bootstrap-theme .col-sm-3{width:25%}#bootstrap-theme .col-sm-4{width:33.3333333333%}#bootstrap-theme .col-sm-5{width:41.6666666667%}#bootstrap-theme .col-sm-6{width:50%}#bootstrap-theme .col-sm-7{width:58.3333333333%}#bootstrap-theme .col-sm-8{width:66.6666666667%}#bootstrap-theme .col-sm-9{width:75%}#bootstrap-theme .col-sm-10{width:83.3333333333%}#bootstrap-theme .col-sm-11{width:91.6666666667%}#bootstrap-theme .col-sm-12{width:100%}#bootstrap-theme .col-sm-pull-0{right:auto}#bootstrap-theme .col-sm-pull-1{right:8.3333333333%}#bootstrap-theme .col-sm-pull-2{right:16.6666666667%}#bootstrap-theme .col-sm-pull-3{right:25%}#bootstrap-theme .col-sm-pull-4{right:33.3333333333%}#bootstrap-theme .col-sm-pull-5{right:41.6666666667%}#bootstrap-theme .col-sm-pull-6{right:50%}#bootstrap-theme .col-sm-pull-7{right:58.3333333333%}#bootstrap-theme .col-sm-pull-8{right:66.6666666667%}#bootstrap-theme .col-sm-pull-9{right:75%}#bootstrap-theme .col-sm-pull-10{right:83.3333333333%}#bootstrap-theme .col-sm-pull-11{right:91.6666666667%}#bootstrap-theme .col-sm-pull-12{right:100%}#bootstrap-theme .col-sm-push-0{left:auto}#bootstrap-theme .col-sm-push-1{left:8.3333333333%}#bootstrap-theme .col-sm-push-2{left:16.6666666667%}#bootstrap-theme .col-sm-push-3{left:25%}#bootstrap-theme .col-sm-push-4{left:33.3333333333%}#bootstrap-theme .col-sm-push-5{left:41.6666666667%}#bootstrap-theme .col-sm-push-6{left:50%}#bootstrap-theme .col-sm-push-7{left:58.3333333333%}#bootstrap-theme .col-sm-push-8{left:66.6666666667%}#bootstrap-theme .col-sm-push-9{left:75%}#bootstrap-theme .col-sm-push-10{left:83.3333333333%}#bootstrap-theme .col-sm-push-11{left:91.6666666667%}#bootstrap-theme .col-sm-push-12{left:100%}#bootstrap-theme .col-sm-offset-0{margin-left:0}#bootstrap-theme .col-sm-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-sm-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-sm-offset-3{margin-left:25%}#bootstrap-theme .col-sm-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-sm-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-sm-offset-6{margin-left:50%}#bootstrap-theme .col-sm-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-sm-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-sm-offset-9{margin-left:75%}#bootstrap-theme .col-sm-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-sm-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-sm-offset-12{margin-left:100%}}@media (min-width:992px){#bootstrap-theme .col-md-1,#bootstrap-theme .col-md-2,#bootstrap-theme .col-md-3,#bootstrap-theme .col-md-4,#bootstrap-theme .col-md-5,#bootstrap-theme .col-md-6,#bootstrap-theme .col-md-7,#bootstrap-theme .col-md-8,#bootstrap-theme .col-md-9,#bootstrap-theme .col-md-10,#bootstrap-theme .col-md-11,#bootstrap-theme .col-md-12{float:left}#bootstrap-theme .col-md-1{width:8.3333333333%}#bootstrap-theme .col-md-2{width:16.6666666667%}#bootstrap-theme .col-md-3{width:25%}#bootstrap-theme .col-md-4{width:33.3333333333%}#bootstrap-theme .col-md-5{width:41.6666666667%}#bootstrap-theme .col-md-6{width:50%}#bootstrap-theme .col-md-7{width:58.3333333333%}#bootstrap-theme .col-md-8{width:66.6666666667%}#bootstrap-theme .col-md-9{width:75%}#bootstrap-theme .col-md-10{width:83.3333333333%}#bootstrap-theme .col-md-11{width:91.6666666667%}#bootstrap-theme .col-md-12{width:100%}#bootstrap-theme .col-md-pull-0{right:auto}#bootstrap-theme .col-md-pull-1{right:8.3333333333%}#bootstrap-theme .col-md-pull-2{right:16.6666666667%}#bootstrap-theme .col-md-pull-3{right:25%}#bootstrap-theme .col-md-pull-4{right:33.3333333333%}#bootstrap-theme .col-md-pull-5{right:41.6666666667%}#bootstrap-theme .col-md-pull-6{right:50%}#bootstrap-theme .col-md-pull-7{right:58.3333333333%}#bootstrap-theme .col-md-pull-8{right:66.6666666667%}#bootstrap-theme .col-md-pull-9{right:75%}#bootstrap-theme .col-md-pull-10{right:83.3333333333%}#bootstrap-theme .col-md-pull-11{right:91.6666666667%}#bootstrap-theme .col-md-pull-12{right:100%}#bootstrap-theme .col-md-push-0{left:auto}#bootstrap-theme .col-md-push-1{left:8.3333333333%}#bootstrap-theme .col-md-push-2{left:16.6666666667%}#bootstrap-theme .col-md-push-3{left:25%}#bootstrap-theme .col-md-push-4{left:33.3333333333%}#bootstrap-theme .col-md-push-5{left:41.6666666667%}#bootstrap-theme .col-md-push-6{left:50%}#bootstrap-theme .col-md-push-7{left:58.3333333333%}#bootstrap-theme .col-md-push-8{left:66.6666666667%}#bootstrap-theme .col-md-push-9{left:75%}#bootstrap-theme .col-md-push-10{left:83.3333333333%}#bootstrap-theme .col-md-push-11{left:91.6666666667%}#bootstrap-theme .col-md-push-12{left:100%}#bootstrap-theme .col-md-offset-0{margin-left:0}#bootstrap-theme .col-md-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-md-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-md-offset-3{margin-left:25%}#bootstrap-theme .col-md-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-md-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-md-offset-6{margin-left:50%}#bootstrap-theme .col-md-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-md-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-md-offset-9{margin-left:75%}#bootstrap-theme .col-md-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-md-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-md-offset-12{margin-left:100%}}@media (min-width:1200px){#bootstrap-theme .col-lg-1,#bootstrap-theme .col-lg-2,#bootstrap-theme .col-lg-3,#bootstrap-theme .col-lg-4,#bootstrap-theme .col-lg-5,#bootstrap-theme .col-lg-6,#bootstrap-theme .col-lg-7,#bootstrap-theme .col-lg-8,#bootstrap-theme .col-lg-9,#bootstrap-theme .col-lg-10,#bootstrap-theme .col-lg-11,#bootstrap-theme .col-lg-12{float:left}#bootstrap-theme .col-lg-1{width:8.3333333333%}#bootstrap-theme .col-lg-2{width:16.6666666667%}#bootstrap-theme .col-lg-3{width:25%}#bootstrap-theme .col-lg-4{width:33.3333333333%}#bootstrap-theme .col-lg-5{width:41.6666666667%}#bootstrap-theme .col-lg-6{width:50%}#bootstrap-theme .col-lg-7{width:58.3333333333%}#bootstrap-theme .col-lg-8{width:66.6666666667%}#bootstrap-theme .col-lg-9{width:75%}#bootstrap-theme .col-lg-10{width:83.3333333333%}#bootstrap-theme .col-lg-11{width:91.6666666667%}#bootstrap-theme .col-lg-12{width:100%}#bootstrap-theme .col-lg-pull-0{right:auto}#bootstrap-theme .col-lg-pull-1{right:8.3333333333%}#bootstrap-theme .col-lg-pull-2{right:16.6666666667%}#bootstrap-theme .col-lg-pull-3{right:25%}#bootstrap-theme .col-lg-pull-4{right:33.3333333333%}#bootstrap-theme .col-lg-pull-5{right:41.6666666667%}#bootstrap-theme .col-lg-pull-6{right:50%}#bootstrap-theme .col-lg-pull-7{right:58.3333333333%}#bootstrap-theme .col-lg-pull-8{right:66.6666666667%}#bootstrap-theme .col-lg-pull-9{right:75%}#bootstrap-theme .col-lg-pull-10{right:83.3333333333%}#bootstrap-theme .col-lg-pull-11{right:91.6666666667%}#bootstrap-theme .col-lg-pull-12{right:100%}#bootstrap-theme .col-lg-push-0{left:auto}#bootstrap-theme .col-lg-push-1{left:8.3333333333%}#bootstrap-theme .col-lg-push-2{left:16.6666666667%}#bootstrap-theme .col-lg-push-3{left:25%}#bootstrap-theme .col-lg-push-4{left:33.3333333333%}#bootstrap-theme .col-lg-push-5{left:41.6666666667%}#bootstrap-theme .col-lg-push-6{left:50%}#bootstrap-theme .col-lg-push-7{left:58.3333333333%}#bootstrap-theme .col-lg-push-8{left:66.6666666667%}#bootstrap-theme .col-lg-push-9{left:75%}#bootstrap-theme .col-lg-push-10{left:83.3333333333%}#bootstrap-theme .col-lg-push-11{left:91.6666666667%}#bootstrap-theme .col-lg-push-12{left:100%}#bootstrap-theme .col-lg-offset-0{margin-left:0}#bootstrap-theme .col-lg-offset-1{margin-left:8.3333333333%}#bootstrap-theme .col-lg-offset-2{margin-left:16.6666666667%}#bootstrap-theme .col-lg-offset-3{margin-left:25%}#bootstrap-theme .col-lg-offset-4{margin-left:33.3333333333%}#bootstrap-theme .col-lg-offset-5{margin-left:41.6666666667%}#bootstrap-theme .col-lg-offset-6{margin-left:50%}#bootstrap-theme .col-lg-offset-7{margin-left:58.3333333333%}#bootstrap-theme .col-lg-offset-8{margin-left:66.6666666667%}#bootstrap-theme .col-lg-offset-9{margin-left:75%}#bootstrap-theme .col-lg-offset-10{margin-left:83.3333333333%}#bootstrap-theme .col-lg-offset-11{margin-left:91.6666666667%}#bootstrap-theme .col-lg-offset-12{margin-left:100%}}#bootstrap-theme table{background-color:transparent}#bootstrap-theme table col[class*=col-]{position:static;display:table-column;float:none}#bootstrap-theme table td[class*=col-],#bootstrap-theme table th[class*=col-]{position:static;display:table-cell;float:none}#bootstrap-theme caption{padding-top:8px;padding-bottom:8px;color:#999;text-align:left}#bootstrap-theme th{text-align:left}#bootstrap-theme .table{width:100%;max-width:100%;margin-bottom:20px}#bootstrap-theme .table>thead>tr>th,#bootstrap-theme .table>thead>tr>td,#bootstrap-theme .table>tbody>tr>th,#bootstrap-theme .table>tbody>tr>td,#bootstrap-theme .table>tfoot>tr>th,#bootstrap-theme .table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}#bootstrap-theme .table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}#bootstrap-theme .table>caption+thead>tr:first-child>th,#bootstrap-theme .table>caption+thead>tr:first-child>td,#bootstrap-theme .table>colgroup+thead>tr:first-child>th,#bootstrap-theme .table>colgroup+thead>tr:first-child>td,#bootstrap-theme .table>thead:first-child>tr:first-child>th,#bootstrap-theme .table>thead:first-child>tr:first-child>td{border-top:0}#bootstrap-theme .table>tbody+tbody{border-top:2px solid #ddd}#bootstrap-theme .table .table{background-color:#fff}#bootstrap-theme .table-condensed>thead>tr>th,#bootstrap-theme .table-condensed>thead>tr>td,#bootstrap-theme .table-condensed>tbody>tr>th,#bootstrap-theme .table-condensed>tbody>tr>td,#bootstrap-theme .table-condensed>tfoot>tr>th,#bootstrap-theme .table-condensed>tfoot>tr>td{padding:5px}#bootstrap-theme .table-bordered{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td,#bootstrap-theme .table-bordered>tbody>tr>th,#bootstrap-theme .table-bordered>tbody>tr>td,#bootstrap-theme .table-bordered>tfoot>tr>th,#bootstrap-theme .table-bordered>tfoot>tr>td{border:1px solid #ddd}#bootstrap-theme .table-bordered>thead>tr>th,#bootstrap-theme .table-bordered>thead>tr>td{border-bottom-width:2px}#bootstrap-theme .table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}#bootstrap-theme .table-hover>tbody>tr:hover{background-color:#f5f5f5}#bootstrap-theme .table>thead>tr>td.active,#bootstrap-theme .table>thead>tr>th.active,#bootstrap-theme .table>thead>tr.active>td,#bootstrap-theme .table>thead>tr.active>th,#bootstrap-theme .table>tbody>tr>td.active,#bootstrap-theme .table>tbody>tr>th.active,#bootstrap-theme .table>tbody>tr.active>td,#bootstrap-theme .table>tbody>tr.active>th,#bootstrap-theme .table>tfoot>tr>td.active,#bootstrap-theme .table>tfoot>tr>th.active,#bootstrap-theme .table>tfoot>tr.active>td,#bootstrap-theme .table>tfoot>tr.active>th{background-color:#f5f5f5}#bootstrap-theme .table-hover>tbody>tr>td.active:hover,#bootstrap-theme .table-hover>tbody>tr>th.active:hover,#bootstrap-theme .table-hover>tbody>tr.active:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.active,#bootstrap-theme .table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}#bootstrap-theme .table>thead>tr>td.success,#bootstrap-theme .table>thead>tr>th.success,#bootstrap-theme .table>thead>tr.success>td,#bootstrap-theme .table>thead>tr.success>th,#bootstrap-theme .table>tbody>tr>td.success,#bootstrap-theme .table>tbody>tr>th.success,#bootstrap-theme .table>tbody>tr.success>td,#bootstrap-theme .table>tbody>tr.success>th,#bootstrap-theme .table>tfoot>tr>td.success,#bootstrap-theme .table>tfoot>tr>th.success,#bootstrap-theme .table>tfoot>tr.success>td,#bootstrap-theme .table>tfoot>tr.success>th{background-color:#dff0d8}#bootstrap-theme .table-hover>tbody>tr>td.success:hover,#bootstrap-theme .table-hover>tbody>tr>th.success:hover,#bootstrap-theme .table-hover>tbody>tr.success:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.success,#bootstrap-theme .table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}#bootstrap-theme .table>thead>tr>td.info,#bootstrap-theme .table>thead>tr>th.info,#bootstrap-theme .table>thead>tr.info>td,#bootstrap-theme .table>thead>tr.info>th,#bootstrap-theme .table>tbody>tr>td.info,#bootstrap-theme .table>tbody>tr>th.info,#bootstrap-theme .table>tbody>tr.info>td,#bootstrap-theme .table>tbody>tr.info>th,#bootstrap-theme .table>tfoot>tr>td.info,#bootstrap-theme .table>tfoot>tr>th.info,#bootstrap-theme .table>tfoot>tr.info>td,#bootstrap-theme .table>tfoot>tr.info>th{background-color:#d9edf7}#bootstrap-theme .table-hover>tbody>tr>td.info:hover,#bootstrap-theme .table-hover>tbody>tr>th.info:hover,#bootstrap-theme .table-hover>tbody>tr.info:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.info,#bootstrap-theme .table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}#bootstrap-theme .table>thead>tr>td.warning,#bootstrap-theme .table>thead>tr>th.warning,#bootstrap-theme .table>thead>tr.warning>td,#bootstrap-theme .table>thead>tr.warning>th,#bootstrap-theme .table>tbody>tr>td.warning,#bootstrap-theme .table>tbody>tr>th.warning,#bootstrap-theme .table>tbody>tr.warning>td,#bootstrap-theme .table>tbody>tr.warning>th,#bootstrap-theme .table>tfoot>tr>td.warning,#bootstrap-theme .table>tfoot>tr>th.warning,#bootstrap-theme .table>tfoot>tr.warning>td,#bootstrap-theme .table>tfoot>tr.warning>th{background-color:#fcf8e3}#bootstrap-theme .table-hover>tbody>tr>td.warning:hover,#bootstrap-theme .table-hover>tbody>tr>th.warning:hover,#bootstrap-theme .table-hover>tbody>tr.warning:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.warning,#bootstrap-theme .table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}#bootstrap-theme .table>thead>tr>td.danger,#bootstrap-theme .table>thead>tr>th.danger,#bootstrap-theme .table>thead>tr.danger>td,#bootstrap-theme .table>thead>tr.danger>th,#bootstrap-theme .table>tbody>tr>td.danger,#bootstrap-theme .table>tbody>tr>th.danger,#bootstrap-theme .table>tbody>tr.danger>td,#bootstrap-theme .table>tbody>tr.danger>th,#bootstrap-theme .table>tfoot>tr>td.danger,#bootstrap-theme .table>tfoot>tr>th.danger,#bootstrap-theme .table>tfoot>tr.danger>td,#bootstrap-theme .table>tfoot>tr.danger>th{background-color:#f2dede}#bootstrap-theme .table-hover>tbody>tr>td.danger:hover,#bootstrap-theme .table-hover>tbody>tr>th.danger:hover,#bootstrap-theme .table-hover>tbody>tr.danger:hover>td,#bootstrap-theme .table-hover>tbody>tr:hover>.danger,#bootstrap-theme .table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}#bootstrap-theme .table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){#bootstrap-theme .table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}#bootstrap-theme .table-responsive>.table{margin-bottom:0}#bootstrap-theme .table-responsive>.table>thead>tr>th,#bootstrap-theme .table-responsive>.table>thead>tr>td,#bootstrap-theme .table-responsive>.table>tbody>tr>th,#bootstrap-theme .table-responsive>.table>tbody>tr>td,#bootstrap-theme .table-responsive>.table>tfoot>tr>th,#bootstrap-theme .table-responsive>.table>tfoot>tr>td{white-space:nowrap}#bootstrap-theme .table-responsive>.table-bordered{border:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}#bootstrap-theme fieldset{min-width:0;padding:0;margin:0;border:0}#bootstrap-theme legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#555;border:0;border-bottom:1px solid #e5e5e5}#bootstrap-theme label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}#bootstrap-theme input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}#bootstrap-theme input[type=radio][disabled],#bootstrap-theme input[type=radio].disabled,fieldset[disabled] #bootstrap-theme input[type=radio],#bootstrap-theme input[type=checkbox][disabled],#bootstrap-theme input[type=checkbox].disabled,fieldset[disabled] #bootstrap-theme input[type=checkbox]{cursor:not-allowed}#bootstrap-theme input[type=file]{display:block}#bootstrap-theme input[type=range]{display:block;width:100%}#bootstrap-theme select[multiple],#bootstrap-theme select[size]{height:auto}#bootstrap-theme input[type=file]:focus,#bootstrap-theme input[type=radio]:focus,#bootstrap-theme input[type=checkbox]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme output{display:block;padding-top:5px;font-size:14px;line-height:1.428571429;color:#555}#bootstrap-theme .form-control{display:block;width:100%;height:30px;padding:4px 8px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}#bootstrap-theme .form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}#bootstrap-theme .form-control::-moz-placeholder{color:#999;opacity:1}#bootstrap-theme .form-control:-ms-input-placeholder{color:#999}#bootstrap-theme .form-control::-webkit-input-placeholder{color:#999}#bootstrap-theme .form-control::-ms-expand{background-color:transparent;border:0}#bootstrap-theme .form-control[disabled],#bootstrap-theme .form-control[readonly],fieldset[disabled] #bootstrap-theme .form-control{background-color:#eee;opacity:1}#bootstrap-theme .form-control[disabled],fieldset[disabled] #bootstrap-theme .form-control{cursor:not-allowed}#bootstrap-theme textarea.form-control{height:auto}@media screen and (-webkit-min-device-pixel-ratio:0){#bootstrap-theme input[type=date].form-control,#bootstrap-theme input[type=time].form-control,#bootstrap-theme input[type=datetime-local].form-control,#bootstrap-theme input[type=month].form-control{line-height:30px}#bootstrap-theme input[type=date].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=date],#bootstrap-theme .input-group-sm>input.input-group-addon[type=date],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=date],.input-group-sm #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=time],#bootstrap-theme .input-group-sm>input.input-group-addon[type=time],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=time],.input-group-sm #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=datetime-local],#bootstrap-theme .input-group-sm>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=datetime-local],.input-group-sm #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-sm,#bootstrap-theme .input-group-sm>input.form-control[type=month],#bootstrap-theme .input-group-sm>input.input-group-addon[type=month],#bootstrap-theme .input-group-sm>.input-group-btn>input.btn[type=month],.input-group-sm #bootstrap-theme input[type=month]{line-height:30px}#bootstrap-theme input[type=date].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=date],#bootstrap-theme .input-group-lg>input.input-group-addon[type=date],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=date],.input-group-lg #bootstrap-theme input[type=date],#bootstrap-theme input[type=time].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=time],#bootstrap-theme .input-group-lg>input.input-group-addon[type=time],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=time],.input-group-lg #bootstrap-theme input[type=time],#bootstrap-theme input[type=datetime-local].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=datetime-local],#bootstrap-theme .input-group-lg>input.input-group-addon[type=datetime-local],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=datetime-local],.input-group-lg #bootstrap-theme input[type=datetime-local],#bootstrap-theme input[type=month].input-lg,#bootstrap-theme .input-group-lg>input.form-control[type=month],#bootstrap-theme .input-group-lg>input.input-group-addon[type=month],#bootstrap-theme .input-group-lg>.input-group-btn>input.btn[type=month],.input-group-lg #bootstrap-theme input[type=month]{line-height:54px}}#bootstrap-theme .form-group{margin-bottom:15px}#bootstrap-theme .radio,#bootstrap-theme .checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}#bootstrap-theme .radio.disabled label,fieldset[disabled] #bootstrap-theme .radio label,#bootstrap-theme .checkbox.disabled label,fieldset[disabled] #bootstrap-theme .checkbox label{cursor:not-allowed}#bootstrap-theme .radio label,#bootstrap-theme .checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}#bootstrap-theme .radio input[type=radio],#bootstrap-theme .radio-inline input[type=radio],#bootstrap-theme .checkbox input[type=checkbox],#bootstrap-theme .checkbox-inline input[type=checkbox]{position:absolute;margin-top:4px \9;margin-left:-20px}#bootstrap-theme .radio+.radio,#bootstrap-theme .checkbox+.checkbox{margin-top:-5px}#bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}#bootstrap-theme .radio-inline.disabled,fieldset[disabled] #bootstrap-theme .radio-inline,#bootstrap-theme .checkbox-inline.disabled,fieldset[disabled] #bootstrap-theme .checkbox-inline{cursor:not-allowed}#bootstrap-theme .radio-inline+.radio-inline,#bootstrap-theme .checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}#bootstrap-theme .form-control-static{min-height:34px;padding-top:5px;padding-bottom:5px;margin-bottom:0}#bootstrap-theme .form-control-static.input-lg,#bootstrap-theme .input-group-lg>.form-control-static.form-control,#bootstrap-theme .input-group-lg>.form-control-static.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.form-control-static.btn,#bootstrap-theme .form-control-static.input-sm,#bootstrap-theme .input-group-sm>.form-control-static.form-control,#bootstrap-theme .input-group-sm>.form-control-static.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.form-control-static.btn{padding-right:0;padding-left:0}#bootstrap-theme .input-sm,#bootstrap-theme .input-group-sm>.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme select.input-sm,#bootstrap-theme .input-group-sm>select.form-control,#bootstrap-theme .input-group-sm>select.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>select.btn{height:30px;line-height:30px}#bootstrap-theme textarea.input-sm,#bootstrap-theme .input-group-sm>textarea.form-control,#bootstrap-theme .input-group-sm>textarea.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-sm,#bootstrap-theme .input-group-sm>select.form-control[multiple],#bootstrap-theme .input-group-sm>select.input-group-addon[multiple],#bootstrap-theme .input-group-sm>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .form-group-sm select.form-control{height:30px;line-height:30px}#bootstrap-theme .form-group-sm textarea.form-control,#bootstrap-theme .form-group-sm select[multiple].form-control{height:auto}#bootstrap-theme .form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .input-lg,#bootstrap-theme .input-group-lg>.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.btn{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme select.input-lg,#bootstrap-theme .input-group-lg>select.form-control,#bootstrap-theme .input-group-lg>select.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>select.btn{height:54px;line-height:54px}#bootstrap-theme textarea.input-lg,#bootstrap-theme .input-group-lg>textarea.form-control,#bootstrap-theme .input-group-lg>textarea.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>textarea.btn,#bootstrap-theme select[multiple].input-lg,#bootstrap-theme .input-group-lg>select.form-control[multiple],#bootstrap-theme .input-group-lg>select.input-group-addon[multiple],#bootstrap-theme .input-group-lg>.input-group-btn>select.btn[multiple]{height:auto}#bootstrap-theme .form-group-lg .form-control{height:54px;padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .form-group-lg select.form-control{height:54px;line-height:54px}#bootstrap-theme .form-group-lg textarea.form-control,#bootstrap-theme .form-group-lg select[multiple].form-control{height:auto}#bootstrap-theme .form-group-lg .form-control-static{height:54px;min-height:38px;padding:15px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .has-feedback{position:relative}#bootstrap-theme .has-feedback .form-control{padding-right:37.5px}#bootstrap-theme .form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:30px;height:30px;line-height:30px;text-align:center;pointer-events:none}#bootstrap-theme .input-lg+.form-control-feedback,#bootstrap-theme .input-group-lg>.form-control+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-lg>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-lg+.form-control-feedback,#bootstrap-theme .form-group-lg .form-control+.form-control-feedback{width:54px;height:54px;line-height:54px}#bootstrap-theme .input-sm+.form-control-feedback,#bootstrap-theme .input-group-sm>.form-control+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-addon+.form-control-feedback,#bootstrap-theme .input-group-sm>.input-group-btn>.btn+.form-control-feedback,#bootstrap-theme .input-group-sm+.form-control-feedback,#bootstrap-theme .form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}#bootstrap-theme .has-success .help-block,#bootstrap-theme .has-success .control-label,#bootstrap-theme .has-success .radio,#bootstrap-theme .has-success .checkbox,#bootstrap-theme .has-success .radio-inline,#bootstrap-theme .has-success .checkbox-inline,#bootstrap-theme .has-success.radio label,#bootstrap-theme .has-success.checkbox label,#bootstrap-theme .has-success.radio-inline label,#bootstrap-theme .has-success.checkbox-inline label{color:#468847}#bootstrap-theme .has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}#bootstrap-theme .has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}#bootstrap-theme .has-success .form-control-feedback{color:#468847}#bootstrap-theme .has-warning .help-block,#bootstrap-theme .has-warning .control-label,#bootstrap-theme .has-warning .radio,#bootstrap-theme .has-warning .checkbox,#bootstrap-theme .has-warning .radio-inline,#bootstrap-theme .has-warning .checkbox-inline,#bootstrap-theme .has-warning.radio label,#bootstrap-theme .has-warning.checkbox label,#bootstrap-theme .has-warning.radio-inline label,#bootstrap-theme .has-warning.checkbox-inline label{color:#c09853}#bootstrap-theme .has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}#bootstrap-theme .has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}#bootstrap-theme .has-warning .form-control-feedback{color:#c09853}#bootstrap-theme .has-error .help-block,#bootstrap-theme .has-error .control-label,#bootstrap-theme .has-error .radio,#bootstrap-theme .has-error .checkbox,#bootstrap-theme .has-error .radio-inline,#bootstrap-theme .has-error .checkbox-inline,#bootstrap-theme .has-error.radio label,#bootstrap-theme .has-error.checkbox label,#bootstrap-theme .has-error.radio-inline label,#bootstrap-theme .has-error.checkbox-inline label{color:#b94a48}#bootstrap-theme .has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}#bootstrap-theme .has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}#bootstrap-theme .has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}#bootstrap-theme .has-error .form-control-feedback{color:#b94a48}#bootstrap-theme .has-feedback label~.form-control-feedback{top:25px}#bootstrap-theme .has-feedback label.sr-only~.form-control-feedback{top:0}#bootstrap-theme .help-block{display:block;margin-top:5px;margin-bottom:10px;color:#959595}@media (min-width:768px){#bootstrap-theme .form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .form-inline .form-control-static{display:inline-block}#bootstrap-theme .form-inline .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .form-inline .input-group .input-group-addon,#bootstrap-theme .form-inline .input-group .input-group-btn,#bootstrap-theme .form-inline .input-group .form-control{width:auto}#bootstrap-theme .form-inline .input-group>.form-control{width:100%}#bootstrap-theme .form-inline .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio,#bootstrap-theme .form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .form-inline .radio label,#bootstrap-theme .form-inline .checkbox label{padding-left:0}#bootstrap-theme .form-inline .radio input[type=radio],#bootstrap-theme .form-inline .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .form-inline .has-feedback .form-control-feedback{top:0}}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox,#bootstrap-theme .form-horizontal .radio-inline,#bootstrap-theme .form-horizontal .checkbox-inline{padding-top:5px;margin-top:0;margin-bottom:0}#bootstrap-theme .form-horizontal .radio,#bootstrap-theme .form-horizontal .checkbox{min-height:25px}#bootstrap-theme .form-horizontal .form-group{margin-right:-15px;margin-left:-15px}#bootstrap-theme .form-horizontal .form-group:before,#bootstrap-theme .form-horizontal .form-group:after{display:table;content:" "}#bootstrap-theme .form-horizontal .form-group:after{clear:both}@media (min-width:768px){#bootstrap-theme .form-horizontal .control-label{padding-top:5px;margin-bottom:0;text-align:right}}#bootstrap-theme .form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-lg .control-label{padding-top:15px;font-size:18px}}@media (min-width:768px){#bootstrap-theme .form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}#bootstrap-theme .btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;padding:4px 8px;font-size:14px;line-height:1.428571429;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus,#bootstrap-theme .btn:active:focus,#bootstrap-theme .btn:active.focus,#bootstrap-theme .btn.active:focus,#bootstrap-theme .btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}#bootstrap-theme .btn:hover,#bootstrap-theme .btn:focus,#bootstrap-theme .btn.focus{color:#fff;text-decoration:none}#bootstrap-theme .btn:active,#bootstrap-theme .btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn.disabled,#bootstrap-theme .btn[disabled],fieldset[disabled] #bootstrap-theme .btn{cursor:not-allowed;-webkit-filter:alpha(opacity=65);filter:alpha(opacity=65);opacity:.65;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme a.btn.disabled,fieldset[disabled] #bootstrap-theme a.btn{pointer-events:none}#bootstrap-theme .btn-default{color:#fff;background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:focus,#bootstrap-theme .btn-default.focus{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:hover{color:#fff;background-color:#565752;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active,#bootstrap-theme .btn-default.active,.open>#bootstrap-theme .btn-default.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default:active:hover,#bootstrap-theme .btn-default:active:focus,#bootstrap-theme .btn-default:active.focus,#bootstrap-theme .btn-default.active:hover,#bootstrap-theme .btn-default.active:focus,#bootstrap-theme .btn-default.active.focus,.open>#bootstrap-theme .btn-default.dropdown-toggle:hover,.open>#bootstrap-theme .btn-default.dropdown-toggle:focus,.open>#bootstrap-theme .btn-default.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default.disabled:hover,#bootstrap-theme .btn-default.disabled:focus,#bootstrap-theme .btn-default.disabled.focus,#bootstrap-theme .btn-default[disabled]:hover,#bootstrap-theme .btn-default[disabled]:focus,#bootstrap-theme .btn-default[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-default:hover,fieldset[disabled] #bootstrap-theme .btn-default:focus,fieldset[disabled] #bootstrap-theme .btn-default.focus{background-color:#70716b;border-color:rgba(0,0,0,.1)}#bootstrap-theme .btn-default .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-primary{color:#fff;background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary:focus,#bootstrap-theme .btn-primary.focus{color:#fff;background-color:#565752;border-color:#2f302d}#bootstrap-theme .btn-primary:hover{color:#fff;background-color:#565752;border-color:#51524d}#bootstrap-theme .btn-primary:active,#bootstrap-theme .btn-primary.active,.open>#bootstrap-theme .btn-primary.dropdown-toggle{color:#fff;background-color:#565752;background-image:none;border-color:#51524d}#bootstrap-theme .btn-primary:active:hover,#bootstrap-theme .btn-primary:active:focus,#bootstrap-theme .btn-primary:active.focus,#bootstrap-theme .btn-primary.active:hover,#bootstrap-theme .btn-primary.active:focus,#bootstrap-theme .btn-primary.active.focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle:hover,.open>#bootstrap-theme .btn-primary.dropdown-toggle:focus,.open>#bootstrap-theme .btn-primary.dropdown-toggle.focus{color:#fff;background-color:#444441;border-color:#2f302d}#bootstrap-theme .btn-primary.disabled:hover,#bootstrap-theme .btn-primary.disabled:focus,#bootstrap-theme .btn-primary.disabled.focus,#bootstrap-theme .btn-primary[disabled]:hover,#bootstrap-theme .btn-primary[disabled]:focus,#bootstrap-theme .btn-primary[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-primary:hover,fieldset[disabled] #bootstrap-theme .btn-primary:focus,fieldset[disabled] #bootstrap-theme .btn-primary.focus{background-color:#70716b;border-color:#70716b}#bootstrap-theme .btn-primary .badge{color:#70716b;background-color:#fff}#bootstrap-theme .btn-success{color:#fff;background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success:focus,#bootstrap-theme .btn-success.focus{color:#fff;background-color:#59822c;border-color:#324919}#bootstrap-theme .btn-success:hover{color:#fff;background-color:#59822c;border-color:#547a29}#bootstrap-theme .btn-success:active,#bootstrap-theme .btn-success.active,.open>#bootstrap-theme .btn-success.dropdown-toggle{color:#fff;background-color:#59822c;background-image:none;border-color:#547a29}#bootstrap-theme .btn-success:active:hover,#bootstrap-theme .btn-success:active:focus,#bootstrap-theme .btn-success:active.focus,#bootstrap-theme .btn-success.active:hover,#bootstrap-theme .btn-success.active:focus,#bootstrap-theme .btn-success.active.focus,.open>#bootstrap-theme .btn-success.dropdown-toggle:hover,.open>#bootstrap-theme .btn-success.dropdown-toggle:focus,.open>#bootstrap-theme .btn-success.dropdown-toggle.focus{color:#fff;background-color:#476723;border-color:#324919}#bootstrap-theme .btn-success.disabled:hover,#bootstrap-theme .btn-success.disabled:focus,#bootstrap-theme .btn-success.disabled.focus,#bootstrap-theme .btn-success[disabled]:hover,#bootstrap-theme .btn-success[disabled]:focus,#bootstrap-theme .btn-success[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-success:hover,fieldset[disabled] #bootstrap-theme .btn-success:focus,fieldset[disabled] #bootstrap-theme .btn-success.focus{background-color:#73a839;border-color:#73a839}#bootstrap-theme .btn-success .badge{color:#73a839;background-color:#fff}#bootstrap-theme .btn-info{color:#fff;background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info:focus,#bootstrap-theme .btn-info.focus{color:#fff;background-color:#9bd1fd;border-color:#50affc}#bootstrap-theme .btn-info:hover{color:#fff;background-color:#9bd1fd;border-color:#91ccfd}#bootstrap-theme .btn-info:active,#bootstrap-theme .btn-info.active,.open>#bootstrap-theme .btn-info.dropdown-toggle{color:#fff;background-color:#9bd1fd;background-image:none;border-color:#91ccfd}#bootstrap-theme .btn-info:active:hover,#bootstrap-theme .btn-info:active:focus,#bootstrap-theme .btn-info:active.focus,#bootstrap-theme .btn-info.active:hover,#bootstrap-theme .btn-info.active:focus,#bootstrap-theme .btn-info.active.focus,.open>#bootstrap-theme .btn-info.dropdown-toggle:hover,.open>#bootstrap-theme .btn-info.dropdown-toggle:focus,.open>#bootstrap-theme .btn-info.dropdown-toggle.focus{color:#fff;background-color:#78c1fc;border-color:#50affc}#bootstrap-theme .btn-info.disabled:hover,#bootstrap-theme .btn-info.disabled:focus,#bootstrap-theme .btn-info.disabled.focus,#bootstrap-theme .btn-info[disabled]:hover,#bootstrap-theme .btn-info[disabled]:focus,#bootstrap-theme .btn-info[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-info:hover,fieldset[disabled] #bootstrap-theme .btn-info:focus,fieldset[disabled] #bootstrap-theme .btn-info.focus{background-color:#cde8fe;border-color:#cde8fe}#bootstrap-theme .btn-info .badge{color:#cde8fe;background-color:#fff}#bootstrap-theme .btn-warning{color:#fff;background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning:focus,#bootstrap-theme .btn-warning.focus{color:#fff;background-color:#aa4200;border-color:#5e2400}#bootstrap-theme .btn-warning:hover{color:#fff;background-color:#aa4200;border-color:#a03e00}#bootstrap-theme .btn-warning:active,#bootstrap-theme .btn-warning.active,.open>#bootstrap-theme .btn-warning.dropdown-toggle{color:#fff;background-color:#aa4200;background-image:none;border-color:#a03e00}#bootstrap-theme .btn-warning:active:hover,#bootstrap-theme .btn-warning:active:focus,#bootstrap-theme .btn-warning:active.focus,#bootstrap-theme .btn-warning.active:hover,#bootstrap-theme .btn-warning.active:focus,#bootstrap-theme .btn-warning.active.focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle:hover,.open>#bootstrap-theme .btn-warning.dropdown-toggle:focus,.open>#bootstrap-theme .btn-warning.dropdown-toggle.focus{color:#fff;background-color:#863400;border-color:#5e2400}#bootstrap-theme .btn-warning.disabled:hover,#bootstrap-theme .btn-warning.disabled:focus,#bootstrap-theme .btn-warning.disabled.focus,#bootstrap-theme .btn-warning[disabled]:hover,#bootstrap-theme .btn-warning[disabled]:focus,#bootstrap-theme .btn-warning[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-warning:hover,fieldset[disabled] #bootstrap-theme .btn-warning:focus,fieldset[disabled] #bootstrap-theme .btn-warning.focus{background-color:#dd5600;border-color:#dd5600}#bootstrap-theme .btn-warning .badge{color:#dd5600;background-color:#fff}#bootstrap-theme .btn-danger{color:#fff;background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger:focus,#bootstrap-theme .btn-danger.focus{color:#fff;background-color:#9a161a;border-color:#570c0f}#bootstrap-theme .btn-danger:hover{color:#fff;background-color:#9a161a;border-color:#911419}#bootstrap-theme .btn-danger:active,#bootstrap-theme .btn-danger.active,.open>#bootstrap-theme .btn-danger.dropdown-toggle{color:#fff;background-color:#9a161a;background-image:none;border-color:#911419}#bootstrap-theme .btn-danger:active:hover,#bootstrap-theme .btn-danger:active:focus,#bootstrap-theme .btn-danger:active.focus,#bootstrap-theme .btn-danger.active:hover,#bootstrap-theme .btn-danger.active:focus,#bootstrap-theme .btn-danger.active.focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle:hover,.open>#bootstrap-theme .btn-danger.dropdown-toggle:focus,.open>#bootstrap-theme .btn-danger.dropdown-toggle.focus{color:#fff;background-color:#7b1115;border-color:#570c0f}#bootstrap-theme .btn-danger.disabled:hover,#bootstrap-theme .btn-danger.disabled:focus,#bootstrap-theme .btn-danger.disabled.focus,#bootstrap-theme .btn-danger[disabled]:hover,#bootstrap-theme .btn-danger[disabled]:focus,#bootstrap-theme .btn-danger[disabled].focus,fieldset[disabled] #bootstrap-theme .btn-danger:hover,fieldset[disabled] #bootstrap-theme .btn-danger:focus,fieldset[disabled] #bootstrap-theme .btn-danger.focus{background-color:#c71c22;border-color:#c71c22}#bootstrap-theme .btn-danger .badge{color:#c71c22;background-color:#fff}#bootstrap-theme .btn-link{font-weight:400;color:#000;border-radius:0}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:active,#bootstrap-theme .btn-link.active,#bootstrap-theme .btn-link[disabled],fieldset[disabled] #bootstrap-theme .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn-link,#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus,#bootstrap-theme .btn-link:active{border-color:transparent}#bootstrap-theme .btn-link:hover,#bootstrap-theme .btn-link:focus{color:#000;text-decoration:underline;background-color:transparent}#bootstrap-theme .btn-link[disabled]:hover,#bootstrap-theme .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .btn-link:hover,fieldset[disabled] #bootstrap-theme .btn-link:focus{color:#999;text-decoration:none}#bootstrap-theme .btn-lg,#bootstrap-theme .btn-group-lg>.btn{padding:14px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}#bootstrap-theme .btn-sm,#bootstrap-theme .btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-xs,#bootstrap-theme .btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}#bootstrap-theme .btn-block{display:block;width:100%}#bootstrap-theme .btn-block+.btn-block{margin-top:5px}#bootstrap-theme input[type=submit].btn-block,#bootstrap-theme input[type=reset].btn-block,#bootstrap-theme input[type=button].btn-block{width:100%}#bootstrap-theme .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}#bootstrap-theme .fade.in{opacity:1}#bootstrap-theme .collapse{display:none}#bootstrap-theme .collapse.in{display:block}#bootstrap-theme tr.collapse.in{display:table-row}#bootstrap-theme tbody.collapse.in{display:table-row-group}#bootstrap-theme .collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}#bootstrap-theme .caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}#bootstrap-theme .dropup,#bootstrap-theme .dropdown{position:relative}#bootstrap-theme .dropdown-toggle:focus{outline:0}#bootstrap-theme .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}#bootstrap-theme .dropdown-menu.pull-right{right:0;left:auto}#bootstrap-theme .dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429;color:#333;white-space:nowrap}#bootstrap-theme .dropdown-menu>li>a:hover,#bootstrap-theme .dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#000}#bootstrap-theme .dropdown-menu>.active>a,#bootstrap-theme .dropdown-menu>.active>a:hover,#bootstrap-theme .dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#000;outline:0}#bootstrap-theme .dropdown-menu>.disabled>a,#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{color:#999}#bootstrap-theme .dropdown-menu>.disabled>a:hover,#bootstrap-theme .dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;-webkit-filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}#bootstrap-theme .open>.dropdown-menu{display:block}#bootstrap-theme .open>a{outline:0}#bootstrap-theme .dropdown-menu-right{right:0;left:auto}#bootstrap-theme .dropdown-menu-left{right:auto;left:0}#bootstrap-theme .dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999;white-space:nowrap}#bootstrap-theme .dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}#bootstrap-theme .pull-right>.dropdown-menu{right:0;left:auto}#bootstrap-theme .dropup .caret,#bootstrap-theme .navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9}#bootstrap-theme .dropup .dropdown-menu,#bootstrap-theme .navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){#bootstrap-theme .navbar-right .dropdown-menu{right:0;left:auto}#bootstrap-theme .navbar-right .dropdown-menu-left{left:0;right:auto}}#bootstrap-theme .btn-group,#bootstrap-theme .btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}#bootstrap-theme .btn-group>.btn,#bootstrap-theme .btn-group-vertical>.btn{position:relative;float:left}#bootstrap-theme .btn-group>.btn:hover,#bootstrap-theme .btn-group>.btn:focus,#bootstrap-theme .btn-group>.btn:active,#bootstrap-theme .btn-group>.btn.active,#bootstrap-theme .btn-group-vertical>.btn:hover,#bootstrap-theme .btn-group-vertical>.btn:focus,#bootstrap-theme .btn-group-vertical>.btn:active,#bootstrap-theme .btn-group-vertical>.btn.active{z-index:2}#bootstrap-theme .btn-group .btn+.btn,#bootstrap-theme .btn-group .btn+.btn-group,#bootstrap-theme .btn-group .btn-group+.btn,#bootstrap-theme .btn-group .btn-group+.btn-group{margin-left:-1px}#bootstrap-theme .btn-toolbar{margin-left:-5px}#bootstrap-theme .btn-toolbar:before,#bootstrap-theme .btn-toolbar:after{display:table;content:" "}#bootstrap-theme .btn-toolbar:after{clear:both}#bootstrap-theme .btn-toolbar .btn,#bootstrap-theme .btn-toolbar .btn-group,#bootstrap-theme .btn-toolbar .input-group{float:left}#bootstrap-theme .btn-toolbar>.btn,#bootstrap-theme .btn-toolbar>.btn-group,#bootstrap-theme .btn-toolbar>.input-group{margin-left:5px}#bootstrap-theme .btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}#bootstrap-theme .btn-group>.btn:first-child{margin-left:0}#bootstrap-theme .btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn:last-child:not(:first-child),#bootstrap-theme .btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group>.btn-group{float:left}#bootstrap-theme .btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group .dropdown-toggle:active,#bootstrap-theme .btn-group.open .dropdown-toggle{outline:0}#bootstrap-theme .btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}#bootstrap-theme .btn-group>.btn-lg+.dropdown-toggle,#bootstrap-theme .btn-group-lg.btn-group>.btn+.dropdown-toggle,#bootstrap-theme .btn-group-lg>.btn-group>.btn+.dropdown-toggle{padding-right:12px;padding-left:12px}#bootstrap-theme .btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}#bootstrap-theme .btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}#bootstrap-theme .btn .caret{margin-left:0}#bootstrap-theme .btn-lg .caret,#bootstrap-theme .btn-group-lg>.btn .caret{border-width:5px 5px 0;border-bottom-width:0}#bootstrap-theme .dropup .btn-lg .caret,#bootstrap-theme .dropup .btn-group-lg>.btn .caret{border-width:0 5px 5px}#bootstrap-theme .btn-group-vertical>.btn,#bootstrap-theme .btn-group-vertical>.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}#bootstrap-theme .btn-group-vertical>.btn-group:before,#bootstrap-theme .btn-group-vertical>.btn-group:after{display:table;content:" "}#bootstrap-theme .btn-group-vertical>.btn-group:after{clear:both}#bootstrap-theme .btn-group-vertical>.btn-group>.btn{float:none}#bootstrap-theme .btn-group-vertical>.btn+.btn,#bootstrap-theme .btn-group-vertical>.btn+.btn-group,#bootstrap-theme .btn-group-vertical>.btn-group+.btn,#bootstrap-theme .btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}#bootstrap-theme .btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,#bootstrap-theme .btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}#bootstrap-theme .btn-group-justified>.btn,#bootstrap-theme .btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}#bootstrap-theme .btn-group-justified>.btn-group .btn{width:100%}#bootstrap-theme .btn-group-justified>.btn-group .dropdown-menu{left:auto}#bootstrap-theme [data-toggle=buttons]>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn input[type=checkbox],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=radio],#bootstrap-theme [data-toggle=buttons]>.btn-group>.btn input[type=checkbox]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}#bootstrap-theme .input-group{position:relative;display:table;border-collapse:separate}#bootstrap-theme .input-group[class*=col-]{float:none;padding-right:0;padding-left:0}#bootstrap-theme .input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}#bootstrap-theme .input-group .form-control:focus{z-index:3}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn,#bootstrap-theme .input-group .form-control{display:table-cell}#bootstrap-theme .input-group-addon:not(:first-child):not(:last-child),#bootstrap-theme .input-group-btn:not(:first-child):not(:last-child),#bootstrap-theme .input-group .form-control:not(:first-child):not(:last-child){border-radius:0}#bootstrap-theme .input-group-addon,#bootstrap-theme .input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}#bootstrap-theme .input-group-addon{padding:4px 8px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}#bootstrap-theme .input-group-addon.input-sm,#bootstrap-theme .input-group-sm>.input-group-addon.form-control,#bootstrap-theme .input-group-sm>.input-group-addon,#bootstrap-theme .input-group-sm>.input-group-btn>.input-group-addon.btn{padding:5px 10px;font-size:12px;border-radius:3px}#bootstrap-theme .input-group-addon.input-lg,#bootstrap-theme .input-group-lg>.input-group-addon.form-control,#bootstrap-theme .input-group-lg>.input-group-addon,#bootstrap-theme .input-group-lg>.input-group-btn>.input-group-addon.btn{padding:14px 16px;font-size:18px;border-radius:6px}#bootstrap-theme .input-group-addon input[type=radio],#bootstrap-theme .input-group-addon input[type=checkbox]{margin-top:0}#bootstrap-theme .input-group .form-control:first-child,#bootstrap-theme .input-group-addon:first-child,#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:first-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),#bootstrap-theme .input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}#bootstrap-theme .input-group-addon:first-child{border-right:0}#bootstrap-theme .input-group .form-control:last-child,#bootstrap-theme .input-group-addon:last-child,#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group>.btn,#bootstrap-theme .input-group-btn:last-child>.dropdown-toggle,#bootstrap-theme .input-group-btn:first-child>.btn:not(:first-child),#bootstrap-theme .input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}#bootstrap-theme .input-group-addon:last-child{border-left:0}#bootstrap-theme .input-group-btn{position:relative;font-size:0;white-space:nowrap}#bootstrap-theme .input-group-btn>.btn{position:relative}#bootstrap-theme .input-group-btn>.btn+.btn{margin-left:-1px}#bootstrap-theme .input-group-btn>.btn:hover,#bootstrap-theme .input-group-btn>.btn:focus,#bootstrap-theme .input-group-btn>.btn:active{z-index:2}#bootstrap-theme .input-group-btn:first-child>.btn,#bootstrap-theme .input-group-btn:first-child>.btn-group{margin-right:-1px}#bootstrap-theme .input-group-btn:last-child>.btn,#bootstrap-theme .input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}#bootstrap-theme .nav{padding-left:0;margin-bottom:0;list-style:none}#bootstrap-theme .nav:before,#bootstrap-theme .nav:after{display:table;content:" "}#bootstrap-theme .nav:after{clear:both}#bootstrap-theme .nav>li{position:relative;display:block}#bootstrap-theme .nav>li>a{position:relative;display:block;padding:10px 15px}#bootstrap-theme .nav>li>a:hover,#bootstrap-theme .nav>li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .nav>li.disabled>a{color:#999}#bootstrap-theme .nav>li.disabled>a:hover,#bootstrap-theme .nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}#bootstrap-theme .nav .open>a,#bootstrap-theme .nav .open>a:hover,#bootstrap-theme .nav .open>a:focus{background-color:#eee;border-color:#000}#bootstrap-theme .nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}#bootstrap-theme .nav>li>a>img{max-width:none}#bootstrap-theme .nav-tabs{border-bottom:1px solid #ddd}#bootstrap-theme .nav-tabs>li{float:left;margin-bottom:-1px}#bootstrap-theme .nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs>li>a:hover{border-color:#eee #eee #ddd}#bootstrap-theme .nav-tabs>li.active>a,#bootstrap-theme .nav-tabs>li.active>a:hover,#bootstrap-theme .nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}#bootstrap-theme .nav-pills>li{float:left}#bootstrap-theme .nav-pills>li>a{border-radius:4px}#bootstrap-theme .nav-pills>li+li{margin-left:2px}#bootstrap-theme .nav-pills>li.active>a,#bootstrap-theme .nav-pills>li.active>a:hover,#bootstrap-theme .nav-pills>li.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .nav-stacked>li{float:none}#bootstrap-theme .nav-stacked>li+li{margin-top:2px;margin-left:0}#bootstrap-theme .nav-justified,#bootstrap-theme .nav-tabs.nav-justified{width:100%}#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{float:none}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}#bootstrap-theme .nav-justified>.dropdown .dropdown-menu,#bootstrap-theme .nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){#bootstrap-theme .nav-justified>li,#bootstrap-theme .nav-tabs.nav-justified>li{display:table-cell;width:1%}#bootstrap-theme .nav-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-bottom:0}}#bootstrap-theme .nav-tabs-justified,#bootstrap-theme .nav-tabs.nav-justified{border-bottom:0}#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){#bootstrap-theme .nav-tabs-justified>li>a,#bootstrap-theme .nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}#bootstrap-theme .nav-tabs-justified>.active>a,#bootstrap-theme .nav-tabs.nav-justified>.active>a,#bootstrap-theme .nav-tabs-justified>.active>a:hover,#bootstrap-theme .nav-tabs.nav-justified>.active>a:hover,#bootstrap-theme .nav-tabs-justified>.active>a:focus,#bootstrap-theme .nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}#bootstrap-theme .tab-content>.tab-pane{display:none}#bootstrap-theme .tab-content>.active{display:block}#bootstrap-theme .nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}#bootstrap-theme .navbar:before,#bootstrap-theme .navbar:after{display:table;content:" "}#bootstrap-theme .navbar:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar{border-radius:4px}}#bootstrap-theme .navbar-header:before,#bootstrap-theme .navbar-header:after{display:table;content:" "}#bootstrap-theme .navbar-header:after{clear:both}@media (min-width:768px){#bootstrap-theme .navbar-header{float:left}}#bootstrap-theme .navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}#bootstrap-theme .navbar-collapse:before,#bootstrap-theme .navbar-collapse:after{display:table;content:" "}#bootstrap-theme .navbar-collapse:after{clear:both}#bootstrap-theme .navbar-collapse.in{overflow-y:auto}@media (min-width:768px){#bootstrap-theme .navbar-collapse{width:auto;border-top:0;box-shadow:none}#bootstrap-theme .navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}#bootstrap-theme .navbar-collapse.in{overflow-y:visible}.navbar-fixed-top #bootstrap-theme .navbar-collapse,.navbar-static-top #bootstrap-theme .navbar-collapse,.navbar-fixed-bottom #bootstrap-theme .navbar-collapse{padding-right:0;padding-left:0}}#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){#bootstrap-theme .navbar-fixed-top .navbar-collapse,#bootstrap-theme .navbar-fixed-bottom .navbar-collapse{max-height:200px}}@media (min-width:768px){#bootstrap-theme .navbar-fixed-top,#bootstrap-theme .navbar-fixed-bottom{border-radius:0}}#bootstrap-theme .navbar-fixed-top{top:0;border-width:0 0 1px}#bootstrap-theme .navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){#bootstrap-theme .container>.navbar-header,#bootstrap-theme .container>.navbar-collapse,#bootstrap-theme .container-fluid>.navbar-header,#bootstrap-theme .container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}#bootstrap-theme .navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){#bootstrap-theme .navbar-static-top{border-radius:0}}#bootstrap-theme .navbar-brand{float:left;height:50px;padding:15px;font-size:18px;line-height:20px}#bootstrap-theme .navbar-brand:hover,#bootstrap-theme .navbar-brand:focus{text-decoration:none}#bootstrap-theme .navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container #bootstrap-theme .navbar-brand,.navbar>.container-fluid #bootstrap-theme .navbar-brand{margin-left:-15px}}#bootstrap-theme .navbar-toggle{position:relative;float:right;padding:9px 10px;margin-right:15px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}#bootstrap-theme .navbar-toggle:focus{outline:0}#bootstrap-theme .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}#bootstrap-theme .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){#bootstrap-theme .navbar-toggle{display:none}}#bootstrap-theme .navbar-nav{margin:7.5px -15px}#bootstrap-theme .navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){#bootstrap-theme .navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a,#bootstrap-theme .navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a{line-height:20px}#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){#bootstrap-theme .navbar-nav{float:left;margin:0}#bootstrap-theme .navbar-nav>li{float:left}#bootstrap-theme .navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}#bootstrap-theme .navbar-form{padding:10px 15px;margin-right:-15px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:10px;margin-bottom:10px}@media (min-width:768px){#bootstrap-theme .navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}#bootstrap-theme .navbar-form .form-control-static{display:inline-block}#bootstrap-theme .navbar-form .input-group{display:inline-table;vertical-align:middle}#bootstrap-theme .navbar-form .input-group .input-group-addon,#bootstrap-theme .navbar-form .input-group .input-group-btn,#bootstrap-theme .navbar-form .input-group .form-control{width:auto}#bootstrap-theme .navbar-form .input-group>.form-control{width:100%}#bootstrap-theme .navbar-form .control-label{margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio,#bootstrap-theme .navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}#bootstrap-theme .navbar-form .radio label,#bootstrap-theme .navbar-form .checkbox label{padding-left:0}#bootstrap-theme .navbar-form .radio input[type=radio],#bootstrap-theme .navbar-form .checkbox input[type=checkbox]{position:relative;margin-left:0}#bootstrap-theme .navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){#bootstrap-theme .navbar-form .form-group{margin-bottom:5px}#bootstrap-theme .navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){#bootstrap-theme .navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}#bootstrap-theme .navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}#bootstrap-theme .navbar-btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-sm,#bootstrap-theme .btn-group-sm>.navbar-btn.btn{margin-top:10px;margin-bottom:10px}#bootstrap-theme .navbar-btn.btn-xs,#bootstrap-theme .btn-group-xs>.navbar-btn.btn{margin-top:14px;margin-bottom:14px}#bootstrap-theme .navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){#bootstrap-theme .navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){#bootstrap-theme .navbar-left{float:left !important}#bootstrap-theme .navbar-right{float:right !important;margin-right:-15px}#bootstrap-theme .navbar-right~.navbar-right{margin-right:0}}#bootstrap-theme .navbar-default{background-color:#000;border-color:#000}#bootstrap-theme .navbar-default .navbar-brand{color:#fff}#bootstrap-theme .navbar-default .navbar-brand:hover,#bootstrap-theme .navbar-default .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-default .navbar-text{color:#ddd}#bootstrap-theme .navbar-default .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.active>a,#bootstrap-theme .navbar-default .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.disabled>a:focus{color:#ddd;background-color:transparent}#bootstrap-theme .navbar-default .navbar-nav>.open>a,#bootstrap-theme .navbar-default .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-default .navbar-nav>.open>a:focus{color:#fff;background-color:#000}@media (max-width:767px){#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#000}#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ddd;background-color:transparent}}#bootstrap-theme .navbar-default .navbar-toggle{border-color:#000}#bootstrap-theme .navbar-default .navbar-toggle:hover,#bootstrap-theme .navbar-default .navbar-toggle:focus{background-color:#000}#bootstrap-theme .navbar-default .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-default .navbar-collapse,#bootstrap-theme .navbar-default .navbar-form{border-color:#000}#bootstrap-theme .navbar-default .navbar-link{color:#fff}#bootstrap-theme .navbar-default .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-default .btn-link{color:#fff}#bootstrap-theme .navbar-default .btn-link:hover,#bootstrap-theme .navbar-default .btn-link:focus{color:#fff}#bootstrap-theme .navbar-default .btn-link[disabled]:hover,#bootstrap-theme .navbar-default .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-default .btn-link:focus{color:#ddd}#bootstrap-theme .navbar-inverse{background-color:#cde8fe;border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-brand{color:#fff}#bootstrap-theme .navbar-inverse .navbar-brand:hover,#bootstrap-theme .navbar-inverse .navbar-brand:focus{color:#fff;background-color:none}#bootstrap-theme .navbar-inverse .navbar-text{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}#bootstrap-theme .navbar-inverse .navbar-nav>.open>a,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#b4ddfe}@media (max-width:767px){#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,#bootstrap-theme .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}#bootstrap-theme .navbar-inverse .navbar-toggle{border-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle:hover,#bootstrap-theme .navbar-inverse .navbar-toggle:focus{background-color:#b4ddfe}#bootstrap-theme .navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}#bootstrap-theme .navbar-inverse .navbar-collapse,#bootstrap-theme .navbar-inverse .navbar-form{border-color:#aad8fd}#bootstrap-theme .navbar-inverse .navbar-link{color:#fff}#bootstrap-theme .navbar-inverse .navbar-link:hover{color:#fff}#bootstrap-theme .navbar-inverse .btn-link{color:#fff}#bootstrap-theme .navbar-inverse .btn-link:hover,#bootstrap-theme .navbar-inverse .btn-link:focus{color:#fff}#bootstrap-theme .navbar-inverse .btn-link[disabled]:hover,#bootstrap-theme .navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:hover,fieldset[disabled] #bootstrap-theme .navbar-inverse .btn-link:focus{color:#ccc}#bootstrap-theme .breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}#bootstrap-theme .breadcrumb>li{display:inline-block}#bootstrap-theme .breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/ "}#bootstrap-theme .breadcrumb>.active{color:#999}#bootstrap-theme .pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}#bootstrap-theme .pagination>li{display:inline}#bootstrap-theme .pagination>li>a,#bootstrap-theme .pagination>li>span{position:relative;float:left;padding:4px 8px;margin-left:-1px;line-height:1.428571429;color:#000;text-decoration:none;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .pagination>li>a:hover,#bootstrap-theme .pagination>li>a:focus,#bootstrap-theme .pagination>li>span:hover,#bootstrap-theme .pagination>li>span:focus{z-index:2;color:#000;background-color:#eee;border-color:#ddd}#bootstrap-theme .pagination>li:first-child>a,#bootstrap-theme .pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .pagination>li:last-child>a,#bootstrap-theme .pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}#bootstrap-theme .pagination>.active>a,#bootstrap-theme .pagination>.active>a:hover,#bootstrap-theme .pagination>.active>a:focus,#bootstrap-theme .pagination>.active>span,#bootstrap-theme .pagination>.active>span:hover,#bootstrap-theme .pagination>.active>span:focus{z-index:3;color:#999;cursor:default;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .pagination>.disabled>span,#bootstrap-theme .pagination>.disabled>span:hover,#bootstrap-theme .pagination>.disabled>span:focus,#bootstrap-theme .pagination>.disabled>a,#bootstrap-theme .pagination>.disabled>a:hover,#bootstrap-theme .pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}#bootstrap-theme .pagination-lg>li>a,#bootstrap-theme .pagination-lg>li>span{padding:14px 16px;font-size:18px;line-height:1.3333333}#bootstrap-theme .pagination-lg>li:first-child>a,#bootstrap-theme .pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}#bootstrap-theme .pagination-lg>li:last-child>a,#bootstrap-theme .pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}#bootstrap-theme .pagination-sm>li>a,#bootstrap-theme .pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}#bootstrap-theme .pagination-sm>li:first-child>a,#bootstrap-theme .pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .pagination-sm>li:last-child>a,#bootstrap-theme .pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}#bootstrap-theme .pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}#bootstrap-theme .pager:before,#bootstrap-theme .pager:after{display:table;content:" "}#bootstrap-theme .pager:after{clear:both}#bootstrap-theme .pager li{display:inline}#bootstrap-theme .pager li>a,#bootstrap-theme .pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}#bootstrap-theme .pager li>a:hover,#bootstrap-theme .pager li>a:focus{text-decoration:none;background-color:#eee}#bootstrap-theme .pager .next>a,#bootstrap-theme .pager .next>span{float:right}#bootstrap-theme .pager .previous>a,#bootstrap-theme .pager .previous>span{float:left}#bootstrap-theme .pager .disabled>a,#bootstrap-theme .pager .disabled>a:hover,#bootstrap-theme .pager .disabled>a:focus,#bootstrap-theme .pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}#bootstrap-theme .label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}#bootstrap-theme .label:empty{display:none}.btn #bootstrap-theme .label{position:relative;top:-1px}#bootstrap-theme a.label:hover,#bootstrap-theme a.label:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .label-default{background-color:#999}#bootstrap-theme .label-default[href]:hover,#bootstrap-theme .label-default[href]:focus{background-color:gray}#bootstrap-theme .label-primary{background-color:#000}#bootstrap-theme .label-primary[href]:hover,#bootstrap-theme .label-primary[href]:focus{background-color:#000}#bootstrap-theme .label-success{background-color:#73a839}#bootstrap-theme .label-success[href]:hover,#bootstrap-theme .label-success[href]:focus{background-color:#59822c}#bootstrap-theme .label-info{background-color:#cde8fe}#bootstrap-theme .label-info[href]:hover,#bootstrap-theme .label-info[href]:focus{background-color:#9bd1fd}#bootstrap-theme .label-warning{background-color:#dd5600}#bootstrap-theme .label-warning[href]:hover,#bootstrap-theme .label-warning[href]:focus{background-color:#aa4200}#bootstrap-theme .label-danger{background-color:#c71c22}#bootstrap-theme .label-danger[href]:hover,#bootstrap-theme .label-danger[href]:focus{background-color:#9a161a}#bootstrap-theme .badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#000;border-radius:10px}#bootstrap-theme .badge:empty{display:none}.btn #bootstrap-theme .badge{position:relative;top:-1px}.btn-xs #bootstrap-theme .badge,#bootstrap-theme .btn-group-xs>.btn #bootstrap-theme .badge,.btn-group-xs>.btn #bootstrap-theme .badge{top:0;padding:1px 5px}.list-group-item.active>#bootstrap-theme .badge,.nav-pills>.active>a>#bootstrap-theme .badge{color:#000;background-color:#fff}.list-group-item>#bootstrap-theme .badge{float:right}.list-group-item>#bootstrap-theme .badge+#bootstrap-theme .badge{margin-right:5px}.nav-pills>li>a>#bootstrap-theme .badge{margin-left:3px}#bootstrap-theme a.badge:hover,#bootstrap-theme a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}#bootstrap-theme .jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{color:inherit}#bootstrap-theme .jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}#bootstrap-theme .jumbotron>hr{border-top-color:#d5d5d5}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}#bootstrap-theme .jumbotron .container{max-width:100%}@media screen and (min-width:768px){#bootstrap-theme .jumbotron{padding-top:48px;padding-bottom:48px}.container #bootstrap-theme .jumbotron,.container-fluid #bootstrap-theme .jumbotron{padding-right:60px;padding-left:60px}#bootstrap-theme .jumbotron h1,#bootstrap-theme .jumbotron .h1{font-size:63px}}#bootstrap-theme .thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}#bootstrap-theme .thumbnail>img,#bootstrap-theme .thumbnail a>img{display:block;max-width:100%;height:auto;margin-right:auto;margin-left:auto}#bootstrap-theme .thumbnail .caption{padding:9px;color:#555}#bootstrap-theme a.thumbnail:hover,#bootstrap-theme a.thumbnail:focus,#bootstrap-theme a.thumbnail.active{border-color:#000}#bootstrap-theme .alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}#bootstrap-theme .alert h4{margin-top:0;color:inherit}#bootstrap-theme .alert .alert-link{font-weight:700}#bootstrap-theme .alert>p,#bootstrap-theme .alert>ul{margin-bottom:0}#bootstrap-theme .alert>p+p{margin-top:5px}#bootstrap-theme .alert-dismissable,#bootstrap-theme .alert-dismissible{padding-right:35px}#bootstrap-theme .alert-dismissable .close,#bootstrap-theme .alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}#bootstrap-theme .alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}#bootstrap-theme .alert-success hr{border-top-color:#c9e2b3}#bootstrap-theme .alert-success .alert-link{color:#356635}#bootstrap-theme .alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}#bootstrap-theme .alert-info hr{border-top-color:#a6e1ec}#bootstrap-theme .alert-info .alert-link{color:#2d6987}#bootstrap-theme .alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}#bootstrap-theme .alert-warning hr{border-top-color:#f8e5be}#bootstrap-theme .alert-warning .alert-link{color:#a47e3c}#bootstrap-theme .alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}#bootstrap-theme .alert-danger hr{border-top-color:#e6c1c7}#bootstrap-theme .alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}#bootstrap-theme .progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}#bootstrap-theme .progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#000;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}#bootstrap-theme .progress-striped .progress-bar,#bootstrap-theme .progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}#bootstrap-theme .progress.active .progress-bar,#bootstrap-theme .progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}#bootstrap-theme .progress-bar-success{background-color:#73a839}.progress-striped #bootstrap-theme .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-info{background-color:#cde8fe}.progress-striped #bootstrap-theme .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-warning{background-color:#dd5600}.progress-striped #bootstrap-theme .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .progress-bar-danger{background-color:#c71c22}.progress-striped #bootstrap-theme .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}#bootstrap-theme .media{margin-top:15px}#bootstrap-theme .media:first-child{margin-top:0}#bootstrap-theme .media,#bootstrap-theme .media-body{overflow:hidden;zoom:1}#bootstrap-theme .media-body{width:10000px}#bootstrap-theme .media-object{display:block}#bootstrap-theme .media-object.img-thumbnail{max-width:none}#bootstrap-theme .media-right,#bootstrap-theme .media>.pull-right{padding-left:10px}#bootstrap-theme .media-left,#bootstrap-theme .media>.pull-left{padding-right:10px}#bootstrap-theme .media-left,#bootstrap-theme .media-right,#bootstrap-theme .media-body{display:table-cell;vertical-align:top}#bootstrap-theme .media-middle{vertical-align:middle}#bootstrap-theme .media-bottom{vertical-align:bottom}#bootstrap-theme .media-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .media-list{padding-left:0;list-style:none}#bootstrap-theme .list-group{padding-left:0;margin-bottom:20px}#bootstrap-theme .list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}#bootstrap-theme .list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}#bootstrap-theme .list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}#bootstrap-theme .list-group-item.disabled,#bootstrap-theme .list-group-item.disabled:hover,#bootstrap-theme .list-group-item.disabled:focus{color:#999;cursor:not-allowed;background-color:#eee}#bootstrap-theme .list-group-item.disabled .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-heading,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-heading{color:inherit}#bootstrap-theme .list-group-item.disabled .list-group-item-text,#bootstrap-theme .list-group-item.disabled:hover .list-group-item-text,#bootstrap-theme .list-group-item.disabled:focus .list-group-item-text{color:#999}#bootstrap-theme .list-group-item.active,#bootstrap-theme .list-group-item.active:hover,#bootstrap-theme .list-group-item.active:focus{z-index:2;color:#fff;background-color:#000;border-color:#000}#bootstrap-theme .list-group-item.active .list-group-item-heading,#bootstrap-theme .list-group-item.active .list-group-item-heading>small,#bootstrap-theme .list-group-item.active .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:hover .list-group-item-heading>.small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>small,#bootstrap-theme .list-group-item.active:focus .list-group-item-heading>.small{color:inherit}#bootstrap-theme .list-group-item.active .list-group-item-text,#bootstrap-theme .list-group-item.active:hover .list-group-item-text,#bootstrap-theme .list-group-item.active:focus .list-group-item-text{color:#666}#bootstrap-theme a.list-group-item,#bootstrap-theme button.list-group-item{color:#555}#bootstrap-theme a.list-group-item .list-group-item-heading,#bootstrap-theme button.list-group-item .list-group-item-heading{color:#333}#bootstrap-theme a.list-group-item:hover,#bootstrap-theme a.list-group-item:focus,#bootstrap-theme button.list-group-item:hover,#bootstrap-theme button.list-group-item:focus{color:#555;text-decoration:none;background-color:#f5f5f5}#bootstrap-theme button.list-group-item{width:100%;text-align:left}#bootstrap-theme .list-group-item-success{color:#468847;background-color:#dff0d8}#bootstrap-theme a.list-group-item-success,#bootstrap-theme button.list-group-item-success{color:#468847}#bootstrap-theme a.list-group-item-success .list-group-item-heading,#bootstrap-theme button.list-group-item-success .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-success:hover,#bootstrap-theme a.list-group-item-success:focus,#bootstrap-theme button.list-group-item-success:hover,#bootstrap-theme button.list-group-item-success:focus{color:#468847;background-color:#d0e9c6}#bootstrap-theme a.list-group-item-success.active,#bootstrap-theme a.list-group-item-success.active:hover,#bootstrap-theme a.list-group-item-success.active:focus,#bootstrap-theme button.list-group-item-success.active,#bootstrap-theme button.list-group-item-success.active:hover,#bootstrap-theme button.list-group-item-success.active:focus{color:#fff;background-color:#468847;border-color:#468847}#bootstrap-theme .list-group-item-info{color:#3a87ad;background-color:#d9edf7}#bootstrap-theme a.list-group-item-info,#bootstrap-theme button.list-group-item-info{color:#3a87ad}#bootstrap-theme a.list-group-item-info .list-group-item-heading,#bootstrap-theme button.list-group-item-info .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-info:hover,#bootstrap-theme a.list-group-item-info:focus,#bootstrap-theme button.list-group-item-info:hover,#bootstrap-theme button.list-group-item-info:focus{color:#3a87ad;background-color:#c4e3f3}#bootstrap-theme a.list-group-item-info.active,#bootstrap-theme a.list-group-item-info.active:hover,#bootstrap-theme a.list-group-item-info.active:focus,#bootstrap-theme button.list-group-item-info.active,#bootstrap-theme button.list-group-item-info.active:hover,#bootstrap-theme button.list-group-item-info.active:focus{color:#fff;background-color:#3a87ad;border-color:#3a87ad}#bootstrap-theme .list-group-item-warning{color:#c09853;background-color:#fcf8e3}#bootstrap-theme a.list-group-item-warning,#bootstrap-theme button.list-group-item-warning{color:#c09853}#bootstrap-theme a.list-group-item-warning .list-group-item-heading,#bootstrap-theme button.list-group-item-warning .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-warning:hover,#bootstrap-theme a.list-group-item-warning:focus,#bootstrap-theme button.list-group-item-warning:hover,#bootstrap-theme button.list-group-item-warning:focus{color:#c09853;background-color:#faf2cc}#bootstrap-theme a.list-group-item-warning.active,#bootstrap-theme a.list-group-item-warning.active:hover,#bootstrap-theme a.list-group-item-warning.active:focus,#bootstrap-theme button.list-group-item-warning.active,#bootstrap-theme button.list-group-item-warning.active:hover,#bootstrap-theme button.list-group-item-warning.active:focus{color:#fff;background-color:#c09853;border-color:#c09853}#bootstrap-theme .list-group-item-danger{color:#b94a48;background-color:#f2dede}#bootstrap-theme a.list-group-item-danger,#bootstrap-theme button.list-group-item-danger{color:#b94a48}#bootstrap-theme a.list-group-item-danger .list-group-item-heading,#bootstrap-theme button.list-group-item-danger .list-group-item-heading{color:inherit}#bootstrap-theme a.list-group-item-danger:hover,#bootstrap-theme a.list-group-item-danger:focus,#bootstrap-theme button.list-group-item-danger:hover,#bootstrap-theme button.list-group-item-danger:focus{color:#b94a48;background-color:#ebcccc}#bootstrap-theme a.list-group-item-danger.active,#bootstrap-theme a.list-group-item-danger.active:hover,#bootstrap-theme a.list-group-item-danger.active:focus,#bootstrap-theme button.list-group-item-danger.active,#bootstrap-theme button.list-group-item-danger.active:hover,#bootstrap-theme button.list-group-item-danger.active:focus{color:#fff;background-color:#b94a48;border-color:#b94a48}#bootstrap-theme .list-group-item-heading{margin-top:0;margin-bottom:5px}#bootstrap-theme .list-group-item-text{margin-bottom:0;line-height:1.3}#bootstrap-theme .panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .panel-body{padding:15px}#bootstrap-theme .panel-body:before,#bootstrap-theme .panel-body:after{display:table;content:" "}#bootstrap-theme .panel-body:after{clear:both}#bootstrap-theme .panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel-heading>.dropdown .dropdown-toggle{color:inherit}#bootstrap-theme .panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}#bootstrap-theme .panel-title>a,#bootstrap-theme .panel-title>small,#bootstrap-theme .panel-title>.small,#bootstrap-theme .panel-title>small>a,#bootstrap-theme .panel-title>.small>a{color:inherit}#bootstrap-theme .panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.list-group,#bootstrap-theme .panel>.panel-collapse>.list-group{margin-bottom:0}#bootstrap-theme .panel>.list-group .list-group-item,#bootstrap-theme .panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}#bootstrap-theme .panel>.list-group:first-child .list-group-item:first-child,#bootstrap-theme .panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.list-group:last-child .list-group-item:last-child,#bootstrap-theme .panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}#bootstrap-theme .panel-heading+.list-group .list-group-item:first-child{border-top-width:0}#bootstrap-theme .list-group+.panel-footer{border-top-width:0}#bootstrap-theme .panel>.table,#bootstrap-theme .panel>.table-responsive>.table,#bootstrap-theme .panel>.panel-collapse>.table{margin-bottom:0}#bootstrap-theme .panel>.table caption,#bootstrap-theme .panel>.table-responsive>.table caption,#bootstrap-theme .panel>.panel-collapse>.table caption{padding-right:15px;padding-left:15px}#bootstrap-theme .panel>.table:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,#bootstrap-theme .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}#bootstrap-theme .panel>.table:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,#bootstrap-theme .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}#bootstrap-theme .panel>.panel-body+.table,#bootstrap-theme .panel>.panel-body+.table-responsive,#bootstrap-theme .panel>.table+.panel-body,#bootstrap-theme .panel>.table-responsive+.panel-body{border-top:1px solid #ddd}#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child th,#bootstrap-theme .panel>.table>tbody:first-child>tr:first-child td{border-top:0}#bootstrap-theme .panel>.table-bordered,#bootstrap-theme .panel>.table-responsive>.table-bordered{border:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}#bootstrap-theme .panel>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-bordered>tfoot>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>thead>tr:first-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-bordered>tfoot>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,#bootstrap-theme .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}#bootstrap-theme .panel>.table-responsive{margin-bottom:0;border:0}#bootstrap-theme .panel-group{margin-bottom:20px}#bootstrap-theme .panel-group .panel{margin-bottom:0;border-radius:4px}#bootstrap-theme .panel-group .panel+.panel{margin-top:5px}#bootstrap-theme .panel-group .panel-heading{border-bottom:0}#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.panel-body,#bootstrap-theme .panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}#bootstrap-theme .panel-group .panel-footer{border-top:0}#bootstrap-theme .panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}#bootstrap-theme .panel-default{border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading{color:#555;background-color:#f5f5f5;border-color:#ddd}#bootstrap-theme .panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#555}#bootstrap-theme .panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-primary{border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading{color:#fff;background-color:#000;border-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-primary>.panel-heading .badge{color:#000;background-color:#fff}#bootstrap-theme .panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-success{border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading{color:#468847;background-color:#73a839;border-color:#ddd}#bootstrap-theme .panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-success>.panel-heading .badge{color:#73a839;background-color:#468847}#bootstrap-theme .panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-info{border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading{color:#3a87ad;background-color:#cde8fe;border-color:#ddd}#bootstrap-theme .panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-info>.panel-heading .badge{color:#cde8fe;background-color:#3a87ad}#bootstrap-theme .panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-warning{border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading{color:#c09853;background-color:#dd5600;border-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-warning>.panel-heading .badge{color:#dd5600;background-color:#c09853}#bootstrap-theme .panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .panel-danger{border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading{color:#b94a48;background-color:#c71c22;border-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}#bootstrap-theme .panel-danger>.panel-heading .badge{color:#c71c22;background-color:#b94a48}#bootstrap-theme .panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}#bootstrap-theme .embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}#bootstrap-theme .embed-responsive .embed-responsive-item,#bootstrap-theme .embed-responsive iframe,#bootstrap-theme .embed-responsive embed,#bootstrap-theme .embed-responsive object,#bootstrap-theme .embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}#bootstrap-theme .embed-responsive-16by9{padding-bottom:56.25%}#bootstrap-theme .embed-responsive-4by3{padding-bottom:75%}#bootstrap-theme .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}#bootstrap-theme .well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}#bootstrap-theme .well-lg{padding:24px;border-radius:6px}#bootstrap-theme .well-sm{padding:9px;border-radius:3px}#bootstrap-theme .close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;-webkit-filter:alpha(opacity=20);filter:alpha(opacity=20);opacity:.2}#bootstrap-theme .close:hover,#bootstrap-theme .close:focus{color:#000;text-decoration:none;cursor:pointer;-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}#bootstrap-theme .modal-open{overflow:hidden}#bootstrap-theme .modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}#bootstrap-theme .modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:-ms-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out}#bootstrap-theme .modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}#bootstrap-theme .modal-open .modal{overflow-x:hidden;overflow-y:auto}#bootstrap-theme .modal-dialog{position:relative;width:auto;margin:10px}#bootstrap-theme .modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);outline:0}#bootstrap-theme .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}#bootstrap-theme .modal-backdrop.fade{-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .modal-backdrop.in{-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .modal-header{padding:15px;border-bottom:1px solid #e5e5e5}#bootstrap-theme .modal-header:before,#bootstrap-theme .modal-header:after{display:table;content:" "}#bootstrap-theme .modal-header:after{clear:both}#bootstrap-theme .modal-header .close{margin-top:-2px}#bootstrap-theme .modal-title{margin:0;line-height:1.428571429}#bootstrap-theme .modal-body{position:relative;padding:20px}#bootstrap-theme .modal-footer{padding:20px;text-align:right;border-top:1px solid #e5e5e5}#bootstrap-theme .modal-footer:before,#bootstrap-theme .modal-footer:after{display:table;content:" "}#bootstrap-theme .modal-footer:after{clear:both}#bootstrap-theme .modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}#bootstrap-theme .modal-footer .btn-group .btn+.btn{margin-left:-1px}#bootstrap-theme .modal-footer .btn-block+.btn-block{margin-left:0}#bootstrap-theme .modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){#bootstrap-theme .modal-dialog{width:600px;margin:30px auto}#bootstrap-theme .modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}#bootstrap-theme .modal-sm{width:300px}}@media (min-width:992px){#bootstrap-theme .modal-lg{width:900px}}#bootstrap-theme .tooltip{position:absolute;z-index:1070;display:block;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:12px;-webkit-filter:alpha(opacity=0);filter:alpha(opacity=0);opacity:0}#bootstrap-theme .tooltip.in{-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .tooltip.top{padding:5px 0;margin-top:-3px}#bootstrap-theme .tooltip.right{padding:0 5px;margin-left:3px}#bootstrap-theme .tooltip.bottom{padding:5px 0;margin-top:3px}#bootstrap-theme .tooltip.left{padding:0 5px;margin-left:-3px}#bootstrap-theme .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}#bootstrap-theme .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}#bootstrap-theme .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}#bootstrap-theme .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}#bootstrap-theme .tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}#bootstrap-theme .tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Verdana","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.428571429;line-break:auto;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;-ms-word-break:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;font-size:14px;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}#bootstrap-theme .popover.top{margin-top:-10px}#bootstrap-theme .popover.right{margin-left:10px}#bootstrap-theme .popover.bottom{margin-top:10px}#bootstrap-theme .popover.left{margin-left:-10px}#bootstrap-theme .popover>.arrow{border-width:11px}#bootstrap-theme .popover>.arrow,#bootstrap-theme .popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}#bootstrap-theme .popover>.arrow:after{content:"";border-width:10px}#bootstrap-theme .popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}#bootstrap-theme .popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}#bootstrap-theme .popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}#bootstrap-theme .popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}#bootstrap-theme .popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}#bootstrap-theme .popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}#bootstrap-theme .popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}#bootstrap-theme .popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}#bootstrap-theme .popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}#bootstrap-theme .popover-content{padding:9px 14px}#bootstrap-theme .carousel{position:relative}#bootstrap-theme .carousel-inner{position:relative;width:100%;overflow:hidden}#bootstrap-theme .carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}#bootstrap-theme .carousel-inner>.item>img,#bootstrap-theme .carousel-inner>.item>a>img{display:block;max-width:100%;height:auto;line-height:1}@media (transform-3d),(-webkit-transform-3d){#bootstrap-theme .carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-moz-transition:-moz-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:-ms-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}#bootstrap-theme .carousel-inner>.item.next,#bootstrap-theme .carousel-inner>.item.active.right{-webkit-transform:translate3d(100%,0,0);-ms-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.prev,#bootstrap-theme .carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%,0,0);-ms-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}#bootstrap-theme .carousel-inner>.item.next.left,#bootstrap-theme .carousel-inner>.item.prev.right,#bootstrap-theme .carousel-inner>.item.active{-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}#bootstrap-theme .carousel-inner>.active,#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{display:block}#bootstrap-theme .carousel-inner>.active{left:0}#bootstrap-theme .carousel-inner>.next,#bootstrap-theme .carousel-inner>.prev{position:absolute;top:0;width:100%}#bootstrap-theme .carousel-inner>.next{left:100%}#bootstrap-theme .carousel-inner>.prev{left:-100%}#bootstrap-theme .carousel-inner>.next.left,#bootstrap-theme .carousel-inner>.prev.right{left:0}#bootstrap-theme .carousel-inner>.active.left{left:-100%}#bootstrap-theme .carousel-inner>.active.right{left:100%}#bootstrap-theme .carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);-webkit-filter:alpha(opacity=50);filter:alpha(opacity=50);opacity:.5}#bootstrap-theme .carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0%,rgba(0,0,0,.0001) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#80000000",endColorstr="#00000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0%,rgba(0,0,0,.5) 100%);-webkit-filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#00000000",endColorstr="#80000000",GradientType=1);background-repeat:repeat-x}#bootstrap-theme .carousel-control:hover,#bootstrap-theme .carousel-control:focus{color:#fff;text-decoration:none;outline:0;-webkit-filter:alpha(opacity=90);filter:alpha(opacity=90);opacity:.9}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}#bootstrap-theme .carousel-control .icon-next,#bootstrap-theme .carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:20px;height:20px;font-family:serif;line-height:1}#bootstrap-theme .carousel-control .icon-prev:before{content:"‹"}#bootstrap-theme .carousel-control .icon-next:before{content:"›"}#bootstrap-theme .carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}#bootstrap-theme .carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}#bootstrap-theme .carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}#bootstrap-theme .carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}#bootstrap-theme .carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-prev,#bootstrap-theme .carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}#bootstrap-theme .carousel-control .glyphicon-chevron-left,#bootstrap-theme .carousel-control .icon-prev{margin-left:-10px}#bootstrap-theme .carousel-control .glyphicon-chevron-right,#bootstrap-theme .carousel-control .icon-next{margin-right:-10px}#bootstrap-theme .carousel-caption{right:20%;left:20%;padding-bottom:30px}#bootstrap-theme .carousel-indicators{bottom:20px}}#bootstrap-theme .clearfix:before,#bootstrap-theme .clearfix:after{display:table;content:" "}#bootstrap-theme .clearfix:after{clear:both}#bootstrap-theme .center-block{display:block;margin-right:auto;margin-left:auto}#bootstrap-theme .pull-right{float:right !important}#bootstrap-theme .pull-left{float:left !important}#bootstrap-theme .hide{display:none !important}#bootstrap-theme .show{display:block !important}#bootstrap-theme .invisible{visibility:hidden}#bootstrap-theme .text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}#bootstrap-theme .hidden{display:none !important}#bootstrap-theme .affix{position:fixed}@-ms-viewport{width:device-width}#bootstrap-theme .visible-xs{display:none !important}#bootstrap-theme .visible-sm{display:none !important}#bootstrap-theme .visible-md{display:none !important}#bootstrap-theme .visible-lg{display:none !important}#bootstrap-theme .visible-xs-block,#bootstrap-theme .visible-xs-inline,#bootstrap-theme .visible-xs-inline-block,#bootstrap-theme .visible-sm-block,#bootstrap-theme .visible-sm-inline,#bootstrap-theme .visible-sm-inline-block,#bootstrap-theme .visible-md-block,#bootstrap-theme .visible-md-inline,#bootstrap-theme .visible-md-inline-block,#bootstrap-theme .visible-lg-block,#bootstrap-theme .visible-lg-inline,#bootstrap-theme .visible-lg-inline-block{display:none !important}@media (max-width:767px){#bootstrap-theme .visible-xs{display:block !important}#bootstrap-theme table.visible-xs{display:table !important}#bootstrap-theme tr.visible-xs{display:table-row !important}#bootstrap-theme th.visible-xs,#bootstrap-theme td.visible-xs{display:table-cell !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-block{display:block !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline{display:inline !important}}@media (max-width:767px){#bootstrap-theme .visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm{display:block !important}#bootstrap-theme table.visible-sm{display:table !important}#bootstrap-theme tr.visible-sm{display:table-row !important}#bootstrap-theme th.visible-sm,#bootstrap-theme td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md{display:block !important}#bootstrap-theme table.visible-md{display:table !important}#bootstrap-theme tr.visible-md{display:table-row !important}#bootstrap-theme th.visible-md,#bootstrap-theme td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg{display:block !important}#bootstrap-theme table.visible-lg{display:table !important}#bootstrap-theme tr.visible-lg{display:table-row !important}#bootstrap-theme th.visible-lg,#bootstrap-theme td.visible-lg{display:table-cell !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-block{display:block !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline{display:inline !important}}@media (min-width:1200px){#bootstrap-theme .visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){#bootstrap-theme .hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){#bootstrap-theme .hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){#bootstrap-theme .hidden-md{display:none !important}}@media (min-width:1200px){#bootstrap-theme .hidden-lg{display:none !important}}#bootstrap-theme .visible-print{display:none !important}@media print{#bootstrap-theme .visible-print{display:block !important}#bootstrap-theme table.visible-print{display:table !important}#bootstrap-theme tr.visible-print{display:table-row !important}#bootstrap-theme th.visible-print,#bootstrap-theme td.visible-print{display:table-cell !important}}#bootstrap-theme .visible-print-block{display:none !important}@media print{#bootstrap-theme .visible-print-block{display:block !important}}#bootstrap-theme .visible-print-inline{display:none !important}@media print{#bootstrap-theme .visible-print-inline{display:inline !important}}#bootstrap-theme .visible-print-inline-block{display:none !important}@media print{#bootstrap-theme .visible-print-inline-block{display:inline-block !important}}@media print{#bootstrap-theme .hidden-print{display:none !important}}#bootstrap-theme .form-control .select2-choice{border:0;border-radius:2px}#bootstrap-theme .form-control .select2-choice .select2-arrow{border-radius:0 2px 2px 0}#bootstrap-theme .form-control.select2-container{height:auto !important;padding:0}#bootstrap-theme .form-control.select2-container.select2-dropdown-open{border-color:#5897fb;border-radius:3px 3px 0 0}#bootstrap-theme .form-control .select2-container.select2-dropdown-open .select2-choices{border-radius:3px 3px 0 0}#bootstrap-theme .form-control.select2-container .select2-choices{border:0 !important;border-radius:3px}#bootstrap-theme .control-group.warning .select2-container .select2-choice,#bootstrap-theme .control-group.warning .select2-container .select2-choices,#bootstrap-theme .control-group.warning .select2-container-active .select2-choice,#bootstrap-theme .control-group.warning .select2-container-active .select2-choices,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.warning .select2-container-multi.select2-container-active .select2-choices{border:1px solid #c09853 !important}#bootstrap-theme .control-group.warning .select2-container .select2-choice div{border-left:1px solid #c09853 !important;background:#fcf8e3 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice,#bootstrap-theme .control-group.error .select2-container .select2-choices,#bootstrap-theme .control-group.error .select2-container-active .select2-choice,#bootstrap-theme .control-group.error .select2-container-active .select2-choices,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.error .select2-container-multi.select2-container-active .select2-choices{border:1px solid #b94a48 !important}#bootstrap-theme .control-group.error .select2-container .select2-choice div{border-left:1px solid #b94a48 !important;background:#f2dede !important}#bootstrap-theme .control-group.info .select2-container .select2-choice,#bootstrap-theme .control-group.info .select2-container .select2-choices,#bootstrap-theme .control-group.info .select2-container-active .select2-choice,#bootstrap-theme .control-group.info .select2-container-active .select2-choices,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.info .select2-container-multi.select2-container-active .select2-choices{border:1px solid #3a87ad !important}#bootstrap-theme .control-group.info .select2-container .select2-choice div{border-left:1px solid #3a87ad !important;background:#d9edf7 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice,#bootstrap-theme .control-group.success .select2-container .select2-choices,#bootstrap-theme .control-group.success .select2-container-active .select2-choice,#bootstrap-theme .control-group.success .select2-container-active .select2-choices,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,#bootstrap-theme .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,#bootstrap-theme .control-group.success .select2-container-multi.select2-container-active .select2-choices{border:1px solid #468847 !important}#bootstrap-theme .control-group.success .select2-container .select2-choice div{border-left:1px solid #468847 !important;background:#dff0d8 !important}
\ No newline at end of file
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/.composer-downloads/ext-greenwich-bootstrap3-ce55583604650fa5a3911203b74f63af.json b/civicrm/ext/greenwich/extern/bootstrap3/.composer-downloads/ext-greenwich-bootstrap3-ce55583604650fa5a3911203b74f63af.json
new file mode 100644
index 0000000000000000000000000000000000000000..7292f4341ffcbb8f7cb9f15ad551ef11f3165a4f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/.composer-downloads/ext-greenwich-bootstrap3-ce55583604650fa5a3911203b74f63af.json
@@ -0,0 +1,10 @@
+{
+    "name": "civicrm/civicrm-core:ext-greenwich-bootstrap3",
+    "url": "https://github.com/twbs/bootstrap-sass/archive/v3.4.1.zip",
+    "checksum": "e67f090e5e062d37cd31d3bcf9a885c96a43db187db11bf4ecb4ac487140f8d2",
+    "ignore": [
+        "test",
+        "tasks",
+        "lib"
+    ]
+}
\ No newline at end of file
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/.gitignore b/civicrm/ext/greenwich/extern/bootstrap3/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..009d0e4dd3e9ca63fbccddec2f00e25e62e54ff2
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/.gitignore
@@ -0,0 +1,20 @@
+*.gem
+.sass-cache
+bootstrap.css
+bootstrap-responsive.css
+Gemfile.lock
+*.gemfile.lock
+.rvmrc
+.rbenv-version
+
+# Ignore bundler config
+/.bundle
+/vendor/cache
+/vendor/bundle
+tmp/
+test/screenshots/
+test/dummy_rails/log/*.log
+test/dummy_rails/public/assets/
+.DS_Store
+node_modules
+/.idea
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/.travis.yml b/civicrm/ext/greenwich/extern/bootstrap3/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ff908565dd8c282898be92c2306582ee4df41cff
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/.travis.yml
@@ -0,0 +1,19 @@
+dist: xenial
+language: ruby
+cache: bundler
+bundler_args: --path ../../vendor/bundle --without debug
+rvm:
+  - 2.5.1
+gemfile:
+  - test/gemfiles/default.gemfile
+before_install:
+  - "nvm install stable"
+  - "npm install"
+notifications:
+  slack: heybb:3n88HHilXn76ji9vV4gL819Y
+env:
+  global:
+  - VERBOSE=1
+script:
+  bundle exec rake && bash test/*.sh
+sudo: false
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/CHANGELOG.md b/civicrm/ext/greenwich/extern/bootstrap3/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..928c8d87f3042a4b775cf54175b9666e78d242f2
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/CHANGELOG.md
@@ -0,0 +1,215 @@
+# Changelog
+
+## 3.4.0
+
+* Bootstrap rubygem now depends on SassC instead of Sass.
+* Compass no longer supported.
+
+## 3.3.7
+
+* Allows jQuery 3.x in bower.json. [#1048](https://github.com/twbs/bootstrap-sass/issues/1048)
+* Adds the `style` and `sass` fields to package.json. [#1045](https://github.com/twbs/bootstrap-sass/issues/1045)
+* Adds Eyeglass support. [#1007](https://github.com/twbs/bootstrap-sass/pull/1007)
+
+## 3.3.6
+
+* Bumps Sass dependency to 3.3.4+ to avoid compatibility issues with @at-root.
+* Bumps node-sass dependency to ~3.4.2 for Node.js v5 compatibility. [#986](https://github.com/twbs/bootstrap-sass/issues/986)
+* Fixes breadcrumb content issues on libsass. [#919](https://github.com/twbs/bootstrap-sass/issues/919)
+* Fixes a Rails 5 compatibility issue. [#965](https://github.com/twbs/bootstrap-sass/pull/965)
+
+Framework version: Bootstrap **v3.3.6**
+
+## 3.3.5
+
+Fix for standalone Compass extension compatibility. [#914](https://github.com/twbs/bootstrap-sass/issues/914)
+
+Framework version: Bootstrap **v3.3.5**
+
+## 3.3.4
+
+No Sass-specific changes.
+
+Framework version: Bootstrap **v3.3.4**
+
+## 3.3.3
+
+This is a re-packaged release of 3.3.2.1 (v3.3.2+1).
+
+Versions are now strictly semver.
+The PATCH version may be ahead of the upstream.
+
+Framework version: Bootstrap **v3.3.2**.
+
+## 3.3.2.1
+
+* Fix glyphicons regression (revert 443d5b49eac84aec1cb2f8ea173554327bfc8c14)
+
+## 3.3.2.0
+
+* Autoprefixer is now required, and `autoprefixer-rails` is now a dependency for the ruby gem. [#824](https://github.com/twbs/bootstrap-sass/issues/824)
+* Minimum precision reduced from 10 to 8 [#821](https://github.com/twbs/bootstrap-sass/issues/821)
+* Requiring bootstrap JS from npm now works [#812](https://github.com/twbs/bootstrap-sass/issues/812)
+* Fix Sass 3.4.x + IE10 compatibility issue [#803](https://github.com/twbs/bootstrap-sass/issues/803)
+* Provide minified JS bundle [#777](https://github.com/twbs/bootstrap-sass/issues/777)
+* Bower package is now at bootstrap-sass [#813](https://github.com/twbs/bootstrap-sass/issues/813)
+
+
+## 3.3.1.0
+
+* Variables override template at templates/project/_bootstrap-variables.sass
+* Readme: Bower + Rails configuration
+
+## 3.3.0.1
+
+* Fix loading issue with the ruby gem version
+
+## 3.3.0
+
+* Improve libsass compatibility
+* Support using Bower package with Rails
+
+## 3.2.0.2
+
+Main bootstrap file is now a partial (_bootstrap.scss), for compatibility with Compass 1+.
+
+Fixed a number of bugs. [Issues closed in v3.2.0.2](https://github.com/twbs/bootstrap-sass/issues?q=is%3Aissue+is%3Aclosed+milestone%3Av3.2.0.2).
+
+## 3.2.0.1
+
+Fixed a number of bugs: [Issues closed in v3.2.0.1](https://github.com/twbs/bootstrap-sass/issues?q=is%3Aissue+is%3Aclosed+milestone%3Av3.2.0.1).
+
+## 3.2.0.0
+
+- Assets (Sass, JS, fonts) moved from `vendor/assets` to `assets`. `bootstrap.js` now contains concatenated JS.
+- Compass generator now copies JS and fonts, and provides a better default `styles.sass`.
+- Compass, Sprockets, and Mincer asset path helpers are now provided in pure Sass: `bootstrap-compass`, `bootstrap-sprockets`, and `bootstrap-mincer`.
+Asset path helpers must be imported before `bootstrap`, more in Readme.
+- Sprockets / Mincer JS manifest has been moved to `bootstrap-sprockets.js`.
+It can be required without adding Bootstrap JS directory to load path, as it now uses relative paths.
+- Sprockets: `depend_on_asset` (`glyphicons.scss`) has been changed to `depend_on` to work around an issue with `depend_on_asset`.
+[More information](https://github.com/twbs/bootstrap-sass/issues/592#issuecomment-46570286).
+
+## 3.1.1.0
+
+- Updated Bower docs
+
+## 3.1.0.2
+
+- #523: Rails 3.2 compatibility
+- Bugfixes from upstream up to 7eb532262fbd1112215b5a547b9285794b5360ab.
+
+## 3.1.0.1
+
+- #518: `scale` mixin Sass compatibility issue
+
+## 3.1.0.0
+
+* compiles with libsass master
+
+## 3.0.2.1
+
+* fix vendor paths for compass
+
+## 3.0.0.0
+
+* Fully automated (lots of string juggling) LESS -> Sass conversion. - *Gleb Mazovetskiy*
+* Ported rake task from vwall/compass-twitter-bootstrap to convert Bootstrap upstream - *Peter Gumeson*
+* Moved javascripts to us `bootstrap-component.js` to `bootstrap/component.js` - *Peter Gumeson*
+
+## 2.3.2.2
+
+* Allow sass-rails `>= 3.2` - *Thomas McDonald*
+
+## 2.3.2.1
+
+## 2.3.2.0
+
+* Update to Bootstrap 2.3.2 - *Dan Allen*
+
+## 2.3.1.3
+
+* Find the correct Sprockets context for the `image_path` function - *Tristan Harward, Gleb Mazovetskiy*
+
+## 2.3.1.2
+
+* Fix changes to image url - *Gleb Mazovetskiy*
+* Copy _variables into project on Compass install - *Phil Thompson*
+* Add `bootstrap-affix` to the Compass template file - *brief*
+
+## 2.3.1.1 (yanked)
+
+* Change how image_url is handled internally - *Tristan Harward*
+* Fix some font variables not having `!default` - *Thomas McDonald*
+
+## 2.3.0.0
+* [#290] Update to Bootstrap 2.3.0 - *Tristan Harward*
+* Fix `rake:debug` with new file locations - *Thomas McDonald*
+* Add draft contributing document - *Thomas McDonald*
+* [#260] Add our load path to the global Sass load path - *Tristan Harward*
+* [#275] Use GitHub notation in Sass head testing gemfile - *Timo Schilling*
+* [#279, #283] Readme improvements - *theverything, Philip Arndt*
+
+## 2.2.2.0
+* [#270] Update to Bootstrap 2.2.2 - *Tristan Harward*
+* [#266] Add license to gemspec - *Peter Marsh*
+
+## 2.2.1.1
+* [#258] Use `bootstrap` prefix for `@import`ing files in `bootstrap/bootstrap.scss` - *Umair Siddique*
+
+## 2.2.1.0
+* [#246] Update to Bootstrap 2.2.1 - *Tristan Harward*
+* [#246] Pull Bootstrap updates from jlong/sass-twitter-bootstrap - *Tristan Harward*
+
+## 2.1.1.0
+* Update to Bootstrap 2.1.1
+* [#222] Remove 100% multiplier in vertical-three-colours
+* [#227] Fix IE component animation collapse
+* [#228] Fix variables documentation link
+* [#231] Made .input-block-level a class as well as mixin
+
+## 2.1.0.1
+* [#219] Fix expected a color. Got: transparent.
+* [#207] Add missing warning style for table row highlighting
+* [#208] Use grid-input-span for input spans
+
+## 2.1.0.0
+* Updated to Bootstrap 2.1
+* Changed some mixin names to be more consistent. Nested mixins in Less are separated by a `-` when they are flattened in Sass.
+
+## 2.0.4.1
+* Fix `.row-fluid > spanX` nesting
+* Small Javascript fixes for those staying on the 2.0.4 release
+* Add `!default` to z-index variables.
+
+## 2.0.4.0
+* Updated to Bootstrap 2.0.4
+* Switched to Bootstrap 2.0.3+'s method of separating responsive files
+* [#149, #150] Fix off by one error introduced with manual revert of media query breakpoints
+* `rake debug` and `rake test` both compile bootstrap & bootstrap-responsive
+
+## 2.0.3.1
+* [#145, #146] Fix button alignment in collapsing navbar as a result of an incorrect variable
+
+## 2.0.3
+* Updated to Bootstrap 2.0.3
+* [#106] Support for Rails < 3.1 through Compass
+* [#132] Add CI testing
+* [#106] Support Rails w/Compass
+* [#134] Fix support for Rails w/Compass
+
+## 2.0.2
+* [#86] Updated to Bootstrap 2.0.2
+Things of note: static navbars now have full width. (to be fixed in 2.0.3) `.navbar-inner > .container { width:940px; }` seems to work in the meanwhile
+* [#62] Fixed asset compilation taking a *very* long time.
+* [#69, #79, #80] \(Hopefully) clarified README. Now with less cat humour.
+* [#91] Removed doubled up Sass extensions for Rails.
+* [#63, #73] Allow for overriding of image-path
+* [[SO](http://stackoverflow.com/a/9909626/241212)] Added makeFluidColumn mixin for defining fluid columns. Fluid rows must use `@extend .row-fluid`, and any column inside it can use `@include makeFluidColumn(num)`, where `num` is the number of columns. Unfortunately, there is a rather major limitation to this: margins on first-child elements must be overriden. See the attached Stack Overflow answer for more information.
+
+## 2.0.1
+* Updated to Bootstrap 2.0.1
+* Modified `@mixin opacity()` to take an argument `0...1` rather than `0...100` to be consistent with Compass.
+
+## 2.0.0
+* Updated to Bootstrap 2.0.0
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/CONTRIBUTING.md b/civicrm/ext/greenwich/extern/bootstrap3/CONTRIBUTING.md
new file mode 100644
index 0000000000000000000000000000000000000000..246b96dffcc86cc8005f34db01596e90e0e783f4
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/CONTRIBUTING.md
@@ -0,0 +1,86 @@
+# Contributing to bootstrap-sass
+
+## Asset Changes
+
+Any changes to `bootstrap-sass` assets (scss, javascripts, fonts) should be checked against the `convert` rake task.
+For usage instructions, see the [README](/README.md).
+
+If something is broken in the converter, it's preferable to update the converter along with the asset itself.
+
+
+## Bugs
+
+A bug is a _demonstrable problem_ that is caused by the code in the
+repository. Good bug reports are extremely helpful - thank you!
+
+Guidelines for bug reports:
+
+1. **Does it belong here?** &mdash; is this a problem with bootstrap-sass, or
+   it an issue with [twbs/bootstrap](https://github.com/twbs/bootstrap)?
+   We only distribute a direct port and will not modify files if they're not
+   changed upstream.
+
+2. **Use the GitHub issue search** &mdash; check if the issue has already been
+   reported.
+
+3. **Isolate the problem** &mdash; ideally create a [reduced test
+   case](http://css-tricks.com/6263-reduced-test-cases/) and a live example.
+
+A good bug report shouldn't leave others needing to chase you up for more
+information. Please try to be as detailed as possible in your report. What is
+your environment? What steps will reproduce the issue? What browser(s) and OS
+experience the problem? What would you expect to be the outcome? All these
+details will help people to fix any potential bugs.
+
+Example:
+
+> Short and descriptive example bug report title
+>
+> A summary of the issue and the browser/OS environment in which it occurs. If
+> suitable, include the steps required to reproduce the bug.
+>
+> 1. This is the first step
+> 2. This is the second step
+> 3. Further steps, etc.
+>
+> `<url>` (a link to the reduced test case)
+>
+> Any other information you want to share that is relevant to the issue being
+> reported. This might include the lines of code that you have identified as
+> causing the bug, and potential solutions (and your opinions on their
+> merits).
+
+**[File a bug report](https://github.com/twbs/bootstrap-sass/issues/)**
+
+
+## Pull requests
+
+**We will not accept pull requests that modify the SCSS beyond fixing bugs caused by *our* code!**
+
+We use a [converter script][converter-readme] to automatically convert upstream bootstrap, written in LESS, to Sass.
+
+Issues related to styles or javascript but unrelated to the conversion process should go to [twbs/bootstrap][upstream].
+
+Pull requests that fix bugs caused by our code should not modify the SCSS directly, but should patch the converter instead.
+
+Good pull requests - patches, improvements, new features - are a fantastic
+help. They should remain focused in scope and avoid containing unrelated
+commits. If your contribution involves a significant amount of work or substantial
+changes to any part of the project, please open an issue to discuss it first.
+
+Make sure to adhere to the coding conventions used throughout a project
+(indentation, accurate comments, etc.). Please update any documentation that is
+relevant to the change you're making.
+
+## Do not…
+
+Please **do not** use the issue tracker for personal support requests (use
+[Stack Overflow](http://stackoverflow.com/)).
+
+Please **do not** derail or troll issues. Keep the
+discussion on topic and respect the opinions of others.
+
+*props [html5-boilerplate](https://github.com/h5bp/html5-boilerplate/blob/master/CONTRIBUTING.md)*
+
+[upstream]: https://github.com/twbs/bootstrap
+[converter-readme]: https://github.com/twbs/bootstrap-sass/blob/master/README.md#upstream-converter
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/Gemfile b/civicrm/ext/greenwich/extern/bootstrap3/Gemfile
new file mode 100644
index 0000000000000000000000000000000000000000..180144ca88901b58aa066a4f822e21c032381788
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/Gemfile
@@ -0,0 +1,7 @@
+source 'https://rubygems.org'
+
+gemspec
+
+group :development do
+  gem 'byebug', platform: :mri, require: false
+end
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/LICENSE b/civicrm/ext/greenwich/extern/bootstrap3/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..a3827b59600df5349668a8cc7afc72ae066c36f7
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2011-2016 Twitter, Inc
+Copyright (c) 2011-2016 The Bootstrap Authors
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/README.md b/civicrm/ext/greenwich/extern/bootstrap3/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..288f1036fde77d574bd5efb9269e23ca0d9a2a59
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/README.md
@@ -0,0 +1,358 @@
+# Bootstrap 3 for Sass
+[![Gem Version](https://badge.fury.io/rb/bootstrap-sass.svg)](http://badge.fury.io/rb/bootstrap-sass)
+[![npm version](https://img.shields.io/npm/v/bootstrap-sass.svg?style=flat)](https://www.npmjs.com/package/bootstrap-sass)
+[![Bower Version](https://badge.fury.io/bo/bootstrap-sass.svg)](http://badge.fury.io/bo/bootstrap-sass)
+[![Build Status](https://img.shields.io/travis/twbs/bootstrap-sass.svg)](https://travis-ci.org/twbs/bootstrap-sass)
+
+`bootstrap-sass` is a Sass-powered version of [Bootstrap](https://github.com/twbs/bootstrap) 3, ready to drop right into your Sass powered applications.
+
+This is Bootstrap **3**. For Bootstrap **4** use the [Bootstrap rubygem](https://github.com/twbs/bootstrap-rubygem) if you use Ruby, and the [main repo](https://github.com/twbs/bootstrap) otherwise.
+
+## Installation
+
+Please see the appropriate guide for your environment of choice:
+
+* [Ruby on Rails](#a-ruby-on-rails).
+* [Bower](#b-bower).
+* [npm / Node.js](#c-npm--nodejs).
+
+### a. Ruby on Rails
+
+`bootstrap-sass` is easy to drop into Rails with the asset pipeline.
+
+In your Gemfile you need to add the `bootstrap-sass` gem, and ensure that the `sass-rails` gem is present - it is added to new Rails applications by default.
+
+```ruby
+gem 'bootstrap-sass', '~> 3.4.1'
+gem 'sassc-rails', '>= 2.1.0'
+```
+
+`bundle install` and restart your server to make the files available through the pipeline.
+
+Import Bootstrap styles in `app/assets/stylesheets/application.scss`:
+
+```scss
+// "bootstrap-sprockets" must be imported before "bootstrap" and "bootstrap/variables"
+@import "bootstrap-sprockets";
+@import "bootstrap";
+```
+
+`bootstrap-sprockets` must be imported before `bootstrap` for the icon fonts to work.
+
+Make sure the file has `.scss` extension (or `.sass` for Sass syntax). If you have just generated a new Rails app,
+it may come with a `.css` file instead. If this file exists, it will be served instead of Sass, so rename it:
+
+```console
+$ mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
+```
+
+Then, remove all the `*= require_self` and `*= require_tree .` statements from the sass file. Instead, use `@import` to import Sass files.
+
+Do not use `*= require` in Sass or your other stylesheets will not be [able to access][antirequire] the Bootstrap mixins or variables.
+
+Bootstrap JavaScript depends on jQuery.
+If you're using Rails 5.1+, add the `jquery-rails` gem to your Gemfile:
+
+```ruby
+gem 'jquery-rails'
+```
+
+```console
+$ bundle install
+```
+
+Require Bootstrap Javascripts in `app/assets/javascripts/application.js`:
+
+```js
+//= require jquery
+//= require bootstrap-sprockets
+```
+
+`bootstrap-sprockets` and `bootstrap` [should not both be included](https://github.com/twbs/bootstrap-sass/issues/829#issuecomment-75153827) in `application.js`.
+
+`bootstrap-sprockets` provides individual Bootstrap Javascript files (`alert.js` or `dropdown.js`, for example), while
+`bootstrap` provides a concatenated file containing all Bootstrap Javascripts.
+
+#### Bower with Rails
+
+When using [bootstrap-sass Bower package](#c-bower) instead of the gem in Rails, configure assets in `config/application.rb`:
+
+```ruby
+# Bower asset paths
+root.join('vendor', 'assets', 'bower_components').to_s.tap do |bower_path|
+  config.sass.load_paths << bower_path
+  config.assets.paths << bower_path
+end
+# Precompile Bootstrap fonts
+config.assets.precompile << %r(bootstrap-sass/assets/fonts/bootstrap/[\w-]+\.(?:eot|svg|ttf|woff2?)$)
+# Minimum Sass number precision required by bootstrap-sass
+::Sass::Script::Value::Number.precision = [8, ::Sass::Script::Value::Number.precision].max
+```
+
+Replace Bootstrap `@import` statements in `application.scss` with:
+
+```scss
+$icon-font-path: "bootstrap-sass/assets/fonts/bootstrap/";
+@import "bootstrap-sass/assets/stylesheets/bootstrap-sprockets";
+@import "bootstrap-sass/assets/stylesheets/bootstrap";
+```
+
+Replace Bootstrap `require` directive in `application.js` with:
+
+```js
+//= require bootstrap-sass/assets/javascripts/bootstrap-sprockets
+```
+
+#### Rails 4.x
+
+Please make sure `sprockets-rails` is at least v2.1.4.
+
+#### Rails 3.2.x
+
+bootstrap-sass is no longer compatible with Rails 3. The latest version of bootstrap-sass compatible with Rails 3.2 is v3.1.1.0.
+
+### b. Bower
+
+bootstrap-sass Bower package is compatible with node-sass 3.2.0+. You can install it with:
+
+```console
+$ bower install bootstrap-sass
+```
+
+Sass, JS, and all other assets are located at [assets](/assets).
+
+By default, `bower.json` main field list only the main `_bootstrap.scss` and all the static assets (fonts and JS).
+This is compatible by default with asset managers such as [wiredep](https://github.com/taptapship/wiredep).
+
+#### Node.js Mincer
+
+If you use [mincer][mincer] with node-sass, import Bootstrap like so:
+
+In `application.css.ejs.scss` (NB **.css.ejs.scss**):
+
+```scss
+// Import mincer asset paths helper integration
+@import "bootstrap-mincer";
+@import "bootstrap";
+```
+
+In `application.js`:
+
+```js
+//= require bootstrap-sprockets
+```
+
+See also this [example manifest.js](/test/dummy_node_mincer/manifest.js) for mincer.
+
+### c. npm / Node.js
+```console
+$ npm install bootstrap-sass
+```
+
+
+## Configuration
+
+### Sass
+
+By default all of Bootstrap is imported.
+
+You can also import components explicitly. To start with a full list of modules copy
+[`_bootstrap.scss`](assets/stylesheets/_bootstrap.scss) file into your assets as `_bootstrap-custom.scss`.
+Then comment out components you do not want from `_bootstrap-custom`.
+In the application Sass file, replace `@import 'bootstrap'` with:
+
+```scss
+@import 'bootstrap-custom';
+```
+
+### Sass: Number Precision
+
+bootstrap-sass [requires](https://github.com/twbs/bootstrap-sass/issues/409) minimum [Sass number precision][sass-precision] of 8 (default is 5).
+
+Precision is set for Ruby automatically when using the `sassc-rails` gem.
+When using the npm or Bower version with Ruby, you can set it with:
+
+```ruby
+::Sass::Script::Value::Number.precision = [8, ::Sass::Script::Value::Number.precision].max
+```
+
+### Sass: Autoprefixer
+
+Bootstrap requires the use of [Autoprefixer][autoprefixer].
+[Autoprefixer][autoprefixer] adds vendor prefixes to CSS rules using values from [Can I Use](https://caniuse.com/).
+
+To match [upstream Bootstrap's level of browser compatibility](https://getbootstrap.com/getting-started/#support), set Autoprefixer's `browsers` option to:
+```json
+[
+  "Android 2.3",
+  "Android >= 4",
+  "Chrome >= 20",
+  "Firefox >= 24",
+  "Explorer >= 8",
+  "iOS >= 6",
+  "Opera >= 12",
+  "Safari >= 6"
+]
+```
+
+### JavaScript
+
+[`assets/javascripts/bootstrap.js`](/assets/javascripts/bootstrap.js) contains all of Bootstrap's JavaScript,
+concatenated in the [correct order](/assets/javascripts/bootstrap-sprockets.js).
+
+
+#### JavaScript with Sprockets or Mincer
+
+If you use Sprockets or Mincer, you can require `bootstrap-sprockets` instead to load the individual modules:
+
+```js
+// Load all Bootstrap JavaScript
+//= require bootstrap-sprockets
+```
+
+You can also load individual modules, provided you also require any dependencies.
+You can check dependencies in the [Bootstrap JS documentation][jsdocs].
+
+```js
+//= require bootstrap/scrollspy
+//= require bootstrap/modal
+//= require bootstrap/dropdown
+```
+
+### Fonts
+
+The fonts are referenced as:
+
+```scss
+"#{$icon-font-path}#{$icon-font-name}.eot"
+```
+
+`$icon-font-path` defaults to `bootstrap/` if asset path helpers are used, and `../fonts/bootstrap/` otherwise.
+
+When using bootstrap-sass with Compass, Sprockets, or Mincer, you **must** import the relevant path helpers before Bootstrap itself, for example:
+
+```scss
+@import "bootstrap-compass";
+@import "bootstrap";
+```
+
+## Usage
+
+### Sass
+
+Import Bootstrap into a Sass file (for example, `application.scss`) to get all of Bootstrap's styles, mixins and variables!
+
+```scss
+@import "bootstrap";
+```
+
+You can also include optional Bootstrap theme:
+
+```scss
+@import "bootstrap/theme";
+```
+
+The full list of Bootstrap variables can be found [here](https://getbootstrap.com/customize/#less-variables). You can override these by simply redefining the variable before the `@import` directive, e.g.:
+
+```scss
+$navbar-default-bg: #312312;
+$light-orange: #ff8c00;
+$navbar-default-color: $light-orange;
+
+@import "bootstrap";
+```
+
+### Eyeglass
+
+Bootstrap is available as an [Eyeglass](https://github.com/sass-eyeglass/eyeglass) module. After installing Bootstrap via NPM you can import the Bootstrap library via:
+
+```scss
+@import "bootstrap-sass/bootstrap"
+```
+
+or import only the parts of Bootstrap you need:
+
+```scss
+@import "bootstrap-sass/bootstrap/variables";
+@import "bootstrap-sass/bootstrap/mixins";
+@import "bootstrap-sass/bootstrap/carousel";
+```
+
+## Version
+
+Bootstrap for Sass version may differ from the upstream version in the last number, known as
+[PATCH](https://semver.org/spec/v2.0.0.html). The patch version may be ahead of the corresponding upstream minor.
+This happens when we need to release Sass-specific changes.
+
+Before v3.3.2, Bootstrap for Sass version used to reflect the upstream version, with an additional number for
+Sass-specific changes. This was changed due to Bower and npm compatibility issues.
+
+The upstream versions vs the Bootstrap for Sass versions are:
+
+| Upstream |    Sass |
+|---------:|--------:|
+|    3.3.4+ |   same |
+|    3.3.2 |   3.3.3 |
+| <= 3.3.1 | 3.3.1.x |
+
+Always refer to [CHANGELOG.md](/CHANGELOG.md) when upgrading.
+
+---
+
+## Development and Contributing
+
+If you'd like to help with the development of bootstrap-sass itself, read this section.
+
+### Upstream Converter
+
+Keeping bootstrap-sass in sync with upstream changes from Bootstrap used to be an error prone and time consuming manual process. With Bootstrap 3 we have introduced a converter that automates this.
+
+**Note: if you're just looking to *use* Bootstrap 3, see the [installation](#installation) section above.**
+
+Upstream changes to the Bootstrap project can now be pulled in using the `convert` rake task.
+
+Here's an example run that would pull down the master branch from the main [twbs/bootstrap](https://github.com/twbs/bootstrap) repo:
+
+    rake convert
+
+This will convert the latest LESS to Sass and update to the latest JS.
+To convert a specific branch or version, pass the branch name or the commit hash as the first task argument:
+
+    rake convert[e8a1df5f060bf7e6631554648e0abde150aedbe4]
+
+The latest converter script is located [here][converter] and does the following:
+
+* Converts upstream Bootstrap LESS files to its matching SCSS file.
+* Copies all upstream JavaScript into `assets/javascripts/bootstrap`, a Sprockets manifest at `assets/javascripts/bootstrap-sprockets.js`, and a concatenation at `assets/javascripts/bootstrap.js`.
+* Copies all upstream font files into `assets/fonts/bootstrap`.
+* Sets `Bootstrap::BOOTSTRAP_SHA` in [version.rb][version] to the branch sha.
+
+This converter fully converts original LESS to SCSS. Conversion is automatic but requires instructions for certain transformations (see converter output).
+Please submit GitHub issues tagged with `conversion`.
+
+## Credits
+
+bootstrap-sass has a number of major contributors:
+
+<!-- feel free to make these link wherever you wish -->
+* [Thomas McDonald](https://twitter.com/thomasmcdonald_)
+* [Tristan Harward](http://www.trisweb.com)
+* Peter Gumeson
+* [Gleb Mazovetskiy](https://github.com/glebm)
+
+and a [significant number of other contributors][contrib].
+
+## You're in good company
+bootstrap-sass is used to build some awesome projects all over the web, including
+[Diaspora](https://diasporafoundation.org/), [rails_admin](https://github.com/sferik/rails_admin),
+Michael Hartl's [Rails Tutorial](https://www.railstutorial.org/), [gitlabhq](http://gitlabhq.com/) and
+[kandan](http://getkandan.com/).
+
+[converter]: https://github.com/twbs/bootstrap-sass/blob/master/tasks/converter/less_conversion.rb
+[version]: https://github.com/twbs/bootstrap-sass/blob/master/lib/bootstrap-sass/version.rb
+[contrib]: https://github.com/twbs/bootstrap-sass/graphs/contributors
+[antirequire]: https://github.com/twbs/bootstrap-sass/issues/79#issuecomment-4428595
+[jsdocs]: https://getbootstrap.com/javascript/#transitions
+[sass-precision]: http://sass-lang.com/documentation/Sass/Script/Value/Number.html#precision%3D-class_method
+[mincer]: https://github.com/nodeca/mincer
+[autoprefixer]: https://github.com/postcss/autoprefixer
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/Rakefile b/civicrm/ext/greenwich/extern/bootstrap3/Rakefile
new file mode 100644
index 0000000000000000000000000000000000000000..2983070a08f88d75da498ee30024f4c89d79426a
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/Rakefile
@@ -0,0 +1,98 @@
+require 'bundler/gem_tasks'
+
+lib_path = File.join(__dir__, 'lib')
+$:.unshift(lib_path) unless $:.include?(lib_path)
+
+load './tasks/bower.rake'
+
+require 'rake/testtask'
+Rake::TestTask.new do |t|
+  t.libs << 'test'
+  t.test_files = FileList['test/**/*_test.rb']
+  t.verbose = true
+end
+
+desc 'Test all Gemfiles from test/*.gemfile'
+task :test_all_gemfiles do
+  require 'term/ansicolor'
+  require 'pty'
+  require 'shellwords'
+  cmd      = 'bundle install --quiet && bundle exec rake --trace'
+  statuses = Dir.glob('./test/gemfiles/*{[!.lock]}').map do |gemfile|
+    env = {'BUNDLE_GEMFILE' => gemfile}
+    cmd_with_env = "  (#{env.map { |k, v| "export #{k}=#{Shellwords.escape v}" } * ' '}; #{cmd})"
+    $stderr.puts Term::ANSIColor.cyan("Testing\n#{cmd_with_env}")
+    PTY.spawn(env, cmd) do |r, _w, pid|
+      begin
+        r.each_line { |l| puts l }
+      rescue Errno::EIO
+        # Errno:EIO error means that the process has finished giving output.
+      ensure
+        ::Process.wait pid
+      end
+    end
+    [$? && $?.exitstatus == 0, cmd_with_env]
+  end
+  failed_cmds = statuses.reject(&:first).map { |(_status, cmd_with_env)| cmd_with_env }
+  if failed_cmds.empty?
+    $stderr.puts Term::ANSIColor.green('Tests pass with all gemfiles')
+  else
+    $stderr.puts Term::ANSIColor.red("Failing (#{failed_cmds.size} / #{statuses.size})\n#{failed_cmds * "\n"}")
+    exit 1
+  end
+end
+
+desc 'Dumps output to a CSS file for testing'
+task :debug do
+  require 'sassc'
+  require 'bootstrap-sass'
+  path = Bootstrap.stylesheets_path
+  %w(_bootstrap).each do |file|
+    engine = SassC::Engine.new(File.read("#{path}/#{file}.scss"), syntax: :scss, load_paths: ['.', path])
+    File.open("tmp/#{file}.css", 'w') { |f| f.write(engine.render) }
+  end
+end
+
+desc 'Convert bootstrap to bootstrap-sass'
+task :convert, :branch do |t, args|
+  require './tasks/converter'
+  Converter.new(branch: args[:branch]).process_bootstrap
+end
+
+desc 'LESS to stdin -> Sass to stdout'
+task :less_to_scss, :branch do |t, args|
+  require './tasks/converter'
+  puts Converter.new(branch: args[:branch]).convert_less(STDIN.read)
+end
+
+desc 'Compile bootstrap-sass to tmp/ (or first arg)'
+task :compile, :css_path do |t, args|
+  require 'sassc'
+  require 'bootstrap-sass'
+  require 'term/ansicolor'
+
+  path = 'assets/stylesheets'
+  css_path = args.with_defaults(css_path: 'tmp')[:css_path]
+  puts Term::ANSIColor.bold "Compiling SCSS in #{path}"
+  Dir.mkdir(css_path) unless File.directory?(css_path)
+  %w(_bootstrap bootstrap/_theme).each do |file|
+    save_path = "#{css_path}/#{file.sub(/(^|\/)?_+/, '\1').sub('/', '-')}.css"
+    puts Term::ANSIColor.cyan("  #{save_path}") + '...'
+    engine = SassC::Engine.new(File.read("#{path}/#{file}.scss"), syntax: :scss, load_paths: ['.', path])
+    css = engine.render
+    File.open(save_path, 'w') { |f| f.write css }
+  end
+end
+
+desc 'Start a dummy (test) Rails app server'
+task :dummy_rails do
+  require 'rack'
+  require 'term/ansicolor'
+  port = ENV['PORT'] || 9292
+  puts %Q(Starting on #{Term::ANSIColor.cyan "http://localhost:#{port}"})
+  Rack::Server.start(
+    config: 'test/dummy_rails/config.ru',
+    Port: port)
+end
+
+task default: :test
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.eot b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.eot
new file mode 100644
index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64
Binary files /dev/null and b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.eot differ
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.svg b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.svg
new file mode 100644
index 0000000000000000000000000000000000000000..94fb5490a2ed10b2c69a4a567a4fd2e4f706d841
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.svg
@@ -0,0 +1,288 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata></metadata>
+<defs>
+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
+<font-face units-per-em="1200" ascent="960" descent="-240" />
+<missing-glyph horiz-adv-x="500" />
+<glyph horiz-adv-x="0" />
+<glyph horiz-adv-x="400" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
+<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
+<glyph unicode="&#x2000;" horiz-adv-x="650" />
+<glyph unicode="&#x2001;" horiz-adv-x="1300" />
+<glyph unicode="&#x2002;" horiz-adv-x="650" />
+<glyph unicode="&#x2003;" horiz-adv-x="1300" />
+<glyph unicode="&#x2004;" horiz-adv-x="433" />
+<glyph unicode="&#x2005;" horiz-adv-x="325" />
+<glyph unicode="&#x2006;" horiz-adv-x="216" />
+<glyph unicode="&#x2007;" horiz-adv-x="216" />
+<glyph unicode="&#x2008;" horiz-adv-x="162" />
+<glyph unicode="&#x2009;" horiz-adv-x="260" />
+<glyph unicode="&#x200a;" horiz-adv-x="72" />
+<glyph unicode="&#x202f;" horiz-adv-x="260" />
+<glyph unicode="&#x205f;" horiz-adv-x="325" />
+<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
+<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
+<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
+<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
+<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
+<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
+<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
+<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
+<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
+<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
+<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
+<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
+<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
+<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
+<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
+<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
+<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
+<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
+<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
+<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
+<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
+<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
+<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
+<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
+<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
+<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
+<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
+<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
+<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
+<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
+<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
+<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
+<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
+<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
+<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
+<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
+<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
+<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
+<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
+<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
+<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
+<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
+<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
+<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
+<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
+<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
+<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
+<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
+<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
+<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
+<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
+<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
+<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
+<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
+<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
+<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
+<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
+<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
+<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
+<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
+<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
+<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
+<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
+<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
+<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
+<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
+<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
+<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
+<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
+<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
+<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
+<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
+<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
+<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
+<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
+<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
+<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
+<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
+<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
+<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
+<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
+<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
+<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
+<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
+<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
+<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
+<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
+<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
+<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
+<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
+<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
+<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
+<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
+<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
+<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
+<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
+<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
+<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
+<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
+<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
+<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
+<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
+<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
+<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
+<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
+<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
+<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
+<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
+<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
+<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
+<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
+<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
+<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
+<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
+<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
+<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
+<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
+<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
+<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
+<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
+<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
+<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
+<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
+<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
+<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
+<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
+<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
+<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
+<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
+<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
+<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
+<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
+<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
+<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
+<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
+<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
+<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
+<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
+<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
+<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
+<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
+<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
+<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
+<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
+<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
+<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
+<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
+<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
+<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
+<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
+<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
+<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
+<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
+<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
+<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
+<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
+<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
+<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
+<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
+<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
+<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
+<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
+<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
+<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
+<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
+<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
+<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
+<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
+<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
+<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
+<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
+<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
+<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
+<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
+<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
+<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
+<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
+<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
+<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
+<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
+<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
+<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
+<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
+<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
+<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
+<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
+<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
+<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
+</font>
+</defs></svg> 
\ No newline at end of file
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b
Binary files /dev/null and b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.ttf differ
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.woff b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..9e612858f802245ddcbf59788a0db942224bab35
Binary files /dev/null and b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.woff differ
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..64539b54c3751a6d9adb44c8e3a45ba5a73b77f0
Binary files /dev/null and b/civicrm/ext/greenwich/extern/bootstrap3/assets/fonts/bootstrap/glyphicons-halflings-regular.woff2 differ
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/images/.keep b/civicrm/ext/greenwich/extern/bootstrap3/assets/images/.keep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap-sprockets.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap-sprockets.js
new file mode 100644
index 0000000000000000000000000000000000000000..37468b35d439a54edd223b1672fb6443360e043c
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap-sprockets.js
@@ -0,0 +1,12 @@
+//= require ./bootstrap/affix
+//= require ./bootstrap/alert
+//= require ./bootstrap/button
+//= require ./bootstrap/carousel
+//= require ./bootstrap/collapse
+//= require ./bootstrap/dropdown
+//= require ./bootstrap/modal
+//= require ./bootstrap/scrollspy
+//= require ./bootstrap/tab
+//= require ./bootstrap/transition
+//= require ./bootstrap/tooltip
+//= require ./bootstrap/popover
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap.js
new file mode 100644
index 0000000000000000000000000000000000000000..170bd608f7fdf12827f69d31a7586fb490ba67d4
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap.js
@@ -0,0 +1,2580 @@
+/*!
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+
+if (typeof jQuery === 'undefined') {
+  throw new Error('Bootstrap\'s JavaScript requires jQuery')
+}
+
++function ($) {
+  'use strict';
+  var version = $.fn.jquery.split(' ')[0].split('.')
+  if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) {
+    throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4')
+  }
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      WebkitTransition : 'webkitTransitionEnd',
+      MozTransition    : 'transitionend',
+      OTransition      : 'oTransitionEnd otransitionend',
+      transition       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+
+    return false // explicit for ie8 (  ._.)
+  }
+
+  // https://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false
+    var $el = this
+    $(this).one('bsTransitionEnd', function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+
+    if (!$.support.transition) return
+
+    $.event.special.bsTransitionEnd = {
+      bindType: $.support.transition.end,
+      delegateType: $.support.transition.end,
+      handle: function (e) {
+        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+      }
+    }
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.VERSION = '3.4.1'
+
+  Alert.TRANSITION_DURATION = 150
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    selector    = selector === '#' ? [] : selector
+    var $parent = $(document).find(selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.closest('.alert')
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      // detach from parent, fire event then clean up data
+      $parent.detach().trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one('bsTransitionEnd', removeElement)
+        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.alert
+
+  $.fn.alert             = Plugin
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element  = $(element)
+    this.options   = $.extend({}, Button.DEFAULTS, options)
+    this.isLoading = false
+  }
+
+  Button.VERSION  = '3.4.1'
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state += 'Text'
+
+    if (data.resetText == null) $el.data('resetText', $el[val]())
+
+    // push to event loop to allow forms to submit
+    setTimeout($.proxy(function () {
+      $el[val](data[state] == null ? this.options[state] : data[state])
+
+      if (state == 'loadingText') {
+        this.isLoading = true
+        $el.addClass(d).attr(d, d).prop(d, true)
+      } else if (this.isLoading) {
+        this.isLoading = false
+        $el.removeClass(d).removeAttr(d).prop(d, false)
+      }
+    }, this), 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var changed = true
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') == 'radio') {
+        if ($input.prop('checked')) changed = false
+        $parent.find('.active').removeClass('active')
+        this.$element.addClass('active')
+      } else if ($input.prop('type') == 'checkbox') {
+        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
+        this.$element.toggleClass('active')
+      }
+      $input.prop('checked', this.$element.hasClass('active'))
+      if (changed) $input.trigger('change')
+    } else {
+      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+      this.$element.toggleClass('active')
+    }
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  var old = $.fn.button
+
+  $.fn.button             = Plugin
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document)
+    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      var $btn = $(e.target).closest('.btn')
+      Plugin.call($btn, 'toggle')
+      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
+        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
+        e.preventDefault()
+        // The target component still receive the focus
+        if ($btn.is('input,button')) $btn.trigger('focus')
+        else $btn.find('input:visible,button:visible').first().trigger('focus')
+      }
+    })
+    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+    })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      = null
+    this.sliding     = null
+    this.interval    = null
+    this.$active     = null
+    this.$items      = null
+
+    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+  }
+
+  Carousel.VERSION  = '3.4.1'
+
+  Carousel.TRANSITION_DURATION = 600
+
+  Carousel.DEFAULTS = {
+    interval: 5000,
+    pause: 'hover',
+    wrap: true,
+    keyboard: true
+  }
+
+  Carousel.prototype.keydown = function (e) {
+    if (/input|textarea/i.test(e.target.tagName)) return
+    switch (e.which) {
+      case 37: this.prev(); break
+      case 39: this.next(); break
+      default: return
+    }
+
+    e.preventDefault()
+  }
+
+  Carousel.prototype.cycle = function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getItemIndex = function (item) {
+    this.$items = item.parent().children('.item')
+    return this.$items.index(item || this.$active)
+  }
+
+  Carousel.prototype.getItemForDirection = function (direction, active) {
+    var activeIndex = this.getItemIndex(active)
+    var willWrap = (direction == 'prev' && activeIndex === 0)
+                || (direction == 'next' && activeIndex == (this.$items.length - 1))
+    if (willWrap && !this.options.wrap) return active
+    var delta = direction == 'prev' ? -1 : 1
+    var itemIndex = (activeIndex + delta) % this.$items.length
+    return this.$items.eq(itemIndex)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || this.getItemForDirection(type, $active)
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var that      = this
+
+    if ($next.hasClass('active')) return (this.sliding = false)
+
+    var relatedTarget = $next[0]
+    var slideEvent = $.Event('slide.bs.carousel', {
+      relatedTarget: relatedTarget,
+      direction: direction
+    })
+    this.$element.trigger(slideEvent)
+    if (slideEvent.isDefaultPrevented()) return
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+      $nextIndicator && $nextIndicator.addClass('active')
+    }
+
+    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      $next.addClass(type)
+      if (typeof $next === 'object' && $next.length) {
+        $next[0].offsetWidth // force reflow
+      }
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one('bsTransitionEnd', function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () {
+            that.$element.trigger(slidEvent)
+          }, 0)
+        })
+        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+    } else {
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger(slidEvent)
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  var old = $.fn.carousel
+
+  $.fn.carousel             = Plugin
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  var clickHandler = function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    if (href) {
+      href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+    }
+
+    var target  = $this.attr('data-target') || href
+    var $target = $(document).find(target)
+
+    if (!$target.hasClass('carousel')) return
+
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    Plugin.call($target, options)
+
+    if (slideIndex) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  }
+
+  $(document)
+    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      Plugin.call($carousel, $carousel.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+/* jshint latedef: false */
+
++function ($) {
+  'use strict';
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
+                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
+    this.transitioning = null
+
+    if (this.options.parent) {
+      this.$parent = this.getParent()
+    } else {
+      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+    }
+
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.VERSION  = '3.4.1'
+
+  Collapse.TRANSITION_DURATION = 350
+
+  Collapse.DEFAULTS = {
+    toggle: true
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var activesData
+    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+
+    if (actives && actives.length) {
+      activesData = actives.data('bs.collapse')
+      if (activesData && activesData.transitioning) return
+    }
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    if (actives && actives.length) {
+      Plugin.call(actives, 'hide')
+      activesData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')[dimension](0)
+      .attr('aria-expanded', true)
+
+    this.$trigger
+      .removeClass('collapsed')
+      .attr('aria-expanded', true)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse in')[dimension]('')
+      this.transitioning = 0
+      this.$element
+        .trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse in')
+      .attr('aria-expanded', false)
+
+    this.$trigger
+      .addClass('collapsed')
+      .attr('aria-expanded', false)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse')
+        .trigger('hidden.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+  Collapse.prototype.getParent = function () {
+    return $(document).find(this.options.parent)
+      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+      .each($.proxy(function (i, element) {
+        var $element = $(element)
+        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+      }, this))
+      .end()
+  }
+
+  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+    var isOpen = $element.hasClass('in')
+
+    $element.attr('aria-expanded', isOpen)
+    $trigger
+      .toggleClass('collapsed', !isOpen)
+      .attr('aria-expanded', isOpen)
+  }
+
+  function getTargetFromTrigger($trigger) {
+    var href
+    var target = $trigger.attr('data-target')
+      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+    return $(document).find(target)
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.collapse
+
+  $.fn.collapse             = Plugin
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+    var $this   = $(this)
+
+    if (!$this.attr('data-target')) e.preventDefault()
+
+    var $target = getTargetFromTrigger($this)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $this.data()
+
+    Plugin.call($target, option)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle="dropdown"]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.VERSION = '3.4.1'
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = selector !== '#' ? $(document).find(selector) : null
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+  function clearMenus(e) {
+    if (e && e.which === 3) return
+    $(backdrop).remove()
+    $(toggle).each(function () {
+      var $this         = $(this)
+      var $parent       = getParent($this)
+      var relatedTarget = { relatedTarget: this }
+
+      if (!$parent.hasClass('open')) return
+
+      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
+
+      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this.attr('aria-expanded', 'false')
+      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
+    })
+  }
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $(document.createElement('div'))
+          .addClass('dropdown-backdrop')
+          .insertAfter($(this))
+          .on('click', clearMenus)
+      }
+
+      var relatedTarget = { relatedTarget: this }
+      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this
+        .trigger('focus')
+        .attr('aria-expanded', 'true')
+
+      $parent
+        .toggleClass('open')
+        .trigger($.Event('shown.bs.dropdown', relatedTarget))
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if (!isActive && e.which != 27 || isActive && e.which == 27) {
+      if (e.which == 27) $parent.find(toggle).trigger('focus')
+      return $this.trigger('click')
+    }
+
+    var desc = ' li:not(.disabled):visible a'
+    var $items = $parent.find('.dropdown-menu' + desc)
+
+    if (!$items.length) return
+
+    var index = $items.index(e.target)
+
+    if (e.which == 38 && index > 0)                 index--         // up
+    if (e.which == 40 && index < $items.length - 1) index++         // down
+    if (!~index)                                    index = 0
+
+    $items.eq(index).trigger('focus')
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown             = Plugin
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options = options
+    this.$body = $(document.body)
+    this.$element = $(element)
+    this.$dialog = this.$element.find('.modal-dialog')
+    this.$backdrop = null
+    this.isShown = null
+    this.originalBodyPad = null
+    this.scrollbarWidth = 0
+    this.ignoreBackdropClick = false
+    this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'
+
+    if (this.options.remote) {
+      this.$element
+        .find('.modal-content')
+        .load(this.options.remote, $.proxy(function () {
+          this.$element.trigger('loaded.bs.modal')
+        }, this))
+    }
+  }
+
+  Modal.VERSION = '3.4.1'
+
+  Modal.TRANSITION_DURATION = 300
+  Modal.BACKDROP_TRANSITION_DURATION = 150
+
+  Modal.DEFAULTS = {
+    backdrop: true,
+    keyboard: true,
+    show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this.isShown ? this.hide() : this.show(_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.checkScrollbar()
+    this.setScrollbar()
+    this.$body.addClass('modal-open')
+
+    this.escape()
+    this.resize()
+
+    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
+      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
+        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
+      })
+    })
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(that.$body) // don't move modals dom position
+      }
+
+      that.$element
+        .show()
+        .scrollTop(0)
+
+      that.adjustDialog()
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element.addClass('in')
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$dialog // wait for modal to slide in
+          .one('bsTransitionEnd', function () {
+            that.$element.trigger('focus').trigger(e)
+          })
+          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+        that.$element.trigger('focus').trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.escape()
+    this.resize()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .off('click.dismiss.bs.modal')
+      .off('mouseup.dismiss.bs.modal')
+
+    this.$dialog.off('mousedown.dismiss.bs.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (document !== e.target &&
+          this.$element[0] !== e.target &&
+          !this.$element.has(e.target).length) {
+          this.$element.trigger('focus')
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keydown.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.resize = function () {
+    if (this.isShown) {
+      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+    } else {
+      $(window).off('resize.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.$body.removeClass('modal-open')
+      that.resetAdjustments()
+      that.resetScrollbar()
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $(document.createElement('div'))
+        .addClass('modal-backdrop ' + animate)
+        .appendTo(this.$body)
+
+      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+        if (this.ignoreBackdropClick) {
+          this.ignoreBackdropClick = false
+          return
+        }
+        if (e.target !== e.currentTarget) return
+        this.options.backdrop == 'static'
+          ? this.$element[0].focus()
+          : this.hide()
+      }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one('bsTransitionEnd', callback)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      var callbackRemove = function () {
+        that.removeBackdrop()
+        callback && callback()
+      }
+      $.support.transition && this.$element.hasClass('fade') ?
+        this.$backdrop
+          .one('bsTransitionEnd', callbackRemove)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callbackRemove()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  // these following methods are used to handle overflowing modals
+
+  Modal.prototype.handleUpdate = function () {
+    this.adjustDialog()
+  }
+
+  Modal.prototype.adjustDialog = function () {
+    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+    this.$element.css({
+      paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+    })
+  }
+
+  Modal.prototype.resetAdjustments = function () {
+    this.$element.css({
+      paddingLeft: '',
+      paddingRight: ''
+    })
+  }
+
+  Modal.prototype.checkScrollbar = function () {
+    var fullWindowWidth = window.innerWidth
+    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
+      var documentElementRect = document.documentElement.getBoundingClientRect()
+      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
+    }
+    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
+    this.scrollbarWidth = this.measureScrollbar()
+  }
+
+  Modal.prototype.setScrollbar = function () {
+    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+    this.originalBodyPad = document.body.style.paddingRight || ''
+    var scrollbarWidth = this.scrollbarWidth
+    if (this.bodyIsOverflowing) {
+      this.$body.css('padding-right', bodyPad + scrollbarWidth)
+      $(this.fixedContent).each(function (index, element) {
+        var actualPadding = element.style.paddingRight
+        var calculatedPadding = $(element).css('padding-right')
+        $(element)
+          .data('padding-right', actualPadding)
+          .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')
+      })
+    }
+  }
+
+  Modal.prototype.resetScrollbar = function () {
+    this.$body.css('padding-right', this.originalBodyPad)
+    $(this.fixedContent).each(function (index, element) {
+      var padding = $(element).data('padding-right')
+      $(element).removeData('padding-right')
+      element.style.paddingRight = padding ? padding : ''
+    })
+  }
+
+  Modal.prototype.measureScrollbar = function () { // thx walsh
+    var scrollDiv = document.createElement('div')
+    scrollDiv.className = 'modal-scrollbar-measure'
+    this.$body.append(scrollDiv)
+    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+    this.$body[0].removeChild(scrollDiv)
+    return scrollbarWidth
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option, _relatedTarget) {
+    return this.each(function () {
+      var $this = $(this)
+      var data = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  var old = $.fn.modal
+
+  $.fn.modal = Plugin
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this = $(this)
+    var href = $this.attr('href')
+    var target = $this.attr('data-target') ||
+      (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+
+    var $target = $(document).find(target)
+    var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    if ($this.is('a')) e.preventDefault()
+
+    $target.one('show.bs.modal', function (showEvent) {
+      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+      $target.one('hidden.bs.modal', function () {
+        $this.is(':visible') && $this.trigger('focus')
+      })
+    })
+    Plugin.call($target, option, this)
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
++function ($) {
+  'use strict';
+
+  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
+
+  var uriAttrs = [
+    'background',
+    'cite',
+    'href',
+    'itemtype',
+    'longdesc',
+    'poster',
+    'src',
+    'xlink:href'
+  ]
+
+  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
+
+  var DefaultWhitelist = {
+    // Global attributes allowed on any supplied element below.
+    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
+    a: ['target', 'href', 'title', 'rel'],
+    area: [],
+    b: [],
+    br: [],
+    col: [],
+    code: [],
+    div: [],
+    em: [],
+    hr: [],
+    h1: [],
+    h2: [],
+    h3: [],
+    h4: [],
+    h5: [],
+    h6: [],
+    i: [],
+    img: ['src', 'alt', 'title', 'width', 'height'],
+    li: [],
+    ol: [],
+    p: [],
+    pre: [],
+    s: [],
+    small: [],
+    span: [],
+    sub: [],
+    sup: [],
+    strong: [],
+    u: [],
+    ul: []
+  }
+
+  /**
+   * A pattern that recognizes a commonly useful subset of URLs that are safe.
+   *
+   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+   */
+  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi
+
+  /**
+   * A pattern that matches safe data URLs. Only matches image, video and audio types.
+   *
+   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+   */
+  var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i
+
+  function allowedAttribute(attr, allowedAttributeList) {
+    var attrName = attr.nodeName.toLowerCase()
+
+    if ($.inArray(attrName, allowedAttributeList) !== -1) {
+      if ($.inArray(attrName, uriAttrs) !== -1) {
+        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))
+      }
+
+      return true
+    }
+
+    var regExp = $(allowedAttributeList).filter(function (index, value) {
+      return value instanceof RegExp
+    })
+
+    // Check if a regular expression validates the attribute.
+    for (var i = 0, l = regExp.length; i < l; i++) {
+      if (attrName.match(regExp[i])) {
+        return true
+      }
+    }
+
+    return false
+  }
+
+  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
+    if (unsafeHtml.length === 0) {
+      return unsafeHtml
+    }
+
+    if (sanitizeFn && typeof sanitizeFn === 'function') {
+      return sanitizeFn(unsafeHtml)
+    }
+
+    // IE 8 and below don't support createHTMLDocument
+    if (!document.implementation || !document.implementation.createHTMLDocument) {
+      return unsafeHtml
+    }
+
+    var createdDocument = document.implementation.createHTMLDocument('sanitization')
+    createdDocument.body.innerHTML = unsafeHtml
+
+    var whitelistKeys = $.map(whiteList, function (el, i) { return i })
+    var elements = $(createdDocument.body).find('*')
+
+    for (var i = 0, len = elements.length; i < len; i++) {
+      var el = elements[i]
+      var elName = el.nodeName.toLowerCase()
+
+      if ($.inArray(elName, whitelistKeys) === -1) {
+        el.parentNode.removeChild(el)
+
+        continue
+      }
+
+      var attributeList = $.map(el.attributes, function (el) { return el })
+      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
+
+      for (var j = 0, len2 = attributeList.length; j < len2; j++) {
+        if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {
+          el.removeAttribute(attributeList[j].nodeName)
+        }
+      }
+    }
+
+    return createdDocument.body.innerHTML
+  }
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       = null
+    this.options    = null
+    this.enabled    = null
+    this.timeout    = null
+    this.hoverState = null
+    this.$element   = null
+    this.inState    = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.VERSION  = '3.4.1'
+
+  Tooltip.TRANSITION_DURATION = 150
+
+  Tooltip.DEFAULTS = {
+    animation: true,
+    placement: 'top',
+    selector: false,
+    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+    trigger: 'hover focus',
+    title: '',
+    delay: 0,
+    html: false,
+    container: false,
+    viewport: {
+      selector: 'body',
+      padding: 0
+    },
+    sanitize : true,
+    sanitizeFn : null,
+    whiteList : DefaultWhitelist
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled   = true
+    this.type      = type
+    this.$element  = $(element)
+    this.options   = this.getOptions(options)
+    this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
+    this.inState   = { click: false, hover: false, focus: false }
+
+    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
+      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
+    }
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    var dataAttributes = this.$element.data()
+
+    for (var dataAttr in dataAttributes) {
+      if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {
+        delete dataAttributes[dataAttr]
+      }
+    }
+
+    options = $.extend({}, this.getDefaults(), dataAttributes, options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay,
+        hide: options.delay
+      }
+    }
+
+    if (options.sanitize) {
+      options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn)
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
+    }
+
+    if (self.tip().hasClass('in') || self.hoverState == 'in') {
+      self.hoverState = 'in'
+      return
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.isInStateTrue = function () {
+    for (var key in this.inState) {
+      if (this.inState[key]) return true
+    }
+
+    return false
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
+    }
+
+    if (self.isInStateTrue()) return
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.' + this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+      if (e.isDefaultPrevented() || !inDom) return
+      var that = this
+
+      var $tip = this.tip()
+
+      var tipId = this.getUID(this.type)
+
+      this.setContent()
+      $tip.attr('id', tipId)
+      this.$element.attr('aria-describedby', tipId)
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+        .data('bs.' + this.type, this)
+
+      this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)
+      this.$element.trigger('inserted.bs.' + this.type)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var orgPlacement = placement
+        var viewportDim = this.getPosition(this.$viewport)
+
+        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
+                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
+                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
+                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+
+      var complete = function () {
+        var prevHoverState = that.hoverState
+        that.$element.trigger('shown.bs.' + that.type)
+        that.hoverState = null
+
+        if (prevHoverState == 'out') that.leave(that)
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        $tip
+          .one('bsTransitionEnd', complete)
+          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+        complete()
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function (offset, placement) {
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  += marginTop
+    offset.left += marginLeft
+
+    // $.fn.offset doesn't round pixel values
+    // so we use setOffset directly with our own function B-0
+    $.offset.setOffset($tip[0], $.extend({
+      using: function (props) {
+        $tip.css({
+          top: Math.round(props.top),
+          left: Math.round(props.left)
+        })
+      }
+    }, offset), 0)
+
+    $tip.addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      offset.top = offset.top + height - actualHeight
+    }
+
+    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+    if (delta.left) offset.left += delta.left
+    else offset.top += delta.top
+
+    var isVertical          = /top|bottom/.test(placement)
+    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+    $tip.offset(offset)
+    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+  }
+
+  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
+    this.arrow()
+      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+      .css(isVertical ? 'top' : 'left', '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    if (this.options.html) {
+      if (this.options.sanitize) {
+        title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn)
+      }
+
+      $tip.find('.tooltip-inner').html(title)
+    } else {
+      $tip.find('.tooltip-inner').text(title)
+    }
+
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function (callback) {
+    var that = this
+    var $tip = $(this.$tip)
+    var e    = $.Event('hide.bs.' + this.type)
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
+        that.$element
+          .removeAttr('aria-describedby')
+          .trigger('hidden.bs.' + that.type)
+      }
+      callback && callback()
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && $tip.hasClass('fade') ?
+      $tip
+        .one('bsTransitionEnd', complete)
+        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+      complete()
+
+    this.hoverState = null
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function ($element) {
+    $element   = $element || this.$element
+
+    var el     = $element[0]
+    var isBody = el.tagName == 'BODY'
+
+    var elRect    = el.getBoundingClientRect()
+    if (elRect.width == null) {
+      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+    }
+    var isSvg = window.SVGElement && el instanceof window.SVGElement
+    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
+    // See https://github.com/twbs/bootstrap/issues/20280
+    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
+    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+    return $.extend({}, elRect, scroll, outerDims, elOffset)
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+  }
+
+  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+    var delta = { top: 0, left: 0 }
+    if (!this.$viewport) return delta
+
+    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+    var viewportDimensions = this.getPosition(this.$viewport)
+
+    if (/right|left/.test(placement)) {
+      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
+      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+      if (topEdgeOffset < viewportDimensions.top) { // top overflow
+        delta.top = viewportDimensions.top - topEdgeOffset
+      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+      }
+    } else {
+      var leftEdgeOffset  = pos.left - viewportPadding
+      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+        delta.left = viewportDimensions.left - leftEdgeOffset
+      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
+        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+      }
+    }
+
+    return delta
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.getUID = function (prefix) {
+    do prefix += ~~(Math.random() * 1000000)
+    while (document.getElementById(prefix))
+    return prefix
+  }
+
+  Tooltip.prototype.tip = function () {
+    if (!this.$tip) {
+      this.$tip = $(this.options.template)
+      if (this.$tip.length != 1) {
+        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
+      }
+    }
+    return this.$tip
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = this
+    if (e) {
+      self = $(e.currentTarget).data('bs.' + this.type)
+      if (!self) {
+        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+        $(e.currentTarget).data('bs.' + this.type, self)
+      }
+    }
+
+    if (e) {
+      self.inState.click = !self.inState.click
+      if (self.isInStateTrue()) self.enter(self)
+      else self.leave(self)
+    } else {
+      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+    }
+  }
+
+  Tooltip.prototype.destroy = function () {
+    var that = this
+    clearTimeout(this.timeout)
+    this.hide(function () {
+      that.$element.off('.' + that.type).removeData('bs.' + that.type)
+      if (that.$tip) {
+        that.$tip.detach()
+      }
+      that.$tip = null
+      that.$arrow = null
+      that.$viewport = null
+      that.$element = null
+    })
+  }
+
+  Tooltip.prototype.sanitizeHtml = function (unsafeHtml) {
+    return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn)
+  }
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip             = Plugin
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.VERSION  = '3.4.1'
+
+  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right',
+    trigger: 'click',
+    content: '',
+    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    if (this.options.html) {
+      var typeContent = typeof content
+
+      if (this.options.sanitize) {
+        title = this.sanitizeHtml(title)
+
+        if (typeContent === 'string') {
+          content = this.sanitizeHtml(content)
+        }
+      }
+
+      $tip.find('.popover-title').html(title)
+      $tip.find('.popover-content').children().detach().end()[
+        typeContent === 'string' ? 'html' : 'append'
+      ](content)
+    } else {
+      $tip.find('.popover-title').text(title)
+      $tip.find('.popover-content').children().detach().end().text(content)
+    }
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+        o.content.call($e[0]) :
+        o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.popover
+
+  $.fn.popover             = Plugin
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    this.$body          = $(document.body)
+    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target || '') + ' .nav li > a'
+    this.offsets        = []
+    this.targets        = []
+    this.activeTarget   = null
+    this.scrollHeight   = 0
+
+    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.VERSION  = '3.4.1'
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.getScrollHeight = function () {
+    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var that          = this
+    var offsetMethod  = 'offset'
+    var offsetBase    = 0
+
+    this.offsets      = []
+    this.targets      = []
+    this.scrollHeight = this.getScrollHeight()
+
+    if (!$.isWindow(this.$scrollElement[0])) {
+      offsetMethod = 'position'
+      offsetBase   = this.$scrollElement.scrollTop()
+    }
+
+    this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#./.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && $href.is(':visible')
+          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        that.offsets.push(this[0])
+        that.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.getScrollHeight()
+    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (this.scrollHeight != scrollHeight) {
+      this.refresh()
+    }
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+    }
+
+    if (activeTarget && scrollTop < offsets[0]) {
+      this.activeTarget = null
+      return this.clear()
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
+        && this.activate(targets[i])
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    this.clear()
+
+    var selector = this.selector +
+      '[data-target="' + target + '"],' +
+      this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length) {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+  ScrollSpy.prototype.clear = function () {
+    $(this.selector)
+      .parentsUntil(this.options.target, '.active')
+      .removeClass('active')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy             = Plugin
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load.bs.scrollspy.data-api', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      Plugin.call($spy, $spy.data())
+    })
+  })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    // jscs:disable requireDollarBeforejQueryAssignment
+    this.element = $(element)
+    // jscs:enable requireDollarBeforejQueryAssignment
+  }
+
+  Tab.VERSION = '3.4.1'
+
+  Tab.TRANSITION_DURATION = 150
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var $previous = $ul.find('.active:last a')
+    var hideEvent = $.Event('hide.bs.tab', {
+      relatedTarget: $this[0]
+    })
+    var showEvent = $.Event('show.bs.tab', {
+      relatedTarget: $previous[0]
+    })
+
+    $previous.trigger(hideEvent)
+    $this.trigger(showEvent)
+
+    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+    var $target = $(document).find(selector)
+
+    this.activate($this.closest('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $previous.trigger({
+        type: 'hidden.bs.tab',
+        relatedTarget: $this[0]
+      })
+      $this.trigger({
+        type: 'shown.bs.tab',
+        relatedTarget: $previous[0]
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+        .removeClass('active')
+        .end()
+        .find('[data-toggle="tab"]')
+        .attr('aria-expanded', false)
+
+      element
+        .addClass('active')
+        .find('[data-toggle="tab"]')
+        .attr('aria-expanded', true)
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu').length) {
+        element
+          .closest('li.dropdown')
+          .addClass('active')
+          .end()
+          .find('[data-toggle="tab"]')
+          .attr('aria-expanded', true)
+      }
+
+      callback && callback()
+    }
+
+    $active.length && transition ?
+      $active
+        .one('bsTransitionEnd', next)
+        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tab
+
+  $.fn.tab             = Plugin
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  var clickHandler = function (e) {
+    e.preventDefault()
+    Plugin.call($(this), 'show')
+  }
+
+  $(document)
+    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+
+    var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target)
+
+    this.$target = target
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element     = $(element)
+    this.affixed      = null
+    this.unpin        = null
+    this.pinnedOffset = null
+
+    this.checkPosition()
+  }
+
+  Affix.VERSION  = '3.4.1'
+
+  Affix.RESET    = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0,
+    target: window
+  }
+
+  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+    var scrollTop    = this.$target.scrollTop()
+    var position     = this.$element.offset()
+    var targetHeight = this.$target.height()
+
+    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+    if (this.affixed == 'bottom') {
+      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+    }
+
+    var initializing   = this.affixed == null
+    var colliderTop    = initializing ? scrollTop : position.top
+    var colliderHeight = initializing ? targetHeight : height
+
+    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+    return false
+  }
+
+  Affix.prototype.getPinnedOffset = function () {
+    if (this.pinnedOffset) return this.pinnedOffset
+    this.$element.removeClass(Affix.RESET).addClass('affix')
+    var scrollTop = this.$target.scrollTop()
+    var position  = this.$element.offset()
+    return (this.pinnedOffset = position.top - scrollTop)
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var height       = this.$element.height()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+    var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+    if (this.affixed != affix) {
+      if (this.unpin != null) this.$element.css('top', '')
+
+      var affixType = 'affix' + (affix ? '-' + affix : '')
+      var e         = $.Event(affixType + '.bs.affix')
+
+      this.$element.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      this.affixed = affix
+      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+      this.$element
+        .removeClass(Affix.RESET)
+        .addClass(affixType)
+        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+    }
+
+    if (affix == 'bottom') {
+      this.$element.offset({
+        top: scrollHeight - height - offsetBottom
+      })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.affix
+
+  $.fn.affix             = Plugin
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
+
+      Plugin.call($spy, data)
+    })
+  })
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap.min.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..eb0a8b410f59eb8abcd21e588f1a7b718db3eebd
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");!function(t){"use strict";var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||3<e[0])throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(),function(n){"use strict";n.fn.emulateTransitionEnd=function(t){var e=!1,i=this;n(this).one("bsTransitionEnd",function(){e=!0});return setTimeout(function(){e||n(i).trigger(n.support.transition.end)},t),this},n(function(){n.support.transition=function o(){var t=document.createElement("bootstrap"),e={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var i in e)if(t.style[i]!==undefined)return{end:e[i]};return!1}(),n.support.transition&&(n.event.special.bsTransitionEnd={bindType:n.support.transition.end,delegateType:n.support.transition.end,handle:function(t){if(n(t.target).is(this))return t.handleObj.handler.apply(this,arguments)}})})}(jQuery),function(s){"use strict";var e='[data-dismiss="alert"]',a=function(t){s(t).on("click",e,this.close)};a.VERSION="3.4.1",a.TRANSITION_DURATION=150,a.prototype.close=function(t){var e=s(this),i=e.attr("data-target");i||(i=(i=e.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),i="#"===i?[]:i;var o=s(document).find(i);function n(){o.detach().trigger("closed.bs.alert").remove()}t&&t.preventDefault(),o.length||(o=e.closest(".alert")),o.trigger(t=s.Event("close.bs.alert")),t.isDefaultPrevented()||(o.removeClass("in"),s.support.transition&&o.hasClass("fade")?o.one("bsTransitionEnd",n).emulateTransitionEnd(a.TRANSITION_DURATION):n())};var t=s.fn.alert;s.fn.alert=function o(i){return this.each(function(){var t=s(this),e=t.data("bs.alert");e||t.data("bs.alert",e=new a(this)),"string"==typeof i&&e[i].call(t)})},s.fn.alert.Constructor=a,s.fn.alert.noConflict=function(){return s.fn.alert=t,this},s(document).on("click.bs.alert.data-api",e,a.prototype.close)}(jQuery),function(s){"use strict";var n=function(t,e){this.$element=s(t),this.options=s.extend({},n.DEFAULTS,e),this.isLoading=!1};function i(o){return this.each(function(){var t=s(this),e=t.data("bs.button"),i="object"==typeof o&&o;e||t.data("bs.button",e=new n(this,i)),"toggle"==o?e.toggle():o&&e.setState(o)})}n.VERSION="3.4.1",n.DEFAULTS={loadingText:"loading..."},n.prototype.setState=function(t){var e="disabled",i=this.$element,o=i.is("input")?"val":"html",n=i.data();t+="Text",null==n.resetText&&i.data("resetText",i[o]()),setTimeout(s.proxy(function(){i[o](null==n[t]?this.options[t]:n[t]),"loadingText"==t?(this.isLoading=!0,i.addClass(e).attr(e,e).prop(e,!0)):this.isLoading&&(this.isLoading=!1,i.removeClass(e).removeAttr(e).prop(e,!1))},this),0)},n.prototype.toggle=function(){var t=!0,e=this.$element.closest('[data-toggle="buttons"]');if(e.length){var i=this.$element.find("input");"radio"==i.prop("type")?(i.prop("checked")&&(t=!1),e.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==i.prop("type")&&(i.prop("checked")!==this.$element.hasClass("active")&&(t=!1),this.$element.toggleClass("active")),i.prop("checked",this.$element.hasClass("active")),t&&i.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var t=s.fn.button;s.fn.button=i,s.fn.button.Constructor=n,s.fn.button.noConflict=function(){return s.fn.button=t,this},s(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(t){var e=s(t.target).closest(".btn");i.call(e,"toggle"),s(t.target).is('input[type="radio"], input[type="checkbox"]')||(t.preventDefault(),e.is("input,button")?e.trigger("focus"):e.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(t){s(t.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(t.type))})}(jQuery),function(p){"use strict";var c=function(t,e){this.$element=p(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=e,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",p.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",p.proxy(this.pause,this)).on("mouseleave.bs.carousel",p.proxy(this.cycle,this))};function r(n){return this.each(function(){var t=p(this),e=t.data("bs.carousel"),i=p.extend({},c.DEFAULTS,t.data(),"object"==typeof n&&n),o="string"==typeof n?n:i.slide;e||t.data("bs.carousel",e=new c(this,i)),"number"==typeof n?e.to(n):o?e[o]():i.interval&&e.pause().cycle()})}c.VERSION="3.4.1",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(t){if(!/input|textarea/i.test(t.target.tagName)){switch(t.which){case 37:this.prev();break;case 39:this.next();break;default:return}t.preventDefault()}},c.prototype.cycle=function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(p.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(t){return this.$items=t.parent().children(".item"),this.$items.index(t||this.$active)},c.prototype.getItemForDirection=function(t,e){var i=this.getItemIndex(e);if(("prev"==t&&0===i||"next"==t&&i==this.$items.length-1)&&!this.options.wrap)return e;var o=(i+("prev"==t?-1:1))%this.$items.length;return this.$items.eq(o)},c.prototype.to=function(t){var e=this,i=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(t>this.$items.length-1||t<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){e.to(t)}):i==t?this.pause().cycle():this.slide(i<t?"next":"prev",this.$items.eq(t))},c.prototype.pause=function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&p.support.transition&&(this.$element.trigger(p.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(t,e){var i=this.$element.find(".item.active"),o=e||this.getItemForDirection(t,i),n=this.interval,s="next"==t?"left":"right",a=this;if(o.hasClass("active"))return this.sliding=!1;var r=o[0],l=p.Event("slide.bs.carousel",{relatedTarget:r,direction:s});if(this.$element.trigger(l),!l.isDefaultPrevented()){if(this.sliding=!0,n&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var h=p(this.$indicators.children()[this.getItemIndex(o)]);h&&h.addClass("active")}var d=p.Event("slid.bs.carousel",{relatedTarget:r,direction:s});return p.support.transition&&this.$element.hasClass("slide")?(o.addClass(t),"object"==typeof o&&o.length&&o[0].offsetWidth,i.addClass(s),o.addClass(s),i.one("bsTransitionEnd",function(){o.removeClass([t,s].join(" ")).addClass("active"),i.removeClass(["active",s].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger(d)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(i.removeClass("active"),o.addClass("active"),this.sliding=!1,this.$element.trigger(d)),n&&this.cycle(),this}};var t=p.fn.carousel;p.fn.carousel=r,p.fn.carousel.Constructor=c,p.fn.carousel.noConflict=function(){return p.fn.carousel=t,this};var e=function(t){var e=p(this),i=e.attr("href");i&&(i=i.replace(/.*(?=#[^\s]+$)/,""));var o=e.attr("data-target")||i,n=p(document).find(o);if(n.hasClass("carousel")){var s=p.extend({},n.data(),e.data()),a=e.attr("data-slide-to");a&&(s.interval=!1),r.call(n,s),a&&n.data("bs.carousel").to(a),t.preventDefault()}};p(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),p(window).on("load",function(){p('[data-ride="carousel"]').each(function(){var t=p(this);r.call(t,t.data())})})}(jQuery),function(a){"use strict";var r=function(t,e){this.$element=a(t),this.options=a.extend({},r.DEFAULTS,e),this.$trigger=a('[data-toggle="collapse"][href="#'+t.id+'"],[data-toggle="collapse"][data-target="#'+t.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};function n(t){var e,i=t.attr("data-target")||(e=t.attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"");return a(document).find(i)}function l(o){return this.each(function(){var t=a(this),e=t.data("bs.collapse"),i=a.extend({},r.DEFAULTS,t.data(),"object"==typeof o&&o);!e&&i.toggle&&/show|hide/.test(o)&&(i.toggle=!1),e||t.data("bs.collapse",e=new r(this,i)),"string"==typeof o&&e[o]()})}r.VERSION="3.4.1",r.TRANSITION_DURATION=350,r.DEFAULTS={toggle:!0},r.prototype.dimension=function(){return this.$element.hasClass("width")?"width":"height"},r.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var t,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(t=e.data("bs.collapse"))&&t.transitioning)){var i=a.Event("show.bs.collapse");if(this.$element.trigger(i),!i.isDefaultPrevented()){e&&e.length&&(l.call(e,"hide"),t||e.data("bs.collapse",null));var o=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[o](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var n=function(){this.$element.removeClass("collapsing").addClass("collapse in")[o](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return n.call(this);var s=a.camelCase(["scroll",o].join("-"));this.$element.one("bsTransitionEnd",a.proxy(n,this)).emulateTransitionEnd(r.TRANSITION_DURATION)[o](this.$element[0][s])}}}},r.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var t=a.Event("hide.bs.collapse");if(this.$element.trigger(t),!t.isDefaultPrevented()){var e=this.dimension();this.$element[e](this.$element[e]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var i=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};if(!a.support.transition)return i.call(this);this.$element[e](0).one("bsTransitionEnd",a.proxy(i,this)).emulateTransitionEnd(r.TRANSITION_DURATION)}}},r.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},r.prototype.getParent=function(){return a(document).find(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(t,e){var i=a(e);this.addAriaAndCollapsedClass(n(i),i)},this)).end()},r.prototype.addAriaAndCollapsedClass=function(t,e){var i=t.hasClass("in");t.attr("aria-expanded",i),e.toggleClass("collapsed",!i).attr("aria-expanded",i)};var t=a.fn.collapse;a.fn.collapse=l,a.fn.collapse.Constructor=r,a.fn.collapse.noConflict=function(){return a.fn.collapse=t,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(t){var e=a(this);e.attr("data-target")||t.preventDefault();var i=n(e),o=i.data("bs.collapse")?"toggle":e.data();l.call(i,o)})}(jQuery),function(a){"use strict";var r='[data-toggle="dropdown"]',o=function(t){a(t).on("click.bs.dropdown",this.toggle)};function l(t){var e=t.attr("data-target");e||(e=(e=t.attr("href"))&&/#[A-Za-z]/.test(e)&&e.replace(/.*(?=#[^\s]*$)/,""));var i="#"!==e?a(document).find(e):null;return i&&i.length?i:t.parent()}function s(o){o&&3===o.which||(a(".dropdown-backdrop").remove(),a(r).each(function(){var t=a(this),e=l(t),i={relatedTarget:this};e.hasClass("open")&&(o&&"click"==o.type&&/input|textarea/i.test(o.target.tagName)&&a.contains(e[0],o.target)||(e.trigger(o=a.Event("hide.bs.dropdown",i)),o.isDefaultPrevented()||(t.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",i)))))}))}o.VERSION="3.4.1",o.prototype.toggle=function(t){var e=a(this);if(!e.is(".disabled, :disabled")){var i=l(e),o=i.hasClass("open");if(s(),!o){"ontouchstart"in document.documentElement&&!i.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",s);var n={relatedTarget:this};if(i.trigger(t=a.Event("show.bs.dropdown",n)),t.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),i.toggleClass("open").trigger(a.Event("shown.bs.dropdown",n))}return!1}},o.prototype.keydown=function(t){if(/(38|40|27|32)/.test(t.which)&&!/input|textarea/i.test(t.target.tagName)){var e=a(this);if(t.preventDefault(),t.stopPropagation(),!e.is(".disabled, :disabled")){var i=l(e),o=i.hasClass("open");if(!o&&27!=t.which||o&&27==t.which)return 27==t.which&&i.find(r).trigger("focus"),e.trigger("click");var n=i.find(".dropdown-menu li:not(.disabled):visible a");if(n.length){var s=n.index(t.target);38==t.which&&0<s&&s--,40==t.which&&s<n.length-1&&s++,~s||(s=0),n.eq(s).trigger("focus")}}}};var t=a.fn.dropdown;a.fn.dropdown=function e(i){return this.each(function(){var t=a(this),e=t.data("bs.dropdown");e||t.data("bs.dropdown",e=new o(this)),"string"==typeof i&&e[i].call(t)})},a.fn.dropdown.Constructor=o,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=t,this},a(document).on("click.bs.dropdown.data-api",s).on("click.bs.dropdown.data-api",".dropdown form",function(t){t.stopPropagation()}).on("click.bs.dropdown.data-api",r,o.prototype.toggle).on("keydown.bs.dropdown.data-api",r,o.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",o.prototype.keydown)}(jQuery),function(a){"use strict";var s=function(t,e){this.options=e,this.$body=a(document.body),this.$element=a(t),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.fixedContent=".navbar-fixed-top, .navbar-fixed-bottom",this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};function r(o,n){return this.each(function(){var t=a(this),e=t.data("bs.modal"),i=a.extend({},s.DEFAULTS,t.data(),"object"==typeof o&&o);e||t.data("bs.modal",e=new s(this,i)),"string"==typeof o?e[o](n):i.show&&e.show(n)})}s.VERSION="3.4.1",s.TRANSITION_DURATION=300,s.BACKDROP_TRANSITION_DURATION=150,s.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},s.prototype.toggle=function(t){return this.isShown?this.hide():this.show(t)},s.prototype.show=function(i){var o=this,t=a.Event("show.bs.modal",{relatedTarget:i});this.$element.trigger(t),this.isShown||t.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){o.$element.one("mouseup.dismiss.bs.modal",function(t){a(t.target).is(o.$element)&&(o.ignoreBackdropClick=!0)})}),this.backdrop(function(){var t=a.support.transition&&o.$element.hasClass("fade");o.$element.parent().length||o.$element.appendTo(o.$body),o.$element.show().scrollTop(0),o.adjustDialog(),t&&o.$element[0].offsetWidth,o.$element.addClass("in"),o.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:i});t?o.$dialog.one("bsTransitionEnd",function(){o.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(s.TRANSITION_DURATION):o.$element.trigger("focus").trigger(e)}))},s.prototype.hide=function(t){t&&t.preventDefault(),t=a.Event("hide.bs.modal"),this.$element.trigger(t),this.isShown&&!t.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(s.TRANSITION_DURATION):this.hideModal())},s.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(t){document===t.target||this.$element[0]===t.target||this.$element.has(t.target).length||this.$element.trigger("focus")},this))},s.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(t){27==t.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},s.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},s.prototype.hideModal=function(){var t=this;this.$element.hide(),this.backdrop(function(){t.$body.removeClass("modal-open"),t.resetAdjustments(),t.resetScrollbar(),t.$element.trigger("hidden.bs.modal")})},s.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},s.prototype.backdrop=function(t){var e=this,i=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var o=a.support.transition&&i;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+i).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(t){this.ignoreBackdropClick?this.ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide())},this)),o&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!t)return;o?this.$backdrop.one("bsTransitionEnd",t).emulateTransitionEnd(s.BACKDROP_TRANSITION_DURATION):t()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var n=function(){e.removeBackdrop(),t&&t()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",n).emulateTransitionEnd(s.BACKDROP_TRANSITION_DURATION):n()}else t&&t()},s.prototype.handleUpdate=function(){this.adjustDialog()},s.prototype.adjustDialog=function(){var t=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&t?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!t?this.scrollbarWidth:""})},s.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},s.prototype.checkScrollbar=function(){var t=window.innerWidth;if(!t){var e=document.documentElement.getBoundingClientRect();t=e.right-Math.abs(e.left)}this.bodyIsOverflowing=document.body.clientWidth<t,this.scrollbarWidth=this.measureScrollbar()},s.prototype.setScrollbar=function(){var t=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"";var n=this.scrollbarWidth;this.bodyIsOverflowing&&(this.$body.css("padding-right",t+n),a(this.fixedContent).each(function(t,e){var i=e.style.paddingRight,o=a(e).css("padding-right");a(e).data("padding-right",i).css("padding-right",parseFloat(o)+n+"px")}))},s.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad),a(this.fixedContent).each(function(t,e){var i=a(e).data("padding-right");a(e).removeData("padding-right"),e.style.paddingRight=i||""})},s.prototype.measureScrollbar=function(){var t=document.createElement("div");t.className="modal-scrollbar-measure",this.$body.append(t);var e=t.offsetWidth-t.clientWidth;return this.$body[0].removeChild(t),e};var t=a.fn.modal;a.fn.modal=r,a.fn.modal.Constructor=s,a.fn.modal.noConflict=function(){return a.fn.modal=t,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(t){var e=a(this),i=e.attr("href"),o=e.attr("data-target")||i&&i.replace(/.*(?=#[^\s]+$)/,""),n=a(document).find(o),s=n.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(i)&&i},n.data(),e.data());e.is("a")&&t.preventDefault(),n.one("show.bs.modal",function(t){t.isDefaultPrevented()||n.one("hidden.bs.modal",function(){e.is(":visible")&&e.trigger("focus")})}),r.call(n,s,this)})}(jQuery),function(g){"use strict";var o=["sanitize","whiteList","sanitizeFn"],a=["background","cite","href","itemtype","longdesc","poster","src","xlink:href"],t={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},r=/^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi,l=/^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i;function u(t,e){var i=t.nodeName.toLowerCase();if(-1!==g.inArray(i,e))return-1===g.inArray(i,a)||Boolean(t.nodeValue.match(r)||t.nodeValue.match(l));for(var o=g(e).filter(function(t,e){return e instanceof RegExp}),n=0,s=o.length;n<s;n++)if(i.match(o[n]))return!0;return!1}function n(t,e,i){if(0===t.length)return t;if(i&&"function"==typeof i)return i(t);if(!document.implementation||!document.implementation.createHTMLDocument)return t;var o=document.implementation.createHTMLDocument("sanitization");o.body.innerHTML=t;for(var n=g.map(e,function(t,e){return e}),s=g(o.body).find("*"),a=0,r=s.length;a<r;a++){var l=s[a],h=l.nodeName.toLowerCase();if(-1!==g.inArray(h,n))for(var d=g.map(l.attributes,function(t){return t}),p=[].concat(e["*"]||[],e[h]||[]),c=0,f=d.length;c<f;c++)u(d[c],p)||l.removeAttribute(d[c].nodeName);else l.parentNode.removeChild(l)}return o.body.innerHTML}var m=function(t,e){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",t,e)};m.VERSION="3.4.1",m.TRANSITION_DURATION=150,m.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0},sanitize:!0,sanitizeFn:null,whiteList:t},m.prototype.init=function(t,e,i){if(this.enabled=!0,this.type=t,this.$element=g(e),this.options=this.getOptions(i),this.$viewport=this.options.viewport&&g(document).find(g.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var o=this.options.trigger.split(" "),n=o.length;n--;){var s=o[n];if("click"==s)this.$element.on("click."+this.type,this.options.selector,g.proxy(this.toggle,this));else if("manual"!=s){var a="hover"==s?"mouseenter":"focusin",r="hover"==s?"mouseleave":"focusout";this.$element.on(a+"."+this.type,this.options.selector,g.proxy(this.enter,this)),this.$element.on(r+"."+this.type,this.options.selector,g.proxy(this.leave,this))}}this.options.selector?this._options=g.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},m.prototype.getDefaults=function(){return m.DEFAULTS},m.prototype.getOptions=function(t){var e=this.$element.data();for(var i in e)e.hasOwnProperty(i)&&-1!==g.inArray(i,o)&&delete e[i];return(t=g.extend({},this.getDefaults(),e,t)).delay&&"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),t.sanitize&&(t.template=n(t.template,t.whiteList,t.sanitizeFn)),t},m.prototype.getDelegateOptions=function(){var i={},o=this.getDefaults();return this._options&&g.each(this._options,function(t,e){o[t]!=e&&(i[t]=e)}),i},m.prototype.enter=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusin"==t.type?"focus":"hover"]=!0),e.tip().hasClass("in")||"in"==e.hoverState)e.hoverState="in";else{if(clearTimeout(e.timeout),e.hoverState="in",!e.options.delay||!e.options.delay.show)return e.show();e.timeout=setTimeout(function(){"in"==e.hoverState&&e.show()},e.options.delay.show)}},m.prototype.isInStateTrue=function(){for(var t in this.inState)if(this.inState[t])return!0;return!1},m.prototype.leave=function(t){var e=t instanceof this.constructor?t:g(t.currentTarget).data("bs."+this.type);if(e||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e)),t instanceof g.Event&&(e.inState["focusout"==t.type?"focus":"hover"]=!1),!e.isInStateTrue()){if(clearTimeout(e.timeout),e.hoverState="out",!e.options.delay||!e.options.delay.hide)return e.hide();e.timeout=setTimeout(function(){"out"==e.hoverState&&e.hide()},e.options.delay.hide)}},m.prototype.show=function(){var t=g.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(t);var e=g.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(t.isDefaultPrevented()||!e)return;var i=this,o=this.tip(),n=this.getUID(this.type);this.setContent(),o.attr("id",n),this.$element.attr("aria-describedby",n),this.options.animation&&o.addClass("fade");var s="function"==typeof this.options.placement?this.options.placement.call(this,o[0],this.$element[0]):this.options.placement,a=/\s?auto?\s?/i,r=a.test(s);r&&(s=s.replace(a,"")||"top"),o.detach().css({top:0,left:0,display:"block"}).addClass(s).data("bs."+this.type,this),this.options.container?o.appendTo(g(document).find(this.options.container)):o.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var l=this.getPosition(),h=o[0].offsetWidth,d=o[0].offsetHeight;if(r){var p=s,c=this.getPosition(this.$viewport);s="bottom"==s&&l.bottom+d>c.bottom?"top":"top"==s&&l.top-d<c.top?"bottom":"right"==s&&l.right+h>c.width?"left":"left"==s&&l.left-h<c.left?"right":s,o.removeClass(p).addClass(s)}var f=this.getCalculatedOffset(s,l,h,d);this.applyPlacement(f,s);var u=function(){var t=i.hoverState;i.$element.trigger("shown.bs."+i.type),i.hoverState=null,"out"==t&&i.leave(i)};g.support.transition&&this.$tip.hasClass("fade")?o.one("bsTransitionEnd",u).emulateTransitionEnd(m.TRANSITION_DURATION):u()}},m.prototype.applyPlacement=function(t,e){var i=this.tip(),o=i[0].offsetWidth,n=i[0].offsetHeight,s=parseInt(i.css("margin-top"),10),a=parseInt(i.css("margin-left"),10);isNaN(s)&&(s=0),isNaN(a)&&(a=0),t.top+=s,t.left+=a,g.offset.setOffset(i[0],g.extend({using:function(t){i.css({top:Math.round(t.top),left:Math.round(t.left)})}},t),0),i.addClass("in");var r=i[0].offsetWidth,l=i[0].offsetHeight;"top"==e&&l!=n&&(t.top=t.top+n-l);var h=this.getViewportAdjustedDelta(e,t,r,l);h.left?t.left+=h.left:t.top+=h.top;var d=/top|bottom/.test(e),p=d?2*h.left-o+r:2*h.top-n+l,c=d?"offsetWidth":"offsetHeight";i.offset(t),this.replaceArrow(p,i[0][c],d)},m.prototype.replaceArrow=function(t,e,i){this.arrow().css(i?"left":"top",50*(1-t/e)+"%").css(i?"top":"left","")},m.prototype.setContent=function(){var t=this.tip(),e=this.getTitle();this.options.html?(this.options.sanitize&&(e=n(e,this.options.whiteList,this.options.sanitizeFn)),t.find(".tooltip-inner").html(e)):t.find(".tooltip-inner").text(e),t.removeClass("fade in top bottom left right")},m.prototype.hide=function(t){var e=this,i=g(this.$tip),o=g.Event("hide.bs."+this.type);function n(){"in"!=e.hoverState&&i.detach(),e.$element&&e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),t&&t()}if(this.$element.trigger(o),!o.isDefaultPrevented())return i.removeClass("in"),g.support.transition&&i.hasClass("fade")?i.one("bsTransitionEnd",n).emulateTransitionEnd(m.TRANSITION_DURATION):n(),this.hoverState=null,this},m.prototype.fixTitle=function(){var t=this.$element;(t.attr("title")||"string"!=typeof t.attr("data-original-title"))&&t.attr("data-original-title",t.attr("title")||"").attr("title","")},m.prototype.hasContent=function(){return this.getTitle()},m.prototype.getPosition=function(t){var e=(t=t||this.$element)[0],i="BODY"==e.tagName,o=e.getBoundingClientRect();null==o.width&&(o=g.extend({},o,{width:o.right-o.left,height:o.bottom-o.top}));var n=window.SVGElement&&e instanceof window.SVGElement,s=i?{top:0,left:0}:n?null:t.offset(),a={scroll:i?document.documentElement.scrollTop||document.body.scrollTop:t.scrollTop()},r=i?{width:g(window).width(),height:g(window).height()}:null;return g.extend({},o,a,r,s)},m.prototype.getCalculatedOffset=function(t,e,i,o){return"bottom"==t?{top:e.top+e.height,left:e.left+e.width/2-i/2}:"top"==t?{top:e.top-o,left:e.left+e.width/2-i/2}:"left"==t?{top:e.top+e.height/2-o/2,left:e.left-i}:{top:e.top+e.height/2-o/2,left:e.left+e.width}},m.prototype.getViewportAdjustedDelta=function(t,e,i,o){var n={top:0,left:0};if(!this.$viewport)return n;var s=this.options.viewport&&this.options.viewport.padding||0,a=this.getPosition(this.$viewport);if(/right|left/.test(t)){var r=e.top-s-a.scroll,l=e.top+s-a.scroll+o;r<a.top?n.top=a.top-r:l>a.top+a.height&&(n.top=a.top+a.height-l)}else{var h=e.left-s,d=e.left+s+i;h<a.left?n.left=a.left-h:d>a.right&&(n.left=a.left+a.width-d)}return n},m.prototype.getTitle=function(){var t=this.$element,e=this.options;return t.attr("data-original-title")||("function"==typeof e.title?e.title.call(t[0]):e.title)},m.prototype.getUID=function(t){for(;t+=~~(1e6*Math.random()),document.getElementById(t););return t},m.prototype.tip=function(){if(!this.$tip&&(this.$tip=g(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},m.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},m.prototype.enable=function(){this.enabled=!0},m.prototype.disable=function(){this.enabled=!1},m.prototype.toggleEnabled=function(){this.enabled=!this.enabled},m.prototype.toggle=function(t){var e=this;t&&((e=g(t.currentTarget).data("bs."+this.type))||(e=new this.constructor(t.currentTarget,this.getDelegateOptions()),g(t.currentTarget).data("bs."+this.type,e))),t?(e.inState.click=!e.inState.click,e.isInStateTrue()?e.enter(e):e.leave(e)):e.tip().hasClass("in")?e.leave(e):e.enter(e)},m.prototype.destroy=function(){var t=this;clearTimeout(this.timeout),this.hide(function(){t.$element.off("."+t.type).removeData("bs."+t.type),t.$tip&&t.$tip.detach(),t.$tip=null,t.$arrow=null,t.$viewport=null,t.$element=null})},m.prototype.sanitizeHtml=function(t){return n(t,this.options.whiteList,this.options.sanitizeFn)};var e=g.fn.tooltip;g.fn.tooltip=function i(o){return this.each(function(){var t=g(this),e=t.data("bs.tooltip"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.tooltip",e=new m(this,i)),"string"==typeof o&&e[o]())})},g.fn.tooltip.Constructor=m,g.fn.tooltip.noConflict=function(){return g.fn.tooltip=e,this}}(jQuery),function(n){"use strict";var s=function(t,e){this.init("popover",t,e)};if(!n.fn.tooltip)throw new Error("Popover requires tooltip.js");s.VERSION="3.4.1",s.DEFAULTS=n.extend({},n.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),((s.prototype=n.extend({},n.fn.tooltip.Constructor.prototype)).constructor=s).prototype.getDefaults=function(){return s.DEFAULTS},s.prototype.setContent=function(){var t=this.tip(),e=this.getTitle(),i=this.getContent();if(this.options.html){var o=typeof i;this.options.sanitize&&(e=this.sanitizeHtml(e),"string"===o&&(i=this.sanitizeHtml(i))),t.find(".popover-title").html(e),t.find(".popover-content").children().detach().end()["string"===o?"html":"append"](i)}else t.find(".popover-title").text(e),t.find(".popover-content").children().detach().end().text(i);t.removeClass("fade top bottom left right in"),t.find(".popover-title").html()||t.find(".popover-title").hide()},s.prototype.hasContent=function(){return this.getTitle()||this.getContent()},s.prototype.getContent=function(){var t=this.$element,e=this.options;return t.attr("data-content")||("function"==typeof e.content?e.content.call(t[0]):e.content)},s.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var t=n.fn.popover;n.fn.popover=function e(o){return this.each(function(){var t=n(this),e=t.data("bs.popover"),i="object"==typeof o&&o;!e&&/destroy|hide/.test(o)||(e||t.data("bs.popover",e=new s(this,i)),"string"==typeof o&&e[o]())})},n.fn.popover.Constructor=s,n.fn.popover.noConflict=function(){return n.fn.popover=t,this}}(jQuery),function(s){"use strict";function n(t,e){this.$body=s(document.body),this.$scrollElement=s(t).is(document.body)?s(window):s(t),this.options=s.extend({},n.DEFAULTS,e),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",s.proxy(this.process,this)),this.refresh(),this.process()}function e(o){return this.each(function(){var t=s(this),e=t.data("bs.scrollspy"),i="object"==typeof o&&o;e||t.data("bs.scrollspy",e=new n(this,i)),"string"==typeof o&&e[o]()})}n.VERSION="3.4.1",n.DEFAULTS={offset:10},n.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},n.prototype.refresh=function(){var t=this,o="offset",n=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),s.isWindow(this.$scrollElement[0])||(o="position",n=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var t=s(this),e=t.data("target")||t.attr("href"),i=/^#./.test(e)&&s(e);return i&&i.length&&i.is(":visible")&&[[i[o]().top+n,e]]||null}).sort(function(t,e){return t[0]-e[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},n.prototype.process=function(){var t,e=this.$scrollElement.scrollTop()+this.options.offset,i=this.getScrollHeight(),o=this.options.offset+i-this.$scrollElement.height(),n=this.offsets,s=this.targets,a=this.activeTarget;if(this.scrollHeight!=i&&this.refresh(),o<=e)return a!=(t=s[s.length-1])&&this.activate(t);if(a&&e<n[0])return this.activeTarget=null,this.clear();for(t=n.length;t--;)a!=s[t]&&e>=n[t]&&(n[t+1]===undefined||e<n[t+1])&&this.activate(s[t])},n.prototype.activate=function(t){this.activeTarget=t,this.clear();var e=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',i=s(e).parents("li").addClass("active");i.parent(".dropdown-menu").length&&(i=i.closest("li.dropdown").addClass("active")),i.trigger("activate.bs.scrollspy")},n.prototype.clear=function(){s(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var t=s.fn.scrollspy;s.fn.scrollspy=e,s.fn.scrollspy.Constructor=n,s.fn.scrollspy.noConflict=function(){return s.fn.scrollspy=t,this},s(window).on("load.bs.scrollspy.data-api",function(){s('[data-spy="scroll"]').each(function(){var t=s(this);e.call(t,t.data())})})}(jQuery),function(r){"use strict";var a=function(t){this.element=r(t)};function e(i){return this.each(function(){var t=r(this),e=t.data("bs.tab");e||t.data("bs.tab",e=new a(this)),"string"==typeof i&&e[i]()})}a.VERSION="3.4.1",a.TRANSITION_DURATION=150,a.prototype.show=function(){var t=this.element,e=t.closest("ul:not(.dropdown-menu)"),i=t.data("target");if(i||(i=(i=t.attr("href"))&&i.replace(/.*(?=#[^\s]*$)/,"")),!t.parent("li").hasClass("active")){var o=e.find(".active:last a"),n=r.Event("hide.bs.tab",{relatedTarget:t[0]}),s=r.Event("show.bs.tab",{relatedTarget:o[0]});if(o.trigger(n),t.trigger(s),!s.isDefaultPrevented()&&!n.isDefaultPrevented()){var a=r(document).find(i);this.activate(t.closest("li"),e),this.activate(a,a.parent(),function(){o.trigger({type:"hidden.bs.tab",relatedTarget:t[0]}),t.trigger({type:"shown.bs.tab",relatedTarget:o[0]})})}}},a.prototype.activate=function(t,e,i){var o=e.find("> .active"),n=i&&r.support.transition&&(o.length&&o.hasClass("fade")||!!e.find("> .fade").length);function s(){o.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),t.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),n?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu").length&&t.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),i&&i()}o.length&&n?o.one("bsTransitionEnd",s).emulateTransitionEnd(a.TRANSITION_DURATION):s(),o.removeClass("in")};var t=r.fn.tab;r.fn.tab=e,r.fn.tab.Constructor=a,r.fn.tab.noConflict=function(){return r.fn.tab=t,this};var i=function(t){t.preventDefault(),e.call(r(this),"show")};r(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',i).on("click.bs.tab.data-api",'[data-toggle="pill"]',i)}(jQuery),function(l){"use strict";var h=function(t,e){this.options=l.extend({},h.DEFAULTS,e);var i=this.options.target===h.DEFAULTS.target?l(this.options.target):l(document).find(this.options.target);this.$target=i.on("scroll.bs.affix.data-api",l.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",l.proxy(this.checkPositionWithEventLoop,this)),this.$element=l(t),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};function i(o){return this.each(function(){var t=l(this),e=t.data("bs.affix"),i="object"==typeof o&&o;e||t.data("bs.affix",e=new h(this,i)),"string"==typeof o&&e[o]()})}h.VERSION="3.4.1",h.RESET="affix affix-top affix-bottom",h.DEFAULTS={offset:0,target:window},h.prototype.getState=function(t,e,i,o){var n=this.$target.scrollTop(),s=this.$element.offset(),a=this.$target.height();if(null!=i&&"top"==this.affixed)return n<i&&"top";if("bottom"==this.affixed)return null!=i?!(n+this.unpin<=s.top)&&"bottom":!(n+a<=t-o)&&"bottom";var r=null==this.affixed,l=r?n:s.top;return null!=i&&n<=i?"top":null!=o&&t-o<=l+(r?a:e)&&"bottom"},h.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(h.RESET).addClass("affix");var t=this.$target.scrollTop(),e=this.$element.offset();return this.pinnedOffset=e.top-t},h.prototype.checkPositionWithEventLoop=function(){setTimeout(l.proxy(this.checkPosition,this),1)},h.prototype.checkPosition=function(){if(this.$element.is(":visible")){var t=this.$element.height(),e=this.options.offset,i=e.top,o=e.bottom,n=Math.max(l(document).height(),l(document.body).height());"object"!=typeof e&&(o=i=e),"function"==typeof i&&(i=e.top(this.$element)),"function"==typeof o&&(o=e.bottom(this.$element));var s=this.getState(n,t,i,o);if(this.affixed!=s){null!=this.unpin&&this.$element.css("top","");var a="affix"+(s?"-"+s:""),r=l.Event(a+".bs.affix");if(this.$element.trigger(r),r.isDefaultPrevented())return;this.affixed=s,this.unpin="bottom"==s?this.getPinnedOffset():null,this.$element.removeClass(h.RESET).addClass(a).trigger(a.replace("affix","affixed")+".bs.affix")}"bottom"==s&&this.$element.offset({top:n-t-o})}};var t=l.fn.affix;l.fn.affix=i,l.fn.affix.Constructor=h,l.fn.affix.noConflict=function(){return l.fn.affix=t,this},l(window).on("load",function(){l('[data-spy="affix"]').each(function(){var t=l(this),e=t.data();e.offset=e.offset||{},null!=e.offsetBottom&&(e.offset.bottom=e.offsetBottom),null!=e.offsetTop&&(e.offset.top=e.offsetTop),i.call(t,e)})})}(jQuery);
\ No newline at end of file
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/affix.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/affix.js
new file mode 100644
index 0000000000000000000000000000000000000000..ad629048d401ce71b81e82bd38d66b2951db8049
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/affix.js
@@ -0,0 +1,164 @@
+/* ========================================================================
+ * Bootstrap: affix.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // AFFIX CLASS DEFINITION
+  // ======================
+
+  var Affix = function (element, options) {
+    this.options = $.extend({}, Affix.DEFAULTS, options)
+
+    var target = this.options.target === Affix.DEFAULTS.target ? $(this.options.target) : $(document).find(this.options.target)
+
+    this.$target = target
+      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))
+
+    this.$element     = $(element)
+    this.affixed      = null
+    this.unpin        = null
+    this.pinnedOffset = null
+
+    this.checkPosition()
+  }
+
+  Affix.VERSION  = '3.4.1'
+
+  Affix.RESET    = 'affix affix-top affix-bottom'
+
+  Affix.DEFAULTS = {
+    offset: 0,
+    target: window
+  }
+
+  Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
+    var scrollTop    = this.$target.scrollTop()
+    var position     = this.$element.offset()
+    var targetHeight = this.$target.height()
+
+    if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
+
+    if (this.affixed == 'bottom') {
+      if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
+      return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
+    }
+
+    var initializing   = this.affixed == null
+    var colliderTop    = initializing ? scrollTop : position.top
+    var colliderHeight = initializing ? targetHeight : height
+
+    if (offsetTop != null && scrollTop <= offsetTop) return 'top'
+    if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
+
+    return false
+  }
+
+  Affix.prototype.getPinnedOffset = function () {
+    if (this.pinnedOffset) return this.pinnedOffset
+    this.$element.removeClass(Affix.RESET).addClass('affix')
+    var scrollTop = this.$target.scrollTop()
+    var position  = this.$element.offset()
+    return (this.pinnedOffset = position.top - scrollTop)
+  }
+
+  Affix.prototype.checkPositionWithEventLoop = function () {
+    setTimeout($.proxy(this.checkPosition, this), 1)
+  }
+
+  Affix.prototype.checkPosition = function () {
+    if (!this.$element.is(':visible')) return
+
+    var height       = this.$element.height()
+    var offset       = this.options.offset
+    var offsetTop    = offset.top
+    var offsetBottom = offset.bottom
+    var scrollHeight = Math.max($(document).height(), $(document.body).height())
+
+    if (typeof offset != 'object')         offsetBottom = offsetTop = offset
+    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)
+    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
+
+    var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
+
+    if (this.affixed != affix) {
+      if (this.unpin != null) this.$element.css('top', '')
+
+      var affixType = 'affix' + (affix ? '-' + affix : '')
+      var e         = $.Event(affixType + '.bs.affix')
+
+      this.$element.trigger(e)
+
+      if (e.isDefaultPrevented()) return
+
+      this.affixed = affix
+      this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+      this.$element
+        .removeClass(Affix.RESET)
+        .addClass(affixType)
+        .trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
+    }
+
+    if (affix == 'bottom') {
+      this.$element.offset({
+        top: scrollHeight - height - offsetBottom
+      })
+    }
+  }
+
+
+  // AFFIX PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.affix')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.affix
+
+  $.fn.affix             = Plugin
+  $.fn.affix.Constructor = Affix
+
+
+  // AFFIX NO CONFLICT
+  // =================
+
+  $.fn.affix.noConflict = function () {
+    $.fn.affix = old
+    return this
+  }
+
+
+  // AFFIX DATA-API
+  // ==============
+
+  $(window).on('load', function () {
+    $('[data-spy="affix"]').each(function () {
+      var $spy = $(this)
+      var data = $spy.data()
+
+      data.offset = data.offset || {}
+
+      if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
+      if (data.offsetTop    != null) data.offset.top    = data.offsetTop
+
+      Plugin.call($spy, data)
+    })
+  })
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/alert.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/alert.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f9606b742079598a055111fd0efa74caf6e3d5f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/alert.js
@@ -0,0 +1,95 @@
+/* ========================================================================
+ * Bootstrap: alert.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // ALERT CLASS DEFINITION
+  // ======================
+
+  var dismiss = '[data-dismiss="alert"]'
+  var Alert   = function (el) {
+    $(el).on('click', dismiss, this.close)
+  }
+
+  Alert.VERSION = '3.4.1'
+
+  Alert.TRANSITION_DURATION = 150
+
+  Alert.prototype.close = function (e) {
+    var $this    = $(this)
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    selector    = selector === '#' ? [] : selector
+    var $parent = $(document).find(selector)
+
+    if (e) e.preventDefault()
+
+    if (!$parent.length) {
+      $parent = $this.closest('.alert')
+    }
+
+    $parent.trigger(e = $.Event('close.bs.alert'))
+
+    if (e.isDefaultPrevented()) return
+
+    $parent.removeClass('in')
+
+    function removeElement() {
+      // detach from parent, fire event then clean up data
+      $parent.detach().trigger('closed.bs.alert').remove()
+    }
+
+    $.support.transition && $parent.hasClass('fade') ?
+      $parent
+        .one('bsTransitionEnd', removeElement)
+        .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
+      removeElement()
+  }
+
+
+  // ALERT PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.alert')
+
+      if (!data) $this.data('bs.alert', (data = new Alert(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.alert
+
+  $.fn.alert             = Plugin
+  $.fn.alert.Constructor = Alert
+
+
+  // ALERT NO CONFLICT
+  // =================
+
+  $.fn.alert.noConflict = function () {
+    $.fn.alert = old
+    return this
+  }
+
+
+  // ALERT DATA-API
+  // ==============
+
+  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/button.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/button.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff4af20e23b519ac9bb2f43033b4ccf72e942e7d
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/button.js
@@ -0,0 +1,125 @@
+/* ========================================================================
+ * Bootstrap: button.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // BUTTON PUBLIC CLASS DEFINITION
+  // ==============================
+
+  var Button = function (element, options) {
+    this.$element  = $(element)
+    this.options   = $.extend({}, Button.DEFAULTS, options)
+    this.isLoading = false
+  }
+
+  Button.VERSION  = '3.4.1'
+
+  Button.DEFAULTS = {
+    loadingText: 'loading...'
+  }
+
+  Button.prototype.setState = function (state) {
+    var d    = 'disabled'
+    var $el  = this.$element
+    var val  = $el.is('input') ? 'val' : 'html'
+    var data = $el.data()
+
+    state += 'Text'
+
+    if (data.resetText == null) $el.data('resetText', $el[val]())
+
+    // push to event loop to allow forms to submit
+    setTimeout($.proxy(function () {
+      $el[val](data[state] == null ? this.options[state] : data[state])
+
+      if (state == 'loadingText') {
+        this.isLoading = true
+        $el.addClass(d).attr(d, d).prop(d, true)
+      } else if (this.isLoading) {
+        this.isLoading = false
+        $el.removeClass(d).removeAttr(d).prop(d, false)
+      }
+    }, this), 0)
+  }
+
+  Button.prototype.toggle = function () {
+    var changed = true
+    var $parent = this.$element.closest('[data-toggle="buttons"]')
+
+    if ($parent.length) {
+      var $input = this.$element.find('input')
+      if ($input.prop('type') == 'radio') {
+        if ($input.prop('checked')) changed = false
+        $parent.find('.active').removeClass('active')
+        this.$element.addClass('active')
+      } else if ($input.prop('type') == 'checkbox') {
+        if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
+        this.$element.toggleClass('active')
+      }
+      $input.prop('checked', this.$element.hasClass('active'))
+      if (changed) $input.trigger('change')
+    } else {
+      this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
+      this.$element.toggleClass('active')
+    }
+  }
+
+
+  // BUTTON PLUGIN DEFINITION
+  // ========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.button')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+      if (option == 'toggle') data.toggle()
+      else if (option) data.setState(option)
+    })
+  }
+
+  var old = $.fn.button
+
+  $.fn.button             = Plugin
+  $.fn.button.Constructor = Button
+
+
+  // BUTTON NO CONFLICT
+  // ==================
+
+  $.fn.button.noConflict = function () {
+    $.fn.button = old
+    return this
+  }
+
+
+  // BUTTON DATA-API
+  // ===============
+
+  $(document)
+    .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      var $btn = $(e.target).closest('.btn')
+      Plugin.call($btn, 'toggle')
+      if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) {
+        // Prevent double click on radios, and the double selections (so cancellation) on checkboxes
+        e.preventDefault()
+        // The target component still receive the focus
+        if ($btn.is('input,button')) $btn.trigger('focus')
+        else $btn.find('input:visible,button:visible').first().trigger('focus')
+      }
+    })
+    .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
+      $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
+    })
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/carousel.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/carousel.js
new file mode 100644
index 0000000000000000000000000000000000000000..a5fcac317088dfb2ae1baae1d558e79e54b6d213
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/carousel.js
@@ -0,0 +1,246 @@
+/* ========================================================================
+ * Bootstrap: carousel.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CAROUSEL CLASS DEFINITION
+  // =========================
+
+  var Carousel = function (element, options) {
+    this.$element    = $(element)
+    this.$indicators = this.$element.find('.carousel-indicators')
+    this.options     = options
+    this.paused      = null
+    this.sliding     = null
+    this.interval    = null
+    this.$active     = null
+    this.$items      = null
+
+    this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
+
+    this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
+      .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
+      .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
+  }
+
+  Carousel.VERSION  = '3.4.1'
+
+  Carousel.TRANSITION_DURATION = 600
+
+  Carousel.DEFAULTS = {
+    interval: 5000,
+    pause: 'hover',
+    wrap: true,
+    keyboard: true
+  }
+
+  Carousel.prototype.keydown = function (e) {
+    if (/input|textarea/i.test(e.target.tagName)) return
+    switch (e.which) {
+      case 37: this.prev(); break
+      case 39: this.next(); break
+      default: return
+    }
+
+    e.preventDefault()
+  }
+
+  Carousel.prototype.cycle = function (e) {
+    e || (this.paused = false)
+
+    this.interval && clearInterval(this.interval)
+
+    this.options.interval
+      && !this.paused
+      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+    return this
+  }
+
+  Carousel.prototype.getItemIndex = function (item) {
+    this.$items = item.parent().children('.item')
+    return this.$items.index(item || this.$active)
+  }
+
+  Carousel.prototype.getItemForDirection = function (direction, active) {
+    var activeIndex = this.getItemIndex(active)
+    var willWrap = (direction == 'prev' && activeIndex === 0)
+                || (direction == 'next' && activeIndex == (this.$items.length - 1))
+    if (willWrap && !this.options.wrap) return active
+    var delta = direction == 'prev' ? -1 : 1
+    var itemIndex = (activeIndex + delta) % this.$items.length
+    return this.$items.eq(itemIndex)
+  }
+
+  Carousel.prototype.to = function (pos) {
+    var that        = this
+    var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
+
+    if (pos > (this.$items.length - 1) || pos < 0) return
+
+    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
+    if (activeIndex == pos) return this.pause().cycle()
+
+    return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
+  }
+
+  Carousel.prototype.pause = function (e) {
+    e || (this.paused = true)
+
+    if (this.$element.find('.next, .prev').length && $.support.transition) {
+      this.$element.trigger($.support.transition.end)
+      this.cycle(true)
+    }
+
+    this.interval = clearInterval(this.interval)
+
+    return this
+  }
+
+  Carousel.prototype.next = function () {
+    if (this.sliding) return
+    return this.slide('next')
+  }
+
+  Carousel.prototype.prev = function () {
+    if (this.sliding) return
+    return this.slide('prev')
+  }
+
+  Carousel.prototype.slide = function (type, next) {
+    var $active   = this.$element.find('.item.active')
+    var $next     = next || this.getItemForDirection(type, $active)
+    var isCycling = this.interval
+    var direction = type == 'next' ? 'left' : 'right'
+    var that      = this
+
+    if ($next.hasClass('active')) return (this.sliding = false)
+
+    var relatedTarget = $next[0]
+    var slideEvent = $.Event('slide.bs.carousel', {
+      relatedTarget: relatedTarget,
+      direction: direction
+    })
+    this.$element.trigger(slideEvent)
+    if (slideEvent.isDefaultPrevented()) return
+
+    this.sliding = true
+
+    isCycling && this.pause()
+
+    if (this.$indicators.length) {
+      this.$indicators.find('.active').removeClass('active')
+      var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
+      $nextIndicator && $nextIndicator.addClass('active')
+    }
+
+    var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
+    if ($.support.transition && this.$element.hasClass('slide')) {
+      $next.addClass(type)
+      if (typeof $next === 'object' && $next.length) {
+        $next[0].offsetWidth // force reflow
+      }
+      $active.addClass(direction)
+      $next.addClass(direction)
+      $active
+        .one('bsTransitionEnd', function () {
+          $next.removeClass([type, direction].join(' ')).addClass('active')
+          $active.removeClass(['active', direction].join(' '))
+          that.sliding = false
+          setTimeout(function () {
+            that.$element.trigger(slidEvent)
+          }, 0)
+        })
+        .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
+    } else {
+      $active.removeClass('active')
+      $next.addClass('active')
+      this.sliding = false
+      this.$element.trigger(slidEvent)
+    }
+
+    isCycling && this.cycle()
+
+    return this
+  }
+
+
+  // CAROUSEL PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.carousel')
+      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
+      var action  = typeof option == 'string' ? option : options.slide
+
+      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
+      if (typeof option == 'number') data.to(option)
+      else if (action) data[action]()
+      else if (options.interval) data.pause().cycle()
+    })
+  }
+
+  var old = $.fn.carousel
+
+  $.fn.carousel             = Plugin
+  $.fn.carousel.Constructor = Carousel
+
+
+  // CAROUSEL NO CONFLICT
+  // ====================
+
+  $.fn.carousel.noConflict = function () {
+    $.fn.carousel = old
+    return this
+  }
+
+
+  // CAROUSEL DATA-API
+  // =================
+
+  var clickHandler = function (e) {
+    var $this   = $(this)
+    var href    = $this.attr('href')
+    if (href) {
+      href = href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+    }
+
+    var target  = $this.attr('data-target') || href
+    var $target = $(document).find(target)
+
+    if (!$target.hasClass('carousel')) return
+
+    var options = $.extend({}, $target.data(), $this.data())
+    var slideIndex = $this.attr('data-slide-to')
+    if (slideIndex) options.interval = false
+
+    Plugin.call($target, options)
+
+    if (slideIndex) {
+      $target.data('bs.carousel').to(slideIndex)
+    }
+
+    e.preventDefault()
+  }
+
+  $(document)
+    .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
+    .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
+
+  $(window).on('load', function () {
+    $('[data-ride="carousel"]').each(function () {
+      var $carousel = $(this)
+      Plugin.call($carousel, $carousel.data())
+    })
+  })
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/collapse.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/collapse.js
new file mode 100644
index 0000000000000000000000000000000000000000..2cd5997fd552c5d772570588a5ea5777eb1935de
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/collapse.js
@@ -0,0 +1,212 @@
+/* ========================================================================
+ * Bootstrap: collapse.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+/* jshint latedef: false */
+
++function ($) {
+  'use strict';
+
+  // COLLAPSE PUBLIC CLASS DEFINITION
+  // ================================
+
+  var Collapse = function (element, options) {
+    this.$element      = $(element)
+    this.options       = $.extend({}, Collapse.DEFAULTS, options)
+    this.$trigger      = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
+                           '[data-toggle="collapse"][data-target="#' + element.id + '"]')
+    this.transitioning = null
+
+    if (this.options.parent) {
+      this.$parent = this.getParent()
+    } else {
+      this.addAriaAndCollapsedClass(this.$element, this.$trigger)
+    }
+
+    if (this.options.toggle) this.toggle()
+  }
+
+  Collapse.VERSION  = '3.4.1'
+
+  Collapse.TRANSITION_DURATION = 350
+
+  Collapse.DEFAULTS = {
+    toggle: true
+  }
+
+  Collapse.prototype.dimension = function () {
+    var hasWidth = this.$element.hasClass('width')
+    return hasWidth ? 'width' : 'height'
+  }
+
+  Collapse.prototype.show = function () {
+    if (this.transitioning || this.$element.hasClass('in')) return
+
+    var activesData
+    var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
+
+    if (actives && actives.length) {
+      activesData = actives.data('bs.collapse')
+      if (activesData && activesData.transitioning) return
+    }
+
+    var startEvent = $.Event('show.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    if (actives && actives.length) {
+      Plugin.call(actives, 'hide')
+      activesData || actives.data('bs.collapse', null)
+    }
+
+    var dimension = this.dimension()
+
+    this.$element
+      .removeClass('collapse')
+      .addClass('collapsing')[dimension](0)
+      .attr('aria-expanded', true)
+
+    this.$trigger
+      .removeClass('collapsed')
+      .attr('aria-expanded', true)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse in')[dimension]('')
+      this.transitioning = 0
+      this.$element
+        .trigger('shown.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+    this.$element
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
+  }
+
+  Collapse.prototype.hide = function () {
+    if (this.transitioning || !this.$element.hasClass('in')) return
+
+    var startEvent = $.Event('hide.bs.collapse')
+    this.$element.trigger(startEvent)
+    if (startEvent.isDefaultPrevented()) return
+
+    var dimension = this.dimension()
+
+    this.$element[dimension](this.$element[dimension]())[0].offsetHeight
+
+    this.$element
+      .addClass('collapsing')
+      .removeClass('collapse in')
+      .attr('aria-expanded', false)
+
+    this.$trigger
+      .addClass('collapsed')
+      .attr('aria-expanded', false)
+
+    this.transitioning = 1
+
+    var complete = function () {
+      this.transitioning = 0
+      this.$element
+        .removeClass('collapsing')
+        .addClass('collapse')
+        .trigger('hidden.bs.collapse')
+    }
+
+    if (!$.support.transition) return complete.call(this)
+
+    this.$element
+      [dimension](0)
+      .one('bsTransitionEnd', $.proxy(complete, this))
+      .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
+  }
+
+  Collapse.prototype.toggle = function () {
+    this[this.$element.hasClass('in') ? 'hide' : 'show']()
+  }
+
+  Collapse.prototype.getParent = function () {
+    return $(document).find(this.options.parent)
+      .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
+      .each($.proxy(function (i, element) {
+        var $element = $(element)
+        this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
+      }, this))
+      .end()
+  }
+
+  Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
+    var isOpen = $element.hasClass('in')
+
+    $element.attr('aria-expanded', isOpen)
+    $trigger
+      .toggleClass('collapsed', !isOpen)
+      .attr('aria-expanded', isOpen)
+  }
+
+  function getTargetFromTrigger($trigger) {
+    var href
+    var target = $trigger.attr('data-target')
+      || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
+
+    return $(document).find(target)
+  }
+
+
+  // COLLAPSE PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.collapse')
+      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
+      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.collapse
+
+  $.fn.collapse             = Plugin
+  $.fn.collapse.Constructor = Collapse
+
+
+  // COLLAPSE NO CONFLICT
+  // ====================
+
+  $.fn.collapse.noConflict = function () {
+    $.fn.collapse = old
+    return this
+  }
+
+
+  // COLLAPSE DATA-API
+  // =================
+
+  $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
+    var $this   = $(this)
+
+    if (!$this.attr('data-target')) e.preventDefault()
+
+    var $target = getTargetFromTrigger($this)
+    var data    = $target.data('bs.collapse')
+    var option  = data ? 'toggle' : $this.data()
+
+    Plugin.call($target, option)
+  })
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/dropdown.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/dropdown.js
new file mode 100644
index 0000000000000000000000000000000000000000..4ded8501211831bc9f565c4a431312656f5b228d
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/dropdown.js
@@ -0,0 +1,165 @@
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // DROPDOWN CLASS DEFINITION
+  // =========================
+
+  var backdrop = '.dropdown-backdrop'
+  var toggle   = '[data-toggle="dropdown"]'
+  var Dropdown = function (element) {
+    $(element).on('click.bs.dropdown', this.toggle)
+  }
+
+  Dropdown.VERSION = '3.4.1'
+
+  function getParent($this) {
+    var selector = $this.attr('data-target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    var $parent = selector !== '#' ? $(document).find(selector) : null
+
+    return $parent && $parent.length ? $parent : $this.parent()
+  }
+
+  function clearMenus(e) {
+    if (e && e.which === 3) return
+    $(backdrop).remove()
+    $(toggle).each(function () {
+      var $this         = $(this)
+      var $parent       = getParent($this)
+      var relatedTarget = { relatedTarget: this }
+
+      if (!$parent.hasClass('open')) return
+
+      if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
+
+      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this.attr('aria-expanded', 'false')
+      $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
+    })
+  }
+
+  Dropdown.prototype.toggle = function (e) {
+    var $this = $(this)
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    clearMenus()
+
+    if (!isActive) {
+      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+        // if mobile we use a backdrop because click events don't delegate
+        $(document.createElement('div'))
+          .addClass('dropdown-backdrop')
+          .insertAfter($(this))
+          .on('click', clearMenus)
+      }
+
+      var relatedTarget = { relatedTarget: this }
+      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+      if (e.isDefaultPrevented()) return
+
+      $this
+        .trigger('focus')
+        .attr('aria-expanded', 'true')
+
+      $parent
+        .toggleClass('open')
+        .trigger($.Event('shown.bs.dropdown', relatedTarget))
+    }
+
+    return false
+  }
+
+  Dropdown.prototype.keydown = function (e) {
+    if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
+
+    var $this = $(this)
+
+    e.preventDefault()
+    e.stopPropagation()
+
+    if ($this.is('.disabled, :disabled')) return
+
+    var $parent  = getParent($this)
+    var isActive = $parent.hasClass('open')
+
+    if (!isActive && e.which != 27 || isActive && e.which == 27) {
+      if (e.which == 27) $parent.find(toggle).trigger('focus')
+      return $this.trigger('click')
+    }
+
+    var desc = ' li:not(.disabled):visible a'
+    var $items = $parent.find('.dropdown-menu' + desc)
+
+    if (!$items.length) return
+
+    var index = $items.index(e.target)
+
+    if (e.which == 38 && index > 0)                 index--         // up
+    if (e.which == 40 && index < $items.length - 1) index++         // down
+    if (!~index)                                    index = 0
+
+    $items.eq(index).trigger('focus')
+  }
+
+
+  // DROPDOWN PLUGIN DEFINITION
+  // ==========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.dropdown')
+
+      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+      if (typeof option == 'string') data[option].call($this)
+    })
+  }
+
+  var old = $.fn.dropdown
+
+  $.fn.dropdown             = Plugin
+  $.fn.dropdown.Constructor = Dropdown
+
+
+  // DROPDOWN NO CONFLICT
+  // ====================
+
+  $.fn.dropdown.noConflict = function () {
+    $.fn.dropdown = old
+    return this
+  }
+
+
+  // APPLY TO STANDARD DROPDOWN ELEMENTS
+  // ===================================
+
+  $(document)
+    .on('click.bs.dropdown.data-api', clearMenus)
+    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
+    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
+    .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
+    .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/modal.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/modal.js
new file mode 100644
index 0000000000000000000000000000000000000000..b9eca494fe7c594c2bb013515a9a053f5c9c4ca5
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/modal.js
@@ -0,0 +1,358 @@
+/* ========================================================================
+ * Bootstrap: modal.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // MODAL CLASS DEFINITION
+  // ======================
+
+  var Modal = function (element, options) {
+    this.options = options
+    this.$body = $(document.body)
+    this.$element = $(element)
+    this.$dialog = this.$element.find('.modal-dialog')
+    this.$backdrop = null
+    this.isShown = null
+    this.originalBodyPad = null
+    this.scrollbarWidth = 0
+    this.ignoreBackdropClick = false
+    this.fixedContent = '.navbar-fixed-top, .navbar-fixed-bottom'
+
+    if (this.options.remote) {
+      this.$element
+        .find('.modal-content')
+        .load(this.options.remote, $.proxy(function () {
+          this.$element.trigger('loaded.bs.modal')
+        }, this))
+    }
+  }
+
+  Modal.VERSION = '3.4.1'
+
+  Modal.TRANSITION_DURATION = 300
+  Modal.BACKDROP_TRANSITION_DURATION = 150
+
+  Modal.DEFAULTS = {
+    backdrop: true,
+    keyboard: true,
+    show: true
+  }
+
+  Modal.prototype.toggle = function (_relatedTarget) {
+    return this.isShown ? this.hide() : this.show(_relatedTarget)
+  }
+
+  Modal.prototype.show = function (_relatedTarget) {
+    var that = this
+    var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+    this.$element.trigger(e)
+
+    if (this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = true
+
+    this.checkScrollbar()
+    this.setScrollbar()
+    this.$body.addClass('modal-open')
+
+    this.escape()
+    this.resize()
+
+    this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+    this.$dialog.on('mousedown.dismiss.bs.modal', function () {
+      that.$element.one('mouseup.dismiss.bs.modal', function (e) {
+        if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
+      })
+    })
+
+    this.backdrop(function () {
+      var transition = $.support.transition && that.$element.hasClass('fade')
+
+      if (!that.$element.parent().length) {
+        that.$element.appendTo(that.$body) // don't move modals dom position
+      }
+
+      that.$element
+        .show()
+        .scrollTop(0)
+
+      that.adjustDialog()
+
+      if (transition) {
+        that.$element[0].offsetWidth // force reflow
+      }
+
+      that.$element.addClass('in')
+
+      that.enforceFocus()
+
+      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+      transition ?
+        that.$dialog // wait for modal to slide in
+          .one('bsTransitionEnd', function () {
+            that.$element.trigger('focus').trigger(e)
+          })
+          .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+        that.$element.trigger('focus').trigger(e)
+    })
+  }
+
+  Modal.prototype.hide = function (e) {
+    if (e) e.preventDefault()
+
+    e = $.Event('hide.bs.modal')
+
+    this.$element.trigger(e)
+
+    if (!this.isShown || e.isDefaultPrevented()) return
+
+    this.isShown = false
+
+    this.escape()
+    this.resize()
+
+    $(document).off('focusin.bs.modal')
+
+    this.$element
+      .removeClass('in')
+      .off('click.dismiss.bs.modal')
+      .off('mouseup.dismiss.bs.modal')
+
+    this.$dialog.off('mousedown.dismiss.bs.modal')
+
+    $.support.transition && this.$element.hasClass('fade') ?
+      this.$element
+        .one('bsTransitionEnd', $.proxy(this.hideModal, this))
+        .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
+      this.hideModal()
+  }
+
+  Modal.prototype.enforceFocus = function () {
+    $(document)
+      .off('focusin.bs.modal') // guard against infinite focus loop
+      .on('focusin.bs.modal', $.proxy(function (e) {
+        if (document !== e.target &&
+          this.$element[0] !== e.target &&
+          !this.$element.has(e.target).length) {
+          this.$element.trigger('focus')
+        }
+      }, this))
+  }
+
+  Modal.prototype.escape = function () {
+    if (this.isShown && this.options.keyboard) {
+      this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
+        e.which == 27 && this.hide()
+      }, this))
+    } else if (!this.isShown) {
+      this.$element.off('keydown.dismiss.bs.modal')
+    }
+  }
+
+  Modal.prototype.resize = function () {
+    if (this.isShown) {
+      $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
+    } else {
+      $(window).off('resize.bs.modal')
+    }
+  }
+
+  Modal.prototype.hideModal = function () {
+    var that = this
+    this.$element.hide()
+    this.backdrop(function () {
+      that.$body.removeClass('modal-open')
+      that.resetAdjustments()
+      that.resetScrollbar()
+      that.$element.trigger('hidden.bs.modal')
+    })
+  }
+
+  Modal.prototype.removeBackdrop = function () {
+    this.$backdrop && this.$backdrop.remove()
+    this.$backdrop = null
+  }
+
+  Modal.prototype.backdrop = function (callback) {
+    var that = this
+    var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+    if (this.isShown && this.options.backdrop) {
+      var doAnimate = $.support.transition && animate
+
+      this.$backdrop = $(document.createElement('div'))
+        .addClass('modal-backdrop ' + animate)
+        .appendTo(this.$body)
+
+      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+        if (this.ignoreBackdropClick) {
+          this.ignoreBackdropClick = false
+          return
+        }
+        if (e.target !== e.currentTarget) return
+        this.options.backdrop == 'static'
+          ? this.$element[0].focus()
+          : this.hide()
+      }, this))
+
+      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+      this.$backdrop.addClass('in')
+
+      if (!callback) return
+
+      doAnimate ?
+        this.$backdrop
+          .one('bsTransitionEnd', callback)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callback()
+
+    } else if (!this.isShown && this.$backdrop) {
+      this.$backdrop.removeClass('in')
+
+      var callbackRemove = function () {
+        that.removeBackdrop()
+        callback && callback()
+      }
+      $.support.transition && this.$element.hasClass('fade') ?
+        this.$backdrop
+          .one('bsTransitionEnd', callbackRemove)
+          .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
+        callbackRemove()
+
+    } else if (callback) {
+      callback()
+    }
+  }
+
+  // these following methods are used to handle overflowing modals
+
+  Modal.prototype.handleUpdate = function () {
+    this.adjustDialog()
+  }
+
+  Modal.prototype.adjustDialog = function () {
+    var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
+
+    this.$element.css({
+      paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
+      paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
+    })
+  }
+
+  Modal.prototype.resetAdjustments = function () {
+    this.$element.css({
+      paddingLeft: '',
+      paddingRight: ''
+    })
+  }
+
+  Modal.prototype.checkScrollbar = function () {
+    var fullWindowWidth = window.innerWidth
+    if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
+      var documentElementRect = document.documentElement.getBoundingClientRect()
+      fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
+    }
+    this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
+    this.scrollbarWidth = this.measureScrollbar()
+  }
+
+  Modal.prototype.setScrollbar = function () {
+    var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
+    this.originalBodyPad = document.body.style.paddingRight || ''
+    var scrollbarWidth = this.scrollbarWidth
+    if (this.bodyIsOverflowing) {
+      this.$body.css('padding-right', bodyPad + scrollbarWidth)
+      $(this.fixedContent).each(function (index, element) {
+        var actualPadding = element.style.paddingRight
+        var calculatedPadding = $(element).css('padding-right')
+        $(element)
+          .data('padding-right', actualPadding)
+          .css('padding-right', parseFloat(calculatedPadding) + scrollbarWidth + 'px')
+      })
+    }
+  }
+
+  Modal.prototype.resetScrollbar = function () {
+    this.$body.css('padding-right', this.originalBodyPad)
+    $(this.fixedContent).each(function (index, element) {
+      var padding = $(element).data('padding-right')
+      $(element).removeData('padding-right')
+      element.style.paddingRight = padding ? padding : ''
+    })
+  }
+
+  Modal.prototype.measureScrollbar = function () { // thx walsh
+    var scrollDiv = document.createElement('div')
+    scrollDiv.className = 'modal-scrollbar-measure'
+    this.$body.append(scrollDiv)
+    var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
+    this.$body[0].removeChild(scrollDiv)
+    return scrollbarWidth
+  }
+
+
+  // MODAL PLUGIN DEFINITION
+  // =======================
+
+  function Plugin(option, _relatedTarget) {
+    return this.each(function () {
+      var $this = $(this)
+      var data = $this.data('bs.modal')
+      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
+
+      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
+      if (typeof option == 'string') data[option](_relatedTarget)
+      else if (options.show) data.show(_relatedTarget)
+    })
+  }
+
+  var old = $.fn.modal
+
+  $.fn.modal = Plugin
+  $.fn.modal.Constructor = Modal
+
+
+  // MODAL NO CONFLICT
+  // =================
+
+  $.fn.modal.noConflict = function () {
+    $.fn.modal = old
+    return this
+  }
+
+
+  // MODAL DATA-API
+  // ==============
+
+  $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
+    var $this = $(this)
+    var href = $this.attr('href')
+    var target = $this.attr('data-target') ||
+      (href && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
+
+    var $target = $(document).find(target)
+    var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
+
+    if ($this.is('a')) e.preventDefault()
+
+    $target.one('show.bs.modal', function (showEvent) {
+      if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
+      $target.one('hidden.bs.modal', function () {
+        $this.is(':visible') && $this.trigger('focus')
+      })
+    })
+    Plugin.call($target, option, this)
+  })
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/popover.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/popover.js
new file mode 100644
index 0000000000000000000000000000000000000000..66a301cb8c205012a0807a396e3374d82cd8caff
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/popover.js
@@ -0,0 +1,123 @@
+/* ========================================================================
+ * Bootstrap: popover.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // POPOVER PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Popover = function (element, options) {
+    this.init('popover', element, options)
+  }
+
+  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+  Popover.VERSION  = '3.4.1'
+
+  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+    placement: 'right',
+    trigger: 'click',
+    content: '',
+    template: '<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+  })
+
+
+  // NOTE: POPOVER EXTENDS tooltip.js
+  // ================================
+
+  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+  Popover.prototype.constructor = Popover
+
+  Popover.prototype.getDefaults = function () {
+    return Popover.DEFAULTS
+  }
+
+  Popover.prototype.setContent = function () {
+    var $tip    = this.tip()
+    var title   = this.getTitle()
+    var content = this.getContent()
+
+    if (this.options.html) {
+      var typeContent = typeof content
+
+      if (this.options.sanitize) {
+        title = this.sanitizeHtml(title)
+
+        if (typeContent === 'string') {
+          content = this.sanitizeHtml(content)
+        }
+      }
+
+      $tip.find('.popover-title').html(title)
+      $tip.find('.popover-content').children().detach().end()[
+        typeContent === 'string' ? 'html' : 'append'
+      ](content)
+    } else {
+      $tip.find('.popover-title').text(title)
+      $tip.find('.popover-content').children().detach().end().text(content)
+    }
+
+    $tip.removeClass('fade top bottom left right in')
+
+    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
+    // this manually by checking the contents.
+    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
+  }
+
+  Popover.prototype.hasContent = function () {
+    return this.getTitle() || this.getContent()
+  }
+
+  Popover.prototype.getContent = function () {
+    var $e = this.$element
+    var o  = this.options
+
+    return $e.attr('data-content')
+      || (typeof o.content == 'function' ?
+        o.content.call($e[0]) :
+        o.content)
+  }
+
+  Popover.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
+  }
+
+
+  // POPOVER PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.popover')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.popover
+
+  $.fn.popover             = Plugin
+  $.fn.popover.Constructor = Popover
+
+
+  // POPOVER NO CONFLICT
+  // ===================
+
+  $.fn.popover.noConflict = function () {
+    $.fn.popover = old
+    return this
+  }
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/scrollspy.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/scrollspy.js
new file mode 100644
index 0000000000000000000000000000000000000000..a629ac6b1c20a33f41d1b8ffd3ea822a4b91331a
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/scrollspy.js
@@ -0,0 +1,172 @@
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // SCROLLSPY CLASS DEFINITION
+  // ==========================
+
+  function ScrollSpy(element, options) {
+    this.$body          = $(document.body)
+    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
+    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
+    this.selector       = (this.options.target || '') + ' .nav li > a'
+    this.offsets        = []
+    this.targets        = []
+    this.activeTarget   = null
+    this.scrollHeight   = 0
+
+    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
+    this.refresh()
+    this.process()
+  }
+
+  ScrollSpy.VERSION  = '3.4.1'
+
+  ScrollSpy.DEFAULTS = {
+    offset: 10
+  }
+
+  ScrollSpy.prototype.getScrollHeight = function () {
+    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
+  }
+
+  ScrollSpy.prototype.refresh = function () {
+    var that          = this
+    var offsetMethod  = 'offset'
+    var offsetBase    = 0
+
+    this.offsets      = []
+    this.targets      = []
+    this.scrollHeight = this.getScrollHeight()
+
+    if (!$.isWindow(this.$scrollElement[0])) {
+      offsetMethod = 'position'
+      offsetBase   = this.$scrollElement.scrollTop()
+    }
+
+    this.$body
+      .find(this.selector)
+      .map(function () {
+        var $el   = $(this)
+        var href  = $el.data('target') || $el.attr('href')
+        var $href = /^#./.test(href) && $(href)
+
+        return ($href
+          && $href.length
+          && $href.is(':visible')
+          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
+      })
+      .sort(function (a, b) { return a[0] - b[0] })
+      .each(function () {
+        that.offsets.push(this[0])
+        that.targets.push(this[1])
+      })
+  }
+
+  ScrollSpy.prototype.process = function () {
+    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
+    var scrollHeight = this.getScrollHeight()
+    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
+    var offsets      = this.offsets
+    var targets      = this.targets
+    var activeTarget = this.activeTarget
+    var i
+
+    if (this.scrollHeight != scrollHeight) {
+      this.refresh()
+    }
+
+    if (scrollTop >= maxScroll) {
+      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
+    }
+
+    if (activeTarget && scrollTop < offsets[0]) {
+      this.activeTarget = null
+      return this.clear()
+    }
+
+    for (i = offsets.length; i--;) {
+      activeTarget != targets[i]
+        && scrollTop >= offsets[i]
+        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
+        && this.activate(targets[i])
+    }
+  }
+
+  ScrollSpy.prototype.activate = function (target) {
+    this.activeTarget = target
+
+    this.clear()
+
+    var selector = this.selector +
+      '[data-target="' + target + '"],' +
+      this.selector + '[href="' + target + '"]'
+
+    var active = $(selector)
+      .parents('li')
+      .addClass('active')
+
+    if (active.parent('.dropdown-menu').length) {
+      active = active
+        .closest('li.dropdown')
+        .addClass('active')
+    }
+
+    active.trigger('activate.bs.scrollspy')
+  }
+
+  ScrollSpy.prototype.clear = function () {
+    $(this.selector)
+      .parentsUntil(this.options.target, '.active')
+      .removeClass('active')
+  }
+
+
+  // SCROLLSPY PLUGIN DEFINITION
+  // ===========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.scrollspy')
+      var options = typeof option == 'object' && option
+
+      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.scrollspy
+
+  $.fn.scrollspy             = Plugin
+  $.fn.scrollspy.Constructor = ScrollSpy
+
+
+  // SCROLLSPY NO CONFLICT
+  // =====================
+
+  $.fn.scrollspy.noConflict = function () {
+    $.fn.scrollspy = old
+    return this
+  }
+
+
+  // SCROLLSPY DATA-API
+  // ==================
+
+  $(window).on('load.bs.scrollspy.data-api', function () {
+    $('[data-spy="scroll"]').each(function () {
+      var $spy = $(this)
+      Plugin.call($spy, $spy.data())
+    })
+  })
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/tab.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/tab.js
new file mode 100644
index 0000000000000000000000000000000000000000..74495dffcb790a0e6039a5c0357a8b771c8f876d
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/tab.js
@@ -0,0 +1,155 @@
+/* ========================================================================
+ * Bootstrap: tab.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // TAB CLASS DEFINITION
+  // ====================
+
+  var Tab = function (element) {
+    // jscs:disable requireDollarBeforejQueryAssignment
+    this.element = $(element)
+    // jscs:enable requireDollarBeforejQueryAssignment
+  }
+
+  Tab.VERSION = '3.4.1'
+
+  Tab.TRANSITION_DURATION = 150
+
+  Tab.prototype.show = function () {
+    var $this    = this.element
+    var $ul      = $this.closest('ul:not(.dropdown-menu)')
+    var selector = $this.data('target')
+
+    if (!selector) {
+      selector = $this.attr('href')
+      selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
+    }
+
+    if ($this.parent('li').hasClass('active')) return
+
+    var $previous = $ul.find('.active:last a')
+    var hideEvent = $.Event('hide.bs.tab', {
+      relatedTarget: $this[0]
+    })
+    var showEvent = $.Event('show.bs.tab', {
+      relatedTarget: $previous[0]
+    })
+
+    $previous.trigger(hideEvent)
+    $this.trigger(showEvent)
+
+    if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return
+
+    var $target = $(document).find(selector)
+
+    this.activate($this.closest('li'), $ul)
+    this.activate($target, $target.parent(), function () {
+      $previous.trigger({
+        type: 'hidden.bs.tab',
+        relatedTarget: $this[0]
+      })
+      $this.trigger({
+        type: 'shown.bs.tab',
+        relatedTarget: $previous[0]
+      })
+    })
+  }
+
+  Tab.prototype.activate = function (element, container, callback) {
+    var $active    = container.find('> .active')
+    var transition = callback
+      && $.support.transition
+      && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
+
+    function next() {
+      $active
+        .removeClass('active')
+        .find('> .dropdown-menu > .active')
+        .removeClass('active')
+        .end()
+        .find('[data-toggle="tab"]')
+        .attr('aria-expanded', false)
+
+      element
+        .addClass('active')
+        .find('[data-toggle="tab"]')
+        .attr('aria-expanded', true)
+
+      if (transition) {
+        element[0].offsetWidth // reflow for transition
+        element.addClass('in')
+      } else {
+        element.removeClass('fade')
+      }
+
+      if (element.parent('.dropdown-menu').length) {
+        element
+          .closest('li.dropdown')
+          .addClass('active')
+          .end()
+          .find('[data-toggle="tab"]')
+          .attr('aria-expanded', true)
+      }
+
+      callback && callback()
+    }
+
+    $active.length && transition ?
+      $active
+        .one('bsTransitionEnd', next)
+        .emulateTransitionEnd(Tab.TRANSITION_DURATION) :
+      next()
+
+    $active.removeClass('in')
+  }
+
+
+  // TAB PLUGIN DEFINITION
+  // =====================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this = $(this)
+      var data  = $this.data('bs.tab')
+
+      if (!data) $this.data('bs.tab', (data = new Tab(this)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tab
+
+  $.fn.tab             = Plugin
+  $.fn.tab.Constructor = Tab
+
+
+  // TAB NO CONFLICT
+  // ===============
+
+  $.fn.tab.noConflict = function () {
+    $.fn.tab = old
+    return this
+  }
+
+
+  // TAB DATA-API
+  // ============
+
+  var clickHandler = function (e) {
+    e.preventDefault()
+    Plugin.call($(this), 'show')
+  }
+
+  $(document)
+    .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler)
+    .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler)
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/tooltip.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/tooltip.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8c1c8c2eeb9ce936bce26dadbcf429419023660
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/tooltip.js
@@ -0,0 +1,677 @@
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
++function ($) {
+  'use strict';
+
+  var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']
+
+  var uriAttrs = [
+    'background',
+    'cite',
+    'href',
+    'itemtype',
+    'longdesc',
+    'poster',
+    'src',
+    'xlink:href'
+  ]
+
+  var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i
+
+  var DefaultWhitelist = {
+    // Global attributes allowed on any supplied element below.
+    '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],
+    a: ['target', 'href', 'title', 'rel'],
+    area: [],
+    b: [],
+    br: [],
+    col: [],
+    code: [],
+    div: [],
+    em: [],
+    hr: [],
+    h1: [],
+    h2: [],
+    h3: [],
+    h4: [],
+    h5: [],
+    h6: [],
+    i: [],
+    img: ['src', 'alt', 'title', 'width', 'height'],
+    li: [],
+    ol: [],
+    p: [],
+    pre: [],
+    s: [],
+    small: [],
+    span: [],
+    sub: [],
+    sup: [],
+    strong: [],
+    u: [],
+    ul: []
+  }
+
+  /**
+   * A pattern that recognizes a commonly useful subset of URLs that are safe.
+   *
+   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+   */
+  var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi
+
+  /**
+   * A pattern that matches safe data URLs. Only matches image, video and audio types.
+   *
+   * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts
+   */
+  var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i
+
+  function allowedAttribute(attr, allowedAttributeList) {
+    var attrName = attr.nodeName.toLowerCase()
+
+    if ($.inArray(attrName, allowedAttributeList) !== -1) {
+      if ($.inArray(attrName, uriAttrs) !== -1) {
+        return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN))
+      }
+
+      return true
+    }
+
+    var regExp = $(allowedAttributeList).filter(function (index, value) {
+      return value instanceof RegExp
+    })
+
+    // Check if a regular expression validates the attribute.
+    for (var i = 0, l = regExp.length; i < l; i++) {
+      if (attrName.match(regExp[i])) {
+        return true
+      }
+    }
+
+    return false
+  }
+
+  function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) {
+    if (unsafeHtml.length === 0) {
+      return unsafeHtml
+    }
+
+    if (sanitizeFn && typeof sanitizeFn === 'function') {
+      return sanitizeFn(unsafeHtml)
+    }
+
+    // IE 8 and below don't support createHTMLDocument
+    if (!document.implementation || !document.implementation.createHTMLDocument) {
+      return unsafeHtml
+    }
+
+    var createdDocument = document.implementation.createHTMLDocument('sanitization')
+    createdDocument.body.innerHTML = unsafeHtml
+
+    var whitelistKeys = $.map(whiteList, function (el, i) { return i })
+    var elements = $(createdDocument.body).find('*')
+
+    for (var i = 0, len = elements.length; i < len; i++) {
+      var el = elements[i]
+      var elName = el.nodeName.toLowerCase()
+
+      if ($.inArray(elName, whitelistKeys) === -1) {
+        el.parentNode.removeChild(el)
+
+        continue
+      }
+
+      var attributeList = $.map(el.attributes, function (el) { return el })
+      var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || [])
+
+      for (var j = 0, len2 = attributeList.length; j < len2; j++) {
+        if (!allowedAttribute(attributeList[j], whitelistedAttributes)) {
+          el.removeAttribute(attributeList[j].nodeName)
+        }
+      }
+    }
+
+    return createdDocument.body.innerHTML
+  }
+
+  // TOOLTIP PUBLIC CLASS DEFINITION
+  // ===============================
+
+  var Tooltip = function (element, options) {
+    this.type       = null
+    this.options    = null
+    this.enabled    = null
+    this.timeout    = null
+    this.hoverState = null
+    this.$element   = null
+    this.inState    = null
+
+    this.init('tooltip', element, options)
+  }
+
+  Tooltip.VERSION  = '3.4.1'
+
+  Tooltip.TRANSITION_DURATION = 150
+
+  Tooltip.DEFAULTS = {
+    animation: true,
+    placement: 'top',
+    selector: false,
+    template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+    trigger: 'hover focus',
+    title: '',
+    delay: 0,
+    html: false,
+    container: false,
+    viewport: {
+      selector: 'body',
+      padding: 0
+    },
+    sanitize : true,
+    sanitizeFn : null,
+    whiteList : DefaultWhitelist
+  }
+
+  Tooltip.prototype.init = function (type, element, options) {
+    this.enabled   = true
+    this.type      = type
+    this.$element  = $(element)
+    this.options   = this.getOptions(options)
+    this.$viewport = this.options.viewport && $(document).find($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
+    this.inState   = { click: false, hover: false, focus: false }
+
+    if (this.$element[0] instanceof document.constructor && !this.options.selector) {
+      throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
+    }
+
+    var triggers = this.options.trigger.split(' ')
+
+    for (var i = triggers.length; i--;) {
+      var trigger = triggers[i]
+
+      if (trigger == 'click') {
+        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
+      } else if (trigger != 'manual') {
+        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'
+        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
+
+        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
+        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
+      }
+    }
+
+    this.options.selector ?
+      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+      this.fixTitle()
+  }
+
+  Tooltip.prototype.getDefaults = function () {
+    return Tooltip.DEFAULTS
+  }
+
+  Tooltip.prototype.getOptions = function (options) {
+    var dataAttributes = this.$element.data()
+
+    for (var dataAttr in dataAttributes) {
+      if (dataAttributes.hasOwnProperty(dataAttr) && $.inArray(dataAttr, DISALLOWED_ATTRIBUTES) !== -1) {
+        delete dataAttributes[dataAttr]
+      }
+    }
+
+    options = $.extend({}, this.getDefaults(), dataAttributes, options)
+
+    if (options.delay && typeof options.delay == 'number') {
+      options.delay = {
+        show: options.delay,
+        hide: options.delay
+      }
+    }
+
+    if (options.sanitize) {
+      options.template = sanitizeHtml(options.template, options.whiteList, options.sanitizeFn)
+    }
+
+    return options
+  }
+
+  Tooltip.prototype.getDelegateOptions = function () {
+    var options  = {}
+    var defaults = this.getDefaults()
+
+    this._options && $.each(this._options, function (key, value) {
+      if (defaults[key] != value) options[key] = value
+    })
+
+    return options
+  }
+
+  Tooltip.prototype.enter = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
+    }
+
+    if (self.tip().hasClass('in') || self.hoverState == 'in') {
+      self.hoverState = 'in'
+      return
+    }
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'in'
+
+    if (!self.options.delay || !self.options.delay.show) return self.show()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'in') self.show()
+    }, self.options.delay.show)
+  }
+
+  Tooltip.prototype.isInStateTrue = function () {
+    for (var key in this.inState) {
+      if (this.inState[key]) return true
+    }
+
+    return false
+  }
+
+  Tooltip.prototype.leave = function (obj) {
+    var self = obj instanceof this.constructor ?
+      obj : $(obj.currentTarget).data('bs.' + this.type)
+
+    if (!self) {
+      self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
+      $(obj.currentTarget).data('bs.' + this.type, self)
+    }
+
+    if (obj instanceof $.Event) {
+      self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
+    }
+
+    if (self.isInStateTrue()) return
+
+    clearTimeout(self.timeout)
+
+    self.hoverState = 'out'
+
+    if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+    self.timeout = setTimeout(function () {
+      if (self.hoverState == 'out') self.hide()
+    }, self.options.delay.hide)
+  }
+
+  Tooltip.prototype.show = function () {
+    var e = $.Event('show.bs.' + this.type)
+
+    if (this.hasContent() && this.enabled) {
+      this.$element.trigger(e)
+
+      var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
+      if (e.isDefaultPrevented() || !inDom) return
+      var that = this
+
+      var $tip = this.tip()
+
+      var tipId = this.getUID(this.type)
+
+      this.setContent()
+      $tip.attr('id', tipId)
+      this.$element.attr('aria-describedby', tipId)
+
+      if (this.options.animation) $tip.addClass('fade')
+
+      var placement = typeof this.options.placement == 'function' ?
+        this.options.placement.call(this, $tip[0], this.$element[0]) :
+        this.options.placement
+
+      var autoToken = /\s?auto?\s?/i
+      var autoPlace = autoToken.test(placement)
+      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+      $tip
+        .detach()
+        .css({ top: 0, left: 0, display: 'block' })
+        .addClass(placement)
+        .data('bs.' + this.type, this)
+
+      this.options.container ? $tip.appendTo($(document).find(this.options.container)) : $tip.insertAfter(this.$element)
+      this.$element.trigger('inserted.bs.' + this.type)
+
+      var pos          = this.getPosition()
+      var actualWidth  = $tip[0].offsetWidth
+      var actualHeight = $tip[0].offsetHeight
+
+      if (autoPlace) {
+        var orgPlacement = placement
+        var viewportDim = this.getPosition(this.$viewport)
+
+        placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top'    :
+                    placement == 'top'    && pos.top    - actualHeight < viewportDim.top    ? 'bottom' :
+                    placement == 'right'  && pos.right  + actualWidth  > viewportDim.width  ? 'left'   :
+                    placement == 'left'   && pos.left   - actualWidth  < viewportDim.left   ? 'right'  :
+                    placement
+
+        $tip
+          .removeClass(orgPlacement)
+          .addClass(placement)
+      }
+
+      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+      this.applyPlacement(calculatedOffset, placement)
+
+      var complete = function () {
+        var prevHoverState = that.hoverState
+        that.$element.trigger('shown.bs.' + that.type)
+        that.hoverState = null
+
+        if (prevHoverState == 'out') that.leave(that)
+      }
+
+      $.support.transition && this.$tip.hasClass('fade') ?
+        $tip
+          .one('bsTransitionEnd', complete)
+          .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+        complete()
+    }
+  }
+
+  Tooltip.prototype.applyPlacement = function (offset, placement) {
+    var $tip   = this.tip()
+    var width  = $tip[0].offsetWidth
+    var height = $tip[0].offsetHeight
+
+    // manually read margins because getBoundingClientRect includes difference
+    var marginTop = parseInt($tip.css('margin-top'), 10)
+    var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+    // we must check for NaN for ie 8/9
+    if (isNaN(marginTop))  marginTop  = 0
+    if (isNaN(marginLeft)) marginLeft = 0
+
+    offset.top  += marginTop
+    offset.left += marginLeft
+
+    // $.fn.offset doesn't round pixel values
+    // so we use setOffset directly with our own function B-0
+    $.offset.setOffset($tip[0], $.extend({
+      using: function (props) {
+        $tip.css({
+          top: Math.round(props.top),
+          left: Math.round(props.left)
+        })
+      }
+    }, offset), 0)
+
+    $tip.addClass('in')
+
+    // check to see if placing tip in new offset caused the tip to resize itself
+    var actualWidth  = $tip[0].offsetWidth
+    var actualHeight = $tip[0].offsetHeight
+
+    if (placement == 'top' && actualHeight != height) {
+      offset.top = offset.top + height - actualHeight
+    }
+
+    var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
+
+    if (delta.left) offset.left += delta.left
+    else offset.top += delta.top
+
+    var isVertical          = /top|bottom/.test(placement)
+    var arrowDelta          = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
+    var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
+
+    $tip.offset(offset)
+    this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
+  }
+
+  Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
+    this.arrow()
+      .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
+      .css(isVertical ? 'top' : 'left', '')
+  }
+
+  Tooltip.prototype.setContent = function () {
+    var $tip  = this.tip()
+    var title = this.getTitle()
+
+    if (this.options.html) {
+      if (this.options.sanitize) {
+        title = sanitizeHtml(title, this.options.whiteList, this.options.sanitizeFn)
+      }
+
+      $tip.find('.tooltip-inner').html(title)
+    } else {
+      $tip.find('.tooltip-inner').text(title)
+    }
+
+    $tip.removeClass('fade in top bottom left right')
+  }
+
+  Tooltip.prototype.hide = function (callback) {
+    var that = this
+    var $tip = $(this.$tip)
+    var e    = $.Event('hide.bs.' + this.type)
+
+    function complete() {
+      if (that.hoverState != 'in') $tip.detach()
+      if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary.
+        that.$element
+          .removeAttr('aria-describedby')
+          .trigger('hidden.bs.' + that.type)
+      }
+      callback && callback()
+    }
+
+    this.$element.trigger(e)
+
+    if (e.isDefaultPrevented()) return
+
+    $tip.removeClass('in')
+
+    $.support.transition && $tip.hasClass('fade') ?
+      $tip
+        .one('bsTransitionEnd', complete)
+        .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
+      complete()
+
+    this.hoverState = null
+
+    return this
+  }
+
+  Tooltip.prototype.fixTitle = function () {
+    var $e = this.$element
+    if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
+      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
+    }
+  }
+
+  Tooltip.prototype.hasContent = function () {
+    return this.getTitle()
+  }
+
+  Tooltip.prototype.getPosition = function ($element) {
+    $element   = $element || this.$element
+
+    var el     = $element[0]
+    var isBody = el.tagName == 'BODY'
+
+    var elRect    = el.getBoundingClientRect()
+    if (elRect.width == null) {
+      // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
+      elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
+    }
+    var isSvg = window.SVGElement && el instanceof window.SVGElement
+    // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3.
+    // See https://github.com/twbs/bootstrap/issues/20280
+    var elOffset  = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset())
+    var scroll    = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
+    var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
+
+    return $.extend({}, elRect, scroll, outerDims, elOffset)
+  }
+
+  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
+    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
+           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
+        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
+
+  }
+
+  Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
+    var delta = { top: 0, left: 0 }
+    if (!this.$viewport) return delta
+
+    var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
+    var viewportDimensions = this.getPosition(this.$viewport)
+
+    if (/right|left/.test(placement)) {
+      var topEdgeOffset    = pos.top - viewportPadding - viewportDimensions.scroll
+      var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
+      if (topEdgeOffset < viewportDimensions.top) { // top overflow
+        delta.top = viewportDimensions.top - topEdgeOffset
+      } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
+        delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
+      }
+    } else {
+      var leftEdgeOffset  = pos.left - viewportPadding
+      var rightEdgeOffset = pos.left + viewportPadding + actualWidth
+      if (leftEdgeOffset < viewportDimensions.left) { // left overflow
+        delta.left = viewportDimensions.left - leftEdgeOffset
+      } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
+        delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
+      }
+    }
+
+    return delta
+  }
+
+  Tooltip.prototype.getTitle = function () {
+    var title
+    var $e = this.$element
+    var o  = this.options
+
+    title = $e.attr('data-original-title')
+      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)
+
+    return title
+  }
+
+  Tooltip.prototype.getUID = function (prefix) {
+    do prefix += ~~(Math.random() * 1000000)
+    while (document.getElementById(prefix))
+    return prefix
+  }
+
+  Tooltip.prototype.tip = function () {
+    if (!this.$tip) {
+      this.$tip = $(this.options.template)
+      if (this.$tip.length != 1) {
+        throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
+      }
+    }
+    return this.$tip
+  }
+
+  Tooltip.prototype.arrow = function () {
+    return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
+  }
+
+  Tooltip.prototype.enable = function () {
+    this.enabled = true
+  }
+
+  Tooltip.prototype.disable = function () {
+    this.enabled = false
+  }
+
+  Tooltip.prototype.toggleEnabled = function () {
+    this.enabled = !this.enabled
+  }
+
+  Tooltip.prototype.toggle = function (e) {
+    var self = this
+    if (e) {
+      self = $(e.currentTarget).data('bs.' + this.type)
+      if (!self) {
+        self = new this.constructor(e.currentTarget, this.getDelegateOptions())
+        $(e.currentTarget).data('bs.' + this.type, self)
+      }
+    }
+
+    if (e) {
+      self.inState.click = !self.inState.click
+      if (self.isInStateTrue()) self.enter(self)
+      else self.leave(self)
+    } else {
+      self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+    }
+  }
+
+  Tooltip.prototype.destroy = function () {
+    var that = this
+    clearTimeout(this.timeout)
+    this.hide(function () {
+      that.$element.off('.' + that.type).removeData('bs.' + that.type)
+      if (that.$tip) {
+        that.$tip.detach()
+      }
+      that.$tip = null
+      that.$arrow = null
+      that.$viewport = null
+      that.$element = null
+    })
+  }
+
+  Tooltip.prototype.sanitizeHtml = function (unsafeHtml) {
+    return sanitizeHtml(unsafeHtml, this.options.whiteList, this.options.sanitizeFn)
+  }
+
+  // TOOLTIP PLUGIN DEFINITION
+  // =========================
+
+  function Plugin(option) {
+    return this.each(function () {
+      var $this   = $(this)
+      var data    = $this.data('bs.tooltip')
+      var options = typeof option == 'object' && option
+
+      if (!data && /destroy|hide/.test(option)) return
+      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+      if (typeof option == 'string') data[option]()
+    })
+  }
+
+  var old = $.fn.tooltip
+
+  $.fn.tooltip             = Plugin
+  $.fn.tooltip.Constructor = Tooltip
+
+
+  // TOOLTIP NO CONFLICT
+  // ===================
+
+  $.fn.tooltip.noConflict = function () {
+    $.fn.tooltip = old
+    return this
+  }
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/transition.js b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/transition.js
new file mode 100644
index 0000000000000000000000000000000000000000..5a9a3e30f760e5265f2b7023c56e19a90fa0042a
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/javascripts/bootstrap/transition.js
@@ -0,0 +1,59 @@
+/* ========================================================================
+ * Bootstrap: transition.js v3.4.1
+ * https://getbootstrap.com/docs/3.4/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+  'use strict';
+
+  // CSS TRANSITION SUPPORT (Shoutout: https://modernizr.com/)
+  // ============================================================
+
+  function transitionEnd() {
+    var el = document.createElement('bootstrap')
+
+    var transEndEventNames = {
+      WebkitTransition : 'webkitTransitionEnd',
+      MozTransition    : 'transitionend',
+      OTransition      : 'oTransitionEnd otransitionend',
+      transition       : 'transitionend'
+    }
+
+    for (var name in transEndEventNames) {
+      if (el.style[name] !== undefined) {
+        return { end: transEndEventNames[name] }
+      }
+    }
+
+    return false // explicit for ie8 (  ._.)
+  }
+
+  // https://blog.alexmaccaw.com/css-transitions
+  $.fn.emulateTransitionEnd = function (duration) {
+    var called = false
+    var $el = this
+    $(this).one('bsTransitionEnd', function () { called = true })
+    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+    setTimeout(callback, duration)
+    return this
+  }
+
+  $(function () {
+    $.support.transition = transitionEnd()
+
+    if (!$.support.transition) return
+
+    $.event.special.bsTransitionEnd = {
+      bindType: $.support.transition.end,
+      delegateType: $.support.transition.end,
+      handle: function (e) {
+        if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
+      }
+    }
+  })
+
+}(jQuery);
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap-compass.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap-compass.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8fbc3cda5e3d58d102ab2661543e0769fd21ba5b
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap-compass.scss
@@ -0,0 +1,9 @@
+@function twbs-font-path($path) {
+  @return font-url($path, true);
+}
+
+@function twbs-image-path($path) {
+  @return image-url($path, true);
+}
+
+$bootstrap-sass-asset-helper: true;
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap-mincer.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap-mincer.scss
new file mode 100644
index 0000000000000000000000000000000000000000..0c4655e32d2f6ee2ff8e2b3a20ec0e603e8bf057
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap-mincer.scss
@@ -0,0 +1,19 @@
+// Mincer asset helper functions
+//
+// This must be imported into a .css.ejs.scss file.
+// Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation.
+
+
+@function twbs-font-path($path) {
+  // do something like following
+  // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>"
+  // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>"
+  // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>"
+  @return "<%- asset_path("#{$path}".replace(/[#?].*$/, '')) + "#{$path}".replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>";
+}
+
+@function twbs-image-path($file) {
+  @return "<%- asset_path("#{$file}") %>";
+}
+
+$bootstrap-sass-asset-helper: true;
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap-sprockets.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap-sprockets.scss
new file mode 100644
index 0000000000000000000000000000000000000000..9fffc1eb4b1b9aac66c9329cd6691c33483313c5
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap-sprockets.scss
@@ -0,0 +1,9 @@
+@function twbs-font-path($path) {
+  @return font-path($path);
+}
+
+@function twbs-image-path($path) {
+  @return image-path($path);
+}
+
+$bootstrap-sass-asset-helper: true;
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap.scss
new file mode 100644
index 0000000000000000000000000000000000000000..89e3855109560359ffcebc9778fa351039bddc2f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/_bootstrap.scss
@@ -0,0 +1,56 @@
+/*!
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+// Core variables and mixins
+@import "bootstrap/variables";
+@import "bootstrap/mixins";
+
+// Reset and dependencies
+@import "bootstrap/normalize";
+@import "bootstrap/print";
+@import "bootstrap/glyphicons";
+
+// Core CSS
+@import "bootstrap/scaffolding";
+@import "bootstrap/type";
+@import "bootstrap/code";
+@import "bootstrap/grid";
+@import "bootstrap/tables";
+@import "bootstrap/forms";
+@import "bootstrap/buttons";
+
+// Components
+@import "bootstrap/component-animations";
+@import "bootstrap/dropdowns";
+@import "bootstrap/button-groups";
+@import "bootstrap/input-groups";
+@import "bootstrap/navs";
+@import "bootstrap/navbar";
+@import "bootstrap/breadcrumbs";
+@import "bootstrap/pagination";
+@import "bootstrap/pager";
+@import "bootstrap/labels";
+@import "bootstrap/badges";
+@import "bootstrap/jumbotron";
+@import "bootstrap/thumbnails";
+@import "bootstrap/alerts";
+@import "bootstrap/progress-bars";
+@import "bootstrap/media";
+@import "bootstrap/list-group";
+@import "bootstrap/panels";
+@import "bootstrap/responsive-embed";
+@import "bootstrap/wells";
+@import "bootstrap/close";
+
+// Components w/ JavaScript
+@import "bootstrap/modals";
+@import "bootstrap/tooltip";
+@import "bootstrap/popovers";
+@import "bootstrap/carousel";
+
+// Utility classes
+@import "bootstrap/utilities";
+@import "bootstrap/responsive-utilities";
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_alerts.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_alerts.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f9e69bd08403dc11220fc79093c7a998dae5f8c4
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_alerts.scss
@@ -0,0 +1,73 @@
+//
+// Alerts
+// --------------------------------------------------
+
+
+// Base styles
+// -------------------------
+
+.alert {
+  padding: $alert-padding;
+  margin-bottom: $line-height-computed;
+  border: 1px solid transparent;
+  border-radius: $alert-border-radius;
+
+  // Headings for larger alerts
+  h4 {
+    margin-top: 0;
+    color: inherit; // Specified for the h4 to prevent conflicts of changing $headings-color
+  }
+
+  // Provide class for links that match alerts
+  .alert-link {
+    font-weight: $alert-link-font-weight;
+  }
+
+  // Improve alignment and spacing of inner content
+  > p,
+  > ul {
+    margin-bottom: 0;
+  }
+
+  > p + p {
+    margin-top: 5px;
+  }
+}
+
+// Dismissible alerts
+//
+// Expand the right padding and account for the close button's positioning.
+
+// The misspelled .alert-dismissable was deprecated in 3.2.0.
+.alert-dismissable,
+.alert-dismissible {
+  padding-right: ($alert-padding + 20);
+
+  // Adjust close link position
+  .close {
+    position: relative;
+    top: -2px;
+    right: -21px;
+    color: inherit;
+  }
+}
+
+// Alternate styles
+//
+// Generate contextual modifier classes for colorizing the alert.
+
+.alert-success {
+  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
+}
+
+.alert-info {
+  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
+}
+
+.alert-warning {
+  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
+}
+
+.alert-danger {
+  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_badges.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_badges.scss
new file mode 100644
index 0000000000000000000000000000000000000000..44d5dd6f4ba4a28c3b246f9dc0c31d439b453e34
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_badges.scss
@@ -0,0 +1,68 @@
+//
+// Badges
+// --------------------------------------------------
+
+
+// Base class
+.badge {
+  display: inline-block;
+  min-width: 10px;
+  padding: 3px 7px;
+  font-size: $font-size-small;
+  font-weight: $badge-font-weight;
+  line-height: $badge-line-height;
+  color: $badge-color;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  background-color: $badge-bg;
+  border-radius: $badge-border-radius;
+
+  // Empty badges collapse automatically (not available in IE8)
+  &:empty {
+    display: none;
+  }
+
+  // Quick fix for badges in buttons
+  .btn & {
+    position: relative;
+    top: -1px;
+  }
+
+  .btn-xs &,
+  .btn-group-xs > .btn & {
+    top: 0;
+    padding: 1px 5px;
+  }
+
+  // [converter] extracted a& to a.badge
+
+  // Account for badges in navs
+  .list-group-item.active > &,
+  .nav-pills > .active > a > & {
+    color: $badge-active-color;
+    background-color: $badge-active-bg;
+  }
+
+  .list-group-item > & {
+    float: right;
+  }
+
+  .list-group-item > & + & {
+    margin-right: 5px;
+  }
+
+  .nav-pills > li > a > & {
+    margin-left: 3px;
+  }
+}
+
+// Hover state, but only for links
+a.badge {
+  &:hover,
+  &:focus {
+    color: $badge-link-hover-color;
+    text-decoration: none;
+    cursor: pointer;
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_breadcrumbs.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_breadcrumbs.scss
new file mode 100644
index 0000000000000000000000000000000000000000..67e39d909acf0e626f764d47daed150f66ffa42c
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_breadcrumbs.scss
@@ -0,0 +1,28 @@
+//
+// Breadcrumbs
+// --------------------------------------------------
+
+
+.breadcrumb {
+  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
+  margin-bottom: $line-height-computed;
+  list-style: none;
+  background-color: $breadcrumb-bg;
+  border-radius: $border-radius-base;
+
+  > li {
+    display: inline-block;
+
+    + li:before {
+      padding: 0 5px;
+      color: $breadcrumb-color;
+      // [converter] Workaround for https://github.com/sass/libsass/issues/1115
+      $nbsp: "\00a0";
+      content: "#{$breadcrumb-separator}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space
+    }
+  }
+
+  > .active {
+    color: $breadcrumb-active-color;
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_button-groups.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_button-groups.scss
new file mode 100644
index 0000000000000000000000000000000000000000..6a62faf5dfdeb41b249a6cdbc57d2225ea4446f6
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_button-groups.scss
@@ -0,0 +1,244 @@
+//
+// Button groups
+// --------------------------------------------------
+
+// Make the div behave like a button
+.btn-group,
+.btn-group-vertical {
+  position: relative;
+  display: inline-block;
+  vertical-align: middle; // match .btn alignment given font-size hack above
+  > .btn {
+    position: relative;
+    float: left;
+    // Bring the "active" button to the front
+    &:hover,
+    &:focus,
+    &:active,
+    &.active {
+      z-index: 2;
+    }
+  }
+}
+
+// Prevent double borders when buttons are next to each other
+.btn-group {
+  .btn + .btn,
+  .btn + .btn-group,
+  .btn-group + .btn,
+  .btn-group + .btn-group {
+    margin-left: -1px;
+  }
+}
+
+// Optional: Group multiple button groups together for a toolbar
+.btn-toolbar {
+  margin-left: -5px; // Offset the first child's margin
+  @include clearfix;
+
+  .btn,
+  .btn-group,
+  .input-group {
+    float: left;
+  }
+  > .btn,
+  > .btn-group,
+  > .input-group {
+    margin-left: 5px;
+  }
+}
+
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
+  border-radius: 0;
+}
+
+// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
+.btn-group > .btn:first-child {
+  margin-left: 0;
+  &:not(:last-child):not(.dropdown-toggle) {
+    @include border-right-radius(0);
+  }
+}
+// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it
+.btn-group > .btn:last-child:not(:first-child),
+.btn-group > .dropdown-toggle:not(:first-child) {
+  @include border-left-radius(0);
+}
+
+// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
+.btn-group > .btn-group {
+  float: left;
+}
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group > .btn-group:first-child:not(:last-child) {
+  > .btn:last-child,
+  > .dropdown-toggle {
+    @include border-right-radius(0);
+  }
+}
+.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  @include border-left-radius(0);
+}
+
+// On active and open, don't show outline
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+  outline: 0;
+}
+
+
+// Sizing
+//
+// Remix the default button sizing classes into new ones for easier manipulation.
+
+.btn-group-xs > .btn { @extend .btn-xs; }
+.btn-group-sm > .btn { @extend .btn-sm; }
+.btn-group-lg > .btn { @extend .btn-lg; }
+
+
+// Split button dropdowns
+// ----------------------
+
+// Give the line between buttons some depth
+.btn-group > .btn + .dropdown-toggle {
+  padding-right: 8px;
+  padding-left: 8px;
+}
+.btn-group > .btn-lg + .dropdown-toggle {
+  padding-right: 12px;
+  padding-left: 12px;
+}
+
+// The clickable button for toggling the menu
+// Remove the gradient and set the same inset shadow as the :active state
+.btn-group.open .dropdown-toggle {
+  @include box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));
+
+  // Show no shadow for `.btn-link` since it has no other button styles.
+  &.btn-link {
+    @include box-shadow(none);
+  }
+}
+
+
+// Reposition the caret
+.btn .caret {
+  margin-left: 0;
+}
+// Carets in other button sizes
+.btn-lg .caret {
+  border-width: $caret-width-large $caret-width-large 0;
+  border-bottom-width: 0;
+}
+// Upside down carets for .dropup
+.dropup .btn-lg .caret {
+  border-width: 0 $caret-width-large $caret-width-large;
+}
+
+
+// Vertical button groups
+// ----------------------
+
+.btn-group-vertical {
+  > .btn,
+  > .btn-group,
+  > .btn-group > .btn {
+    display: block;
+    float: none;
+    width: 100%;
+    max-width: 100%;
+  }
+
+  // Clear floats so dropdown menus can be properly placed
+  > .btn-group {
+    @include clearfix;
+    > .btn {
+      float: none;
+    }
+  }
+
+  > .btn + .btn,
+  > .btn + .btn-group,
+  > .btn-group + .btn,
+  > .btn-group + .btn-group {
+    margin-top: -1px;
+    margin-left: 0;
+  }
+}
+
+.btn-group-vertical > .btn {
+  &:not(:first-child):not(:last-child) {
+    border-radius: 0;
+  }
+  &:first-child:not(:last-child) {
+    @include border-top-radius($btn-border-radius-base);
+    @include border-bottom-radius(0);
+  }
+  &:last-child:not(:first-child) {
+    @include border-top-radius(0);
+    @include border-bottom-radius($btn-border-radius-base);
+  }
+}
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
+  border-radius: 0;
+}
+.btn-group-vertical > .btn-group:first-child:not(:last-child) {
+  > .btn:last-child,
+  > .dropdown-toggle {
+    @include border-bottom-radius(0);
+  }
+}
+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
+  @include border-top-radius(0);
+}
+
+
+// Justified button groups
+// ----------------------
+
+.btn-group-justified {
+  display: table;
+  width: 100%;
+  table-layout: fixed;
+  border-collapse: separate;
+  > .btn,
+  > .btn-group {
+    display: table-cell;
+    float: none;
+    width: 1%;
+  }
+  > .btn-group .btn {
+    width: 100%;
+  }
+
+  > .btn-group .dropdown-menu {
+    left: auto;
+  }
+}
+
+
+// Checkbox and radio options
+//
+// In order to support the browser's form validation feedback, powered by the
+// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
+// `display: none;` or `visibility: hidden;` as that also hides the popover.
+// Simply visually hiding the inputs via `opacity` would leave them clickable in
+// certain cases which is prevented by using `clip` and `pointer-events`.
+// This way, we ensure a DOM element is visible to position the popover from.
+//
+// See https://github.com/twbs/bootstrap/pull/12794 and
+// https://github.com/twbs/bootstrap/pull/14559 for more information.
+
+[data-toggle="buttons"] {
+  > .btn,
+  > .btn-group > .btn {
+    input[type="radio"],
+    input[type="checkbox"] {
+      position: absolute;
+      clip: rect(0, 0, 0, 0);
+      pointer-events: none;
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_buttons.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_buttons.scss
new file mode 100644
index 0000000000000000000000000000000000000000..62962d786aebb2a64b6839e2073f151a30ddaffd
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_buttons.scss
@@ -0,0 +1,168 @@
+//
+// Buttons
+// --------------------------------------------------
+
+
+// Base styles
+// --------------------------------------------------
+
+.btn {
+  display: inline-block;
+  margin-bottom: 0; // For input.btn
+  font-weight: $btn-font-weight;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: middle;
+  touch-action: manipulation;
+  cursor: pointer;
+  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+  border: 1px solid transparent;
+  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);
+  @include user-select(none);
+
+  &,
+  &:active,
+  &.active {
+    &:focus,
+    &.focus {
+      @include tab-focus;
+    }
+  }
+
+  &:hover,
+  &:focus,
+  &.focus {
+    color: $btn-default-color;
+    text-decoration: none;
+  }
+
+  &:active,
+  &.active {
+    background-image: none;
+    outline: 0;
+    @include box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));
+  }
+
+  &.disabled,
+  &[disabled],
+  fieldset[disabled] & {
+    cursor: $cursor-disabled;
+    @include opacity(.65);
+    @include box-shadow(none);
+  }
+
+  // [converter] extracted a& to a.btn
+}
+
+a.btn {
+  &.disabled,
+  fieldset[disabled] & {
+    pointer-events: none; // Future-proof disabling of clicks on `<a>` elements
+  }
+}
+
+
+// Alternate buttons
+// --------------------------------------------------
+
+.btn-default {
+  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);
+}
+.btn-primary {
+  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
+}
+// Success appears as green
+.btn-success {
+  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
+}
+// Info appears as blue-green
+.btn-info {
+  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
+}
+// Warning appears as orange
+.btn-warning {
+  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
+}
+// Danger and error appear as red
+.btn-danger {
+  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
+}
+
+
+// Link buttons
+// -------------------------
+
+// Make a button look and behave like a link
+.btn-link {
+  font-weight: 400;
+  color: $link-color;
+  border-radius: 0;
+
+  &,
+  &:active,
+  &.active,
+  &[disabled],
+  fieldset[disabled] & {
+    background-color: transparent;
+    @include box-shadow(none);
+  }
+  &,
+  &:hover,
+  &:focus,
+  &:active {
+    border-color: transparent;
+  }
+  &:hover,
+  &:focus {
+    color: $link-hover-color;
+    text-decoration: $link-hover-decoration;
+    background-color: transparent;
+  }
+  &[disabled],
+  fieldset[disabled] & {
+    &:hover,
+    &:focus {
+      color: $btn-link-disabled-color;
+      text-decoration: none;
+    }
+  }
+}
+
+
+// Button Sizes
+// --------------------------------------------------
+
+.btn-lg {
+  // line-height: ensure even-numbered height of button next to large input
+  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);
+}
+.btn-sm {
+  // line-height: ensure proper height of button next to small input
+  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
+}
+.btn-xs {
+  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
+}
+
+
+// Block button
+// --------------------------------------------------
+
+.btn-block {
+  display: block;
+  width: 100%;
+}
+
+// Vertically space out multiple block buttons
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+// Specificity overrides
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+  &.btn-block {
+    width: 100%;
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_carousel.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_carousel.scss
new file mode 100644
index 0000000000000000000000000000000000000000..52a1f7bff0d1a1f3974401dd27e75ff111b11430
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_carousel.scss
@@ -0,0 +1,271 @@
+//
+// Carousel
+// --------------------------------------------------
+
+
+// Wrapper for the slide container and indicators
+.carousel {
+  position: relative;
+}
+
+.carousel-inner {
+  position: relative;
+  width: 100%;
+  overflow: hidden;
+
+  > .item {
+    position: relative;
+    display: none;
+    @include transition(.6s ease-in-out left);
+
+    // Account for jankitude on images
+    > img,
+    > a > img {
+      @include img-responsive;
+      line-height: 1;
+    }
+
+    // WebKit CSS3 transforms for supported devices
+    @media all and (transform-3d), (-webkit-transform-3d) {
+      @include transition-transform(0.6s ease-in-out);
+      @include backface-visibility(hidden);
+      @include perspective(1000px);
+
+      &.next,
+      &.active.right {
+        @include translate3d(100%, 0, 0);
+        left: 0;
+      }
+      &.prev,
+      &.active.left {
+        @include translate3d(-100%, 0, 0);
+        left: 0;
+      }
+      &.next.left,
+      &.prev.right,
+      &.active {
+        @include translate3d(0, 0, 0);
+        left: 0;
+      }
+    }
+  }
+
+  > .active,
+  > .next,
+  > .prev {
+    display: block;
+  }
+
+  > .active {
+    left: 0;
+  }
+
+  > .next,
+  > .prev {
+    position: absolute;
+    top: 0;
+    width: 100%;
+  }
+
+  > .next {
+    left: 100%;
+  }
+  > .prev {
+    left: -100%;
+  }
+  > .next.left,
+  > .prev.right {
+    left: 0;
+  }
+
+  > .active.left {
+    left: -100%;
+  }
+  > .active.right {
+    left: 100%;
+  }
+
+}
+
+// Left/right controls for nav
+// ---------------------------
+
+.carousel-control {
+  position: absolute;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  width: $carousel-control-width;
+  font-size: $carousel-control-font-size;
+  color: $carousel-control-color;
+  text-align: center;
+  text-shadow: $carousel-text-shadow;
+  background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug
+  @include opacity($carousel-control-opacity);
+  // We can't have this transition here because WebKit cancels the carousel
+  // animation if you trip this while in the middle of another animation.
+
+  // Set gradients for backgrounds
+  &.left {
+    @include gradient-horizontal($start-color: rgba(0, 0, 0, .5), $end-color: rgba(0, 0, 0, .0001));
+  }
+  &.right {
+    right: 0;
+    left: auto;
+    @include gradient-horizontal($start-color: rgba(0, 0, 0, .0001), $end-color: rgba(0, 0, 0, .5));
+  }
+
+  // Hover/focus state
+  &:hover,
+  &:focus {
+    color: $carousel-control-color;
+    text-decoration: none;
+    outline: 0;
+    @include opacity(.9);
+  }
+
+  // Toggles
+  .icon-prev,
+  .icon-next,
+  .glyphicon-chevron-left,
+  .glyphicon-chevron-right {
+    position: absolute;
+    top: 50%;
+    z-index: 5;
+    display: inline-block;
+    margin-top: -10px;
+  }
+  .icon-prev,
+  .glyphicon-chevron-left {
+    left: 50%;
+    margin-left: -10px;
+  }
+  .icon-next,
+  .glyphicon-chevron-right {
+    right: 50%;
+    margin-right: -10px;
+  }
+  .icon-prev,
+  .icon-next {
+    width: 20px;
+    height: 20px;
+    font-family: serif;
+    line-height: 1;
+  }
+
+  .icon-prev {
+    &:before {
+      content: "\2039";// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
+    }
+  }
+  .icon-next {
+    &:before {
+      content: "\203a";// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
+    }
+  }
+}
+
+// Optional indicator pips
+//
+// Add an unordered list with the following class and add a list item for each
+// slide your carousel holds.
+
+.carousel-indicators {
+  position: absolute;
+  bottom: 10px;
+  left: 50%;
+  z-index: 15;
+  width: 60%;
+  padding-left: 0;
+  margin-left: -30%;
+  text-align: center;
+  list-style: none;
+
+  li {
+    display: inline-block;
+    width: 10px;
+    height: 10px;
+    margin: 1px;
+    text-indent: -999px;
+    cursor: pointer;
+    // IE8-9 hack for event handling
+    //
+    // Internet Explorer 8-9 does not support clicks on elements without a set
+    // `background-color`. We cannot use `filter` since that's not viewed as a
+    // background color by the browser. Thus, a hack is needed.
+    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
+    //
+    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
+    // set alpha transparency for the best results possible.
+    background-color: #000 \9; // IE8
+    background-color: rgba(0, 0, 0, 0); // IE9
+
+    border: 1px solid $carousel-indicator-border-color;
+    border-radius: 10px;
+  }
+
+  .active {
+    width: 12px;
+    height: 12px;
+    margin: 0;
+    background-color: $carousel-indicator-active-bg;
+  }
+}
+
+// Optional captions
+// -----------------------------
+// Hidden by default for smaller viewports
+.carousel-caption {
+  position: absolute;
+  right: 15%;
+  bottom: 20px;
+  left: 15%;
+  z-index: 10;
+  padding-top: 20px;
+  padding-bottom: 20px;
+  color: $carousel-caption-color;
+  text-align: center;
+  text-shadow: $carousel-text-shadow;
+
+  & .btn {
+    text-shadow: none; // No shadow for button elements in carousel-caption
+  }
+}
+
+
+// Scale up controls for tablets and up
+@media screen and (min-width: $screen-sm-min) {
+
+  // Scale up the controls a smidge
+  .carousel-control {
+    .glyphicon-chevron-left,
+    .glyphicon-chevron-right,
+    .icon-prev,
+    .icon-next {
+      width: ($carousel-control-font-size * 1.5);
+      height: ($carousel-control-font-size * 1.5);
+      margin-top: ($carousel-control-font-size / -2);
+      font-size: ($carousel-control-font-size * 1.5);
+    }
+    .glyphicon-chevron-left,
+    .icon-prev {
+      margin-left: ($carousel-control-font-size / -2);
+    }
+    .glyphicon-chevron-right,
+    .icon-next {
+      margin-right: ($carousel-control-font-size / -2);
+    }
+  }
+
+  // Show and left align the captions
+  .carousel-caption {
+    right: 20%;
+    left: 20%;
+    padding-bottom: 30px;
+  }
+
+  // Move up the indicators
+  .carousel-indicators {
+    bottom: 20px;
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_close.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_close.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a858a8f367b56dc2845bcfa382434a4812365b05
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_close.scss
@@ -0,0 +1,37 @@
+//
+// Close icons
+// --------------------------------------------------
+
+
+.close {
+  float: right;
+  font-size: ($font-size-base * 1.5);
+  font-weight: $close-font-weight;
+  line-height: 1;
+  color: $close-color;
+  text-shadow: $close-text-shadow;
+  @include opacity(.2);
+
+  &:hover,
+  &:focus {
+    color: $close-color;
+    text-decoration: none;
+    cursor: pointer;
+    @include opacity(.5);
+  }
+
+  // [converter] extracted button& to button.close
+}
+
+// Additional properties for button version
+// iOS requires the button element instead of an anchor tag.
+// If you want the anchor version, it requires `href="#"`.
+// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
+button.close {
+  padding: 0;
+  cursor: pointer;
+  background: transparent;
+  border: 0;
+  -webkit-appearance: none;
+  appearance: none;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_code.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_code.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8e2b2a7f433dac43d07ae1f02c302fcd34a48a2f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_code.scss
@@ -0,0 +1,69 @@
+//
+// Code (inline and block)
+// --------------------------------------------------
+
+
+// Inline and block code styles
+code,
+kbd,
+pre,
+samp {
+  font-family: $font-family-monospace;
+}
+
+// Inline code
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: $code-color;
+  background-color: $code-bg;
+  border-radius: $border-radius-base;
+}
+
+// User input typically entered via keyboard
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: $kbd-color;
+  background-color: $kbd-bg;
+  border-radius: $border-radius-small;
+  box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+
+  kbd {
+    padding: 0;
+    font-size: 100%;
+    font-weight: 700;
+    box-shadow: none;
+  }
+}
+
+// Blocks of code
+pre {
+  display: block;
+  padding: (($line-height-computed - 1) / 2);
+  margin: 0 0 ($line-height-computed / 2);
+  font-size: ($font-size-base - 1); // 14px to 13px
+  line-height: $line-height-base;
+  color: $pre-color;
+  word-break: break-all;
+  word-wrap: break-word;
+  background-color: $pre-bg;
+  border: 1px solid $pre-border-color;
+  border-radius: $border-radius-base;
+
+  // Account for some code outputs that place code tags in pre tags
+  code {
+    padding: 0;
+    font-size: inherit;
+    color: inherit;
+    white-space: pre-wrap;
+    background-color: transparent;
+    border-radius: 0;
+  }
+}
+
+// Enable scrollable blocks of code
+.pre-scrollable {
+  max-height: $pre-scrollable-max-height;
+  overflow-y: scroll;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_component-animations.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_component-animations.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ca4d6b06822c95a3d1c1343c1270aa142be0f64f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_component-animations.scss
@@ -0,0 +1,38 @@
+//
+// Component animations
+// --------------------------------------------------
+
+// Heads up!
+//
+// We don't use the `.opacity()` mixin here since it causes a bug with text
+// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
+
+.fade {
+  opacity: 0;
+  @include transition(opacity .15s linear);
+
+  &.in {
+    opacity: 1;
+  }
+}
+
+.collapse {
+  display: none;
+
+  &.in      { display: block; }
+  // [converter] extracted tr&.in to tr.collapse.in
+  // [converter] extracted tbody&.in to tbody.collapse.in
+}
+
+tr.collapse.in    { display: table-row; }
+
+tbody.collapse.in { display: table-row-group; }
+
+.collapsing {
+  position: relative;
+  height: 0;
+  overflow: hidden;
+  @include transition-property(height, visibility);
+  @include transition-duration(.35s);
+  @include transition-timing-function(ease);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_dropdowns.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_dropdowns.scss
new file mode 100644
index 0000000000000000000000000000000000000000..0a5898a8d02ccb848a218bebff6d9fbac63c3aaa
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_dropdowns.scss
@@ -0,0 +1,213 @@
+//
+// Dropdown menus
+// --------------------------------------------------
+
+
+// Dropdown arrow/caret
+.caret {
+  display: inline-block;
+  width: 0;
+  height: 0;
+  margin-left: 2px;
+  vertical-align: middle;
+  border-top: $caret-width-base dashed;
+  border-top: $caret-width-base solid \9; // IE8
+  border-right: $caret-width-base solid transparent;
+  border-left: $caret-width-base solid transparent;
+}
+
+// The dropdown wrapper (div)
+.dropup,
+.dropdown {
+  position: relative;
+}
+
+// Prevent the focus on the dropdown toggle when closing dropdowns
+.dropdown-toggle:focus {
+  outline: 0;
+}
+
+// The dropdown menu (ul)
+.dropdown-menu {
+  position: absolute;
+  top: 100%;
+  left: 0;
+  z-index: $zindex-dropdown;
+  display: none; // none by default, but block on "open" of the menu
+  float: left;
+  min-width: 160px;
+  padding: 5px 0;
+  margin: 2px 0 0; // override default ul
+  font-size: $font-size-base;
+  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
+  list-style: none;
+  background-color: $dropdown-bg;
+  background-clip: padding-box;
+  border: 1px solid $dropdown-fallback-border; // IE8 fallback
+  border: 1px solid $dropdown-border;
+  border-radius: $border-radius-base;
+  @include box-shadow(0 6px 12px rgba(0, 0, 0, .175));
+
+  // Aligns the dropdown menu to right
+  //
+  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
+  &.pull-right {
+    right: 0;
+    left: auto;
+  }
+
+  // Dividers (basically an hr) within the dropdown
+  .divider {
+    @include nav-divider($dropdown-divider-bg);
+  }
+
+  // Links within the dropdown menu
+  > li > a {
+    display: block;
+    padding: 3px 20px;
+    clear: both;
+    font-weight: 400;
+    line-height: $line-height-base;
+    color: $dropdown-link-color;
+    white-space: nowrap; // prevent links from randomly breaking onto new lines
+
+    &:hover,
+    &:focus {
+      color: $dropdown-link-hover-color;
+      text-decoration: none;
+      background-color: $dropdown-link-hover-bg;
+    }
+  }
+}
+
+// Active state
+.dropdown-menu > .active > a {
+  &,
+  &:hover,
+  &:focus {
+    color: $dropdown-link-active-color;
+    text-decoration: none;
+    background-color: $dropdown-link-active-bg;
+    outline: 0;
+  }
+}
+
+// Disabled state
+//
+// Gray out text and ensure the hover/focus state remains gray
+
+.dropdown-menu > .disabled > a {
+  &,
+  &:hover,
+  &:focus {
+    color: $dropdown-link-disabled-color;
+  }
+
+  // Nuke hover/focus effects
+  &:hover,
+  &:focus {
+    text-decoration: none;
+    cursor: $cursor-disabled;
+    background-color: transparent;
+    background-image: none; // Remove CSS gradient
+    @include reset-filter;
+  }
+}
+
+// Open state for the dropdown
+.open {
+  // Show the menu
+  > .dropdown-menu {
+    display: block;
+  }
+
+  // Remove the outline when :focus is triggered
+  > a {
+    outline: 0;
+  }
+}
+
+// Menu positioning
+//
+// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
+// menu with the parent.
+.dropdown-menu-right {
+  right: 0;
+  left: auto; // Reset the default from `.dropdown-menu`
+}
+// With v3, we enabled auto-flipping if you have a dropdown within a right
+// aligned nav component. To enable the undoing of that, we provide an override
+// to restore the default dropdown menu alignment.
+//
+// This is only for left-aligning a dropdown menu within a `.navbar-right` or
+// `.pull-right` nav component.
+.dropdown-menu-left {
+  right: auto;
+  left: 0;
+}
+
+// Dropdown section headers
+.dropdown-header {
+  display: block;
+  padding: 3px 20px;
+  font-size: $font-size-small;
+  line-height: $line-height-base;
+  color: $dropdown-header-color;
+  white-space: nowrap; // as with > li > a
+}
+
+// Backdrop to catch body clicks on mobile, etc.
+.dropdown-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: ($zindex-dropdown - 10);
+}
+
+// Right aligned dropdowns
+.pull-right > .dropdown-menu {
+  right: 0;
+  left: auto;
+}
+
+// Allow for dropdowns to go bottom up (aka, dropup-menu)
+//
+// Just add .dropup after the standard .dropdown class and you're set, bro.
+// TODO: abstract this so that the navbar fixed styles are not placed here?
+
+.dropup,
+.navbar-fixed-bottom .dropdown {
+  // Reverse the caret
+  .caret {
+    content: "";
+    border-top: 0;
+    border-bottom: $caret-width-base dashed;
+    border-bottom: $caret-width-base solid \9; // IE8
+  }
+  // Different positioning for bottom up menu
+  .dropdown-menu {
+    top: auto;
+    bottom: 100%;
+    margin-bottom: 2px;
+  }
+}
+
+
+// Component alignment
+//
+// Reiterate per navbar.less and the modified component alignment there.
+
+@media (min-width: $grid-float-breakpoint) {
+  .navbar-right {
+    .dropdown-menu {
+      right: 0; left: auto;
+    }
+    // Necessary for overrides of the default right aligned menu.
+    // Will remove come v4 in all likelihood.
+    .dropdown-menu-left {
+      left: 0; right: auto;
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_forms.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_forms.scss
new file mode 100644
index 0000000000000000000000000000000000000000..d2e2bac5cdd69b0bc5e41409143c04ae86eeb12f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_forms.scss
@@ -0,0 +1,607 @@
+//
+// Forms
+// --------------------------------------------------
+
+
+// Normalize non-controls
+//
+// Restyle and baseline non-control form elements.
+
+fieldset {
+  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,
+  // so we reset that to ensure it behaves more like a standard block element.
+  // See https://github.com/twbs/bootstrap/issues/12359.
+  min-width: 0;
+  padding: 0;
+  margin: 0;
+  border: 0;
+}
+
+legend {
+  display: block;
+  width: 100%;
+  padding: 0;
+  margin-bottom: $line-height-computed;
+  font-size: ($font-size-base * 1.5);
+  line-height: inherit;
+  color: $legend-color;
+  border: 0;
+  border-bottom: 1px solid $legend-border-color;
+}
+
+label {
+  display: inline-block;
+  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)
+  margin-bottom: 5px;
+  font-weight: 700;
+}
+
+
+// Normalize form controls
+//
+// While most of our form styles require extra classes, some basic normalization
+// is required to ensure optimum display with or without those classes to better
+// address browser inconsistencies.
+
+input[type="search"] {
+  // Override content-box in Normalize (* isn't specific enough)
+  @include box-sizing(border-box);
+
+  // Search inputs in iOS
+  //
+  // This overrides the extra rounded corners on search inputs in iOS so that our
+  // `.form-control` class can properly style them. Note that this cannot simply
+  // be added to `.form-control` as it's not specific enough. For details, see
+  // https://github.com/twbs/bootstrap/issues/11586.
+  -webkit-appearance: none;
+  appearance: none;
+}
+
+// Position radios and checkboxes better
+input[type="radio"],
+input[type="checkbox"] {
+  margin: 4px 0 0;
+  margin-top: 1px \9; // IE8-9
+  line-height: normal;
+
+  // Apply same disabled cursor tweak as for inputs
+  // Some special care is needed because <label>s don't inherit their parent's `cursor`.
+  //
+  // Note: Neither radios nor checkboxes can be readonly.
+  &[disabled],
+  &.disabled,
+  fieldset[disabled] & {
+    cursor: $cursor-disabled;
+  }
+}
+
+input[type="file"] {
+  display: block;
+}
+
+// Make range inputs behave like textual form controls
+input[type="range"] {
+  display: block;
+  width: 100%;
+}
+
+// Make multiple select elements height not fixed
+select[multiple],
+select[size] {
+  height: auto;
+}
+
+// Focus for file, radio, and checkbox
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+  @include tab-focus;
+}
+
+// Adjust output element
+output {
+  display: block;
+  padding-top: ($padding-base-vertical + 1);
+  font-size: $font-size-base;
+  line-height: $line-height-base;
+  color: $input-color;
+}
+
+
+// Common form controls
+//
+// Shared size and type resets for form controls. Apply `.form-control` to any
+// of the following form controls:
+//
+// select
+// textarea
+// input[type="text"]
+// input[type="password"]
+// input[type="datetime"]
+// input[type="datetime-local"]
+// input[type="date"]
+// input[type="month"]
+// input[type="time"]
+// input[type="week"]
+// input[type="number"]
+// input[type="email"]
+// input[type="url"]
+// input[type="search"]
+// input[type="tel"]
+// input[type="color"]
+
+.form-control {
+  display: block;
+  width: 100%;
+  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
+  padding: $padding-base-vertical $padding-base-horizontal;
+  font-size: $font-size-base;
+  line-height: $line-height-base;
+  color: $input-color;
+  background-color: $input-bg;
+  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+  border: 1px solid $input-border;
+  border-radius: $input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.
+  @include box-shadow(inset 0 1px 1px rgba(0, 0, 0, .075));
+  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
+
+  // Customize the `:focus` state to imitate native WebKit styles.
+  @include form-control-focus;
+
+  // Placeholder
+  @include placeholder;
+
+  // Unstyle the caret on `<select>`s in IE10+.
+  &::-ms-expand {
+    background-color: transparent;
+    border: 0;
+  }
+
+  // Disabled and read-only inputs
+  //
+  // HTML5 says that controls under a fieldset > legend:first-child won't be
+  // disabled if the fieldset is disabled. Due to implementation difficulty, we
+  // don't honor that edge case; we style them as disabled anyway.
+  &[disabled],
+  &[readonly],
+  fieldset[disabled] & {
+    background-color: $input-bg-disabled;
+    opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655
+  }
+
+  &[disabled],
+  fieldset[disabled] & {
+    cursor: $cursor-disabled;
+  }
+
+  // [converter] extracted textarea& to textarea.form-control
+}
+
+// Reset height for `textarea`s
+textarea.form-control {
+  height: auto;
+}
+
+
+// Special styles for iOS temporal inputs
+//
+// In Mobile Safari, setting `display: block` on temporal inputs causes the
+// text within the input to become vertically misaligned. As a workaround, we
+// set a pixel line-height that matches the given height of the input, but only
+// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
+//
+// Note that as of 9.3, iOS doesn't support `week`.
+
+@media screen and (-webkit-min-device-pixel-ratio: 0) {
+  input[type="date"],
+  input[type="time"],
+  input[type="datetime-local"],
+  input[type="month"] {
+    &.form-control {
+      line-height: $input-height-base;
+    }
+
+    &.input-sm,
+    .input-group-sm & {
+      line-height: $input-height-small;
+    }
+
+    &.input-lg,
+    .input-group-lg & {
+      line-height: $input-height-large;
+    }
+  }
+}
+
+
+// Form groups
+//
+// Designed to help with the organization and spacing of vertical forms. For
+// horizontal forms, use the predefined grid classes.
+
+.form-group {
+  margin-bottom: $form-group-margin-bottom;
+}
+
+
+// Checkboxes and radios
+//
+// Indent the labels to position radios/checkboxes as hanging controls.
+
+.radio,
+.checkbox {
+  position: relative;
+  display: block;
+  margin-top: 10px;
+  margin-bottom: 10px;
+
+  // These are used on elements with <label> descendants
+  &.disabled,
+  fieldset[disabled] & {
+    label {
+      cursor: $cursor-disabled;
+    }
+  }
+
+  label {
+    min-height: $line-height-computed; // Ensure the input doesn't jump when there is no text
+    padding-left: 20px;
+    margin-bottom: 0;
+    font-weight: 400;
+    cursor: pointer;
+  }
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+  position: absolute;
+  margin-top: 4px \9;
+  margin-left: -20px;
+}
+
+.radio + .radio,
+.checkbox + .checkbox {
+  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing
+}
+
+// Radios and checkboxes on same line
+.radio-inline,
+.checkbox-inline {
+  position: relative;
+  display: inline-block;
+  padding-left: 20px;
+  margin-bottom: 0;
+  font-weight: 400;
+  vertical-align: middle;
+  cursor: pointer;
+
+  // These are used directly on <label>s
+  &.disabled,
+  fieldset[disabled] & {
+    cursor: $cursor-disabled;
+  }
+}
+.radio-inline + .radio-inline,
+.checkbox-inline + .checkbox-inline {
+  margin-top: 0;
+  margin-left: 10px; // space out consecutive inline controls
+}
+
+
+// Static form control text
+//
+// Apply class to a `p` element to make any string of text align with labels in
+// a horizontal form layout.
+
+.form-control-static {
+  min-height: ($line-height-computed + $font-size-base);
+  // Size it appropriately next to real form controls
+  padding-top: ($padding-base-vertical + 1);
+  padding-bottom: ($padding-base-vertical + 1);
+  // Remove default margin from `p`
+  margin-bottom: 0;
+
+  &.input-lg,
+  &.input-sm {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+
+
+// Form control sizing
+//
+// Build on `.form-control` with modifier classes to decrease or increase the
+// height and font-size of form controls.
+//
+// The `.form-group-* form-control` variations are sadly duplicated to avoid the
+// issue documented in https://github.com/twbs/bootstrap/issues/15074.
+
+@include input-size('.input-sm', $input-height-small, $padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $input-border-radius-small);
+.form-group-sm {
+  .form-control {
+    height: $input-height-small;
+    padding: $padding-small-vertical $padding-small-horizontal;
+    font-size: $font-size-small;
+    line-height: $line-height-small;
+    border-radius: $input-border-radius-small;
+  }
+  select.form-control {
+    height: $input-height-small;
+    line-height: $input-height-small;
+  }
+  textarea.form-control,
+  select[multiple].form-control {
+    height: auto;
+  }
+  .form-control-static {
+    height: $input-height-small;
+    min-height: ($line-height-computed + $font-size-small);
+    padding: ($padding-small-vertical + 1) $padding-small-horizontal;
+    font-size: $font-size-small;
+    line-height: $line-height-small;
+  }
+}
+
+@include input-size('.input-lg', $input-height-large, $padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $input-border-radius-large);
+.form-group-lg {
+  .form-control {
+    height: $input-height-large;
+    padding: $padding-large-vertical $padding-large-horizontal;
+    font-size: $font-size-large;
+    line-height: $line-height-large;
+    border-radius: $input-border-radius-large;
+  }
+  select.form-control {
+    height: $input-height-large;
+    line-height: $input-height-large;
+  }
+  textarea.form-control,
+  select[multiple].form-control {
+    height: auto;
+  }
+  .form-control-static {
+    height: $input-height-large;
+    min-height: ($line-height-computed + $font-size-large);
+    padding: ($padding-large-vertical + 1) $padding-large-horizontal;
+    font-size: $font-size-large;
+    line-height: $line-height-large;
+  }
+}
+
+
+// Form control feedback states
+//
+// Apply contextual and semantic states to individual form controls.
+
+.has-feedback {
+  // Enable absolute positioning
+  position: relative;
+
+  // Ensure icons don't overlap text
+  .form-control {
+    padding-right: ($input-height-base * 1.25);
+  }
+}
+// Feedback icon (requires .glyphicon classes)
+.form-control-feedback {
+  position: absolute;
+  top: 0;
+  right: 0;
+  z-index: 2; // Ensure icon is above input groups
+  display: block;
+  width: $input-height-base;
+  height: $input-height-base;
+  line-height: $input-height-base;
+  text-align: center;
+  pointer-events: none;
+}
+.input-lg + .form-control-feedback,
+.input-group-lg + .form-control-feedback,
+.form-group-lg .form-control + .form-control-feedback {
+  width: $input-height-large;
+  height: $input-height-large;
+  line-height: $input-height-large;
+}
+.input-sm + .form-control-feedback,
+.input-group-sm + .form-control-feedback,
+.form-group-sm .form-control + .form-control-feedback {
+  width: $input-height-small;
+  height: $input-height-small;
+  line-height: $input-height-small;
+}
+
+// Feedback states
+.has-success {
+  @include form-control-validation($state-success-text, $state-success-text, $state-success-bg);
+}
+.has-warning {
+  @include form-control-validation($state-warning-text, $state-warning-text, $state-warning-bg);
+}
+.has-error {
+  @include form-control-validation($state-danger-text, $state-danger-text, $state-danger-bg);
+}
+
+// Reposition feedback icon if input has visible label above
+.has-feedback label {
+
+  & ~ .form-control-feedback {
+    top: ($line-height-computed + 5); // Height of the `label` and its margin
+  }
+  &.sr-only ~ .form-control-feedback {
+    top: 0;
+  }
+}
+
+
+// Help text
+//
+// Apply to any element you wish to create light text for placement immediately
+// below a form control. Use for general help, formatting, or instructional text.
+
+.help-block {
+  display: block; // account for any element using help-block
+  margin-top: 5px;
+  margin-bottom: 10px;
+  color: lighten($text-color, 25%); // lighten the text some for contrast
+}
+
+
+// Inline forms
+//
+// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
+// forms begin stacked on extra small (mobile) devices and then go inline when
+// viewports reach <768px.
+//
+// Requires wrapping inputs and labels with `.form-group` for proper display of
+// default HTML form controls and our custom form controls (e.g., input groups).
+//
+// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
+
+// [converter] extracted from `.form-inline` for libsass compatibility
+@mixin form-inline {
+
+  // Kick in the inline
+  @media (min-width: $screen-sm-min) {
+    // Inline-block all the things for "inline"
+    .form-group {
+      display: inline-block;
+      margin-bottom: 0;
+      vertical-align: middle;
+    }
+
+    // In navbar-form, allow folks to *not* use `.form-group`
+    .form-control {
+      display: inline-block;
+      width: auto; // Prevent labels from stacking above inputs in `.form-group`
+      vertical-align: middle;
+    }
+
+    // Make static controls behave like regular ones
+    .form-control-static {
+      display: inline-block;
+    }
+
+    .input-group {
+      display: inline-table;
+      vertical-align: middle;
+
+      .input-group-addon,
+      .input-group-btn,
+      .form-control {
+        width: auto;
+      }
+    }
+
+    // Input groups need that 100% width though
+    .input-group > .form-control {
+      width: 100%;
+    }
+
+    .control-label {
+      margin-bottom: 0;
+      vertical-align: middle;
+    }
+
+    // Remove default margin on radios/checkboxes that were used for stacking, and
+    // then undo the floating of radios and checkboxes to match.
+    .radio,
+    .checkbox {
+      display: inline-block;
+      margin-top: 0;
+      margin-bottom: 0;
+      vertical-align: middle;
+
+      label {
+        padding-left: 0;
+      }
+    }
+    .radio input[type="radio"],
+    .checkbox input[type="checkbox"] {
+      position: relative;
+      margin-left: 0;
+    }
+
+    // Re-override the feedback icon.
+    .has-feedback .form-control-feedback {
+      top: 0;
+    }
+  }
+}
+// [converter] extracted as `@mixin form-inline` for libsass compatibility
+.form-inline {
+  @include form-inline;
+}
+
+
+
+// Horizontal forms
+//
+// Horizontal forms are built on grid classes and allow you to create forms with
+// labels on the left and inputs on the right.
+
+.form-horizontal {
+
+  // Consistent vertical alignment of radios and checkboxes
+  //
+  // Labels also get some reset styles, but that is scoped to a media query below.
+  .radio,
+  .checkbox,
+  .radio-inline,
+  .checkbox-inline {
+    padding-top: ($padding-base-vertical + 1); // Default padding plus a border
+    margin-top: 0;
+    margin-bottom: 0;
+  }
+  // Account for padding we're adding to ensure the alignment and of help text
+  // and other content below items
+  .radio,
+  .checkbox {
+    min-height: ($line-height-computed + ($padding-base-vertical + 1));
+  }
+
+  // Make form groups behave like rows
+  .form-group {
+    @include make-row;
+  }
+
+  // Reset spacing and right align labels, but scope to media queries so that
+  // labels on narrow viewports stack the same as a default form example.
+  @media (min-width: $screen-sm-min) {
+    .control-label {
+      padding-top: ($padding-base-vertical + 1); // Default padding plus a border
+      margin-bottom: 0;
+      text-align: right;
+    }
+  }
+
+  // Validation states
+  //
+  // Reposition the icon because it's now within a grid column and columns have
+  // `position: relative;` on them. Also accounts for the grid gutter padding.
+  .has-feedback .form-control-feedback {
+    right: floor(($grid-gutter-width / 2));
+  }
+
+  // Form group sizes
+  //
+  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the
+  // inputs and labels within a `.form-group`.
+  .form-group-lg {
+    @media (min-width: $screen-sm-min) {
+      .control-label {
+        padding-top: ($padding-large-vertical + 1);
+        font-size: $font-size-large;
+      }
+    }
+  }
+  .form-group-sm {
+    @media (min-width: $screen-sm-min) {
+      .control-label {
+        padding-top: ($padding-small-vertical + 1);
+        font-size: $font-size-small;
+      }
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_glyphicons.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_glyphicons.scss
new file mode 100644
index 0000000000000000000000000000000000000000..bd5966dd264548c7a47634bae1ccd4ec556b3712
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_glyphicons.scss
@@ -0,0 +1,307 @@
+//
+// Glyphicons for Bootstrap
+//
+// Since icons are fonts, they can be placed anywhere text is placed and are
+// thus automatically sized to match the surrounding child. To use, create an
+// inline element with the appropriate classes, like so:
+//
+// <a href="#"><span class="glyphicon glyphicon-star"></span> Star</a>
+
+@at-root {
+  // Import the fonts
+  @font-face {
+    font-family: "Glyphicons Halflings";
+    src: url(if($bootstrap-sass-asset-helper, twbs-font-path("#{$icon-font-path}#{$icon-font-name}.eot"), "#{$icon-font-path}#{$icon-font-name}.eot"));
+    src: url(if($bootstrap-sass-asset-helper, twbs-font-path("#{$icon-font-path}#{$icon-font-name}.eot?#iefix"), "#{$icon-font-path}#{$icon-font-name}.eot?#iefix")) format("embedded-opentype"),
+         url(if($bootstrap-sass-asset-helper, twbs-font-path("#{$icon-font-path}#{$icon-font-name}.woff2"), "#{$icon-font-path}#{$icon-font-name}.woff2")) format("woff2"),
+         url(if($bootstrap-sass-asset-helper, twbs-font-path("#{$icon-font-path}#{$icon-font-name}.woff"), "#{$icon-font-path}#{$icon-font-name}.woff")) format("woff"),
+         url(if($bootstrap-sass-asset-helper, twbs-font-path("#{$icon-font-path}#{$icon-font-name}.ttf"), "#{$icon-font-path}#{$icon-font-name}.ttf")) format("truetype"),
+         url(if($bootstrap-sass-asset-helper, twbs-font-path("#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}"), "#{$icon-font-path}#{$icon-font-name}.svg##{$icon-font-svg-id}")) format("svg");
+  }
+}
+
+// Catchall baseclass
+.glyphicon {
+  position: relative;
+  top: 1px;
+  display: inline-block;
+  font-family: "Glyphicons Halflings";
+  font-style: normal;
+  font-weight: 400;
+  line-height: 1;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+// Individual icons
+.glyphicon-asterisk               { &:before { content: "\002a"; } }
+.glyphicon-plus                   { &:before { content: "\002b"; } }
+.glyphicon-euro,
+.glyphicon-eur                    { &:before { content: "\20ac"; } }
+.glyphicon-minus                  { &:before { content: "\2212"; } }
+.glyphicon-cloud                  { &:before { content: "\2601"; } }
+.glyphicon-envelope               { &:before { content: "\2709"; } }
+.glyphicon-pencil                 { &:before { content: "\270f"; } }
+.glyphicon-glass                  { &:before { content: "\e001"; } }
+.glyphicon-music                  { &:before { content: "\e002"; } }
+.glyphicon-search                 { &:before { content: "\e003"; } }
+.glyphicon-heart                  { &:before { content: "\e005"; } }
+.glyphicon-star                   { &:before { content: "\e006"; } }
+.glyphicon-star-empty             { &:before { content: "\e007"; } }
+.glyphicon-user                   { &:before { content: "\e008"; } }
+.glyphicon-film                   { &:before { content: "\e009"; } }
+.glyphicon-th-large               { &:before { content: "\e010"; } }
+.glyphicon-th                     { &:before { content: "\e011"; } }
+.glyphicon-th-list                { &:before { content: "\e012"; } }
+.glyphicon-ok                     { &:before { content: "\e013"; } }
+.glyphicon-remove                 { &:before { content: "\e014"; } }
+.glyphicon-zoom-in                { &:before { content: "\e015"; } }
+.glyphicon-zoom-out               { &:before { content: "\e016"; } }
+.glyphicon-off                    { &:before { content: "\e017"; } }
+.glyphicon-signal                 { &:before { content: "\e018"; } }
+.glyphicon-cog                    { &:before { content: "\e019"; } }
+.glyphicon-trash                  { &:before { content: "\e020"; } }
+.glyphicon-home                   { &:before { content: "\e021"; } }
+.glyphicon-file                   { &:before { content: "\e022"; } }
+.glyphicon-time                   { &:before { content: "\e023"; } }
+.glyphicon-road                   { &:before { content: "\e024"; } }
+.glyphicon-download-alt           { &:before { content: "\e025"; } }
+.glyphicon-download               { &:before { content: "\e026"; } }
+.glyphicon-upload                 { &:before { content: "\e027"; } }
+.glyphicon-inbox                  { &:before { content: "\e028"; } }
+.glyphicon-play-circle            { &:before { content: "\e029"; } }
+.glyphicon-repeat                 { &:before { content: "\e030"; } }
+.glyphicon-refresh                { &:before { content: "\e031"; } }
+.glyphicon-list-alt               { &:before { content: "\e032"; } }
+.glyphicon-lock                   { &:before { content: "\e033"; } }
+.glyphicon-flag                   { &:before { content: "\e034"; } }
+.glyphicon-headphones             { &:before { content: "\e035"; } }
+.glyphicon-volume-off             { &:before { content: "\e036"; } }
+.glyphicon-volume-down            { &:before { content: "\e037"; } }
+.glyphicon-volume-up              { &:before { content: "\e038"; } }
+.glyphicon-qrcode                 { &:before { content: "\e039"; } }
+.glyphicon-barcode                { &:before { content: "\e040"; } }
+.glyphicon-tag                    { &:before { content: "\e041"; } }
+.glyphicon-tags                   { &:before { content: "\e042"; } }
+.glyphicon-book                   { &:before { content: "\e043"; } }
+.glyphicon-bookmark               { &:before { content: "\e044"; } }
+.glyphicon-print                  { &:before { content: "\e045"; } }
+.glyphicon-camera                 { &:before { content: "\e046"; } }
+.glyphicon-font                   { &:before { content: "\e047"; } }
+.glyphicon-bold                   { &:before { content: "\e048"; } }
+.glyphicon-italic                 { &:before { content: "\e049"; } }
+.glyphicon-text-height            { &:before { content: "\e050"; } }
+.glyphicon-text-width             { &:before { content: "\e051"; } }
+.glyphicon-align-left             { &:before { content: "\e052"; } }
+.glyphicon-align-center           { &:before { content: "\e053"; } }
+.glyphicon-align-right            { &:before { content: "\e054"; } }
+.glyphicon-align-justify          { &:before { content: "\e055"; } }
+.glyphicon-list                   { &:before { content: "\e056"; } }
+.glyphicon-indent-left            { &:before { content: "\e057"; } }
+.glyphicon-indent-right           { &:before { content: "\e058"; } }
+.glyphicon-facetime-video         { &:before { content: "\e059"; } }
+.glyphicon-picture                { &:before { content: "\e060"; } }
+.glyphicon-map-marker             { &:before { content: "\e062"; } }
+.glyphicon-adjust                 { &:before { content: "\e063"; } }
+.glyphicon-tint                   { &:before { content: "\e064"; } }
+.glyphicon-edit                   { &:before { content: "\e065"; } }
+.glyphicon-share                  { &:before { content: "\e066"; } }
+.glyphicon-check                  { &:before { content: "\e067"; } }
+.glyphicon-move                   { &:before { content: "\e068"; } }
+.glyphicon-step-backward          { &:before { content: "\e069"; } }
+.glyphicon-fast-backward          { &:before { content: "\e070"; } }
+.glyphicon-backward               { &:before { content: "\e071"; } }
+.glyphicon-play                   { &:before { content: "\e072"; } }
+.glyphicon-pause                  { &:before { content: "\e073"; } }
+.glyphicon-stop                   { &:before { content: "\e074"; } }
+.glyphicon-forward                { &:before { content: "\e075"; } }
+.glyphicon-fast-forward           { &:before { content: "\e076"; } }
+.glyphicon-step-forward           { &:before { content: "\e077"; } }
+.glyphicon-eject                  { &:before { content: "\e078"; } }
+.glyphicon-chevron-left           { &:before { content: "\e079"; } }
+.glyphicon-chevron-right          { &:before { content: "\e080"; } }
+.glyphicon-plus-sign              { &:before { content: "\e081"; } }
+.glyphicon-minus-sign             { &:before { content: "\e082"; } }
+.glyphicon-remove-sign            { &:before { content: "\e083"; } }
+.glyphicon-ok-sign                { &:before { content: "\e084"; } }
+.glyphicon-question-sign          { &:before { content: "\e085"; } }
+.glyphicon-info-sign              { &:before { content: "\e086"; } }
+.glyphicon-screenshot             { &:before { content: "\e087"; } }
+.glyphicon-remove-circle          { &:before { content: "\e088"; } }
+.glyphicon-ok-circle              { &:before { content: "\e089"; } }
+.glyphicon-ban-circle             { &:before { content: "\e090"; } }
+.glyphicon-arrow-left             { &:before { content: "\e091"; } }
+.glyphicon-arrow-right            { &:before { content: "\e092"; } }
+.glyphicon-arrow-up               { &:before { content: "\e093"; } }
+.glyphicon-arrow-down             { &:before { content: "\e094"; } }
+.glyphicon-share-alt              { &:before { content: "\e095"; } }
+.glyphicon-resize-full            { &:before { content: "\e096"; } }
+.glyphicon-resize-small           { &:before { content: "\e097"; } }
+.glyphicon-exclamation-sign       { &:before { content: "\e101"; } }
+.glyphicon-gift                   { &:before { content: "\e102"; } }
+.glyphicon-leaf                   { &:before { content: "\e103"; } }
+.glyphicon-fire                   { &:before { content: "\e104"; } }
+.glyphicon-eye-open               { &:before { content: "\e105"; } }
+.glyphicon-eye-close              { &:before { content: "\e106"; } }
+.glyphicon-warning-sign           { &:before { content: "\e107"; } }
+.glyphicon-plane                  { &:before { content: "\e108"; } }
+.glyphicon-calendar               { &:before { content: "\e109"; } }
+.glyphicon-random                 { &:before { content: "\e110"; } }
+.glyphicon-comment                { &:before { content: "\e111"; } }
+.glyphicon-magnet                 { &:before { content: "\e112"; } }
+.glyphicon-chevron-up             { &:before { content: "\e113"; } }
+.glyphicon-chevron-down           { &:before { content: "\e114"; } }
+.glyphicon-retweet                { &:before { content: "\e115"; } }
+.glyphicon-shopping-cart          { &:before { content: "\e116"; } }
+.glyphicon-folder-close           { &:before { content: "\e117"; } }
+.glyphicon-folder-open            { &:before { content: "\e118"; } }
+.glyphicon-resize-vertical        { &:before { content: "\e119"; } }
+.glyphicon-resize-horizontal      { &:before { content: "\e120"; } }
+.glyphicon-hdd                    { &:before { content: "\e121"; } }
+.glyphicon-bullhorn               { &:before { content: "\e122"; } }
+.glyphicon-bell                   { &:before { content: "\e123"; } }
+.glyphicon-certificate            { &:before { content: "\e124"; } }
+.glyphicon-thumbs-up              { &:before { content: "\e125"; } }
+.glyphicon-thumbs-down            { &:before { content: "\e126"; } }
+.glyphicon-hand-right             { &:before { content: "\e127"; } }
+.glyphicon-hand-left              { &:before { content: "\e128"; } }
+.glyphicon-hand-up                { &:before { content: "\e129"; } }
+.glyphicon-hand-down              { &:before { content: "\e130"; } }
+.glyphicon-circle-arrow-right     { &:before { content: "\e131"; } }
+.glyphicon-circle-arrow-left      { &:before { content: "\e132"; } }
+.glyphicon-circle-arrow-up        { &:before { content: "\e133"; } }
+.glyphicon-circle-arrow-down      { &:before { content: "\e134"; } }
+.glyphicon-globe                  { &:before { content: "\e135"; } }
+.glyphicon-wrench                 { &:before { content: "\e136"; } }
+.glyphicon-tasks                  { &:before { content: "\e137"; } }
+.glyphicon-filter                 { &:before { content: "\e138"; } }
+.glyphicon-briefcase              { &:before { content: "\e139"; } }
+.glyphicon-fullscreen             { &:before { content: "\e140"; } }
+.glyphicon-dashboard              { &:before { content: "\e141"; } }
+.glyphicon-paperclip              { &:before { content: "\e142"; } }
+.glyphicon-heart-empty            { &:before { content: "\e143"; } }
+.glyphicon-link                   { &:before { content: "\e144"; } }
+.glyphicon-phone                  { &:before { content: "\e145"; } }
+.glyphicon-pushpin                { &:before { content: "\e146"; } }
+.glyphicon-usd                    { &:before { content: "\e148"; } }
+.glyphicon-gbp                    { &:before { content: "\e149"; } }
+.glyphicon-sort                   { &:before { content: "\e150"; } }
+.glyphicon-sort-by-alphabet       { &:before { content: "\e151"; } }
+.glyphicon-sort-by-alphabet-alt   { &:before { content: "\e152"; } }
+.glyphicon-sort-by-order          { &:before { content: "\e153"; } }
+.glyphicon-sort-by-order-alt      { &:before { content: "\e154"; } }
+.glyphicon-sort-by-attributes     { &:before { content: "\e155"; } }
+.glyphicon-sort-by-attributes-alt { &:before { content: "\e156"; } }
+.glyphicon-unchecked              { &:before { content: "\e157"; } }
+.glyphicon-expand                 { &:before { content: "\e158"; } }
+.glyphicon-collapse-down          { &:before { content: "\e159"; } }
+.glyphicon-collapse-up            { &:before { content: "\e160"; } }
+.glyphicon-log-in                 { &:before { content: "\e161"; } }
+.glyphicon-flash                  { &:before { content: "\e162"; } }
+.glyphicon-log-out                { &:before { content: "\e163"; } }
+.glyphicon-new-window             { &:before { content: "\e164"; } }
+.glyphicon-record                 { &:before { content: "\e165"; } }
+.glyphicon-save                   { &:before { content: "\e166"; } }
+.glyphicon-open                   { &:before { content: "\e167"; } }
+.glyphicon-saved                  { &:before { content: "\e168"; } }
+.glyphicon-import                 { &:before { content: "\e169"; } }
+.glyphicon-export                 { &:before { content: "\e170"; } }
+.glyphicon-send                   { &:before { content: "\e171"; } }
+.glyphicon-floppy-disk            { &:before { content: "\e172"; } }
+.glyphicon-floppy-saved           { &:before { content: "\e173"; } }
+.glyphicon-floppy-remove          { &:before { content: "\e174"; } }
+.glyphicon-floppy-save            { &:before { content: "\e175"; } }
+.glyphicon-floppy-open            { &:before { content: "\e176"; } }
+.glyphicon-credit-card            { &:before { content: "\e177"; } }
+.glyphicon-transfer               { &:before { content: "\e178"; } }
+.glyphicon-cutlery                { &:before { content: "\e179"; } }
+.glyphicon-header                 { &:before { content: "\e180"; } }
+.glyphicon-compressed             { &:before { content: "\e181"; } }
+.glyphicon-earphone               { &:before { content: "\e182"; } }
+.glyphicon-phone-alt              { &:before { content: "\e183"; } }
+.glyphicon-tower                  { &:before { content: "\e184"; } }
+.glyphicon-stats                  { &:before { content: "\e185"; } }
+.glyphicon-sd-video               { &:before { content: "\e186"; } }
+.glyphicon-hd-video               { &:before { content: "\e187"; } }
+.glyphicon-subtitles              { &:before { content: "\e188"; } }
+.glyphicon-sound-stereo           { &:before { content: "\e189"; } }
+.glyphicon-sound-dolby            { &:before { content: "\e190"; } }
+.glyphicon-sound-5-1              { &:before { content: "\e191"; } }
+.glyphicon-sound-6-1              { &:before { content: "\e192"; } }
+.glyphicon-sound-7-1              { &:before { content: "\e193"; } }
+.glyphicon-copyright-mark         { &:before { content: "\e194"; } }
+.glyphicon-registration-mark      { &:before { content: "\e195"; } }
+.glyphicon-cloud-download         { &:before { content: "\e197"; } }
+.glyphicon-cloud-upload           { &:before { content: "\e198"; } }
+.glyphicon-tree-conifer           { &:before { content: "\e199"; } }
+.glyphicon-tree-deciduous         { &:before { content: "\e200"; } }
+.glyphicon-cd                     { &:before { content: "\e201"; } }
+.glyphicon-save-file              { &:before { content: "\e202"; } }
+.glyphicon-open-file              { &:before { content: "\e203"; } }
+.glyphicon-level-up               { &:before { content: "\e204"; } }
+.glyphicon-copy                   { &:before { content: "\e205"; } }
+.glyphicon-paste                  { &:before { content: "\e206"; } }
+// The following 2 Glyphicons are omitted for the time being because
+// they currently use Unicode codepoints that are outside the
+// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle
+// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.
+// Notably, the bug affects some older versions of the Android Browser.
+// More info: https://github.com/twbs/bootstrap/issues/10106
+// .glyphicon-door                   { &:before { content: "\1f6aa"; } }
+// .glyphicon-key                    { &:before { content: "\1f511"; } }
+.glyphicon-alert                  { &:before { content: "\e209"; } }
+.glyphicon-equalizer              { &:before { content: "\e210"; } }
+.glyphicon-king                   { &:before { content: "\e211"; } }
+.glyphicon-queen                  { &:before { content: "\e212"; } }
+.glyphicon-pawn                   { &:before { content: "\e213"; } }
+.glyphicon-bishop                 { &:before { content: "\e214"; } }
+.glyphicon-knight                 { &:before { content: "\e215"; } }
+.glyphicon-baby-formula           { &:before { content: "\e216"; } }
+.glyphicon-tent                   { &:before { content: "\26fa"; } }
+.glyphicon-blackboard             { &:before { content: "\e218"; } }
+.glyphicon-bed                    { &:before { content: "\e219"; } }
+.glyphicon-apple                  { &:before { content: "\f8ff"; } }
+.glyphicon-erase                  { &:before { content: "\e221"; } }
+.glyphicon-hourglass              { &:before { content: "\231b"; } }
+.glyphicon-lamp                   { &:before { content: "\e223"; } }
+.glyphicon-duplicate              { &:before { content: "\e224"; } }
+.glyphicon-piggy-bank             { &:before { content: "\e225"; } }
+.glyphicon-scissors               { &:before { content: "\e226"; } }
+.glyphicon-bitcoin                { &:before { content: "\e227"; } }
+.glyphicon-btc                    { &:before { content: "\e227"; } }
+.glyphicon-xbt                    { &:before { content: "\e227"; } }
+.glyphicon-yen                    { &:before { content: "\00a5"; } }
+.glyphicon-jpy                    { &:before { content: "\00a5"; } }
+.glyphicon-ruble                  { &:before { content: "\20bd"; } }
+.glyphicon-rub                    { &:before { content: "\20bd"; } }
+.glyphicon-scale                  { &:before { content: "\e230"; } }
+.glyphicon-ice-lolly              { &:before { content: "\e231"; } }
+.glyphicon-ice-lolly-tasted       { &:before { content: "\e232"; } }
+.glyphicon-education              { &:before { content: "\e233"; } }
+.glyphicon-option-horizontal      { &:before { content: "\e234"; } }
+.glyphicon-option-vertical        { &:before { content: "\e235"; } }
+.glyphicon-menu-hamburger         { &:before { content: "\e236"; } }
+.glyphicon-modal-window           { &:before { content: "\e237"; } }
+.glyphicon-oil                    { &:before { content: "\e238"; } }
+.glyphicon-grain                  { &:before { content: "\e239"; } }
+.glyphicon-sunglasses             { &:before { content: "\e240"; } }
+.glyphicon-text-size              { &:before { content: "\e241"; } }
+.glyphicon-text-color             { &:before { content: "\e242"; } }
+.glyphicon-text-background        { &:before { content: "\e243"; } }
+.glyphicon-object-align-top       { &:before { content: "\e244"; } }
+.glyphicon-object-align-bottom    { &:before { content: "\e245"; } }
+.glyphicon-object-align-horizontal{ &:before { content: "\e246"; } }
+.glyphicon-object-align-left      { &:before { content: "\e247"; } }
+.glyphicon-object-align-vertical  { &:before { content: "\e248"; } }
+.glyphicon-object-align-right     { &:before { content: "\e249"; } }
+.glyphicon-triangle-right         { &:before { content: "\e250"; } }
+.glyphicon-triangle-left          { &:before { content: "\e251"; } }
+.glyphicon-triangle-bottom        { &:before { content: "\e252"; } }
+.glyphicon-triangle-top           { &:before { content: "\e253"; } }
+.glyphicon-console                { &:before { content: "\e254"; } }
+.glyphicon-superscript            { &:before { content: "\e255"; } }
+.glyphicon-subscript              { &:before { content: "\e256"; } }
+.glyphicon-menu-left              { &:before { content: "\e257"; } }
+.glyphicon-menu-right             { &:before { content: "\e258"; } }
+.glyphicon-menu-down              { &:before { content: "\e259"; } }
+.glyphicon-menu-up                { &:before { content: "\e260"; } }
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_grid.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_grid.scss
new file mode 100644
index 0000000000000000000000000000000000000000..2ddb73debeca26d1a25789bb3e3d1e1fb9137cbc
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_grid.scss
@@ -0,0 +1,94 @@
+//
+// Grid system
+// --------------------------------------------------
+
+
+// Container widths
+//
+// Set the container width, and override it for fixed navbars in media queries.
+
+.container {
+  @include container-fixed;
+
+  @media (min-width: $screen-sm-min) {
+    width: $container-sm;
+  }
+  @media (min-width: $screen-md-min) {
+    width: $container-md;
+  }
+  @media (min-width: $screen-lg-min) {
+    width: $container-lg;
+  }
+}
+
+
+// Fluid container
+//
+// Utilizes the mixin meant for fixed width containers, but without any defined
+// width for fluid, full width layouts.
+
+.container-fluid {
+  @include container-fixed;
+}
+
+
+// Row
+//
+// Rows contain and clear the floats of your columns.
+
+.row {
+  @include make-row;
+}
+
+.row-no-gutters {
+  margin-right: 0;
+  margin-left: 0;
+
+  [class*="col-"] {
+    padding-right: 0;
+    padding-left: 0;
+  }
+}
+
+
+// Columns
+//
+// Common styles for small and large grid columns
+
+@include make-grid-columns;
+
+
+// Extra small grid
+//
+// Columns, offsets, pushes, and pulls for extra small devices like
+// smartphones.
+
+@include make-grid(xs);
+
+
+// Small grid
+//
+// Columns, offsets, pushes, and pulls for the small device range, from phones
+// to tablets.
+
+@media (min-width: $screen-sm-min) {
+  @include make-grid(sm);
+}
+
+
+// Medium grid
+//
+// Columns, offsets, pushes, and pulls for the desktop device range.
+
+@media (min-width: $screen-md-min) {
+  @include make-grid(md);
+}
+
+
+// Large grid
+//
+// Columns, offsets, pushes, and pulls for the large desktop device range.
+
+@media (min-width: $screen-lg-min) {
+  @include make-grid(lg);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_input-groups.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_input-groups.scss
new file mode 100644
index 0000000000000000000000000000000000000000..04015feffd273138cf69bc96eea3af0ac198df14
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_input-groups.scss
@@ -0,0 +1,171 @@
+//
+// Input groups
+// --------------------------------------------------
+
+// Base styles
+// -------------------------
+.input-group {
+  position: relative; // For dropdowns
+  display: table;
+  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
+
+  // Undo padding and float of grid classes
+  &[class*="col-"] {
+    float: none;
+    padding-right: 0;
+    padding-left: 0;
+  }
+
+  .form-control {
+    // Ensure that the input is always above the *appended* addon button for
+    // proper border colors.
+    position: relative;
+    z-index: 2;
+
+    // IE9 fubars the placeholder attribute in text inputs and the arrows on
+    // select elements in input groups. To fix it, we float the input. Details:
+    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855
+    float: left;
+
+    width: 100%;
+    margin-bottom: 0;
+
+    &:focus {
+      z-index: 3;
+    }
+  }
+}
+
+// Sizing options
+//
+// Remix the default form control sizing classes into new ones for easier
+// manipulation.
+
+.input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+  @extend .input-lg;
+}
+.input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+  @extend .input-sm;
+}
+
+
+// Display as table-cell
+// -------------------------
+.input-group-addon,
+.input-group-btn,
+.input-group .form-control {
+  display: table-cell;
+
+  &:not(:first-child):not(:last-child) {
+    border-radius: 0;
+  }
+}
+// Addon and addon wrapper for buttons
+.input-group-addon,
+.input-group-btn {
+  width: 1%;
+  white-space: nowrap;
+  vertical-align: middle; // Match the inputs
+}
+
+// Text input groups
+// -------------------------
+.input-group-addon {
+  padding: $padding-base-vertical $padding-base-horizontal;
+  font-size: $font-size-base;
+  font-weight: 400;
+  line-height: 1;
+  color: $input-color;
+  text-align: center;
+  background-color: $input-group-addon-bg;
+  border: 1px solid $input-group-addon-border-color;
+  border-radius: $input-border-radius;
+
+  // Sizing
+  &.input-sm {
+    padding: $padding-small-vertical $padding-small-horizontal;
+    font-size: $font-size-small;
+    border-radius: $input-border-radius-small;
+  }
+  &.input-lg {
+    padding: $padding-large-vertical $padding-large-horizontal;
+    font-size: $font-size-large;
+    border-radius: $input-border-radius-large;
+  }
+
+  // Nuke default margins from checkboxes and radios to vertically center within.
+  input[type="radio"],
+  input[type="checkbox"] {
+    margin-top: 0;
+  }
+}
+
+// Reset rounded corners
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+  @include border-right-radius(0);
+}
+.input-group-addon:first-child {
+  border-right: 0;
+}
+.input-group .form-control:last-child,
+.input-group-addon:last-child,
+.input-group-btn:last-child > .btn,
+.input-group-btn:last-child > .btn-group > .btn,
+.input-group-btn:last-child > .dropdown-toggle,
+.input-group-btn:first-child > .btn:not(:first-child),
+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
+  @include border-left-radius(0);
+}
+.input-group-addon:last-child {
+  border-left: 0;
+}
+
+// Button input groups
+// -------------------------
+.input-group-btn {
+  position: relative;
+  // Jankily prevent input button groups from wrapping with `white-space` and
+  // `font-size` in combination with `inline-block` on buttons.
+  font-size: 0;
+  white-space: nowrap;
+
+  // Negative margin for spacing, position for bringing hovered/focused/actived
+  // element above the siblings.
+  > .btn {
+    position: relative;
+    + .btn {
+      margin-left: -1px;
+    }
+    // Bring the "active" button to the front
+    &:hover,
+    &:focus,
+    &:active {
+      z-index: 2;
+    }
+  }
+
+  // Negative margin to only have a 1px border between the two
+  &:first-child {
+    > .btn,
+    > .btn-group {
+      margin-right: -1px;
+    }
+  }
+  &:last-child {
+    > .btn,
+    > .btn-group {
+      z-index: 2;
+      margin-left: -1px;
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_jumbotron.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_jumbotron.scss
new file mode 100644
index 0000000000000000000000000000000000000000..7215b991312f6fdd790fabee39082d17871fc26a
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_jumbotron.scss
@@ -0,0 +1,54 @@
+//
+// Jumbotron
+// --------------------------------------------------
+
+
+.jumbotron {
+  padding-top: $jumbotron-padding;
+  padding-bottom: $jumbotron-padding;
+  margin-bottom: $jumbotron-padding;
+  color: $jumbotron-color;
+  background-color: $jumbotron-bg;
+
+  h1,
+  .h1 {
+    color: $jumbotron-heading-color;
+  }
+
+  p {
+    margin-bottom: ($jumbotron-padding / 2);
+    font-size: $jumbotron-font-size;
+    font-weight: 200;
+  }
+
+  > hr {
+    border-top-color: darken($jumbotron-bg, 10%);
+  }
+
+  .container &,
+  .container-fluid & {
+    padding-right: ($grid-gutter-width / 2);
+    padding-left: ($grid-gutter-width / 2);
+    border-radius: $border-radius-large; // Only round corners at higher resolutions if contained in a container
+  }
+
+  .container {
+    max-width: 100%;
+  }
+
+  @media screen and (min-width: $screen-sm-min) {
+    padding-top: ($jumbotron-padding * 1.6);
+    padding-bottom: ($jumbotron-padding * 1.6);
+
+    .container &,
+    .container-fluid & {
+      padding-right: ($jumbotron-padding * 2);
+      padding-left: ($jumbotron-padding * 2);
+    }
+
+    h1,
+    .h1 {
+      font-size: $jumbotron-heading-font-size;
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_labels.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_labels.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f7f301392320a19cfbc0cbd3cdc6b3ef71fd73ba
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_labels.scss
@@ -0,0 +1,66 @@
+//
+// Labels
+// --------------------------------------------------
+
+.label {
+  display: inline;
+  padding: .2em .6em .3em;
+  font-size: 75%;
+  font-weight: 700;
+  line-height: 1;
+  color: $label-color;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: .25em;
+
+  // [converter] extracted a& to a.label
+
+  // Empty labels collapse automatically (not available in IE8)
+  &:empty {
+    display: none;
+  }
+
+  // Quick fix for labels in buttons
+  .btn & {
+    position: relative;
+    top: -1px;
+  }
+}
+
+// Add hover effects, but only for links
+a.label {
+  &:hover,
+  &:focus {
+    color: $label-link-hover-color;
+    text-decoration: none;
+    cursor: pointer;
+  }
+}
+
+// Colors
+// Contextual variations (linked labels get darker on :hover)
+
+.label-default {
+  @include label-variant($label-default-bg);
+}
+
+.label-primary {
+  @include label-variant($label-primary-bg);
+}
+
+.label-success {
+  @include label-variant($label-success-bg);
+}
+
+.label-info {
+  @include label-variant($label-info-bg);
+}
+
+.label-warning {
+  @include label-variant($label-warning-bg);
+}
+
+.label-danger {
+  @include label-variant($label-danger-bg);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_list-group.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_list-group.scss
new file mode 100644
index 0000000000000000000000000000000000000000..529f179e8cdfd874701692c2b7f042594285a563
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_list-group.scss
@@ -0,0 +1,128 @@
+//
+// List groups
+// --------------------------------------------------
+
+
+// Base class
+//
+// Easily usable on <ul>, <ol>, or <div>.
+
+.list-group {
+  // No need to set list-style: none; since .list-group-item is block level
+  padding-left: 0; // reset padding because ul and ol
+  margin-bottom: 20px;
+}
+
+
+// Individual list items
+//
+// Use on `li`s or `div`s within the `.list-group` parent.
+
+.list-group-item {
+  position: relative;
+  display: block;
+  padding: 10px 15px;
+  // Place the border on the list items and negative margin up for better styling
+  margin-bottom: -1px;
+  background-color: $list-group-bg;
+  border: 1px solid $list-group-border;
+
+  // Round the first and last items
+  &:first-child {
+    @include border-top-radius($list-group-border-radius);
+  }
+  &:last-child {
+    margin-bottom: 0;
+    @include border-bottom-radius($list-group-border-radius);
+  }
+
+  // Disabled state
+  &.disabled,
+  &.disabled:hover,
+  &.disabled:focus {
+    color: $list-group-disabled-color;
+    cursor: $cursor-disabled;
+    background-color: $list-group-disabled-bg;
+
+    // Force color to inherit for custom content
+    .list-group-item-heading {
+      color: inherit;
+    }
+    .list-group-item-text {
+      color: $list-group-disabled-text-color;
+    }
+  }
+
+  // Active class on item itself, not parent
+  &.active,
+  &.active:hover,
+  &.active:focus {
+    z-index: 2; // Place active items above their siblings for proper border styling
+    color: $list-group-active-color;
+    background-color: $list-group-active-bg;
+    border-color: $list-group-active-border;
+
+    // Force color to inherit for custom content
+    .list-group-item-heading,
+    .list-group-item-heading > small,
+    .list-group-item-heading > .small {
+      color: inherit;
+    }
+    .list-group-item-text {
+      color: $list-group-active-text-color;
+    }
+  }
+}
+
+
+// Interactive list items
+//
+// Use anchor or button elements instead of `li`s or `div`s to create interactive items.
+// Includes an extra `.active` modifier class for showing selected items.
+
+a.list-group-item,
+button.list-group-item {
+  color: $list-group-link-color;
+
+  .list-group-item-heading {
+    color: $list-group-link-heading-color;
+  }
+
+  // Hover state
+  &:hover,
+  &:focus {
+    color: $list-group-link-hover-color;
+    text-decoration: none;
+    background-color: $list-group-hover-bg;
+  }
+}
+
+button.list-group-item {
+  width: 100%;
+  text-align: left;
+}
+
+
+// Contextual variants
+//
+// Add modifier classes to change text and background color on individual items.
+// Organizationally, this must come after the `:hover` states.
+
+@include list-group-item-variant(success, $state-success-bg, $state-success-text);
+@include list-group-item-variant(info, $state-info-bg, $state-info-text);
+@include list-group-item-variant(warning, $state-warning-bg, $state-warning-text);
+@include list-group-item-variant(danger, $state-danger-bg, $state-danger-text);
+
+
+// Custom content options
+//
+// Extra classes for creating well-formatted content within `.list-group-item`s.
+
+.list-group-item-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+.list-group-item-text {
+  margin-bottom: 0;
+  line-height: 1.3;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_media.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_media.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e4ae44573e94448ab26984d10b0a273a7fc0ee17
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_media.scss
@@ -0,0 +1,66 @@
+.media {
+  // Proper spacing between instances of .media
+  margin-top: 15px;
+
+  &:first-child {
+    margin-top: 0;
+  }
+}
+
+.media,
+.media-body {
+  overflow: hidden;
+  zoom: 1;
+}
+
+.media-body {
+  width: 10000px;
+}
+
+.media-object {
+  display: block;
+
+  // Fix collapse in webkit from max-width: 100% and display: table-cell.
+  &.img-thumbnail {
+    max-width: none;
+  }
+}
+
+.media-right,
+.media > .pull-right {
+  padding-left: 10px;
+}
+
+.media-left,
+.media > .pull-left {
+  padding-right: 10px;
+}
+
+.media-left,
+.media-right,
+.media-body {
+  display: table-cell;
+  vertical-align: top;
+}
+
+.media-middle {
+  vertical-align: middle;
+}
+
+.media-bottom {
+  vertical-align: bottom;
+}
+
+// Reset margins on headings for tighter default spacing
+.media-heading {
+  margin-top: 0;
+  margin-bottom: 5px;
+}
+
+// Media list variation
+//
+// Undo default ul/ol styles
+.media-list {
+  padding-left: 0;
+  list-style: none;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_mixins.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_mixins.scss
new file mode 100644
index 0000000000000000000000000000000000000000..78cd5aa0ff34a647fe9a99be3b8fe4e063cbe8af
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_mixins.scss
@@ -0,0 +1,40 @@
+// Mixins
+// --------------------------------------------------
+
+// Utilities
+@import "mixins/hide-text";
+@import "mixins/opacity";
+@import "mixins/image";
+@import "mixins/labels";
+@import "mixins/reset-filter";
+@import "mixins/resize";
+@import "mixins/responsive-visibility";
+@import "mixins/size";
+@import "mixins/tab-focus";
+@import "mixins/reset-text";
+@import "mixins/text-emphasis";
+@import "mixins/text-overflow";
+@import "mixins/vendor-prefixes";
+
+// Components
+@import "mixins/alerts";
+@import "mixins/buttons";
+@import "mixins/panels";
+@import "mixins/pagination";
+@import "mixins/list-group";
+@import "mixins/nav-divider";
+@import "mixins/forms";
+@import "mixins/progress-bar";
+@import "mixins/table-row";
+
+// Skins
+@import "mixins/background-variant";
+@import "mixins/border-radius";
+@import "mixins/gradients";
+
+// Layout
+@import "mixins/clearfix";
+@import "mixins/center-block";
+@import "mixins/nav-vertical-align";
+@import "mixins/grid-framework";
+@import "mixins/grid";
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_modals.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_modals.scss
new file mode 100644
index 0000000000000000000000000000000000000000..cf59befddadf3b3ee824f25723c37235e13d5452
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_modals.scss
@@ -0,0 +1,150 @@
+//
+// Modals
+// --------------------------------------------------
+
+// .modal-open      - body class for killing the scroll
+// .modal           - container to scroll within
+// .modal-dialog    - positioning shell for the actual modal
+// .modal-content   - actual modal w/ bg and corners and shit
+
+// Kill the scroll on the body
+.modal-open {
+  overflow: hidden;
+}
+
+// Container that the modal scrolls within
+.modal {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: $zindex-modal;
+  display: none;
+  overflow: hidden;
+  -webkit-overflow-scrolling: touch;
+
+  // Prevent Chrome on Windows from adding a focus outline. For details, see
+  // https://github.com/twbs/bootstrap/pull/10951.
+  outline: 0;
+
+  // When fading in the modal, animate it to slide down
+  &.fade .modal-dialog {
+    @include translate(0, -25%);
+    @include transition-transform(0.3s ease-out);
+  }
+  &.in .modal-dialog { @include translate(0, 0); }
+}
+.modal-open .modal {
+  overflow-x: hidden;
+  overflow-y: auto;
+}
+
+// Shell div to position the modal with bottom padding
+.modal-dialog {
+  position: relative;
+  width: auto;
+  margin: 10px;
+}
+
+// Actual modal
+.modal-content {
+  position: relative;
+  background-color: $modal-content-bg;
+  background-clip: padding-box;
+  border: 1px solid $modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
+  border: 1px solid $modal-content-border-color;
+  border-radius: $border-radius-large;
+  @include box-shadow(0 3px 9px rgba(0, 0, 0, .5));
+  // Remove focus outline from opened modal
+  outline: 0;
+}
+
+// Modal background
+.modal-backdrop {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  z-index: $zindex-modal-background;
+  background-color: $modal-backdrop-bg;
+  // Fade for backdrop
+  &.fade { @include opacity(0); }
+  &.in { @include opacity($modal-backdrop-opacity); }
+}
+
+// Modal header
+// Top section of the modal w/ title and dismiss
+.modal-header {
+  padding: $modal-title-padding;
+  border-bottom: 1px solid $modal-header-border-color;
+  @include clearfix;
+}
+// Close icon
+.modal-header .close {
+  margin-top: -2px;
+}
+
+// Title text within header
+.modal-title {
+  margin: 0;
+  line-height: $modal-title-line-height;
+}
+
+// Modal body
+// Where all modal content resides (sibling of .modal-header and .modal-footer)
+.modal-body {
+  position: relative;
+  padding: $modal-inner-padding;
+}
+
+// Footer (for actions)
+.modal-footer {
+  padding: $modal-inner-padding;
+  text-align: right; // right align buttons
+  border-top: 1px solid $modal-footer-border-color;
+  @include clearfix; // clear it in case folks use .pull-* classes on buttons
+
+  // Properly space out buttons
+  .btn + .btn {
+    margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
+    margin-left: 5px;
+  }
+  // but override that for button groups
+  .btn-group .btn + .btn {
+    margin-left: -1px;
+  }
+  // and override it for block buttons as well
+  .btn-block + .btn-block {
+    margin-left: 0;
+  }
+}
+
+// Measure scrollbar width for padding body during modal show/hide
+.modal-scrollbar-measure {
+  position: absolute;
+  top: -9999px;
+  width: 50px;
+  height: 50px;
+  overflow: scroll;
+}
+
+// Scale up the modal
+@media (min-width: $screen-sm-min) {
+  // Automatically set modal's width for larger viewports
+  .modal-dialog {
+    width: $modal-md;
+    margin: 30px auto;
+  }
+  .modal-content {
+    @include box-shadow(0 5px 15px rgba(0, 0, 0, .5));
+  }
+
+  // Modal sizes
+  .modal-sm { width: $modal-sm; }
+}
+
+@media (min-width: $screen-md-min) {
+  .modal-lg { width: $modal-lg; }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_navbar.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_navbar.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5d9093a93c974222f6f0217bd627d0c85cdf0950
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_navbar.scss
@@ -0,0 +1,656 @@
+//
+// Navbars
+// --------------------------------------------------
+
+
+// Wrapper and base class
+//
+// Provide a static navbar from which we expand to create full-width, fixed, and
+// other navbar variations.
+
+.navbar {
+  position: relative;
+  min-height: $navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)
+  margin-bottom: $navbar-margin-bottom;
+  border: 1px solid transparent;
+
+  // Prevent floats from breaking the navbar
+  @include clearfix;
+
+  @media (min-width: $grid-float-breakpoint) {
+    border-radius: $navbar-border-radius;
+  }
+}
+
+
+// Navbar heading
+//
+// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
+// styling of responsive aspects.
+
+.navbar-header {
+  @include clearfix;
+
+  @media (min-width: $grid-float-breakpoint) {
+    float: left;
+  }
+}
+
+
+// Navbar collapse (body)
+//
+// Group your navbar content into this for easy collapsing and expanding across
+// various device sizes. By default, this content is collapsed when <768px, but
+// will expand past that for a horizontal display.
+//
+// To start (on mobile devices) the navbar links, forms, and buttons are stacked
+// vertically and include a `max-height` to overflow in case you have too much
+// content for the user's viewport.
+
+.navbar-collapse {
+  padding-right: $navbar-padding-horizontal;
+  padding-left: $navbar-padding-horizontal;
+  overflow-x: visible;
+  border-top: 1px solid transparent;
+  box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
+  @include clearfix;
+  -webkit-overflow-scrolling: touch;
+
+  &.in {
+    overflow-y: auto;
+  }
+
+  @media (min-width: $grid-float-breakpoint) {
+    width: auto;
+    border-top: 0;
+    box-shadow: none;
+
+    &.collapse {
+      display: block !important;
+      height: auto !important;
+      padding-bottom: 0; // Override default setting
+      overflow: visible !important;
+    }
+
+    &.in {
+      overflow-y: visible;
+    }
+
+    // Undo the collapse side padding for navbars with containers to ensure
+    // alignment of right-aligned contents.
+    .navbar-fixed-top &,
+    .navbar-static-top &,
+    .navbar-fixed-bottom & {
+      padding-right: 0;
+      padding-left: 0;
+    }
+  }
+}
+
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  .navbar-collapse {
+    max-height: $navbar-collapse-max-height;
+
+    @media (max-device-width: $screen-xs-min) and (orientation: landscape) {
+      max-height: 200px;
+    }
+  }
+
+  // Fix the top/bottom navbars when screen real estate supports it
+  position: fixed;
+  right: 0;
+  left: 0;
+  z-index: $zindex-navbar-fixed;
+
+  // Undo the rounded corners
+  @media (min-width: $grid-float-breakpoint) {
+    border-radius: 0;
+  }
+}
+
+.navbar-fixed-top {
+  top: 0;
+  border-width: 0 0 1px;
+}
+.navbar-fixed-bottom {
+  bottom: 0;
+  margin-bottom: 0; // override .navbar defaults
+  border-width: 1px 0 0;
+}
+
+
+// Both navbar header and collapse
+//
+// When a container is present, change the behavior of the header and collapse.
+
+.container,
+.container-fluid {
+  > .navbar-header,
+  > .navbar-collapse {
+    margin-right: -$navbar-padding-horizontal;
+    margin-left: -$navbar-padding-horizontal;
+
+    @media (min-width: $grid-float-breakpoint) {
+      margin-right: 0;
+      margin-left: 0;
+    }
+  }
+}
+
+
+//
+// Navbar alignment options
+//
+// Display the navbar across the entirety of the page or fixed it to the top or
+// bottom of the page.
+
+// Static top (unfixed, but 100% wide) navbar
+.navbar-static-top {
+  z-index: $zindex-navbar;
+  border-width: 0 0 1px;
+
+  @media (min-width: $grid-float-breakpoint) {
+    border-radius: 0;
+  }
+}
+
+
+// Brand/project name
+
+.navbar-brand {
+  float: left;
+  height: $navbar-height;
+  padding: $navbar-padding-vertical $navbar-padding-horizontal;
+  font-size: $font-size-large;
+  line-height: $line-height-computed;
+
+  &:hover,
+  &:focus {
+    text-decoration: none;
+  }
+
+  > img {
+    display: block;
+  }
+
+  @media (min-width: $grid-float-breakpoint) {
+    .navbar > .container &,
+    .navbar > .container-fluid & {
+      margin-left: -$navbar-padding-horizontal;
+    }
+  }
+}
+
+
+// Navbar toggle
+//
+// Custom button for toggling the `.navbar-collapse`, powered by the collapse
+// JavaScript plugin.
+
+.navbar-toggle {
+  position: relative;
+  float: right;
+  padding: 9px 10px;
+  margin-right: $navbar-padding-horizontal;
+  @include navbar-vertical-align(34px);
+  background-color: transparent;
+  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+  border: 1px solid transparent;
+  border-radius: $border-radius-base;
+
+  // We remove the `outline` here, but later compensate by attaching `:hover`
+  // styles to `:focus`.
+  &:focus {
+    outline: 0;
+  }
+
+  // Bars
+  .icon-bar {
+    display: block;
+    width: 22px;
+    height: 2px;
+    border-radius: 1px;
+  }
+  .icon-bar + .icon-bar {
+    margin-top: 4px;
+  }
+
+  @media (min-width: $grid-float-breakpoint) {
+    display: none;
+  }
+}
+
+
+// Navbar nav links
+//
+// Builds on top of the `.nav` components with its own modifier class to make
+// the nav the full height of the horizontal nav (above 768px).
+
+.navbar-nav {
+  margin: ($navbar-padding-vertical / 2) (-$navbar-padding-horizontal);
+
+  > li > a {
+    padding-top: 10px;
+    padding-bottom: 10px;
+    line-height: $line-height-computed;
+  }
+
+  @media (max-width: $grid-float-breakpoint-max) {
+    // Dropdowns get custom display when collapsed
+    .open .dropdown-menu {
+      position: static;
+      float: none;
+      width: auto;
+      margin-top: 0;
+      background-color: transparent;
+      border: 0;
+      box-shadow: none;
+      > li > a,
+      .dropdown-header {
+        padding: 5px 15px 5px 25px;
+      }
+      > li > a {
+        line-height: $line-height-computed;
+        &:hover,
+        &:focus {
+          background-image: none;
+        }
+      }
+    }
+  }
+
+  // Uncollapse the nav
+  @media (min-width: $grid-float-breakpoint) {
+    float: left;
+    margin: 0;
+
+    > li {
+      float: left;
+      > a {
+        padding-top: $navbar-padding-vertical;
+        padding-bottom: $navbar-padding-vertical;
+      }
+    }
+  }
+}
+
+
+// Navbar form
+//
+// Extension of the `.form-inline` with some extra flavor for optimum display in
+// our navbars.
+
+.navbar-form {
+  padding: 10px $navbar-padding-horizontal;
+  margin-right: -$navbar-padding-horizontal;
+  margin-left: -$navbar-padding-horizontal;
+  border-top: 1px solid transparent;
+  border-bottom: 1px solid transparent;
+  $shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
+  @include box-shadow($shadow);
+
+  // Mixin behavior for optimum display
+  @include form-inline;
+
+  .form-group {
+    @media (max-width: $grid-float-breakpoint-max) {
+      margin-bottom: 5px;
+
+      &:last-child {
+        margin-bottom: 0;
+      }
+    }
+  }
+
+  // Vertically center in expanded, horizontal navbar
+  @include navbar-vertical-align($input-height-base);
+
+  // Undo 100% width for pull classes
+  @media (min-width: $grid-float-breakpoint) {
+    width: auto;
+    padding-top: 0;
+    padding-bottom: 0;
+    margin-right: 0;
+    margin-left: 0;
+    border: 0;
+    @include box-shadow(none);
+  }
+}
+
+
+// Dropdown menus
+
+// Menu position and menu carets
+.navbar-nav > li > .dropdown-menu {
+  margin-top: 0;
+  @include border-top-radius(0);
+}
+// Menu position and menu caret support for dropups via extra dropup class
+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
+  margin-bottom: 0;
+  @include border-top-radius($navbar-border-radius);
+  @include border-bottom-radius(0);
+}
+
+
+// Buttons in navbars
+//
+// Vertically center a button within a navbar (when *not* in a form).
+
+.navbar-btn {
+  @include navbar-vertical-align($input-height-base);
+
+  &.btn-sm {
+    @include navbar-vertical-align($input-height-small);
+  }
+  &.btn-xs {
+    @include navbar-vertical-align(22);
+  }
+}
+
+
+// Text in navbars
+//
+// Add a class to make any element properly align itself vertically within the navbars.
+
+.navbar-text {
+  @include navbar-vertical-align($line-height-computed);
+
+  @media (min-width: $grid-float-breakpoint) {
+    float: left;
+    margin-right: $navbar-padding-horizontal;
+    margin-left: $navbar-padding-horizontal;
+  }
+}
+
+
+// Component alignment
+//
+// Repurpose the pull utilities as their own navbar utilities to avoid specificity
+// issues with parents and chaining. Only do this when the navbar is uncollapsed
+// though so that navbar contents properly stack and align in mobile.
+//
+// Declared after the navbar components to ensure more specificity on the margins.
+
+@media (min-width: $grid-float-breakpoint) {
+  .navbar-left {
+    float: left !important;
+  }
+  .navbar-right {
+    float: right !important;
+  margin-right: -$navbar-padding-horizontal;
+
+    ~ .navbar-right {
+      margin-right: 0;
+    }
+  }
+}
+
+
+// Alternate navbars
+// --------------------------------------------------
+
+// Default navbar
+.navbar-default {
+  background-color: $navbar-default-bg;
+  border-color: $navbar-default-border;
+
+  .navbar-brand {
+    color: $navbar-default-brand-color;
+    &:hover,
+    &:focus {
+      color: $navbar-default-brand-hover-color;
+      background-color: $navbar-default-brand-hover-bg;
+    }
+  }
+
+  .navbar-text {
+    color: $navbar-default-color;
+  }
+
+  .navbar-nav {
+    > li > a {
+      color: $navbar-default-link-color;
+
+      &:hover,
+      &:focus {
+        color: $navbar-default-link-hover-color;
+        background-color: $navbar-default-link-hover-bg;
+      }
+    }
+    > .active > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-default-link-active-color;
+        background-color: $navbar-default-link-active-bg;
+      }
+    }
+    > .disabled > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-default-link-disabled-color;
+        background-color: $navbar-default-link-disabled-bg;
+      }
+    }
+
+    // Dropdown menu items
+    // Remove background color from open dropdown
+    > .open > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-default-link-active-color;
+        background-color: $navbar-default-link-active-bg;
+      }
+    }
+
+    @media (max-width: $grid-float-breakpoint-max) {
+      // Dropdowns get custom display when collapsed
+      .open .dropdown-menu {
+        > li > a {
+          color: $navbar-default-link-color;
+          &:hover,
+          &:focus {
+            color: $navbar-default-link-hover-color;
+            background-color: $navbar-default-link-hover-bg;
+          }
+        }
+        > .active > a {
+          &,
+          &:hover,
+          &:focus {
+            color: $navbar-default-link-active-color;
+            background-color: $navbar-default-link-active-bg;
+          }
+        }
+        > .disabled > a {
+          &,
+          &:hover,
+          &:focus {
+            color: $navbar-default-link-disabled-color;
+            background-color: $navbar-default-link-disabled-bg;
+          }
+        }
+      }
+    }
+  }
+
+  .navbar-toggle {
+    border-color: $navbar-default-toggle-border-color;
+    &:hover,
+    &:focus {
+      background-color: $navbar-default-toggle-hover-bg;
+    }
+    .icon-bar {
+      background-color: $navbar-default-toggle-icon-bar-bg;
+    }
+  }
+
+  .navbar-collapse,
+  .navbar-form {
+    border-color: $navbar-default-border;
+  }
+
+
+  // Links in navbars
+  //
+  // Add a class to ensure links outside the navbar nav are colored correctly.
+
+  .navbar-link {
+    color: $navbar-default-link-color;
+    &:hover {
+      color: $navbar-default-link-hover-color;
+    }
+  }
+
+  .btn-link {
+    color: $navbar-default-link-color;
+    &:hover,
+    &:focus {
+      color: $navbar-default-link-hover-color;
+    }
+    &[disabled],
+    fieldset[disabled] & {
+      &:hover,
+      &:focus {
+        color: $navbar-default-link-disabled-color;
+      }
+    }
+  }
+}
+
+// Inverse navbar
+
+.navbar-inverse {
+  background-color: $navbar-inverse-bg;
+  border-color: $navbar-inverse-border;
+
+  .navbar-brand {
+    color: $navbar-inverse-brand-color;
+    &:hover,
+    &:focus {
+      color: $navbar-inverse-brand-hover-color;
+      background-color: $navbar-inverse-brand-hover-bg;
+    }
+  }
+
+  .navbar-text {
+    color: $navbar-inverse-color;
+  }
+
+  .navbar-nav {
+    > li > a {
+      color: $navbar-inverse-link-color;
+
+      &:hover,
+      &:focus {
+        color: $navbar-inverse-link-hover-color;
+        background-color: $navbar-inverse-link-hover-bg;
+      }
+    }
+    > .active > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-inverse-link-active-color;
+        background-color: $navbar-inverse-link-active-bg;
+      }
+    }
+    > .disabled > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-inverse-link-disabled-color;
+        background-color: $navbar-inverse-link-disabled-bg;
+      }
+    }
+
+    // Dropdowns
+    > .open > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $navbar-inverse-link-active-color;
+        background-color: $navbar-inverse-link-active-bg;
+      }
+    }
+
+    @media (max-width: $grid-float-breakpoint-max) {
+      // Dropdowns get custom display
+      .open .dropdown-menu {
+        > .dropdown-header {
+          border-color: $navbar-inverse-border;
+        }
+        .divider {
+          background-color: $navbar-inverse-border;
+        }
+        > li > a {
+          color: $navbar-inverse-link-color;
+          &:hover,
+          &:focus {
+            color: $navbar-inverse-link-hover-color;
+            background-color: $navbar-inverse-link-hover-bg;
+          }
+        }
+        > .active > a {
+          &,
+          &:hover,
+          &:focus {
+            color: $navbar-inverse-link-active-color;
+            background-color: $navbar-inverse-link-active-bg;
+          }
+        }
+        > .disabled > a {
+          &,
+          &:hover,
+          &:focus {
+            color: $navbar-inverse-link-disabled-color;
+            background-color: $navbar-inverse-link-disabled-bg;
+          }
+        }
+      }
+    }
+  }
+
+  // Darken the responsive nav toggle
+  .navbar-toggle {
+    border-color: $navbar-inverse-toggle-border-color;
+    &:hover,
+    &:focus {
+      background-color: $navbar-inverse-toggle-hover-bg;
+    }
+    .icon-bar {
+      background-color: $navbar-inverse-toggle-icon-bar-bg;
+    }
+  }
+
+  .navbar-collapse,
+  .navbar-form {
+    border-color: darken($navbar-inverse-bg, 7%);
+  }
+
+  .navbar-link {
+    color: $navbar-inverse-link-color;
+    &:hover {
+      color: $navbar-inverse-link-hover-color;
+    }
+  }
+
+  .btn-link {
+    color: $navbar-inverse-link-color;
+    &:hover,
+    &:focus {
+      color: $navbar-inverse-link-hover-color;
+    }
+    &[disabled],
+    fieldset[disabled] & {
+      &:hover,
+      &:focus {
+        color: $navbar-inverse-link-disabled-color;
+      }
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_navs.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_navs.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f4f0a55bae910c8f57437da8a186d1ea4f877713
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_navs.scss
@@ -0,0 +1,242 @@
+//
+// Navs
+// --------------------------------------------------
+
+
+// Base class
+// --------------------------------------------------
+
+.nav {
+  padding-left: 0; // Override default ul/ol
+  margin-bottom: 0;
+  list-style: none;
+  @include clearfix;
+
+  > li {
+    position: relative;
+    display: block;
+
+    > a {
+      position: relative;
+      display: block;
+      padding: $nav-link-padding;
+      &:hover,
+      &:focus {
+        text-decoration: none;
+        background-color: $nav-link-hover-bg;
+      }
+    }
+
+    // Disabled state sets text to gray and nukes hover/tab effects
+    &.disabled > a {
+      color: $nav-disabled-link-color;
+
+      &:hover,
+      &:focus {
+        color: $nav-disabled-link-hover-color;
+        text-decoration: none;
+        cursor: $cursor-disabled;
+        background-color: transparent;
+      }
+    }
+  }
+
+  // Open dropdowns
+  .open > a {
+    &,
+    &:hover,
+    &:focus {
+      background-color: $nav-link-hover-bg;
+      border-color: $link-color;
+    }
+  }
+
+  // Nav dividers (deprecated with v3.0.1)
+  //
+  // This should have been removed in v3 with the dropping of `.nav-list`, but
+  // we missed it. We don't currently support this anywhere, but in the interest
+  // of maintaining backward compatibility in case you use it, it's deprecated.
+  .nav-divider {
+    @include nav-divider;
+  }
+
+  // Prevent IE8 from misplacing imgs
+  //
+  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
+  > li > a > img {
+    max-width: none;
+  }
+}
+
+
+// Tabs
+// -------------------------
+
+// Give the tabs something to sit on
+.nav-tabs {
+  border-bottom: 1px solid $nav-tabs-border-color;
+  > li {
+    float: left;
+    // Make the list-items overlay the bottom border
+    margin-bottom: -1px;
+
+    // Actual tabs (as links)
+    > a {
+      margin-right: 2px;
+      line-height: $line-height-base;
+      border: 1px solid transparent;
+      border-radius: $border-radius-base $border-radius-base 0 0;
+      &:hover {
+        border-color: $nav-tabs-link-hover-border-color $nav-tabs-link-hover-border-color $nav-tabs-border-color;
+      }
+    }
+
+    // Active state, and its :hover to override normal :hover
+    &.active > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $nav-tabs-active-link-hover-color;
+        cursor: default;
+        background-color: $nav-tabs-active-link-hover-bg;
+        border: 1px solid $nav-tabs-active-link-hover-border-color;
+        border-bottom-color: transparent;
+      }
+    }
+  }
+  // pulling this in mainly for less shorthand
+  &.nav-justified {
+    @extend .nav-justified;
+    @extend .nav-tabs-justified;
+  }
+}
+
+
+// Pills
+// -------------------------
+.nav-pills {
+  > li {
+    float: left;
+
+    // Links rendered as pills
+    > a {
+      border-radius: $nav-pills-border-radius;
+    }
+    + li {
+      margin-left: 2px;
+    }
+
+    // Active state
+    &.active > a {
+      &,
+      &:hover,
+      &:focus {
+        color: $nav-pills-active-link-hover-color;
+        background-color: $nav-pills-active-link-hover-bg;
+      }
+    }
+  }
+}
+
+
+// Stacked pills
+.nav-stacked {
+  > li {
+    float: none;
+    + li {
+      margin-top: 2px;
+      margin-left: 0; // no need for this gap between nav items
+    }
+  }
+}
+
+
+// Nav variations
+// --------------------------------------------------
+
+// Justified nav links
+// -------------------------
+
+.nav-justified {
+  width: 100%;
+
+  > li {
+    float: none;
+    > a {
+      margin-bottom: 5px;
+      text-align: center;
+    }
+  }
+
+  > .dropdown .dropdown-menu {
+    top: auto;
+    left: auto;
+  }
+
+  @media (min-width: $screen-sm-min) {
+    > li {
+      display: table-cell;
+      width: 1%;
+      > a {
+        margin-bottom: 0;
+      }
+    }
+  }
+}
+
+// Move borders to anchors instead of bottom of list
+//
+// Mixin for adding on top the shared `.nav-justified` styles for our tabs
+.nav-tabs-justified {
+  border-bottom: 0;
+
+  > li > a {
+    // Override margin from .nav-tabs
+    margin-right: 0;
+    border-radius: $border-radius-base;
+  }
+
+  > .active > a,
+  > .active > a:hover,
+  > .active > a:focus {
+    border: 1px solid $nav-tabs-justified-link-border-color;
+  }
+
+  @media (min-width: $screen-sm-min) {
+    > li > a {
+      border-bottom: 1px solid $nav-tabs-justified-link-border-color;
+      border-radius: $border-radius-base $border-radius-base 0 0;
+    }
+    > .active > a,
+    > .active > a:hover,
+    > .active > a:focus {
+      border-bottom-color: $nav-tabs-justified-active-link-border-color;
+    }
+  }
+}
+
+
+// Tabbable tabs
+// -------------------------
+
+// Hide tabbable panes to start, show them when `.active`
+.tab-content {
+  > .tab-pane {
+    display: none;
+  }
+  > .active {
+    display: block;
+  }
+}
+
+
+// Dropdowns
+// -------------------------
+
+// Specific dropdowns
+.nav-tabs .dropdown-menu {
+  // make dropdown border overlap tab border
+  margin-top: -1px;
+  // Remove the top rounded corners here since there is a hard edge above the menu
+  @include border-top-radius(0);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_normalize.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_normalize.scss
new file mode 100644
index 0000000000000000000000000000000000000000..7850b9a41e95acd4b87130a934e955e6ee65ca2f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_normalize.scss
@@ -0,0 +1,427 @@
+/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */
+
+//
+// 1. Set default font family to sans-serif.
+// 2. Prevent iOS and IE text size adjust after device orientation change,
+//    without disabling user zoom.
+//
+
+html {
+  font-family: sans-serif; // 1
+  -ms-text-size-adjust: 100%; // 2
+  -webkit-text-size-adjust: 100%; // 2
+}
+
+//
+// Remove default margin.
+//
+
+body {
+  margin: 0;
+}
+
+// HTML5 display definitions
+// ==========================================================================
+
+//
+// Correct `block` display not defined for any HTML5 element in IE 8/9.
+// Correct `block` display not defined for `details` or `summary` in IE 10/11
+// and Firefox.
+// Correct `block` display not defined for `main` in IE 11.
+//
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+main,
+menu,
+nav,
+section,
+summary {
+  display: block;
+}
+
+//
+// 1. Correct `inline-block` display not defined in IE 8/9.
+// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.
+//
+
+audio,
+canvas,
+progress,
+video {
+  display: inline-block; // 1
+  vertical-align: baseline; // 2
+}
+
+//
+// Prevent modern browsers from displaying `audio` without controls.
+// Remove excess height in iOS 5 devices.
+//
+
+audio:not([controls]) {
+  display: none;
+  height: 0;
+}
+
+//
+// Address `[hidden]` styling not present in IE 8/9/10.
+// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.
+//
+
+[hidden],
+template {
+  display: none;
+}
+
+// Links
+// ==========================================================================
+
+//
+// Remove the gray background color from active links in IE 10.
+//
+
+a {
+  background-color: transparent;
+}
+
+//
+// Improve readability of focused elements when they are also in an
+// active/hover state.
+//
+
+a:active,
+a:hover {
+  outline: 0;
+}
+
+// Text-level semantics
+// ==========================================================================
+
+//
+// 1. Remove the bottom border in Chrome 57- and Firefox 39-.
+// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+//
+
+abbr[title] {
+  border-bottom: none; // 1
+  text-decoration: underline; // 2
+  text-decoration: underline dotted; // 2
+}
+
+//
+// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.
+//
+
+b,
+strong {
+  font-weight: bold;
+}
+
+//
+// Address styling not present in Safari and Chrome.
+//
+
+dfn {
+  font-style: italic;
+}
+
+//
+// Address variable `h1` font-size and margin within `section` and `article`
+// contexts in Firefox 4+, Safari, and Chrome.
+//
+
+h1 {
+  font-size: 2em;
+  margin: 0.67em 0;
+}
+
+//
+// Address styling not present in IE 8/9.
+//
+
+mark {
+  background: #ff0;
+  color: #000;
+}
+
+//
+// Address inconsistent and variable font size in all browsers.
+//
+
+small {
+  font-size: 80%;
+}
+
+//
+// Prevent `sub` and `sup` affecting `line-height` in all browsers.
+//
+
+sub,
+sup {
+  font-size: 75%;
+  line-height: 0;
+  position: relative;
+  vertical-align: baseline;
+}
+
+sup {
+  top: -0.5em;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+// Embedded content
+// ==========================================================================
+
+//
+// Remove border when inside `a` element in IE 8/9/10.
+//
+
+img {
+  border: 0;
+}
+
+//
+// Correct overflow not hidden in IE 9/10/11.
+//
+
+svg:not(:root) {
+  overflow: hidden;
+}
+
+// Grouping content
+// ==========================================================================
+
+//
+// Address margin not present in IE 8/9 and Safari.
+//
+
+figure {
+  margin: 1em 40px;
+}
+
+//
+// Address differences between Firefox and other browsers.
+//
+
+hr {
+  box-sizing: content-box;
+  height: 0;
+}
+
+//
+// Contain overflow in all browsers.
+//
+
+pre {
+  overflow: auto;
+}
+
+//
+// Address odd `em`-unit font size rendering in all browsers.
+//
+
+code,
+kbd,
+pre,
+samp {
+  font-family: monospace, monospace;
+  font-size: 1em;
+}
+
+// Forms
+// ==========================================================================
+
+//
+// Known limitation: by default, Chrome and Safari on OS X allow very limited
+// styling of `select`, unless a `border` property is set.
+//
+
+//
+// 1. Correct color not being inherited.
+//    Known issue: affects color of disabled elements.
+// 2. Correct font properties not being inherited.
+// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.
+//
+
+button,
+input,
+optgroup,
+select,
+textarea {
+  color: inherit; // 1
+  font: inherit; // 2
+  margin: 0; // 3
+}
+
+//
+// Address `overflow` set to `hidden` in IE 8/9/10/11.
+//
+
+button {
+  overflow: visible;
+}
+
+//
+// Address inconsistent `text-transform` inheritance for `button` and `select`.
+// All other form control elements do not inherit `text-transform` values.
+// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.
+// Correct `select` style inheritance in Firefox.
+//
+
+button,
+select {
+  text-transform: none;
+}
+
+//
+// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
+//    and `video` controls.
+// 2. Correct inability to style clickable `input` types in iOS.
+// 3. Improve usability and consistency of cursor style between image-type
+//    `input` and others.
+//
+
+button,
+html input[type="button"], // 1
+input[type="reset"],
+input[type="submit"] {
+  -webkit-appearance: button; // 2
+  cursor: pointer; // 3
+}
+
+//
+// Re-set default cursor for disabled elements.
+//
+
+button[disabled],
+html input[disabled] {
+  cursor: default;
+}
+
+//
+// Remove inner padding and border in Firefox 4+.
+//
+
+button::-moz-focus-inner,
+input::-moz-focus-inner {
+  border: 0;
+  padding: 0;
+}
+
+//
+// Address Firefox 4+ setting `line-height` on `input` using `!important` in
+// the UA stylesheet.
+//
+
+input {
+  line-height: normal;
+}
+
+//
+// It's recommended that you don't attempt to style these elements.
+// Firefox's implementation doesn't respect box-sizing, padding, or width.
+//
+// 1. Address box sizing set to `content-box` in IE 8/9/10.
+// 2. Remove excess padding in IE 8/9/10.
+//
+
+input[type="checkbox"],
+input[type="radio"] {
+  box-sizing: border-box; // 1
+  padding: 0; // 2
+}
+
+//
+// Fix the cursor style for Chrome's increment/decrement buttons. For certain
+// `font-size` values of the `input`, it causes the cursor style of the
+// decrement button to change from `default` to `text`.
+//
+
+input[type="number"]::-webkit-inner-spin-button,
+input[type="number"]::-webkit-outer-spin-button {
+  height: auto;
+}
+
+//
+// 1. Address `appearance` set to `searchfield` in Safari and Chrome.
+// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
+//
+
+input[type="search"] {
+  -webkit-appearance: textfield; // 1
+  box-sizing: content-box; //2
+}
+
+//
+// Remove inner padding and search cancel button in Safari and Chrome on OS X.
+// Safari (but not Chrome) clips the cancel button when the search input has
+// padding (and `textfield` appearance).
+//
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+//
+// Define consistent border, margin, and padding.
+//
+
+fieldset {
+  border: 1px solid #c0c0c0;
+  margin: 0 2px;
+  padding: 0.35em 0.625em 0.75em;
+}
+
+//
+// 1. Correct `color` not being inherited in IE 8/9/10/11.
+// 2. Remove padding so people aren't caught out if they zero out fieldsets.
+//
+
+legend {
+  border: 0; // 1
+  padding: 0; // 2
+}
+
+//
+// Remove default vertical scrollbar in IE 8/9/10/11.
+//
+
+textarea {
+  overflow: auto;
+}
+
+//
+// Don't inherit the `font-weight` (applied by a rule above).
+// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.
+//
+
+optgroup {
+  font-weight: bold;
+}
+
+// Tables
+// ==========================================================================
+
+//
+// Remove most spacing between table cells.
+//
+
+table {
+  border-collapse: collapse;
+  border-spacing: 0;
+}
+
+td,
+th {
+  padding: 0;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_pager.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_pager.scss
new file mode 100644
index 0000000000000000000000000000000000000000..07622389e9d4d97d55569363ea9d83403a52572a
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_pager.scss
@@ -0,0 +1,54 @@
+//
+// Pager pagination
+// --------------------------------------------------
+
+
+.pager {
+  padding-left: 0;
+  margin: $line-height-computed 0;
+  text-align: center;
+  list-style: none;
+  @include clearfix;
+  li {
+    display: inline;
+    > a,
+    > span {
+      display: inline-block;
+      padding: 5px 14px;
+      background-color: $pager-bg;
+      border: 1px solid $pager-border;
+      border-radius: $pager-border-radius;
+    }
+
+    > a:hover,
+    > a:focus {
+      text-decoration: none;
+      background-color: $pager-hover-bg;
+    }
+  }
+
+  .next {
+    > a,
+    > span {
+      float: right;
+    }
+  }
+
+  .previous {
+    > a,
+    > span {
+      float: left;
+    }
+  }
+
+  .disabled {
+    > a,
+    > a:hover,
+    > a:focus,
+    > span {
+      color: $pager-disabled-color;
+      cursor: $cursor-disabled;
+      background-color: $pager-bg;
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_pagination.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_pagination.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c53082877eaeea4462d85815565e2c557a27394f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_pagination.scss
@@ -0,0 +1,86 @@
+//
+// Pagination (multiple pages)
+// --------------------------------------------------
+.pagination {
+  display: inline-block;
+  padding-left: 0;
+  margin: $line-height-computed 0;
+  border-radius: $border-radius-base;
+
+  > li {
+    display: inline; // Remove list-style and block-level defaults
+    > a,
+    > span {
+      position: relative;
+      float: left; // Collapse white-space
+      padding: $padding-base-vertical $padding-base-horizontal;
+      margin-left: -1px;
+      line-height: $line-height-base;
+      color: $pagination-color;
+      text-decoration: none;
+      background-color: $pagination-bg;
+      border: 1px solid $pagination-border;
+
+      &:hover,
+      &:focus {
+        z-index: 2;
+        color: $pagination-hover-color;
+        background-color: $pagination-hover-bg;
+        border-color: $pagination-hover-border;
+      }
+    }
+    &:first-child {
+      > a,
+      > span {
+        margin-left: 0;
+        @include border-left-radius($border-radius-base);
+      }
+    }
+    &:last-child {
+      > a,
+      > span {
+        @include border-right-radius($border-radius-base);
+      }
+    }
+  }
+
+  > .active > a,
+  > .active > span {
+    &,
+    &:hover,
+    &:focus {
+      z-index: 3;
+      color: $pagination-active-color;
+      cursor: default;
+      background-color: $pagination-active-bg;
+      border-color: $pagination-active-border;
+    }
+  }
+
+  > .disabled {
+    > span,
+    > span:hover,
+    > span:focus,
+    > a,
+    > a:hover,
+    > a:focus {
+      color: $pagination-disabled-color;
+      cursor: $cursor-disabled;
+      background-color: $pagination-disabled-bg;
+      border-color: $pagination-disabled-border;
+    }
+  }
+}
+
+// Sizing
+// --------------------------------------------------
+
+// Large
+.pagination-lg {
+  @include pagination-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $border-radius-large);
+}
+
+// Small
+.pagination-sm {
+  @include pagination-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $border-radius-small);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_panels.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_panels.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8947ed254e432c122f0d17d18914e33b65c756c4
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_panels.scss
@@ -0,0 +1,271 @@
+//
+// Panels
+// --------------------------------------------------
+
+
+// Base class
+.panel {
+  margin-bottom: $line-height-computed;
+  background-color: $panel-bg;
+  border: 1px solid transparent;
+  border-radius: $panel-border-radius;
+  @include box-shadow(0 1px 1px rgba(0, 0, 0, .05));
+}
+
+// Panel contents
+.panel-body {
+  padding: $panel-body-padding;
+  @include clearfix;
+}
+
+// Optional heading
+.panel-heading {
+  padding: $panel-heading-padding;
+  border-bottom: 1px solid transparent;
+  @include border-top-radius(($panel-border-radius - 1));
+
+  > .dropdown .dropdown-toggle {
+    color: inherit;
+  }
+}
+
+// Within heading, strip any `h*` tag of its default margins for spacing.
+.panel-title {
+  margin-top: 0;
+  margin-bottom: 0;
+  font-size: ceil(($font-size-base * 1.125));
+  color: inherit;
+
+  > a,
+  > small,
+  > .small,
+  > small > a,
+  > .small > a {
+    color: inherit;
+  }
+}
+
+// Optional footer (stays gray in every modifier class)
+.panel-footer {
+  padding: $panel-footer-padding;
+  background-color: $panel-footer-bg;
+  border-top: 1px solid $panel-inner-border;
+  @include border-bottom-radius(($panel-border-radius - 1));
+}
+
+
+// List groups in panels
+//
+// By default, space out list group content from panel headings to account for
+// any kind of custom content between the two.
+
+.panel {
+  > .list-group,
+  > .panel-collapse > .list-group {
+    margin-bottom: 0;
+
+    .list-group-item {
+      border-width: 1px 0;
+      border-radius: 0;
+    }
+
+    // Add border top radius for first one
+    &:first-child {
+      .list-group-item:first-child {
+        border-top: 0;
+        @include border-top-radius(($panel-border-radius - 1));
+      }
+    }
+
+    // Add border bottom radius for last one
+    &:last-child {
+      .list-group-item:last-child {
+        border-bottom: 0;
+        @include border-bottom-radius(($panel-border-radius - 1));
+      }
+    }
+  }
+  > .panel-heading + .panel-collapse > .list-group {
+    .list-group-item:first-child {
+      @include border-top-radius(0);
+    }
+  }
+}
+// Collapse space between when there's no additional content.
+.panel-heading + .list-group {
+  .list-group-item:first-child {
+    border-top-width: 0;
+  }
+}
+.list-group + .panel-footer {
+  border-top-width: 0;
+}
+
+// Tables in panels
+//
+// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and
+// watch it go full width.
+
+.panel {
+  > .table,
+  > .table-responsive > .table,
+  > .panel-collapse > .table {
+    margin-bottom: 0;
+
+    caption {
+      padding-right: $panel-body-padding;
+      padding-left: $panel-body-padding;
+    }
+  }
+  // Add border top radius for first one
+  > .table:first-child,
+  > .table-responsive:first-child > .table:first-child {
+    @include border-top-radius(($panel-border-radius - 1));
+
+    > thead:first-child,
+    > tbody:first-child {
+      > tr:first-child {
+        border-top-left-radius: ($panel-border-radius - 1);
+        border-top-right-radius: ($panel-border-radius - 1);
+
+        td:first-child,
+        th:first-child {
+          border-top-left-radius: ($panel-border-radius - 1);
+        }
+        td:last-child,
+        th:last-child {
+          border-top-right-radius: ($panel-border-radius - 1);
+        }
+      }
+    }
+  }
+  // Add border bottom radius for last one
+  > .table:last-child,
+  > .table-responsive:last-child > .table:last-child {
+    @include border-bottom-radius(($panel-border-radius - 1));
+
+    > tbody:last-child,
+    > tfoot:last-child {
+      > tr:last-child {
+        border-bottom-right-radius: ($panel-border-radius - 1);
+        border-bottom-left-radius: ($panel-border-radius - 1);
+
+        td:first-child,
+        th:first-child {
+          border-bottom-left-radius: ($panel-border-radius - 1);
+        }
+        td:last-child,
+        th:last-child {
+          border-bottom-right-radius: ($panel-border-radius - 1);
+        }
+      }
+    }
+  }
+  > .panel-body + .table,
+  > .panel-body + .table-responsive,
+  > .table + .panel-body,
+  > .table-responsive + .panel-body {
+    border-top: 1px solid $table-border-color;
+  }
+  > .table > tbody:first-child > tr:first-child th,
+  > .table > tbody:first-child > tr:first-child td {
+    border-top: 0;
+  }
+  > .table-bordered,
+  > .table-responsive > .table-bordered {
+    border: 0;
+    > thead,
+    > tbody,
+    > tfoot {
+      > tr {
+        > th:first-child,
+        > td:first-child {
+          border-left: 0;
+        }
+        > th:last-child,
+        > td:last-child {
+          border-right: 0;
+        }
+      }
+    }
+    > thead,
+    > tbody {
+      > tr:first-child {
+        > td,
+        > th {
+          border-bottom: 0;
+        }
+      }
+    }
+    > tbody,
+    > tfoot {
+      > tr:last-child {
+        > td,
+        > th {
+          border-bottom: 0;
+        }
+      }
+    }
+  }
+  > .table-responsive {
+    margin-bottom: 0;
+    border: 0;
+  }
+}
+
+
+// Collapsible panels (aka, accordion)
+//
+// Wrap a series of panels in `.panel-group` to turn them into an accordion with
+// the help of our collapse JavaScript plugin.
+
+.panel-group {
+  margin-bottom: $line-height-computed;
+
+  // Tighten up margin so it's only between panels
+  .panel {
+    margin-bottom: 0;
+    border-radius: $panel-border-radius;
+
+    + .panel {
+      margin-top: 5px;
+    }
+  }
+
+  .panel-heading {
+    border-bottom: 0;
+
+    + .panel-collapse > .panel-body,
+    + .panel-collapse > .list-group {
+      border-top: 1px solid $panel-inner-border;
+    }
+  }
+
+  .panel-footer {
+    border-top: 0;
+    + .panel-collapse .panel-body {
+      border-bottom: 1px solid $panel-inner-border;
+    }
+  }
+}
+
+
+// Contextual variations
+.panel-default {
+  @include panel-variant($panel-default-border, $panel-default-text, $panel-default-heading-bg, $panel-default-border);
+}
+.panel-primary {
+  @include panel-variant($panel-primary-border, $panel-primary-text, $panel-primary-heading-bg, $panel-primary-border);
+}
+.panel-success {
+  @include panel-variant($panel-success-border, $panel-success-text, $panel-success-heading-bg, $panel-success-border);
+}
+.panel-info {
+  @include panel-variant($panel-info-border, $panel-info-text, $panel-info-heading-bg, $panel-info-border);
+}
+.panel-warning {
+  @include panel-variant($panel-warning-border, $panel-warning-text, $panel-warning-heading-bg, $panel-warning-border);
+}
+.panel-danger {
+  @include panel-variant($panel-danger-border, $panel-danger-text, $panel-danger-heading-bg, $panel-danger-border);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_popovers.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_popovers.scss
new file mode 100644
index 0000000000000000000000000000000000000000..6f83842280e02094e223eb7a4a51ae13539039ad
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_popovers.scss
@@ -0,0 +1,126 @@
+//
+// Popovers
+// --------------------------------------------------
+
+
+.popover {
+  position: absolute;
+  top: 0;
+  left: 0;
+  z-index: $zindex-popover;
+  display: none;
+  max-width: $popover-max-width;
+  padding: 1px;
+  // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.
+  // So reset our font and text properties to avoid inheriting weird values.
+  @include reset-text;
+  font-size: $font-size-base;
+  background-color: $popover-bg;
+  background-clip: padding-box;
+  border: 1px solid $popover-fallback-border-color;
+  border: 1px solid $popover-border-color;
+  border-radius: $border-radius-large;
+  @include box-shadow(0 5px 10px rgba(0, 0, 0, .2));
+
+  // Offset the popover to account for the popover arrow
+  &.top { margin-top: -$popover-arrow-width; }
+  &.right { margin-left: $popover-arrow-width; }
+  &.bottom { margin-top: $popover-arrow-width; }
+  &.left { margin-left: -$popover-arrow-width; }
+
+  // Arrows
+  // .arrow is outer, .arrow:after is inner
+  > .arrow {
+    border-width: $popover-arrow-outer-width;
+
+    &,
+    &:after {
+      position: absolute;
+      display: block;
+      width: 0;
+      height: 0;
+      border-color: transparent;
+      border-style: solid;
+    }
+
+    &:after {
+      content: "";
+      border-width: $popover-arrow-width;
+    }
+  }
+
+  &.top > .arrow {
+    bottom: -$popover-arrow-outer-width;
+    left: 50%;
+    margin-left: -$popover-arrow-outer-width;
+    border-top-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+    border-top-color: $popover-arrow-outer-color;
+    border-bottom-width: 0;
+    &:after {
+      bottom: 1px;
+      margin-left: -$popover-arrow-width;
+      content: " ";
+      border-top-color: $popover-arrow-color;
+      border-bottom-width: 0;
+    }
+  }
+  &.right > .arrow {
+    top: 50%;
+    left: -$popover-arrow-outer-width;
+    margin-top: -$popover-arrow-outer-width;
+    border-right-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+    border-right-color: $popover-arrow-outer-color;
+    border-left-width: 0;
+    &:after {
+      bottom: -$popover-arrow-width;
+      left: 1px;
+      content: " ";
+      border-right-color: $popover-arrow-color;
+      border-left-width: 0;
+    }
+  }
+  &.bottom > .arrow {
+    top: -$popover-arrow-outer-width;
+    left: 50%;
+    margin-left: -$popover-arrow-outer-width;
+    border-top-width: 0;
+    border-bottom-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+    border-bottom-color: $popover-arrow-outer-color;
+    &:after {
+      top: 1px;
+      margin-left: -$popover-arrow-width;
+      content: " ";
+      border-top-width: 0;
+      border-bottom-color: $popover-arrow-color;
+    }
+  }
+
+  &.left > .arrow {
+    top: 50%;
+    right: -$popover-arrow-outer-width;
+    margin-top: -$popover-arrow-outer-width;
+    border-right-width: 0;
+    border-left-color: $popover-arrow-outer-fallback-color; // IE8 fallback
+    border-left-color: $popover-arrow-outer-color;
+    &:after {
+      right: 1px;
+      bottom: -$popover-arrow-width;
+      content: " ";
+      border-right-width: 0;
+      border-left-color: $popover-arrow-color;
+    }
+  }
+}
+
+.popover-title {
+  padding: 8px 14px;
+  margin: 0; // reset heading margin
+  font-size: $font-size-base;
+  background-color: $popover-title-bg;
+  border-bottom: 1px solid darken($popover-title-bg, 5%);
+  border-radius: ($border-radius-large - 1) ($border-radius-large - 1) 0 0;
+}
+
+.popover-content {
+  padding: 9px 14px;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_print.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_print.scss
new file mode 100644
index 0000000000000000000000000000000000000000..564f304dd6c9e7b67184c34d69ff95229c70a09f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_print.scss
@@ -0,0 +1,99 @@
+/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
+
+// ==========================================================================
+// Print styles.
+// Inlined to avoid the additional HTTP request: h5bp.com/r
+// ==========================================================================
+
+@media print {
+  *,
+  *:before,
+  *:after {
+    color: #000 !important; // Black prints faster: h5bp.com/s
+    text-shadow: none !important;
+    background: transparent !important;
+    box-shadow: none !important;
+  }
+
+  a,
+  a:visited {
+    text-decoration: underline;
+  }
+
+  a[href]:after {
+    content: " (" attr(href) ")";
+  }
+
+  abbr[title]:after {
+    content: " (" attr(title) ")";
+  }
+
+  // Don't show links that are fragment identifiers,
+  // or use the `javascript:` pseudo protocol
+  a[href^="#"]:after,
+  a[href^="javascript:"]:after {
+    content: "";
+  }
+
+  pre,
+  blockquote {
+    border: 1px solid #999;
+    page-break-inside: avoid;
+  }
+
+  thead {
+    display: table-header-group; // h5bp.com/t
+  }
+
+  tr,
+  img {
+    page-break-inside: avoid;
+  }
+
+  img {
+    max-width: 100% !important;
+  }
+
+  p,
+  h2,
+  h3 {
+    orphans: 3;
+    widows: 3;
+  }
+
+  h2,
+  h3 {
+    page-break-after: avoid;
+  }
+
+  // Bootstrap specific changes start
+
+  // Bootstrap components
+  .navbar {
+    display: none;
+  }
+  .btn,
+  .dropup > .btn {
+    > .caret {
+      border-top-color: #000 !important;
+    }
+  }
+  .label {
+    border: 1px solid #000;
+  }
+
+  .table {
+    border-collapse: collapse !important;
+
+    td,
+    th {
+      background-color: #fff !important;
+    }
+  }
+  .table-bordered {
+    th,
+    td {
+      border: 1px solid #ddd !important;
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_progress-bars.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_progress-bars.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e7897dee630774516fd483781e4f02745c2f70b8
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_progress-bars.scss
@@ -0,0 +1,87 @@
+//
+// Progress bars
+// --------------------------------------------------
+
+
+// Bar animations
+// -------------------------
+
+// WebKit
+@-webkit-keyframes progress-bar-stripes {
+  from  { background-position: 40px 0; }
+  to    { background-position: 0 0; }
+}
+
+// Spec and IE10+
+@keyframes progress-bar-stripes {
+  from  { background-position: 40px 0; }
+  to    { background-position: 0 0; }
+}
+
+
+// Bar itself
+// -------------------------
+
+// Outer container
+.progress {
+  height: $line-height-computed;
+  margin-bottom: $line-height-computed;
+  overflow: hidden;
+  background-color: $progress-bg;
+  border-radius: $progress-border-radius;
+  @include box-shadow(inset 0 1px 2px rgba(0, 0, 0, .1));
+}
+
+// Bar of progress
+.progress-bar {
+  float: left;
+  width: 0%;
+  height: 100%;
+  font-size: $font-size-small;
+  line-height: $line-height-computed;
+  color: $progress-bar-color;
+  text-align: center;
+  background-color: $progress-bar-bg;
+  @include box-shadow(inset 0 -1px 0 rgba(0, 0, 0, .15));
+  @include transition(width .6s ease);
+}
+
+// Striped bars
+//
+// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the
+// `.progress-bar-striped` class, which you just add to an existing
+// `.progress-bar`.
+.progress-striped .progress-bar,
+.progress-bar-striped {
+  @include gradient-striped;
+  background-size: 40px 40px;
+}
+
+// Call animation for the active one
+//
+// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the
+// `.progress-bar.active` approach.
+.progress.active .progress-bar,
+.progress-bar.active {
+  @include animation(progress-bar-stripes 2s linear infinite);
+}
+
+
+// Variations
+// -------------------------
+
+.progress-bar-success {
+  @include progress-bar-variant($progress-bar-success-bg);
+}
+
+.progress-bar-info {
+  @include progress-bar-variant($progress-bar-info-bg);
+}
+
+.progress-bar-warning {
+  @include progress-bar-variant($progress-bar-warning-bg);
+}
+
+.progress-bar-danger {
+  @include progress-bar-variant($progress-bar-danger-bg);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_responsive-embed.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_responsive-embed.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5a0e0b88608e76c693b8be84c507b99a6060a00a
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_responsive-embed.scss
@@ -0,0 +1,35 @@
+// Embeds responsive
+//
+// Credit: Nicolas Gallagher and SUIT CSS.
+
+.embed-responsive {
+  position: relative;
+  display: block;
+  height: 0;
+  padding: 0;
+  overflow: hidden;
+
+  .embed-responsive-item,
+  iframe,
+  embed,
+  object,
+  video {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    border: 0;
+  }
+}
+
+// Modifier class for 16:9 aspect ratio
+.embed-responsive-16by9 {
+  padding-bottom: 56.25%;
+}
+
+// Modifier class for 4:3 aspect ratio
+.embed-responsive-4by3 {
+  padding-bottom: 75%;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_responsive-utilities.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_responsive-utilities.scss
new file mode 100644
index 0000000000000000000000000000000000000000..73641aae7fa67e6f498abb02ba8da59ca2f890f7
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_responsive-utilities.scss
@@ -0,0 +1,179 @@
+//
+// Responsive: Utility classes
+// --------------------------------------------------
+
+
+// IE10 in Windows (Phone) 8
+//
+// Support for responsive views via media queries is kind of borked in IE10, for
+// Surface/desktop in split view and for Windows Phone 8. This particular fix
+// must be accompanied by a snippet of JavaScript to sniff the user agent and
+// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at
+// our Getting Started page for more information on this bug.
+//
+// For more information, see the following:
+//
+// Issue: https://github.com/twbs/bootstrap/issues/10497
+// Docs: https://getbootstrap.com/docs/3.4/getting-started/#support-ie10-width
+// Source: https://timkadlec.com/2013/01/windows-phone-8-and-device-width/
+// Source: https://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
+
+@at-root {
+  @-ms-viewport {
+    width: device-width;
+  }
+}
+
+
+// Visibility utilities
+// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
+
+@include responsive-invisibility('.visible-xs');
+@include responsive-invisibility('.visible-sm');
+@include responsive-invisibility('.visible-md');
+@include responsive-invisibility('.visible-lg');
+
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+  display: none !important;
+}
+
+@media (max-width: $screen-xs-max) {
+  @include responsive-visibility('.visible-xs');
+}
+.visible-xs-block {
+  @media (max-width: $screen-xs-max) {
+    display: block !important;
+  }
+}
+.visible-xs-inline {
+  @media (max-width: $screen-xs-max) {
+    display: inline !important;
+  }
+}
+.visible-xs-inline-block {
+  @media (max-width: $screen-xs-max) {
+    display: inline-block !important;
+  }
+}
+
+@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+  @include responsive-visibility('.visible-sm');
+}
+.visible-sm-block {
+  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+    display: block !important;
+  }
+}
+.visible-sm-inline {
+  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+    display: inline !important;
+  }
+}
+.visible-sm-inline-block {
+  @media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+    display: inline-block !important;
+  }
+}
+
+@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+  @include responsive-visibility('.visible-md');
+}
+.visible-md-block {
+  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+    display: block !important;
+  }
+}
+.visible-md-inline {
+  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+    display: inline !important;
+  }
+}
+.visible-md-inline-block {
+  @media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+    display: inline-block !important;
+  }
+}
+
+@media (min-width: $screen-lg-min) {
+  @include responsive-visibility('.visible-lg');
+}
+.visible-lg-block {
+  @media (min-width: $screen-lg-min) {
+    display: block !important;
+  }
+}
+.visible-lg-inline {
+  @media (min-width: $screen-lg-min) {
+    display: inline !important;
+  }
+}
+.visible-lg-inline-block {
+  @media (min-width: $screen-lg-min) {
+    display: inline-block !important;
+  }
+}
+
+@media (max-width: $screen-xs-max) {
+  @include responsive-invisibility('.hidden-xs');
+}
+
+@media (min-width: $screen-sm-min) and (max-width: $screen-sm-max) {
+  @include responsive-invisibility('.hidden-sm');
+}
+
+@media (min-width: $screen-md-min) and (max-width: $screen-md-max) {
+  @include responsive-invisibility('.hidden-md');
+}
+
+@media (min-width: $screen-lg-min) {
+  @include responsive-invisibility('.hidden-lg');
+}
+
+
+// Print utilities
+//
+// Media queries are placed on the inside to be mixin-friendly.
+
+// Note: Deprecated .visible-print as of v3.2.0
+
+@include responsive-invisibility('.visible-print');
+
+@media print {
+  @include responsive-visibility('.visible-print');
+}
+.visible-print-block {
+  display: none !important;
+
+  @media print {
+    display: block !important;
+  }
+}
+.visible-print-inline {
+  display: none !important;
+
+  @media print {
+    display: inline !important;
+  }
+}
+.visible-print-inline-block {
+  display: none !important;
+
+  @media print {
+    display: inline-block !important;
+  }
+}
+
+@media print {
+  @include responsive-invisibility('.hidden-print');
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_scaffolding.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_scaffolding.scss
new file mode 100644
index 0000000000000000000000000000000000000000..7fda593848a3715a08228034c7dfcadf8cf53b29
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_scaffolding.scss
@@ -0,0 +1,161 @@
+//
+// Scaffolding
+// --------------------------------------------------
+
+
+// Reset the box-sizing
+//
+// Heads up! This reset may cause conflicts with some third-party widgets.
+// For recommendations on resolving such conflicts, see
+// https://getbootstrap.com/docs/3.4/getting-started/#third-box-sizing
+* {
+  @include box-sizing(border-box);
+}
+*:before,
+*:after {
+  @include box-sizing(border-box);
+}
+
+
+// Body reset
+
+html {
+  font-size: 10px;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+body {
+  font-family: $font-family-base;
+  font-size: $font-size-base;
+  line-height: $line-height-base;
+  color: $text-color;
+  background-color: $body-bg;
+}
+
+// Reset fonts for relevant elements
+input,
+button,
+select,
+textarea {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+}
+
+
+// Links
+
+a {
+  color: $link-color;
+  text-decoration: none;
+
+  &:hover,
+  &:focus {
+    color: $link-hover-color;
+    text-decoration: $link-hover-decoration;
+  }
+
+  &:focus {
+    @include tab-focus;
+  }
+}
+
+
+// Figures
+//
+// We reset this here because previously Normalize had no `figure` margins. This
+// ensures we don't break anyone's use of the element.
+
+figure {
+  margin: 0;
+}
+
+
+// Images
+
+img {
+  vertical-align: middle;
+}
+
+// Responsive images (ensure images don't scale beyond their parents)
+.img-responsive {
+  @include img-responsive;
+}
+
+// Rounded corners
+.img-rounded {
+  border-radius: $border-radius-large;
+}
+
+// Image thumbnails
+//
+// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.
+.img-thumbnail {
+  padding: $thumbnail-padding;
+  line-height: $line-height-base;
+  background-color: $thumbnail-bg;
+  border: 1px solid $thumbnail-border;
+  border-radius: $thumbnail-border-radius;
+  @include transition(all .2s ease-in-out);
+
+  // Keep them at most 100% wide
+  @include img-responsive(inline-block);
+}
+
+// Perfect circle
+.img-circle {
+  border-radius: 50%; // set radius in percents
+}
+
+
+// Horizontal rules
+
+hr {
+  margin-top: $line-height-computed;
+  margin-bottom: $line-height-computed;
+  border: 0;
+  border-top: 1px solid $hr-border;
+}
+
+
+// Only display content to screen readers
+//
+// See: https://a11yproject.com/posts/how-to-hide-content
+
+.sr-only {
+  position: absolute;
+  width: 1px;
+  height: 1px;
+  padding: 0;
+  margin: -1px;
+  overflow: hidden;
+  clip: rect(0, 0, 0, 0);
+  border: 0;
+}
+
+// Use in conjunction with .sr-only to only display content when it's focused.
+// Useful for "Skip to main content" links; see https://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1
+// Credit: HTML5 Boilerplate
+
+.sr-only-focusable {
+  &:active,
+  &:focus {
+    position: static;
+    width: auto;
+    height: auto;
+    margin: 0;
+    overflow: visible;
+    clip: auto;
+  }
+}
+
+
+// iOS "clickable elements" fix for role="button"
+//
+// Fixes "clickability" issue (and more generally, the firing of events such as focus as well)
+// for traditionally non-focusable elements with role="button"
+// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
+
+[role="button"] {
+  cursor: pointer;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_tables.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_tables.scss
new file mode 100644
index 0000000000000000000000000000000000000000..7bff4b0450bb35230b7147a3a6db0867b8a618d7
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_tables.scss
@@ -0,0 +1,234 @@
+//
+// Tables
+// --------------------------------------------------
+
+
+table {
+  background-color: $table-bg;
+
+  // Table cell sizing
+  //
+  // Reset default table behavior
+
+  col[class*="col-"] {
+    position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
+    display: table-column;
+    float: none;
+  }
+
+  td,
+  th {
+    &[class*="col-"] {
+      position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
+      display: table-cell;
+      float: none;
+    }
+  }
+}
+
+caption {
+  padding-top: $table-cell-padding;
+  padding-bottom: $table-cell-padding;
+  color: $text-muted;
+  text-align: left;
+}
+
+th {
+  text-align: left;
+}
+
+
+// Baseline styles
+
+.table {
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: $line-height-computed;
+  // Cells
+  > thead,
+  > tbody,
+  > tfoot {
+    > tr {
+      > th,
+      > td {
+        padding: $table-cell-padding;
+        line-height: $line-height-base;
+        vertical-align: top;
+        border-top: 1px solid $table-border-color;
+      }
+    }
+  }
+  // Bottom align for column headings
+  > thead > tr > th {
+    vertical-align: bottom;
+    border-bottom: 2px solid $table-border-color;
+  }
+  // Remove top border from thead by default
+  > caption + thead,
+  > colgroup + thead,
+  > thead:first-child {
+    > tr:first-child {
+      > th,
+      > td {
+        border-top: 0;
+      }
+    }
+  }
+  // Account for multiple tbody instances
+  > tbody + tbody {
+    border-top: 2px solid $table-border-color;
+  }
+
+  // Nesting
+  .table {
+    background-color: $body-bg;
+  }
+}
+
+
+// Condensed table w/ half padding
+
+.table-condensed {
+  > thead,
+  > tbody,
+  > tfoot {
+    > tr {
+      > th,
+      > td {
+        padding: $table-condensed-cell-padding;
+      }
+    }
+  }
+}
+
+
+// Bordered version
+//
+// Add borders all around the table and between all the columns.
+
+.table-bordered {
+  border: 1px solid $table-border-color;
+  > thead,
+  > tbody,
+  > tfoot {
+    > tr {
+      > th,
+      > td {
+        border: 1px solid $table-border-color;
+      }
+    }
+  }
+  > thead > tr {
+    > th,
+    > td {
+      border-bottom-width: 2px;
+    }
+  }
+}
+
+
+// Zebra-striping
+//
+// Default zebra-stripe styles (alternating gray and transparent backgrounds)
+
+.table-striped {
+  > tbody > tr:nth-of-type(odd) {
+    background-color: $table-bg-accent;
+  }
+}
+
+
+// Hover effect
+//
+// Placed here since it has to come after the potential zebra striping
+
+.table-hover {
+  > tbody > tr:hover {
+    background-color: $table-bg-hover;
+  }
+}
+
+
+// Table backgrounds
+//
+// Exact selectors below required to override `.table-striped` and prevent
+// inheritance to nested tables.
+
+// Generate the contextual variants
+@include table-row-variant('active', $table-bg-active);
+@include table-row-variant('success', $state-success-bg);
+@include table-row-variant('info', $state-info-bg);
+@include table-row-variant('warning', $state-warning-bg);
+@include table-row-variant('danger', $state-danger-bg);
+
+
+// Responsive tables
+//
+// Wrap your tables in `.table-responsive` and we'll make them mobile friendly
+// by enabling horizontal scrolling. Only applies <768px. Everything above that
+// will display normally.
+
+.table-responsive {
+  min-height: .01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)
+  overflow-x: auto;
+
+  @media screen and (max-width: $screen-xs-max) {
+    width: 100%;
+    margin-bottom: ($line-height-computed * .75);
+    overflow-y: hidden;
+    -ms-overflow-style: -ms-autohiding-scrollbar;
+    border: 1px solid $table-border-color;
+
+    // Tighten up spacing
+    > .table {
+      margin-bottom: 0;
+
+      // Ensure the content doesn't wrap
+      > thead,
+      > tbody,
+      > tfoot {
+        > tr {
+          > th,
+          > td {
+            white-space: nowrap;
+          }
+        }
+      }
+    }
+
+    // Special overrides for the bordered tables
+    > .table-bordered {
+      border: 0;
+
+      // Nuke the appropriate borders so that the parent can handle them
+      > thead,
+      > tbody,
+      > tfoot {
+        > tr {
+          > th:first-child,
+          > td:first-child {
+            border-left: 0;
+          }
+          > th:last-child,
+          > td:last-child {
+            border-right: 0;
+          }
+        }
+      }
+
+      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since
+      // chances are there will be only one `tr` in a `thead` and that would
+      // remove the border altogether.
+      > tbody,
+      > tfoot {
+        > tr:last-child {
+          > th,
+          > td {
+            border-bottom: 0;
+          }
+        }
+      }
+
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_theme.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_theme.scss
new file mode 100644
index 0000000000000000000000000000000000000000..046eed7a988e2b4415612300dff9c6f5aa65a46a
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_theme.scss
@@ -0,0 +1,295 @@
+/*!
+ * Bootstrap v3.4.1 (https://getbootstrap.com/)
+ * Copyright 2011-2019 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+//
+// Load core variables and mixins
+// --------------------------------------------------
+
+@import "variables";
+@import "mixins";
+
+
+//
+// Buttons
+// --------------------------------------------------
+
+// Common styles
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
+  $shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
+  @include box-shadow($shadow);
+
+  // Reset the shadow
+  &:active,
+  &.active {
+    @include box-shadow(inset 0 3px 5px rgba(0, 0, 0, .125));
+  }
+
+  &.disabled,
+  &[disabled],
+  fieldset[disabled] & {
+    @include box-shadow(none);
+  }
+
+  .badge {
+    text-shadow: none;
+  }
+}
+
+// Mixin for generating new styles
+@mixin btn-styles($btn-color: #555) {
+  @include gradient-vertical($start-color: $btn-color, $end-color: darken($btn-color, 12%));
+  @include reset-filter; // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620
+  background-repeat: repeat-x;
+  border-color: darken($btn-color, 14%);
+
+  &:hover,
+  &:focus  {
+    background-color: darken($btn-color, 12%);
+    background-position: 0 -15px;
+  }
+
+  &:active,
+  &.active {
+    background-color: darken($btn-color, 12%);
+    border-color: darken($btn-color, 14%);
+  }
+
+  &.disabled,
+  &[disabled],
+  fieldset[disabled] & {
+    &,
+    &:hover,
+    &:focus,
+    &.focus,
+    &:active,
+    &.active {
+      background-color: darken($btn-color, 12%);
+      background-image: none;
+    }
+  }
+}
+
+// Common styles
+.btn {
+  // Remove the gradient for the pressed/active state
+  &:active,
+  &.active {
+    background-image: none;
+  }
+}
+
+// Apply the mixin to the buttons
+.btn-default {
+  @include btn-styles($btn-default-bg);
+  text-shadow: 0 1px 0 #fff;
+  border-color: #ccc;
+}
+.btn-primary { @include btn-styles($btn-primary-bg); }
+.btn-success { @include btn-styles($btn-success-bg); }
+.btn-info    { @include btn-styles($btn-info-bg); }
+.btn-warning { @include btn-styles($btn-warning-bg); }
+.btn-danger  { @include btn-styles($btn-danger-bg); }
+
+
+//
+// Images
+// --------------------------------------------------
+
+.thumbnail,
+.img-thumbnail {
+  @include box-shadow(0 1px 2px rgba(0, 0, 0, .075));
+}
+
+
+//
+// Dropdowns
+// --------------------------------------------------
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+  @include gradient-vertical($start-color: $dropdown-link-hover-bg, $end-color: darken($dropdown-link-hover-bg, 5%));
+  background-color: darken($dropdown-link-hover-bg, 5%);
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+  @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
+  background-color: darken($dropdown-link-active-bg, 5%);
+}
+
+
+//
+// Navbar
+// --------------------------------------------------
+
+// Default navbar
+.navbar-default {
+  @include gradient-vertical($start-color: lighten($navbar-default-bg, 10%), $end-color: $navbar-default-bg);
+  @include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
+  border-radius: $navbar-border-radius;
+  $shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
+  @include box-shadow($shadow);
+
+  .navbar-nav > .open > a,
+  .navbar-nav > .active > a {
+    @include gradient-vertical($start-color: darken($navbar-default-link-active-bg, 5%), $end-color: darken($navbar-default-link-active-bg, 2%));
+    @include box-shadow(inset 0 3px 9px rgba(0, 0, 0, .075));
+  }
+}
+.navbar-brand,
+.navbar-nav > li > a {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
+}
+
+// Inverted navbar
+.navbar-inverse {
+  @include gradient-vertical($start-color: lighten($navbar-inverse-bg, 10%), $end-color: $navbar-inverse-bg);
+  @include reset-filter; // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257
+  border-radius: $navbar-border-radius;
+  .navbar-nav > .open > a,
+  .navbar-nav > .active > a {
+    @include gradient-vertical($start-color: $navbar-inverse-link-active-bg, $end-color: lighten($navbar-inverse-link-active-bg, 2.5%));
+    @include box-shadow(inset 0 3px 9px rgba(0, 0, 0, .25));
+  }
+
+  .navbar-brand,
+  .navbar-nav > li > a {
+    text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
+  }
+}
+
+// Undo rounded corners in static and fixed navbars
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+  border-radius: 0;
+}
+
+// Fix active state of dropdown items in collapsed mode
+@media (max-width: $grid-float-breakpoint-max) {
+  .navbar .navbar-nav .open .dropdown-menu > .active > a {
+    &,
+    &:hover,
+    &:focus {
+      color: #fff;
+      @include gradient-vertical($start-color: $dropdown-link-active-bg, $end-color: darken($dropdown-link-active-bg, 5%));
+    }
+  }
+}
+
+
+//
+// Alerts
+// --------------------------------------------------
+
+// Common styles
+.alert {
+  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
+  $shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
+  @include box-shadow($shadow);
+}
+
+// Mixin for generating new styles
+@mixin alert-styles($color) {
+  @include gradient-vertical($start-color: $color, $end-color: darken($color, 7.5%));
+  border-color: darken($color, 15%);
+}
+
+// Apply the mixin to the alerts
+.alert-success    { @include alert-styles($alert-success-bg); }
+.alert-info       { @include alert-styles($alert-info-bg); }
+.alert-warning    { @include alert-styles($alert-warning-bg); }
+.alert-danger     { @include alert-styles($alert-danger-bg); }
+
+
+//
+// Progress bars
+// --------------------------------------------------
+
+// Give the progress background some depth
+.progress {
+  @include gradient-vertical($start-color: darken($progress-bg, 4%), $end-color: $progress-bg)
+}
+
+// Mixin for generating new styles
+@mixin progress-bar-styles($color) {
+  @include gradient-vertical($start-color: $color, $end-color: darken($color, 10%));
+}
+
+// Apply the mixin to the progress bars
+.progress-bar            { @include progress-bar-styles($progress-bar-bg); }
+.progress-bar-success    { @include progress-bar-styles($progress-bar-success-bg); }
+.progress-bar-info       { @include progress-bar-styles($progress-bar-info-bg); }
+.progress-bar-warning    { @include progress-bar-styles($progress-bar-warning-bg); }
+.progress-bar-danger     { @include progress-bar-styles($progress-bar-danger-bg); }
+
+// Reset the striped class because our mixins don't do multiple gradients and
+// the above custom styles override the new `.progress-bar-striped` in v3.2.0.
+.progress-bar-striped {
+  @include gradient-striped;
+}
+
+
+//
+// List groups
+// --------------------------------------------------
+
+.list-group {
+  border-radius: $border-radius-base;
+  @include box-shadow(0 1px 2px rgba(0, 0, 0, .075));
+}
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+  text-shadow: 0 -1px 0 darken($list-group-active-bg, 10%);
+  @include gradient-vertical($start-color: $list-group-active-bg, $end-color: darken($list-group-active-bg, 7.5%));
+  border-color: darken($list-group-active-border, 7.5%);
+
+  .badge {
+    text-shadow: none;
+  }
+}
+
+
+//
+// Panels
+// --------------------------------------------------
+
+// Common styles
+.panel {
+  @include box-shadow(0 1px 2px rgba(0, 0, 0, .05));
+}
+
+// Mixin for generating new styles
+@mixin panel-heading-styles($color) {
+  @include gradient-vertical($start-color: $color, $end-color: darken($color, 5%));
+}
+
+// Apply the mixin to the panel headings only
+.panel-default > .panel-heading   { @include panel-heading-styles($panel-default-heading-bg); }
+.panel-primary > .panel-heading   { @include panel-heading-styles($panel-primary-heading-bg); }
+.panel-success > .panel-heading   { @include panel-heading-styles($panel-success-heading-bg); }
+.panel-info > .panel-heading      { @include panel-heading-styles($panel-info-heading-bg); }
+.panel-warning > .panel-heading   { @include panel-heading-styles($panel-warning-heading-bg); }
+.panel-danger > .panel-heading    { @include panel-heading-styles($panel-danger-heading-bg); }
+
+
+//
+// Wells
+// --------------------------------------------------
+
+.well {
+  @include gradient-vertical($start-color: darken($well-bg, 5%), $end-color: $well-bg);
+  border-color: darken($well-bg, 10%);
+  $shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
+  @include box-shadow($shadow);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_thumbnails.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_thumbnails.scss
new file mode 100644
index 0000000000000000000000000000000000000000..835452f3b6a01fc85f9f6704c1c563dd5a8f4bfb
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_thumbnails.scss
@@ -0,0 +1,38 @@
+//
+// Thumbnails
+// --------------------------------------------------
+
+
+// Mixin and adjust the regular image class
+.thumbnail {
+  display: block;
+  padding: $thumbnail-padding;
+  margin-bottom: $line-height-computed;
+  line-height: $line-height-base;
+  background-color: $thumbnail-bg;
+  border: 1px solid $thumbnail-border;
+  border-radius: $thumbnail-border-radius;
+  @include transition(border .2s ease-in-out);
+
+  > img,
+  a > img {
+    @include img-responsive;
+    margin-right: auto;
+    margin-left: auto;
+  }
+
+  // [converter] extracted a&:hover, a&:focus, a&.active to a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active
+
+  // Image captions
+  .caption {
+    padding: $thumbnail-caption-padding;
+    color: $thumbnail-caption-color;
+  }
+}
+
+// Add a hover state for linked versions only
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+  border-color: $link-color;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_tooltip.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_tooltip.scss
new file mode 100644
index 0000000000000000000000000000000000000000..fa69a81ece7cdff1b91115986c3ca65ddc841525
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_tooltip.scss
@@ -0,0 +1,112 @@
+//
+// Tooltips
+// --------------------------------------------------
+
+
+// Base class
+.tooltip {
+  position: absolute;
+  z-index: $zindex-tooltip;
+  display: block;
+  // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.
+  // So reset our font and text properties to avoid inheriting weird values.
+  @include reset-text;
+  font-size: $font-size-small;
+
+  @include opacity(0);
+
+  &.in { @include opacity($tooltip-opacity); }
+  &.top {
+    padding: $tooltip-arrow-width 0;
+    margin-top: -3px;
+  }
+  &.right {
+    padding: 0 $tooltip-arrow-width;
+    margin-left: 3px;
+  }
+  &.bottom {
+    padding: $tooltip-arrow-width 0;
+    margin-top: 3px;
+  }
+  &.left {
+    padding: 0 $tooltip-arrow-width;
+    margin-left: -3px;
+  }
+
+  // Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1
+  &.top .tooltip-arrow {
+    bottom: 0;
+    left: 50%;
+    margin-left: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+    border-top-color: $tooltip-arrow-color;
+  }
+  &.top-left .tooltip-arrow {
+    right: $tooltip-arrow-width;
+    bottom: 0;
+    margin-bottom: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+    border-top-color: $tooltip-arrow-color;
+  }
+  &.top-right .tooltip-arrow {
+    bottom: 0;
+    left: $tooltip-arrow-width;
+    margin-bottom: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width $tooltip-arrow-width 0;
+    border-top-color: $tooltip-arrow-color;
+  }
+  &.right .tooltip-arrow {
+    top: 50%;
+    left: 0;
+    margin-top: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width $tooltip-arrow-width $tooltip-arrow-width 0;
+    border-right-color: $tooltip-arrow-color;
+  }
+  &.left .tooltip-arrow {
+    top: 50%;
+    right: 0;
+    margin-top: -$tooltip-arrow-width;
+    border-width: $tooltip-arrow-width 0 $tooltip-arrow-width $tooltip-arrow-width;
+    border-left-color: $tooltip-arrow-color;
+  }
+  &.bottom .tooltip-arrow {
+    top: 0;
+    left: 50%;
+    margin-left: -$tooltip-arrow-width;
+    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+    border-bottom-color: $tooltip-arrow-color;
+  }
+  &.bottom-left .tooltip-arrow {
+    top: 0;
+    right: $tooltip-arrow-width;
+    margin-top: -$tooltip-arrow-width;
+    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+    border-bottom-color: $tooltip-arrow-color;
+  }
+  &.bottom-right .tooltip-arrow {
+    top: 0;
+    left: $tooltip-arrow-width;
+    margin-top: -$tooltip-arrow-width;
+    border-width: 0 $tooltip-arrow-width $tooltip-arrow-width;
+    border-bottom-color: $tooltip-arrow-color;
+  }
+}
+
+// Wrapper for the tooltip content
+.tooltip-inner {
+  max-width: $tooltip-max-width;
+  padding: 3px 8px;
+  color: $tooltip-color;
+  text-align: center;
+  background-color: $tooltip-bg;
+  border-radius: $border-radius-base;
+}
+
+// Arrows
+.tooltip-arrow {
+  position: absolute;
+  width: 0;
+  height: 0;
+  border-color: transparent;
+  border-style: solid;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_type.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_type.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c63cc4c071cb6c5f4dd51fdc0fac035b28488813
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_type.scss
@@ -0,0 +1,298 @@
+//
+// Typography
+// --------------------------------------------------
+
+
+// Headings
+// -------------------------
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+  font-family: $headings-font-family;
+  font-weight: $headings-font-weight;
+  line-height: $headings-line-height;
+  color: $headings-color;
+
+  small,
+  .small {
+    font-weight: 400;
+    line-height: 1;
+    color: $headings-small-color;
+  }
+}
+
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+  margin-top: $line-height-computed;
+  margin-bottom: ($line-height-computed / 2);
+
+  small,
+  .small {
+    font-size: 65%;
+  }
+}
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+  margin-top: ($line-height-computed / 2);
+  margin-bottom: ($line-height-computed / 2);
+
+  small,
+  .small {
+    font-size: 75%;
+  }
+}
+
+h1, .h1 { font-size: $font-size-h1; }
+h2, .h2 { font-size: $font-size-h2; }
+h3, .h3 { font-size: $font-size-h3; }
+h4, .h4 { font-size: $font-size-h4; }
+h5, .h5 { font-size: $font-size-h5; }
+h6, .h6 { font-size: $font-size-h6; }
+
+
+// Body text
+// -------------------------
+
+p {
+  margin: 0 0 ($line-height-computed / 2);
+}
+
+.lead {
+  margin-bottom: $line-height-computed;
+  font-size: floor(($font-size-base * 1.15));
+  font-weight: 300;
+  line-height: 1.4;
+
+  @media (min-width: $screen-sm-min) {
+    font-size: ($font-size-base * 1.5);
+  }
+}
+
+
+// Emphasis & misc
+// -------------------------
+
+// Ex: (12px small font / 14px base font) * 100% = about 85%
+small,
+.small {
+  font-size: floor((100% * $font-size-small / $font-size-base));
+}
+
+mark,
+.mark {
+  padding: .2em;
+  background-color: $state-warning-bg;
+}
+
+// Alignment
+.text-left           { text-align: left; }
+.text-right          { text-align: right; }
+.text-center         { text-align: center; }
+.text-justify        { text-align: justify; }
+.text-nowrap         { white-space: nowrap; }
+
+// Transformation
+.text-lowercase      { text-transform: lowercase; }
+.text-uppercase      { text-transform: uppercase; }
+.text-capitalize     { text-transform: capitalize; }
+
+// Contextual colors
+.text-muted {
+  color: $text-muted;
+}
+
+@include text-emphasis-variant('.text-primary', $brand-primary);
+
+@include text-emphasis-variant('.text-success', $state-success-text);
+
+@include text-emphasis-variant('.text-info', $state-info-text);
+
+@include text-emphasis-variant('.text-warning', $state-warning-text);
+
+@include text-emphasis-variant('.text-danger', $state-danger-text);
+
+// Contextual backgrounds
+// For now we'll leave these alongside the text classes until v4 when we can
+// safely shift things around (per SemVer rules).
+.bg-primary {
+  // Given the contrast here, this is the only class to have its color inverted
+  // automatically.
+  color: #fff;
+}
+@include bg-variant('.bg-primary', $brand-primary);
+
+@include bg-variant('.bg-success', $state-success-bg);
+
+@include bg-variant('.bg-info', $state-info-bg);
+
+@include bg-variant('.bg-warning', $state-warning-bg);
+
+@include bg-variant('.bg-danger', $state-danger-bg);
+
+
+// Page header
+// -------------------------
+
+.page-header {
+  padding-bottom: (($line-height-computed / 2) - 1);
+  margin: ($line-height-computed * 2) 0 $line-height-computed;
+  border-bottom: 1px solid $page-header-border-color;
+}
+
+
+// Lists
+// -------------------------
+
+// Unordered and Ordered lists
+ul,
+ol {
+  margin-top: 0;
+  margin-bottom: ($line-height-computed / 2);
+  ul,
+  ol {
+    margin-bottom: 0;
+  }
+}
+
+// List options
+
+// [converter] extracted from `.list-unstyled` for libsass compatibility
+@mixin list-unstyled {
+  padding-left: 0;
+  list-style: none;
+}
+// [converter] extracted as `@mixin list-unstyled` for libsass compatibility
+.list-unstyled {
+  @include list-unstyled;
+}
+
+
+// Inline turns list items into inline-block
+.list-inline {
+  @include list-unstyled;
+  margin-left: -5px;
+
+  > li {
+    display: inline-block;
+    padding-right: 5px;
+    padding-left: 5px;
+  }
+}
+
+// Description Lists
+dl {
+  margin-top: 0; // Remove browser default
+  margin-bottom: $line-height-computed;
+}
+dt,
+dd {
+  line-height: $line-height-base;
+}
+dt {
+  font-weight: 700;
+}
+dd {
+  margin-left: 0; // Undo browser default
+}
+
+// Horizontal description lists
+//
+// Defaults to being stacked without any of the below styles applied, until the
+// grid breakpoint is reached (default of ~768px).
+
+.dl-horizontal {
+  dd {
+    @include clearfix; // Clear the floated `dt` if an empty `dd` is present
+  }
+
+  @media (min-width: $dl-horizontal-breakpoint) {
+    dt {
+      float: left;
+      width: ($dl-horizontal-offset - 20);
+      clear: left;
+      text-align: right;
+      @include text-overflow;
+    }
+    dd {
+      margin-left: $dl-horizontal-offset;
+    }
+  }
+}
+
+
+// Misc
+// -------------------------
+
+// Abbreviations and acronyms
+// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257
+abbr[title],
+abbr[data-original-title] {
+  cursor: help;
+}
+
+.initialism {
+  font-size: 90%;
+  @extend .text-uppercase;
+}
+
+// Blockquotes
+blockquote {
+  padding: ($line-height-computed / 2) $line-height-computed;
+  margin: 0 0 $line-height-computed;
+  font-size: $blockquote-font-size;
+  border-left: 5px solid $blockquote-border-color;
+
+  p,
+  ul,
+  ol {
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+
+  // Note: Deprecated small and .small as of v3.1.0
+  // Context: https://github.com/twbs/bootstrap/issues/11660
+  footer,
+  small,
+  .small {
+    display: block;
+    font-size: 80%; // back to default font-size
+    line-height: $line-height-base;
+    color: $blockquote-small-color;
+
+    &:before {
+      content: "\2014 \00A0"; // em dash, nbsp
+    }
+  }
+}
+
+// Opposite alignment of blockquote
+//
+// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.
+.blockquote-reverse,
+blockquote.pull-right {
+  padding-right: 15px;
+  padding-left: 0;
+  text-align: right;
+  border-right: 5px solid $blockquote-border-color;
+  border-left: 0;
+
+  // Account for citation
+  footer,
+  small,
+  .small {
+    &:before { content: ""; }
+    &:after {
+      content: "\00A0 \2014"; // nbsp, em dash
+    }
+  }
+}
+
+// Addresses
+address {
+  margin-bottom: $line-height-computed;
+  font-style: normal;
+  line-height: $line-height-base;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_utilities.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_utilities.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8c99c71643ed94ad7000f105faf4610095270d33
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_utilities.scss
@@ -0,0 +1,55 @@
+//
+// Utility classes
+// --------------------------------------------------
+
+
+// Floats
+// -------------------------
+
+.clearfix {
+  @include clearfix;
+}
+.center-block {
+  @include center-block;
+}
+.pull-right {
+  float: right !important;
+}
+.pull-left {
+  float: left !important;
+}
+
+
+// Toggling content
+// -------------------------
+
+// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1
+.hide {
+  display: none !important;
+}
+.show {
+  display: block !important;
+}
+.invisible {
+  visibility: hidden;
+}
+.text-hide {
+  @include text-hide;
+}
+
+
+// Hide from screenreaders and browsers
+//
+// Credit: HTML5 Boilerplate
+
+.hidden {
+  display: none !important;
+}
+
+
+// For Affix plugin
+// -------------------------
+
+.affix {
+  position: fixed;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_variables.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_variables.scss
new file mode 100644
index 0000000000000000000000000000000000000000..898ef14adc9a68348f7faf0f6fac0a1e90b50b50
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_variables.scss
@@ -0,0 +1,874 @@
+$bootstrap-sass-asset-helper: false !default;
+//
+// Variables
+// --------------------------------------------------
+
+
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
+
+$gray-base:              #000 !default;
+$gray-darker:            lighten($gray-base, 13.5%) !default; // #222
+$gray-dark:              lighten($gray-base, 20%) !default;   // #333
+$gray:                   lighten($gray-base, 33.5%) !default; // #555
+$gray-light:             lighten($gray-base, 46.7%) !default; // #777
+$gray-lighter:           lighten($gray-base, 93.5%) !default; // #eee
+
+$brand-primary:         darken(#428bca, 6.5%) !default; // #337ab7
+$brand-success:         #5cb85c !default;
+$brand-info:            #5bc0de !default;
+$brand-warning:         #f0ad4e !default;
+$brand-danger:          #d9534f !default;
+
+
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
+
+//** Background color for `<body>`.
+$body-bg:               #fff !default;
+//** Global text color on `<body>`.
+$text-color:            $gray-dark !default;
+
+//** Global textual link color.
+$link-color:            $brand-primary !default;
+//** Link hover color set via `darken()` function.
+$link-hover-color:      darken($link-color, 15%) !default;
+//** Link hover decoration.
+$link-hover-decoration: underline !default;
+
+
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
+
+$font-family-sans-serif:  "Helvetica Neue", Helvetica, Arial, sans-serif !default;
+$font-family-serif:       Georgia, "Times New Roman", Times, serif !default;
+//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
+$font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace !default;
+$font-family-base:        $font-family-sans-serif !default;
+
+$font-size-base:          14px !default;
+$font-size-large:         ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-small:         ceil(($font-size-base * .85)) !default; // ~12px
+
+$font-size-h1:            floor(($font-size-base * 2.6)) !default; // ~36px
+$font-size-h2:            floor(($font-size-base * 2.15)) !default; // ~30px
+$font-size-h3:            ceil(($font-size-base * 1.7)) !default; // ~24px
+$font-size-h4:            ceil(($font-size-base * 1.25)) !default; // ~18px
+$font-size-h5:            $font-size-base !default;
+$font-size-h6:            ceil(($font-size-base * .85)) !default; // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+$line-height-base:        1.428571429 !default; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+$line-height-computed:    floor(($font-size-base * $line-height-base)) !default; // ~20px
+
+//** By default, this inherits from the `<body>`.
+$headings-font-family:    inherit !default;
+$headings-font-weight:    500 !default;
+$headings-line-height:    1.1 !default;
+$headings-color:          inherit !default;
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+
+// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
+// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
+$icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/") !default;
+
+//** File name for all font files.
+$icon-font-name:          "glyphicons-halflings-regular" !default;
+//** Element ID within SVG icon file.
+$icon-font-svg-id:        "glyphicons_halflingsregular" !default;
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+$padding-base-vertical:     6px !default;
+$padding-base-horizontal:   12px !default;
+
+$padding-large-vertical:    10px !default;
+$padding-large-horizontal:  16px !default;
+
+$padding-small-vertical:    5px !default;
+$padding-small-horizontal:  10px !default;
+
+$padding-xs-vertical:       1px !default;
+$padding-xs-horizontal:     5px !default;
+
+$line-height-large:         1.3333333 !default; // extra decimals for Win 8.1 Chrome
+$line-height-small:         1.5 !default;
+
+$border-radius-base:        4px !default;
+$border-radius-large:       6px !default;
+$border-radius-small:       3px !default;
+
+//** Global color for active items (e.g., navs or dropdowns).
+$component-active-color:    #fff !default;
+//** Global background color for active items (e.g., navs or dropdowns).
+$component-active-bg:       $brand-primary !default;
+
+//** Width of the `border` for generating carets that indicate dropdowns.
+$caret-width-base:          4px !default;
+//** Carets increase slightly in size for larger components.
+$caret-width-large:         5px !default;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for `<th>`s and `<td>`s.
+$table-cell-padding:            8px !default;
+//** Padding for cells in `.table-condensed`.
+$table-condensed-cell-padding:  5px !default;
+
+//** Default background color used for all tables.
+$table-bg:                      transparent !default;
+//** Background color used for `.table-striped`.
+$table-bg-accent:               #f9f9f9 !default;
+//** Background color used for `.table-hover`.
+$table-bg-hover:                #f5f5f5 !default;
+$table-bg-active:               $table-bg-hover !default;
+
+//** Border color for table and cell borders.
+$table-border-color:            #ddd !default;
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+$btn-font-weight:                normal !default;
+
+$btn-default-color:              #333 !default;
+$btn-default-bg:                 #fff !default;
+$btn-default-border:             #ccc !default;
+
+$btn-primary-color:              #fff !default;
+$btn-primary-bg:                 $brand-primary !default;
+$btn-primary-border:             darken($btn-primary-bg, 5%) !default;
+
+$btn-success-color:              #fff !default;
+$btn-success-bg:                 $brand-success !default;
+$btn-success-border:             darken($btn-success-bg, 5%) !default;
+
+$btn-info-color:                 #fff !default;
+$btn-info-bg:                    $brand-info !default;
+$btn-info-border:                darken($btn-info-bg, 5%) !default;
+
+$btn-warning-color:              #fff !default;
+$btn-warning-bg:                 $brand-warning !default;
+$btn-warning-border:             darken($btn-warning-bg, 5%) !default;
+
+$btn-danger-color:               #fff !default;
+$btn-danger-bg:                  $brand-danger !default;
+$btn-danger-border:              darken($btn-danger-bg, 5%) !default;
+
+$btn-link-disabled-color:        $gray-light !default;
+
+// Allows for customizing button radius independently from global border radius
+$btn-border-radius-base:         $border-radius-base !default;
+$btn-border-radius-large:        $border-radius-large !default;
+$btn-border-radius-small:        $border-radius-small !default;
+
+
+//== Forms
+//
+//##
+
+//** `<input>` background color
+$input-bg:                       #fff !default;
+//** `<input disabled>` background color
+$input-bg-disabled:              $gray-lighter !default;
+
+//** Text color for `<input>`s
+$input-color:                    $gray !default;
+//** `<input>` border color
+$input-border:                   #ccc !default;
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
+$input-border-radius:            $border-radius-base !default;
+//** Large `.form-control` border radius
+$input-border-radius-large:      $border-radius-large !default;
+//** Small `.form-control` border radius
+$input-border-radius-small:      $border-radius-small !default;
+
+//** Border color for inputs on focus
+$input-border-focus:             #66afe9 !default;
+
+//** Placeholder text color
+$input-color-placeholder:        #999 !default;
+
+//** Default `.form-control` height
+$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
+//** Large `.form-control` height
+$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
+//** Small `.form-control` height
+$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
+
+//** `.form-group` margin
+$form-group-margin-bottom:       15px !default;
+
+$legend-color:                   $gray-dark !default;
+$legend-border-color:            #e5e5e5 !default;
+
+//** Background color for textual input addons
+$input-group-addon-bg:           $gray-lighter !default;
+//** Border color for textual input addons
+$input-group-addon-border-color: $input-border !default;
+
+//** Disabled cursor for form controls and buttons.
+$cursor-disabled:                not-allowed !default;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg:                    #fff !default;
+//** Dropdown menu `border-color`.
+$dropdown-border:                rgba(0, 0, 0, .15) !default;
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border:       #ccc !default;
+//** Divider color for between dropdown items.
+$dropdown-divider-bg:            #e5e5e5 !default;
+
+//** Dropdown link text color.
+$dropdown-link-color:            $gray-dark !default;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg:         #f5f5f5 !default;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color:     $component-active-color !default;
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg:        $component-active-bg !default;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color:   $gray-light !default;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color:          $gray-light !default;
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+$dropdown-caret-color:           #000 !default;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar:            1000 !default;
+$zindex-dropdown:          1000 !default;
+$zindex-popover:           1060 !default;
+$zindex-tooltip:           1070 !default;
+$zindex-navbar-fixed:      1030 !default;
+$zindex-modal-background:  1040 !default;
+$zindex-modal:             1050 !default;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+$screen-xs:                  480px !default;
+//** Deprecated `$screen-xs-min` as of v3.2.0
+$screen-xs-min:              $screen-xs !default;
+//** Deprecated `$screen-phone` as of v3.0.1
+$screen-phone:               $screen-xs-min !default;
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+$screen-sm:                  768px !default;
+$screen-sm-min:              $screen-sm !default;
+//** Deprecated `$screen-tablet` as of v3.0.1
+$screen-tablet:              $screen-sm-min !default;
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+$screen-md:                  992px !default;
+$screen-md-min:              $screen-md !default;
+//** Deprecated `$screen-desktop` as of v3.0.1
+$screen-desktop:             $screen-md-min !default;
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+$screen-lg:                  1200px !default;
+$screen-lg-min:              $screen-lg !default;
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+$screen-lg-desktop:          $screen-lg-min !default;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max:              ($screen-sm-min - 1) !default;
+$screen-sm-max:              ($screen-md-min - 1) !default;
+$screen-md-max:              ($screen-lg-min - 1) !default;
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns:              12 !default;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width:         30px !default;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint:     $screen-sm-min !default;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet:             (720px + $grid-gutter-width) !default;
+//** For `$screen-sm-min` and up.
+$container-sm:                 $container-tablet !default;
+
+// Medium screen / desktop
+$container-desktop:            (940px + $grid-gutter-width) !default;
+//** For `$screen-md-min` and up.
+$container-md:                 $container-desktop !default;
+
+// Large screen / wide desktop
+$container-large-desktop:      (1140px + $grid-gutter-width) !default;
+//** For `$screen-lg-min` and up.
+$container-lg:                 $container-large-desktop !default;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+$navbar-height:                    50px !default;
+$navbar-margin-bottom:             $line-height-computed !default;
+$navbar-border-radius:             $border-radius-base !default;
+$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
+$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
+$navbar-collapse-max-height:       340px !default;
+
+$navbar-default-color:             #777 !default;
+$navbar-default-bg:                #f8f8f8 !default;
+$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
+
+// Navbar links
+$navbar-default-link-color:                #777 !default;
+$navbar-default-link-hover-color:          #333 !default;
+$navbar-default-link-hover-bg:             transparent !default;
+$navbar-default-link-active-color:         #555 !default;
+$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
+$navbar-default-link-disabled-color:       #ccc !default;
+$navbar-default-link-disabled-bg:          transparent !default;
+
+// Navbar brand label
+$navbar-default-brand-color:               $navbar-default-link-color !default;
+$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
+$navbar-default-brand-hover-bg:            transparent !default;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg:           #ddd !default;
+$navbar-default-toggle-icon-bar-bg:        #888 !default;
+$navbar-default-toggle-border-color:       #ddd !default;
+
+
+//=== Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color:                      lighten($gray-light, 15%) !default;
+$navbar-inverse-bg:                         #222 !default;
+$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
+
+// Inverted navbar links
+$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;
+$navbar-inverse-link-hover-color:           #fff !default;
+$navbar-inverse-link-hover-bg:              transparent !default;
+$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
+$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
+$navbar-inverse-link-disabled-color:        #444 !default;
+$navbar-inverse-link-disabled-bg:           transparent !default;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
+$navbar-inverse-brand-hover-color:          #fff !default;
+$navbar-inverse-brand-hover-bg:             transparent !default;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg:            #333 !default;
+$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
+$navbar-inverse-toggle-border-color:        #333 !default;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+$nav-link-padding:                          10px 15px !default;
+$nav-link-hover-bg:                         $gray-lighter !default;
+
+$nav-disabled-link-color:                   $gray-light !default;
+$nav-disabled-link-hover-color:             $gray-light !default;
+
+//== Tabs
+$nav-tabs-border-color:                     #ddd !default;
+
+$nav-tabs-link-hover-border-color:          $gray-lighter !default;
+
+$nav-tabs-active-link-hover-bg:             $body-bg !default;
+$nav-tabs-active-link-hover-color:          $gray !default;
+$nav-tabs-active-link-hover-border-color:   #ddd !default;
+
+$nav-tabs-justified-link-border-color:            #ddd !default;
+$nav-tabs-justified-active-link-border-color:     $body-bg !default;
+
+//== Pills
+$nav-pills-border-radius:                   $border-radius-base !default;
+$nav-pills-active-link-hover-bg:            $component-active-bg !default;
+$nav-pills-active-link-hover-color:         $component-active-color !default;
+
+
+//== Pagination
+//
+//##
+
+$pagination-color:                     $link-color !default;
+$pagination-bg:                        #fff !default;
+$pagination-border:                    #ddd !default;
+
+$pagination-hover-color:               $link-hover-color !default;
+$pagination-hover-bg:                  $gray-lighter !default;
+$pagination-hover-border:              #ddd !default;
+
+$pagination-active-color:              #fff !default;
+$pagination-active-bg:                 $brand-primary !default;
+$pagination-active-border:             $brand-primary !default;
+
+$pagination-disabled-color:            $gray-light !default;
+$pagination-disabled-bg:               #fff !default;
+$pagination-disabled-border:           #ddd !default;
+
+
+//== Pager
+//
+//##
+
+$pager-bg:                             $pagination-bg !default;
+$pager-border:                         $pagination-border !default;
+$pager-border-radius:                  15px !default;
+
+$pager-hover-bg:                       $pagination-hover-bg !default;
+
+$pager-active-bg:                      $pagination-active-bg !default;
+$pager-active-color:                   $pagination-active-color !default;
+
+$pager-disabled-color:                 $pagination-disabled-color !default;
+
+
+//== Jumbotron
+//
+//##
+
+$jumbotron-padding:              30px !default;
+$jumbotron-color:                inherit !default;
+$jumbotron-bg:                   $gray-lighter !default;
+$jumbotron-heading-color:        inherit !default;
+$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
+$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text:             #3c763d !default;
+$state-success-bg:               #dff0d8 !default;
+$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;
+
+$state-info-text:                #31708f !default;
+$state-info-bg:                  #d9edf7 !default;
+$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;
+
+$state-warning-text:             #8a6d3b !default;
+$state-warning-bg:               #fcf8e3 !default;
+$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;
+
+$state-danger-text:              #a94442 !default;
+$state-danger-bg:                #f2dede !default;
+$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+$tooltip-max-width:           200px !default;
+//** Tooltip text color
+$tooltip-color:               #fff !default;
+//** Tooltip background color
+$tooltip-bg:                  #000 !default;
+$tooltip-opacity:             .9 !default;
+
+//** Tooltip arrow width
+$tooltip-arrow-width:         5px !default;
+//** Tooltip arrow color
+$tooltip-arrow-color:         $tooltip-bg !default;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+$popover-bg:                          #fff !default;
+//** Popover maximum width
+$popover-max-width:                   276px !default;
+//** Popover border color
+$popover-border-color:                rgba(0, 0, 0, .2) !default;
+//** Popover fallback border color
+$popover-fallback-border-color:       #ccc !default;
+
+//** Popover title background color
+$popover-title-bg:                    darken($popover-bg, 3%) !default;
+
+//** Popover arrow width
+$popover-arrow-width:                 10px !default;
+//** Popover arrow color
+$popover-arrow-color:                 $popover-bg !default;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
+//** Popover outer arrow color
+$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+$label-default-bg:            $gray-light !default;
+//** Primary label background color
+$label-primary-bg:            $brand-primary !default;
+//** Success label background color
+$label-success-bg:            $brand-success !default;
+//** Info label background color
+$label-info-bg:               $brand-info !default;
+//** Warning label background color
+$label-warning-bg:            $brand-warning !default;
+//** Danger label background color
+$label-danger-bg:             $brand-danger !default;
+
+//** Default label text color
+$label-color:                 #fff !default;
+//** Default text color of a linked label
+$label-link-hover-color:      #fff !default;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+$modal-inner-padding:         15px !default;
+
+//** Padding applied to the modal title
+$modal-title-padding:         15px !default;
+//** Modal title line-height
+$modal-title-line-height:     $line-height-base !default;
+
+//** Background color of modal content area
+$modal-content-bg:                             #fff !default;
+//** Modal content border color
+$modal-content-border-color:                   rgba(0, 0, 0, .2) !default;
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color:          #999 !default;
+
+//** Modal backdrop background color
+$modal-backdrop-bg:           #000 !default;
+//** Modal backdrop opacity
+$modal-backdrop-opacity:      .5 !default;
+//** Modal header border color
+$modal-header-border-color:   #e5e5e5 !default;
+//** Modal footer border color
+$modal-footer-border-color:   $modal-header-border-color !default;
+
+$modal-lg:                    900px !default;
+$modal-md:                    600px !default;
+$modal-sm:                    300px !default;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding:               15px !default;
+$alert-border-radius:         $border-radius-base !default;
+$alert-link-font-weight:      bold !default;
+
+$alert-success-bg:            $state-success-bg !default;
+$alert-success-text:          $state-success-text !default;
+$alert-success-border:        $state-success-border !default;
+
+$alert-info-bg:               $state-info-bg !default;
+$alert-info-text:             $state-info-text !default;
+$alert-info-border:           $state-info-border !default;
+
+$alert-warning-bg:            $state-warning-bg !default;
+$alert-warning-text:          $state-warning-text !default;
+$alert-warning-border:        $state-warning-border !default;
+
+$alert-danger-bg:             $state-danger-bg !default;
+$alert-danger-text:           $state-danger-text !default;
+$alert-danger-border:         $state-danger-border !default;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+$progress-bg:                 #f5f5f5 !default;
+//** Progress bar text color
+$progress-bar-color:          #fff !default;
+//** Variable for setting rounded corners on progress bar.
+$progress-border-radius:      $border-radius-base !default;
+
+//** Default progress bar color
+$progress-bar-bg:             $brand-primary !default;
+//** Success progress bar color
+$progress-bar-success-bg:     $brand-success !default;
+//** Warning progress bar color
+$progress-bar-warning-bg:     $brand-warning !default;
+//** Danger progress bar color
+$progress-bar-danger-bg:      $brand-danger !default;
+//** Info progress bar color
+$progress-bar-info-bg:        $brand-info !default;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+$list-group-bg:                 #fff !default;
+//** `.list-group-item` border color
+$list-group-border:             #ddd !default;
+//** List group border radius
+$list-group-border-radius:      $border-radius-base !default;
+
+//** Background color of single list items on hover
+$list-group-hover-bg:           #f5f5f5 !default;
+//** Text color of active list items
+$list-group-active-color:       $component-active-color !default;
+//** Background color of active list items
+$list-group-active-bg:          $component-active-bg !default;
+//** Border color of active list elements
+$list-group-active-border:      $list-group-active-bg !default;
+//** Text color for content within active list items
+$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
+
+//** Text color of disabled list items
+$list-group-disabled-color:      $gray-light !default;
+//** Background color of disabled list items
+$list-group-disabled-bg:         $gray-lighter !default;
+//** Text color for content within disabled list items
+$list-group-disabled-text-color: $list-group-disabled-color !default;
+
+$list-group-link-color:         #555 !default;
+$list-group-link-hover-color:   $list-group-link-color !default;
+$list-group-link-heading-color: #333 !default;
+
+
+//== Panels
+//
+//##
+
+$panel-bg:                    #fff !default;
+$panel-body-padding:          15px !default;
+$panel-heading-padding:       10px 15px !default;
+$panel-footer-padding:        $panel-heading-padding !default;
+$panel-border-radius:         $border-radius-base !default;
+
+//** Border color for elements within panels
+$panel-inner-border:          #ddd !default;
+$panel-footer-bg:             #f5f5f5 !default;
+
+$panel-default-text:          $gray-dark !default;
+$panel-default-border:        #ddd !default;
+$panel-default-heading-bg:    #f5f5f5 !default;
+
+$panel-primary-text:          #fff !default;
+$panel-primary-border:        $brand-primary !default;
+$panel-primary-heading-bg:    $brand-primary !default;
+
+$panel-success-text:          $state-success-text !default;
+$panel-success-border:        $state-success-border !default;
+$panel-success-heading-bg:    $state-success-bg !default;
+
+$panel-info-text:             $state-info-text !default;
+$panel-info-border:           $state-info-border !default;
+$panel-info-heading-bg:       $state-info-bg !default;
+
+$panel-warning-text:          $state-warning-text !default;
+$panel-warning-border:        $state-warning-border !default;
+$panel-warning-heading-bg:    $state-warning-bg !default;
+
+$panel-danger-text:           $state-danger-text !default;
+$panel-danger-border:         $state-danger-border !default;
+$panel-danger-heading-bg:     $state-danger-bg !default;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+$thumbnail-padding:           4px !default;
+//** Thumbnail background color
+$thumbnail-bg:                $body-bg !default;
+//** Thumbnail border color
+$thumbnail-border:            #ddd !default;
+//** Thumbnail border radius
+$thumbnail-border-radius:     $border-radius-base !default;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color:     $text-color !default;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding:   9px !default;
+
+
+//== Wells
+//
+//##
+
+$well-bg:                     #f5f5f5 !default;
+$well-border:                 darken($well-bg, 7%) !default;
+
+
+//== Badges
+//
+//##
+
+$badge-color:                 #fff !default;
+//** Linked badge text color on hover
+$badge-link-hover-color:      #fff !default;
+$badge-bg:                    $gray-light !default;
+
+//** Badge text color in active nav link
+$badge-active-color:          $link-color !default;
+//** Badge background color in active nav link
+$badge-active-bg:             #fff !default;
+
+$badge-font-weight:           bold !default;
+$badge-line-height:           1 !default;
+$badge-border-radius:         10px !default;
+
+
+//== Breadcrumbs
+//
+//##
+
+$breadcrumb-padding-vertical:   8px !default;
+$breadcrumb-padding-horizontal: 15px !default;
+//** Breadcrumb background color
+$breadcrumb-bg:                 #f5f5f5 !default;
+//** Breadcrumb text color
+$breadcrumb-color:              #ccc !default;
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color:       $gray-light !default;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator:          "/" !default;
+
+
+//== Carousel
+//
+//##
+
+$carousel-text-shadow:                        0 1px 2px rgba(0, 0, 0, .6) !default;
+
+$carousel-control-color:                      #fff !default;
+$carousel-control-width:                      15% !default;
+$carousel-control-opacity:                    .5 !default;
+$carousel-control-font-size:                  20px !default;
+
+$carousel-indicator-active-bg:                #fff !default;
+$carousel-indicator-border-color:             #fff !default;
+
+$carousel-caption-color:                      #fff !default;
+
+
+//== Close
+//
+//##
+
+$close-font-weight:           bold !default;
+$close-color:                 #000 !default;
+$close-text-shadow:           0 1px 0 #fff !default;
+
+
+//== Code
+//
+//##
+
+$code-color:                  #c7254e !default;
+$code-bg:                     #f9f2f4 !default;
+
+$kbd-color:                   #fff !default;
+$kbd-bg:                      #333 !default;
+
+$pre-bg:                      #f5f5f5 !default;
+$pre-color:                   $gray-dark !default;
+$pre-border-color:            #ccc !default;
+$pre-scrollable-max-height:   340px !default;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px !default;
+//** Text muted color
+$text-muted:                  $gray-light !default;
+//** Abbreviations and acronyms border color
+$abbr-border-color:           $gray-light !default;
+//** Headings small color
+$headings-small-color:        $gray-light !default;
+//** Blockquote small color
+$blockquote-small-color:      $gray-light !default;
+//** Blockquote font size
+$blockquote-font-size:        ($font-size-base * 1.25) !default;
+//** Blockquote border color
+$blockquote-border-color:     $gray-lighter !default;
+//** Page header border color
+$page-header-border-color:    $gray-lighter !default;
+//** Width of horizontal description list titles
+$dl-horizontal-offset:        $component-offset-horizontal !default;
+//** Point at which .dl-horizontal becomes horizontal
+$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;
+//** Horizontal line color.
+$hr-border:                   $gray-lighter !default;
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_wells.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_wells.scss
new file mode 100644
index 0000000000000000000000000000000000000000..9a048bdd0c4d6f8b49264938b5b9d02f925d5158
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/_wells.scss
@@ -0,0 +1,29 @@
+//
+// Wells
+// --------------------------------------------------
+
+
+// Base class
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: $well-bg;
+  border: 1px solid $well-border;
+  border-radius: $border-radius-base;
+  @include box-shadow(inset 0 1px 1px rgba(0, 0, 0, .05));
+  blockquote {
+    border-color: #ddd;
+    border-color: rgba(0, 0, 0, .15);
+  }
+}
+
+// Sizes
+.well-lg {
+  padding: 24px;
+  border-radius: $border-radius-large;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: $border-radius-small;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_alerts.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_alerts.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b1e6df9d2406e41ce0d1b1f0db62e630d0609080
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_alerts.scss
@@ -0,0 +1,15 @@
+// Alerts
+
+@mixin alert-variant($background, $border, $text-color) {
+  color: $text-color;
+  background-color: $background;
+  border-color: $border;
+
+  hr {
+    border-top-color: darken($border, 5%);
+  }
+
+  .alert-link {
+    color: darken($text-color, 10%);
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_background-variant.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_background-variant.scss
new file mode 100644
index 0000000000000000000000000000000000000000..4c7769e13a3665a5cb9b12884f3ed82cfb277f34
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_background-variant.scss
@@ -0,0 +1,12 @@
+// Contextual backgrounds
+
+// [converter] $parent hack
+@mixin bg-variant($parent, $color) {
+  #{$parent} {
+    background-color: $color;
+  }
+  a#{$parent}:hover,
+  a#{$parent}:focus {
+    background-color: darken($color, 10%);
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_border-radius.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_border-radius.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e03c390804897079b1b4765e96e5159233bb045d
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_border-radius.scss
@@ -0,0 +1,18 @@
+// Single side border-radius
+
+@mixin border-top-radius($radius) {
+  border-top-left-radius: $radius;
+  border-top-right-radius: $radius;
+}
+@mixin border-right-radius($radius) {
+  border-top-right-radius: $radius;
+  border-bottom-right-radius: $radius;
+}
+@mixin border-bottom-radius($radius) {
+  border-bottom-right-radius: $radius;
+  border-bottom-left-radius: $radius;
+}
+@mixin border-left-radius($radius) {
+  border-top-left-radius: $radius;
+  border-bottom-left-radius: $radius;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_buttons.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_buttons.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5afa735e8ef5710dfffa2cae6ec3c1c03a518a17
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_buttons.scss
@@ -0,0 +1,61 @@
+// Button variants
+//
+// Easily pump out default styles, as well as :hover, :focus, :active,
+// and disabled options for all buttons
+
+@mixin button-variant($color, $background, $border) {
+  color: $color;
+  background-color: $background;
+  border-color: $border;
+
+  &:focus,
+  &.focus {
+    color: $color;
+    background-color: darken($background, 10%);
+    border-color: darken($border, 25%);
+  }
+  &:hover {
+    color: $color;
+    background-color: darken($background, 10%);
+    border-color: darken($border, 12%);
+  }
+  &:active,
+  &.active,
+  .open > &.dropdown-toggle {
+    color: $color;
+    background-color: darken($background, 10%);
+    background-image: none;
+    border-color: darken($border, 12%);
+
+    &:hover,
+    &:focus,
+    &.focus {
+      color: $color;
+      background-color: darken($background, 17%);
+      border-color: darken($border, 25%);
+    }
+  }
+  &.disabled,
+  &[disabled],
+  fieldset[disabled] & {
+    &:hover,
+    &:focus,
+    &.focus {
+      background-color: $background;
+      border-color: $border;
+    }
+  }
+
+  .badge {
+    color: $background;
+    background-color: $color;
+  }
+}
+
+// Button sizes
+@mixin button-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
+  padding: $padding-vertical $padding-horizontal;
+  font-size: $font-size;
+  line-height: $line-height;
+  border-radius: $border-radius;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_center-block.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_center-block.scss
new file mode 100644
index 0000000000000000000000000000000000000000..ed69097f5bbd727b091a5dd5a3dbb39dd0265a1b
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_center-block.scss
@@ -0,0 +1,7 @@
+// Center-align a block level element
+
+@mixin center-block() {
+  display: block;
+  margin-right: auto;
+  margin-left: auto;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_clearfix.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_clearfix.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e45eca50eacb7b9813aab24840f42c447f9f7294
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_clearfix.scss
@@ -0,0 +1,22 @@
+// Clearfix
+//
+// For modern browsers
+// 1. The space content is one way to avoid an Opera bug when the
+//    contenteditable attribute is included anywhere else in the document.
+//    Otherwise it causes space to appear at the top and bottom of elements
+//    that are clearfixed.
+// 2. The use of `table` rather than `block` is only necessary if using
+//    `:before` to contain the top-margins of child elements.
+//
+// Source: http://nicolasgallagher.com/micro-clearfix-hack/
+
+@mixin clearfix() {
+  &:before,
+  &:after {
+    display: table; // 2
+    content: " "; // 1
+  }
+  &:after {
+    clear: both;
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_forms.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_forms.scss
new file mode 100644
index 0000000000000000000000000000000000000000..46578a14b0d8a089fa98f82cb6bd460d5852ded8
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_forms.scss
@@ -0,0 +1,88 @@
+// Form validation states
+//
+// Used in forms.less to generate the form validation CSS for warnings, errors,
+// and successes.
+
+@mixin form-control-validation($text-color: #555, $border-color: #ccc, $background-color: #f5f5f5) {
+  // Color the label and help text
+  .help-block,
+  .control-label,
+  .radio,
+  .checkbox,
+  .radio-inline,
+  .checkbox-inline,
+  &.radio label,
+  &.checkbox label,
+  &.radio-inline label,
+  &.checkbox-inline label  {
+    color: $text-color;
+  }
+  // Set the border and box shadow on specific inputs to match
+  .form-control {
+    border-color: $border-color;
+    @include box-shadow(inset 0 1px 1px rgba(0, 0, 0, .075)); // Redeclare so transitions work
+    &:focus {
+      border-color: darken($border-color, 10%);
+      $shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px lighten($border-color, 20%);
+      @include box-shadow($shadow);
+    }
+  }
+  // Set validation states also for addons
+  .input-group-addon {
+    color: $text-color;
+    background-color: $background-color;
+    border-color: $border-color;
+  }
+  // Optional feedback icon
+  .form-control-feedback {
+    color: $text-color;
+  }
+}
+
+
+// Form control focus state
+//
+// Generate a customized focus state and for any input with the specified color,
+// which defaults to the `$input-border-focus` variable.
+//
+// We highly encourage you to not customize the default value, but instead use
+// this to tweak colors on an as-needed basis. This aesthetic change is based on
+// WebKit's default styles, but applicable to a wider range of browsers. Its
+// usability and accessibility should be taken into account with any change.
+//
+// Example usage: change the default blue border and shadow to white for better
+// contrast against a dark gray background.
+@mixin form-control-focus($color: $input-border-focus) {
+  $color-rgba: rgba(red($color), green($color), blue($color), .6);
+  &:focus {
+    border-color: $color;
+    outline: 0;
+    @include box-shadow(inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px $color-rgba);
+  }
+}
+
+// Form control sizing
+//
+// Relative text size, padding, and border-radii changes for form controls. For
+// horizontal sizing, wrap controls in the predefined grid classes. `<select>`
+// element gets special love because it's special, and that's a fact!
+// [converter] $parent hack
+@mixin input-size($parent, $input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
+  #{$parent} {
+    height: $input-height;
+    padding: $padding-vertical $padding-horizontal;
+    font-size: $font-size;
+    line-height: $line-height;
+    border-radius: $border-radius;
+  }
+
+  select#{$parent} {
+    height: $input-height;
+    line-height: $input-height;
+  }
+
+  textarea#{$parent},
+  select[multiple]#{$parent} {
+    height: auto;
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_gradients.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_gradients.scss
new file mode 100644
index 0000000000000000000000000000000000000000..fd814407ea34e036a232861ff54b041d92d80e5f
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_gradients.scss
@@ -0,0 +1,56 @@
+
+
+// Horizontal gradient, from left to right
+//
+// Creates two color stops, start and end, by specifying a color and position for each color stop.
+// Color stops are not available in IE9 and below.
+@mixin gradient-horizontal($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
+  background-image: -webkit-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Safari 5.1-6, Chrome 10+
+  background-image: -o-linear-gradient(left, $start-color $start-percent, $end-color $end-percent); // Opera 12
+  background-image: linear-gradient(to right, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down
+  background-repeat: repeat-x;
+}
+
+// Vertical gradient, from top to bottom
+//
+// Creates two color stops, start and end, by specifying a color and position for each color stop.
+// Color stops are not available in IE9 and below.
+@mixin gradient-vertical($start-color: #555, $end-color: #333, $start-percent: 0%, $end-percent: 100%) {
+  background-image: -webkit-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Safari 5.1-6, Chrome 10+
+  background-image: -o-linear-gradient(top, $start-color $start-percent, $end-color $end-percent);  // Opera 12
+  background-image: linear-gradient(to bottom, $start-color $start-percent, $end-color $end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down
+  background-repeat: repeat-x;
+}
+
+@mixin gradient-directional($start-color: #555, $end-color: #333, $deg: 45deg) {
+  background-image: -webkit-linear-gradient($deg, $start-color, $end-color); // Safari 5.1-6, Chrome 10+
+  background-image: -o-linear-gradient($deg, $start-color, $end-color); // Opera 12
+  background-image: linear-gradient($deg, $start-color, $end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
+  background-repeat: repeat-x;
+}
+@mixin gradient-horizontal-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
+  background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
+  background-image: -o-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color);
+  background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=1); // IE9 and down, gets no color-stop at all for proper fallback
+  background-repeat: no-repeat;
+}
+@mixin gradient-vertical-three-colors($start-color: #00b3ee, $mid-color: #7a43b6, $color-stop: 50%, $end-color: #c3325f) {
+  background-image: -webkit-linear-gradient($start-color, $mid-color $color-stop, $end-color);
+  background-image: -o-linear-gradient($start-color, $mid-color $color-stop, $end-color);
+  background-image: linear-gradient($start-color, $mid-color $color-stop, $end-color);
+  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#{ie-hex-str($start-color)}', endColorstr='#{ie-hex-str($end-color)}', GradientType=0); // IE9 and down, gets no color-stop at all for proper fallback
+  background-repeat: no-repeat;
+}
+@mixin gradient-radial($inner-color: #555, $outer-color: #333) {
+  background-image: -webkit-radial-gradient(circle, $inner-color, $outer-color);
+  background-image: radial-gradient(circle, $inner-color, $outer-color);
+  background-repeat: no-repeat;
+}
+@mixin gradient-striped($color: rgba(255, 255, 255, .15), $angle: 45deg) {
+  background-image: -webkit-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+  background-image: -o-linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+  background-image: linear-gradient($angle, $color 25%, transparent 25%, transparent 50%, $color 50%, $color 75%, transparent 75%, transparent);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_grid-framework.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
new file mode 100644
index 0000000000000000000000000000000000000000..2b84cb13c8282f3802f0287f9dba59c48f4f093c
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_grid-framework.scss
@@ -0,0 +1,81 @@
+// Framework grid generation
+//
+// Used only by Bootstrap to generate the correct number of grid classes given
+// any value of `$grid-columns`.
+
+// [converter] This is defined recursively in LESS, but Sass supports real loops
+@mixin make-grid-columns($i: 1, $list: ".col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}") {
+  @for $i from (1 + 1) through $grid-columns {
+    $list: "#{$list}, .col-xs-#{$i}, .col-sm-#{$i}, .col-md-#{$i}, .col-lg-#{$i}";
+  }
+  #{$list} {
+    position: relative;
+    // Prevent columns from collapsing when empty
+    min-height: 1px;
+    // Inner gutter via padding
+    padding-right: floor(($grid-gutter-width / 2));
+    padding-left: ceil(($grid-gutter-width / 2));
+  }
+}
+
+
+// [converter] This is defined recursively in LESS, but Sass supports real loops
+@mixin float-grid-columns($class, $i: 1, $list: ".col-#{$class}-#{$i}") {
+  @for $i from (1 + 1) through $grid-columns {
+    $list: "#{$list}, .col-#{$class}-#{$i}";
+  }
+  #{$list} {
+    float: left;
+  }
+}
+
+
+@mixin calc-grid-column($index, $class, $type) {
+  @if ($type == width) and ($index > 0) {
+    .col-#{$class}-#{$index} {
+      width: percentage(($index / $grid-columns));
+    }
+  }
+  @if ($type == push) and ($index > 0) {
+    .col-#{$class}-push-#{$index} {
+      left: percentage(($index / $grid-columns));
+    }
+  }
+  @if ($type == push) and ($index == 0) {
+    .col-#{$class}-push-0 {
+      left: auto;
+    }
+  }
+  @if ($type == pull) and ($index > 0) {
+    .col-#{$class}-pull-#{$index} {
+      right: percentage(($index / $grid-columns));
+    }
+  }
+  @if ($type == pull) and ($index == 0) {
+    .col-#{$class}-pull-0 {
+      right: auto;
+    }
+  }
+  @if ($type == offset) {
+    .col-#{$class}-offset-#{$index} {
+      margin-left: percentage(($index / $grid-columns));
+    }
+  }
+}
+
+// [converter] This is defined recursively in LESS, but Sass supports real loops
+@mixin loop-grid-columns($columns, $class, $type) {
+  @for $i from 0 through $columns {
+    @include calc-grid-column($i, $class, $type);
+  }
+}
+
+
+// Create grid for specific class
+@mixin make-grid($class) {
+  @include float-grid-columns($class);
+  @include loop-grid-columns($grid-columns, $class, width);
+  @include loop-grid-columns($grid-columns, $class, pull);
+  @include loop-grid-columns($grid-columns, $class, push);
+  @include loop-grid-columns($grid-columns, $class, offset);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_grid.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_grid.scss
new file mode 100644
index 0000000000000000000000000000000000000000..884ac4f5b0d6829cbb1fb567c4e5b5dab1af4442
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_grid.scss
@@ -0,0 +1,122 @@
+// Grid system
+//
+// Generate semantic grid columns with these mixins.
+
+// Centered container element
+@mixin container-fixed($gutter: $grid-gutter-width) {
+  padding-right: ceil(($gutter / 2));
+  padding-left: floor(($gutter / 2));
+  margin-right: auto;
+  margin-left: auto;
+  @include clearfix;
+}
+
+// Creates a wrapper for a series of columns
+@mixin make-row($gutter: $grid-gutter-width) {
+  margin-right: floor(($gutter / -2));
+  margin-left: ceil(($gutter / -2));
+  @include clearfix;
+}
+
+// Generate the extra small columns
+@mixin make-xs-column($columns, $gutter: $grid-gutter-width) {
+  position: relative;
+  float: left;
+  width: percentage(($columns / $grid-columns));
+  min-height: 1px;
+  padding-right: ($gutter / 2);
+  padding-left: ($gutter / 2);
+}
+@mixin make-xs-column-offset($columns) {
+  margin-left: percentage(($columns / $grid-columns));
+}
+@mixin make-xs-column-push($columns) {
+  left: percentage(($columns / $grid-columns));
+}
+@mixin make-xs-column-pull($columns) {
+  right: percentage(($columns / $grid-columns));
+}
+
+// Generate the small columns
+@mixin make-sm-column($columns, $gutter: $grid-gutter-width) {
+  position: relative;
+  min-height: 1px;
+  padding-right: ($gutter / 2);
+  padding-left: ($gutter / 2);
+
+  @media (min-width: $screen-sm-min) {
+    float: left;
+    width: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-sm-column-offset($columns) {
+  @media (min-width: $screen-sm-min) {
+    margin-left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-sm-column-push($columns) {
+  @media (min-width: $screen-sm-min) {
+    left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-sm-column-pull($columns) {
+  @media (min-width: $screen-sm-min) {
+    right: percentage(($columns / $grid-columns));
+  }
+}
+
+// Generate the medium columns
+@mixin make-md-column($columns, $gutter: $grid-gutter-width) {
+  position: relative;
+  min-height: 1px;
+  padding-right: ($gutter / 2);
+  padding-left: ($gutter / 2);
+
+  @media (min-width: $screen-md-min) {
+    float: left;
+    width: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-md-column-offset($columns) {
+  @media (min-width: $screen-md-min) {
+    margin-left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-md-column-push($columns) {
+  @media (min-width: $screen-md-min) {
+    left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-md-column-pull($columns) {
+  @media (min-width: $screen-md-min) {
+    right: percentage(($columns / $grid-columns));
+  }
+}
+
+// Generate the large columns
+@mixin make-lg-column($columns, $gutter: $grid-gutter-width) {
+  position: relative;
+  min-height: 1px;
+  padding-right: ($gutter / 2);
+  padding-left: ($gutter / 2);
+
+  @media (min-width: $screen-lg-min) {
+    float: left;
+    width: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-lg-column-offset($columns) {
+  @media (min-width: $screen-lg-min) {
+    margin-left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-lg-column-push($columns) {
+  @media (min-width: $screen-lg-min) {
+    left: percentage(($columns / $grid-columns));
+  }
+}
+@mixin make-lg-column-pull($columns) {
+  @media (min-width: $screen-lg-min) {
+    right: percentage(($columns / $grid-columns));
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_hide-text.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_hide-text.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1767e029c53a5e817ce79e9d489fd2cc114d319c
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_hide-text.scss
@@ -0,0 +1,21 @@
+// CSS image replacement
+//
+// Heads up! v3 launched with only `.hide-text()`, but per our pattern for
+// mixins being reused as classes with the same name, this doesn't hold up. As
+// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.
+//
+// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
+
+// Deprecated as of v3.0.1 (has been removed in v4)
+@mixin hide-text() {
+  font: 0/0 a;
+  color: transparent;
+  text-shadow: none;
+  background-color: transparent;
+  border: 0;
+}
+
+// New mixin to use as of v3.0.1
+@mixin text-hide() {
+  @include hide-text;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_image.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_image.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b5a109b209d45f54ec03fa93258dcf89096867cf
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_image.scss
@@ -0,0 +1,28 @@
+// Responsive image
+//
+// Keep images from scaling beyond the width of their parents.
+@mixin img-responsive($display: block) {
+  display: $display;
+  max-width: 100%; // Part 1: Set a maximum relative to the parent
+  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
+}
+
+
+// Retina image
+//
+// Short retina mixin for setting background-image and -size. Note that the
+// spelling of `min--moz-device-pixel-ratio` is intentional.
+@mixin img-retina($file-1x, $file-2x, $width-1x, $height-1x) {
+  background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-1x}"), "#{$file-1x}"));
+
+  @media
+  only screen and (-webkit-min-device-pixel-ratio: 2),
+  only screen and ( min--moz-device-pixel-ratio: 2),
+  only screen and ( -o-min-device-pixel-ratio: 2/1),
+  only screen and ( min-device-pixel-ratio: 2),
+  only screen and ( min-resolution: 192dpi),
+  only screen and ( min-resolution: 2dppx) {
+    background-image: url(if($bootstrap-sass-asset-helper, twbs-image-path("#{$file-2x}"), "#{$file-2x}"));
+    background-size: $width-1x $height-1x;
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_labels.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_labels.scss
new file mode 100644
index 0000000000000000000000000000000000000000..eda6dfd29ea1709380b27748ef5d082fed20903a
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_labels.scss
@@ -0,0 +1,12 @@
+// Labels
+
+@mixin label-variant($color) {
+  background-color: $color;
+
+  &[href] {
+    &:hover,
+    &:focus {
+      background-color: darken($color, 10%);
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_list-group.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_list-group.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c478eeb31e321a4199329b653e06b2cb57ab3436
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_list-group.scss
@@ -0,0 +1,32 @@
+// List Groups
+
+@mixin list-group-item-variant($state, $background, $color) {
+  .list-group-item-#{$state} {
+    color: $color;
+    background-color: $background;
+
+    // [converter] extracted a&, button& to a.list-group-item-#{$state}, button.list-group-item-#{$state}
+  }
+
+  a.list-group-item-#{$state},
+  button.list-group-item-#{$state} {
+    color: $color;
+
+    .list-group-item-heading {
+      color: inherit;
+    }
+
+    &:hover,
+    &:focus {
+      color: $color;
+      background-color: darken($background, 5%);
+    }
+    &.active,
+    &.active:hover,
+    &.active:focus {
+      color: #fff;
+      background-color: $color;
+      border-color: $color;
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_nav-divider.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_nav-divider.scss
new file mode 100644
index 0000000000000000000000000000000000000000..2e6da02a4748b00cf67c21cc1735c26373e9c4c8
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_nav-divider.scss
@@ -0,0 +1,10 @@
+// Horizontal dividers
+//
+// Dividers (basically an hr) within dropdowns and nav lists
+
+@mixin nav-divider($color: #e5e5e5) {
+  height: 1px;
+  margin: (($line-height-computed / 2) - 1) 0;
+  overflow: hidden;
+  background-color: $color;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c8fbf1a7d67d35140c5de3b192fd917775ac8c18
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_nav-vertical-align.scss
@@ -0,0 +1,9 @@
+// Navbar vertical align
+//
+// Vertically center elements in the navbar.
+// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.
+
+@mixin navbar-vertical-align($element-height) {
+  margin-top: (($navbar-height - $element-height) / 2);
+  margin-bottom: (($navbar-height - $element-height) / 2);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_opacity.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_opacity.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e9c5573345ae2ee4232259c1736183faebe56991
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_opacity.scss
@@ -0,0 +1,7 @@
+// Opacity
+
+@mixin opacity($opacity) {
+  $opacity-ie: ($opacity * 100);  // IE8 filter
+  filter: alpha(opacity=$opacity-ie);
+  opacity: $opacity;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_pagination.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_pagination.scss
new file mode 100644
index 0000000000000000000000000000000000000000..d4a5404fce227fd7de1af1be1d979152d1a62694
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_pagination.scss
@@ -0,0 +1,24 @@
+// Pagination
+
+@mixin pagination-size($padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius) {
+  > li {
+    > a,
+    > span {
+      padding: $padding-vertical $padding-horizontal;
+      font-size: $font-size;
+      line-height: $line-height;
+    }
+    &:first-child {
+      > a,
+      > span {
+        @include border-left-radius($border-radius);
+      }
+    }
+    &:last-child {
+      > a,
+      > span {
+        @include border-right-radius($border-radius);
+      }
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_panels.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_panels.scss
new file mode 100644
index 0000000000000000000000000000000000000000..3ff31ae51ee0827d9a4dd3e14ff3fd18f90572fb
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_panels.scss
@@ -0,0 +1,24 @@
+// Panels
+
+@mixin panel-variant($border, $heading-text-color, $heading-bg-color, $heading-border) {
+  border-color: $border;
+
+  & > .panel-heading {
+    color: $heading-text-color;
+    background-color: $heading-bg-color;
+    border-color: $heading-border;
+
+    + .panel-collapse > .panel-body {
+      border-top-color: $border;
+    }
+    .badge {
+      color: $heading-bg-color;
+      background-color: $heading-text-color;
+    }
+  }
+  & > .panel-footer {
+    + .panel-collapse > .panel-body {
+      border-bottom-color: $border;
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_progress-bar.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_progress-bar.scss
new file mode 100644
index 0000000000000000000000000000000000000000..90a62afc2d6b33de932ff21247b9ef7eec258cf6
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_progress-bar.scss
@@ -0,0 +1,10 @@
+// Progress bars
+
+@mixin progress-bar-variant($color) {
+  background-color: $color;
+
+  // Deprecated parent class requirement as of v3.2.0
+  .progress-striped & {
+    @include gradient-striped;
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_reset-filter.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_reset-filter.scss
new file mode 100644
index 0000000000000000000000000000000000000000..bf73051200ec53b4fca0fcb50eaa8bf7b7c16d23
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_reset-filter.scss
@@ -0,0 +1,8 @@
+// Reset filters for IE
+//
+// When you need to remove a gradient background, do not forget to use this to reset
+// the IE filter for IE9 and below.
+
+@mixin reset-filter() {
+  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_reset-text.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_reset-text.scss
new file mode 100644
index 0000000000000000000000000000000000000000..8997eca28597c2d1c3f6f828af5135eb0b2a587b
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_reset-text.scss
@@ -0,0 +1,18 @@
+@mixin reset-text() {
+  font-family: $font-family-base;
+  // We deliberately do NOT reset font-size.
+  font-style: normal;
+  font-weight: 400;
+  line-height: $line-height-base;
+  line-break: auto;
+  text-align: left; // Fallback for where `start` is not supported
+  text-align: start;
+  text-decoration: none;
+  text-shadow: none;
+  text-transform: none;
+  letter-spacing: normal;
+  word-break: normal;
+  word-spacing: normal;
+  word-wrap: normal;
+  white-space: normal;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_resize.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_resize.scss
new file mode 100644
index 0000000000000000000000000000000000000000..66f233a63c988deb5a59dde3bba962082fbdfd57
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_resize.scss
@@ -0,0 +1,6 @@
+// Resize anything
+
+@mixin resizable($direction) {
+  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`
+  resize: $direction; // Options: horizontal, vertical, both
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss
new file mode 100644
index 0000000000000000000000000000000000000000..d25ef973f589b963086461e1bcad956ea5ee47a7
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_responsive-visibility.scss
@@ -0,0 +1,17 @@
+// [converter] $parent hack
+@mixin responsive-visibility($parent) {
+  #{$parent} {
+    display: block !important;
+  }
+  table#{$parent}  { display: table !important; }
+  tr#{$parent}     { display: table-row !important; }
+  th#{$parent},
+  td#{$parent}     { display: table-cell !important; }
+}
+
+// [converter] $parent hack
+@mixin responsive-invisibility($parent) {
+  #{$parent} {
+    display: none !important;
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_size.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_size.scss
new file mode 100644
index 0000000000000000000000000000000000000000..abbe2463ce8d7c315f8a2368f9301603315a35db
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_size.scss
@@ -0,0 +1,10 @@
+// Sizing shortcuts
+
+@mixin size($width, $height) {
+  width: $width;
+  height: $height;
+}
+
+@mixin square($size) {
+  @include size($size, $size);
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_tab-focus.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_tab-focus.scss
new file mode 100644
index 0000000000000000000000000000000000000000..f16ed6428aac35b4bc86d9c18501f651632d2adf
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_tab-focus.scss
@@ -0,0 +1,9 @@
+// WebKit-style focus
+
+@mixin tab-focus() {
+  // WebKit-specific. Other browsers will keep their default outline style.
+  // (Initially tried to also force default via `outline: initial`,
+  // but that seems to erroneously remove the outline in Firefox altogether.)
+  outline: 5px auto -webkit-focus-ring-color;
+  outline-offset: -2px;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_table-row.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_table-row.scss
new file mode 100644
index 0000000000000000000000000000000000000000..136795081eb992d71b7a72dae19795bf71135316
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_table-row.scss
@@ -0,0 +1,28 @@
+// Tables
+
+@mixin table-row-variant($state, $background) {
+  // Exact selectors below required to override `.table-striped` and prevent
+  // inheritance to nested tables.
+  .table > thead > tr,
+  .table > tbody > tr,
+  .table > tfoot > tr {
+    > td.#{$state},
+    > th.#{$state},
+    &.#{$state} > td,
+    &.#{$state} > th {
+      background-color: $background;
+    }
+  }
+
+  // Hover states for `.table-hover`
+  // Note: this is not available for cells or rows within `thead` or `tfoot`.
+  .table-hover > tbody > tr {
+    > td.#{$state}:hover,
+    > th.#{$state}:hover,
+    &.#{$state}:hover > td,
+    &:hover > .#{$state},
+    &.#{$state}:hover > th {
+      background-color: darken($background, 5%);
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss
new file mode 100644
index 0000000000000000000000000000000000000000..3b446c41524883db963f728dbd5439ea993c8d64
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_text-emphasis.scss
@@ -0,0 +1,12 @@
+// Typography
+
+// [converter] $parent hack
+@mixin text-emphasis-variant($parent, $color) {
+  #{$parent} {
+    color: $color;
+  }
+  a#{$parent}:hover,
+  a#{$parent}:focus {
+    color: darken($color, 10%);
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_text-overflow.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_text-overflow.scss
new file mode 100644
index 0000000000000000000000000000000000000000..1593b25ea5c7b570188f99bbeda5f36b0d57e5eb
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_text-overflow.scss
@@ -0,0 +1,8 @@
+// Text overflow
+// Requires inline-block or block for proper styling
+
+@mixin text-overflow() {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss
new file mode 100644
index 0000000000000000000000000000000000000000..93d5775281ffafc378b291c21ea0e62b079aad2c
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/assets/stylesheets/bootstrap/mixins/_vendor-prefixes.scss
@@ -0,0 +1,222 @@
+// Vendor Prefixes
+//
+// All vendor mixins are deprecated as of v3.2.0 due to the introduction of
+// Autoprefixer in our Gruntfile. They have been removed in v4.
+
+// - Animations
+// - Backface visibility
+// - Box shadow
+// - Box sizing
+// - Content columns
+// - Hyphens
+// - Placeholder text
+// - Transformations
+// - Transitions
+// - User Select
+
+
+// Animations
+@mixin animation($animation) {
+  -webkit-animation: $animation;
+       -o-animation: $animation;
+          animation: $animation;
+}
+@mixin animation-name($name) {
+  -webkit-animation-name: $name;
+          animation-name: $name;
+}
+@mixin animation-duration($duration) {
+  -webkit-animation-duration: $duration;
+          animation-duration: $duration;
+}
+@mixin animation-timing-function($timing-function) {
+  -webkit-animation-timing-function: $timing-function;
+          animation-timing-function: $timing-function;
+}
+@mixin animation-delay($delay) {
+  -webkit-animation-delay: $delay;
+          animation-delay: $delay;
+}
+@mixin animation-iteration-count($iteration-count) {
+  -webkit-animation-iteration-count: $iteration-count;
+          animation-iteration-count: $iteration-count;
+}
+@mixin animation-direction($direction) {
+  -webkit-animation-direction: $direction;
+          animation-direction: $direction;
+}
+@mixin animation-fill-mode($fill-mode) {
+  -webkit-animation-fill-mode: $fill-mode;
+          animation-fill-mode: $fill-mode;
+}
+
+// Backface visibility
+// Prevent browsers from flickering when using CSS 3D transforms.
+// Default value is `visible`, but can be changed to `hidden`
+
+@mixin backface-visibility($visibility) {
+  -webkit-backface-visibility: $visibility;
+     -moz-backface-visibility: $visibility;
+          backface-visibility: $visibility;
+}
+
+// Drop shadows
+//
+// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's
+// supported browsers that have box shadow capabilities now support it.
+
+@mixin box-shadow($shadow...) {
+  -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1
+          box-shadow: $shadow;
+}
+
+// Box sizing
+@mixin box-sizing($boxmodel) {
+  -webkit-box-sizing: $boxmodel;
+     -moz-box-sizing: $boxmodel;
+          box-sizing: $boxmodel;
+}
+
+// CSS3 Content Columns
+@mixin content-columns($column-count, $column-gap: $grid-gutter-width) {
+  -webkit-column-count: $column-count;
+     -moz-column-count: $column-count;
+          column-count: $column-count;
+  -webkit-column-gap: $column-gap;
+     -moz-column-gap: $column-gap;
+          column-gap: $column-gap;
+}
+
+// Optional hyphenation
+@mixin hyphens($mode: auto) {
+  -webkit-hyphens: $mode;
+     -moz-hyphens: $mode;
+      -ms-hyphens: $mode; // IE10+
+       -o-hyphens: $mode;
+          hyphens: $mode;
+  word-wrap: break-word;
+}
+
+// Placeholder text
+@mixin placeholder($color: $input-color-placeholder) {
+  // Firefox
+  &::-moz-placeholder {
+    color: $color;
+    opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
+  }
+  &:-ms-input-placeholder { color: $color; } // Internet Explorer 10+
+  &::-webkit-input-placeholder  { color: $color; } // Safari and Chrome
+}
+
+// Transformations
+@mixin scale($ratio...) {
+  -webkit-transform: scale($ratio);
+      -ms-transform: scale($ratio); // IE9 only
+       -o-transform: scale($ratio);
+          transform: scale($ratio);
+}
+
+@mixin scaleX($ratio) {
+  -webkit-transform: scaleX($ratio);
+      -ms-transform: scaleX($ratio); // IE9 only
+       -o-transform: scaleX($ratio);
+          transform: scaleX($ratio);
+}
+@mixin scaleY($ratio) {
+  -webkit-transform: scaleY($ratio);
+      -ms-transform: scaleY($ratio); // IE9 only
+       -o-transform: scaleY($ratio);
+          transform: scaleY($ratio);
+}
+@mixin skew($x, $y) {
+  -webkit-transform: skewX($x) skewY($y);
+      -ms-transform: skewX($x) skewY($y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
+       -o-transform: skewX($x) skewY($y);
+          transform: skewX($x) skewY($y);
+}
+@mixin translate($x, $y) {
+  -webkit-transform: translate($x, $y);
+      -ms-transform: translate($x, $y); // IE9 only
+       -o-transform: translate($x, $y);
+          transform: translate($x, $y);
+}
+@mixin translate3d($x, $y, $z) {
+  -webkit-transform: translate3d($x, $y, $z);
+          transform: translate3d($x, $y, $z);
+}
+@mixin rotate($degrees) {
+  -webkit-transform: rotate($degrees);
+      -ms-transform: rotate($degrees); // IE9 only
+       -o-transform: rotate($degrees);
+          transform: rotate($degrees);
+}
+@mixin rotateX($degrees) {
+  -webkit-transform: rotateX($degrees);
+      -ms-transform: rotateX($degrees); // IE9 only
+       -o-transform: rotateX($degrees);
+          transform: rotateX($degrees);
+}
+@mixin rotateY($degrees) {
+  -webkit-transform: rotateY($degrees);
+      -ms-transform: rotateY($degrees); // IE9 only
+       -o-transform: rotateY($degrees);
+          transform: rotateY($degrees);
+}
+@mixin perspective($perspective) {
+  -webkit-perspective: $perspective;
+     -moz-perspective: $perspective;
+          perspective: $perspective;
+}
+@mixin perspective-origin($perspective) {
+  -webkit-perspective-origin: $perspective;
+     -moz-perspective-origin: $perspective;
+          perspective-origin: $perspective;
+}
+@mixin transform-origin($origin) {
+  -webkit-transform-origin: $origin;
+     -moz-transform-origin: $origin;
+      -ms-transform-origin: $origin; // IE9 only
+          transform-origin: $origin;
+}
+
+
+// Transitions
+
+@mixin transition($transition...) {
+  -webkit-transition: $transition;
+       -o-transition: $transition;
+          transition: $transition;
+}
+@mixin transition-property($transition-property...) {
+  -webkit-transition-property: $transition-property;
+          transition-property: $transition-property;
+}
+@mixin transition-delay($transition-delay) {
+  -webkit-transition-delay: $transition-delay;
+          transition-delay: $transition-delay;
+}
+@mixin transition-duration($transition-duration...) {
+  -webkit-transition-duration: $transition-duration;
+          transition-duration: $transition-duration;
+}
+@mixin transition-timing-function($timing-function) {
+  -webkit-transition-timing-function: $timing-function;
+          transition-timing-function: $timing-function;
+}
+@mixin transition-transform($transition...) {
+  -webkit-transition: -webkit-transform $transition;
+     -moz-transition: -moz-transform $transition;
+       -o-transition: -o-transform $transition;
+          transition: transform $transition;
+}
+
+
+// User select
+// For selecting text on the page
+
+@mixin user-select($select) {
+  -webkit-user-select: $select;
+     -moz-user-select: $select;
+      -ms-user-select: $select; // IE10+
+          user-select: $select;
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/bootstrap-sass.gemspec b/civicrm/ext/greenwich/extern/bootstrap3/bootstrap-sass.gemspec
new file mode 100644
index 0000000000000000000000000000000000000000..464ad00a9fb37b7b68509e51ae2945f3b828d3d2
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/bootstrap-sass.gemspec
@@ -0,0 +1,37 @@
+lib = File.expand_path('../lib', __FILE__)
+$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
+require 'bootstrap-sass/version'
+
+Gem::Specification.new do |s|
+  s.name     = 'bootstrap-sass'
+  s.version  = Bootstrap::VERSION
+  s.authors  = ['Thomas McDonald']
+  s.email    = 'tom@conceptcoding.co.uk'
+  s.summary  = 'bootstrap-sass is a Sass-powered version of Bootstrap 3, ready to drop right into your Sass powered applications.'
+  s.homepage = 'https://github.com/twbs/bootstrap-sass'
+  s.license  = 'MIT'
+
+  s.add_runtime_dependency 'sassc', '>= 2.0.0'
+  s.add_runtime_dependency 'autoprefixer-rails', '>= 5.2.1'
+
+  # Testing dependencies
+  s.add_development_dependency 'minitest', '~> 5.11'
+  s.add_development_dependency 'minitest-reporters', '~> 1.3'
+  # Integration testing
+  s.add_development_dependency 'capybara', '~> 3.6'
+  s.add_development_dependency 'poltergeist'
+  # Dummy Rails app dependencies
+  s.add_development_dependency 'sassc-rails', '>= 2.0.0'
+  s.add_development_dependency 'actionpack', '>= 4.1.5'
+  s.add_development_dependency 'activesupport', '>= 4.1.5'
+  s.add_development_dependency 'json', '>= 1.8.1'
+  s.add_development_dependency 'sprockets-rails', '>= 2.1.3'
+  s.add_development_dependency 'jquery-rails', '>= 3.1.0'
+  s.add_development_dependency 'slim-rails'
+  s.add_development_dependency 'uglifier'
+  # Converter
+  s.add_development_dependency 'term-ansicolor'
+
+  s.files      = `git ls-files`.split("\n")
+  s.test_files = `git ls-files -- test/*`.split("\n")
+end
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/bower.json b/civicrm/ext/greenwich/extern/bootstrap3/bower.json
new file mode 100644
index 0000000000000000000000000000000000000000..303fd79abbaa3e59dd9284301d3cf0ffebd30799
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/bower.json
@@ -0,0 +1,36 @@
+{
+  "name": "bootstrap-sass",
+  "homepage": "https://github.com/twbs/bootstrap-sass",
+  "authors": [
+    "Thomas McDonald",
+    "Tristan Harward",
+    "Peter Gumeson",
+    "Gleb Mazovetskiy"
+  ],
+  "description": "bootstrap-sass is a Sass-powered version of Bootstrap 3, ready to drop right into your Sass powered applications.",
+  "moduleType": "globals",
+  "main": [
+    "assets/stylesheets/_bootstrap.scss",
+    "assets/javascripts/bootstrap.js"
+  ],
+  "keywords": [
+    "twbs",
+    "bootstrap",
+    "sass"
+  ],
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "lib",
+    "tasks",
+    "templates",
+    "test",
+    "*.gemspec",
+    "Rakefile",
+    "Gemfile"
+  ],
+  "dependencies": {
+    "jquery": "1.9.1 - 3"
+  },
+  "version": "3.4.1"
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/composer.json b/civicrm/ext/greenwich/extern/bootstrap3/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..5bbee773a3ca3c095ee237713906c3338d5fcc61
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/composer.json
@@ -0,0 +1,35 @@
+{
+    "name": "twbs/bootstrap-sass",
+    "description": "bootstrap-sass is a Sass-powered version of Bootstrap 3, ready to drop right into your Sass powered applications.",
+    "keywords": ["bootstrap", "css", "sass"],
+    "homepage": "http://github.com/twbs/bootstrap-sass",
+    "authors": [
+        {
+            "name": "Thomas McDonald"
+        },
+        {
+            "name": "Tristan Harward"
+        },
+        {
+            "name": "Peter Gumeson"
+        },
+        {
+            "name": "Gleb Mazovetskiy"
+        },
+        {
+            "name": "Mark Otto"
+        },
+        {
+            "name": "Jacob Thornton"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/twbs/bootstrap-sass/issues"
+    },
+    "license": "MIT",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.4.x-dev"
+        }
+    }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/eyeglass-exports.js b/civicrm/ext/greenwich/extern/bootstrap3/eyeglass-exports.js
new file mode 100644
index 0000000000000000000000000000000000000000..ec49addd5c6df7d45a880e6d05c77f1e9d4319b2
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/eyeglass-exports.js
@@ -0,0 +1,7 @@
+var path = require('path');
+
+module.exports = function(eyeglass, sass) {
+  return {
+    sassDir: path.join(__dirname, 'assets/stylesheets')
+  }
+};
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/package-lock.json b/civicrm/ext/greenwich/extern/bootstrap3/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..3be80337e0539dd1f0585ff7b7717be37e0499be
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/package-lock.json
@@ -0,0 +1,1611 @@
+{
+  "name": "bootstrap-sass",
+  "version": "3.3.7",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+      "dev": true
+    },
+    "ajv": {
+      "version": "5.5.2",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+      "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+      "dev": true,
+      "requires": {
+        "co": "4.6.0",
+        "fast-deep-equal": "1.1.0",
+        "fast-json-stable-stringify": "2.0.0",
+        "json-schema-traverse": "0.3.1"
+      }
+    },
+    "amdefine": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+      "dev": true
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "dev": true
+    },
+    "ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+      "dev": true
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "dev": true
+    },
+    "are-we-there-yet": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+      "dev": true,
+      "requires": {
+        "delegates": "1.0.0",
+        "readable-stream": "2.3.6"
+      }
+    },
+    "array-find-index": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
+      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
+      "dev": true
+    },
+    "asn1": {
+      "version": "0.2.4",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "dev": true,
+      "requires": {
+        "safer-buffer": "2.1.2"
+      }
+    },
+    "assert-plus": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+      "dev": true
+    },
+    "async-foreach": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
+      "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=",
+      "dev": true
+    },
+    "asynckit": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+      "dev": true
+    },
+    "aws-sign2": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+      "dev": true
+    },
+    "aws4": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+      "dev": true
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "dev": true
+    },
+    "bcrypt-pbkdf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "tweetnacl": "0.14.5"
+      }
+    },
+    "block-stream": {
+      "version": "0.0.9",
+      "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
+      "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
+      "dev": true,
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "camelcase": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
+      "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
+      "dev": true
+    },
+    "camelcase-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "dev": true,
+      "requires": {
+        "camelcase": "2.1.1",
+        "map-obj": "1.0.1"
+      }
+    },
+    "caseless": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+      "dev": true
+    },
+    "chalk": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "dev": true,
+      "requires": {
+        "ansi-styles": "2.2.1",
+        "escape-string-regexp": "1.0.5",
+        "has-ansi": "2.0.0",
+        "strip-ansi": "3.0.1",
+        "supports-color": "2.0.0"
+      }
+    },
+    "cliui": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+      "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+      "dev": true,
+      "requires": {
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1",
+        "wrap-ansi": "2.1.0"
+      }
+    },
+    "co": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "dev": true
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
+      "dev": true
+    },
+    "combined-stream": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+      "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+      "dev": true,
+      "requires": {
+        "delayed-stream": "1.0.0"
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "dev": true
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+      "dev": true
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "dev": true
+    },
+    "cross-spawn": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+      "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+      "dev": true,
+      "requires": {
+        "lru-cache": "4.1.3",
+        "which": "1.3.1"
+      }
+    },
+    "currently-unhandled": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
+      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
+      "dev": true,
+      "requires": {
+        "array-find-index": "1.0.2"
+      }
+    },
+    "dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "dev": true
+    },
+    "delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "dev": true
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "dev": true
+    },
+    "ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+      "dev": true,
+      "optional": true,
+      "requires": {
+        "jsbn": "0.1.1",
+        "safer-buffer": "2.1.2"
+      }
+    },
+    "ejs": {
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz",
+      "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==",
+      "dev": true
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "0.2.1"
+      }
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "dev": true
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "dev": true
+    },
+    "extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+      "dev": true
+    },
+    "fast-deep-equal": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+      "dev": true
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+      "dev": true
+    },
+    "find-up": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
+      "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+      "dev": true,
+      "requires": {
+        "path-exists": "2.1.0",
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+      "dev": true
+    },
+    "form-data": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+      "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+      "dev": true,
+      "requires": {
+        "asynckit": "0.4.0",
+        "combined-stream": "1.0.6",
+        "mime-types": "2.1.19"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "dev": true
+    },
+    "fstream": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
+      "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "inherits": "2.0.3",
+        "mkdirp": "0.5.1",
+        "rimraf": "2.6.2"
+      }
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "dev": true,
+      "requires": {
+        "aproba": "1.2.0",
+        "console-control-strings": "1.1.0",
+        "has-unicode": "2.0.1",
+        "object-assign": "4.1.1",
+        "signal-exit": "3.0.2",
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1",
+        "wide-align": "1.1.3"
+      }
+    },
+    "gaze": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
+      "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
+      "dev": true,
+      "requires": {
+        "globule": "1.2.1"
+      }
+    },
+    "get-caller-file": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
+      "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
+      "dev": true
+    },
+    "get-stdin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
+      "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=",
+      "dev": true
+    },
+    "getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0"
+      }
+    },
+    "glob": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+      "dev": true,
+      "requires": {
+        "fs.realpath": "1.0.0",
+        "inflight": "1.0.6",
+        "inherits": "2.0.3",
+        "minimatch": "3.0.4",
+        "once": "1.4.0",
+        "path-is-absolute": "1.0.1"
+      }
+    },
+    "globule": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz",
+      "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.2",
+        "lodash": "4.17.10",
+        "minimatch": "3.0.4"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+      "dev": true
+    },
+    "har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+      "dev": true
+    },
+    "har-validator": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+      "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+      "dev": true,
+      "requires": {
+        "ajv": "5.5.2",
+        "har-schema": "2.0.0"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "dev": true
+    },
+    "hosted-git-info": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
+      "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
+      "dev": true
+    },
+    "http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "jsprim": "1.4.1",
+        "sshpk": "1.14.2"
+      }
+    },
+    "in-publish": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz",
+      "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=",
+      "dev": true
+    },
+    "indent-string": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
+      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
+      "dev": true,
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "dev": true,
+      "requires": {
+        "once": "1.4.0",
+        "wrappy": "1.0.2"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "dev": true
+    },
+    "invert-kv": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+      "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+      "dev": true
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-builtin-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+      "dev": true,
+      "requires": {
+        "builtin-modules": "1.1.1"
+      }
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "1.0.1"
+      }
+    },
+    "is-fullwidth-code-point": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+      "dev": true,
+      "requires": {
+        "number-is-nan": "1.0.1"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "dev": true
+    },
+    "is-utf8": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "dev": true
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+      "dev": true
+    },
+    "js-base64": {
+      "version": "2.4.8",
+      "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.8.tgz",
+      "integrity": "sha512-hm2nYpDrwoO/OzBhdcqs/XGT6XjSuSSCVEpia+Kl2J6x4CYt5hISlVL/AYU1khoDXv0AQVgxtdJySb9gjAn56Q==",
+      "dev": true
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+      "dev": true,
+      "optional": true
+    },
+    "json-schema": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+      "dev": true
+    },
+    "json-schema-traverse": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+      "dev": true
+    },
+    "json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+      "dev": true
+    },
+    "jsprim": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.2.3",
+        "verror": "1.10.0"
+      }
+    },
+    "lcid": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+      "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+      "dev": true,
+      "requires": {
+        "invert-kv": "1.0.0"
+      }
+    },
+    "load-json-file": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "parse-json": "2.2.0",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1",
+        "strip-bom": "2.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.10",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+      "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+      "dev": true
+    },
+    "lodash.assign": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz",
+      "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=",
+      "dev": true
+    },
+    "lodash.clonedeep": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
+      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
+      "dev": true
+    },
+    "lodash.mergewith": {
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz",
+      "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==",
+      "dev": true
+    },
+    "loud-rejection": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
+      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
+      "dev": true,
+      "requires": {
+        "currently-unhandled": "0.4.1",
+        "signal-exit": "3.0.2"
+      }
+    },
+    "lru-cache": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+      "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+      "dev": true,
+      "requires": {
+        "pseudomap": "1.0.2",
+        "yallist": "2.1.2"
+      }
+    },
+    "map-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "dev": true
+    },
+    "meow": {
+      "version": "3.7.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
+      "dev": true,
+      "requires": {
+        "camelcase-keys": "2.1.0",
+        "decamelize": "1.2.0",
+        "loud-rejection": "1.6.0",
+        "map-obj": "1.0.1",
+        "minimist": "1.2.0",
+        "normalize-package-data": "2.4.0",
+        "object-assign": "4.1.1",
+        "read-pkg-up": "1.0.1",
+        "redent": "1.0.0",
+        "trim-newlines": "1.0.0"
+      }
+    },
+    "mime-db": {
+      "version": "1.35.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
+      "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==",
+      "dev": true
+    },
+    "mime-types": {
+      "version": "2.1.19",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",
+      "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==",
+      "dev": true,
+      "requires": {
+        "mime-db": "1.35.0"
+      }
+    },
+    "mincer": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/mincer/-/mincer-1.4.1.tgz",
+      "integrity": "sha1-Gj0N5dgQYkSsWtQEKkR3KrBRgrI=",
+      "dev": true,
+      "requires": {
+        "argparse": "1.0.7",
+        "compressible": "2.0.8",
+        "hike": "1.0.1",
+        "lodash": "3.10.1",
+        "mimoza": "1.0.0",
+        "mkdirp": "0.5.1",
+        "pako": "0.2.8",
+        "shellwords": "0.1.0",
+        "source-map": "0.5.6"
+      },
+      "dependencies": {
+        "argparse": {
+          "version": "1.0.7",
+          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.7.tgz",
+          "integrity": "sha1-wolQZIBVeBDxSovGLXoG9j7X+VE=",
+          "dev": true,
+          "requires": {
+            "sprintf-js": "1.0.3"
+          },
+          "dependencies": {
+            "sprintf-js": {
+              "version": "1.0.3",
+              "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+              "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+              "dev": true
+            }
+          }
+        },
+        "compressible": {
+          "version": "2.0.8",
+          "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.8.tgz",
+          "integrity": "sha1-cWLmxG07nSAP+0XLTkoPeDJzJQM=",
+          "dev": true,
+          "requires": {
+            "mime-db": "1.23.0"
+          },
+          "dependencies": {
+            "mime-db": {
+              "version": "1.23.0",
+              "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz",
+              "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=",
+              "dev": true
+            }
+          }
+        },
+        "hike": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/hike/-/hike-1.0.1.tgz",
+          "integrity": "sha1-zD8Z670Ow2OGTBmOTarstcawutA=",
+          "dev": true
+        },
+        "lodash": {
+          "version": "3.10.1",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+          "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+          "dev": true
+        },
+        "mimoza": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/mimoza/-/mimoza-1.0.0.tgz",
+          "integrity": "sha1-10qk/giTLwBeQwvce/z6lfyrTmI=",
+          "dev": true,
+          "requires": {
+            "mime-db": "1.23.0"
+          },
+          "dependencies": {
+            "mime-db": {
+              "version": "1.23.0",
+              "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz",
+              "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=",
+              "dev": true
+            }
+          }
+        },
+        "mkdirp": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+          "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+          "dev": true,
+          "requires": {
+            "minimist": "0.0.8"
+          },
+          "dependencies": {
+            "minimist": {
+              "version": "0.0.8",
+              "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+              "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+              "dev": true
+            }
+          }
+        },
+        "pako": {
+          "version": "0.2.8",
+          "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.8.tgz",
+          "integrity": "sha1-Fa13KRU2KRPyDeSooWS0qsxhZdY=",
+          "dev": true
+        },
+        "shellwords": {
+          "version": "0.1.0",
+          "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.0.tgz",
+          "integrity": "sha1-Zq/Ue2oSky2Qccv9mKUueFzQuhQ=",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.5.6",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+          "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
+          "dev": true
+        }
+      }
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "dev": true,
+      "requires": {
+        "brace-expansion": "1.1.11"
+      }
+    },
+    "minimist": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+      "dev": true
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "dev": true,
+      "requires": {
+        "minimist": "0.0.8"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+          "dev": true
+        }
+      }
+    },
+    "nan": {
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+      "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+      "dev": true
+    },
+    "node-gyp": {
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz",
+      "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==",
+      "dev": true,
+      "requires": {
+        "fstream": "1.0.11",
+        "glob": "7.1.2",
+        "graceful-fs": "4.1.11",
+        "mkdirp": "0.5.1",
+        "nopt": "3.0.6",
+        "npmlog": "4.1.2",
+        "osenv": "0.1.5",
+        "request": "2.87.0",
+        "rimraf": "2.6.2",
+        "semver": "5.3.0",
+        "tar": "2.2.1",
+        "which": "1.3.1"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "5.3.0",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+          "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+          "dev": true
+        }
+      }
+    },
+    "node-sass": {
+      "version": "4.9.3",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.9.3.tgz",
+      "integrity": "sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww==",
+      "dev": true,
+      "requires": {
+        "async-foreach": "0.1.3",
+        "chalk": "1.1.3",
+        "cross-spawn": "3.0.1",
+        "gaze": "1.1.3",
+        "get-stdin": "4.0.1",
+        "glob": "7.1.2",
+        "in-publish": "2.0.0",
+        "lodash.assign": "4.2.0",
+        "lodash.clonedeep": "4.5.0",
+        "lodash.mergewith": "4.6.1",
+        "meow": "3.7.0",
+        "mkdirp": "0.5.1",
+        "nan": "2.10.0",
+        "node-gyp": "3.8.0",
+        "npmlog": "4.1.2",
+        "request": "2.87.0",
+        "sass-graph": "2.2.4",
+        "stdout-stream": "1.4.0",
+        "true-case-path": "1.0.2"
+      }
+    },
+    "nopt": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
+      "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=",
+      "dev": true,
+      "requires": {
+        "abbrev": "1.1.1"
+      }
+    },
+    "normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "2.7.1",
+        "is-builtin-module": "1.0.0",
+        "semver": "5.5.1",
+        "validate-npm-package-license": "3.0.4"
+      }
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "dev": true,
+      "requires": {
+        "are-we-there-yet": "1.1.5",
+        "console-control-strings": "1.1.0",
+        "gauge": "2.7.4",
+        "set-blocking": "2.0.0"
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
+      "dev": true
+    },
+    "oauth-sign": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+      "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+      "dev": true
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "dev": true
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "dev": true,
+      "requires": {
+        "wrappy": "1.0.2"
+      }
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "os-locale": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+      "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+      "dev": true,
+      "requires": {
+        "lcid": "1.0.0"
+      }
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+      "dev": true
+    },
+    "osenv": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
+      "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
+      "dev": true,
+      "requires": {
+        "os-homedir": "1.0.2",
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "1.3.2"
+      }
+    },
+    "path-exists": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+      "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+      "dev": true,
+      "requires": {
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "dev": true
+    },
+    "path-type": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "pify": "2.3.0",
+        "pinkie-promise": "2.0.1"
+      }
+    },
+    "performance-now": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+      "dev": true
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "dev": true
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "dev": true,
+      "requires": {
+        "pinkie": "2.0.4"
+      }
+    },
+    "process-nextick-args": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+      "dev": true
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+      "dev": true
+    },
+    "qs": {
+      "version": "6.5.2",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+      "dev": true
+    },
+    "read-pkg": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "1.1.0",
+        "normalize-package-data": "2.4.0",
+        "path-type": "1.1.0"
+      }
+    },
+    "read-pkg-up": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "dev": true,
+      "requires": {
+        "find-up": "1.1.2",
+        "read-pkg": "1.1.0"
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "dev": true,
+      "requires": {
+        "core-util-is": "1.0.2",
+        "inherits": "2.0.3",
+        "isarray": "1.0.0",
+        "process-nextick-args": "2.0.0",
+        "safe-buffer": "5.1.2",
+        "string_decoder": "1.1.1",
+        "util-deprecate": "1.0.2"
+      }
+    },
+    "redent": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
+      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
+      "dev": true,
+      "requires": {
+        "indent-string": "2.1.0",
+        "strip-indent": "1.0.1"
+      }
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "dev": true,
+      "requires": {
+        "is-finite": "1.0.2"
+      }
+    },
+    "request": {
+      "version": "2.87.0",
+      "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
+      "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
+      "dev": true,
+      "requires": {
+        "aws-sign2": "0.7.0",
+        "aws4": "1.8.0",
+        "caseless": "0.12.0",
+        "combined-stream": "1.0.6",
+        "extend": "3.0.2",
+        "forever-agent": "0.6.1",
+        "form-data": "2.3.2",
+        "har-validator": "5.0.3",
+        "http-signature": "1.2.0",
+        "is-typedarray": "1.0.0",
+        "isstream": "0.1.2",
+        "json-stringify-safe": "5.0.1",
+        "mime-types": "2.1.19",
+        "oauth-sign": "0.8.2",
+        "performance-now": "2.1.0",
+        "qs": "6.5.2",
+        "safe-buffer": "5.1.2",
+        "tough-cookie": "2.3.4",
+        "tunnel-agent": "0.6.0",
+        "uuid": "3.3.2"
+      }
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-main-filename": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+      "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+      "dev": true
+    },
+    "rimraf": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+      "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.2"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "dev": true
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "dev": true
+    },
+    "sass-graph": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz",
+      "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=",
+      "dev": true,
+      "requires": {
+        "glob": "7.1.2",
+        "lodash": "4.17.10",
+        "scss-tokenizer": "0.2.3",
+        "yargs": "7.1.0"
+      }
+    },
+    "scss-tokenizer": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
+      "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=",
+      "dev": true,
+      "requires": {
+        "js-base64": "2.4.8",
+        "source-map": "0.4.4"
+      }
+    },
+    "semver": {
+      "version": "5.5.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
+      "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
+      "dev": true
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+      "dev": true
+    },
+    "source-map": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+      "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+      "dev": true,
+      "requires": {
+        "amdefine": "1.0.1"
+      }
+    },
+    "spdx-correct": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
+      "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "3.0.0",
+        "spdx-license-ids": "3.0.0"
+      }
+    },
+    "spdx-exceptions": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
+      "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
+      "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
+      "dev": true,
+      "requires": {
+        "spdx-exceptions": "2.1.0",
+        "spdx-license-ids": "3.0.0"
+      }
+    },
+    "spdx-license-ids": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
+      "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
+      "dev": true
+    },
+    "sshpk": {
+      "version": "1.14.2",
+      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
+      "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
+      "dev": true,
+      "requires": {
+        "asn1": "0.2.4",
+        "assert-plus": "1.0.0",
+        "bcrypt-pbkdf": "1.0.2",
+        "dashdash": "1.14.1",
+        "ecc-jsbn": "0.1.2",
+        "getpass": "0.1.7",
+        "jsbn": "0.1.1",
+        "safer-buffer": "2.1.2",
+        "tweetnacl": "0.14.5"
+      }
+    },
+    "stdout-stream": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.0.tgz",
+      "integrity": "sha1-osfIWH5U2UJ+qe2zrD8s1SLfN4s=",
+      "dev": true,
+      "requires": {
+        "readable-stream": "2.3.6"
+      }
+    },
+    "string-width": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "dev": true,
+      "requires": {
+        "code-point-at": "1.1.0",
+        "is-fullwidth-code-point": "1.0.0",
+        "strip-ansi": "3.0.1"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "dev": true,
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "strip-bom": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+      "dev": true,
+      "requires": {
+        "is-utf8": "0.2.1"
+      }
+    },
+    "strip-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
+      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "dev": true,
+      "requires": {
+        "get-stdin": "4.0.1"
+      }
+    },
+    "supports-color": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+      "dev": true
+    },
+    "tar": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
+      "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
+      "dev": true,
+      "requires": {
+        "block-stream": "0.0.9",
+        "fstream": "1.0.11",
+        "inherits": "2.0.3"
+      }
+    },
+    "tough-cookie": {
+      "version": "2.3.4",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+      "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+      "dev": true,
+      "requires": {
+        "punycode": "1.4.1"
+      }
+    },
+    "trim-newlines": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
+      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "dev": true
+    },
+    "true-case-path": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.2.tgz",
+      "integrity": "sha1-fskRMJJHZsf1c74wIMNPj9/QDWI=",
+      "dev": true,
+      "requires": {
+        "glob": "6.0.4"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "6.0.4",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+          "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+          "dev": true,
+          "requires": {
+            "inflight": "1.0.6",
+            "inherits": "2.0.3",
+            "minimatch": "3.0.4",
+            "once": "1.4.0",
+            "path-is-absolute": "1.0.1"
+          }
+        }
+      }
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "5.1.2"
+      }
+    },
+    "tweetnacl": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+      "dev": true,
+      "optional": true
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "dev": true
+    },
+    "uuid": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+      "dev": true
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "3.0.0",
+        "spdx-expression-parse": "3.0.0"
+      }
+    },
+    "verror": {
+      "version": "1.10.0",
+      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+      "dev": true,
+      "requires": {
+        "assert-plus": "1.0.0",
+        "core-util-is": "1.0.2",
+        "extsprintf": "1.3.0"
+      }
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "dev": true,
+      "requires": {
+        "isexe": "2.0.0"
+      }
+    },
+    "which-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+      "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+      "dev": true
+    },
+    "wide-align": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "dev": true,
+      "requires": {
+        "string-width": "1.0.2"
+      }
+    },
+    "wrap-ansi": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+      "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+      "dev": true,
+      "requires": {
+        "string-width": "1.0.2",
+        "strip-ansi": "3.0.1"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "dev": true
+    },
+    "y18n": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+      "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+      "dev": true
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    },
+    "yargs": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
+      "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
+      "dev": true,
+      "requires": {
+        "camelcase": "3.0.0",
+        "cliui": "3.2.0",
+        "decamelize": "1.2.0",
+        "get-caller-file": "1.0.3",
+        "os-locale": "1.4.0",
+        "read-pkg-up": "1.0.1",
+        "require-directory": "2.1.1",
+        "require-main-filename": "1.0.1",
+        "set-blocking": "2.0.0",
+        "string-width": "1.0.2",
+        "which-module": "1.0.0",
+        "y18n": "3.2.1",
+        "yargs-parser": "5.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        }
+      }
+    },
+    "yargs-parser": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+      "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+      "dev": true,
+      "requires": {
+        "camelcase": "3.0.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+          "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+          "dev": true
+        }
+      }
+    }
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/package.json b/civicrm/ext/greenwich/extern/bootstrap3/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..d947d8f9a5d96a176240e3deb43522fd5d95e242
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/package.json
@@ -0,0 +1,44 @@
+{
+  "name": "bootstrap-sass",
+  "version": "3.4.1",
+  "description": "bootstrap-sass is a Sass-powered version of Bootstrap 3, ready to drop right into your Sass powered applications.",
+  "main": "assets/javascripts/bootstrap.js",
+  "style": "assets/stylesheets/_bootstrap.scss",
+  "sass": "assets/stylesheets/_bootstrap.scss",
+  "files": [
+    "assets",
+    "eyeglass-exports.js",
+    "CHANGELOG.md",
+    "LICENSE",
+    "README.md"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/twbs/bootstrap-sass"
+  },
+  "keywords": [
+    "bootstrap",
+    "sass",
+    "css",
+    "eyeglass-module"
+  ],
+  "contributors": [
+    "Thomas McDonald",
+    "Tristan Harward",
+    "Peter Gumeson",
+    "Gleb Mazovetskiy"
+  ],
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/twbs/bootstrap-sass/issues"
+  },
+  "devDependencies": {
+    "node-sass": "^4.9.3",
+    "mincer": "~1.4.0",
+    "ejs": "~2.6.1"
+  },
+  "eyeglass": {
+    "exports": "eyeglass-exports.js",
+    "needs": "^0.7.1"
+  }
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/sache.json b/civicrm/ext/greenwich/extern/bootstrap3/sache.json
new file mode 100644
index 0000000000000000000000000000000000000000..c6c5a01d28f2d774513b03bd0aeae318fe382fb1
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/sache.json
@@ -0,0 +1,5 @@
+{
+    "name": "bootstrap-sass",
+    "description": "bootstrap-sass is a Sass-powered version of Bootstrap 3, ready to drop right into your Sass powered applications.",
+    "tags": ["bootstrap", "grid", "typography", "buttons", "ui", "responsive-web-design"]
+}
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/templates/project/_bootstrap-variables.sass b/civicrm/ext/greenwich/extern/bootstrap3/templates/project/_bootstrap-variables.sass
new file mode 100644
index 0000000000000000000000000000000000000000..8777e1149c47a741eef114a95ce91e7031302629
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/templates/project/_bootstrap-variables.sass
@@ -0,0 +1,875 @@
+// Override Bootstrap variables here (defaults from bootstrap-sass v3.4.0):
+
+//
+// Variables
+// --------------------------------------------------
+
+
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
+
+// $gray-base:              #000
+// $gray-darker:            lighten($gray-base, 13.5%) // #222
+// $gray-dark:              lighten($gray-base, 20%)   // #333
+// $gray:                   lighten($gray-base, 33.5%) // #555
+// $gray-light:             lighten($gray-base, 46.7%) // #777
+// $gray-lighter:           lighten($gray-base, 93.5%) // #eee
+
+// $brand-primary:         darken(#428bca, 6.5%) // #337ab7
+// $brand-success:         #5cb85c
+// $brand-info:            #5bc0de
+// $brand-warning:         #f0ad4e
+// $brand-danger:          #d9534f
+
+
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
+
+//** Background color for `<body>`.
+// $body-bg:               #fff
+//** Global text color on `<body>`.
+// $text-color:            $gray-dark
+
+//** Global textual link color.
+// $link-color:            $brand-primary
+//** Link hover color set via `darken()` function.
+// $link-hover-color:      darken($link-color, 15%)
+//** Link hover decoration.
+// $link-hover-decoration: underline
+
+
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
+
+// $font-family-sans-serif:  "Helvetica Neue", Helvetica, Arial, sans-serif
+// $font-family-serif:       Georgia, "Times New Roman", Times, serif
+//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
+// $font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace
+// $font-family-base:        $font-family-sans-serif
+
+// $font-size-base:          14px
+// $font-size-large:         ceil(($font-size-base * 1.25)) // ~18px
+// $font-size-small:         ceil(($font-size-base * .85)) // ~12px
+
+// $font-size-h1:            floor(($font-size-base * 2.6)) // ~36px
+// $font-size-h2:            floor(($font-size-base * 2.15)) // ~30px
+// $font-size-h3:            ceil(($font-size-base * 1.7)) // ~24px
+// $font-size-h4:            ceil(($font-size-base * 1.25)) // ~18px
+// $font-size-h5:            $font-size-base
+// $font-size-h6:            ceil(($font-size-base * .85)) // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+// $line-height-base:        1.428571429 // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+// $line-height-computed:    floor(($font-size-base * $line-height-base)) // ~20px
+
+//** By default, this inherits from the `<body>`.
+// $headings-font-family:    inherit
+// $headings-font-weight:    500
+// $headings-line-height:    1.1
+// $headings-color:          inherit
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+
+// [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
+// [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
+// $icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/")
+
+//** File name for all font files.
+// $icon-font-name:          "glyphicons-halflings-regular"
+//** Element ID within SVG icon file.
+// $icon-font-svg-id:        "glyphicons_halflingsregular"
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+// $padding-base-vertical:     6px
+// $padding-base-horizontal:   12px
+
+// $padding-large-vertical:    10px
+// $padding-large-horizontal:  16px
+
+// $padding-small-vertical:    5px
+// $padding-small-horizontal:  10px
+
+// $padding-xs-vertical:       1px
+// $padding-xs-horizontal:     5px
+
+// $line-height-large:         1.3333333 // extra decimals for Win 8.1 Chrome
+// $line-height-small:         1.5
+
+// $border-radius-base:        4px
+// $border-radius-large:       6px
+// $border-radius-small:       3px
+
+//** Global color for active items (e.g., navs or dropdowns).
+// $component-active-color:    #fff
+//** Global background color for active items (e.g., navs or dropdowns).
+// $component-active-bg:       $brand-primary
+
+//** Width of the `border` for generating carets that indicate dropdowns.
+// $caret-width-base:          4px
+//** Carets increase slightly in size for larger components.
+// $caret-width-large:         5px
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for `<th>`s and `<td>`s.
+// $table-cell-padding:            8px
+//** Padding for cells in `.table-condensed`.
+// $table-condensed-cell-padding:  5px
+
+//** Default background color used for all tables.
+// $table-bg:                      transparent
+//** Background color used for `.table-striped`.
+// $table-bg-accent:               #f9f9f9
+//** Background color used for `.table-hover`.
+// $table-bg-hover:                #f5f5f5
+// $table-bg-active:               $table-bg-hover
+
+//** Border color for table and cell borders.
+// $table-border-color:            #ddd
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+// $btn-font-weight:                normal
+
+// $btn-default-color:              #333
+// $btn-default-bg:                 #fff
+// $btn-default-border:             #ccc
+
+// $btn-primary-color:              #fff
+// $btn-primary-bg:                 $brand-primary
+// $btn-primary-border:             darken($btn-primary-bg, 5%)
+
+// $btn-success-color:              #fff
+// $btn-success-bg:                 $brand-success
+// $btn-success-border:             darken($btn-success-bg, 5%)
+
+// $btn-info-color:                 #fff
+// $btn-info-bg:                    $brand-info
+// $btn-info-border:                darken($btn-info-bg, 5%)
+
+// $btn-warning-color:              #fff
+// $btn-warning-bg:                 $brand-warning
+// $btn-warning-border:             darken($btn-warning-bg, 5%)
+
+// $btn-danger-color:               #fff
+// $btn-danger-bg:                  $brand-danger
+// $btn-danger-border:              darken($btn-danger-bg, 5%)
+
+// $btn-link-disabled-color:        $gray-light
+
+// Allows for customizing button radius independently from global border radius
+// $btn-border-radius-base:         $border-radius-base
+// $btn-border-radius-large:        $border-radius-large
+// $btn-border-radius-small:        $border-radius-small
+
+
+//== Forms
+//
+//##
+
+//** `<input>` background color
+// $input-bg:                       #fff
+//** `<input disabled>` background color
+// $input-bg-disabled:              $gray-lighter
+
+//** Text color for `<input>`s
+// $input-color:                    $gray
+//** `<input>` border color
+// $input-border:                   #ccc
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
+// $input-border-radius:            $border-radius-base
+//** Large `.form-control` border radius
+// $input-border-radius-large:      $border-radius-large
+//** Small `.form-control` border radius
+// $input-border-radius-small:      $border-radius-small
+
+//** Border color for inputs on focus
+// $input-border-focus:             #66afe9
+
+//** Placeholder text color
+// $input-color-placeholder:        #999
+
+//** Default `.form-control` height
+// $input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2)
+//** Large `.form-control` height
+// $input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2)
+//** Small `.form-control` height
+// $input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2)
+
+//** `.form-group` margin
+// $form-group-margin-bottom:       15px
+
+// $legend-color:                   $gray-dark
+// $legend-border-color:            #e5e5e5
+
+//** Background color for textual input addons
+// $input-group-addon-bg:           $gray-lighter
+//** Border color for textual input addons
+// $input-group-addon-border-color: $input-border
+
+//** Disabled cursor for form controls and buttons.
+// $cursor-disabled:                not-allowed
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+// $dropdown-bg:                    #fff
+//** Dropdown menu `border-color`.
+// $dropdown-border:                rgba(0, 0, 0, .15)
+//** Dropdown menu `border-color` **for IE8**.
+// $dropdown-fallback-border:       #ccc
+//** Divider color for between dropdown items.
+// $dropdown-divider-bg:            #e5e5e5
+
+//** Dropdown link text color.
+// $dropdown-link-color:            $gray-dark
+//** Hover color for dropdown links.
+// $dropdown-link-hover-color:      darken($gray-dark, 5%)
+//** Hover background for dropdown links.
+// $dropdown-link-hover-bg:         #f5f5f5
+
+//** Active dropdown menu item text color.
+// $dropdown-link-active-color:     $component-active-color
+//** Active dropdown menu item background color.
+// $dropdown-link-active-bg:        $component-active-bg
+
+//** Disabled dropdown menu item background color.
+// $dropdown-link-disabled-color:   $gray-light
+
+//** Text color for headers within dropdown menus.
+// $dropdown-header-color:          $gray-light
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+// $dropdown-caret-color:           #000
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+// $zindex-navbar:            1000
+// $zindex-dropdown:          1000
+// $zindex-popover:           1060
+// $zindex-tooltip:           1070
+// $zindex-navbar-fixed:      1030
+// $zindex-modal-background:  1040
+// $zindex-modal:             1050
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+// $screen-xs:                  480px
+//** Deprecated `$screen-xs-min` as of v3.2.0
+// $screen-xs-min:              $screen-xs
+//** Deprecated `$screen-phone` as of v3.0.1
+// $screen-phone:               $screen-xs-min
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+// $screen-sm:                  768px
+// $screen-sm-min:              $screen-sm
+//** Deprecated `$screen-tablet` as of v3.0.1
+// $screen-tablet:              $screen-sm-min
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+// $screen-md:                  992px
+// $screen-md-min:              $screen-md
+//** Deprecated `$screen-desktop` as of v3.0.1
+// $screen-desktop:             $screen-md-min
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+// $screen-lg:                  1200px
+// $screen-lg-min:              $screen-lg
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+// $screen-lg-desktop:          $screen-lg-min
+
+// So media queries don't overlap when required, provide a maximum
+// $screen-xs-max:              ($screen-sm-min - 1)
+// $screen-sm-max:              ($screen-md-min - 1)
+// $screen-md-max:              ($screen-lg-min - 1)
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+// $grid-columns:              12
+//** Padding between columns. Gets divided in half for the left and right.
+// $grid-gutter-width:         30px
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+// $grid-float-breakpoint:     $screen-sm-min
+//** Point at which the navbar begins collapsing.
+// $grid-float-breakpoint-max: ($grid-float-breakpoint - 1)
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+// $container-tablet:             (720px + $grid-gutter-width)
+//** For `$screen-sm-min` and up.
+// $container-sm:                 $container-tablet
+
+// Medium screen / desktop
+// $container-desktop:            (940px + $grid-gutter-width)
+//** For `$screen-md-min` and up.
+// $container-md:                 $container-desktop
+
+// Large screen / wide desktop
+// $container-large-desktop:      (1140px + $grid-gutter-width)
+//** For `$screen-lg-min` and up.
+// $container-lg:                 $container-large-desktop
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+// $navbar-height:                    50px
+// $navbar-margin-bottom:             $line-height-computed
+// $navbar-border-radius:             $border-radius-base
+// $navbar-padding-horizontal:        floor(($grid-gutter-width / 2))
+// $navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2)
+// $navbar-collapse-max-height:       340px
+
+// $navbar-default-color:             #777
+// $navbar-default-bg:                #f8f8f8
+// $navbar-default-border:            darken($navbar-default-bg, 6.5%)
+
+// Navbar links
+// $navbar-default-link-color:                #777
+// $navbar-default-link-hover-color:          #333
+// $navbar-default-link-hover-bg:             transparent
+// $navbar-default-link-active-color:         #555
+// $navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%)
+// $navbar-default-link-disabled-color:       #ccc
+// $navbar-default-link-disabled-bg:          transparent
+
+// Navbar brand label
+// $navbar-default-brand-color:               $navbar-default-link-color
+// $navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%)
+// $navbar-default-brand-hover-bg:            transparent
+
+// Navbar toggle
+// $navbar-default-toggle-hover-bg:           #ddd
+// $navbar-default-toggle-icon-bar-bg:        #888
+// $navbar-default-toggle-border-color:       #ddd
+
+
+//=== Inverted navbar
+// Reset inverted navbar basics
+// $navbar-inverse-color:                      lighten($gray-light, 15%)
+// $navbar-inverse-bg:                         #222
+// $navbar-inverse-border:                     darken($navbar-inverse-bg, 10%)
+
+// Inverted navbar links
+// $navbar-inverse-link-color:                 lighten($gray-light, 15%)
+// $navbar-inverse-link-hover-color:           #fff
+// $navbar-inverse-link-hover-bg:              transparent
+// $navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color
+// $navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%)
+// $navbar-inverse-link-disabled-color:        #444
+// $navbar-inverse-link-disabled-bg:           transparent
+
+// Inverted navbar brand label
+// $navbar-inverse-brand-color:                $navbar-inverse-link-color
+// $navbar-inverse-brand-hover-color:          #fff
+// $navbar-inverse-brand-hover-bg:             transparent
+
+// Inverted navbar toggle
+// $navbar-inverse-toggle-hover-bg:            #333
+// $navbar-inverse-toggle-icon-bar-bg:         #fff
+// $navbar-inverse-toggle-border-color:        #333
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+// $nav-link-padding:                          10px 15px
+// $nav-link-hover-bg:                         $gray-lighter
+
+// $nav-disabled-link-color:                   $gray-light
+// $nav-disabled-link-hover-color:             $gray-light
+
+//== Tabs
+// $nav-tabs-border-color:                     #ddd
+
+// $nav-tabs-link-hover-border-color:          $gray-lighter
+
+// $nav-tabs-active-link-hover-bg:             $body-bg
+// $nav-tabs-active-link-hover-color:          $gray
+// $nav-tabs-active-link-hover-border-color:   #ddd
+
+// $nav-tabs-justified-link-border-color:            #ddd
+// $nav-tabs-justified-active-link-border-color:     $body-bg
+
+//== Pills
+// $nav-pills-border-radius:                   $border-radius-base
+// $nav-pills-active-link-hover-bg:            $component-active-bg
+// $nav-pills-active-link-hover-color:         $component-active-color
+
+
+//== Pagination
+//
+//##
+
+// $pagination-color:                     $link-color
+// $pagination-bg:                        #fff
+// $pagination-border:                    #ddd
+
+// $pagination-hover-color:               $link-hover-color
+// $pagination-hover-bg:                  $gray-lighter
+// $pagination-hover-border:              #ddd
+
+// $pagination-active-color:              #fff
+// $pagination-active-bg:                 $brand-primary
+// $pagination-active-border:             $brand-primary
+
+// $pagination-disabled-color:            $gray-light
+// $pagination-disabled-bg:               #fff
+// $pagination-disabled-border:           #ddd
+
+
+//== Pager
+//
+//##
+
+// $pager-bg:                             $pagination-bg
+// $pager-border:                         $pagination-border
+// $pager-border-radius:                  15px
+
+// $pager-hover-bg:                       $pagination-hover-bg
+
+// $pager-active-bg:                      $pagination-active-bg
+// $pager-active-color:                   $pagination-active-color
+
+// $pager-disabled-color:                 $pagination-disabled-color
+
+
+//== Jumbotron
+//
+//##
+
+// $jumbotron-padding:              30px
+// $jumbotron-color:                inherit
+// $jumbotron-bg:                   $gray-lighter
+// $jumbotron-heading-color:        inherit
+// $jumbotron-font-size:            ceil(($font-size-base * 1.5))
+// $jumbotron-heading-font-size:    ceil(($font-size-base * 4.5))
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+// $state-success-text:             #3c763d
+// $state-success-bg:               #dff0d8
+// $state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%)
+
+// $state-info-text:                #31708f
+// $state-info-bg:                  #d9edf7
+// $state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%)
+
+// $state-warning-text:             #8a6d3b
+// $state-warning-bg:               #fcf8e3
+// $state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%)
+
+// $state-danger-text:              #a94442
+// $state-danger-bg:                #f2dede
+// $state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%)
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+// $tooltip-max-width:           200px
+//** Tooltip text color
+// $tooltip-color:               #fff
+//** Tooltip background color
+// $tooltip-bg:                  #000
+// $tooltip-opacity:             .9
+
+//** Tooltip arrow width
+// $tooltip-arrow-width:         5px
+//** Tooltip arrow color
+// $tooltip-arrow-color:         $tooltip-bg
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+// $popover-bg:                          #fff
+//** Popover maximum width
+// $popover-max-width:                   276px
+//** Popover border color
+// $popover-border-color:                rgba(0, 0, 0, .2)
+//** Popover fallback border color
+// $popover-fallback-border-color:       #ccc
+
+//** Popover title background color
+// $popover-title-bg:                    darken($popover-bg, 3%)
+
+//** Popover arrow width
+// $popover-arrow-width:                 10px
+//** Popover arrow color
+// $popover-arrow-color:                 $popover-bg
+
+//** Popover outer arrow width
+// $popover-arrow-outer-width:           ($popover-arrow-width + 1)
+//** Popover outer arrow color
+// $popover-arrow-outer-color:           fade_in($popover-border-color, 0.05)
+//** Popover outer arrow fallback color
+// $popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%)
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+// $label-default-bg:            $gray-light
+//** Primary label background color
+// $label-primary-bg:            $brand-primary
+//** Success label background color
+// $label-success-bg:            $brand-success
+//** Info label background color
+// $label-info-bg:               $brand-info
+//** Warning label background color
+// $label-warning-bg:            $brand-warning
+//** Danger label background color
+// $label-danger-bg:             $brand-danger
+
+//** Default label text color
+// $label-color:                 #fff
+//** Default text color of a linked label
+// $label-link-hover-color:      #fff
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+// $modal-inner-padding:         15px
+
+//** Padding applied to the modal title
+// $modal-title-padding:         15px
+//** Modal title line-height
+// $modal-title-line-height:     $line-height-base
+
+//** Background color of modal content area
+// $modal-content-bg:                             #fff
+//** Modal content border color
+// $modal-content-border-color:                   rgba(0, 0, 0, .2)
+//** Modal content border color **for IE8**
+// $modal-content-fallback-border-color:          #999
+
+//** Modal backdrop background color
+// $modal-backdrop-bg:           #000
+//** Modal backdrop opacity
+// $modal-backdrop-opacity:      .5
+//** Modal header border color
+// $modal-header-border-color:   #e5e5e5
+//** Modal footer border color
+// $modal-footer-border-color:   $modal-header-border-color
+
+// $modal-lg:                    900px
+// $modal-md:                    600px
+// $modal-sm:                    300px
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+// $alert-padding:               15px
+// $alert-border-radius:         $border-radius-base
+// $alert-link-font-weight:      bold
+
+// $alert-success-bg:            $state-success-bg
+// $alert-success-text:          $state-success-text
+// $alert-success-border:        $state-success-border
+
+// $alert-info-bg:               $state-info-bg
+// $alert-info-text:             $state-info-text
+// $alert-info-border:           $state-info-border
+
+// $alert-warning-bg:            $state-warning-bg
+// $alert-warning-text:          $state-warning-text
+// $alert-warning-border:        $state-warning-border
+
+// $alert-danger-bg:             $state-danger-bg
+// $alert-danger-text:           $state-danger-text
+// $alert-danger-border:         $state-danger-border
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+// $progress-bg:                 #f5f5f5
+//** Progress bar text color
+// $progress-bar-color:          #fff
+//** Variable for setting rounded corners on progress bar.
+// $progress-border-radius:      $border-radius-base
+
+//** Default progress bar color
+// $progress-bar-bg:             $brand-primary
+//** Success progress bar color
+// $progress-bar-success-bg:     $brand-success
+//** Warning progress bar color
+// $progress-bar-warning-bg:     $brand-warning
+//** Danger progress bar color
+// $progress-bar-danger-bg:      $brand-danger
+//** Info progress bar color
+// $progress-bar-info-bg:        $brand-info
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+// $list-group-bg:                 #fff
+//** `.list-group-item` border color
+// $list-group-border:             #ddd
+//** List group border radius
+// $list-group-border-radius:      $border-radius-base
+
+//** Background color of single list items on hover
+// $list-group-hover-bg:           #f5f5f5
+//** Text color of active list items
+// $list-group-active-color:       $component-active-color
+//** Background color of active list items
+// $list-group-active-bg:          $component-active-bg
+//** Border color of active list elements
+// $list-group-active-border:      $list-group-active-bg
+//** Text color for content within active list items
+// $list-group-active-text-color:  lighten($list-group-active-bg, 40%)
+
+//** Text color of disabled list items
+// $list-group-disabled-color:      $gray-light
+//** Background color of disabled list items
+// $list-group-disabled-bg:         $gray-lighter
+//** Text color for content within disabled list items
+// $list-group-disabled-text-color: $list-group-disabled-color
+
+// $list-group-link-color:         #555
+// $list-group-link-hover-color:   $list-group-link-color
+// $list-group-link-heading-color: #333
+
+
+//== Panels
+//
+//##
+
+// $panel-bg:                    #fff
+// $panel-body-padding:          15px
+// $panel-heading-padding:       10px 15px
+// $panel-footer-padding:        $panel-heading-padding
+// $panel-border-radius:         $border-radius-base
+
+//** Border color for elements within panels
+// $panel-inner-border:          #ddd
+// $panel-footer-bg:             #f5f5f5
+
+// $panel-default-text:          $gray-dark
+// $panel-default-border:        #ddd
+// $panel-default-heading-bg:    #f5f5f5
+
+// $panel-primary-text:          #fff
+// $panel-primary-border:        $brand-primary
+// $panel-primary-heading-bg:    $brand-primary
+
+// $panel-success-text:          $state-success-text
+// $panel-success-border:        $state-success-border
+// $panel-success-heading-bg:    $state-success-bg
+
+// $panel-info-text:             $state-info-text
+// $panel-info-border:           $state-info-border
+// $panel-info-heading-bg:       $state-info-bg
+
+// $panel-warning-text:          $state-warning-text
+// $panel-warning-border:        $state-warning-border
+// $panel-warning-heading-bg:    $state-warning-bg
+
+// $panel-danger-text:           $state-danger-text
+// $panel-danger-border:         $state-danger-border
+// $panel-danger-heading-bg:     $state-danger-bg
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+// $thumbnail-padding:           4px
+//** Thumbnail background color
+// $thumbnail-bg:                $body-bg
+//** Thumbnail border color
+// $thumbnail-border:            #ddd
+//** Thumbnail border radius
+// $thumbnail-border-radius:     $border-radius-base
+
+//** Custom text color for thumbnail captions
+// $thumbnail-caption-color:     $text-color
+//** Padding around the thumbnail caption
+// $thumbnail-caption-padding:   9px
+
+
+//== Wells
+//
+//##
+
+// $well-bg:                     #f5f5f5
+// $well-border:                 darken($well-bg, 7%)
+
+
+//== Badges
+//
+//##
+
+// $badge-color:                 #fff
+//** Linked badge text color on hover
+// $badge-link-hover-color:      #fff
+// $badge-bg:                    $gray-light
+
+//** Badge text color in active nav link
+// $badge-active-color:          $link-color
+//** Badge background color in active nav link
+// $badge-active-bg:             #fff
+
+// $badge-font-weight:           bold
+// $badge-line-height:           1
+// $badge-border-radius:         10px
+
+
+//== Breadcrumbs
+//
+//##
+
+// $breadcrumb-padding-vertical:   8px
+// $breadcrumb-padding-horizontal: 15px
+//** Breadcrumb background color
+// $breadcrumb-bg:                 #f5f5f5
+//** Breadcrumb text color
+// $breadcrumb-color:              #ccc
+//** Text color of current page in the breadcrumb
+// $breadcrumb-active-color:       $gray-light
+//** Textual separator for between breadcrumb elements
+// $breadcrumb-separator:          "/"
+
+
+//== Carousel
+//
+//##
+
+// $carousel-text-shadow:                        0 1px 2px rgba(0, 0, 0, .6)
+
+// $carousel-control-color:                      #fff
+// $carousel-control-width:                      15%
+// $carousel-control-opacity:                    .5
+// $carousel-control-font-size:                  20px
+
+// $carousel-indicator-active-bg:                #fff
+// $carousel-indicator-border-color:             #fff
+
+// $carousel-caption-color:                      #fff
+
+
+//== Close
+//
+//##
+
+// $close-font-weight:           bold
+// $close-color:                 #000
+// $close-text-shadow:           0 1px 0 #fff
+
+
+//== Code
+//
+//##
+
+// $code-color:                  #c7254e
+// $code-bg:                     #f9f2f4
+
+// $kbd-color:                   #fff
+// $kbd-bg:                      #333
+
+// $pre-bg:                      #f5f5f5
+// $pre-color:                   $gray-dark
+// $pre-border-color:            #ccc
+// $pre-scrollable-max-height:   340px
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+// $component-offset-horizontal: 180px
+//** Text muted color
+// $text-muted:                  $gray-light
+//** Abbreviations and acronyms border color
+// $abbr-border-color:           $gray-light
+//** Headings small color
+// $headings-small-color:        $gray-light
+//** Blockquote small color
+// $blockquote-small-color:      $gray-light
+//** Blockquote font size
+// $blockquote-font-size:        ($font-size-base * 1.25)
+//** Blockquote border color
+// $blockquote-border-color:     $gray-lighter
+//** Page header border color
+// $page-header-border-color:    $gray-lighter
+//** Width of horizontal description list titles
+// $dl-horizontal-offset:        $component-offset-horizontal
+//** Point at which .dl-horizontal becomes horizontal
+// $dl-horizontal-breakpoint:    $grid-float-breakpoint
+//** Horizontal line color.
+// $hr-border:                   $gray-lighter
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/templates/project/manifest.rb b/civicrm/ext/greenwich/extern/bootstrap3/templates/project/manifest.rb
new file mode 100644
index 0000000000000000000000000000000000000000..93b4fac96e3b35160d78e312ce96792ad6712f8d
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/templates/project/manifest.rb
@@ -0,0 +1,20 @@
+description 'Bootstrap for Sass'
+
+# Stylesheet importing bootstrap
+stylesheet 'styles.sass'
+
+# Bootstrap variable overrides file
+stylesheet '_bootstrap-variables.sass', :to => '_bootstrap-variables.sass'
+
+# Copy JS and fonts
+manifest = Pathname.new(File.dirname(__FILE__))
+assets   = File.expand_path('../../assets', manifest)
+{:javascript => 'javascripts',
+ :font       => 'fonts'
+}.each do |method, dir|
+  root = Pathname.new(assets).join(dir)
+  Dir.glob root.join('**', '*.*') do |path|
+    path = Pathname.new(path)
+    send method, path.relative_path_from(manifest).to_s, :to => path.relative_path_from(root).to_s
+  end
+end
diff --git a/civicrm/ext/greenwich/extern/bootstrap3/templates/project/styles.sass b/civicrm/ext/greenwich/extern/bootstrap3/templates/project/styles.sass
new file mode 100644
index 0000000000000000000000000000000000000000..fb4a2e95e1942e9e0b0911355bf21156d9db61b3
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/bootstrap3/templates/project/styles.sass
@@ -0,0 +1,6 @@
+// Import Bootstrap Compass integration
+@import "bootstrap-compass"
+// Import custom Bootstrap variables
+@import "bootstrap-variables"
+// Import Bootstrap for Sass
+@import "bootstrap"
diff --git a/civicrm/ext/greenwich/extern/select2/select2-bootstrap.scss b/civicrm/ext/greenwich/extern/select2/select2-bootstrap.scss
new file mode 100644
index 0000000000000000000000000000000000000000..3b83f0a2297833158d2a3503c1c63ec4bd0bf1e5
--- /dev/null
+++ b/civicrm/ext/greenwich/extern/select2/select2-bootstrap.scss
@@ -0,0 +1,87 @@
+.form-control .select2-choice {
+    border: 0;
+    border-radius: 2px;
+}
+
+.form-control .select2-choice .select2-arrow {
+    border-radius: 0 2px 2px 0;   
+}
+
+.form-control.select2-container {
+    height: auto !important;
+    padding: 0;
+}
+
+.form-control.select2-container.select2-dropdown-open {
+    border-color: #5897FB;
+    border-radius: 3px 3px 0 0;
+}
+
+.form-control .select2-container.select2-dropdown-open .select2-choices {
+    border-radius: 3px 3px 0 0;
+}
+
+.form-control.select2-container .select2-choices {
+    border: 0 !important;
+    border-radius: 3px;
+}
+
+.control-group.warning .select2-container .select2-choice,
+.control-group.warning .select2-container .select2-choices,
+.control-group.warning .select2-container-active .select2-choice,
+.control-group.warning .select2-container-active .select2-choices,
+.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.warning .select2-container-multi.select2-container-active .select2-choices {
+    border: 1px solid #C09853 !important;
+}
+
+.control-group.warning .select2-container .select2-choice div {
+    border-left: 1px solid #C09853 !important;
+    background: #FCF8E3 !important;
+}
+
+.control-group.error .select2-container .select2-choice,
+.control-group.error .select2-container .select2-choices,
+.control-group.error .select2-container-active .select2-choice,
+.control-group.error .select2-container-active .select2-choices,
+.control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.error .select2-container-multi.select2-container-active .select2-choices {
+    border: 1px solid #B94A48 !important;
+}
+
+.control-group.error .select2-container .select2-choice div {
+    border-left: 1px solid #B94A48 !important;
+    background: #F2DEDE !important;
+}
+
+.control-group.info .select2-container .select2-choice,
+.control-group.info .select2-container .select2-choices,
+.control-group.info .select2-container-active .select2-choice,
+.control-group.info .select2-container-active .select2-choices,
+.control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.info .select2-container-multi.select2-container-active .select2-choices {
+    border: 1px solid #3A87AD !important;
+}
+
+.control-group.info .select2-container .select2-choice div {
+    border-left: 1px solid #3A87AD !important;
+    background: #D9EDF7 !important;
+}
+
+.control-group.success .select2-container .select2-choice,
+.control-group.success .select2-container .select2-choices,
+.control-group.success .select2-container-active .select2-choice,
+.control-group.success .select2-container-active .select2-choices,
+.control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
+.control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
+.control-group.success .select2-container-multi.select2-container-active .select2-choices {
+    border: 1px solid #468847 !important;
+}
+
+.control-group.success .select2-container .select2-choice div {
+    border-left: 1px solid #468847 !important;
+    background: #DFF0D8 !important;
+}
diff --git a/civicrm/ext/greenwich/greenwich.civix.php b/civicrm/ext/greenwich/greenwich.civix.php
new file mode 100644
index 0000000000000000000000000000000000000000..45a6619d008ccae49d3b9e3ebab4f7c0e004a7a8
--- /dev/null
+++ b/civicrm/ext/greenwich/greenwich.civix.php
@@ -0,0 +1,477 @@
+<?php
+
+// AUTO-GENERATED FILE -- Civix may overwrite any changes made to this file
+
+/**
+ * The ExtensionUtil class provides small stubs for accessing resources of this
+ * extension.
+ */
+class CRM_Greenwich_ExtensionUtil {
+  const SHORT_NAME = "greenwich";
+  const LONG_NAME = "greenwich";
+  const CLASS_PREFIX = "CRM_Greenwich";
+
+  /**
+   * Translate a string using the extension's domain.
+   *
+   * If the extension doesn't have a specific translation
+   * for the string, fallback to the default translations.
+   *
+   * @param string $text
+   *   Canonical message text (generally en_US).
+   * @param array $params
+   * @return string
+   *   Translated text.
+   * @see ts
+   */
+  public static function ts($text, $params = []) {
+    if (!array_key_exists('domain', $params)) {
+      $params['domain'] = [self::LONG_NAME, NULL];
+    }
+    return ts($text, $params);
+  }
+
+  /**
+   * Get the URL of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo'.
+   *   Ex: 'http://example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function url($file = NULL) {
+    if ($file === NULL) {
+      return rtrim(CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME), '/');
+    }
+    return CRM_Core_Resources::singleton()->getUrl(self::LONG_NAME, $file);
+  }
+
+  /**
+   * Get the path of a resource file (in this extension).
+   *
+   * @param string|NULL $file
+   *   Ex: NULL.
+   *   Ex: 'css/foo.css'.
+   * @return string
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo'.
+   *   Ex: '/var/www/example.org/sites/default/ext/org.example.foo/css/foo.css'.
+   */
+  public static function path($file = NULL) {
+    // return CRM_Core_Resources::singleton()->getPath(self::LONG_NAME, $file);
+    return __DIR__ . ($file === NULL ? '' : (DIRECTORY_SEPARATOR . $file));
+  }
+
+  /**
+   * Get the name of a class within this extension.
+   *
+   * @param string $suffix
+   *   Ex: 'Page_HelloWorld' or 'Page\\HelloWorld'.
+   * @return string
+   *   Ex: 'CRM_Foo_Page_HelloWorld'.
+   */
+  public static function findClass($suffix) {
+    return self::CLASS_PREFIX . '_' . str_replace('\\', '_', $suffix);
+  }
+
+}
+
+use CRM_Greenwich_ExtensionUtil as E;
+
+/**
+ * (Delegated) Implements hook_civicrm_config().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config
+ */
+function _greenwich_civix_civicrm_config(&$config = NULL) {
+  static $configured = FALSE;
+  if ($configured) {
+    return;
+  }
+  $configured = TRUE;
+
+  $template =& CRM_Core_Smarty::singleton();
+
+  $extRoot = dirname(__FILE__) . DIRECTORY_SEPARATOR;
+  $extDir = $extRoot . 'templates';
+
+  if (is_array($template->template_dir)) {
+    array_unshift($template->template_dir, $extDir);
+  }
+  else {
+    $template->template_dir = [$extDir, $template->template_dir];
+  }
+
+  $include_path = $extRoot . PATH_SEPARATOR . get_include_path();
+  set_include_path($include_path);
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_xmlMenu().
+ *
+ * @param $files array(string)
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu
+ */
+function _greenwich_civix_civicrm_xmlMenu(&$files) {
+  foreach (_greenwich_civix_glob(__DIR__ . '/xml/Menu/*.xml') as $file) {
+    $files[] = $file;
+  }
+}
+
+/**
+ * Implements hook_civicrm_install().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_install
+ */
+function _greenwich_civix_civicrm_install() {
+  _greenwich_civix_civicrm_config();
+  if ($upgrader = _greenwich_civix_upgrader()) {
+    $upgrader->onInstall();
+  }
+}
+
+/**
+ * Implements hook_civicrm_postInstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_postInstall
+ */
+function _greenwich_civix_civicrm_postInstall() {
+  _greenwich_civix_civicrm_config();
+  if ($upgrader = _greenwich_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onPostInstall'])) {
+      $upgrader->onPostInstall();
+    }
+  }
+}
+
+/**
+ * Implements hook_civicrm_uninstall().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_uninstall
+ */
+function _greenwich_civix_civicrm_uninstall() {
+  _greenwich_civix_civicrm_config();
+  if ($upgrader = _greenwich_civix_upgrader()) {
+    $upgrader->onUninstall();
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_enable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_enable
+ */
+function _greenwich_civix_civicrm_enable() {
+  _greenwich_civix_civicrm_config();
+  if ($upgrader = _greenwich_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onEnable'])) {
+      $upgrader->onEnable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_disable().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_disable
+ * @return mixed
+ */
+function _greenwich_civix_civicrm_disable() {
+  _greenwich_civix_civicrm_config();
+  if ($upgrader = _greenwich_civix_upgrader()) {
+    if (is_callable([$upgrader, 'onDisable'])) {
+      $upgrader->onDisable();
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_upgrade().
+ *
+ * @param $op string, the type of operation being performed; 'check' or 'enqueue'
+ * @param $queue CRM_Queue_Queue, (for 'enqueue') the modifiable list of pending up upgrade tasks
+ *
+ * @return mixed
+ *   based on op. for 'check', returns array(boolean) (TRUE if upgrades are pending)
+ *   for 'enqueue', returns void
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_upgrade
+ */
+function _greenwich_civix_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) {
+  if ($upgrader = _greenwich_civix_upgrader()) {
+    return $upgrader->onUpgrade($op, $queue);
+  }
+}
+
+/**
+ * @return CRM_Greenwich_Upgrader
+ */
+function _greenwich_civix_upgrader() {
+  if (!file_exists(__DIR__ . '/CRM/Greenwich/Upgrader.php')) {
+    return NULL;
+  }
+  else {
+    return CRM_Greenwich_Upgrader_Base::instance();
+  }
+}
+
+/**
+ * Search directory tree for files which match a glob pattern.
+ *
+ * Note: Dot-directories (like "..", ".git", or ".svn") will be ignored.
+ * Note: In Civi 4.3+, delegate to CRM_Utils_File::findFiles()
+ *
+ * @param string $dir base dir
+ * @param string $pattern , glob pattern, eg "*.txt"
+ *
+ * @return array
+ */
+function _greenwich_civix_find_files($dir, $pattern) {
+  if (is_callable(['CRM_Utils_File', 'findFiles'])) {
+    return CRM_Utils_File::findFiles($dir, $pattern);
+  }
+
+  $todos = [$dir];
+  $result = [];
+  while (!empty($todos)) {
+    $subdir = array_shift($todos);
+    foreach (_greenwich_civix_glob("$subdir/$pattern") as $match) {
+      if (!is_dir($match)) {
+        $result[] = $match;
+      }
+    }
+    if ($dh = opendir($subdir)) {
+      while (FALSE !== ($entry = readdir($dh))) {
+        $path = $subdir . DIRECTORY_SEPARATOR . $entry;
+        if ($entry[0] == '.') {
+        }
+        elseif (is_dir($path)) {
+          $todos[] = $path;
+        }
+      }
+      closedir($dh);
+    }
+  }
+  return $result;
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_managed().
+ *
+ * Find any *.mgd.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_managed
+ */
+function _greenwich_civix_civicrm_managed(&$entities) {
+  $mgdFiles = _greenwich_civix_find_files(__DIR__, '*.mgd.php');
+  sort($mgdFiles);
+  foreach ($mgdFiles as $file) {
+    $es = include $file;
+    foreach ($es as $e) {
+      if (empty($e['module'])) {
+        $e['module'] = E::LONG_NAME;
+      }
+      if (empty($e['params']['version'])) {
+        $e['params']['version'] = '3';
+      }
+      $entities[] = $e;
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_caseTypes().
+ *
+ * Find any and return any files matching "xml/case/*.xml"
+ *
+ * Note: This hook only runs in CiviCRM 4.4+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_caseTypes
+ */
+function _greenwich_civix_civicrm_caseTypes(&$caseTypes) {
+  if (!is_dir(__DIR__ . '/xml/case')) {
+    return;
+  }
+
+  foreach (_greenwich_civix_glob(__DIR__ . '/xml/case/*.xml') as $file) {
+    $name = preg_replace('/\.xml$/', '', basename($file));
+    if ($name != CRM_Case_XMLProcessor::mungeCaseType($name)) {
+      $errorMessage = sprintf("Case-type file name is malformed (%s vs %s)", $name, CRM_Case_XMLProcessor::mungeCaseType($name));
+      throw new CRM_Core_Exception($errorMessage);
+    }
+    $caseTypes[$name] = [
+      'module' => E::LONG_NAME,
+      'name' => $name,
+      'file' => $file,
+    ];
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_angularModules().
+ *
+ * Find any and return any files matching "ang/*.ang.php"
+ *
+ * Note: This hook only runs in CiviCRM 4.5+.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_angularModules
+ */
+function _greenwich_civix_civicrm_angularModules(&$angularModules) {
+  if (!is_dir(__DIR__ . '/ang')) {
+    return;
+  }
+
+  $files = _greenwich_civix_glob(__DIR__ . '/ang/*.ang.php');
+  foreach ($files as $file) {
+    $name = preg_replace(':\.ang\.php$:', '', basename($file));
+    $module = include $file;
+    if (empty($module['ext'])) {
+      $module['ext'] = E::LONG_NAME;
+    }
+    $angularModules[$name] = $module;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_themes().
+ *
+ * Find any and return any files matching "*.theme.php"
+ */
+function _greenwich_civix_civicrm_themes(&$themes) {
+  $files = _greenwich_civix_glob(__DIR__ . '/*.theme.php');
+  foreach ($files as $file) {
+    $themeMeta = include $file;
+    if (empty($themeMeta['name'])) {
+      $themeMeta['name'] = preg_replace(':\.theme\.php$:', '', basename($file));
+    }
+    if (empty($themeMeta['ext'])) {
+      $themeMeta['ext'] = E::LONG_NAME;
+    }
+    $themes[$themeMeta['name']] = $themeMeta;
+  }
+}
+
+/**
+ * Glob wrapper which is guaranteed to return an array.
+ *
+ * The documentation for glob() says, "On some systems it is impossible to
+ * distinguish between empty match and an error." Anecdotally, the return
+ * result for an empty match is sometimes array() and sometimes FALSE.
+ * This wrapper provides consistency.
+ *
+ * @link http://php.net/glob
+ * @param string $pattern
+ *
+ * @return array
+ */
+function _greenwich_civix_glob($pattern) {
+  $result = glob($pattern);
+  return is_array($result) ? $result : [];
+}
+
+/**
+ * Inserts a navigation menu item at a given place in the hierarchy.
+ *
+ * @param array $menu - menu hierarchy
+ * @param string $path - path to parent of this item, e.g. 'my_extension/submenu'
+ *    'Mailing', or 'Administer/System Settings'
+ * @param array $item - the item to insert (parent/child attributes will be
+ *    filled for you)
+ *
+ * @return bool
+ */
+function _greenwich_civix_insert_navigation_menu(&$menu, $path, $item) {
+  // If we are done going down the path, insert menu
+  if (empty($path)) {
+    $menu[] = [
+      'attributes' => array_merge([
+        'label'      => CRM_Utils_Array::value('name', $item),
+        'active'     => 1,
+      ], $item),
+    ];
+    return TRUE;
+  }
+  else {
+    // Find an recurse into the next level down
+    $found = FALSE;
+    $path = explode('/', $path);
+    $first = array_shift($path);
+    foreach ($menu as $key => &$entry) {
+      if ($entry['attributes']['name'] == $first) {
+        if (!isset($entry['child'])) {
+          $entry['child'] = [];
+        }
+        $found = _greenwich_civix_insert_navigation_menu($entry['child'], implode('/', $path), $item);
+      }
+    }
+    return $found;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_navigationMenu().
+ */
+function _greenwich_civix_navigationMenu(&$nodes) {
+  if (!is_callable(['CRM_Core_BAO_Navigation', 'fixNavigationMenu'])) {
+    _greenwich_civix_fixNavigationMenu($nodes);
+  }
+}
+
+/**
+ * Given a navigation menu, generate navIDs for any items which are
+ * missing them.
+ */
+function _greenwich_civix_fixNavigationMenu(&$nodes) {
+  $maxNavID = 1;
+  array_walk_recursive($nodes, function($item, $key) use (&$maxNavID) {
+    if ($key === 'navID') {
+      $maxNavID = max($maxNavID, $item);
+    }
+  });
+  _greenwich_civix_fixNavigationMenuItems($nodes, $maxNavID, NULL);
+}
+
+function _greenwich_civix_fixNavigationMenuItems(&$nodes, &$maxNavID, $parentID) {
+  $origKeys = array_keys($nodes);
+  foreach ($origKeys as $origKey) {
+    if (!isset($nodes[$origKey]['attributes']['parentID']) && $parentID !== NULL) {
+      $nodes[$origKey]['attributes']['parentID'] = $parentID;
+    }
+    // If no navID, then assign navID and fix key.
+    if (!isset($nodes[$origKey]['attributes']['navID'])) {
+      $newKey = ++$maxNavID;
+      $nodes[$origKey]['attributes']['navID'] = $newKey;
+      $nodes[$newKey] = $nodes[$origKey];
+      unset($nodes[$origKey]);
+      $origKey = $newKey;
+    }
+    if (isset($nodes[$origKey]['child']) && is_array($nodes[$origKey]['child'])) {
+      _greenwich_civix_fixNavigationMenuItems($nodes[$origKey]['child'], $maxNavID, $nodes[$origKey]['attributes']['navID']);
+    }
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders
+ */
+function _greenwich_civix_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  $settingsDir = __DIR__ . DIRECTORY_SEPARATOR . 'settings';
+  if (!in_array($settingsDir, $metaDataFolders) && is_dir($settingsDir)) {
+    $metaDataFolders[] = $settingsDir;
+  }
+}
+
+/**
+ * (Delegated) Implements hook_civicrm_entityTypes().
+ *
+ * Find any *.entityType.php files, merge their content, and return.
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_entityTypes
+ */
+function _greenwich_civix_civicrm_entityTypes(&$entityTypes) {
+  $entityTypes = array_merge($entityTypes, []);
+}
diff --git a/civicrm/ext/greenwich/greenwich.php b/civicrm/ext/greenwich/greenwich.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f4ffc0b89f8b7a237395c7db0d892494c87bdad
--- /dev/null
+++ b/civicrm/ext/greenwich/greenwich.php
@@ -0,0 +1,64 @@
+<?php
+
+require_once 'greenwich.civix.php';
+// phpcs:disable
+use CRM_Greenwich_ExtensionUtil as E;
+// phpcs:enable
+
+/**
+ * Implements hook_civicrm_config().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_config/
+ */
+function greenwich_civicrm_config(&$config) {
+  _greenwich_civix_civicrm_config($config);
+}
+
+///**
+// * Implements hook_civicrm_xmlMenu().
+// *
+// * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_xmlMenu
+// */
+//function greenwich_civicrm_xmlMenu(&$files) {
+//  _greenwich_civix_civicrm_xmlMenu($files);
+//}
+
+/**
+ * Implements hook_civicrm_alterSettingsFolders().
+ *
+ * @link https://docs.civicrm.org/dev/en/latest/hooks/hook_civicrm_alterSettingsFolders
+ */
+function greenwich_civicrm_alterSettingsFolders(&$metaDataFolders = NULL) {
+  _greenwich_civix_civicrm_alterSettingsFolders($metaDataFolders);
+}
+
+/**
+ * Implements hook_civicrm_themes().
+ */
+function greenwich_civicrm_themes(&$themes) {
+  // _greenwich_civix_civicrm_themes($themes);
+  $themes['greenwich'] = [
+    'ext' => 'civicrm',
+    'title' => 'Greenwich',
+    'help' => ts('CiviCRM 4.x look-and-feel'),
+  ];
+}
+
+/**
+ * Implements hook_civicrm_alterBundle().
+ */
+function greenwich_civicrm_alterBundle(CRM_Core_Resources_Bundle $bundle) {
+  $theme = Civi::service('themes')->getActiveThemeKey();
+  switch ($theme . ':' . $bundle->name) {
+    case 'greenwich:bootstrap3':
+      $bundle->clear();
+      $bundle->addStyleFile('greenwich', 'dist/bootstrap3.css');
+      $bundle->addScriptFile('greenwich', 'extern/bootstrap3/assets/javascripts/bootstrap.min.js', [
+        'translate' => FALSE,
+      ]);
+      $bundle->addScriptFile('greenwich', 'js/noConflict.js', [
+        'translate' => FALSE,
+      ]);
+      break;
+  }
+}
diff --git a/civicrm/ext/greenwich/info.xml b/civicrm/ext/greenwich/info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..04e87a48a3a882f9a20395be5c793e4e2d1ba22f
--- /dev/null
+++ b/civicrm/ext/greenwich/info.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+<extension key="greenwich" type="module">
+  <file>greenwich</file>
+  <name>Theme: Greenwich</name>
+  <description>Traditional CiviCRM look-and-feel</description>
+  <license>AGPL-3.0</license>
+  <maintainer>
+    <author>CiviCRM</author>
+    <email>info@civicrm.org</email>
+  </maintainer>
+  <urls>
+    <url desc="Main Extension Page">http://civicrm.org</url>
+    <url desc="Documentation">http://civicrm.org</url>
+    <url desc="Support">http://civicrm.org</url>
+    <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
+  </urls>
+  <releaseDate>2020-07-21</releaseDate>
+  <version>1.0</version>
+  <tags>
+    <tag>mgmt:hidden</tag>
+  </tags>
+  <develStage>stable</develStage>
+  <compatibility>
+    <ver>5.31</ver>
+  </compatibility>
+  <classloader>
+    <psr4 prefix="Civi\" path="Civi"/>
+  </classloader>
+  <civix>
+    <namespace>CRM/Greenwich</namespace>
+  </civix>
+</extension>
diff --git a/civicrm/ext/greenwich/js/noConflict.js b/civicrm/ext/greenwich/js/noConflict.js
new file mode 100644
index 0000000000000000000000000000000000000000..ba419004137e3e2db995cc0edb1982be57dc64f1
--- /dev/null
+++ b/civicrm/ext/greenwich/js/noConflict.js
@@ -0,0 +1,4 @@
+// https://civicrm.org/licensing
+(function($) {
+  $.fn.button.noConflict();
+})(jQuery);
diff --git a/civicrm/ext/greenwich/scss/_greenwich.scss b/civicrm/ext/greenwich/scss/_greenwich.scss
new file mode 100644
index 0000000000000000000000000000000000000000..b639e1204e041b80789b67ca5037a2e9fe0fcdbc
--- /dev/null
+++ b/civicrm/ext/greenwich/scss/_greenwich.scss
@@ -0,0 +1,894 @@
+/*! Generated by Live LESS Theme Customizer */
+    
+
+//
+// Variables
+// --------------------------------------------------
+
+
+//== Colors
+//
+//## Gray and brand colors for use across Bootstrap.
+
+$gray-base: rgb(0, 0, 0);
+$gray-darker: lighten($gray-base, 13.5%); // #222
+$gray-dark: lighten($gray-base, 20%);   // #333
+$gray: lighten($gray-base, 33.5%); // #555
+$gray-light: lighten($gray-base, 60%); // #777
+$gray-lighter: lighten($gray-base, 93.5%); // #eee
+
+$brand-primary: rgb(0, 0, 0); // #337ab7
+$brand-success: rgb(115, 168, 57);
+$brand-info: rgb(205, 232, 254);
+$brand-warning: rgb(221, 86, 0);
+$brand-danger: rgb(199, 28, 34);
+
+
+//== Scaffolding
+//
+//## Settings for some of the most global styles.
+
+//** Background color for `<body>`.
+$body-bg: rgb(255, 255, 255);
+//** Global text color on `<body>`.
+$text-color: $gray;
+
+//** Global textual link color.
+$link-color: $brand-primary;
+//** Link hover color set via `darken()` function.
+$link-hover-color: darken($link-color, 15%);
+//** Link hover decoration.
+$link-hover-decoration: underline;
+
+
+//== Typography
+//
+//## Font, line-height, and color for body text, headings, and more.
+
+$font-family-sans-serif: "Verdana", "Helvetica Neue", Helvetica, Arial, sans-serif;
+$font-family-serif: Georgia, "Times New Roman", Times, serif;
+//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
+$font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace;
+$font-family-base: $font-family-sans-serif;
+
+$font-size-base: 14px;
+$font-size-large: ceil(($font-size-base * 1.25)); // ~18px
+$font-size-small: ceil(($font-size-base * 0.85)); // ~12px
+
+$font-size-h1: floor(($font-size-base * 2.6)); // ~36px
+$font-size-h2: floor(($font-size-base * 2.15)); // ~30px
+$font-size-h3: ceil(($font-size-base * 1.7)); // ~24px
+$font-size-h4: ceil(($font-size-base * 1.25)); // ~18px
+$font-size-h5: $font-size-base;
+$font-size-h6: ceil(($font-size-base * 0.85)); // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+$line-height-base: 1.428571429; // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+$line-height-computed: floor(($font-size-base * $line-height-base)); // ~20px
+
+//** By default, this inherits from the `<body>`.
+$headings-font-family: $font-family-base;
+$headings-font-weight: 500;
+$headings-line-height: 1.2;
+$headings-color: rgb(0, 0, 0);
+
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+$icon-font-path: "../fonts/";
+//** File name for all font files.
+$icon-font-name: "glyphicons-halflings-regular";
+//** Element ID within SVG icon file.
+$icon-font-svg-id: "glyphicons_halflingsregular";
+
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+$padding-base-vertical: 4px;
+$padding-base-horizontal: 8px;
+
+$padding-large-vertical: 14px;
+$padding-large-horizontal: 16px;
+
+$padding-small-vertical: 5px;
+$padding-small-horizontal: 10px;
+
+$padding-xs-vertical: 1px;
+$padding-xs-horizontal: 5px;
+
+$line-height-large: 1.3333333; // extra decimals for Win 8.1 Chrome
+$line-height-small: 1.5;
+
+$border-radius-base: 4px;
+$border-radius-large: 6px;
+$border-radius-small: 3px;
+
+//** Global color for active items (e.g., navs or dropdowns).
+$component-active-color: rgb(255, 255, 255);
+//** Global background color for active items (e.g., navs or dropdowns).
+$component-active-bg: $brand-primary;
+
+//** Width of the `border` for generating carets that indicate dropdowns.
+$caret-width-base: 4px;
+//** Carets increase slightly in size for larger components.
+$caret-width-large: 5px;
+
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for `<th>`s and `<td>`s.
+$table-cell-padding: 8px;
+//** Padding for cells in `.table-condensed`.
+$table-condensed-cell-padding: 5px;
+
+//** Default background color used for all tables.
+$table-bg: transparent;
+//** Background color used for `.table-striped`.
+$table-bg-accent: rgb(249, 249, 249);
+//** Background color used for `.table-hover`.
+$table-bg-hover: rgb(245, 245, 245);
+$table-bg-active: $table-bg-hover;
+
+//** Border color for table and cell borders.
+$table-border-color: rgb(221, 221, 221);
+
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+$btn-font-weight: normal;
+
+$btn-default-color: rgb(255, 255, 255);
+$btn-default-bg: rgb(112, 113, 107);
+$btn-default-border: rgba(0, 0, 0, 0.1);
+
+$btn-primary-color: rgb(255, 255, 255);
+$btn-primary-bg: $btn-default-bg;
+$btn-primary-border: $btn-primary-bg;
+
+$btn-success-color: rgb(255, 255, 255);
+$btn-success-bg: $brand-success;
+$btn-success-border: $btn-success-bg;
+
+$btn-info-color: rgb(255, 255, 255);
+$btn-info-bg: $brand-info;
+$btn-info-border: $btn-info-bg;
+
+$btn-warning-color: rgb(255, 255, 255);
+$btn-warning-bg: $brand-warning;
+$btn-warning-border: $btn-warning-bg;
+
+$btn-danger-color: rgb(255, 255, 255);
+$btn-danger-bg: $brand-danger;
+$btn-danger-border: $btn-danger-bg;
+
+$btn-link-disabled-color: $gray-light;
+
+// Allows for customizing button radius independently from global border radius
+$btn-border-radius-base: $border-radius-base;
+$btn-border-radius-large: $border-radius-large;
+$btn-border-radius-small: $border-radius-small;
+
+
+//== Forms
+//
+//##
+
+
+//** `<input>` background color
+$input-bg: rgb(255, 255, 255);
+//** `<input disabled>` background color
+$input-bg-disabled: $gray-lighter;
+
+//** Text color for `<input>`s
+$input-color: $text-color;
+//** `<input>` border color
+$input-border: rgb(204, 204, 204);
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.
+$input-border-radius: $border-radius-base;
+//** Large `.form-control` border radius
+$input-border-radius-large: $border-radius-large;
+//** Small `.form-control` border radius
+$input-border-radius-small: $border-radius-small;
+
+//** Border color for inputs on focus
+$input-border-focus: rgb(102, 175, 233);
+
+//** Placeholder text color
+$input-color-placeholder: $gray-light;
+
+//** Default `.form-control` height
+$input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2);
+//** Large `.form-control` height
+$input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2);
+//** Small `.form-control` height
+$input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2);
+
+//** `.form-group` margin
+$form-group-margin-bottom: 15px;
+
+$legend-color: $text-color;
+$legend-border-color: rgb(229, 229, 229);
+
+//** Background color for textual input addons
+$input-group-addon-bg: $gray-lighter;
+//** Border color for textual input addons
+$input-group-addon-border-color: $input-border;
+
+//** Disabled cursor for form controls and buttons.
+$cursor-disabled: not-allowed;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg: rgb(255, 255, 255);
+//** Dropdown menu `border-color`.
+$dropdown-border: rgba(0, 0, 0, 0.15);
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border: rgb(204, 204, 204);
+//** Divider color for between dropdown items.
+$dropdown-divider-bg: rgb(229, 229, 229);
+
+//** Dropdown link text color.
+$dropdown-link-color: $gray-dark;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color: rgb(255, 255, 255);
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg: $component-active-bg;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color: rgb(255, 255, 255);
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg: $component-active-bg;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color: $gray-light;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color: $gray-light;
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+$dropdown-caret-color: rgb(0, 0, 0);
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar: 1000;
+$zindex-dropdown: 1000;
+$zindex-popover: 1060;
+$zindex-tooltip: 1070;
+$zindex-navbar-fixed: 1030;
+$zindex-modal-background: 1040;
+$zindex-modal: 1050;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+$screen-xs: 480px;
+//** Deprecated `$screen-xs-min` as of v3.2.0
+$screen-xs-min: $screen-xs;
+//** Deprecated `$screen-phone` as of v3.0.1
+$screen-phone: $screen-xs-min;
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+$screen-sm: 768px;
+$screen-sm-min: $screen-sm;
+//** Deprecated `$screen-tablet` as of v3.0.1
+$screen-tablet: $screen-sm-min;
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+$screen-md: 992px;
+$screen-md-min: $screen-md;
+//** Deprecated `$screen-desktop` as of v3.0.1
+$screen-desktop: $screen-md-min;
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+$screen-lg: 1200px;
+$screen-lg-min: $screen-lg;
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+$screen-lg-desktop: $screen-lg-min;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max: ($screen-sm-min - 1);
+$screen-sm-max: ($screen-md-min - 1);
+$screen-md-max: ($screen-lg-min - 1);
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns: 12;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width: 30px;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint: $screen-sm-min;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1);
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet: (720px + $grid-gutter-width);
+//** For `$screen-sm-min` and up.
+$container-sm: $container-tablet;
+
+// Medium screen / desktop
+$container-desktop: (940px + $grid-gutter-width);
+//** For `$screen-md-min` and up.
+$container-md: $container-desktop;
+
+// Large screen / wide desktop
+$container-large-desktop: (1140px + $grid-gutter-width);
+//** For `$screen-lg-min` and up.
+$container-lg: $container-large-desktop;
+
+
+//== Navbar
+//
+//##
+
+
+// Basics of a navbar
+$navbar-height: 50px;
+$navbar-margin-bottom: $line-height-computed;
+$navbar-border-radius: $border-radius-base;
+$navbar-padding-horizontal: floor(($grid-gutter-width / 2));
+$navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2);
+$navbar-collapse-max-height: 340px;
+
+$navbar-default-color: rgb(221, 221, 221);
+$navbar-default-bg: $brand-primary;
+$navbar-default-border: darken($navbar-default-bg, 6.5%);
+
+// Navbar links
+$navbar-default-link-color: rgb(255, 255, 255);
+$navbar-default-link-hover-color: rgb(255, 255, 255);
+$navbar-default-link-hover-bg: darken($navbar-default-bg, 10%);
+$navbar-default-link-active-color: rgb(255, 255, 255);
+$navbar-default-link-active-bg: darken($navbar-default-bg, 10%);
+$navbar-default-link-disabled-color: rgb(221, 221, 221);
+$navbar-default-link-disabled-bg: transparent;
+
+// Navbar brand label
+$navbar-default-brand-color: $navbar-default-link-color;
+$navbar-default-brand-hover-color: rgb(255, 255, 255);
+$navbar-default-brand-hover-bg: none;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg: darken($navbar-default-bg, 10%);
+$navbar-default-toggle-icon-bar-bg: rgb(255, 255, 255);
+$navbar-default-toggle-border-color: darken($navbar-default-bg, 10%);
+
+
+//=== Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color: rgb(255, 255, 255);
+$navbar-inverse-bg: $brand-info;
+$navbar-inverse-border: darken($navbar-inverse-bg, 5%);
+
+// Inverted navbar links
+$navbar-inverse-link-color: rgb(255, 255, 255);
+$navbar-inverse-link-hover-color: rgb(255, 255, 255);
+$navbar-inverse-link-hover-bg: darken($navbar-inverse-bg, 5%);
+$navbar-inverse-link-active-color: rgb(255, 255, 255);
+$navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 5%);
+$navbar-inverse-link-disabled-color: rgb(204, 204, 204);
+$navbar-inverse-link-disabled-bg: transparent;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color: $navbar-inverse-link-color;
+$navbar-inverse-brand-hover-color: rgb(255, 255, 255);
+$navbar-inverse-brand-hover-bg: none;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg: darken($navbar-inverse-bg, 5%);
+$navbar-inverse-toggle-icon-bar-bg: rgb(255, 255, 255);
+$navbar-inverse-toggle-border-color: darken($navbar-inverse-bg, 5%);
+
+
+//== Navs
+//
+//##
+
+
+//=== Shared nav styles
+$nav-link-padding: 10px 15px;
+$nav-link-hover-bg: $gray-lighter;
+
+$nav-disabled-link-color: $gray-light;
+$nav-disabled-link-hover-color: $gray-light;
+
+//== Tabs
+$nav-tabs-border-color: rgb(221, 221, 221);
+
+$nav-tabs-link-hover-border-color: $gray-lighter;
+
+$nav-tabs-active-link-hover-bg: $body-bg;
+$nav-tabs-active-link-hover-color: $gray;
+$nav-tabs-active-link-hover-border-color: rgb(221, 221, 221);
+
+$nav-tabs-justified-link-border-color: rgb(221, 221, 221);
+$nav-tabs-justified-active-link-border-color: $body-bg;
+
+//== Pills
+$nav-pills-border-radius: $border-radius-base;
+$nav-pills-active-link-hover-bg: $component-active-bg;
+$nav-pills-active-link-hover-color: $component-active-color;
+
+
+//== Pagination
+//
+//##
+
+
+$pagination-color: $link-color;
+$pagination-bg: rgb(255, 255, 255);
+$pagination-border: rgb(221, 221, 221);
+
+$pagination-hover-color: $link-hover-color;
+$pagination-hover-bg: $gray-lighter;
+$pagination-hover-border: rgb(221, 221, 221);
+
+$pagination-active-color: $gray-light;
+$pagination-active-bg: rgb(245, 245, 245);
+$pagination-active-border: $pagination-hover-border;
+
+$pagination-disabled-color: $gray-light;
+$pagination-disabled-bg: rgb(255, 255, 255);
+$pagination-disabled-border: rgb(221, 221, 221);
+
+
+//== Pager
+//
+//##
+
+
+$pager-bg: $pagination-bg;
+$pager-border: $pagination-border;
+$pager-border-radius: 15px;
+
+$pager-hover-bg: $pagination-hover-bg;
+
+$pager-active-bg: $pagination-active-bg;
+$pager-active-color: $pagination-active-color;
+
+$pager-disabled-color: $gray-light;
+
+
+//== Jumbotron
+//
+//##
+
+
+$jumbotron-padding: 30px;
+$jumbotron-color: inherit;
+$jumbotron-bg: $gray-lighter;
+$jumbotron-heading-color: inherit;
+$jumbotron-font-size: ceil(($font-size-base * 1.5));
+$jumbotron-heading-font-size: ceil(($font-size-base * 4.5));
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text: rgb(70, 136, 71);
+$state-success-bg: rgb(223, 240, 216);
+$state-success-border: darken(adjust-hue($state-success-bg, -10), 5%);
+
+$state-info-text: rgb(58, 135, 173);
+$state-info-bg: rgb(217, 237, 247);
+$state-info-border: darken(adjust-hue($state-info-bg, -10), 7%);
+
+$state-warning-text: rgb(192, 152, 83);
+$state-warning-bg: rgb(252, 248, 227);
+$state-warning-border: darken(adjust-hue($state-warning-bg, -10), 3%);
+
+$state-danger-text: rgb(185, 74, 72);
+$state-danger-bg: rgb(242, 222, 222);
+$state-danger-border: darken(adjust-hue($state-danger-bg, -10), 3%);
+
+
+//== Tooltips
+//
+//##
+
+
+//** Tooltip max width
+$tooltip-max-width: 200px;
+//** Tooltip text color
+$tooltip-color: rgb(255, 255, 255);
+//** Tooltip background color
+$tooltip-bg: rgb(0, 0, 0);
+//$tooltip-opacity: @include 9;
+
+//** Tooltip arrow width
+$tooltip-arrow-width: 5px;
+//** Tooltip arrow color
+$tooltip-arrow-color: $tooltip-bg;
+
+
+//== Popovers
+//
+//##
+
+
+//** Popover body background color
+$popover-bg: rgb(255, 255, 255);
+//** Popover maximum width
+$popover-max-width: 276px;
+//** Popover border color
+$popover-border-color: rgba(0, 0, 0, 0.2);
+//** Popover fallback border color
+$popover-fallback-border-color: rgb(204, 204, 204);
+
+//** Popover title background color
+$popover-title-bg: darken($popover-bg, 3%);
+
+//** Popover arrow width
+$popover-arrow-width: 10px;
+//** Popover arrow color
+$popover-arrow-color: $popover-bg;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width: ($popover-arrow-width + 1);
+//** Popover outer arrow color
+$popover-arrow-outer-color: fadein($popover-border-color, 5%);
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%);
+
+
+//== Labels
+//
+//##
+
+
+//** Default label background color
+$label-default-bg: $gray-light;
+//** Primary label background color
+$label-primary-bg: $brand-primary;
+//** Success label background color
+$label-success-bg: $brand-success;
+//** Info label background color
+$label-info-bg: $brand-info;
+//** Warning label background color
+$label-warning-bg: $brand-warning;
+//** Danger label background color
+$label-danger-bg: $brand-danger;
+
+//** Default label text color
+$label-color: rgb(255, 255, 255);
+//** Default text color of a linked label
+$label-link-hover-color: rgb(255, 255, 255);
+
+
+//== Modals
+//
+//##
+
+
+//** Padding applied to the modal body
+$modal-inner-padding: 20px;
+
+//** Padding applied to the modal title
+$modal-title-padding: 15px;
+//** Modal title line-height
+$modal-title-line-height: $line-height-base;
+
+//** Background color of modal content area
+$modal-content-bg: rgb(255, 255, 255);
+//** Modal content border color
+$modal-content-border-color: rgba(0, 0, 0, 0.2);
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color: rgb(153, 153, 153);
+
+//** Modal backdrop background color
+$modal-backdrop-bg: rgb(0, 0, 0);
+//** Modal backdrop opacity
+//$modal-backdrop-opacity: @include 5;
+//** Modal header border color
+$modal-header-border-color: rgb(229, 229, 229);
+//** Modal footer border color
+$modal-footer-border-color: $modal-header-border-color;
+
+$modal-lg: 900px;
+$modal-md: 600px;
+$modal-sm: 300px;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding: 15px;
+$alert-border-radius: $border-radius-base;
+$alert-link-font-weight: bold;
+
+$alert-success-bg: $state-success-bg;
+$alert-success-text: $state-success-text;
+$alert-success-border: $state-success-border;
+
+$alert-info-bg: $state-info-bg;
+$alert-info-text: $state-info-text;
+$alert-info-border: $state-info-border;
+
+$alert-warning-bg: $state-warning-bg;
+$alert-warning-text: $state-warning-text;
+$alert-warning-border: $state-warning-border;
+
+$alert-danger-bg: $state-danger-bg;
+$alert-danger-text: $state-danger-text;
+$alert-danger-border: $state-danger-border;
+
+
+//== Progress bars
+//
+//##
+
+
+//** Background color of the whole progress component
+$progress-bg: rgb(245, 245, 245);
+//** Progress bar text color
+$progress-bar-color: rgb(255, 255, 255);
+//** Variable for setting rounded corners on progress bar.
+$progress-border-radius: $border-radius-base;
+
+//** Default progress bar color
+$progress-bar-bg: $brand-primary;
+//** Success progress bar color
+$progress-bar-success-bg: $brand-success;
+//** Warning progress bar color
+$progress-bar-warning-bg: $brand-warning;
+//** Danger progress bar color
+$progress-bar-danger-bg: $brand-danger;
+//** Info progress bar color
+$progress-bar-info-bg: $brand-info;
+
+
+//== List group
+//
+//##
+
+
+//** Background color on `.list-group-item`
+$list-group-bg: rgb(255, 255, 255);
+//** `.list-group-item` border color
+$list-group-border: rgb(221, 221, 221);
+//** List group border radius
+$list-group-border-radius: $border-radius-base;
+
+//** Background color of single list items on hover
+$list-group-hover-bg: rgb(245, 245, 245);
+//** Text color of active list items
+$list-group-active-color: $component-active-color;
+//** Background color of active list items
+$list-group-active-bg: $component-active-bg;
+//** Border color of active list elements
+$list-group-active-border: $list-group-active-bg;
+//** Text color for content within active list items
+$list-group-active-text-color: lighten($list-group-active-bg, 40%);
+
+//** Text color of disabled list items
+$list-group-disabled-color: $gray-light;
+//** Background color of disabled list items
+$list-group-disabled-bg: $gray-lighter;
+//** Text color for content within disabled list items
+$list-group-disabled-text-color: $list-group-disabled-color;
+
+$list-group-link-color: rgb(85, 85, 85);
+$list-group-link-hover-color: $list-group-link-color;
+$list-group-link-heading-color: rgb(51, 51, 51);
+
+
+//== Panels
+//
+//##
+
+
+$panel-bg: rgb(255, 255, 255);
+$panel-body-padding: 15px;
+$panel-heading-padding: 10px 15px;
+$panel-footer-padding: $panel-heading-padding;
+$panel-border-radius: $border-radius-base;
+
+//** Border color for elements within panels
+$panel-inner-border: rgb(221, 221, 221);
+$panel-footer-bg: rgb(245, 245, 245);
+
+$panel-default-text: $text-color;
+$panel-default-border: rgb(221, 221, 221);
+$panel-default-heading-bg: rgb(245, 245, 245);
+
+$panel-primary-text: rgb(255, 255, 255);
+$panel-primary-border: $panel-default-border;
+$panel-primary-heading-bg: $brand-primary;
+
+$panel-success-text: $state-success-text;
+$panel-success-border: $panel-default-border;
+$panel-success-heading-bg: $brand-success;
+
+$panel-info-text: $state-info-text;
+$panel-info-border: $panel-default-border;
+$panel-info-heading-bg: $brand-info;
+
+$panel-warning-text: $state-warning-text;
+$panel-warning-border: $panel-default-border;
+$panel-warning-heading-bg: $brand-warning;
+
+$panel-danger-text: $state-danger-text;
+$panel-danger-border: $panel-default-border;
+$panel-danger-heading-bg: $brand-danger;
+
+
+//== Thumbnails
+//
+//##
+
+
+//** Padding around the thumbnail image
+$thumbnail-padding: 4px;
+//** Thumbnail background color
+$thumbnail-bg: $body-bg;
+//** Thumbnail border color
+$thumbnail-border: rgb(221, 221, 221);
+//** Thumbnail border radius
+$thumbnail-border-radius: $border-radius-base;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color: $text-color;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding: 9px;
+
+
+//== Wells
+//
+//##
+
+
+$well-bg: rgb(245, 245, 245);
+$well-border: darken($well-bg, 7%);
+
+
+//== Badges
+//
+//##
+
+
+$badge-color: rgb(255, 255, 255);
+//** Linked badge text color on hover
+$badge-link-hover-color: rgb(255, 255, 255);
+$badge-bg: $brand-primary;
+
+//** Badge text color in active nav link
+$badge-active-color: $link-color;
+//** Badge background color in active nav link
+$badge-active-bg: rgb(255, 255, 255);
+
+$badge-font-weight: bold;
+$badge-line-height: 1;
+$badge-border-radius: 10px;
+
+
+//== Breadcrumbs
+//
+//##
+
+
+$breadcrumb-padding-vertical: 8px;
+$breadcrumb-padding-horizontal: 15px;
+//** Breadcrumb background color
+$breadcrumb-bg: rgb(245, 245, 245);
+//** Breadcrumb text color
+$breadcrumb-color: rgb(204, 204, 204);
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color: $gray-light;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator: "/";
+
+
+//== Carousel
+//
+//##
+
+
+$carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6);
+
+$carousel-control-color: rgb(255, 255, 255);
+$carousel-control-width: 15%;
+//$carousel-control-opacity: @include 5;
+$carousel-control-font-size: 20px;
+
+$carousel-indicator-active-bg: rgb(255, 255, 255);
+$carousel-indicator-border-color: rgb(255, 255, 255);
+
+$carousel-caption-color: rgb(255, 255, 255);
+
+
+//== Close
+//
+//##
+
+
+$close-font-weight: bold;
+$close-color: rgb(0, 0, 0);
+$close-text-shadow: 0 1px 0 #fff;
+
+
+//== Code
+//
+//##
+
+
+$code-color: rgb(199, 37, 78);
+$code-bg: rgb(249, 242, 244);
+
+$kbd-color: rgb(255, 255, 255);
+$kbd-bg: rgb(51, 51, 51);
+
+$pre-bg: rgb(245, 245, 245);
+$pre-color: $gray-dark;
+$pre-border-color: rgb(204, 204, 204);
+$pre-scrollable-max-height: 340px;
+
+
+//== Type
+//
+//##
+
+
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px;
+//** Text muted color
+$text-muted: $gray-light;
+//** Abbreviations and acronyms border color
+$abbr-border-color: $gray-light;
+//** Headings small color
+$headings-small-color: $gray-light;
+//** Blockquote small color
+$blockquote-small-color: $gray-light;
+//** Blockquote font size
+$blockquote-font-size: ($font-size-base * 1.25);
+//** Blockquote border color
+$blockquote-border-color: $gray-lighter;
+//** Page header border color
+$page-header-border-color: $gray-lighter;
+//** Width of horizontal description list titles
+$dl-horizontal-offset: $component-offset-horizontal;
+//** Point at which .dl-horizontal becomes horizontal
+$dl-horizontal-breakpoint: $grid-float-breakpoint;
+//** Horizontal line color.
+$hr-border: $gray-lighter;
+    
\ No newline at end of file
diff --git a/civicrm/ext/greenwich/scss/main.scss b/civicrm/ext/greenwich/scss/main.scss
new file mode 100644
index 0000000000000000000000000000000000000000..90da6210bb9f38aa05e971be46b1dc1bffa97e51
--- /dev/null
+++ b/civicrm/ext/greenwich/scss/main.scss
@@ -0,0 +1,5 @@
+#bootstrap-theme {
+  @import "greenwich";
+  @import "bootstrap";
+  @import "select2-bootstrap";
+}
diff --git a/civicrm/ext/iatspayments/CRM/Core/Payment/Faps.php b/civicrm/ext/iatspayments/CRM/Core/Payment/Faps.php
index 2fe106e3128058b7db133b47b7e39ce88f33d3b0..5719b25bcf215400739fdec4498c6e02aa354f67 100644
--- a/civicrm/ext/iatspayments/CRM/Core/Payment/Faps.php
+++ b/civicrm/ext/iatspayments/CRM/Core/Payment/Faps.php
@@ -1,5 +1,29 @@
 <?php
 
+/**
+ * @file
+ * Copyright iATS Payments (c) 2020.
+ * @author Alan Dixon
+ *
+ * This file is a part of CiviCRM published extension.
+ *
+ * This extension is free software; you can copy, modify, and distribute it
+ * under the terms of the GNU Affero General Public License
+ * Version 3, 19 November 2007.
+ *
+ * It is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License with this program; if not, see http://www.gnu.org/licenses/
+ *
+ * This code provides glue between CiviCRM payment model and the payment model encapsulated in the CRM\Iats\FapsRequest object
+ */
+
+use Civi\Payment\Exception\PaymentProcessorException;
+
 class CRM_Core_Payment_Faps extends CRM_Core_Payment {
 
   /**
@@ -21,7 +45,6 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
   function __construct( $mode, &$paymentProcessor ) {
     $this->_mode             = $mode;
     $this->_paymentProcessor = $paymentProcessor;
-    $this->_processorName    = ts('iATS Payments 1st American Payment System Interface');
     $this->disable_cryptogram   = iats_get_setting('disable_cryptogram');
     $this->is_test = ($this->_mode == 'test' ? 1 : 0);
   }
@@ -153,7 +176,7 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
     $cryptojs = 'https://' . $iats_domain . '/secure/PaymentHostedForm/Scripts/firstpay/firstpay.cryptogram.js';
     $iframe_src = 'https://' . $iats_domain . '/secure/PaymentHostedForm/v3/CreditCard';
     $jsVariables = [
-      'paymentProcessorId' => $this->_paymentProcessor['id'], 
+      'paymentProcessorId' => $this->_paymentProcessor['id'],
       'transcenterId' => $this->_paymentProcessor['password'],
       'processorId' => $this->_paymentProcessor['user_name'],
       'currency' => $form->getCurrency(),
@@ -165,10 +188,10 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
     ];
     $resources = CRM_Core_Resources::singleton();
     $cryptoCss = $resources->getUrl('com.iatspayments.civicrm', 'css/crypto.css');
-    $markup = '<link type="text/css" rel="stylesheet" href="'.$cryptoCss.'" media="all" /><script type="text/javascript" src="'.$cryptojs.'"></script>';
+    $markup = '<link type="text/css" rel="stylesheet" href="'.$cryptoCss.'" media="all" />'; // <script type="text/javascript" src="'.$cryptojs.'"></script>';
     CRM_Core_Region::instance('billing-block')->add(array(
       'markup' => $markup,
-    ));
+    )); 
     // the cryptojs above is the one on the 1pay server, now I load and invoke the extension's crypto.js
     $myCryptoJs = $resources->getUrl('com.iatspayments.civicrm', 'js/crypto.js');
     // after manually doing what addVars('iats', $jsVariables) would normally do
@@ -182,6 +205,22 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
 
   }
 
+  /**
+   * Internal function to determine if I'm supporting self-service functions
+   *
+   * @return bool
+   */
+  protected function allowSelfService($action) {
+    if ('CRM_Core_Payment_FapsACH' == CRM_Utils_System::getClassName($this)) {
+      return FALSE;
+    }
+    elseif (FALSE == $this->getSettings('enable_'.$action)) {
+      // disable self-service action if the admin has not allowed it
+      return FALSE;
+    }
+    return TRUE;
+  }
+
   /**
    * The first payment date is configurable when setting up back office recurring payments.
    * For iATSPayments, this is also true for front-end recurring payments.
@@ -190,11 +229,32 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
    */
   public function supportsFutureRecurStartDate() {
     return TRUE;
-  } 
+  }
+
+  /* We override the default behaviour of allowing self-service editing of recurring contributions
+   * to use the allowSelfService() function that tests for the iATS configuration setting
+
+   * @return bool
+   */
+
+  public function supportsUpdateSubscriptionBillingInfo() {
+    return $this->allowSelfService('update_subscription_billing_info');
+  }
+
+  public function supportsEditRecurringContribution() {
+    return $this->allowSelfService('change_subscription_amount');
+  }
 
+  public function supportsChangeSubscriptionAmount() {
+    return $this->allowSelfService('change_subscription_amount');
+  }
+
+  public function supportsCancelRecurring() {
+    return $this->allowSelfService('cancel_recurring');
+  }
 
   /**
-   * function doDirectPayment
+   * function doPayment
    *
    * This is the function for taking a payment using a core payment form of any kind.
    *
@@ -202,12 +262,12 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
    * needs to be configured for use with the vault. The cryptogram iframe is created before
    * I know whether the contribution will be recurring or not, so that forces me to always
    * use the vault, if recurring is an option.
-   * 
+   *
    * So: the best we can do is to avoid the use of the vault if I'm not using the cryptogram, or if I'm on a page that
    * doesn't offer recurring contributions.
    */
-  public function doDirectPayment(&$params) {
-    // CRM_Core_Error::debug_var('doDirectPayment params', $params);
+  public function doPayment(&$params, $component = 'contribute') {
+    // CRM_Core_Error::debug_var('doPayment params', $params);
 
     // Check for valid currency [todo: we have C$ support, but how do we check,
     // or should we?]
@@ -255,7 +315,7 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
         'test' => $this->is_test,
       );
       $vault_request = new CRM_Iats_FapsRequest($options);
-      // auto-generate a compliant vault key  
+      // auto-generate a compliant vault key
       $vault_key = self::generateVaultKey($request['ownerEmail']);
       $request['vaultKey'] = $vault_key;
       $request['ipAddress'] = $ipAddress;
@@ -355,7 +415,6 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
       // For versions >= 4.6.6, the proper key.
       $params['payment_status_id'] = 1;
       $params['trxn_id'] = trim($result['data']['referenceNumber']).':'.time();
-      $params['gross_amount'] = $params['amount'];
       return $params;
     }
     else {
@@ -363,19 +422,6 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
     }
   }
 
-  /**
-   * Todo?
-   *
-   * @param array $params name value pair of contribution data
-   *
-   * @return void
-   * @access public
-   *
-   */
-  function doTransferCheckout( &$params, $component ) {
-    CRM_Core_Error::fatal(ts('This function is not implemented'));
-  }
-
   /**
    * Support corresponding CiviCRM method
    */
@@ -425,6 +471,34 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
    * @return array
    */
   protected function convertParams($params, $method) {
+    if (empty($params['country']) && !empty($params['country_id'])) {
+      try {
+        $result = civicrm_api3('Country', 'get', [
+          'sequential' => 1,
+          'return' => ['name'],
+	  'id' => $params['country_id'],
+          'options' => ['limit' => 1],
+        ]);
+	$params['country'] = $result['values'][0]['name'];
+      }
+      catch (CiviCRM_API3_Exception $e) {
+        Civi::log()->info('Unexpected error from api3 looking up countries/states/provinces');
+      }
+    }
+    if (empty($params['state_province']) && !empty($params['state_province_id'])) {
+      try {
+        $result = civicrm_api3('StateProvince', 'get', [
+          'sequential' => 1,
+          'return' => ['name'],
+	  'id' => $params['state_province_id'],
+          'options' => ['limit' => 1],
+        ]);
+	$params['state_province'] = $result['values'][0]['name'];
+      }
+      catch (CiviCRM_API3_Exception $e) {
+        Civi::log()->info('Unexpected error from api3 looking up countries/states/provinces');
+      }
+    }
     $request = array();
     $convert = array(
       'ownerEmail' => 'email',
@@ -472,18 +546,12 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
    *
    */
   public function &error($error = NULL) {
-    $e = CRM_Core_Error::singleton();
+    $error_code = 'process_1stpay';
     if (is_object($error)) {
-      $e->push($error->getResponseCode(),
-        0, NULL,
-        $error->getMessage()
-      );
+      throw new PaymentProcessorException(ts('Error %1', [1 => $error->getMessage()]), $error_code);
     }
     elseif ($error && is_numeric($error)) {
-      $e->push($error,
-        0, NULL,
-        $this->errorString($error)
-      );
+      throw new PaymentProcessorException(ts('Error %1', [1 => $this->errorString($error)]), $error_code);
     }
     elseif (is_array($error)) {
       $errors = array();
@@ -496,15 +564,13 @@ class CRM_Core_Payment_Faps extends CRM_Core_Payment {
         foreach($error['validationFailures'] as $message) {
           $errors[] = 'Validation failure for '.$message['key'].': '.$message['message'];
         }
+        $error_code = 'process_1stpay_validation';
       }
-      $error_string = implode('<br />',$errors);
-      $e->push(9002,
-        0, NULL,
-        $error_string
-      );
+      $error_string = implode("\n",$errors);
+      throw new PaymentProcessorException(ts('Error: %1', [1 => $error_string]), $error_code);
     }
-    else {
-      $e->push(9001, 0, NULL, "Unknown System Error.");
+    else { /* in the event I'm handling an unexpected argument */
+      throw new PaymentProcessorException(ts('Unknown System Error.'), 'process_1stpay_extension');
     }
     return $e;
   }
diff --git a/civicrm/ext/iatspayments/CRM/Core/Payment/FapsACH.php b/civicrm/ext/iatspayments/CRM/Core/Payment/FapsACH.php
index 49960c5bd292ba644c39f2a572c95a093e54a2ac..ebb1bec2fefcb1623ff81163c80d1808563c5b05 100644
--- a/civicrm/ext/iatspayments/CRM/Core/Payment/FapsACH.php
+++ b/civicrm/ext/iatspayments/CRM/Core/Payment/FapsACH.php
@@ -1,6 +1,28 @@
 <?php
 
-require_once 'CRM/Core/Payment.php';
+/**
+ * @file
+ * Copyright iATS Payments (c) 2020.
+ * @author Alan Dixon
+ *
+ * This file is a part of CiviCRM published extension.
+ *
+ * This extension is free software; you can copy, modify, and distribute it
+ * under the terms of the GNU Affero General Public License
+ * Version 3, 19 November 2007.
+ *
+ * It is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License with this program; if not, see http://www.gnu.org/licenses/
+ *
+ * This code provides glue between CiviCRM payment model and the payment model encapsulated in the CRM\Iats\FapsRequest object
+ */
+
+use Civi\Payment\Exception\PaymentProcessorException;
 
 class CRM_Core_Payment_FapsACH extends CRM_Core_Payment_Faps {
 
@@ -14,9 +36,8 @@ class CRM_Core_Payment_FapsACH extends CRM_Core_Payment_Faps {
   function __construct( $mode, &$paymentProcessor ) {
     $this->_mode             = $mode;
     $this->_paymentProcessor = $paymentProcessor;
-    $this->_processorName    = ts('iATS Payments 1st American Payment System Interface, ACH');
     $this->disable_cryptogram    = iats_get_setting('disable_cryptogram');
-    $this->is_test = ($this->_mode == 'test' ? 1 : 0); 
+    $this->is_test = ($this->_mode == 'test' ? 1 : 0);
   }
 
   /**
@@ -68,7 +89,7 @@ class CRM_Core_Payment_FapsACH extends CRM_Core_Payment_Faps {
     ];
     $resources = CRM_Core_Resources::singleton();
     $cryptoCss = $resources->getUrl('com.iatspayments.civicrm', 'css/crypto.css');
-    $markup = '<link type="text/css" rel="stylesheet" href="'.$cryptoCss.'" media="all" /><script type="text/javascript" src="'.$cryptojs.'"></script>';
+    $markup = '<link type="text/css" rel="stylesheet" href="'.$cryptoCss.'" media="all" />'; // <script type="text/javascript" src="'.$cryptojs.'"></script>';
     CRM_Core_Region::instance('billing-block')->add(array(
       'markup' => $markup,
     ));
@@ -83,11 +104,11 @@ class CRM_Core_Payment_FapsACH extends CRM_Core_Payment_Faps {
     ));
     // and now add in a helpful cheque image and description
     switch($currency) {
-      case 'USD': 
+      case 'USD':
         CRM_Core_Region::instance('billing-block')->add(array(
           'template' => 'CRM/Iats/BillingBlockFapsACH_USD.tpl',
         ));
-      case 'CAD': 
+      case 'CAD':
         CRM_Core_Region::instance('billing-block')->add(array(
           'template' => 'CRM/Iats/BillingBlockFapsACH_CAD.tpl',
         ));
@@ -97,13 +118,13 @@ class CRM_Core_Payment_FapsACH extends CRM_Core_Payment_Faps {
 
 
   /**
-   * function doDirectPayment
+   * function doPayment
    *
    * This is the function for taking a payment using a core payment form of any kind.
    *
    */
-  public function doDirectPayment(&$params) {
-    // CRM_Core_Error::debug_var('doDirectPayment params', $params);
+  public function doPayment(&$params, $component = 'contribute') {
+    // CRM_Core_Error::debug_var('doPayment params', $params);
 
     // Check for valid currency
     $currency = $params['currencyID'];
@@ -130,7 +151,7 @@ class CRM_Core_Payment_FapsACH extends CRM_Core_Payment_Faps {
       );
       $vault_request = new CRM_Iats_FapsRequest($options);
       $request = $this->convertParams($params, $options['action']);
-      // auto-generate a compliant vault key  
+      // auto-generate a compliant vault key
       $vault_key = self::generateVaultKey($request['ownerEmail']);
       $request['vaultKey'] = $vault_key;
       $request['ipAddress'] = $ipAddress;
@@ -195,7 +216,6 @@ class CRM_Core_Payment_FapsACH extends CRM_Core_Payment_Faps {
     if ($success) {
       $params['payment_status_id'] = 2;
       $params['trxn_id'] = trim($result['data']['referenceNumber']).':'.time();
-      $params['gross_amount'] = $params['amount'];
       // Core assumes that a pending result will have no transaction id, but we have a useful one.
       if (!empty($params['contributionID'])) {
         $contribution_update = array('id' => $params['contributionID'], 'trxn_id' => $params['trxn_id']);
@@ -216,7 +236,7 @@ class CRM_Core_Payment_FapsACH extends CRM_Core_Payment_Faps {
   }
 
   /**
-   * Get the category text. 
+   * Get the category text.
    * Before I return it, check that the category text exists, and create it if
    * it doesn't.
    *
@@ -236,7 +256,7 @@ class CRM_Core_Payment_FapsACH extends CRM_Core_Payment_Faps {
     static $ach_category_text_saved;
     if (!empty($ach_category_text_saved)) {
       return $ach_category_text_saved;
-    } 
+    }
     $ach_category_text = iats_get_setting('ach_category_text');
     $ach_category_text = empty($ach_category_text) ? FAPS_DEFAULT_ACH_CATEGORY_TEXT : $ach_category_text;
     $ach_category_exists = FALSE;
diff --git a/civicrm/ext/iatspayments/CRM/Core/Payment/iATSService.php b/civicrm/ext/iatspayments/CRM/Core/Payment/iATSService.php
index 432467df74e7f61bae28eee229abd499b635fffb..d1f00660e62ea29856061fbf3f8ed491174919fe 100644
--- a/civicrm/ext/iatspayments/CRM/Core/Payment/iATSService.php
+++ b/civicrm/ext/iatspayments/CRM/Core/Payment/iATSService.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * @file Copyright iATS Payments (c) 2014.
+ * @file Copyright iATS Payments (c) 2020.
  * @author Alan Dixon
  *
  * This file is a part of CiviCRM published extension.
@@ -21,6 +21,8 @@
  * This code provides glue between CiviCRM payment model and the iATS Payment model encapsulated in the CRM_Iats_iATSServiceRequest object
  */
 
+use Civi\Payment\Exception\PaymentProcessorException;
+
 /**
  *
  */
@@ -45,7 +47,6 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
    */
   public function __construct($mode, &$paymentProcessor, &$paymentForm = NULL, $force = FALSE) {
     $this->_paymentProcessor = $paymentProcessor;
-    $this->_processorName = ts('iATS Payments');
 
     // Get merchant data from config.
     $config = CRM_Core_Config::singleton();
@@ -113,6 +114,24 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
     return method_exists(CRM_Utils_System::getClassName($this), $method);
   }
 
+  /**
+   * Internal function to determine if I'm supporting self-service functions
+   *
+   * @return bool
+   */
+  protected function allowSelfService($action) {
+    if ('CRM_Core_Payment_iATSServiceACHEFT' == CRM_Utils_System::getClassName($this)) {
+      return FALSE;
+    }
+    elseif (!CRM_Core_Permission::check('access CiviContribution')) {
+      // disable self-service 'action' if the admin has not allowed it
+      if (FALSE == $this->getSettings('enable_'.$action)) {
+	return FALSE;
+      }
+    }
+    return TRUE;
+  }
+
   /**
    * The first payment date is configurable when setting up back office recurring payments.
    * For iATSPayments, this is also true for front-end recurring payments.
@@ -121,12 +140,34 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
    */
   public function supportsFutureRecurStartDate() {
     return TRUE;
-  } 
+  }
+
+  /* We override the default behaviour of allowing self-service editing of recurring contributions
+   * to use the allowSelfService() function that tests for the iATS configuration setting
+   *
+   * @return bool
+   */
+
+  public function supportsUpdateSubscriptionBillingInfo() {
+    return $this->allowSelfService('update_subscription_billing_info');
+  }
+
+  public function supportsEditRecurringContribution() {
+    return $this->allowSelfService('change_subscription_amount');
+  }
+
+  public function supportsChangeSubscriptionAmount() {
+    return $this->allowSelfService('change_subscription_amount');
+  }
+
+  public function supportsCancelRecurring() {
+    return $this->allowSelfService('cancel_recurring');
+  }
 
   /**
    *
    */
-  public function doDirectPayment(&$params) {
+  public function doPayment(&$params, $component = 'contribute') {
 
     if (!$this->_profile) {
       return self::error('Unexpected error, missing profile');
@@ -154,7 +195,6 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
         // Success.
         $params['payment_status_id'] = 1;
         $params['trxn_id'] = trim($result['remote_id']) . ':' . time();
-        $params['gross_amount'] = $params['amount'];
         return $params;
       }
       else {
@@ -214,7 +254,6 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
         $today = date('Ymd');
         // If the receive_date is NOT today, then
         // create a pending contribution and adjust the next scheduled date.
-        CRM_Core_Error::debug_var('receive_date', $receieve_date);
         if ($receive_date !== $today) {
           // I've got a schedule to adhere to!
           // set the receieve time to 3:00 am for a better admin experience
@@ -240,11 +279,10 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
           $response = $iats->request($credentials, $request);
           $result = $iats->result($response);
           if ($result['status']) {
-            // Add a time string to iATS short authentication string to ensure 
+            // Add a time string to iATS short authentication string to ensure
             // uniqueness and provide helpful referencing.
             $update = array(
               'trxn_id' => trim($result['remote_id']) . ':' . time(),
-              'gross_amount' => $params['amount'],
               'payment_status_id' => 1,
             );
             // do some cleanups to the recurring record in updateRecurring
@@ -285,7 +323,7 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
   /**
    * Set additional fields when editing the schedule.
    *
-   * Note: this doesn't completely replace the form hook, which is still 
+   * Note: this doesn't completely replace the form hook, which is still
    * in use for additional changes, and to support 4.6.
    * e.g. the commented out fields below don't work properly here.
    */
@@ -310,29 +348,18 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
    *
    */
   public function &error($error = NULL) {
-    $e = CRM_Core_Error::singleton();
     if (is_object($error)) {
-      $e->push($error->getResponseCode(),
-        0, NULL,
-        $error->getMessage()
-      );
+      throw new PaymentProcessorException(ts('Error %1', [1 => $error->getMessage()]));
     }
     elseif ($error && is_numeric($error)) {
-      $e->push($error,
-        0, NULL,
-        $this->errorString($error)
-      );
+      throw new PaymentProcessorException(ts('Error %1', [1 => $this->errorString($error)]));
     }
     elseif (is_string($error)) {
-      $e->push(9002,
-        0, NULL,
-        $error
-      );
+      throw new PaymentProcessorException(ts('Error %1', [1 => $error]));
     }
     else {
-      $e->push(9001, 0, NULL, "Unknown System Error.");
+      throw new PaymentProcessorException(ts('Unknown System Error.', 9001));
     }
-    return $e;
   }
 
   /**
@@ -438,8 +465,8 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
     if (empty($params['crid'])) {
       $params['crid'] = !empty($_POST['crid']) ? (int) $_POST['crid'] : (!empty($_GET['crid']) ? (int) $_GET['crid'] : 0);
       if (empty($params['crid']) && !empty($params['entryURL'])) {
-        $components = parse_url($params['entryURL']); 
-        parse_str(html_entity_decode($components['query']), $entryURLquery); 
+        $components = parse_url($params['entryURL']);
+        parse_str(html_entity_decode($components['query']), $entryURLquery);
         $params['crid'] = $entryURLquery['crid'];
       }
     }
@@ -448,7 +475,7 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
     if (empty($crid)) {
       $alert = ts('This system is unable to perform self-service updates to credit cards. Please contact the administrator of this site.');
       throw new Exception($alert);
-    } 
+    }
     $mop = array(
       'Visa' => 'VISA',
       'MasterCard' => 'MC',
@@ -472,6 +499,13 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
       'mop' => $mop[$params['credit_card_type']],
     );
 
+    // IATS-323
+    $submit_values['updateCreditCardNum'] = (0 < strlen($submit_values['creditCardNum']) && (FALSE === strpos($params['creditCardNum'], '*'))) ? 1 : 0;
+    if (empty($submit_values['updateCreditCardNum'])) {
+      unset($submit_values['creditCardNum']);
+      unset($submit_values['updateCreditCardNum']);
+    }
+
     $credentials = CRM_Iats_iATSServiceRequest::credentials($contribution_recur['payment_processor_id'], 0);
     $iats_service_params = array('type' => 'customer', 'iats_domain' => $credentials['domain'], 'method' => 'update_credit_card_customer');
     $iats = new CRM_Iats_iATSServiceRequest($iats_service_params);
@@ -502,12 +536,12 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
       }
       return $this->error('9002','Authorization failed');
     }
-    catch (Exception $error) { // what could go wrong? 
+    catch (Exception $error) { // what could go wrong?
       $message = $error->getMessage();
       return $this->error('9002', $message);
     }
   }
-  
+
   /*
    * Update the recurring contribution record.
    *
@@ -521,7 +555,7 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
   protected function updateRecurring($params, $update) {
     // If the recurring record already exists, let's fix the next contribution and start dates,
     // in case core isn't paying attention.
-    // We also set the schedule to 'in-progress' (even for ACH/EFT when the first one hasn't been verified), 
+    // We also set the schedule to 'in-progress' (even for ACH/EFT when the first one hasn't been verified),
     // because we want the recurring job to run for this schedule.
     if (!empty($params['contributionRecurID'])) {
       $recur_id = $params['contributionRecurID'];
@@ -533,6 +567,13 @@ class CRM_Core_Payment_iATSService extends CRM_Core_Payment {
       // By default, it's empty, unless we've got a future start date.
       if (empty($update['receive_date'])) {
         $next = strtotime('+' . $params['frequency_interval'] . ' ' . $params['frequency_unit']);
+        // handle the special case of monthly contributions made after the 28th
+        if ('month' == $params['frequency_unit']) {
+          $now = getdate();
+          if ($now['mday'] > 28) { // pull it back to the 28th
+            $next = $next - (($now['mday'] - 28) * 24 * 60 * 60);
+          }
+        }
         $recur_update['next_sched_contribution_date'] = date('Ymd', $next) . '030000';
       }
       else {
diff --git a/civicrm/ext/iatspayments/CRM/Core/Payment/iATSServiceACHEFT.php b/civicrm/ext/iatspayments/CRM/Core/Payment/iATSServiceACHEFT.php
index 09ae7b50a0560ab2e514067d06e7b236b8904b9c..fb15c4539103cd1a2495aacdb3fd9f1ab5da2916 100644
--- a/civicrm/ext/iatspayments/CRM/Core/Payment/iATSServiceACHEFT.php
+++ b/civicrm/ext/iatspayments/CRM/Core/Payment/iATSServiceACHEFT.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Copyright iATS Payments (c) 2014.
+ * Copyright iATS Payments (c) 2020.
  * @author Alan Dixon
  *
  * This file is a part of CiviCRM published extension.
@@ -22,6 +22,8 @@
  * This code provides glue between CiviCRM payment model and the iATS Payment model encapsulated in the CRM_Iats_iATSServiceRequest object
  */
 
+use Civi\Payment\Exception\PaymentProcessorException;
+
 /**
  *
  */
@@ -45,7 +47,6 @@ class CRM_Core_Payment_iATSServiceACHEFT extends CRM_Core_Payment_iATSService {
    */
   public function __construct($mode, &$paymentProcessor) {
     $this->_paymentProcessor = $paymentProcessor;
-    $this->_processorName = ts('iATS Payments ACHEFT');
 
     // Live or test.
     $this->_profile['mode'] = $mode;
@@ -113,7 +114,7 @@ class CRM_Core_Payment_iATSServiceACHEFT extends CRM_Core_Payment_iATSService {
    * @throws \Civi\Payment\Exception\PaymentProcessorException
    */
   public function buildForm(&$form) {
-    // If a form allows ACH/EFT and enables recurring, set recurring to the default. 
+    // If a form allows ACH/EFT and enables recurring, set recurring to the default.
     if (isset($form->_elementIndex['is_recur'])) {
       // Make recurring contrib default to true.
       $form->setDefaults(array('is_recur' => 1));
@@ -161,7 +162,7 @@ class CRM_Core_Payment_iATSServiceACHEFT extends CRM_Core_Payment_iATSService {
       'template' => 'CRM/Iats/BillingBlockDirectDebitExtra_USD.tpl',
     ));
   }
-  
+
   /**
    * Customization for CAD ACH-EFT billing block.
    *
@@ -200,7 +201,7 @@ class CRM_Core_Payment_iATSServiceACHEFT extends CRM_Core_Payment_iATSService {
   /**
    *
    */
-  public function doDirectPayment(&$params) {
+  public function doPayment(&$params, $component = 'contribute') {
 
     if (!$this->_profile) {
       return self::error('Unexpected error, missing profile');
@@ -225,7 +226,6 @@ class CRM_Core_Payment_iATSServiceACHEFT extends CRM_Core_Payment_iATSService {
       if ($result['status']) {
         $params['payment_status_id'] = 2;
         $params['trxn_id'] = trim($result['remote_id']) . ':' . time();
-        $params['gross_amount'] = $params['amount'];
         // Core assumes that a pending result will have no transaction id, but we have a useful one.
         if (!empty($params['contributionID'])) {
           $contribution_update = array('id' => $params['contributionID'], 'trxn_id' => $params['trxn_id']);
@@ -324,10 +324,9 @@ class CRM_Core_Payment_iATSServiceACHEFT extends CRM_Core_Payment_iATSService {
             // Add a time string to iATS short authentication string to ensure uniqueness and provide helpful referencing.
             $update = array(
               'trxn_id' => trim($result['remote_id']) . ':' . time(),
-              'gross_amount' => $params['amount'],
               'payment_status_id' => 2,
             );
-            // Setting the next_sched_contribution_date param doesn't do anything, 
+            // Setting the next_sched_contribution_date param doesn't do anything,
             // work around in updateRecurring
             $this->updateRecurring($params, $update);
             $params = array_merge($params, $update);
@@ -376,32 +375,22 @@ class CRM_Core_Payment_iATSServiceACHEFT extends CRM_Core_Payment_iATSService {
    *
    */
   public function &error($error = NULL) {
-    $e = CRM_Core_Error::singleton();
     if (is_object($error)) {
-      $e->push($error->getResponseCode(),
-        0, NULL,
-        $error->getMessage()
-      );
+      throw new PaymentProcessorException(ts('Error %1', [1 => $error->getMessage()]));
     }
     elseif ($error && is_numeric($error)) {
-      $e->push($error,
-        0, NULL,
-        $this->errorString($error)
-      );
+      throw new PaymentProcessorException(ts('Error %1', [1 => $this->errorString($error)]));
     }
     elseif (is_string($error)) {
-      $e->push(9002,
-        0, NULL,
-        $error
-      );
+      throw new PaymentProcessorException(ts('Error %1', [1 => $error]));
     }
     else {
-      $e->push(9001, 0, NULL, "Unknown System Error.");
+      throw new PaymentProcessorException(ts('Unknown System Error.', 9001));
     }
     return $e;
   }
 
- /** 
+ /**
    * Are back office payments supported.
    *
    * @return bool
@@ -409,7 +398,7 @@ class CRM_Core_Payment_iATSServiceACHEFT extends CRM_Core_Payment_iATSService {
   protected function supportsBackOffice() {
     return TRUE;
   }
-    
+
  /**
    * This function checks to see if we have the right config values.
    *
diff --git a/civicrm/ext/iatspayments/CRM/Core/Payment/iATSServiceSWIPE.php b/civicrm/ext/iatspayments/CRM/Core/Payment/iATSServiceSWIPE.php
index af808cdb385d2f3a10efc0bdfcb344a9b79b97d8..451b7481ebb67d2c96bc2f179614bb2d1f6bee10 100644
--- a/civicrm/ext/iatspayments/CRM/Core/Payment/iATSServiceSWIPE.php
+++ b/civicrm/ext/iatspayments/CRM/Core/Payment/iATSServiceSWIPE.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * @file Copyright iATS Payments (c) 2014.
+ * @file Copyright iATS Payments (c) 2020.
  * @author Alan Dixon
  *
  * This file is a part of CiviCRM published extension.
@@ -21,6 +21,8 @@
  * This code provides glue between CiviCRM payment model and the iATS Payment model encapsulated in the CRM_Iats_iATSServiceRequest object
  */
 
+use Civi\Payment\Exception\PaymentProcessorException;
+
 /**
  *
  */
@@ -45,7 +47,6 @@ class CRM_Core_Payment_iATSServiceSWIPE extends CRM_Core_Payment_iATSService {
    */
   public function __construct($mode, &$paymentProcessor) {
     $this->_paymentProcessor = $paymentProcessor;
-    $this->_processorName = ts('iATS Payments SWIPE');
 
     // Get merchant data from config.
     $config = CRM_Core_Config::singleton();
diff --git a/civicrm/ext/iatspayments/CRM/Iats/Form/IATSOneTimeCharge.php b/civicrm/ext/iatspayments/CRM/Iats/Form/IATSOneTimeCharge.php
index 8e0eab8ad3c18b90327723a2a317db792aca1105..1ae8d47afe46abcef532b76116b2f757933673b4 100644
--- a/civicrm/ext/iatspayments/CRM/Iats/Form/IATSOneTimeCharge.php
+++ b/civicrm/ext/iatspayments/CRM/Iats/Form/IATSOneTimeCharge.php
@@ -87,7 +87,10 @@ class CRM_Iats_Form_IATSOneTimeCharge extends CRM_Core_Form {
     // Generate another (possibly) recurring contribution, matching our recurring template with submitted value.
     $is_recurrence = !empty($values['is_recurrence']);
     $total_amount = $values['amount'];
-    $contribution_template = CRM_Iats_Transaction::getContributionTemplate(array('contribution_recur_id' => $values['crid']));
+    $contribution_recur_id = $values['crid'];
+    $is_test = $values['is_test'];
+    $contribution_template = CRM_Iats_Transaction::getContributionTemplate(['contribution_recur_id' => $contribution_recur_id, 'is_test' => $is_test]);
+    // CRM_Core_Error::debug_var('Contribution Template', $contribution_template);
     $contact_id = $values['cid'];
     $hash = md5(uniqid(rand(), TRUE));
     $contribution_recur_id    = $values['crid'];
@@ -143,7 +146,7 @@ class CRM_Iats_Form_IATSOneTimeCharge extends CRM_Core_Form {
       throw new Exception($error);
     }
     try {
-      $paymentProcessor = civicrm_api3('PaymentProcessor', 'getsingle', array('id' => 3)); 
+      $paymentProcessor = civicrm_api3('PaymentProcessor', 'getsingle', array('id' => $payment_processor_id)); 
     }
     catch (Exception $e) {
       $error = E::ts('Unexpected error getting payment processor information for recurring schedule id %1', array(1 => $contribution_recur_id));
@@ -154,6 +157,7 @@ class CRM_Iats_Form_IATSOneTimeCharge extends CRM_Core_Form {
       $error = E::ts('Unexpected error transacting one-time payment for schedule id %1', array(1 => $contribution_recur_id));
       throw new Exception($error);
     }
+    // CRM_Core_Error::debug_var('Contribution', $contribution);
     $result = CRM_Iats_Transaction::process_contribution_payment($contribution, $paymentProcessor, $payment_token);
     return $result;
   }
diff --git a/civicrm/ext/iatspayments/CRM/Iats/Form/Settings.php b/civicrm/ext/iatspayments/CRM/Iats/Form/Settings.php
index f46a9bd23189dadcf5577e78db0f185fdc733386..ff46b3bfb6bb539cf4ca45224ce229fbcd6e9c12 100644
--- a/civicrm/ext/iatspayments/CRM/Iats/Form/Settings.php
+++ b/civicrm/ext/iatspayments/CRM/Iats/Form/Settings.php
@@ -55,6 +55,18 @@ class CRM_Iats_Form_Settings extends CRM_Core_Form {
       ts('Enable self-service updates to recurring contribution Contact Billing Info.')
     );
 
+    $this->add(
+      'checkbox',
+      'enable_change_subscription_amount',
+      ts('Allow self-service updates to recurring contribution amount.')
+    );
+
+    $this->add(
+      'checkbox',
+      'enable_cancel_recurring',
+      ts('Enable self-service cancellation of a recurring contribution.')
+    );
+
     /* These checkboxes are not yet implemented, ignore for now
     $this->add(
       'checkbox', // field type
diff --git a/civicrm/ext/iatspayments/CRM/Iats/Transaction.php b/civicrm/ext/iatspayments/CRM/Iats/Transaction.php
index 1dc28981bad7f76f5eefa2ea456a830efd3ec1ce..19f49e2744bbc5d453790d3b33218cd334c10f94 100644
--- a/civicrm/ext/iatspayments/CRM/Iats/Transaction.php
+++ b/civicrm/ext/iatspayments/CRM/Iats/Transaction.php
@@ -18,11 +18,14 @@ class CRM_Iats_Transaction {
    */
   static function getContributionTemplate($contribution) {
     // Get the most recent contribution in this series that matches the same total_amount, if present.
-    $template = array();
-    $get = ['contribution_recur_id' => $contribution['contribution_recur_id'], 'options' => ['sort' => ' id DESC', 'limit' => 1]];
-    if (!empty($contribution['total_amount'])) {
-      $get['total_amount'] = $contribution['total_amount'];
+    $template = [];
+    $get = ['options' => ['sort' => ' id DESC', 'limit' => 1]];
+    foreach (['contribution_recur_id', 'total_amount', 'is_test'] as $key) {
+      if (!empty($contribution[$key])) {
+        $get[$key] = $contribution[$key];
+      }
     }
+    // CRM_Core_Error::debug_var('Contribution', $get);
     $result = civicrm_api3('contribution', 'get', $get);
     if (!empty($result['values'])) {
       $template = reset($result['values']);
@@ -358,9 +361,10 @@ class CRM_Iats_Transaction {
         // Process the soap response into a readable result.
         $result['result'] = $iats->result($response);
         $result['success'] = !empty($result['result']['status']);
+        $result['auth_code'] = $result['result']['auth_result'];
         if ($result['success']) {
           $result['trxn_id'] = trim($result['result']['remote_id']) . ':' . time();
-          $result['message'] = $result['auth_code'] = $result['result']['auth_result'];
+          $result['message'] = $result['auth_code'];
         }
         else {
           $result['message'] = $result['result']['reasonMessage'];
diff --git a/civicrm/ext/iatspayments/CRM/Iats/iATSServiceRequest.php b/civicrm/ext/iatspayments/CRM/Iats/iATSServiceRequest.php
index 3b61d73b5ca9716d002a5dc58def46b4847c7fbb..7359eea12ca0ae6b9d2feeb3759b4fa17833eca8 100644
--- a/civicrm/ext/iatspayments/CRM/Iats/iATSServiceRequest.php
+++ b/civicrm/ext/iatspayments/CRM/Iats/iATSServiceRequest.php
@@ -220,17 +220,20 @@ class CRM_Iats_iATSServiceRequest {
       }
     }
     catch (SoapFault $exception) {
-      // always log soap faults to the CiviCRM error log
-      CRM_Core_Error::debug_var('SoapFault Exception', $exception);
+      // always log soap fault codes to the CiviCRM error log
       CRM_Core_Error::debug_var('SoapFault Code',$exception->faultcode);
       CRM_Core_Error::debug_var('SoapFault String',$exception->faultstring);
-      if (!empty($this->options['debug']) && !empty($soapClient)) {
-        $response_log = "\n HEADER:\n";
-        $response_log .= $soapClient->__getLastResponseHeaders();
-        $response_log .= "\n BODY:\n";
-        $response_log .= $soapClient->__getLastResponse();
-        $response_log .= "\n BODYEND:\n";
-        CRM_Core_Error::debug_var('Raw Response', $response_log);
+      // extra logging if debugging
+      if (!empty($this->options['debug'])) {
+        CRM_Core_Error::debug_var('SoapFault Exception', $exception);
+        if (!empty($soapClient)) {
+          $response_log = "\n HEADER:\n";
+          $response_log .= $soapClient->__getLastResponseHeaders();
+          $response_log .= "\n BODY:\n";
+          $response_log .= $soapClient->__getLastResponse();
+          $response_log .= "\n BODYEND:\n";
+          CRM_Core_Error::debug_var('Raw Response', $response_log);
+        }
       }
       return FALSE;
     }
diff --git a/civicrm/ext/iatspayments/README.md b/civicrm/ext/iatspayments/README.md
index 1573668c1a744fd6599f33bbc08c5674225270fa..59ceb53034698ada6bf954f25176167e033393df 100644
--- a/civicrm/ext/iatspayments/README.md
+++ b/civicrm/ext/iatspayments/README.md
@@ -95,7 +95,7 @@ The notes below were written for the legacy processor, 1stPay testing notes stil
 
 Once you're happy all is well - then all you need to do is update the Payment Processor data - with your own iATS' Agent Code and Password.
 
-Remember that iATS master accounts (ending in 01) can typically NOT be used to push monies into via web services. So when setting up your Account with iATS - ask them to create another (set of) Agent Codes for you: e.g. 80 or 90, etc.
+'legacy' iATS master accounts (ending in 01) can typically NOT be used to push monies into via web services. So when setting up your Account with iATS - ask them to create another (set of) Agent Codes for you: e.g. 80, 81, etc.
 
 Also remember to turn off debugging/logging on any production environment!
 
@@ -109,7 +109,7 @@ Some issues may be related to core CiviCRM issues, and may not have an immediate
 
 Below is a list of some of the most common issues:
 
-9002 Error - if you get this when trying to make a contribution, then you're getting that error back from the iATS server due to an account misconfiguration. One source is due to some special characters in your passwd.
+9002 Error - if you get this when trying to make a contribution, then you're getting that error back from the iATS server due to an account misconfiguration. When this happens and your using a 'legacy' iATS account -> check if you have special characters in your password (and remove them). If you're using '1st Pay' contact iATS Customer Service to ensure your account is configured properly.
 
 CiviCRM core assigns Membership status (=new) and extends Membership End date as well as Event status (=registered) as soon as ACH/EFT is submitted (so while payment is still pending - this could be several days for ACH/EFT). If the contribution receives a Ok:BankAccept -> the extension will mark the contribution in CiviCRM as completed. If the contribution does NOT receive a Ok:BankAccept -> the extension will mark the contribution in CiviCRM as rejected - however - associated existing Membership and Event records may need to be updated manually.
 
diff --git a/civicrm/ext/iatspayments/api/v3/Job/Iatsrecurringcontributions.php b/civicrm/ext/iatspayments/api/v3/Job/Iatsrecurringcontributions.php
index 18548352493a0cb71c39ca2163fb3ddf7cfafc61..632bbe4de9271cc42824861bbc19cf987b2d98fe 100644
--- a/civicrm/ext/iatspayments/api/v3/Job/Iatsrecurringcontributions.php
+++ b/civicrm/ext/iatspayments/api/v3/Job/Iatsrecurringcontributions.php
@@ -117,9 +117,10 @@ function civicrm_api3_job_Iatsrecurringcontributions($params) {
     $contribution_recur_id    = $recurringContribution['id'];
     $contact_id = $recurringContribution['contact_id'];
     $total_amount = $recurringContribution['amount'];
+    $is_test = $recurringContribution['is_test'];
     $payment_processor_id = $recurringContribution['payment_processor_id'];
     // Try to get a contribution template for this contribution series - if none matches (e.g. if a donation amount has been changed), we'll just be naive about it.
-    $contribution_template = CRM_Iats_Transaction::getContributionTemplate(['contribution_recur_id' => $contribution_recur_id, 'total_amount' => $total_amount]);
+    $contribution_template = CRM_Iats_Transaction::getContributionTemplate(['contribution_recur_id' => $contribution_recur_id, 'total_amount' => $total_amount, 'is_test' => $is_test]);
     // CRM_Core_Error::debug_var('Contribution Template', $contribution_template);
     // generate my invoice id like CiviCRM does
     $hash = md5(uniqid(rand(), TRUE));
@@ -166,7 +167,7 @@ function civicrm_api3_job_Iatsrecurringcontributions($params) {
       'contribution_status_id' => 'Pending', /* initialize as pending, so we can run completetransaction after taking the money */
       'currency'  => $recurringContribution['currency'],
       'payment_processor'   => $payment_processor_id,
-      'is_test'        => $recurringContribution['is_test'], /* propagate the is_test value from the recurring record */
+      'is_test'        => $is_test, /* propagate the is_test value from the recurring record */
       'financial_type_id' => $recurringContribution['financial_type_id'],
       'is_email_receipt' => (($receipt_recurring < 2) ? $receipt_recurring : $recurringContribution['is_email_receipt']),
     );
diff --git a/civicrm/ext/iatspayments/iats.php b/civicrm/ext/iatspayments/iats.php
index e7977202516b309132c4c9b9847fede32e4498e9..ee5a60239615b7fc7f0f29ab0dabd339225059a5 100644
--- a/civicrm/ext/iatspayments/iats.php
+++ b/civicrm/ext/iatspayments/iats.php
@@ -345,7 +345,10 @@ function iats_civicrm_buildForm($formName, &$form) {
  */
 
 function iats_civicrm_buildForm_CRM_Financial_Form_Payment(&$form) {
-  // We're on CRM_Financial_Form_Payment, we've got just one payment processor
+  // If form loads with no default processor skip this
+  if (empty($form->_paymentProcessor['id'])) {
+    return;
+  }
   // Skip this if it's not an iATS-type of processor
   $type = _iats_civicrm_is_iats($form->_paymentProcessor['id']);
   if (empty($type)) {
@@ -551,7 +554,7 @@ function _iats_civicrm_is_iats($payment_processor_id) {
   }
   // type is class name with Payment_ stripped from the front
   $type = substr($result['class_name'], 8);
-  $is_iats = (0 == strpos($type, 'iATSService')) || (0 == strpos($type, 'Faps'));
+  $is_iats = (0 === strpos($type, 'iATSService')) || (0 === strpos($type, 'Faps'));
   return ($is_iats ? $type : FALSE);
 }
 
diff --git a/civicrm/ext/iatspayments/info.xml b/civicrm/ext/iatspayments/info.xml
index 6b340eb01cbeddaf1ecae4285e0e9d0e7aa1b7a8..130031efc7b90543a44d8f472170e75c07735c16 100644
--- a/civicrm/ext/iatspayments/info.xml
+++ b/civicrm/ext/iatspayments/info.xml
@@ -9,7 +9,7 @@
     <url desc="Support">https://github.com/iATSPayments/com.iatspayments.civicrm/issues?state=open</url>
     <url desc="Installation Instructions">https://github.com/iATSPayments/com.iatspayments.civicrm</url>
     <url desc="Documentation">https://github.com/iATSPayments/com.iatspayments.civicrm</url>
-    <url desc="Release Notes">https://github.com/iATSPayments/com.iatspayments.civicrm/blob/master/release-notes/1.7.2.md</url>
+    <url desc="Release Notes">https://github.com/iATSPayments/com.iatspayments.civicrm/blob/master/release-notes/1.7.3.md</url>
     <url desc="Getting Started">https://www.semper-it.com/civicamp-iats-payments-slides</url>
   </urls>
   <license>AGPL-3.0</license>
@@ -17,13 +17,13 @@
     <author>Alan Dixon</author>
     <email>iats@blackflysolutions.ca</email>
   </maintainer>
-  <releaseDate>2020-02-27</releaseDate>
-  <version>1.7.2</version>
+  <releaseDate>2020-10-28</releaseDate>
+  <version>1.7.3</version>
   <develStage>stable</develStage>
   <compatibility>
     <ver>5.13</ver>
   </compatibility>
-  <comments>A non-critical but recommended 1.7.x maintenance release, see release notes above for details.</comments>
+  <comments>A recommended 1.7.x maintenance release, see release notes above for details.</comments>
   <civix>
     <namespace>CRM/Iats</namespace>
   </civix>
diff --git a/civicrm/ext/iatspayments/js/dpm.js b/civicrm/ext/iatspayments/js/dpm.js
index 52e1a8cd8c7b134af50da6437fc6d7341b3ce368..ae90102272605d37ef079acf92b9753d16dd4adb 100644
--- a/civicrm/ext/iatspayments/js/dpm.js
+++ b/civicrm/ext/iatspayments/js/dpm.js
@@ -1,9 +1,9 @@
-/* 
- * custom js for direct post method 
+/*
+ * custom js for direct post method
  *
  * Intercept the normal submission of sensitive billing data,
  * submit it in the background via ajax
- * and include the results for parsing by the payment processor doDirectPayment script
+ * and include the results for parsing by the payment processor doPayment script
  * while masking out the credit card information
  */
 
@@ -16,7 +16,7 @@ cj(function ($) {
   // hide fields that are used for error display before validation
   $('#iats-dpm-continue .crm-error').hide();
   /* initiate an ajax submission of the billing dadta: check for required fields, then do a background POST */
-  $('#crm-submit-buttons .crm-button input').click(function( defaultSubmitEvent ) {
+  $('#crm-submit-buttons .crm-button input, #crm-submit-buttons .crm-button button').click(function( defaultSubmitEvent ) {
     var inputButton = $(this);
     inputButton.val('Processing ...').prop('disabled',true);
     // reset the list of errors
@@ -52,13 +52,13 @@ cj(function ($) {
       dpmPOST.IATS_DPM_ZipCode = $('input[name|="billing_postal_code"]').val();
       dpmPOST.IATS_DPM_Country = $('select[name|="billing_country_id"]').find('selected').text();
       dpmPOST.IATS_DPM_Email = $('input[name|="email"]').val();
-      
+
       dpmPOST.IATS_DPM_AccountNumber = $('#credit_card_number').val();
       var Month = $('#credit_card_exp_date_M').val();
       var Year = $('#credit_card_exp_date_Y').val();
       dpmPOST.IATS_DPM_ExpiryDate = Month+'/'+Year.substr(2);
       dpmPOST.IATS_DPM_CVV2 = $('#cvv2').val();
-      // todo: translate mop values 
+      // todo: translate mop values
       dpmPOST.IATS_DPM_MOP = $('#credit_card_type').val();
       dpmPOST.IATS_DPM_Amount = $('.contribution_amount-section input:checked').prop('data-amount');
       console.log(dpmPOST);
@@ -67,7 +67,7 @@ cj(function ($) {
         type: 'POST',
         url: dpmURL,
         data: dpmPOST,
-        dataType: 'json', 
+        dataType: 'json',
         async: false,
         success: function(result) {
           console.log(result);
diff --git a/civicrm/ext/iatspayments/phpunit.xml.dist b/civicrm/ext/iatspayments/phpunit.xml.dist
index 91371453382a8ce8ac0a1719f1dee0bef2ce9d89..754565f4043a2c67445623df6e8adbb29c104272 100644
--- a/civicrm/ext/iatspayments/phpunit.xml.dist
+++ b/civicrm/ext/iatspayments/phpunit.xml.dist
@@ -1,5 +1,5 @@
 <?xml version="1.0"?>
-<phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="false" bootstrap="tests/phpunit/bootstrap.php">
+<phpunit backupGlobals="false" backupStaticAttributes="false" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" bootstrap="tests/phpunit/bootstrap.php">
   <testsuites>
     <testsuite name="iATS Test Suite">
       <directory>./tests/phpunit</directory>
diff --git a/civicrm/ext/iatspayments/release-notes/1.7.3.md b/civicrm/ext/iatspayments/release-notes/1.7.3.md
new file mode 100644
index 0000000000000000000000000000000000000000..a255987014a77acbcb807f73ce2bf3529ed4d573
--- /dev/null
+++ b/civicrm/ext/iatspayments/release-notes/1.7.3.md
@@ -0,0 +1,22 @@
+# iATS CiviCRM Extension 1.7.3
+
+Oct 28, 2020
+
+This release is a minor maintenance release for the 1.7 series.
+It is recommended for all CiviCRM installs on 5.x and above.
+
+Summary of changes:
+1. Removes old deprecated code and improves error handling.
+2. Supports the 1st Payment processor for webform civicrm by converting province and country id values to strings in the doPayment function.
+3. Fixes incorrect code for the detection of the iATS payment processor (arises when mixing iATS payment processor with other processors, likely the source of issue 303).
+4. Fixes failures for self-service updating of credit card credentials (issue 323)).
+5. Removes unused gross_amount parameter.
+6. Fixes a hard-coded payment processor id number, and (separately) a hard-coded payment processor type id.
+7. Implements a collection of recurring self-serve options (update billing info, updating billing amount, cancel). By default, these options are not availble to non-administrators, to preserve the previous behaviour, but can be enabled via the iATS configuration screen.
+8. Provides better behaviour for recurring contributions starting after the 28th of the month (issue 276).
+9. Allow test recurring contributions to generate subsequent payments.
+10. Remove an annoying javascript warning when using FirstPay (issue 326).
+11. Prevent soap errors from exposing credit card credentials (issue 308).
+12. Improve failure handling of ACH recurring contributions (issue 301).
+
+Thanks to @lcdservices, @mattwire, @seamuslee001, @Edzelopez and @cmmadmin for contributions.
diff --git a/civicrm/ext/iatspayments/tests/phpunit/CRM/Iats/ContributionIATSTest.php b/civicrm/ext/iatspayments/tests/phpunit/CRM/Iats/ContributionIATSTest.php
index 6a45578b01d8415ac92adba2e430416003636478..f81d2e57b2bbe13b9d3778895d24b6270fe71798 100644
--- a/civicrm/ext/iatspayments/tests/phpunit/CRM/Iats/ContributionIATSTest.php
+++ b/civicrm/ext/iatspayments/tests/phpunit/CRM/Iats/ContributionIATSTest.php
@@ -227,7 +227,7 @@ class CRM_Iats_ContributioniATSTest extends BaseTestClass {
     $processorParams = array(
       'domain_id' => 1,
       'name' => 'iATS Credit Card - TE4188',
-      'payment_processor_type_id' => 15,
+      'payment_processor_type_id' => 'iATS Payments Credit Card',
       'financial_account_id' => 12,
       'is_test' => FALSE,
       'is_active' => 1,
@@ -257,7 +257,7 @@ class CRM_Iats_ContributioniATSTest extends BaseTestClass {
     $processorParams = array(
       'domain_id' => 1,
       'name' => 'iATS Credit Card - TE4188',
-      'payment_processor_type_id' => 17,
+      'payment_processor_type_id' => 'iATS Payments SWIPE',
       'financial_account_id' => 12,
       'is_test' => FALSE,
       'is_active' => 1,
diff --git a/civicrm/ext/search/CRM/Search/Page/Ang.php b/civicrm/ext/search/CRM/Search/Page/Ang.php
index b6a03e2bbf76d216dfb430ace86f300d39785ff2..3916bb7a890e67aa617dfb762449063c9e6ff022 100644
--- a/civicrm/ext/search/CRM/Search/Page/Ang.php
+++ b/civicrm/ext/search/CRM/Search/Page/Ang.php
@@ -42,6 +42,7 @@ class CRM_Search_Page_Ang extends CRM_Core_Page {
 
     Civi::resources()
       ->addPermissions(['edit groups', 'administer reserved groups'])
+      ->addBundle('bootstrap3')
       ->addVars('search', $vars);
 
     // Load angular module
@@ -49,7 +50,7 @@ class CRM_Search_Page_Ang extends CRM_Core_Page {
     $loader->setModules(['search']);
     $loader->setPageName('civicrm/search');
     $loader->useApp([
-      'defaultRoute' => '/Contact',
+      'defaultRoute' => '/create/Contact',
     ]);
     $loader->load();
     parent::run();
@@ -83,13 +84,13 @@ class CRM_Search_Page_Ang extends CRM_Core_Page {
    */
   private function getSchema() {
     $schema = \Civi\Api4\Entity::get()
-      ->addSelect('name', 'title', 'description', 'icon')
+      ->addSelect('name', 'title', 'title_plural', 'description', 'icon')
       ->addWhere('name', '!=', 'Entity')
-      ->addOrderBy('title')
+      ->addOrderBy('title_plural')
       ->setChain([
         'get' => ['$name', 'getActions', ['where' => [['name', '=', 'get']]], ['params']],
       ])->execute();
-    $getFields = ['name', 'label', 'description', 'options', 'input_type', 'input_attrs', 'data_type', 'serialize'];
+    $getFields = ['name', 'label', 'description', 'options', 'input_type', 'input_attrs', 'data_type', 'serialize', 'fk_entity'];
     foreach ($schema as $entity) {
       // Skip if entity doesn't have a 'get' action or the user doesn't have permission to use get
       if ($entity['get']) {
diff --git a/civicrm/ext/search/CRM/Search/Upgrader.php b/civicrm/ext/search/CRM/Search/Upgrader.php
index 7260e39813cf397682d0a1ca04c41e72ba2e9c8d..667460ecba06408145f47d036d1bf696c8112e26 100644
--- a/civicrm/ext/search/CRM/Search/Upgrader.php
+++ b/civicrm/ext/search/CRM/Search/Upgrader.php
@@ -12,8 +12,8 @@ class CRM_Search_Upgrader extends CRM_Search_Upgrader_Base {
   public function enable() {
     \Civi\Api4\Navigation::create(FALSE)
       ->addValue('parent_id:name', 'Search')
-      ->addValue('label', E::ts('Create Search...'))
-      ->addValue('name', 'create_search')
+      ->addValue('label', E::ts('Search Kit'))
+      ->addValue('name', 'search_kit')
       ->addValue('url', 'civicrm/search')
       ->addValue('icon', 'crm-i fa-search-plus')
       ->addValue('has_separator', 2)
@@ -26,7 +26,7 @@ class CRM_Search_Upgrader extends CRM_Search_Upgrader_Base {
    */
   public function disable() {
     \Civi\Api4\Navigation::delete(FALSE)
-      ->addWhere('name', '=', 'create_search')
+      ->addWhere('name', '=', 'search_kit')
       ->addWhere('domain_id', '=', 'current_domain')
       ->execute();
   }
diff --git a/civicrm/ext/search/README.md b/civicrm/ext/search/README.md
index 456e59f4f8e17d5dd01f5ac4e5549c124e2f6303..3bb1cbbf96c073fb83a2d517926fa6b07de2ce06 100644
--- a/civicrm/ext/search/README.md
+++ b/civicrm/ext/search/README.md
@@ -1,7 +1,13 @@
-# org.civicrm.search
+# CiviCRM Search Kit
 
-A core extension to create advanced searches.
+A core extension to create complex searches, reports & smart groups.
 
 ## Usage
 
-Once enabled, navigate to **Search > Create Search...** in the menu.
+Once enabled, navigate to **Search > Search Kit** in the menu.
+
+## Development
+
+https://chat.civicrm.org/civicrm/channels/search-improvements
+
+https://lab.civicrm.org/dev/report/-/issues
diff --git a/civicrm/ext/search/ang/search.module.js b/civicrm/ext/search/ang/search.module.js
index 3b2eeb34ffe1545bd93824d8613bc54faaa0e7cc..291552c3db51c8577accb0501bbc38d1694d16bf 100644
--- a/civicrm/ext/search/ang/search.module.js
+++ b/civicrm/ext/search/ang/search.module.js
@@ -2,27 +2,78 @@
   "use strict";
 
   // Shared between router and searchMeta service
-  var searchEntity;
+  var searchEntity,
+    // For loading saved search
+    savedSearch,
+    undefined;
 
   // Declare module and route/controller/services
   angular.module('search', CRM.angRequires('search'))
 
     .config(function($routeProvider) {
-      $routeProvider.when('/:entity', {
+      $routeProvider.when('/:mode/:entity/:name?', {
         controller: 'searchRoute',
-        template: '<div id="bootstrap-theme" class="crm-search"><crm-search entity="entity"></crm-search></div>',
-        reloadOnSearch: false
+        template: '<div id="bootstrap-theme" class="crm-search"><crm-search ng-if="$ctrl.mode === \'create\'" entity="$ctrl.entity" load=":: $ctrl.savedSearch"></crm-search></div>',
+        reloadOnSearch: false,
+        resolve: {
+          // For paths like /load/Group/MySmartGroup, load the group, stash it in the savedSearch variable, and then redirect
+          // For paths like /create/Contact, return the stashed savedSearch if present
+          savedSearch: function($route, $location, $timeout, crmApi4) {
+            var retrievedSearch = savedSearch,
+              getParams,
+              params = $route.current.params;
+            savedSearch = undefined;
+            switch (params.mode) {
+              case 'create':
+                return retrievedSearch;
+
+              case 'load':
+                // Load savedSearch by `id` (the SavedSearch entity doesn't have `name`)
+                if (params.entity === 'SavedSearch' && /^\d+$/.test(params.name)) {
+                  getParams = {
+                    where: [['id', '=', params.name]]
+                  };
+                }
+                // Load attached entity (e.g. Smart Groups) with a join via saved_search_id
+                else if (params.entity === 'Group' && params.name) {
+                  getParams = {
+                    select: ['id', 'title', 'saved_search_id', 'saved_search.*'],
+                    where: [['name', '=', params.name]]
+                  };
+                }
+                // In theory savedSearches could be attached to something other than groups, but for now that's not supported
+                else {
+                  throw 'Failed to load ' + params.entity;
+                }
+                return crmApi4(params.entity, 'get', getParams, 0).then(function(retrieved) {
+                  savedSearch = retrieved;
+                  savedSearch.type = params.entity;
+                  if (params.entity !== 'SavedSearch') {
+                    savedSearch.api_entity = retrieved['saved_search.api_entity'];
+                    savedSearch.api_params = retrieved['saved_search.api_params'];
+                    savedSearch.form_values = retrieved['saved_search.form_values'];
+                  }
+                  $timeout(function() {
+                    $location.url('/create/' + savedSearch.api_entity);
+                  });
+                });
+            }
+          }
+        }
       });
     })
 
     // Controller binds entity to route
-    .controller('searchRoute', function($scope, $routeParams, $location) {
-      searchEntity = $scope.entity = $routeParams.entity;
+    .controller('searchRoute', function($scope, $routeParams, $location, savedSearch) {
+      searchEntity = this.entity = $routeParams.entity;
+      this.mode = $routeParams.mode;
+      this.savedSearch = savedSearch;
+      $scope.$ctrl = this;
 
       // Changing entity will refresh the angular page
-      $scope.$watch('entity', function(newEntity, oldEntity) {
+      $scope.$watch('$ctrl.entity', function(newEntity, oldEntity) {
         if (newEntity && oldEntity && newEntity !== oldEntity) {
-          $location.url('/' + newEntity);
+          $location.url('/create/' + newEntity);
         }
       });
     })
@@ -30,23 +81,21 @@
     .factory('searchMeta', function() {
       function getEntity(entityName) {
         if (entityName) {
-          entityName = entityName === true ? searchEntity : entityName;
           return _.find(CRM.vars.search.schema, {name: entityName});
         }
       }
-      function getField(name) {
-        var dotSplit = name.split('.'),
+      function getField(fieldName, entityName) {
+        var dotSplit = fieldName.split('.'),
           joinEntity = dotSplit.length > 1 ? dotSplit[0] : null,
-          fieldName = _.last(dotSplit).split(':')[0],
-          entityName = searchEntity;
+          name = _.last(dotSplit).split(':')[0];
         // Custom fields contain a dot in their fieldname
         // If 3 segments, the first is the joinEntity and the last 2 are the custom field
         if (dotSplit.length === 3) {
-          fieldName = dotSplit[1] + '.' + fieldName;
+          name = dotSplit[1] + '.' + name;
         }
         // If 2 segments, it's ambiguous whether this is a custom field or joined field. Search the main entity first.
         if (dotSplit.length === 2) {
-          var field = _.find(getEntity(true).fields, {name: dotSplit[0] + '.' + fieldName});
+          var field = _.find(getEntity(entityName).fields, {name: dotSplit[0] + '.' + name});
           if (field) {
             return field;
           }
@@ -54,25 +103,29 @@
         if (joinEntity) {
           entityName = _.find(CRM.vars.search.links[entityName], {alias: joinEntity}).entity;
         }
-        return _.find(getEntity(entityName).fields, {name: fieldName});
+        return _.find(getEntity(entityName).fields, {name: name});
       }
       return {
         getEntity: getEntity,
         getField: getField,
         parseExpr: function(expr) {
-          var result = {},
+          var result = {fn: null, modifier: ''},
             fieldName = expr,
             bracketPos = expr.indexOf('(');
           if (bracketPos >= 0) {
-            fieldName = expr.match(/[A-Z( _]*([\w.:]+)/)[1];
+            var parsed = expr.substr(bracketPos).match(/[ ]?([A-Z]+[ ]+)?([\w.:]+)/);
+            fieldName = parsed[2];
             result.fn = _.find(CRM.vars.search.functions, {name: expr.substring(0, bracketPos)});
+            result.modifier = _.trim(parsed[1]);
+          }
+          result.field = expr ? getField(fieldName, searchEntity) : undefined;
+          if (result.field) {
+            var split = fieldName.split(':'),
+              prefixPos = split[0].lastIndexOf(result.field.name);
+            result.path = split[0];
+            result.prefix = prefixPos > 0 ? result.path.substring(0, prefixPos) : '';
+            result.suffix = !split[1] ? '' : ':' + split[1];
           }
-          result.field = getField(fieldName);
-          var split = fieldName.split(':'),
-            prefixPos = split[0].lastIndexOf(result.field.name);
-          result.path = split[0];
-          result.prefix = prefixPos > 0 ? result.path.substring(0, prefixPos) : '';
-          result.suffix = !split[1] ? '' : ':' + split[1];
           return result;
         }
       };
diff --git a/civicrm/ext/search/ang/search/SaveSmartGroup.ctrl.js b/civicrm/ext/search/ang/search/SaveSmartGroup.ctrl.js
index 74401b984731c0a4b3d81a71216e28d0346c18ac..90be034966fb11ab95fb0d6c00528ed15c4f51f4 100644
--- a/civicrm/ext/search/ang/search/SaveSmartGroup.ctrl.js
+++ b/civicrm/ext/search/ang/search/SaveSmartGroup.ctrl.js
@@ -1,13 +1,15 @@
 (function(angular, $, _) {
   "use strict";
 
-  angular.module('search').controller('SaveSmartGroup', function ($scope, crmApi4, dialogService) {
+  angular.module('search').controller('SaveSmartGroup', function ($scope, $element, $timeout, crmApi4, dialogService, searchMeta) {
     var ts = $scope.ts = CRM.ts(),
-      model = $scope.model;
+      model = $scope.model,
+      joins = _.pluck((model.api_params.join || []), 0),
+      entityCount = {};
     $scope.groupEntityRefParams = {
       entity: 'Group',
       api: {
-        params: {is_hidden: 0, is_active: 1, 'saved_search_id.api_entity': model.entity},
+        params: {is_hidden: 0, is_active: 1, 'saved_search_id.api_entity': model.api_entity},
         extra: ['saved_search_id', 'description', 'visibility', 'group_type']
       },
       select: {
@@ -16,6 +18,35 @@
         placeholder: ts('Select existing group')
       }
     };
+    // Find all possible search columns that could serve as contact_id for the smart group
+    $scope.columns = _.transform([model.api_entity].concat(joins), function(columns, joinExpr) {
+      var joinName = joinExpr.split(' AS '),
+        entityName = joinName[0],
+        entity = searchMeta.getEntity(entityName),
+        prefix = joinName[1] ? joinName[1] + '.' : '';
+      _.each(entity.fields, function(field) {
+        if ((entityName === 'Contact' && field.name === 'id') || field.fk_entity === 'Contact') {
+          columns.push({
+            id: prefix + field.name,
+            text: entity.title_plural + (entityCount[entityName] ? ' ' + entityCount[entityName] : '') + ': ' + field.label,
+            icon: entity.icon
+          });
+        }
+      });
+      entityCount[entityName] = 1 + (entityCount[entityName] || 1);
+    });
+
+    if (!$scope.columns.length) {
+      CRM.alert(ts('Cannot create smart group; search does not include any contacts.'), ts('Error'));
+      $timeout(function() {
+        dialogService.cancel('saveSearchDialog');
+      });
+      return;
+    }
+
+    // Pick the first applicable column for contact id
+    model.api_params.select.unshift(_.intersection(model.api_params.select, _.pluck($scope.columns, 'id'))[0] || $scope.columns[0].id);
+
     if (!CRM.checkPerm('administer reserved groups')) {
       $scope.groupEntityRefParams.api.params.is_reserved = 0;
     }
@@ -23,9 +54,15 @@
       administerReservedGroups: CRM.checkPerm('administer reserved groups')
     };
     $scope.groupFields = _.indexBy(_.find(CRM.vars.search.schema, {name: 'Group'}).fields, 'name');
-    $scope.$watch('model.id', function (id) {
-      if (id) {
-        _.assign(model, $('#api-save-search-select-group').select2('data').extra);
+    $element.on('change', '#api-save-search-select-group', function() {
+      if ($(this).val()) {
+        $scope.$apply(function() {
+          var group = $('#api-save-search-select-group').select2('data').extra;
+          model.saved_search_id = group.saved_search_id;
+          model.description = group.description || '';
+          model.group_type = group.group_type || [];
+          model.visibility = group.visibility;
+        });
       }
     });
     $scope.cancel = function () {
@@ -38,9 +75,10 @@
       group.visibility = model.visibility;
       group.group_type = model.group_type;
       group.saved_search_id = '$id';
+      model.api_params.select = _.unique(model.api_params.select);
       var savedSearch = {
-        api_entity: model.entity,
-        api_params: model.params
+        api_entity: model.api_entity,
+        api_params: model.api_params
       };
       if (group.id) {
         savedSearch.id = model.saved_search_id;
diff --git a/civicrm/ext/search/ang/search/crmSearch.component.js b/civicrm/ext/search/ang/search/crmSearch.component.js
index 5eaaee5ababb199f1894377a02c94cf093956f3b..8bb66ef210b057d5b36ad5902562930aae6ab4e2 100644
--- a/civicrm/ext/search/ang/search/crmSearch.component.js
+++ b/civicrm/ext/search/ang/search/crmSearch.component.js
@@ -3,7 +3,8 @@
 
   angular.module('search').component('crmSearch', {
     bindings: {
-      entity: '='
+      entity: '=',
+      load: '<'
     },
     templateUrl: '~/search/crmSearch.html',
     controller: function($scope, $element, $timeout, crmApi4, dialogService, searchMeta, formatForSelect2) {
@@ -17,7 +18,7 @@
       this.page = 1;
       this.params = {};
       // After a search this.results is an object of result arrays keyed by page,
-      // Prior to searching it's an empty string because 1: falsey and 2: doesn't throw an error if you try to access undefined properties
+      // Initially this.results is an empty string because 1: it's falsey (unlike an empty object) and 2: it doesn't throw an error if you try to access undefined properties (unlike null)
       this.results = '';
       this.rowCount = false;
       // Have the filters (WHERE, HAVING, GROUP BY, JOIN) changed?
@@ -26,7 +27,7 @@
 
       $scope.controls = {};
       $scope.joinTypes = [{k: false, v: ts('Optional')}, {k: true, v: ts('Required')}];
-      $scope.entities = formatForSelect2(CRM.vars.search.schema, 'name', 'title', ['description', 'icon']);
+      $scope.entities = formatForSelect2(CRM.vars.search.schema, 'name', 'title_plural', ['description', 'icon']);
       this.perm = {
         editGroups: CRM.checkPerm('edit groups')
       };
@@ -43,7 +44,7 @@
           if (entity) {
             joinEntities.push({
               id: link.entity + ' AS ' + link.alias,
-              text: entity.title,
+              text: entity.title_plural,
               description: '(' + link.alias + ')',
               icon: entity.icon
             });
@@ -197,7 +198,10 @@
         })
           .finally(function() {
             if (ctrl.debug) {
-              ctrl.debug.params = JSON.stringify(ctrl.params, null, 2);
+              ctrl.debug.params = JSON.stringify(_.extend({version: 4}, ctrl.params), null, 2);
+              if (ctrl.debug.timeIndex) {
+                ctrl.debug.timeIndex = Number.parseFloat(ctrl.debug.timeIndex).toPrecision(2);
+              }
             }
           });
       }
@@ -274,11 +278,17 @@
             ctrl.stale = true;
           }
         }
+        if (ctrl.load) {
+          ctrl.load.saved = false;
+        }
       }
 
       function onChangeFilters() {
         ctrl.stale = true;
         ctrl.selectedRows.length = 0;
+        if (ctrl.load) {
+          ctrl.load.saved = false;
+        }
         if (ctrl.autoSearch) {
           ctrl.refreshAll();
         }
@@ -333,12 +343,12 @@
 
       // Is a column eligible to use an aggregate function?
       this.canAggregate = function(col) {
+        var info = searchMeta.parseExpr(col);
         // If the column is used for a groupBy, no
-        if (ctrl.params.groupBy.indexOf(col) > -1) {
+        if (ctrl.params.groupBy.indexOf(info.path) > -1) {
           return false;
         }
         // If the entity this column belongs to is being grouped by id, then also no
-        var info = searchMeta.parseExpr(col);
         return ctrl.params.groupBy.indexOf(info.prefix + 'id') < 0;
       };
 
@@ -346,11 +356,7 @@
         var info = searchMeta.parseExpr(col),
           key = info.fn ? (info.fn.name + ':' + info.path + info.suffix) : col,
           value = row[key];
-        // Handle grouped results
-        if (info.fn && info.fn.name === 'GROUP_CONCAT' && value) {
-          return formatGroupConcatValues(info, value);
-        }
-        else if (info.fn && info.fn.name === 'COUNT') {
+        if (info.fn && info.fn.name === 'COUNT') {
           return value;
         }
         return formatFieldValue(info.field, value);
@@ -358,38 +364,23 @@
 
       function formatFieldValue(field, value) {
         var type = field.data_type;
+        if (_.isArray(value)) {
+          return _.map(value, function(val) {
+            return formatFieldValue(field, val);
+          }).join(', ');
+        }
         if (value && (type === 'Date' || type === 'Timestamp') && /^\d{4}-\d{2}-\d{2}/.test(value)) {
           return CRM.utils.formatDate(value, null, type === 'Timestamp');
         }
         else if (type === 'Boolean' && typeof value === 'boolean') {
           return value ? ts('Yes') : ts('No');
         }
-        else if (type === 'Money') {
+        else if (type === 'Money' && typeof value === 'number') {
           return CRM.formatMoney(value);
         }
-        if (_.isArray(value)) {
-          return value.join(', ');
-        }
         return value;
       }
 
-      function formatGroupConcatValues(info, values) {
-        return _.transform(values.split(','), function(result, val) {
-          if (info.field.options && !info.suffix) {
-            result.push(_.result(getOption(info.field, val), 'label'));
-          } else {
-            result.push(formatFieldValue(info.field, val));
-          }
-        }).join(', ');
-      }
-
-      function getOption(field, value) {
-        return _.find(field.options, function(option) {
-          // Type coersion is intentional
-          return option.id == value;
-        });
-      }
-
       $scope.fieldsForGroupBy = function() {
         return {results: getAllFields('', function(key) {
             return _.contains(ctrl.params.groupBy, key);
@@ -415,7 +406,9 @@
       };
 
       function getDefaultSelect() {
-        return _.filter(['id', 'display_name', 'label', 'title', 'location_type_id:label'], searchMeta.getField);
+        return _.filter(['id', 'display_name', 'label', 'title', 'location_type_id:label'], function(field) {
+          return !!searchMeta.getField(field, ctrl.entity);
+        });
       }
 
       function getAllFields(suffix, disabledIf) {
@@ -435,7 +428,7 @@
 
         var mainEntity = searchMeta.getEntity(ctrl.entity),
           result = [{
-            text: mainEntity.title,
+            text: mainEntity.title_plural,
             icon: mainEntity.icon,
             children: formatFields(ctrl.entity, '')
           }];
@@ -443,7 +436,7 @@
           var joinName = join[0].split(' AS '),
             joinEntity = searchMeta.getEntity(joinName[0]);
           result.push({
-            text: joinEntity.title + ' (' + joinName[1] + ')',
+            text: joinEntity.title_plural + ' (' + joinName[1] + ')',
             icon: joinEntity.icon,
             children: formatFields(joinEntity.name, joinName[1] + '.')
           });
@@ -549,30 +542,40 @@
         }
         $scope.$watch('$ctrl.params.having', onChangeFilters, true);
 
+        if (this.load) {
+          this.params = this.load.api_params;
+          $timeout(function() {
+            ctrl.load.saved = true;
+          });
+        }
+
         loadFieldOptions();
       };
 
       $scope.saveGroup = function() {
-        var selectField = ctrl.entity === 'Contact' ? 'id' : 'contact_id';
-        if (ctrl.entity !== 'Contact' && !searchMeta.getField('contact_id')) {
-          CRM.alert(ts('Cannot create smart group from %1.', {1: searchMeta.getEntity(true).title}), ts('Missing contact_id'), 'error', {expires: 5000});
-          return;
-        }
         var model = {
           title: '',
           description: '',
           visibility: 'User and User Admin Only',
           group_type: [],
-          id: null,
-          entity: ctrl.entity,
-          params: angular.extend({}, ctrl.params, {version: 4, select: [selectField]})
+          id: ctrl.load ? ctrl.load.id : null,
+          api_entity: ctrl.entity,
+          api_params: _.cloneDeep(angular.extend({}, ctrl.params, {version: 4}))
         };
-        delete model.params.orderBy;
+        delete model.api_params.orderBy;
+        if (ctrl.load && ctrl.load.api_params && ctrl.load.api_params.select && ctrl.load.api_params.select[0]) {
+          model.api_params.select.unshift(ctrl.load.api_params.select[0]);
+        }
         var options = CRM.utils.adjustDialogDefaults({
           autoOpen: false,
           title: ts('Save smart group')
         });
-        dialogService.open('saveSearchDialog', '~/search/saveSmartGroup.html', model, options);
+        dialogService.open('saveSearchDialog', '~/search/saveSmartGroup.html', model, options)
+          .then(function() {
+            if (ctrl.load) {
+              ctrl.load.saved = true;
+            }
+          });
       };
     }
   });
diff --git a/civicrm/ext/search/ang/search/crmSearch.html b/civicrm/ext/search/ang/search/crmSearch.html
index bd0feabcba10f045de80214f40fd56b556c5133d..782bfdd7904ab097903699772666b39f8c8d9ffd 100644
--- a/civicrm/ext/search/ang/search/crmSearch.html
+++ b/civicrm/ext/search/ang/search/crmSearch.html
@@ -1,5 +1,5 @@
 <div id="bootstrap-theme" class="crm-search">
-  <h1 crm-page-title>{{:: ts('Create Search for %1', {1: $ctrl.getEntity($ctrl.entity).title}) }}</h1>
+  <h1 crm-page-title>{{:: ts('Search for %1', {1: $ctrl.getEntity($ctrl.entity).title_plural}) }}</h1>
 
   <!--This warning will show if bootstrap is unavailable. Normally it will be hidden by the bootstrap .collapse class.-->
   <div class="messages warning no-popup collapse">
diff --git a/civicrm/ext/search/ang/search/crmSearch/controls.html b/civicrm/ext/search/ang/search/crmSearch/controls.html
index c17724ba312736ae0c2b3439c17d96723b7d5c21..ce1f843e0286aabcb0862131c6f206b7f60e1051 100644
--- a/civicrm/ext/search/ang/search/crmSearch/controls.html
+++ b/civicrm/ext/search/ang/search/crmSearch/controls.html
@@ -10,9 +10,9 @@
       {{:: ts('Auto') }}
     </button>
   </div>
-  <crm-search-actions entity="$ctrl.entity" ids="$ctrl.selectedRows"></crm-search-actions>
+  <crm-search-actions entity="$ctrl.entity" ids="$ctrl.selectedRows" refresh="$ctrl.refreshPage()"></crm-search-actions>
   <div class="btn-group pull-right">
-    <button type="button" class="btn form-control dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+    <button type="button" class="btn btn-default form-control dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
       <i class="crm-i fa-save"></i> {{:: ts('Create')}}
       <span class="caret"></span>
     </button>
diff --git a/civicrm/ext/search/ang/search/crmSearch/criteria.html b/civicrm/ext/search/ang/search/crmSearch/criteria.html
index 6bb500a7419fd798e69da25ab599c162deea0206..a52979c8be66513dbef08c853e9e31c6df876d80 100644
--- a/civicrm/ext/search/ang/search/crmSearch/criteria.html
+++ b/civicrm/ext/search/ang/search/crmSearch/criteria.html
@@ -2,7 +2,7 @@
   <div>
     <div class="form-inline">
       <label for="crm-search-main-entity">{{:: ts('Search for') }}</label>
-      <input id="crm-search-main-entity" class="form-control" ng-model="$ctrl.entity" crm-ui-select="::{allowClear: false, data: entities}" ng-change="changeEntity()" />
+      <input id="crm-search-main-entity" class="form-control" ng-model="$ctrl.entity" crm-ui-select="::{allowClear: false, data: entities}" />
     </div>
     <div ng-if=":: $ctrl.paramExists('join')">
       <fieldset ng-repeat="join in $ctrl.params.join">
@@ -11,7 +11,8 @@
           <input id="crm-search-join-{{ $index }}" class="form-control" ng-model="join[0]" crm-ui-select="{placeholder: ' ', data: getJoinEntities}" ng-change="changeJoin($index)" />
           <select class="form-control" ng-model="join[1]" ng-options="o.k as o.v for o in ::joinTypes" ></select>
         </div>
-        <fieldset class="api4-clause-fieldset" crm-search-clause="{format: 'json', clauses: join, skip: 2, op: 'AND', label: ts('If'), fields: fieldsForWhere}">
+        <fieldset class="api4-clause-fieldset">
+          <crm-search-clause clauses="join" format="json" skip="2" op="AND" label="{{ ts('If') }}" fields="fieldsForWhere" ></crm-search-clause>
         </fieldset>
       </fieldset>
       <fieldset>
@@ -40,9 +41,17 @@
     </fieldset>
   </div>
   <div>
-    <fieldset class="api4-clause-fieldset" crm-search-clause="{format: 'string', clauses: $ctrl.params.where, op: 'AND', label: ts('Where'), fields: fieldsForWhere}">
+    <div class="navbar-form clearfix" ng-if="$ctrl.load">
+      <div class="form-group pull-right">
+        <label>{{ $ctrl.load.title }}</label>
+        <button class="btn btn-default" ng-disabled="$ctrl.load.saved" ng-click="saveGroup()">{{ $ctrl.load.saved ? ts('Saved') : ts('Save') }}</button>
+      </div>
+    </div>
+    <fieldset class="api4-clause-fieldset">
+      <crm-search-clause clauses="$ctrl.params.where" format="string" op="AND" label="{{ ts('Where') }}" fields="fieldsForWhere" ></crm-search-clause>
     </fieldset>
-    <fieldset ng-if="$ctrl.paramExists('having') && $ctrl.params.groupBy.length" class="api4-clause-fieldset" crm-search-clause="{format: 'string', clauses: $ctrl.params.having, op: 'AND', label: ts('Filter'), fields: fieldsForHaving}">
+    <fieldset ng-if="$ctrl.paramExists('having') && $ctrl.params.groupBy.length" class="api4-clause-fieldset">
+      <crm-search-clause clauses="$ctrl.params.having" format="string" op="AND" label="{{ ts('Filter') }}" fields="fieldsForHaving" ></crm-search-clause>
     </fieldset>
   </div>
 </div>
diff --git a/civicrm/ext/search/ang/search/crmSearchActions.component.js b/civicrm/ext/search/ang/search/crmSearchActions.component.js
index 138cb089a9251a02a325c60ee5c8e6689fe34d96..0d00f1bb2c2bd7f47956b72f36919d5f7f1123f9 100644
--- a/civicrm/ext/search/ang/search/crmSearchActions.component.js
+++ b/civicrm/ext/search/ang/search/crmSearchActions.component.js
@@ -4,18 +4,16 @@
   angular.module('search').component('crmSearchActions', {
     bindings: {
       entity: '<',
+      refresh: '&',
       ids: '<'
     },
-    require: {
-      search: '^crmSearch'
-    },
     templateUrl: '~/search/crmSearchActions.html',
     controller: function($scope, crmApi4, dialogService, searchMeta) {
       var ts = $scope.ts = CRM.ts(),
-        entityTitle = searchMeta.getEntity(this.entity).title,
         ctrl = this;
 
-      this.init = function() {
+      this.$onInit = function() {
+        var entityTitle = searchMeta.getEntity(ctrl.entity).title_plural;
         if (!ctrl.actions) {
           var actions = _.transform(_.cloneDeep(CRM.vars.search.actions), function (actions, action) {
             if (_.includes(action.entities, ctrl.entity)) {
@@ -44,7 +42,7 @@
           var path = $scope.$eval(action.crmPopup.path, data),
             query = action.crmPopup.query && $scope.$eval(action.crmPopup.query, data);
           CRM.loadForm(CRM.url(path, query))
-            .on('crmFormSuccess', ctrl.search.refreshPage);
+            .on('crmFormSuccess', ctrl.refresh);
         }
         // If action uses dialogService
         else if (action.uiDialog) {
@@ -53,7 +51,7 @@
             title: action.title
           });
           dialogService.open('crmSearchAction', action.uiDialog.templateUrl, data, options)
-            .then(ctrl.search.refreshPage);
+            .then(ctrl.refresh);
         }
       };
     }
diff --git a/civicrm/ext/search/ang/search/crmSearchActions.html b/civicrm/ext/search/ang/search/crmSearchActions.html
index dbeae2c84c5eda08603315db2b667d15531583d0..7442efbe09e46dfb30ee55e35d9e61790f0b23ea 100644
--- a/civicrm/ext/search/ang/search/crmSearchActions.html
+++ b/civicrm/ext/search/ang/search/crmSearchActions.html
@@ -1,5 +1,5 @@
 <div class="btn-group" title="{{:: ts('Perform action on selected items.') }}">
-  <button type="button" ng-disabled="!$ctrl.ids.length" ng-click="$ctrl.init()" class="btn form-control dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+  <button type="button" ng-disabled="!$ctrl.ids.length" ng-click="$ctrl.init()" class="btn form-control dropdown-toggle btn-default" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
     {{:: ts('Action') }} <span class="caret"></span>
   </button>
   <ul class="dropdown-menu" ng-if=":: $ctrl.actions">
diff --git a/civicrm/ext/search/ang/search/crmSearchActions/crmSearchActionUpdate.ctrl.js b/civicrm/ext/search/ang/search/crmSearchActions/crmSearchActionUpdate.ctrl.js
index 63394a2427f6746e338a7f0e4393c1636cc7dacd..a4fb759887a08965a7144565e86f9247cc62e0e8 100644
--- a/civicrm/ext/search/ang/search/crmSearchActions/crmSearchActionUpdate.ctrl.js
+++ b/civicrm/ext/search/ang/search/crmSearchActions/crmSearchActionUpdate.ctrl.js
@@ -35,7 +35,7 @@
 
     this.availableFields = function() {
       var results = _.transform(ctrl.entity.fields, function(result, item) {
-        var formatted = {id: item.name, text: item.title, description: item.description};
+        var formatted = {id: item.name, text: item.label, description: item.description};
         if (fieldInUse(item.name)) {
           formatted.disabled = true;
         }
diff --git a/civicrm/ext/search/ang/search/crmSearchActions/crmSearchActionUpdate.html b/civicrm/ext/search/ang/search/crmSearchActions/crmSearchActionUpdate.html
index 63178a0baed16f857e05bcda12abba5cf2ddc74a..52787c6abe370da931e1eab50e68b720e96409a6 100644
--- a/civicrm/ext/search/ang/search/crmSearchActions/crmSearchActionUpdate.html
+++ b/civicrm/ext/search/ang/search/crmSearchActions/crmSearchActionUpdate.html
@@ -10,7 +10,7 @@
     <hr />
     <div class="buttons pull-right">
       <button type="button" ng-click="$ctrl.cancel()" class="btn btn-danger">{{:: ts('Cancel') }}</button>
-      <button ng-click="$ctrl.save()" class="btn btn-primary" ng-disabled="!$ctrl.values.length">{{:: ts('Update %1 %2', {1: model.ids.length, 2: $ctrl.entity.title}) }}</button>
+      <button ng-click="$ctrl.save()" class="btn btn-primary" ng-disabled="!$ctrl.values.length">{{:: ts('Update %1 %2', {1: model.ids.length, 2: (model.ids.length === 1 ? $ctrl.entity.title : $ctrl.entity.title_plural)}) }}</button>
     </div>
   </div>
 </div>
diff --git a/civicrm/ext/search/ang/search/crmSearchClause.component.js b/civicrm/ext/search/ang/search/crmSearchClause.component.js
new file mode 100644
index 0000000000000000000000000000000000000000..3fb1a01d6f4f2f57708068b16d6c213a13533e75
--- /dev/null
+++ b/civicrm/ext/search/ang/search/crmSearchClause.component.js
@@ -0,0 +1,83 @@
+(function(angular, $, _) {
+  "use strict";
+
+  angular.module('search').component('crmSearchClause', {
+    bindings: {
+      fields: '<',
+      clauses: '<',
+      format: '@',
+      op: '@',
+      skip: '<',
+      label: '@',
+      deleteGroup: '&'
+    },
+    templateUrl: '~/search/crmSearchClause.html',
+    controller: function ($scope, $element, $timeout) {
+      var ts = $scope.ts = CRM.ts(),
+        ctrl = this;
+      this.conjunctions = {AND: ts('And'), OR: ts('Or'), NOT: ts('Not')};
+      this.operators = CRM.vars.search.operators;
+      this.sortOptions = {
+        axis: 'y',
+        connectWith: '.api4-clause-group-sortable',
+        containment: $element.closest('.api4-clause-fieldset'),
+        over: onSortOver,
+        start: onSort,
+        stop: onSort
+      };
+
+      this.$onInit = function() {
+        ctrl.hasParent = !!$element.attr('delete-group');
+      };
+
+      this.addGroup = function(op) {
+        ctrl.clauses.push([op, []]);
+      };
+
+      function onSort(event, ui) {
+        $($element).closest('.api4-clause-fieldset').toggleClass('api4-sorting', event.type === 'sortstart');
+        $('.api4-input.form-inline').css('margin-left', '');
+      }
+
+      // Indent clause while dragging between nested groups
+      function onSortOver(event, ui) {
+        var offset = 0;
+        if (ui.sender) {
+          offset = $(ui.placeholder).offset().left - $(ui.sender).offset().left;
+        }
+        $('.api4-input.form-inline.ui-sortable-helper').css('margin-left', '' + offset + 'px');
+      }
+
+      this.addClause = function() {
+        $timeout(function() {
+          if (ctrl.newClause) {
+            ctrl.clauses.push([ctrl.newClause, '=', '']);
+            ctrl.newClause = null;
+          }
+        });
+      };
+
+      this.deleteRow = function(index) {
+        ctrl.clauses.splice(index, 1);
+      };
+
+      // Remove empty values
+      this.changeClauseField = function(clause, index) {
+        if (clause[0] === '') {
+          ctrl.deleteRow(index);
+        }
+      };
+
+      // Add/remove value if operator allows for one
+      this.changeClauseOperator = function(clause) {
+        if (_.contains(clause[1], 'NULL')) {
+          clause.length = 2;
+        } else if (clause.length === 2) {
+          clause.push('');
+        }
+      };
+
+    }
+  });
+
+})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/search/ang/search/crmSearchClause.directive.js b/civicrm/ext/search/ang/search/crmSearchClause.directive.js
deleted file mode 100644
index ab59aff12212233cd43d9f2408dfd0a6a48976bd..0000000000000000000000000000000000000000
--- a/civicrm/ext/search/ang/search/crmSearchClause.directive.js
+++ /dev/null
@@ -1,75 +0,0 @@
-(function(angular, $, _) {
-  "use strict";
-
-  angular.module('search').directive('crmSearchClause', function() {
-    return {
-      scope: {
-        data: '<crmSearchClause'
-      },
-      templateUrl: '~/search/crmSearchClause.html',
-      controller: function ($scope, $element, $timeout) {
-        var ts = $scope.ts = CRM.ts();
-        var ctrl = $scope.$ctrl = this;
-        this.conjunctions = {AND: ts('And'), OR: ts('Or'), NOT: ts('Not')};
-        this.operators = CRM.vars.search.operators;
-        this.sortOptions = {
-          axis: 'y',
-          connectWith: '.api4-clause-group-sortable',
-          containment: $element.closest('.api4-clause-fieldset'),
-          over: onSortOver,
-          start: onSort,
-          stop: onSort
-        };
-
-        this.addGroup = function(op) {
-          $scope.data.clauses.push([op, []]);
-        };
-
-        this.removeGroup = function() {
-          $scope.data.groupParent.splice($scope.data.groupIndex, 1);
-        };
-
-        function onSort(event, ui) {
-          $($element).closest('.api4-clause-fieldset').toggleClass('api4-sorting', event.type === 'sortstart');
-          $('.api4-input.form-inline').css('margin-left', '');
-        }
-
-        // Indent clause while dragging between nested groups
-        function onSortOver(event, ui) {
-          var offset = 0;
-          if (ui.sender) {
-            offset = $(ui.placeholder).offset().left - $(ui.sender).offset().left;
-          }
-          $('.api4-input.form-inline.ui-sortable-helper').css('margin-left', '' + offset + 'px');
-        }
-
-        this.addClause = function() {
-          $timeout(function() {
-            if (ctrl.newClause) {
-              $scope.data.clauses.push([ctrl.newClause, '=', '']);
-              ctrl.newClause = null;
-            }
-          });
-        };
-        $scope.$watch('data.clauses', function(values) {
-          // Iterate in reverse order so index doesn't get out-of-sync during splice
-          _.forEachRight(values, function(clause, index) {
-            // Remove empty values
-            if (index >= ($scope.data.skip  || 0)) {
-              if (typeof clause !== 'undefined' && !clause[0]) {
-                values.splice(index, 1);
-              }
-              // Add/remove value if operator allows for one
-              else if (typeof clause[1] === 'string' && _.contains(clause[1], 'NULL')) {
-                clause.length = 2;
-              } else if (typeof clause[1] === 'string' && clause.length === 2) {
-                clause.push('');
-              }
-            }
-          });
-        }, true);
-      }
-    };
-  });
-
-})(angular, CRM.$, CRM._);
diff --git a/civicrm/ext/search/ang/search/crmSearchClause.html b/civicrm/ext/search/ang/search/crmSearchClause.html
index 97ef49621fadd2d233c3f3ff17b788c26d44a0ca..a50df23725056022d9b7194aef96857b1b3615f3 100644
--- a/civicrm/ext/search/ang/search/crmSearchClause.html
+++ b/civicrm/ext/search/ang/search/crmSearchClause.html
@@ -1,41 +1,42 @@
-<legend>{{ data.label || ts('%1 group', {1: $ctrl.conjunctions[data.op]}) }}</legend>
-<div class="btn-group btn-group-xs" ng-if="data.groupParent">
-  <button class="btn btn-danger-outline" ng-click="$ctrl.removeGroup()" title="{{:: ts('Remove group') }}">
+<legend>{{ $ctrl.label || ts('%1 group', {1: $ctrl.conjunctions[$ctrl.op]}) }}</legend>
+<div class="btn-group btn-group-xs" ng-if=":: $ctrl.hasParent">
+  <button class="btn btn-danger-outline" ng-click="$ctrl.deleteGroup()" title="{{:: ts('Remove group') }}">
     <i class="crm-i fa-trash" aria-hidden="true"></i>
   </button>
 </div>
-<div class="api4-clause-group-sortable" ng-model="data.clauses" ui-sortable="$ctrl.sortOptions">
-  <div class="api4-input form-inline clearfix" ng-repeat="(index, clause) in data.clauses" ng-class="{hiddenElement: index &lt; (data.skip || 0)}">
-    <div ng-if="index &gt;= (data.skip || 0)">
+<div class="api4-clause-group-sortable" ng-model="$ctrl.clauses" ui-sortable="$ctrl.sortOptions">
+  <div class="api4-input form-inline clearfix" ng-repeat="(index, clause) in $ctrl.clauses" ng-class="{hiddenElement: index &lt; ($ctrl.skip || 0)}">
+    <div ng-if="index &gt;= ($ctrl.skip || 0)">
       <div class="api4-clause-badge" title="{{:: ts('Drag to reposition') }}">
         <span class="badge badge-info">
-          <span ng-if="index === (data.skip || 0) && !data.groupParent">{{ data.label }}</span>
-          <span ng-if="index &gt; (data.skip || 0) || data.groupParent">{{ $ctrl.conjunctions[data.op] }}</span>
+          <span ng-if="index === ($ctrl.skip || 0) && !$ctrl.hasParent">{{ $ctrl.label }}</span>
+          <span ng-if="index &gt; ($ctrl.skip || 0) || $ctrl.hasParent">{{ $ctrl.conjunctions[$ctrl.op] }}</span>
           <i class="crm-i fa-arrows" aria-hidden="true"></i>
         </span>
       </div>
       <div ng-if="!$ctrl.conjunctions[clause[0]]" class="api4-input-group">
-        <input class="form-control" ng-model="clause[0]" crm-ui-select="{data: data.fields, allowClear: true, placeholder: 'Field'}" />
-        <select class="form-control api4-operator" ng-model="clause[1]" ng-options="o.key as o.value for o in $ctrl.operators" ></select>
-        <input class="form-control" ng-model="clause[2]" crm-search-value="{field: clause[0], op: clause[1], format: data.format}" />
+        <input class="form-control" ng-model="clause[0]" crm-ui-select="{data: $ctrl.fields, allowClear: true, placeholder: 'Field'}" ng-change="$ctrl.changeClauseField(clause, index)" />
+        <select class="form-control api4-operator" ng-model="clause[1]" ng-options="o.key as o.value for o in $ctrl.operators" ng-change="$ctrl.changeClauseOperator(clause)" ></select>
+        <input class="form-control" ng-model="clause[2]" crm-search-value="{field: clause[0], op: clause[1], format: $ctrl.format}" />
       </div>
-      <fieldset class="clearfix" ng-if="$ctrl.conjunctions[clause[0]]" crm-search-clause="{format: data.format, clauses: clause[1], op: clause[0], fields: data.fields, groupParent: data.clauses, groupIndex: index}">
+      <fieldset class="clearfix" ng-if="$ctrl.conjunctions[clause[0]]">
+        <crm-search-clause clauses="clause[1]" format="{{ $ctrl.format }}" op="{{ clause[0] }}" fields="$ctrl.fields" delete-group="$ctrl.deleteRow(index)" ></crm-search-clause>
       </fieldset>
     </div>
   </div>
 </div>
 <div class="api4-input form-inline">
   <div class="api4-clause-badge">
-    <div class="btn-group btn-group-xs" title="{{ data.groupParent ? ts('Add a subgroup of clauses') : ts('Add a group of clauses') }}">
+    <div class="btn-group btn-group-xs" title="{{ $ctrl.hasParent ? ts('Add a subgroup of clauses') : ts('Add a group of clauses') }}">
       <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
-        {{ $ctrl.conjunctions[data.op] }} <span class="caret"></span>
+        {{ $ctrl.conjunctions[$ctrl.op] }} <span class="caret"></span>
       </button>
       <ul class="dropdown-menu api4-add-where-group-menu">
-        <li ng-repeat="(con, label) in $ctrl.conjunctions" ng-show="data.op !== con">
+        <li ng-repeat="(con, label) in $ctrl.conjunctions" ng-show="$ctrl.op !== con">
           <a href ng-click="$ctrl.addGroup(con)">{{ label }}</a>
         </li>
       </ul>
     </div>
   </div>
-  <input class="form-control" ng-model="$ctrl.newClause" ng-change="$ctrl.addClause()" crm-ui-select="{data: data.fields, placeholder: ts('Select field')}" />
+  <input class="form-control" ng-model="$ctrl.newClause" ng-change="$ctrl.addClause()" crm-ui-select="{data: $ctrl.fields, placeholder: ts('Select field')}" />
 </div>
diff --git a/civicrm/ext/search/ang/search/crmSearchFunction.component.js b/civicrm/ext/search/ang/search/crmSearchFunction.component.js
index e75bac9571480ed04dbe726c292bc093b35e6a94..1b2c45832d85c5b2ee7f56b0ff1510f46feb0281 100644
--- a/civicrm/ext/search/ang/search/crmSearchFunction.component.js
+++ b/civicrm/ext/search/ang/search/crmSearchFunction.component.js
@@ -10,17 +10,35 @@
     controller: function($scope, formatForSelect2, searchMeta) {
       var ts = $scope.ts = CRM.ts(),
         ctrl = this;
-      this.functions = formatForSelect2(_.where(CRM.vars.search.functions, {category: this.cat}), 'name', 'title');
 
       this.$onInit = function() {
+        ctrl.functions = formatForSelect2(_.where(CRM.vars.search.functions, {category: ctrl.cat}), 'name', 'title');
         var fieldInfo = searchMeta.parseExpr(ctrl.expr);
-        ctrl.path = fieldInfo.path;
+        ctrl.path = fieldInfo.path + fieldInfo.suffix;
         ctrl.field = fieldInfo.field;
         ctrl.fn = !fieldInfo.fn ? '' : fieldInfo.fn.name;
+        ctrl.modifier = fieldInfo.modifier || null;
+        initFunction();
       };
 
+      function initFunction() {
+        ctrl.fnInfo = _.find(CRM.vars.search.functions, {name: ctrl.fn});
+        if (ctrl.fnInfo && _.includes(ctrl.fnInfo.params[0].prefix, 'DISTINCT')) {
+          ctrl.modifierAllowed = true;
+        }
+        else {
+          ctrl.modifierAllowed = false;
+          ctrl.modifier = null;
+        }
+      }
+
       this.selectFunction = function() {
-        ctrl.expr = ctrl.fn ? (ctrl.fn + '(' + ctrl.path + ')') : ctrl.path;
+        initFunction();
+        ctrl.writeExpr();
+      };
+
+      this.writeExpr = function() {
+        ctrl.expr = ctrl.fn ? (ctrl.fn + '(' + (ctrl.modifier ? ctrl.modifier + ' ' : '') + ctrl.path + ')') : ctrl.path;
       };
     }
   });
diff --git a/civicrm/ext/search/ang/search/crmSearchFunction.html b/civicrm/ext/search/ang/search/crmSearchFunction.html
index e0692e33d3e4f420634adfaeec7b1fc1b9ed9d8c..03238b825c052b627cda6a58d671f382895e3106 100644
--- a/civicrm/ext/search/ang/search/crmSearchFunction.html
+++ b/civicrm/ext/search/ang/search/crmSearchFunction.html
@@ -1,4 +1,8 @@
 <div class="form-inline">
   <label>{{ $ctrl.field.label }}:</label>
   <input class="form-control" style="width: 15em;" ng-model="$ctrl.fn" crm-ui-select="{data: $ctrl.functions, placeholder: ts('Select')}" ng-change="$ctrl.selectFunction()">
+  <label ng-if="$ctrl.modifierAllowed">
+    <input type="checkbox" ng-model="$ctrl.modifier" ng-change="$ctrl.writeExpr()" ng-true-value="'DISTINCT'" ng-false-value="null">
+    {{ ts('Distinct') }}
+  </label>
 </div>
diff --git a/civicrm/ext/search/ang/search/saveSmartGroup.html b/civicrm/ext/search/ang/search/saveSmartGroup.html
index a0caf4af2c1938f9450379b9892db59c61c8a328..3589ff2234015433e14eeb6f704f63a070467c4e 100644
--- a/civicrm/ext/search/ang/search/saveSmartGroup.html
+++ b/civicrm/ext/search/ang/search/saveSmartGroup.html
@@ -2,21 +2,28 @@
   <div ng-controller="SaveSmartGroup">
     <input class="form-control" id="api-save-search-select-group" ng-model="model.id" crm-entityref="groupEntityRefParams" >
     <label ng-show="!model.id">{{:: ts('Or') }}</label>
-    <input class="form-control" placeholder="Create new group" ng-model="model.title" ng-show="!model.id">
+    <input class="form-control" placeholder="{{:: ts('Create new group') }}" ng-model="model.title" ng-show="!model.id">
+    <hr />
+    <div class="form-inline">
+     <label for="api-save-search-select-column">{{:: ts('Contact Column:') }}</label>
+      <input id="api-save-search-select-column" ng-model="model.api_params.select[0]" class="form-control" crm-ui-select="{data: columns}"/>
+    </div>
     <hr />
     <label>{{:: ts('Description:') }}</label>
     <textarea class="form-control" ng-model="model.description"></textarea>
-    <label>{{:: ts('Group Type:') }}</label>
     <div class="form-inline">
-      <div class="checkbox" ng-repeat="option in groupFields.group_type.options track by option.id">
+      <label>{{:: ts('Group Type:') }} </label>
+      <div class="checkbox" ng-repeat="option in groupFields.group_type.options track by option.id">&nbsp;
         <label>
           <input type="checkbox" checklist-model="model.group_type" checklist-value="option.id">
           {{ option.label }}
-        </label>
+        </label>&nbsp;
       </div>
     </div>
-    <label>{{:: ts('Visibility:') }}</label>
-    <select class="form-control" ng-model="model.visibility" ng-options="item.id as item.label for item in groupFields.visibility.options track by item.id"></select>
+    <div class="form-inline">
+      <label>{{:: ts('Visibility:') }}</label>
+      <select class="form-control" ng-model="model.visibility" ng-options="item.id as item.label for item in groupFields.visibility.options track by item.id" crm-ui-select></select>
+    </div>
     <hr />
     <div class="buttons pull-right">
       <button type="button" ng-click="cancel()" class="btn btn-danger">{{:: ts('Cancel') }}</button>
diff --git a/civicrm/ext/search/css/search.css b/civicrm/ext/search/css/search.css
index 554f1f724b6e1baca41e8183571ea5ee35a3e850..276755632f688215c021a57bd6e4dc3d60550129 100644
--- a/civicrm/ext/search/css/search.css
+++ b/civicrm/ext/search/css/search.css
@@ -50,12 +50,12 @@
   padding: 2px 5px;
   text-transform: capitalize;
 }
-#bootstrap-theme.crm-search fieldset > .btn-group {
+#bootstrap-theme.crm-search crm-search-clause > .btn-group {
   position: absolute;
   right: 0;
-  top: 11px;
+  top: 0;
 }
-#bootstrap-theme.crm-search fieldset > .btn-group .btn {
+#bootstrap-theme.crm-search crm-search-clause > .btn-group .btn {
   border: 0 none;
 }
 
diff --git a/civicrm/ext/search/info.xml b/civicrm/ext/search/info.xml
index 3908cea9763af352ea0387c72c574270208f8f48..587477bff06c8bace64b001fcc3e9ef7e9e9f60c 100644
--- a/civicrm/ext/search/info.xml
+++ b/civicrm/ext/search/info.xml
@@ -1,26 +1,25 @@
 <?xml version="1.0"?>
 <extension key="org.civicrm.search" type="module">
   <file>search</file>
-  <name>Search</name>
-  <description>Build searches for a wide variety of CiviCRM entities</description>
+  <name>Search Kit</name>
+  <description>Create searches for a wide variety of CiviCRM entities</description>
   <license>AGPL-3.0</license>
   <maintainer>
     <author>Coleman Watts</author>
     <email>coleman@civicrm.org</email>
   </maintainer>
   <urls>
+    <url desc="Chat">https://chat.civicrm.org/civicrm/channels/search-improvements</url>
+    <url desc="Issues">https://lab.civicrm.org/dev/report/-/issues</url>
     <url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
   </urls>
-  <releaseDate>2020-07-08</releaseDate>
-  <version>1.0</version>
-  <tags>
-    <tag>mgmt:hidden</tag>
-  </tags>
-  <develStage>stable</develStage>
+  <releaseDate>2020-11-07</releaseDate>
+  <version>1.0.beta1</version>
+  <develStage>beta</develStage>
   <compatibility>
-    <ver>5.28</ver>
+    <ver>5.31</ver>
   </compatibility>
-  <comments>Distributed with CiviCRM core</comments>
+  <comments>This extension is still in beta. Click on the chat link above to discuss development, report problems or ask questions.</comments>
   <classloader>
     <psr4 prefix="Civi\" path="Civi"/>
   </classloader>
diff --git a/civicrm/install/template.html b/civicrm/install/template.html
index e95165536b2e43f38345a7bf038babac463aa261..eb12944d220edf6b705eb18a9b4fbcd713cc5080 100644
--- a/civicrm/install/template.html
+++ b/civicrm/install/template.html
@@ -34,7 +34,7 @@ if ($text_direction == 'rtl') {
   <?php } ?>
 
   <p>
-  <input id="install_button" type="submit" name="go" value="<?php echo ts('Check Requirements and Install CiviCRM', array('escape' => 'js')); ?>" onclick="document.getElementById('saving_top').style.display = ''; this.value = '<?php echo ts('Installing CiviCRM...', array('escape' => 'js')); ?>'" />
+  <button id="install_button" type="submit" name="go" onclick="document.getElementById('saving_top').style.display = ''; this.innerHTML = '<?php echo ts('Installing CiviCRM...', ['escape' => 'js']); ?>'"><?php echo ts('Check Requirements and Install CiviCRM', ['escape' => 'js']); ?></button>
 
   <span id="saving_top" style="display: none">
   &nbsp;
@@ -73,7 +73,7 @@ if ($text_direction == 'rtl') {
   ?>
 </select>
 <noscript>
-  <input type="submit" name="setlanguage" value="<?php echo ts('Change language', array('escape' => 'js')); ?>" />
+  <button type="submit" name="setlanguage"><?php echo ts('Change language', ['escape' => 'js']); ?></button>
 </noscript>
 <span class="testResults">
   <?php
@@ -135,7 +135,7 @@ if ($text_direction == 'rtl') {
     <span class="testResults">Check this box to pre-populate CiviCRM with sample English contact records, online contribution pages, profile forms, etc. These examples can help you learn about CiviCRM features.</span><br />
 </p>
 
-<p style="margin-left: 2em"><input type="submit" value="<?php echo ts('Re-check requirements', array('escape' => 'js')); ?>" /></p>
+<p style="margin-left: 2em"><button type="submit"><?php echo ts('Re-check requirements', ['escape' => 'js']); ?></button></p>
 
 <a name="dbDetails">
 
diff --git a/civicrm/js/Common.js b/civicrm/js/Common.js
index 88c8c44b8ea1d794710699173d89ae1e084e820a..3a4ddbdf989c318c050970a28b61a26e6709b630 100644
--- a/civicrm/js/Common.js
+++ b/civicrm/js/Common.js
@@ -145,32 +145,6 @@ function showHideByValue(trigger_field_id, trigger_value, target_element_id, tar
 }
 
 var submitcount = 0;
-/**
- * Old submit-once function. Will be removed soon.
- * @deprecated
- */
-function submitOnce(obj, formId, procText) {
-  // if named button clicked, change text
-  if (obj.value != null) {
-    cj('input[name=' + obj.name + ']').val(procText + " ...");
-  }
-  cj(obj).closest('form').attr('data-warn-changes', 'false');
-  if (document.getElementById) { // disable submit button for newer browsers
-    cj('input[name=' + obj.name + ']').attr("disabled", true);
-    document.getElementById(formId).submit();
-    return true;
-  }
-  else { // for older browsers
-    if (submitcount == 0) {
-      submitcount++;
-      return true;
-    }
-    else {
-      alert("Your request is currently being processed ... Please wait.");
-      return false;
-    }
-  }
-}
 
 /**
  * Function to show / hide the row in optionFields
@@ -218,7 +192,7 @@ if (!CRM.vars) CRM.vars = {};
   $.propHooks.disabled = {
     set: function (el, value, name) {
       // Sync button enabled status with wrapper css
-      if ($(el).is('span.crm-button > input.crm-form-submit')) {
+      if ($(el).is('.crm-button.crm-form-submit')) {
         $(el).parent().toggleClass('crm-button-disabled', !!value);
       }
       // Sync button enabled status with dialog button
@@ -275,6 +249,11 @@ if (!CRM.vars) CRM.vars = {};
         opts = placeholder || placeholder === '' ? '' : '[value!=""]';
       $elect.find('option' + opts).remove();
       var newOptions = CRM.utils.renderOptions(options, val);
+      if (options.length == 0) {
+        $elect.removeClass('required');
+      } else if ($elect.hasClass('crm-field-required') && !$elect.hasClass('required')) {
+        $elect.addClass('required');
+      }
       if (typeof placeholder === 'string') {
         if ($elect.is('[multiple]')) {
           select.attr('placeholder', placeholder);
@@ -315,6 +294,17 @@ if (!CRM.vars) CRM.vars = {};
     return rendered;
   };
 
+  CRM.utils.getOptions = function(select) {
+    var options = [];
+    $('option', select).each(function() {
+      var option = {key: $(this).attr('value'), value: $(this).text()};
+      if (option.key !== '') {
+        options.push(option);
+      }
+    });
+    return options;
+  };
+
   function chainSelect() {
     var $form = $(this).closest('form'),
       $target = $('select[data-name="' + $(this).data('target') + '"]', $form),
@@ -997,7 +987,7 @@ if (!CRM.vars) CRM.vars = {};
       $('form[data-submit-once]', e.target)
         .submit(submitOnceForm)
         .on('invalid-form', submitFormInvalid);
-      $('form[data-submit-once] input[type=submit]', e.target).click(function(e) {
+      $('form[data-submit-once] button[type=submit]', e.target).click(function(e) {
         submitButton = e.target;
       });
     })
@@ -1337,7 +1327,7 @@ if (!CRM.vars) CRM.vars = {};
       setTimeout(function () {
         ele.one('change', function () {
           if (msg && msg.close) msg.close();
-          ele.removeClass('error');
+          ele.removeClass('crm-error');
           label.removeClass('crm-error');
         });
       }, 1000);
diff --git a/civicrm/js/angular-crmResource/all.js b/civicrm/js/angular-crmResource/all.js
index e8eca721b59a5eab9a25ad4323737d9e7e9fc97d..356a582407b997921f773ae65f5dab5fda9b8574 100644
--- a/civicrm/js/angular-crmResource/all.js
+++ b/civicrm/js/angular-crmResource/all.js
@@ -34,9 +34,9 @@
 
     var moduleUrl = CRM.angular.bundleUrl;
     $http.get(moduleUrl)
-      .success(function httpSuccess(data) {
+      .then(function httpSuccess(response) {
         templates = [];
-        angular.forEach(data, function(module) {
+        angular.forEach(response.data, function(module) {
           if (module.partials) {
             angular.extend(templates, module.partials);
           }
@@ -45,8 +45,7 @@
           }
         });
         notify();
-      })
-      .error(function httpError() {
+      }, function httpError() {
         templates = [];
         notify();
       });
diff --git a/civicrm/js/crm.ajax.js b/civicrm/js/crm.ajax.js
index 9a3c3f1ce572d21cec0c0012a9a4840d339c7a83..757ebef0633562eefce72b077e916af2d5b9f155 100644
--- a/civicrm/js/crm.ajax.js
+++ b/civicrm/js/crm.ajax.js
@@ -498,7 +498,7 @@
         var buttonContainers = '.crm-submit-buttons, .action-link',
           buttons = [],
           added = [];
-        $(buttonContainers, $el).find('input.crm-form-submit, a.button, button').each(function() {
+        $(buttonContainers, $el).find('.crm-form-submit, .crm-form-xbutton, a.button, button').each(function() {
           var $el = $(this),
             label = $el.is('input') ? $el.attr('value') : $el.text(),
             identifier = $el.attr('name') || $el.attr('href');
@@ -517,12 +517,12 @@
             added.push(identifier);
           }
           // display:none causes the form to not submit when pressing "enter"
-          $el.parents(buttonContainers).css({height: 0, padding: 0, margin: 0, overflow: 'hidden'}).find('.crm-button-icon').hide();
+          $el.parents(buttonContainers).css({height: 0, padding: 0, margin: 0, overflow: 'hidden'});
         });
         $el.dialog('option', 'buttons', buttons);
       }
       // Allow a button to prevent ajax submit
-      $('input[data-no-ajax-submit=true]').click(function() {
+      $('input[data-no-ajax-submit=true], button[data-no-ajax-submit=true]').click(function() {
         $(this).closest('form').ajaxFormUnbind();
       });
       // For convenience, focus the first field
diff --git a/civicrm/js/crm.searchForm.js b/civicrm/js/crm.searchForm.js
index 42a371dcecf42d18e90d97dae3038d2992d098b7..c84d0f5ec292a549a3378a97b82a656f801b288f 100644
--- a/civicrm/js/crm.searchForm.js
+++ b/civicrm/js/crm.searchForm.js
@@ -134,7 +134,7 @@
       // When selecting a task
       .on('change', 'select#task', function(e) {
         var $form = $(this).closest('form'),
-        $go = $('input.crm-search-go-button', $form);
+        $go = $('button.crm-search-go-button', $form);
         var $selectedOption = $(this).find(':selected');
         if (!$selectedOption.val()) {
           // do not blank refresh the empty option.
diff --git a/civicrm/js/jquery/jquery.dashboard.js b/civicrm/js/jquery/jquery.dashboard.js
index 4191285449bac84b76339fa5c142b87c4a65ae9d..00c65260ec2fea76b26dac96fd512500c35c7316 100644
--- a/civicrm/js/jquery/jquery.dashboard.js
+++ b/civicrm/js/jquery/jquery.dashboard.js
@@ -526,8 +526,8 @@
         html += '<form class="widget-settings">';
         html += '  <div class="widget-settings-inner"></div>';
         html += '  <div class="widget-settings-buttons">';
-        html += '    <input id="' + widget.id + '-settings-save" class="widget-settings-save" value="Save" type="submit" />';
-        html += '    <input id="' + widget.id + '-settings-cancel" class="widget-settings-cancel" value="Cancel" type="submit" />';
+        html += '    <button id="' + widget.id + '-settings-save" class="widget-settings-save" type="submit">Save</button>';
+        html += '    <button id="' + widget.id + '-settings-cancel" class="widget-settings-cancel" type="submit">Cancel</button>';
         html += '  </div>';
         html += '</form>';
         return html;
diff --git a/civicrm/js/load-bootstrap.js b/civicrm/js/load-bootstrap.js
deleted file mode 100644
index e528805a181d832eaf3cc339fd3897401f58228b..0000000000000000000000000000000000000000
--- a/civicrm/js/load-bootstrap.js
+++ /dev/null
@@ -1,7 +0,0 @@
-// Loads a copy of shoreditch's bootstrap if bootstrap is missing
-CRM.$(function($) {
-  if (!$.isFunction($.fn.dropdown)) {
-    //CRM.loadScript(CRM.vars.api4.basePath + 'lib/shoreditch/dropdown.js');
-    //$('head').append('<link type="text/css" rel="stylesheet" href="' + CRM.vars.api4.basePath + 'lib/shoreditch/bootstrap.css" />');
-  }
-});
diff --git a/civicrm/packages/DB/DataObject.php b/civicrm/packages/DB/DataObject.php
index 2e996dd4022d772ec82f817e60b18067fe5ca4b0..31aa76822a1a444ff9027927d4551f56f93f3b10 100644
--- a/civicrm/packages/DB/DataObject.php
+++ b/civicrm/packages/DB/DataObject.php
@@ -2775,7 +2775,7 @@ class DB_DataObject extends DB_DataObject_Overload
             echo $message .= " not quite sure why this query does not have more info";
           }
           if ((defined('CIVICRM_DEBUG_LOG_QUERY') && CIVICRM_DEBUG_LOG_QUERY)) {
-            CRM_Core_Error::debug_log_message($message, FALSE, 'sql_log');
+            CRM_Core_Error::debug_log_message($message, FALSE, 'sql_log' . CIVICRM_DEBUG_LOG_QUERY);
           }
           else {
             $this->debug($message, 'query', 1);
diff --git a/civicrm/packages/HTML/QuickForm.php b/civicrm/packages/HTML/QuickForm.php
index d035dafdc8766a3d6a62253ebede3cb26bd99ac8..f4a7d03a5a07bde8eba49b33c4feb9a6a6bc9403 100644
--- a/civicrm/packages/HTML/QuickForm.php
+++ b/civicrm/packages/HTML/QuickForm.php
@@ -636,7 +636,26 @@ class HTML_QuickForm extends HTML_Common
            $elementObject->onQuickFormEvent('updateValue', null, $this);
         } else {
             $args = func_get_args();
-            $elementObject =& $this->_loadElement('addElement', $element, array_slice($args, 1));
+            if ($element === 'submit') {
+              // Hack to support https://github.com/civicrm/civicrm-core/pull/18410
+              // This can maybe get deprecation notices at some point.
+              $button = explode('_', $args[1]);
+              $type = array_pop($button);
+              $attrs = array_merge([
+                'name' => $args[2],
+                'type' => 'submit',
+                'class' => '',
+              ], $args[3]);
+              $attrs['class'] .= " crm-button crm-button-type-{$type} crm-button{$args[1]}";
+              $buttonContents = CRM_Core_Page::crmIcon('fa-check-circle')  . ' ' .  $args[2];
+              $elementObjects = &$this->createElement('xbutton', $args[1], $buttonContents, $attrs);
+              $this->setDefaultAction($args[1]);
+              $group = $this->addGroup([$elementObjects], $args[1], '', ['&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'], FALSE);
+              return $group;
+            }
+            else {
+              $elementObject =& $this->_loadElement('addElement', $element, array_slice($args, 1));
+            }
             if (PEAR::isError($elementObject)) {
                 return $elementObject;
             }
diff --git a/civicrm/packages/Net/URL.php b/civicrm/packages/Net/URL.php
deleted file mode 100644
index 8101c6afdf530f3627c91113c1dd374516383545..0000000000000000000000000000000000000000
--- a/civicrm/packages/Net/URL.php
+++ /dev/null
@@ -1,474 +0,0 @@
-<?php
-// +-----------------------------------------------------------------------+
-// | Copyright (c) 2002-2004, Richard Heyes                                |
-// | All rights reserved.                                                  |
-// |                                                                       |
-// | Redistribution and use in source and binary forms, with or without    |
-// | modification, are permitted provided that the following conditions    |
-// | are met:                                                              |
-// |                                                                       |
-// | o Redistributions of source code must retain the above copyright      |
-// |   notice, this list of conditions and the following disclaimer.       |
-// | o Redistributions in binary form must reproduce the above copyright   |
-// |   notice, this list of conditions and the following disclaimer in the |
-// |   documentation and/or other materials provided with the distribution.|
-// | o The names of the authors may not be used to endorse or promote      |
-// |   products derived from this software without specific prior written  |
-// |   permission.                                                         |
-// |                                                                       |
-// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   |
-// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     |
-// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
-// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  |
-// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
-// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      |
-// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
-// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
-// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   |
-// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
-// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  |
-// |                                                                       |
-// +-----------------------------------------------------------------------+
-// | Author: Richard Heyes <richard at php net>                            |
-// +-----------------------------------------------------------------------+
-//
-// $Id: URL.php,v 1.49 2007/06/28 14:43:07 davidc Exp $
-//
-// Net_URL Class
-
-class Net_URL
-{
-    var $options = array('encode_query_keys' => false);
-    /**
-    * Full url
-    * @var string
-    */
-    var $url;
-
-    /**
-    * Protocol
-    * @var string
-    */
-    var $protocol;
-
-    /**
-    * Username
-    * @var string
-    */
-    var $username;
-
-    /**
-    * Password
-    * @var string
-    */
-    var $password;
-
-    /**
-    * Host
-    * @var string
-    */
-    var $host;
-
-    /**
-    * Port
-    * @var integer
-    */
-    var $port;
-
-    /**
-    * Path
-    * @var string
-    */
-    var $path;
-
-    /**
-    * Query string
-    * @var array
-    */
-    var $querystring;
-
-    /**
-    * Anchor
-    * @var string
-    */
-    var $anchor;
-
-    /**
-    * Whether to use []
-    * @var bool
-    */
-    var $useBrackets;
-
-    /**
-    * PHP5 Constructor
-    *
-    * Parses the given url and stores the various parts
-    * Defaults are used in certain cases
-    *
-    * @param string $url         Optional URL
-    * @param bool   $useBrackets Whether to use square brackets when
-    *                            multiple querystrings with the same name
-    *                            exist
-    */
-    function __construct($url = null, $useBrackets = true)
-    {
-        $this->url = $url;
-        $this->useBrackets = $useBrackets;
-
-        $this->initialize();
-    }
-
-    function initialize()
-    {
-        $HTTP_SERVER_VARS  = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
-
-        $this->user        = '';
-        $this->pass        = '';
-        $this->host        = '';
-        $this->port        = 80;
-        $this->path        = '';
-        $this->querystring = array();
-        $this->anchor      = '';
-
-        // Only use defaults if not an absolute URL given
-        if (!preg_match('/^[a-z0-9]+:\/\//i', $this->url)) {
-            $this->protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http');
-
-            /**
-            * Figure out host/port
-            */
-            if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) &&
-                preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches))
-            {
-                $host = $matches[1];
-                if (!empty($matches[3])) {
-                    $port = $matches[3];
-                } else {
-                    $port = $this->getStandardPort($this->protocol);
-                }
-            }
-
-            $this->user        = '';
-            $this->pass        = '';
-            $this->host        = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost');
-            $this->port        = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol));
-            $this->path        = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/';
-            $this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null;
-            $this->anchor      = '';
-        }
-
-        // Parse the url and store the various parts
-        if (!empty($this->url)) {
-            $urlinfo = parse_url($this->url);
-
-            // Default querystring
-            $this->querystring = array();
-
-            foreach ($urlinfo as $key => $value) {
-                switch ($key) {
-                    case 'scheme':
-                        $this->protocol = $value;
-                        $this->port     = $this->getStandardPort($value);
-                        break;
-
-                    case 'user':
-                    case 'pass':
-                    case 'host':
-                    case 'port':
-                        $this->$key = $value;
-                        break;
-
-                    case 'path':
-                        if ($value{0} == '/') {
-                            $this->path = $value;
-                        } else {
-                            $path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path);
-                            $this->path = sprintf('%s/%s', $path, $value);
-                        }
-                        break;
-
-                    case 'query':
-                        $this->querystring = $this->_parseRawQueryString($value);
-                        break;
-
-                    case 'fragment':
-                        $this->anchor = $value;
-                        break;
-                }
-            }
-        }
-    }
-    /**
-    * Returns full url
-    *
-    * @return string Full url
-    * @access public
-    */
-    function getURL()
-    {
-        $querystring = $this->getQueryString();
-
-        $this->url = $this->protocol . '://'
-                   . $this->user . (!empty($this->pass) ? ':' : '')
-                   . $this->pass . (!empty($this->user) ? '@' : '')
-                   . $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port)
-                   . $this->path
-                   . (!empty($querystring) ? '?' . $querystring : '')
-                   . (!empty($this->anchor) ? '#' . $this->anchor : '');
-
-        return $this->url;
-    }
-
-    /**
-    * Adds or updates a querystring item (URL parameter).
-    * Automatically encodes parameters with rawurlencode() if $preencoded
-    *  is false.
-    * You can pass an array to $value, it gets mapped via [] in the URL if
-    * $this->useBrackets is activated.
-    *
-    * @param  string $name       Name of item
-    * @param  string $value      Value of item
-    * @param  bool   $preencoded Whether value is urlencoded or not, default = not
-    * @access public
-    */
-    function addQueryString($name, $value, $preencoded = false)
-    {
-        if ($this->getOption('encode_query_keys')) {
-            $name = rawurlencode($name);
-        }
-
-        if ($preencoded) {
-            $this->querystring[$name] = $value;
-        } else {
-            $this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value);
-        }
-    }
-
-    /**
-    * Removes a querystring item
-    *
-    * @param  string $name Name of item
-    * @access public
-    */
-    function removeQueryString($name)
-    {
-        if ($this->getOption('encode_query_keys')) {
-            $name = rawurlencode($name);
-        }
-
-        if (isset($this->querystring[$name])) {
-            unset($this->querystring[$name]);
-        }
-    }
-
-    /**
-    * Sets the querystring to literally what you supply
-    *
-    * @param  string $querystring The querystring data. Should be of the format foo=bar&x=y etc
-    * @access public
-    */
-    function addRawQueryString($querystring)
-    {
-        $this->querystring = $this->_parseRawQueryString($querystring);
-    }
-
-    /**
-    * Returns flat querystring
-    *
-    * @return string Querystring
-    * @access public
-    */
-    function getQueryString()
-    {
-        if (!empty($this->querystring)) {
-            foreach ($this->querystring as $name => $value) {
-                // Encode var name
-                $name = rawurlencode($name);
-
-                if (is_array($value)) {
-                    foreach ($value as $k => $v) {
-                        $querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v);
-                    }
-                } elseif (!is_null($value)) {
-                    $querystring[] = $name . '=' . $value;
-                } else {
-                    $querystring[] = $name;
-                }
-            }
-            $querystring = implode(ini_get('arg_separator.output'), $querystring);
-        } else {
-            $querystring = '';
-        }
-
-        return $querystring;
-    }
-
-    /**
-    * Parses raw querystring and returns an array of it
-    *
-    * @param  string  $querystring The querystring to parse
-    * @return array                An array of the querystring data
-    * @access private
-    */
-    function _parseRawQuerystring($querystring)
-    {
-        $parts  = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY);
-        $return = array();
-
-        foreach ($parts as $part) {
-            if (strpos($part, '=') !== false) {
-                $value = substr($part, strpos($part, '=') + 1);
-                $key   = substr($part, 0, strpos($part, '='));
-            } else {
-                $value = null;
-                $key   = $part;
-            }
-
-            if (!$this->getOption('encode_query_keys')) {
-                $key = rawurldecode($key);
-            }
-
-            if (preg_match('#^(.*)\[([0-9a-z_-]*)\]#i', $key, $matches)) {
-                $key = $matches[1];
-                $idx = $matches[2];
-
-                // Ensure is an array
-                if (empty($return[$key]) || !is_array($return[$key])) {
-                    $return[$key] = array();
-                }
-
-                // Add data
-                if ($idx === '') {
-                    $return[$key][] = $value;
-                } else {
-                    $return[$key][$idx] = $value;
-                }
-            } elseif (!$this->useBrackets AND !empty($return[$key])) {
-                $return[$key]   = (array)$return[$key];
-                $return[$key][] = $value;
-            } else {
-                $return[$key] = $value;
-            }
-        }
-
-        return $return;
-    }
-
-    /**
-    * Resolves //, ../ and ./ from a path and returns
-    * the result. Eg:
-    *
-    * /foo/bar/../boo.php    => /foo/boo.php
-    * /foo/bar/../../boo.php => /boo.php
-    * /foo/bar/.././/boo.php => /foo/boo.php
-    *
-    * This method can also be called statically.
-    *
-    * @param  string $path URL path to resolve
-    * @return string      The result
-    */
-    function resolvePath($path)
-    {
-        $path = explode('/', str_replace('//', '/', $path));
-
-        for ($i=0; $i<count($path); $i++) {
-            if ($path[$i] == '.') {
-                unset($path[$i]);
-                $path = array_values($path);
-                $i--;
-
-            } elseif ($path[$i] == '..' AND ($i > 1 OR ($i == 1 AND $path[0] != '') ) ) {
-                unset($path[$i]);
-                unset($path[$i-1]);
-                $path = array_values($path);
-                $i -= 2;
-
-            } elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') {
-                unset($path[$i]);
-                $path = array_values($path);
-                $i--;
-
-            } else {
-                continue;
-            }
-        }
-
-        return implode('/', $path);
-    }
-
-    /**
-    * Returns the standard port number for a protocol
-    *
-    * @param  string  $scheme The protocol to lookup
-    * @return integer         Port number or NULL if no scheme matches
-    *
-    * @author Philippe Jausions <Philippe.Jausions@11abacus.com>
-    */
-    function getStandardPort($scheme)
-    {
-        switch (strtolower($scheme)) {
-            case 'http':    return 80;
-            case 'https':   return 443;
-            case 'ftp':     return 21;
-            case 'imap':    return 143;
-            case 'imaps':   return 993;
-            case 'pop3':    return 110;
-            case 'pop3s':   return 995;
-            default:        return null;
-       }
-    }
-
-    /**
-    * Forces the URL to a particular protocol
-    *
-    * @param string  $protocol Protocol to force the URL to
-    * @param integer $port     Optional port (standard port is used by default)
-    */
-    function setProtocol($protocol, $port = null)
-    {
-        $this->protocol = $protocol;
-        $this->port     = is_null($port) ? $this->getStandardPort($protocol) : $port;
-    }
-
-    /**
-     * Set an option
-     *
-     * This function set an option
-     * to be used thorough the script.
-     *
-     * @access public
-     * @param  string $optionName  The optionname to set
-     * @param  string $value       The value of this option.
-     */
-    function setOption($optionName, $value)
-    {
-        if (!array_key_exists($optionName, $this->options)) {
-            return false;
-        }
-
-        $this->options[$optionName] = $value;
-        $this->initialize();
-    }
-
-    /**
-     * Get an option
-     *
-     * This function gets an option
-     * from the $this->options array
-     * and return it's value.
-     *
-     * @access public
-     * @param  string $opionName  The name of the option to retrieve
-     * @see    $this->options
-     */
-    function getOption($optionName)
-    {
-        if (!isset($this->options[$optionName])) {
-            return false;
-        }
-
-        return $this->options[$optionName];
-    }
-
-}
-?>
diff --git a/civicrm/packages/VERSIONS.php b/civicrm/packages/VERSIONS.php
index f1d52e0518b43f0c429dd5cb989350517cad9e74..0df6dfc83b414c0709d741232553800739c50f8d 100644
--- a/civicrm/packages/VERSIONS.php
+++ b/civicrm/packages/VERSIONS.php
@@ -113,17 +113,12 @@
  * HTML_QuickForm_advmultiselect 1.5.1      BSD 3-cl.      local changes
  * HTML_QuickForm_Controller     1.0.9      PHP 3          local changes
  * HTML_Template_IT              1.2.1      BSD 3-cl.
- * Log                           1.11.5     X11
- * Mail_mimeDecode               1.5.1      BSD 3-cl.
- * Net_URL                       1.0.15     BSD 3-cl.
+ * Mail_mimeDecode               1.5.6      BSD 3-cl.
  * Pager                         2.4.8      BSD 3-cl.
- * PEAR                          1.9.0      PHP 3.0
  * PHP_Beautifier                0.1.14     PHP 3.0
  * Services_Twilio               3.10.0     MIT
  * Validate                      0.8.2      BSD 3-cl.
  * Validate_Finance              0.5.4      BSD 3-cl.
- * XML_RPC                       1.5.3      PHP 3
- * XML_Util                      1.2.1      BSD 3-cl.
  *
  *
  * Package List: Manually installed
@@ -152,7 +147,6 @@
  * ================================
  * PayJunction      AGPL 3   by Phase2 Technology
  * PaymentExpress   AGPL 3   by Lucas Baker
- * eWAY             AGPL 3   by Dolphin Software
  *
  *
  * Package List: Unknown status
diff --git a/civicrm/packages/XML/Util.php b/civicrm/packages/XML/Util.php
deleted file mode 100644
index f5927b16cfd45bac188d11ac0a68a6fdaeeeac45..0000000000000000000000000000000000000000
--- a/civicrm/packages/XML/Util.php
+++ /dev/null
@@ -1,911 +0,0 @@
-<?php
-
-/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
-/**
- * XML_Util
- *
- * XML Utilities package
- * 
- * PHP versions 4 and 5
- *
- * LICENSE:
- *
- * Copyright (c) 2003-2008 Stephan Schmidt <schst@php.net>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- *    * Redistributions of source code must retain the above copyright
- *      notice, this list of conditions and the following disclaimer.
- *    * Redistributions in binary form must reproduce the above copyright
- *      notice, this list of conditions and the following disclaimer in the
- *      documentation and/or other materials provided with the distribution.
- *    * The name of the author may not be used to endorse or promote products
- *      derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * @category  XML
- * @package   XML_Util
- * @author    Stephan Schmidt <schst@php.net>
- * @copyright 2003-2008 Stephan Schmidt <schst@php.net>
- * @license   http://opensource.org/licenses/bsd-license New BSD License
- * @version   CVS: $Id: Util.php,v 1.38 2008/11/13 00:03:38 ashnazg Exp $
- * @link      http://pear.php.net/package/XML_Util
- */
-
-/**
- * error code for invalid chars in XML name
- */
-define('XML_UTIL_ERROR_INVALID_CHARS', 51);
-
-/**
- * error code for invalid chars in XML name
- */
-define('XML_UTIL_ERROR_INVALID_START', 52);
-
-/**
- * error code for non-scalar tag content
- */
-define('XML_UTIL_ERROR_NON_SCALAR_CONTENT', 60);
-
-/**
- * error code for missing tag name
- */
-define('XML_UTIL_ERROR_NO_TAG_NAME', 61);
-
-/**
- * replace XML entities
- */
-define('XML_UTIL_REPLACE_ENTITIES', 1);
-
-/**
- * embedd content in a CData Section
- */
-define('XML_UTIL_CDATA_SECTION', 5);
-
-/**
- * do not replace entitites
- */
-define('XML_UTIL_ENTITIES_NONE', 0);
-
-/**
- * replace all XML entitites
- * This setting will replace <, >, ", ' and &
- */
-define('XML_UTIL_ENTITIES_XML', 1);
-
-/**
- * replace only required XML entitites
- * This setting will replace <, " and &
- */
-define('XML_UTIL_ENTITIES_XML_REQUIRED', 2);
-
-/**
- * replace HTML entitites
- * @link http://www.php.net/htmlentities
- */
-define('XML_UTIL_ENTITIES_HTML', 3);
-
-/**
- * Collapse all empty tags.
- */
-define('XML_UTIL_COLLAPSE_ALL', 1);
-
-/**
- * Collapse only empty XHTML tags that have no end tag.
- */
-define('XML_UTIL_COLLAPSE_XHTML_ONLY', 2);
-
-/**
- * utility class for working with XML documents
- *
-
- * @category  XML
- * @package   XML_Util
- * @author    Stephan Schmidt <schst@php.net>
- * @copyright 2003-2008 Stephan Schmidt <schst@php.net>
- * @license   http://opensource.org/licenses/bsd-license New BSD License
- * @version   Release: 1.2.1
- * @link      http://pear.php.net/package/XML_Util
- */
-class XML_Util
-{
-    /**
-     * return API version
-     *
-     * @return string $version API version
-     * @access public
-     * @static
-     */
-    function apiVersion()
-    {
-        return '1.1';
-    }
-
-    /**
-     * replace XML entities
-     *
-     * With the optional second parameter, you may select, which
-     * entities should be replaced.
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // replace XML entites:
-     * $string = XML_Util::replaceEntities('This string contains < & >.');
-     * </code>
-     *
-     * With the optional third parameter, you may pass the character encoding
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // replace XML entites in UTF-8:
-     * $string = XML_Util::replaceEntities(
-     *     'This string contains < & > as well as ä, ö, ß, à and ê',
-     *     XML_UTIL_ENTITIES_HTML,
-     *     'UTF-8'
-     * );
-     * </code>
-     *
-     * @param string $string          string where XML special chars 
-     *                                should be replaced
-     * @param int    $replaceEntities setting for entities in attribute values 
-     *                                (one of XML_UTIL_ENTITIES_XML, 
-     *                                XML_UTIL_ENTITIES_XML_REQUIRED, 
-     *                                XML_UTIL_ENTITIES_HTML)
-     * @param string $encoding        encoding value (if any)...
-     *                                must be a valid encoding as determined
-     *                                by the htmlentities() function
-     *
-     * @return string string with replaced chars
-     * @access public
-     * @static
-     * @see reverseEntities()
-     */
-    function replaceEntities($string, $replaceEntities = XML_UTIL_ENTITIES_XML,
-        $encoding = 'ISO-8859-1')
-    {
-        switch ($replaceEntities) {
-        case XML_UTIL_ENTITIES_XML:
-            return strtr($string, array(
-                '&'  => '&amp;',
-                '>'  => '&gt;',
-                '<'  => '&lt;',
-                '"'  => '&quot;',
-                '\'' => '&apos;' ));
-            break;
-        case XML_UTIL_ENTITIES_XML_REQUIRED:
-            return strtr($string, array(
-                '&' => '&amp;',
-                '<' => '&lt;',
-                '"' => '&quot;' ));
-            break;
-        case XML_UTIL_ENTITIES_HTML:
-            return htmlentities($string, ENT_COMPAT, $encoding);
-            break;
-        }
-        return $string;
-    }
-
-    /**
-     * reverse XML entities
-     *
-     * With the optional second parameter, you may select, which
-     * entities should be reversed.
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // reverse XML entites:
-     * $string = XML_Util::reverseEntities('This string contains &lt; &amp; &gt;.');
-     * </code>
-     *
-     * With the optional third parameter, you may pass the character encoding
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // reverse XML entites in UTF-8:
-     * $string = XML_Util::reverseEntities(
-     *     'This string contains &lt; &amp; &gt; as well as'
-     *     . ' &auml;, &ouml;, &szlig;, &agrave; and &ecirc;',
-     *     XML_UTIL_ENTITIES_HTML,
-     *     'UTF-8'
-     * );
-     * </code>
-     *
-     * @param string $string          string where XML special chars 
-     *                                should be replaced
-     * @param int    $replaceEntities setting for entities in attribute values 
-     *                                (one of XML_UTIL_ENTITIES_XML, 
-     *                                XML_UTIL_ENTITIES_XML_REQUIRED, 
-     *                                XML_UTIL_ENTITIES_HTML)
-     * @param string $encoding        encoding value (if any)...
-     *                                must be a valid encoding as determined
-     *                                by the html_entity_decode() function
-     *
-     * @return string string with replaced chars
-     * @access public
-     * @static
-     * @see replaceEntities()
-     */
-    function reverseEntities($string, $replaceEntities = XML_UTIL_ENTITIES_XML,
-        $encoding = 'ISO-8859-1')
-    {
-        switch ($replaceEntities) {
-        case XML_UTIL_ENTITIES_XML:
-            return strtr($string, array(
-                '&amp;'  => '&',
-                '&gt;'   => '>',
-                '&lt;'   => '<',
-                '&quot;' => '"',
-                '&apos;' => '\'' ));
-            break;
-        case XML_UTIL_ENTITIES_XML_REQUIRED:
-            return strtr($string, array(
-                '&amp;'  => '&',
-                '&lt;'   => '<',
-                '&quot;' => '"' ));
-            break;
-        case XML_UTIL_ENTITIES_HTML:
-            return html_entity_decode($string, ENT_COMPAT, $encoding);
-            break;
-        }
-        return $string;
-    }
-
-    /**
-     * build an xml declaration
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // get an XML declaration:
-     * $xmlDecl = XML_Util::getXMLDeclaration('1.0', 'UTF-8', true);
-     * </code>
-     *
-     * @param string $version    xml version
-     * @param string $encoding   character encoding
-     * @param bool   $standalone document is standalone (or not)
-     *
-     * @return string xml declaration
-     * @access public
-     * @static
-     * @uses attributesToString() to serialize the attributes of the XML declaration
-     */
-    function getXMLDeclaration($version = '1.0', $encoding = null, 
-        $standalone = null)
-    {
-        $attributes = array(
-            'version' => $version,
-        );
-        // add encoding
-        if ($encoding !== null) {
-            $attributes['encoding'] = $encoding;
-        }
-        // add standalone, if specified
-        if ($standalone !== null) {
-            $attributes['standalone'] = $standalone ? 'yes' : 'no';
-        }
-
-        return sprintf('<?xml%s?>', 
-            XML_Util::attributesToString($attributes, false));
-    }
-
-    /**
-     * build a document type declaration
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // get a doctype declaration:
-     * $xmlDecl = XML_Util::getDocTypeDeclaration('rootTag','myDocType.dtd');
-     * </code>
-     *
-     * @param string $root        name of the root tag
-     * @param string $uri         uri of the doctype definition 
-     *                            (or array with uri and public id)
-     * @param string $internalDtd internal dtd entries
-     *
-     * @return string doctype declaration
-     * @access public
-     * @static
-     * @since 0.2
-     */
-    function getDocTypeDeclaration($root, $uri = null, $internalDtd = null)
-    {
-        if (is_array($uri)) {
-            $ref = sprintf(' PUBLIC "%s" "%s"', $uri['id'], $uri['uri']);
-        } elseif (!empty($uri)) {
-            $ref = sprintf(' SYSTEM "%s"', $uri);
-        } else {
-            $ref = '';
-        }
-
-        if (empty($internalDtd)) {
-            return sprintf('<!DOCTYPE %s%s>', $root, $ref);
-        } else {
-            return sprintf("<!DOCTYPE %s%s [\n%s\n]>", $root, $ref, $internalDtd);
-        }
-    }
-
-    /**
-     * create string representation of an attribute list
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // build an attribute string
-     * $att = array(
-     *              'foo'   =>  'bar',
-     *              'argh'  =>  'tomato'
-     *            );
-     *
-     * $attList = XML_Util::attributesToString($att);
-     * </code>
-     *
-     * @param array      $attributes attribute array
-     * @param bool|array $sort       sort attribute list alphabetically, 
-     *                               may also be an assoc array containing 
-     *                               the keys 'sort', 'multiline', 'indent', 
-     *                               'linebreak' and 'entities'
-     * @param bool       $multiline  use linebreaks, if more than 
-     *                               one attribute is given
-     * @param string     $indent     string used for indentation of 
-     *                               multiline attributes
-     * @param string     $linebreak  string used for linebreaks of 
-     *                               multiline attributes
-     * @param int        $entities   setting for entities in attribute values 
-     *                               (one of XML_UTIL_ENTITIES_NONE, 
-     *                               XML_UTIL_ENTITIES_XML, 
-     *                               XML_UTIL_ENTITIES_XML_REQUIRED, 
-     *                               XML_UTIL_ENTITIES_HTML)
-     *
-     * @return string string representation of the attributes
-     * @access public
-     * @static
-     * @uses replaceEntities() to replace XML entities in attribute values
-     * @todo allow sort also to be an options array
-     */
-    function attributesToString($attributes, $sort = true, $multiline = false, 
-        $indent = '    ', $linebreak = "\n", $entities = XML_UTIL_ENTITIES_XML)
-    {
-        /*
-         * second parameter may be an array
-         */
-        if (is_array($sort)) {
-            if (isset($sort['multiline'])) {
-                $multiline = $sort['multiline'];
-            }
-            if (isset($sort['indent'])) {
-                $indent = $sort['indent'];
-            }
-            if (isset($sort['linebreak'])) {
-                $multiline = $sort['linebreak'];
-            }
-            if (isset($sort['entities'])) {
-                $entities = $sort['entities'];
-            }
-            if (isset($sort['sort'])) {
-                $sort = $sort['sort'];
-            } else {
-                $sort = true;
-            }
-        }
-        $string = '';
-        if (is_array($attributes) && !empty($attributes)) {
-            if ($sort) {
-                ksort($attributes);
-            }
-            if ( !$multiline || count($attributes) == 1) {
-                foreach ($attributes as $key => $value) {
-                    if ($entities != XML_UTIL_ENTITIES_NONE) {
-                        if ($entities === XML_UTIL_CDATA_SECTION) {
-                            $entities = XML_UTIL_ENTITIES_XML;
-                        }
-                        $value = XML_Util::replaceEntities($value, $entities);
-                    }
-                    $string .= ' ' . $key . '="' . $value . '"';
-                }
-            } else {
-                $first = true;
-                foreach ($attributes as $key => $value) {
-                    if ($entities != XML_UTIL_ENTITIES_NONE) {
-                        $value = XML_Util::replaceEntities($value, $entities);
-                    }
-                    if ($first) {
-                        $string .= ' ' . $key . '="' . $value . '"';
-                        $first   = false;
-                    } else {
-                        $string .= $linebreak . $indent . $key . '="' . $value . '"';
-                    }
-                }
-            }
-        }
-        return $string;
-    }
-
-    /**
-     * Collapses empty tags.
-     *
-     * @param string $xml  XML
-     * @param int    $mode Whether to collapse all empty tags (XML_UTIL_COLLAPSE_ALL)
-     *                      or only XHTML (XML_UTIL_COLLAPSE_XHTML_ONLY) ones.
-     *
-     * @return string XML
-     * @access public
-     * @static
-     * @todo PEAR CS - unable to avoid "space after open parens" error
-     *       in the IF branch
-     */
-    function collapseEmptyTags($xml, $mode = XML_UTIL_COLLAPSE_ALL) 
-    {
-        if ($mode == XML_UTIL_COLLAPSE_XHTML_ONLY) {
-            return preg_replace(
-                '/<(area|base(?:font)?|br|col|frame|hr|img|input|isindex|link|meta|'
-                . 'param)([^>]*)><\/\\1>/s',
-                '<\\1\\2 />',
-                $xml);
-        } else {
-            return preg_replace('/<(\w+)([^>]*)><\/\\1>/s', '<\\1\\2 />', $xml);
-        }
-    }
-
-    /**
-     * create a tag
-     *
-     * This method will call XML_Util::createTagFromArray(), which
-     * is more flexible.
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // create an XML tag:
-     * $tag = XML_Util::createTag('myNs:myTag', 
-     *     array('foo' => 'bar'), 
-     *     'This is inside the tag', 
-     *     'http://www.w3c.org/myNs#');
-     * </code>
-     *
-     * @param string $qname           qualified tagname (including namespace)
-     * @param array  $attributes      array containg attributes
-     * @param mixed  $content         the content
-     * @param string $namespaceUri    URI of the namespace
-     * @param int    $replaceEntities whether to replace XML special chars in 
-     *                                content, embedd it in a CData section 
-     *                                or none of both
-     * @param bool   $multiline       whether to create a multiline tag where 
-     *                                each attribute gets written to a single line
-     * @param string $indent          string used to indent attributes 
-     *                                (_auto indents attributes so they start 
-     *                                at the same column)
-     * @param string $linebreak       string used for linebreaks
-     * @param bool   $sortAttributes  Whether to sort the attributes or not
-     *
-     * @return string XML tag
-     * @access public
-     * @static
-     * @see createTagFromArray()
-     * @uses createTagFromArray() to create the tag
-     */
-    function createTag($qname, $attributes = array(), $content = null, 
-        $namespaceUri = null, $replaceEntities = XML_UTIL_REPLACE_ENTITIES, 
-        $multiline = false, $indent = '_auto', $linebreak = "\n", 
-        $sortAttributes = true)
-    {
-        $tag = array(
-            'qname'      => $qname,
-            'attributes' => $attributes
-        );
-
-        // add tag content
-        if ($content !== null) {
-            $tag['content'] = $content;
-        }
-
-        // add namespace Uri
-        if ($namespaceUri !== null) {
-            $tag['namespaceUri'] = $namespaceUri;
-        }
-
-        return XML_Util::createTagFromArray($tag, $replaceEntities, $multiline, 
-            $indent, $linebreak, $sortAttributes);
-    }
-
-    /**
-     * create a tag from an array
-     * this method awaits an array in the following format
-     * <pre>
-     * array(
-     *     // qualified name of the tag
-     *     'qname' => $qname        
-     *
-     *     // namespace prefix (optional, if qname is specified or no namespace)
-     *     'namespace' => $namespace    
-     *
-     *     // local part of the tagname (optional, if qname is specified)
-     *     'localpart' => $localpart,   
-     *
-     *     // array containing all attributes (optional)
-     *     'attributes' => array(),      
-     *
-     *     // tag content (optional)
-     *     'content' => $content,     
-     *
-     *     // namespaceUri for the given namespace (optional)
-     *     'namespaceUri' => $namespaceUri 
-     * )
-     * </pre>
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * $tag = array(
-     *     'qname'        => 'foo:bar',
-     *     'namespaceUri' => 'http://foo.com',
-     *     'attributes'   => array('key' => 'value', 'argh' => 'fruit&vegetable'),
-     *     'content'      => 'I\'m inside the tag',
-     * );
-     * // creating a tag with qualified name and namespaceUri
-     * $string = XML_Util::createTagFromArray($tag);
-     * </code>
-     *
-     * @param array  $tag             tag definition
-     * @param int    $replaceEntities whether to replace XML special chars in 
-     *                                content, embedd it in a CData section 
-     *                                or none of both
-     * @param bool   $multiline       whether to create a multiline tag where each 
-     *                                attribute gets written to a single line
-     * @param string $indent          string used to indent attributes 
-     *                                (_auto indents attributes so they start 
-     *                                at the same column)
-     * @param string $linebreak       string used for linebreaks
-     * @param bool   $sortAttributes  Whether to sort the attributes or not
-     *
-     * @return string XML tag
-     * @access public
-     * @static
-     * @see createTag()
-     * @uses attributesToString() to serialize the attributes of the tag
-     * @uses splitQualifiedName() to get local part and namespace of a qualified name
-     * @uses createCDataSection()
-     * @uses raiseError()
-     */
-    function createTagFromArray($tag, $replaceEntities = XML_UTIL_REPLACE_ENTITIES,
-        $multiline = false, $indent = '_auto', $linebreak = "\n", 
-        $sortAttributes = true)
-    {
-        if (isset($tag['content']) && !is_scalar($tag['content'])) {
-            return XML_Util::raiseError('Supplied non-scalar value as tag content',
-            XML_UTIL_ERROR_NON_SCALAR_CONTENT);
-        }
-
-        if (!isset($tag['qname']) && !isset($tag['localPart'])) {
-            return XML_Util::raiseError('You must either supply a qualified name '
-                . '(qname) or local tag name (localPart).', 
-                XML_UTIL_ERROR_NO_TAG_NAME);
-        }
-
-        // if no attributes hav been set, use empty attributes
-        if (!isset($tag['attributes']) || !is_array($tag['attributes'])) {
-            $tag['attributes'] = array();
-        }
-
-        if (isset($tag['namespaces'])) {
-            foreach ($tag['namespaces'] as $ns => $uri) {
-                $tag['attributes']['xmlns:' . $ns] = $uri;
-            }
-        }
-
-        if (!isset($tag['qname'])) {
-            // qualified name is not given
-
-            // check for namespace
-            if (isset($tag['namespace']) && !empty($tag['namespace'])) {
-                $tag['qname'] = $tag['namespace'] . ':' . $tag['localPart'];
-            } else {
-                $tag['qname'] = $tag['localPart'];
-            }
-        } elseif (isset($tag['namespaceUri']) && !isset($tag['namespace'])) {
-            // namespace URI is set, but no namespace
-
-            $parts = XML_Util::splitQualifiedName($tag['qname']);
-
-            $tag['localPart'] = $parts['localPart'];
-            if (isset($parts['namespace'])) {
-                $tag['namespace'] = $parts['namespace'];
-            }
-        }
-
-        if (isset($tag['namespaceUri']) && !empty($tag['namespaceUri'])) {
-            // is a namespace given
-            if (isset($tag['namespace']) && !empty($tag['namespace'])) {
-                $tag['attributes']['xmlns:' . $tag['namespace']] =
-                    $tag['namespaceUri'];
-            } else {
-                // define this Uri as the default namespace
-                $tag['attributes']['xmlns'] = $tag['namespaceUri'];
-            }
-        }
-
-        // check for multiline attributes
-        if ($multiline === true) {
-            if ($indent === '_auto') {
-                $indent = str_repeat(' ', (strlen($tag['qname'])+2));
-            }
-        }
-
-        // create attribute list
-        $attList = XML_Util::attributesToString($tag['attributes'], 
-            $sortAttributes, $multiline, $indent, $linebreak, $replaceEntities);
-        if (!isset($tag['content']) || (string)$tag['content'] == '') {
-            $tag = sprintf('<%s%s />', $tag['qname'], $attList);
-        } else {
-            switch ($replaceEntities) {
-            case XML_UTIL_ENTITIES_NONE:
-                break;
-            case XML_UTIL_CDATA_SECTION:
-                $tag['content'] = XML_Util::createCDataSection($tag['content']);
-                break;
-            default:
-                $tag['content'] = XML_Util::replaceEntities($tag['content'], 
-                    $replaceEntities);
-                break;
-            }
-            $tag = sprintf('<%s%s>%s</%s>', $tag['qname'], $attList, $tag['content'],
-                $tag['qname']);
-        }
-        return $tag;
-    }
-
-    /**
-     * create a start element
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // create an XML start element:
-     * $tag = XML_Util::createStartElement('myNs:myTag', 
-     *     array('foo' => 'bar') ,'http://www.w3c.org/myNs#');
-     * </code>
-     *
-     * @param string $qname          qualified tagname (including namespace)
-     * @param array  $attributes     array containg attributes
-     * @param string $namespaceUri   URI of the namespace
-     * @param bool   $multiline      whether to create a multiline tag where each 
-     *                               attribute gets written to a single line
-     * @param string $indent         string used to indent attributes (_auto indents
-     *                               attributes so they start at the same column)
-     * @param string $linebreak      string used for linebreaks
-     * @param bool   $sortAttributes Whether to sort the attributes or not
-     *
-     * @return string XML start element
-     * @access public
-     * @static
-     * @see createEndElement(), createTag()
-     */
-    function createStartElement($qname, $attributes = array(), $namespaceUri = null,
-        $multiline = false, $indent = '_auto', $linebreak = "\n", 
-        $sortAttributes = true)
-    {
-        // if no attributes hav been set, use empty attributes
-        if (!isset($attributes) || !is_array($attributes)) {
-            $attributes = array();
-        }
-
-        if ($namespaceUri != null) {
-            $parts = XML_Util::splitQualifiedName($qname);
-        }
-
-        // check for multiline attributes
-        if ($multiline === true) {
-            if ($indent === '_auto') {
-                $indent = str_repeat(' ', (strlen($qname)+2));
-            }
-        }
-
-        if ($namespaceUri != null) {
-            // is a namespace given
-            if (isset($parts['namespace']) && !empty($parts['namespace'])) {
-                $attributes['xmlns:' . $parts['namespace']] = $namespaceUri;
-            } else {
-                // define this Uri as the default namespace
-                $attributes['xmlns'] = $namespaceUri;
-            }
-        }
-
-        // create attribute list
-        $attList = XML_Util::attributesToString($attributes, $sortAttributes, 
-            $multiline, $indent, $linebreak);
-        $element = sprintf('<%s%s>', $qname, $attList);
-        return  $element;
-    }
-
-    /**
-     * create an end element
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // create an XML start element:
-     * $tag = XML_Util::createEndElement('myNs:myTag');
-     * </code>
-     *
-     * @param string $qname qualified tagname (including namespace)
-     *
-     * @return string XML end element
-     * @access public
-     * @static
-     * @see createStartElement(), createTag()
-     */
-    function createEndElement($qname)
-    {
-        $element = sprintf('</%s>', $qname);
-        return $element;
-    }
-
-    /**
-     * create an XML comment
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // create an XML start element:
-     * $tag = XML_Util::createComment('I am a comment');
-     * </code>
-     *
-     * @param string $content content of the comment
-     *
-     * @return string XML comment
-     * @access public
-     * @static
-     */
-    function createComment($content)
-    {
-        $comment = sprintf('<!-- %s -->', $content);
-        return $comment;
-    }
-
-    /**
-     * create a CData section
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // create a CData section
-     * $tag = XML_Util::createCDataSection('I am content.');
-     * </code>
-     *
-     * @param string $data data of the CData section
-     *
-     * @return string CData section with content
-     * @access public
-     * @static
-     */
-    function createCDataSection($data)
-    {
-        return sprintf('<![CDATA[%s]]>', 
-            preg_replace('/\]\]>/', ']]]]><![CDATA[>', strval($data)));
-
-    }
-
-    /**
-     * split qualified name and return namespace and local part
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // split qualified tag
-     * $parts = XML_Util::splitQualifiedName('xslt:stylesheet');
-     * </code>
-     * the returned array will contain two elements:
-     * <pre>
-     * array(
-     *     'namespace' => 'xslt',
-     *     'localPart' => 'stylesheet'
-     * );
-     * </pre>
-     *
-     * @param string $qname     qualified tag name
-     * @param string $defaultNs default namespace (optional)
-     *
-     * @return array array containing namespace and local part
-     * @access public
-     * @static
-     */
-    function splitQualifiedName($qname, $defaultNs = null)
-    {
-        if (strstr($qname, ':')) {
-            $tmp = explode(':', $qname);
-            return array(
-                'namespace' => $tmp[0],
-                'localPart' => $tmp[1]
-            );
-        }
-        return array(
-            'namespace' => $defaultNs,
-            'localPart' => $qname
-        );
-    }
-
-    /**
-     * check, whether string is valid XML name
-     *
-     * <p>XML names are used for tagname, attribute names and various
-     * other, lesser known entities.</p>
-     * <p>An XML name may only consist of alphanumeric characters,
-     * dashes, undescores and periods, and has to start with a letter
-     * or an underscore.</p>
-     *
-     * <code>
-     * require_once 'XML/Util.php';
-     *
-     * // verify tag name
-     * $result = XML_Util::isValidName('invalidTag?');
-     * if (is_a($result, 'PEAR_Error')) {
-     *    print 'Invalid XML name: ' . $result->getMessage();
-     * }
-     * </code>
-     *
-     * @param string $string string that should be checked
-     *
-     * @return mixed true, if string is a valid XML name, PEAR error otherwise
-     * @access public
-     * @static
-     * @todo support for other charsets
-     * @todo PEAR CS - unable to avoid 85-char limit on second preg_match
-     */
-    function isValidName($string)
-    {
-        // check for invalid chars
-        if (!preg_match('/^[[:alpha:]_]$/', $string{0})) {
-            return XML_Util::raiseError('XML names may only start with letter '
-                . 'or underscore', XML_UTIL_ERROR_INVALID_START);
-        }
-
-        // check for invalid chars
-        if (!preg_match('/^([[:alpha:]_]([[:alnum:]\-\.]*)?:)?[[:alpha:]_]([[:alnum:]\_\-\.]+)?$/',
-            $string)
-        ) {
-            return XML_Util::raiseError('XML names may only contain alphanumeric '
-                . 'chars, period, hyphen, colon and underscores', 
-                XML_UTIL_ERROR_INVALID_CHARS);
-        }
-        // XML name is valid
-        return true;
-    }
-
-    /**
-     * replacement for XML_Util::raiseError
-     *
-     * Avoids the necessity to always require
-     * PEAR.php
-     *
-     * @param string $msg  error message
-     * @param int    $code error code
-     *
-     * @return PEAR_Error
-     * @access public
-     * @static
-     * @todo PEAR CS - should this use include_once instead?
-     */
-    function raiseError($msg, $code)
-    {
-        require_once 'PEAR.php';
-        return PEAR::raiseError($msg, $code);
-    }
-}
-?>
diff --git a/civicrm/packages/eWAY/eWAY_GatewayRequest.php b/civicrm/packages/eWAY/eWAY_GatewayRequest.php
deleted file mode 100644
index 3a833ff6437fee5906c19b3ecfccd563c4b7870f..0000000000000000000000000000000000000000
--- a/civicrm/packages/eWAY/eWAY_GatewayRequest.php
+++ /dev/null
@@ -1,242 +0,0 @@
-<?php
-
-/*
- +--------------------------------------------------------------------+
- | CiviCRM version 5                                                  |
- +--------------------------------------------------------------------+
- | This file is a part of CiviCRM.                                    |
- |                                                                    |
- | CiviCRM is free software; you can copy, modify, and distribute it  |
- | under the terms of the GNU Affero General Public License           |
- | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
- |                                                                    |
- | CiviCRM is distributed in the hope that it will be useful, but     |
- | WITHOUT ANY WARRANTY; without even the implied warranty of         |
- | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
- | See the GNU Affero General Public License for more details.        |
- |                                                                    |
- | You should have received a copy of the GNU Affero General Public   |
- | License and the CiviCRM Licensing Exception along                  |
- | with this program; if not, contact CiviCRM LLC                     |
- | at info[AT]civicrm[DOT]org. If you have questions about the        |
- | GNU Affero General Public License or the licensing of CiviCRM,     |
- | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
- +--------------------------------------------------------------------+
-*/
-
-/**************************************************************************************************************************
- * Licensed to CiviCRM under the Academic Free License version 3.0
- * Written & Contributed by Dolphin Software P/L - March 2008 
- *
- * 'eWAY_GatewayRequest.php' - Based on the standard supplied eWay sample code 'GatewayResponse.php'
- *
- * The only significant change from the original is that the 'CVN' field is uncommented,
- * unlike the distributed sample code.
- *
- * ALSO: Added a 'GetTransactionNumber' function.
- *
- **************************************************************************************************************************/
- 
-class GatewayRequest
-{
-	var $txCustomerID = "";
-
-	var $txAmount = 0;
-
-	var $txCardholderName = "";
-
-	var $txCardNumber = "";
-
-	var $txCardExpiryMonth = "01";
-
-	var $txCardExpiryYear = "00";
-
-	var $txTransactionNumber = "";
-
-	var $txCardholderFirstName = "";
-
-	var $txCardholderLastName = "";
-
-	var $txCardholderEmailAddress = "";
-
-	var $txCardholderAddress = "";
-
-	var $txCardholderPostalCode = "";
-
-	var $txInvoiceReference = "";
-
-	var $txInvoiceDescription = "";
-
-    var $txCVN = "";
-
-	var $txOption1 = "";
-
-	var $txOption2 = "";
-
-	var $txOption3 = "";
-    
-    var $txCustomerBillingCountry = "";
-
-    var $txCustomerIPAddress = "";
-
-   function __construct()
-   {
-      // Empty Constructor
-   }
-
-   function GetTransactionNumber()
-   {
-      return $this->txTransactionNumber;
-   }
-
-   function EwayCustomerID($value) 
-   {
-      $this->txCustomerID=$value;
-   }
-
-   function InvoiceAmount($value)
-   {
-      $this->txAmount=$value;
-   }
-
-   function CardHolderName($value)
-   {
-      $this->txCardholderName=$value;
-   }
-
-   function CardExpiryMonth($value)  
-   {
-      $this->txCardExpiryMonth=$value;
-   }
-
-   function CardExpiryYear($value)
-   {
-      $this->txCardExpiryYear=$value;
-   }
-
-   function TransactionNumber($value)
-   {
-      $this->txTransactionNumber=$value;
-   }
-
-   function PurchaserFirstName($value)
-   {
-      $this->txCardholderFirstName=$value;
-   }
-
-   function PurchaserLastName($value)
-   {
-      $this->txCardholderLastName=$value;
-   }
-
-   function CardNumber($value)
-   {
-      $this->txCardNumber=$value;
-   }
-
-   function PurchaserAddress($value)
-   {
-      $this->txCardholderAddress=$value;
-   }
-
-   function PurchaserPostalCode($value)
-   {
-      $this->txCardholderPostalCode=$value;
-   }
-
-   function PurchaserEmailAddress($value)
-   {
-      $this->txCardholderEmailAddress=$value;
-   }
-
-   function InvoiceReference($value) 
-   {
-      $this->txInvoiceReference=$value; 
-   }
-
-   function InvoiceDescription($value) 
-   {
-      $this->txInvoiceDescription=$value; 
-   }
-
-   function CVN($value) 
-   {
-      $this->txCVN=$value; 
-   }
-
-   function EwayOption1($value) 
-   {
-      $this->txOption1=$value; 
-   }
-
-   function EwayOption2($value) 
-   {
-      $this->txOption2=$value; 
-   }
-
-   function EwayOption3($value) 
-   {
-      $this->txOption3=$value; 
-   }
-
-   function CustomerBillingCountry($value) 
-   {
-       $this->txCustomerBillingCountry=$value; 
-   }
-
-   function CustomerIPAddress($value) 
-   {
-       $this->txCustomerIPAddress=$value; 
-   }
-
-   function ToXml()
-   {
-      // We don't really need the overhead of creating an XML DOM object
-      // to really just concatenate a string together.
-
-      $xml = "<ewaygateway>";
-      $xml .= $this->CreateNode("ewayCustomerID",                 $this->txCustomerID);
-      $xml .= $this->CreateNode("ewayTotalAmount",                $this->txAmount);
-      $xml .= $this->CreateNode("ewayCardHoldersName",            $this->txCardholderName);
-      $xml .= $this->CreateNode("ewayCardNumber",                 $this->txCardNumber);
-      $xml .= $this->CreateNode("ewayCardExpiryMonth",            $this->txCardExpiryMonth);
-      $xml .= $this->CreateNode("ewayCardExpiryYear",             $this->txCardExpiryYear);
-      $xml .= $this->CreateNode("ewayTrxnNumber",                 $this->txTransactionNumber);
-      $xml .= $this->CreateNode("ewayCustomerInvoiceDescription", $this->txInvoiceDescription);
-      $xml .= $this->CreateNode("ewayCustomerFirstName",          $this->txCardholderFirstName);
-      $xml .= $this->CreateNode("ewayCustomerLastName",           $this->txCardholderLastName);
-      $xml .= $this->CreateNode("ewayCustomerEmail",              $this->txCardholderEmailAddress);
-      $xml .= $this->CreateNode("ewayCustomerAddress",            $this->txCardholderAddress);
-      $xml .= $this->CreateNode("ewayCustomerPostcode",           $this->txCardholderPostalCode);
-      $xml .= $this->CreateNode("ewayCustomerInvoiceRef",         $this->txInvoiceReference);
-      $xml .= $this->CreateNode("ewayCVN",                        $this->txCVN);
-      $xml .= $this->CreateNode("ewayOption1",                    $this->txOption1);
-      $xml .= $this->CreateNode("ewayOption2",                    $this->txOption2);
-      $xml .= $this->CreateNode("ewayOption3",                    $this->txOption3);
-      $xml .= $this->CreateNode("ewayCustomerIPAddress",          $this->txCustomerIPAddress);
-      $xml .= $this->CreateNode("ewayCustomerBillingCountry",     $this->txCustomerBillingCountry);
-      $xml .= "</ewaygateway>";
-      
-      return $xml;
-   }
-   
-   
-   /********************************************************
-   * Builds a simple XML Node
-   *
-   * 'NodeName' is the anem of the node being created.
-   * 'NodeValue' is its value
-   *
-   ********************************************************/
-   function CreateNode($NodeName, $NodeValue)
-   {
-    require_once 'XML/Util.php';
-
-    $xml = new XML_Util();
-    $node = "<" . $NodeName . ">" . $xml->replaceEntities($NodeValue) . "</" . $NodeName . ">";
-    return $node;
-   }
-   
-} // class GatewayRequest
-
-?>
diff --git a/civicrm/packages/eWAY/eWAY_GatewayResponse.php b/civicrm/packages/eWAY/eWAY_GatewayResponse.php
deleted file mode 100644
index 5217063a7cc65122fddcbe4790c58f294a45c3fd..0000000000000000000000000000000000000000
--- a/civicrm/packages/eWAY/eWAY_GatewayResponse.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-
-/*
- +--------------------------------------------------------------------+
- | CiviCRM version 5                                                  |
- +--------------------------------------------------------------------+
- | This file is a part of CiviCRM.                                    |
- |                                                                    |
- | CiviCRM is free software; you can copy, modify, and distribute it  |
- | under the terms of the GNU Affero General Public License           |
- | Version 3, 19 November 2007 and the CiviCRM Licensing Exception.   |
- |                                                                    |
- | CiviCRM is distributed in the hope that it will be useful, but     |
- | WITHOUT ANY WARRANTY; without even the implied warranty of         |
- | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.               |
- | See the GNU Affero General Public License for more details.        |
- |                                                                    |
- | You should have received a copy of the GNU Affero General Public   |
- | License and the CiviCRM Licensing Exception along                  |
- | with this program; if not, contact CiviCRM LLC                     |
- | at info[AT]civicrm[DOT]org. If you have questions about the        |
- | GNU Affero General Public License or the licensing of CiviCRM,     |
- | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
- +--------------------------------------------------------------------+
-*/
-
-/**************************************************************************************************************************
- * Licensed to CiviCRM under the Academic Free License version 3.0
- * Written & Contributed by Dolphin Software P/L - March 2008 
- *
- * 'eWAY_GatewayResponse.php' - Loosley based on the standard supplied eWay sample code 'GatewayResponse.php'
- *
- * The 'simplexml_load_string' has been removed as it was causing major issues
- * with Drupal V5.7 / CiviCRM 1.9 installtion's Home page. 
- * Filling the Home page with "Warning: session_start() [function.session-start]: Node no longer exists in ..." messages
- *
- * Found web reference indicating 'simplexml_load_string' was a probable cause.
- * As soon as 'simplexml_load_string' was removed the problem fixed itself.
- *
- * Additionally the '$txStatus' var has been set as a string rather than a boolean.
- * This is because the returned $params['trxn_result_code'] is in fact a string and not a boolean.
- **************************************************************************************************************************/
- 
-class GatewayResponse
-{
-	var $txAmount              = 0;
-	var $txTransactionNumber   = "";
-	var $txInvoiceReference    = "";
-	var $txOption1             = "";
-	var $txOption2             = "";
-	var $txOption3             = "";
-	var $txStatus              = "";
-	var $txAuthCode            = "";
-	var $txError               = "";
-    var $txBeagleScore         = "";
-
-	function __construct()
-	{
-	   // Empty Constructor
-    }
-   
-	function ProcessResponse($Xml)
-	{
-#####################################################################################
-#                                                                                   #
-#      $xtr = simplexml_load_string($Xml) or die ("Unable to load XML string!");    #
-#                                                                                   #
-#      $this->txError             = $xtr->ewayTrxnError;                            #
-#      $this->txStatus            = $xtr->ewayTrxnStatus;                           #
-#      $this->txTransactionNumber = $xtr->ewayTrxnNumber;                           #
-#      $this->txOption1           = $xtr->ewayTrxnOption1;                          #
-#      $this->txOption2           = $xtr->ewayTrxnOption2;                          #
-#      $this->txOption3           = $xtr->ewayTrxnOption3;                          #
-#      $this->txAmount            = $xtr->ewayReturnAmount;                         #
-#      $this->txAuthCode          = $xtr->ewayAuthCode;                             #
-#      $this->txInvoiceReference  = $xtr->ewayTrxnReference;                        #
-#                                                                                   #
-#####################################################################################
-
-      $this->txError             = self::GetNodeValue("ewayTrxnError", $Xml);
-      $this->txStatus            = self::GetNodeValue("ewayTrxnStatus", $Xml);
-      $this->txTransactionNumber = self::GetNodeValue("ewayTrxnNumber", $Xml);
-      $this->txOption1           = self::GetNodeValue("ewayTrxnOption1", $Xml);
-      $this->txOption2           = self::GetNodeValue("ewayTrxnOption2", $Xml);
-      $this->txOption3           = self::GetNodeValue("ewayTrxnOption3", $Xml);
-      $amount                    = self::GetNodeValue("ewayReturnAmount", $Xml);
-      $this->txAuthCode          = self::GetNodeValue("ewayAuthCode", $Xml);
-      $this->txInvoiceReference  = self::GetNodeValue("ewayTrxnReference", $Xml);
-      $this->txBeagleScore       = self::GetNodeValue("ewayBeagleScore", $Xml);
-      $this->txAmount = (int) $amount;
-   }
-   
-   
-   /************************************************************************
-   * Simple function to use in place of the 'simplexml_load_string' call.
-   * 
-   * It returns the NodeValue for a given NodeName
-   * or returns and empty string.
-   ************************************************************************/
-   function GetNodeValue($NodeName, &$strXML)
-   {
-      $OpeningNodeName = "<" . $NodeName . ">";
-      $ClosingNodeName = "</" . $NodeName . ">";
-      
-      $pos1 = stripos($strXML, $OpeningNodeName);
-      $pos2 = stripos($strXML, $ClosingNodeName);
-      
-      if ( ($pos1 === false) || ($pos2 === false) )
-         return "";
-         
-      $pos1 += strlen($OpeningNodeName);
-      $len   = $pos2 - $pos1;
-
-      $return = substr($strXML, $pos1, $len);                                       
-      
-      return ($return);
-   }
-   
-
-   function TransactionNumber()
-   {
-      return $this->txTransactionNumber; 
-   }
-
-   function InvoiceReference() 
-   {
-      return $this->txInvoiceReference; 
-   }
-
-   function Option1() 
-   {
-      return $this->txOption1; 
-   }
-
-   function Option2() 
-   {
-      return $this->txOption2; 
-   }
-
-   function Option3() 
-   {
-      return $this->txOption3; 
-   }
-
-   function AuthorisationCode()
-   {
-      return $this->txAuthCode; 
-   }
-
-   function Error()
-   {
-      return $this->txError; 
-   }   
-
-   function Amount() 
-   {
-      return $this->txAmount; 
-   }   
-
-   function Status()
-   {
-      return $this->txStatus;
-   }
-
-   function BeagleScore ()
-   {
-       return $this->txBeagleScore ;
-   }
-}
-
-?>
diff --git a/civicrm/release-notes.md b/civicrm/release-notes.md
index d8e085523bc70105adcad03ee7b977627bbeb817..629f07707eb4030d846db665e7e2a0466ead8dab 100644
--- a/civicrm/release-notes.md
+++ b/civicrm/release-notes.md
@@ -15,6 +15,17 @@ Other resources for identifying changes are:
     * https://github.com/civicrm/civicrm-joomla
     * https://github.com/civicrm/civicrm-wordpress
 
+## CiviCRM 5.31.0
+
+Released November 5, 2020
+
+- **[Synopsis](release-notes/5.31.0.md#synopsis)**
+- **[Features](release-notes/5.31.0.md#features)**
+- **[Bugs resolved](release-notes/5.31.0.md#bugs)**
+- **[Miscellany](release-notes/5.31.0.md#misc)**
+- **[Credits](release-notes/5.31.0.md#credits)**
+- **[Feedback](release-notes/5.31.0.md#feedback)**
+
 ## CiviCRM 5.30.1
 
 Released October 21, 2020
diff --git a/civicrm/release-notes/5.31.0.md b/civicrm/release-notes/5.31.0.md
new file mode 100644
index 0000000000000000000000000000000000000000..16ef08777c7134313f4bc7ae7c2656f5aa4664d4
--- /dev/null
+++ b/civicrm/release-notes/5.31.0.md
@@ -0,0 +1,1236 @@
+# CiviCRM 5.31.0
+
+Released November 5, 2020
+
+- **[Synopsis](#synopsis)**
+- **[Features](#features)**
+- **[Bugs resolved](#bugs)**
+- **[Miscellany](#misc)**
+- **[Credits](#credits)**
+- **[Feedback](#feedback)**
+
+## <a name="synopsis"></a>Synopsis
+
+| *Does this version...?*                                         |         |
+|:--------------------------------------------------------------- |:-------:|
+| Fix security vulnerabilities?                                   |   no    |
+| **Change the database schema?**                                 | **yes** |
+| **Alter the API?**                                              | **yes** |
+| **Require attention to configuration options?**                 | **yes** |
+| **Fix problems installing or upgrading to a previous version?** | **yes** |
+| **Introduce features?**                                         | **yes** |
+| **Fix bugs?**                                                   | **yes** |
+
+## <a name="features"></a>Features
+
+### Core CiviCRM
+
+- **Implement more nuanced "Administer CiviCRM" permisions
+  ([16482](https://github.com/civicrm/civicrm-core/pull/16482) and
+  [18671](https://github.com/civicrm/civicrm-core/pull/18671))**
+
+  Actions that required the "Administer CiviCRM" permission now require one of
+  two separate permissions: "administer CiviCRM system" and "administer CiviCRM
+  data".  The "Administer CiviCRM" permission still exists, and users having it
+  are treated as implicitly having both of the new permissions.
+
+  However, it is now possible to grant permission to configure profiles,
+  scheduled reminders, and set admin-only price options independently of
+  granting permission to configure scheduled jobs, install extensions, and view
+  the system check.  An organization might grant the former to senior staff and
+  the latter to technical staff.
+
+- **Buttonrama ([18410](https://github.com/civicrm/civicrm-core/pull/18410),
+  [18820](https://github.com/civicrm/civicrm-core/pull/18820),
+  [18834](https://github.com/civicrm/civicrm-core/pull/18834),
+  [18799](https://github.com/civicrm/civicrm-core/pull/18799), and
+  [307](https://github.com/civicrm/civicrm-packages/pull/307))**
+
+  This ensures icons and text within buttons are aligned vertically, and it
+  makes form buttons appear consistent with links that are rendered to appear
+  like buttons.
+
+  Specifically, most buttons are now `<button>` elements rather than `<input
+  type="button">`, and button styling now applies to the button itself rather
+  than a wrapper.  Extension and theme developers should confirm that CSS and
+  DOM selectors accurately identify the intended button elements.
+
+- **Custom field form reform
+  ([18419](https://github.com/civicrm/civicrm-core/pull/18419))**
+
+  This improves the form for creating or updating custom fields by improving
+  validation, making defaults easier to select, and allowing more flexibility
+  around changing the widget type.
+
+- **Add higher-level support for "bundles" and "collections" of resources
+  ([18247](https://github.com/civicrm/civicrm-core/pull/18247))**
+
+  "Resources" refers to CSS, Javascript, and DOM variables that developers can
+  add to certain pages.  These can now be bundled together to reduce redundant
+  code and can be modified with the new `hook_civicrm_alterBundle()`.
+
+  The core styles and other resources are now included as bundles, allowing them
+  to be modified in a standard way.
+
+  In addition, page regions, bundles, and (to some extent) page resources are
+  now treated as "collections" which share a common interface for adding and
+  retrieving individual resources.
+
+- **Bootstrap3 CSS
+  ([dev/user-interface#27](https://lab.civicrm.org/dev/user-interface/-/issues/27):
+  [18354](https://github.com/civicrm/civicrm-core/pull/18354),
+  [18465](https://github.com/civicrm/civicrm-core/pull/18465),
+  [18550](https://github.com/civicrm/civicrm-core/pull/18550),
+  [18583](https://github.com/civicrm/civicrm-core/pull/18583), and
+  [18579](https://github.com/civicrm/civicrm-core/pull/18579))**
+
+  CiviCRM introduced a theming system several years ago, but the existing look
+  and feel was left as a "default", with the *de facto* theming code spread
+  throughout the application.  The new themes have generally used Bootstrap 3 as
+  a user interface framework.
+
+  A handful of new CiviCRM features have been developed that depend on Bootstrap
+  3 for core functionality or at least for basic look and feel.  Sites lacking a
+  newer theme need a way to load at least a minimal set of Bootstrap 3 code for
+  these features to be functional and attractive.
+
+  This change introduces a new CiviCRM theme extension, named "Greenwich", that
+  is enabled and hidden by default for all sites.  It provides Bootstrap 3 when
+  needed.  In addition, it can serve as a vehicle for moving theming code out of
+  core.
+
+- **APIv4 Search: Improve GROUP_CONCAT with :label prefix
+  ([18572](https://github.com/civicrm/civicrm-core/pull/18572))**
+
+  This improves the Search UI by exposing the DISTINCT modifier and fixing
+  currency formatting.
+
+- **Search ext: rename to Search Kit, mark as beta
+  ([18672](https://github.com/civicrm/civicrm-core/pull/18672))**
+
+  An extension to replace the search user interface has been included, but
+  hidden, in CiviCRM for several months.  Named Search Kit, it is now available
+  to be enabled for sites.
+
+- **Search extension: edit smart groups
+  ([18431](https://github.com/civicrm/civicrm-core/pull/18431))**
+
+  Search Kit can now edit smart groups.  When installed, the "edit smart group
+  criteria" link will open the classic search forms or Search Kit as
+  appropriate.
+
+- **Search ext: support complex joins & HAVING clause in api4 smart groups
+  ([18644](https://github.com/civicrm/civicrm-core/pull/18644))**
+
+  Improves the new search extension and APIv4 smart groups in core to support
+  any entity that can join with Contact, including full support for calculated
+  fields and the HAVING clause.
+
+- **Select field fixes for screen reader
+  ([17675](https://github.com/civicrm/civicrm-core/pull/17675),
+  [18873](https://github.com/civicrm/civicrm-core/pull/18873),
+  [18889](https://github.com/civicrm/civicrm-core/pull/18889))**
+
+  The placeholder text for select drop-down fields now reflects the field label.
+  The Select2 widget makes it difficult for screen readers to identify the
+  field's label, so this helps identify the field for users who rely on screen
+  readers.
+
+- **Add modified_date to list of activity tokens
+  ([18611](https://github.com/civicrm/civicrm-core/pull/18611))**
+
+  Adds Modified date to the list of available activity tokens.
+
+- **Add an 'Execute Now' button to the job log
+  ([18593](https://github.com/civicrm/civicrm-core/pull/18593))**
+
+  Adds an "Execute Now" button to the Job log to make it easier to rerun a
+  scheduled job if needed.
+
+- **Send email to contacts when clicking on their email address on the contact's
+  card ([dev/core#1790](https://lab.civicrm.org/dev/core/-/issues/1790):
+  [18623](https://github.com/civicrm/civicrm-core/pull/18623))**
+
+  Improves the contact card by making the email a link which takes the user to a
+  form to send an email to that contact.
+
+- **Ability to Search Smart or Normal Group using additional filter on Manage
+  Group page ([dev/report#45](https://lab.civicrm.org/dev/report/-/issues/45):
+  [18379](https://github.com/civicrm/civicrm-core/pull/18379) and
+  [18246](https://github.com/civicrm/civicrm-core/pull/18246))**
+
+  Adds a filter "Group Type" to the Manage Groups page which can be used
+  to filter by normal or smart groups.
+
+- **Ability to Send Invoice with modified subject and CC it
+  ([dev/user-interface#30](https://lab.civicrm.org/dev/user-interface/-/issues/30):
+  [18286](https://github.com/civicrm/civicrm-core/pull/18286))**
+
+  Adds the ability to edit the subject and cc fields when emailing an invoice
+  from a contribution.
+
+- **Add ability to segment query logs
+  ([dev/core#2032](https://lab.civicrm.org/dev/core/-/issues/2032):
+  [18471](https://github.com/civicrm/civicrm-core/pull/18471) and
+  [309](https://github.com/civicrm/civicrm-packages/pull/309))**
+
+  SQL queries can be sent to a debugging log when the `CIVICRM_DEBUG_LOG_QUERY`
+  environment variable is set. Now, the value of that variable can specify a
+  file name for the log.
+
+### CiviContribute
+
+- **Move ACls on LineItem create to financialacls core extension
+  ([18339](https://github.com/civicrm/civicrm-core/pull/18339))**
+
+  Simplifies the code base by moving the financial ACL handling from the
+  LineItem BAO to the financialacls core extension.
+
+- **Convert core processors to use Guzzle and bring them under CI (Work Towards
+  [dev/financial#143](https://lab.civicrm.org/dev/financial/-/issues/143):
+  [18350](https://github.com/civicrm/civicrm-core/pull/18350))**
+
+  The PayPal Pro payment processor integration now uses the Guzzle library for
+  HTTP requests.  This improves consistency and allows for unit testing of the
+  request handling.
+
+- **Migrate Eway(Single Currency) Payment Processor Type out into its own
+  extension ([18349](https://github.com/civicrm/civicrm-core/pull/18349))**
+
+  The Eway payment processor is now a separate extension, albeit shipped with
+  core.
+
+- **Make 'Record Payment' & 'Record Refund' visible regardless of whether the
+  balance 'requires' one
+  ([dev/financial#86](https://lab.civicrm.org/dev/financial/-/issues/86):
+  [18417](https://github.com/civicrm/civicrm-core/pull/18417))**
+
+  Makes it so the "Record Payment" and "Record Refund" links on Contributions
+  are always visible.
+
+- **Alter the default of send notification to contributor checkbox on cancel or
+  edit recurring to off
+  ([dev/core#1986](https://lab.civicrm.org/dev/core/-/issues/1986):
+  [18537](https://github.com/civicrm/civicrm-core/pull/18537))**
+
+  The "notify contributor" checkbox on the form to cancel or edit a recurring
+  donation is now unchecked by default.
+
+- **PCP action links support for hook_civicrm_links
+  ([dev/core#2061](https://lab.civicrm.org/dev/core/-/issues/2061):
+  [18570](https://github.com/civicrm/civicrm-core/pull/18570))**
+
+  This allows `hook_civicrm_links` to be used by extension developers to modify the
+  list of actions offered to personal campaign page creators.
+
+- **Add Line Item v4 API
+  ([dev/core#1980](https://lab.civicrm.org/dev/core/-/issues/1980):
+  [18388](https://github.com/civicrm/civicrm-core/pull/18388) and
+  [18352](https://github.com/civicrm/civicrm-core/pull/18352))**
+
+  Adds the "Line Item" entity to APIv4.
+
+- **Improve metadata on LineItem DAO
+  ([18521](https://github.com/civicrm/civicrm-core/pull/18521))**
+
+  Adds labels to line item meta data.
+
+### CiviMail
+
+- **Add options to Mail Account settings to improve inbound mail processing
+  ([18624](https://github.com/civicrm/civicrm-core/pull/18624))**
+
+  Two new options are added to the Mail Account settings form to improve inbound
+  email processing:
+
+  1. 'Skip emails which do not have a Case ID or Case token'
+  2. 'Do not create new contacts when filing emails'
+
+- **Change wording on the Opt Out and Unsubscribe pages
+  ([18338](https://github.com/civicrm/civicrm-core/pull/18338))**
+
+  Improves messaging to end user on Opt Out and Unsubscribe pages.
+
+### CiviMember
+
+- **Add custom field groups to Membership Contribution Detail report
+  ([dev/report#49](https://lab.civicrm.org/dev/report/-/issues/49):
+  [18420](https://github.com/civicrm/civicrm-core/pull/18420))**
+
+  Contact custom fields are now available on the Membership Contribution Detail
+  report.
+
+### Drupal Integration
+
+- **Drupal 9 deprecations
+  ([dev/drupal#138](https://lab.civicrm.org/dev/drupal/-/issues/138):
+  [18461](https://github.com/civicrm/civicrm-core/pull/18461))**
+
+  Drupal now allows for smooth upgrades between major versions by gradually
+  introducing new API functions and deprecating others through the cycle of a
+  major version.  A new major version starts by simply removing deprecated
+  function from the latest release of the prior major version.
+
+  This removes the use of a number of functions that have been deprecated since
+  Drupal 8.5 and are removed in Drupal 9.  The result is that CiviCRM 5.31 is no
+  longer compatible with Drupal versions prior to 8.5 but is compatible with
+  Drupal 9.
+
+- **Finish allowing use of SSL to connect to database
+  (Work Towards [dev/core#1926](https://lab.civicrm.org/dev/core/-/issues/1926):
+  [18264](https://github.com/civicrm/civicrm-core/pull/18264))**
+
+  The setup screen now attempts to identify if the Drupal database connection
+  uses SSL and fills the configuration options to match.
+
+- **drush civicrm-ext-list add ext's status filter and show version number
+  ([597](https://github.com/civicrm/civicrm-drupal/pull/597))**
+
+  Extends the drush command `drush civicrm-ext-list` so that users can:
+
+   - Filter by the extension's status (installed, uninstalled, disabled)
+   - Show the extension version number in the result list
+   - Use the `--out` option to print results as json or as a pretty table
+
+## <a name="bugs"></a>Bugs resolved
+
+### Core CiviCRM
+
+- **"Network Error" when sorting contact search results by City, Postcode or
+  Country ([dev/core#2132](https://lab.civicrm.org/dev/core/-/issues/2132):
+  [18857](https://github.com/civicrm/civicrm-core/pull/18857))**
+
+- **Public contribution form and Checksums: billing information not loaded if
+  using multiple processors
+  ([dev/core#334](https://lab.civicrm.org/dev/core/-/issues/334):
+  [18642](https://github.com/civicrm/civicrm-core/pull/18642))**
+
+  Custom data tables for contacts are now created with the charset and collation
+  to match the `civicrm_contact` table.
+
+  This resolves a bug when the billing information is not filled when visiting a
+  contribution page with multiple payment processors via a checksum link.
+
+- **Deadlocks on acl_cache
+  (Work Towards [dev/core#1486](https://lab.civicrm.org/dev/core/-/issues/1486):
+  [18403](https://github.com/civicrm/civicrm-core/pull/18403))**
+
+  Removes foreign keys from the ACL cache tables as they are likely to
+  hinder performance.
+
+- **APIv4 - revisit required parameters on location entities
+  ([dev/core#2044](https://lab.civicrm.org/dev/core/-/issues/2044):
+  [18575](https://github.com/civicrm/civicrm-core/pull/18575))**
+
+  Makes it so that APIv4 can be used for creating event locations by making
+  contact_id optional for the Address, Phone and Email entities.
+
+- **Eliminate "No extensions available for this version of CiviCRM"
+  ([dev/core#2063](https://lab.civicrm.org/dev/core/-/issues/2063):
+  [18596](https://github.com/civicrm/civicrm-core/pull/18596))**
+
+  Fixes warning thrown when no public extensions directory is found.
+
+- **Group ids in profile fields are not correct
+  ([dev/core#2125](https://lab.civicrm.org/dev/core/-/issues/2125):
+  [18776](https://github.com/civicrm/civicrm-core/pull/18776))**
+
+  Fixes DB errors when using the groups field in a profile.
+
+- **Drupal 7 + 9 Groups dont show in edit with version 5.30.1
+  ([dev/core#2136](https://lab.civicrm.org/dev/core/-/issues/2136):
+  [18831](https://github.com/civicrm/civicrm-core/pull/18831))**
+
+- **Rebuild triggers after utf8mb4 conversion
+  ([18751](https://github.com/civicrm/civicrm-core/pull/18751))**
+
+  When the `System.utf8conversion` API call is run, this ensures that the
+  triggers for relationship_cache are updated to use the right encoding.
+
+- **Remove explicit COLLATE utf8_bin from RelationshipCache trigger
+  ([18721](https://github.com/civicrm/civicrm-core/pull/18721))**
+
+  Ensure that relationship types can be edited after switching to utf8mb4.
+
+- **Fix way of identifying custom serialized fields
+  ([18360](https://github.com/civicrm/civicrm-core/pull/18360))**
+
+  Removes references to field types that no longer exist, specifically the
+  'Multi-Select', 'Multi-Select State/Province', and 'Multi-Select Country',
+  custom field types, which were all removed in 5.27.
+
+- **Exclude api4 from IDS check
+  ([18695](https://github.com/civicrm/civicrm-core/pull/18695))**
+
+  Fixes false-positive "suspicious activity" warnings in the IDS (Intrusion
+  Detection System) when using APIv4.
+
+- **Fix complexity on cache key
+  ([18650](https://github.com/civicrm/civicrm-core/pull/18650))**
+
+  Ensures that the cacheKey does not cross-populate values from different users.
+
+- **Use title instead name in status message
+  ([18406](https://github.com/civicrm/civicrm-core/pull/18406))**
+
+  Fixes help text when an option group is saved to show the title of the option
+  group instead of the name.
+
+- **Export fix on long custom fields
+  ([18146](https://github.com/civicrm/civicrm-core/pull/18146))**
+
+  This resolves problems exporting custom fields that have long option values.
+
+- **Contact form task delete php spelling fix
+  ([18399](https://github.com/civicrm/civicrm-core/pull/18399))**
+
+- **Component Titles are not translated on the Configuration Checklist page
+  ([dev/translation#54](https://lab.civicrm.org/dev/translation/-/issues/54):
+  [18690](https://github.com/civicrm/civicrm-core/pull/18690))**
+
+- **Error when viewing contact merged to permanently deleted contact
+  ([dev/core#1838](https://lab.civicrm.org/dev/core/-/issues/1838):
+  [18564](https://github.com/civicrm/civicrm-core/pull/18564))**
+
+  When one contact is merged to another contact, the first contact remains in
+  the trash and refers to the second.  However, there was a bug preventing that
+  first contact from being viewed if the second contact was deleted permanently.
+
+- **E_WARNING when editing custom field with trigger-based logging turned on
+  ([dev/core#1989](https://lab.civicrm.org/dev/core/-/issues/1989):
+  [18386](https://github.com/civicrm/civicrm-core/pull/18386))**
+
+- **Northern Ireland / Wales counties are out of date
+  ([dev/core#2027](https://lab.civicrm.org/dev/core/-/issues/2027):
+  [18470](https://github.com/civicrm/civicrm-core/pull/18470))**
+
+- **Multiple email activity cc recipients get scrunched together in recorded
+  activity details field
+  ([dev/core#2040](https://lab.civicrm.org/dev/core/-/issues/2040):
+  [18504](https://github.com/civicrm/civicrm-core/pull/18504))**
+
+- **When exporting for composer-style deployment, exclude the `.gitignore` file
+  ([18673](https://github.com/civicrm/civicrm-core/pull/18673))**
+
+- **Fix patently silly code
+  ([18652](https://github.com/civicrm/civicrm-core/pull/18652))**
+
+- **Fix cache bypass
+  ([18643](https://github.com/civicrm/civicrm-core/pull/18643))**
+
+- **Fix bug in primary handling where TRUE rather than 1 used
+  ([18598](https://github.com/civicrm/civicrm-core/pull/18598))**
+
+- **Greenwich - fix conflict btw bootstrap & jQuery UI button
+  ([18696](https://github.com/civicrm/civicrm-core/pull/18696))**
+
+- **Remove double exception handling in repeattransaction
+  ([18594](https://github.com/civicrm/civicrm-core/pull/18594))**
+
+- **Preferred Language in a profile doesn't show/behave as required when so
+  configured ([dev/core#1883](https://lab.civicrm.org/dev/core/-/issues/1883):
+  [18595](https://github.com/civicrm/civicrm-core/pull/18595))**
+
+- **Fix deprecation notice
+  ([18541](https://github.com/civicrm/civicrm-core/pull/18541))**
+
+- **Replace '&' to 'and' in button label
+  ([18405](https://github.com/civicrm/civicrm-core/pull/18405))**
+
+- **Performance - meta issue for hunting down memory leaks
+  ([dev/core#2073](https://lab.civicrm.org/dev/core/-/issues/2073):
+  [18640](https://github.com/civicrm/civicrm-core/pull/18640),
+  [18701](https://github.com/civicrm/civicrm-core/pull/18701),
+  [18699](https://github.com/civicrm/civicrm-core/pull/18699),
+  [18702](https://github.com/civicrm/civicrm-core/pull/18702),
+  [18700](https://github.com/civicrm/civicrm-core/pull/18700),
+  [18692](https://github.com/civicrm/civicrm-core/pull/18692),
+  [18693](https://github.com/civicrm/civicrm-core/pull/18693),
+  [18633](https://github.com/civicrm/civicrm-core/pull/18633),
+  [18641](https://github.com/civicrm/civicrm-core/pull/18641) and
+  [18632](https://github.com/civicrm/civicrm-core/pull/18632))**
+
+- **E_NOTICE viewing an activity that has no details contents
+  ([dev/core#2075](https://lab.civicrm.org/dev/core/-/issues/2075):
+  [18637](https://github.com/civicrm/civicrm-core/pull/18637))**
+
+- **Undefined index on contact's activity tab when there's an activity that has
+  no With Contact
+  ([dev/core#2090](https://lab.civicrm.org/dev/core/-/issues/2090):
+  [18669](https://github.com/civicrm/civicrm-core/pull/18669))**
+
+- **Undefined index 'class' on new individual form
+  ([dev/core#2093](https://lab.civicrm.org/dev/core/-/issues/2093):
+  [18678](https://github.com/civicrm/civicrm-core/pull/18678))**
+
+- **Deprecation warnings when making thank-you letters
+  ([dev/core#2108](https://lab.civicrm.org/dev/core/-/issues/2108):
+  [18717](https://github.com/civicrm/civicrm-core/pull/18717) and
+  [18716](https://github.com/civicrm/civicrm-core/pull/18716))**
+
+  This affects all PDF letters.
+
+- **Fix the output of the full text custom search form
+  ([18890](https://github.com/civicrm/civicrm-core/pull/18890))**
+
+  This resolves styling issues on the full text search form.
+
+- **For countries without a province N/A is not accepted as a state in a profile
+  ([dev/core#2149](https://lab.civicrm.org/dev/core/-/issues/2149):
+  [18877](https://github.com/civicrm/civicrm-core/pull/18877))**
+
+- **IN operator not working in Search
+  ([dev/core#2147](https://lab.civicrm.org/dev/core/-/issues/2147):
+  [18898](https://github.com/civicrm/civicrm-core/pull/18898))**
+
+  This changes the group search field in the basic "Find Contacts" search back
+  to a plain select drop-down rather than a Select2 widget.
+
+### CiviCampaign
+
+- **Fix default report permissions when creating reports from CiviCampaign
+  ([18493](https://github.com/civicrm/civicrm-core/pull/18493))**
+
+  Ensures that CiviCampaign report titles are not accessible to users without
+  proper permissions to view the report.
+
+### CiviCase
+
+- **Incorrect comparison of status_id when changing status of linked cases
+  ([dev/core#1979](https://lab.civicrm.org/dev/core/-/issues/1979):
+  [18309](https://github.com/civicrm/civicrm-core/pull/18309))**
+
+### CiviContribute
+
+- **View Payment owned by Different contact on Membership and Participant View.
+  ([dev/report#48](https://lab.civicrm.org/dev/report/-/issues/48):
+  [18281](https://github.com/civicrm/civicrm-core/pull/18281))**
+
+  This ensures that related payments are displayed when viewing a Membership or
+  Participant even if they come from a different contact.
+
+- **Dropdown for country seems to have reverted to a regular select instead of
+  select2 ([dev/core#2030](https://lab.civicrm.org/dev/core/-/issues/2030):
+  [18533](https://github.com/civicrm/civicrm-core/pull/18533))**
+
+  This resolves a bug in the display of the Country field in the billing address
+  section of a contribution page.
+
+- **Fix formatLocaleNumericRoundedByCurrency
+  ([18409](https://github.com/civicrm/civicrm-core/pull/18409))**
+
+  Ensures that currencies are rounded to the correct decimal point instead of
+  always 2 decimal points.
+
+- **change civicrm_price_set.min_amount to float
+  ([18677](https://github.com/civicrm/civicrm-core/pull/18677))**
+
+  Updates the price set minimum amount field to be float (not int).
+
+- **Incorrect rounding up with priceset fields
+  ([dev/core#2003](https://lab.civicrm.org/dev/core/-/issues/2003):
+  [18297](https://github.com/civicrm/civicrm-core/pull/18297) and
+  [18416](https://github.com/civicrm/civicrm-core/pull/18416))**
+
+  Ensures the amount is saved to the database correctly for price field values
+  when a value is entered longer than two decimals.
+
+- **Display url_site and url_recur based on if the form elements exist
+  ([18324](https://github.com/civicrm/civicrm-core/pull/18324))**
+
+  Ensures developers can remove fields from the payment processor configuration
+  form using the build form hook.
+
+- **LineItem pre Hook non-standard on edit
+  ([dev/core#1994](https://lab.civicrm.org/dev/core/-/issues/1994):
+  [18340](https://github.com/civicrm/civicrm-core/pull/18340))**
+
+  This resolves a bug in the entity ID sent to `hook_civicrm_pre` when editing
+  line items.
+
+- **Performance - do not retrieve soft credits & pcps when not required
+  ([dev/core#2056](https://lab.civicrm.org/dev/core/-/issues/2056):
+  [18556](https://github.com/civicrm/civicrm-core/pull/18556))**
+
+- **Remove ajax timeout from contribution page on behalf of
+  ([18140](https://github.com/civicrm/civicrm-core/pull/18140))**
+
+- **property bag's setAmount should ensure dot decimal point
+  ([18429](https://github.com/civicrm/civicrm-core/pull/18429))**
+
+### CiviEvent
+
+- **Contact Dashboard does not show event registrations for non-admins
+  ([dev/event#43](https://lab.civicrm.org/dev/event/-/issues/43):
+  [18758](https://github.com/civicrm/civicrm-core/pull/18758))**
+
+- **Set participant status notification to false by default
+  ([18544](https://github.com/civicrm/civicrm-core/pull/18544))**
+
+  The "Send Notification" checkbox is now always unchecked when editing a participant's status.  Previously it would be checked by default when changing a status to "Cancelled" or from "Waitlist" or "Pending waitlist".
+
+- **ParticipantListing Report: only display the View link for web, unhardcode
+  others ([18704](https://github.com/civicrm/civicrm-core/pull/18704))**
+
+  Ensures that when exporting the Participant Listing report the view links are
+  not included.
+
+- **Scheduled reminder: "Additional recipients" receive reminders under
+  circumstances where they ought not to
+  ([dev/core#1590](https://lab.civicrm.org/dev/core/-/issues/1590):
+  [17641](https://github.com/civicrm/civicrm-core/pull/17641))**
+
+  Ensures that "Additional recipients" do not receive reminders for deleted
+  events.
+
+- **Email & Phone storage issues in event location
+  ([dev/core#1973](https://lab.civicrm.org/dev/core/-/issues/1973):
+  [18488](https://github.com/civicrm/civicrm-core/pull/18488))**
+
+  Ensures second email and phone values are saved for event locations.
+
+- **Creating new event without email fails
+  ([dev/core#2096](https://lab.civicrm.org/dev/core/-/issues/2096):
+  [18710](https://github.com/civicrm/civicrm-core/pull/18710))**
+
+- **Changing address on event hangs
+  ([dev/core#2102](https://lab.civicrm.org/dev/core/-/issues/2102):
+  [18713](https://github.com/civicrm/civicrm-core/pull/18713))**
+
+### CiviGrant
+
+- **Grant dashboard counts trashed contacts
+  ([dev/core#2009](https://lab.civicrm.org/dev/core/-/issues/2009):
+  [18428](https://github.com/civicrm/civicrm-core/pull/18428))**
+
+### CiviMail
+
+- **Possible regression on deleted contacts
+  ([dev/core#2119](https://lab.civicrm.org/dev/core/-/issues/2119):
+  [18763](https://github.com/civicrm/civicrm-core/pull/18763))**
+
+  Ensures contacts deleted after a mailing is created do not get the mailing.
+
+### CiviMember
+
+- **Membership Renewal form re 'fixMembershipBeforeRenew'
+  ([dev/membership#27](https://lab.civicrm.org/dev/membership/-/issues/27):
+  [18621](https://github.com/civicrm/civicrm-core/pull/18621))**
+
+  The status of an existing membership is now recalculated prior to loading the
+  renewal form.  This allows an accurate status to be displayed and used for
+  calculating renewal dates.
+
+- **Membership status does not get updated during membership import when status
+  override is set
+  ([dev/membership#30](https://lab.civicrm.org/dev/membership/-/issues/30):
+  [18821](https://github.com/civicrm/civicrm-core/pull/18821))**
+
+- **Bug When Restoring Overridden Status on Related Memberships
+  ([dev/core#1854](https://lab.civicrm.org/dev/core/-/issues/1854):
+  [17742](https://github.com/civicrm/civicrm-core/pull/17742))**
+
+  Ensures related memberships do not get deleted when running the membership
+  status calculation scheduled job.
+
+- **Fix for ongoing issues with static upsetting the apple cart
+  ([18245](https://github.com/civicrm/civicrm-core/pull/18245))**
+
+  Ensures that inherited relationships are created more reliably.
+
+- **Multiple Memberships Status Not updated when payment status changed from
+  pending to Completed
+  ([dev/core#1942](https://lab.civicrm.org/dev/core/-/issues/1942):
+  [18232](https://github.com/civicrm/civicrm-core/pull/18232))**
+
+- **Make period_type mandatory for MembershipType
+  ([18395](https://github.com/civicrm/civicrm-core/pull/18395))**
+
+### Backdrop Integration
+
+- **Check if BACKDROP_ROOT is defined already
+  ([18545](https://github.com/civicrm/civicrm-core/pull/18545))**
+
+  Fixes the "Constant BACKDROP_ROOT already defined..." notice.
+
+### Drupal Integration
+
+- **Make symfony aliased services public
+  ([18443](https://github.com/civicrm/civicrm-core/pull/18443))**
+
+  Fixes a warning on the extensions form for Drupal 8 sites.
+
+- **Tarball includes a symlink that goes nowhere, which causes alternate drupal
+  install method to fail
+  ([dev/core#1393](https://lab.civicrm.org/dev/core/-/issues/1393):
+  [18472](https://github.com/civicrm/civicrm-core/pull/18472),
+  [18605](https://github.com/civicrm/civicrm-core/pull/18605) and
+  [18659](https://github.com/civicrm/civicrm-core/pull/18659))**
+
+- **Exception handling - 'Allowed memory size' exhasted issues
+  ([dev/drupal#119](https://lab.civicrm.org/dev/drupal/-/issues/119):
+  [18610](https://github.com/civicrm/civicrm-core/pull/18610))**
+
+  Avoid crashes from recursion on unhandled exceptions (most often an issue in
+  Drupal 8).
+
+- **inheritLocale regression
+  ([dev/translation#51](https://lab.civicrm.org/dev/translation/-/issues/51):
+  [18447](https://github.com/civicrm/civicrm-core/pull/18447))**
+
+  Ensures that CiviCRM in multilingual mode respects the Drupal language.
+
+- **Do not block user incase 'Require approval' is checked
+  ([18329](https://github.com/civicrm/civicrm-core/pull/18329))**
+
+  Ensures users created via a profile are set to active in Drupal8 to prevent
+  issues with the email verification step.
+
+- **Fix customGroup getTableNameByEntityName to recognize all entities
+  ([18546](https://github.com/civicrm/civicrm-core/pull/18546))**
+
+  This ensures that all entities are recognized by Webform integration.
+
+- **Custom field values not showing in Drupal 7 Views filter
+  ([dev/core#1929](https://lab.civicrm.org/dev/core/-/issues/1929):
+  [611](https://github.com/civicrm/civicrm-drupal/pull/611))**
+
+- **Fix theme configuration section on Display preference and improve
+  `isFrontendPage` function for Drupal CMS
+  ([dev/core#1987](https://lab.civicrm.org/dev/core/-/issues/1987):
+  [18396](https://github.com/civicrm/civicrm-core/pull/18396) and
+  [18397](https://github.com/civicrm/civicrm-core/pull/18397))**
+
+- **Drupal 7 - Groups children now get shown with SPAN CSS error
+  ([dev/core#2105](https://lab.civicrm.org/dev/core/-/issues/2105):
+  [18719](https://github.com/civicrm/civicrm-core/pull/18719))**
+
+- **composer.json - Update compile-lib and compile-plugin
+  ([18670](https://github.com/civicrm/civicrm-core/pull/18670))**
+
+## <a name="misc"></a>Miscellany
+
+- **Take the guesswork out of rendering clientside CRM variables
+  ([18262](https://github.com/civicrm/civicrm-core/pull/18262))**
+
+- **Improve consistency of metadata type declarations
+  ([18147](https://github.com/civicrm/civicrm-core/pull/18147))**
+
+- **Use eventID rather than the object in completeTransaction
+  ([18358](https://github.com/civicrm/civicrm-core/pull/18358))**
+
+- **Load event title from participantID
+  ([18376](https://github.com/civicrm/civicrm-core/pull/18376))**
+
+- **Fix Invoice class to not call validateData
+  ([18372](https://github.com/civicrm/civicrm-core/pull/18372))**
+
+- **Finish deprecating BaseIPN->completeTransaction
+  ([18381](https://github.com/civicrm/civicrm-core/pull/18381))**
+
+- **Add postAssert to check payments and contributions are valid on all tests.
+  ([18317](https://github.com/civicrm/civicrm-core/pull/18317))**
+
+- **Switch frontend contribution form to cached/non-deprecated functions for
+  membershipTypes
+  ([18404](https://github.com/civicrm/civicrm-core/pull/18404))**
+
+- **Ensure DAO base class contains functions to be removed from generated files
+  ([18492](https://github.com/civicrm/civicrm-core/pull/18492))**
+
+- **Switch backend membership form to use non-deprecated/cached functions to get
+  membership types
+  ([18427](https://github.com/civicrm/civicrm-core/pull/18427))**
+
+- **Fix civi version for greenwich
+  ([18542](https://github.com/civicrm/civicrm-core/pull/18542))**
+
+- **Switch to passing payment_processor_id as input param to completeOrder
+  ([18528](https://github.com/civicrm/civicrm-core/pull/18528))**
+
+- **Switch membership BAO to use non-deprecated cached functions to get
+  membershipType details
+  ([18515](https://github.com/civicrm/civicrm-core/pull/18515))**
+
+- **Separate export into separate classes to allow unravelling of component
+  handling (Member)
+  ([18512](https://github.com/civicrm/civicrm-core/pull/18512))**
+
+- **Simplify CRM_Core_BAO_Location::createLocBlock by moving eventLocation
+  specific handling back to the class
+  ([18578](https://github.com/civicrm/civicrm-core/pull/18578))**
+
+- **Update the post-upgrade thank you message to include URLs to CiviCRM
+  contributors, CiviCRM members and minor rewrite
+  ([18559](https://github.com/civicrm/civicrm-core/pull/18559))**
+
+- **Simplify call to loadRelatedObjects in repeat/completetransaction
+  ([18613](https://github.com/civicrm/civicrm-core/pull/18613))**
+
+- **Move membership tab add/submit membership buttons to PHP layer
+  ([18143](https://github.com/civicrm/civicrm-core/pull/18143))**
+
+- **Remove extraneous UF match queries
+  ([dev/core#2087](https://lab.civicrm.org/dev/core/-/issues/2087):
+  [18667](https://github.com/civicrm/civicrm-core/pull/18667) and
+  [18675](https://github.com/civicrm/civicrm-core/pull/18675))**
+
+- **Can't send SMS to mailing group whose parent isn't a mailing group (Clean up
+  [dev/core#2053](https://lab.civicrm.org/dev/core/-/issues/2053):
+  [18698](https://github.com/civicrm/civicrm-core/pull/18698))**
+
+- **Merge - ensure location entities remaining on deleted contacts have
+  is_primary integrity
+  (Clean up [dev/core#2047](https://lab.civicrm.org/dev/core/-/issues/2047):
+  [18499](https://github.com/civicrm/civicrm-core/pull/18499) and
+  [18500](https://github.com/civicrm/civicrm-core/pull/18500))**
+
+- **[cq] Do not pass by reference where avoidable
+  (Work Towards [dev/core#2043](https://lab.civicrm.org/dev/core/-/issues/2043):
+  [18484](https://github.com/civicrm/civicrm-core/pull/18484) and
+  [18485](https://github.com/civicrm/civicrm-core/pull/18485))**
+
+- **Fix the Test Result (1 failure / -190)
+  E2E.Core.PrevNextTest.testDeleteByCacheKey recurring test issue
+  ([dev/core#2029](https://lab.civicrm.org/dev/core/-/issues/2029):
+  [18587](https://github.com/civicrm/civicrm-core/pull/18587) and
+  [18565](https://github.com/civicrm/civicrm-core/pull/18565))**
+
+- **SyntaxConformance::testSqlOperators cleanup fix - ensure entities are
+  deleted ([18569](https://github.com/civicrm/civicrm-core/pull/18569))**
+
+- **Move afform to be a core extension
+  ([dev/core#2000](https://lab.civicrm.org/dev/core/-/issues/2000):
+  [18423](https://github.com/civicrm/civicrm-core/pull/18423))**
+
+- **Upgrade Angular from 1.5 => 1.8
+  ([dev/core#1818](https://lab.civicrm.org/dev/core/-/issues/1818):
+  [18635](https://github.com/civicrm/civicrm-core/pull/18635))**
+
+- **Extraneous queries - activities (Work Towards
+  [dev/core#2057](https://lab.civicrm.org/dev/core/-/issues/2057):
+  [18625](https://github.com/civicrm/civicrm-core/pull/18625),
+  [18566](https://github.com/civicrm/civicrm-core/pull/18566),
+  [18609](https://github.com/civicrm/civicrm-core/pull/18609),
+  [18636](https://github.com/civicrm/civicrm-core/pull/18636) and
+  [18567](https://github.com/civicrm/civicrm-core/pull/18567))**
+
+- **Eliminate unused query on CRM_Core_BAO_CustomQuery::_construct
+  ([dev/core#2079](https://lab.civicrm.org/dev/core/-/issues/2079):
+  [18654](https://github.com/civicrm/civicrm-core/pull/18654),
+  [18653](https://github.com/civicrm/civicrm-core/pull/18653),
+  [18665](https://github.com/civicrm/civicrm-core/pull/18665),
+  [18664](https://github.com/civicrm/civicrm-core/pull/18664),
+  [18656](https://github.com/civicrm/civicrm-core/pull/18656),
+  [18657](https://github.com/civicrm/civicrm-core/pull/18657) and
+  [18655](https://github.com/civicrm/civicrm-core/pull/18655))**
+
+- **Rationalise BAO create vs add functions (Work Towards
+  [dev/core#2046](https://lab.civicrm.org/dev/core/-/issues/2046):
+  [18682](https://github.com/civicrm/civicrm-core/pull/18682),
+  [18658](https://github.com/civicrm/civicrm-core/pull/18658),
+  [18495](https://github.com/civicrm/civicrm-core/pull/18495),
+  [18588](https://github.com/civicrm/civicrm-core/pull/18588),
+  [18661](https://github.com/civicrm/civicrm-core/pull/18661),
+  [18607](https://github.com/civicrm/civicrm-core/pull/18607) and
+  [18606](https://github.com/civicrm/civicrm-core/pull/18606))**
+
+- **Address extraneous location queries
+  ([dev/core#2039](https://lab.civicrm.org/dev/core/-/issues/2039):
+  [18496](https://github.com/civicrm/civicrm-core/pull/18496),
+  [18498](https://github.com/civicrm/civicrm-core/pull/18498),
+  [18497](https://github.com/civicrm/civicrm-core/pull/18497),
+  [18494](https://github.com/civicrm/civicrm-core/pull/18494),
+  [18501](https://github.com/civicrm/civicrm-core/pull/18501),
+  [18480](https://github.com/civicrm/civicrm-core/pull/18480),
+  [18489](https://github.com/civicrm/civicrm-core/pull/18489),
+  [18684](https://github.com/civicrm/civicrm-core/pull/18684) and
+  [18663](https://github.com/civicrm/civicrm-core/pull/18663))**
+
+- **Remove unused functions (Work Towards
+  [dev/core#2017](https://lab.civicrm.org/dev/core/-/issues/2017):
+  [18662](https://github.com/civicrm/civicrm-core/pull/18662),
+  [18430](https://github.com/civicrm/civicrm-core/pull/18430),
+  [18433](https://github.com/civicrm/civicrm-core/pull/18433),
+  [18463](https://github.com/civicrm/civicrm-core/pull/18463),
+  [18458](https://github.com/civicrm/civicrm-core/pull/18458))**
+
+- **Remove unneccessary isoToDate function
+  ([dev/core#1921](https://lab.civicrm.org/dev/core/-/issues/1921):
+  [18422](https://github.com/civicrm/civicrm-core/pull/18422),
+  [18576](https://github.com/civicrm/civicrm-core/pull/18576),
+  [18359](https://github.com/civicrm/civicrm-core/pull/18359),
+  [18469](https://github.com/civicrm/civicrm-core/pull/18469),
+  [18456](https://github.com/civicrm/civicrm-core/pull/18456),
+  [18457](https://github.com/civicrm/civicrm-core/pull/18457),
+  [18374](https://github.com/civicrm/civicrm-core/pull/18374),
+  [18383](https://github.com/civicrm/civicrm-core/pull/18383) and
+  [18468](https://github.com/civicrm/civicrm-core/pull/18468))**
+
+- **Deprecate BaseIPN functions validateData & LoadObject (Work Towards
+  [dev/financial#148](https://lab.civicrm.org/dev/financial/-/issues/148):
+  [18479](https://github.com/civicrm/civicrm-core/pull/18479) and
+  [18571](https://github.com/civicrm/civicrm-core/pull/18571))**
+
+- **Separate out Search participant register form from backoffice form
+  ([dev/event#42](https://lab.civicrm.org/dev/event/-/issues/42):
+  [18486](https://github.com/civicrm/civicrm-core/pull/18486))**
+
+- **Add try catch to main loops on core ipn classes
+  ([18384](https://github.com/civicrm/civicrm-core/pull/18384))**
+
+- **Rename variable $key to $participantID to make it clear what it is
+  ([18371](https://github.com/civicrm/civicrm-core/pull/18371))**
+
+- **Stop passing / using object when all we need is the id
+  ([18331](https://github.com/civicrm/civicrm-core/pull/18331))**
+
+- **Minor code cleanup - this is only ever called from one place so component is
+  always event ([18343](https://github.com/civicrm/civicrm-core/pull/18343))**
+
+- **Membership form test cleanup, date cleanup on form
+  ([18413](https://github.com/civicrm/civicrm-core/pull/18413))**
+
+- **Search ext: misc cleanup & fixes
+  ([18723](https://github.com/civicrm/civicrm-core/pull/18723))**
+
+- **Switch to non-deprecated/cached functions for membership pricesets
+  ([18568](https://github.com/civicrm/civicrm-core/pull/18568))**
+
+- **Fix parameters for MembershipTest
+  ([18467](https://github.com/civicrm/civicrm-core/pull/18467))**
+
+- **Update code comments
+  ([18460](https://github.com/civicrm/civicrm-core/pull/18460))**
+
+- **Pass in activity type rather than calculate it
+  ([18450](https://github.com/civicrm/civicrm-core/pull/18450))**
+
+- **Move definition of userName to where it is used and remove an unused
+  parameter ([18452](https://github.com/civicrm/civicrm-core/pull/18452))**
+
+- **Minor code simplification on date handling in getMembershipStatusByDate
+  ([18421](https://github.com/civicrm/civicrm-core/pull/18421))**
+
+- **Offer singular entity titles
+  ([18434](https://github.com/civicrm/civicrm-core/pull/18434))**
+
+- **(REF) GenerateData - Make it possible to call this via PHP
+  ([18491](https://github.com/civicrm/civicrm-core/pull/18491))**
+
+- **[REF] Simplify array construction
+  ([18432](https://github.com/civicrm/civicrm-core/pull/18432))**
+
+- **[REF] minor tidy up on membershipStatus::create & add
+  ([18435](https://github.com/civicrm/civicrm-core/pull/18435))**
+
+- **[REF] Folllow up cleanup - remove now unused param
+  ([18438](https://github.com/civicrm/civicrm-core/pull/18438))**
+
+- **[REF] Start the process of separating the search action from the participant
+  form ([18464](https://github.com/civicrm/civicrm-core/pull/18464))**
+
+- **[REF] Code simplification - remove conditional chunk
+  ([18445](https://github.com/civicrm/civicrm-core/pull/18445))**
+
+- **[REF] Extract failContribution code
+  ([18418](https://github.com/civicrm/civicrm-core/pull/18418))**
+
+- **[REF] Fix visibility of afform_scanner container service for Symfony …
+  ([18505](https://github.com/civicrm/civicrm-core/pull/18505))**
+
+- **[REF] Refactor price field form to allow for unit testing of the form
+  ([18414](https://github.com/civicrm/civicrm-core/pull/18414))**
+
+- **[REF] Minor readability fix
+  ([18415](https://github.com/civicrm/civicrm-core/pull/18415))**
+
+- **[REF] change deprecated function to API4 call
+  ([18076](https://github.com/civicrm/civicrm-core/pull/18076))**
+
+- **[NFC] Cleanup in test class
+  ([18539](https://github.com/civicrm/civicrm-core/pull/18539))**
+
+- **[REF] Remove now used parameter & make function protected
+  ([18543](https://github.com/civicrm/civicrm-core/pull/18543))**
+
+- **[REF] Consolidate input params that are primarily used for the membership
+  entity action to an array
+  ([18451](https://github.com/civicrm/civicrm-core/pull/18451))**
+
+- **[REF] Extract the code to determine the DAO name into a functions
+  ([18513](https://github.com/civicrm/civicrm-core/pull/18513))**
+
+- **[REF] Fix deprecated array and string offset access using curly brace…
+  ([18529](https://github.com/civicrm/civicrm-core/pull/18529))**
+
+- **[REF] Code cleanup on membership renewal & test
+  ([18365](https://github.com/civicrm/civicrm-core/pull/18365))**
+
+- **[REF] Improve the human readable name of the eway upgrade step to be …
+  ([18401](https://github.com/civicrm/civicrm-core/pull/18401))**
+
+- **[REF] Simplify loading of related objects in transition components
+  ([18373](https://github.com/civicrm/civicrm-core/pull/18373))**
+
+- **[REF] simplify interaction with objects in complete order
+  ([18385](https://github.com/civicrm/civicrm-core/pull/18385))**
+
+- **[REF] Mark CRM_Contribute_BAO_Contribution_Utils::formatAmount deprec…
+  ([18387](https://github.com/civicrm/civicrm-core/pull/18387))**
+
+- **[REF] Swap out CRM_Utils_Array::value() - partial pull out from PR 18207
+  ([18391](https://github.com/civicrm/civicrm-core/pull/18391))**
+
+- **[REF] Remove unused lines from loadObjects
+  ([18389](https://github.com/civicrm/civicrm-core/pull/18389))**
+
+- **[REF] Ensure that all bundle container services are public for Symfon…
+  ([18368](https://github.com/civicrm/civicrm-core/pull/18368))**
+
+- **[REF] Parse ids before sending to single function (minor simplification)
+  ([18630](https://github.com/civicrm/civicrm-core/pull/18630))**
+
+- **[REF] Hide eway extension in UI and only install it if the original e…
+  ([18377](https://github.com/civicrm/civicrm-core/pull/18377))**
+
+- **[REF] Simplify logic on calling self::updateContributionStatus
+  ([18357](https://github.com/civicrm/civicrm-core/pull/18357))**
+
+- **[REF] Fix adding in the accessKey based on the button array
+  ([18674](https://github.com/civicrm/civicrm-core/pull/18674))**
+
+- **[REF] Add in frontend fields for title and description of group Schem…
+  ([18599](https://github.com/civicrm/civicrm-core/pull/18599),
+  [18925](https://github.com/civicrm/civicrm-core/pull/18925))**
+
+- **[REF] Remove unused taskName variable
+  ([18590](https://github.com/civicrm/civicrm-core/pull/18590))**
+
+- **[REF] IPN - move unshared chunk of code out of shared function
+  ([18600](https://github.com/civicrm/civicrm-core/pull/18600))**
+
+- **[REF] Paypal std ipn Move not-actually shared-code out of shared code
+  function ([18536](https://github.com/civicrm/civicrm-core/pull/18536))**
+
+- **[REF] Remove some unused params, move one to where it is used
+  ([18614](https://github.com/civicrm/civicrm-core/pull/18614))**
+
+- **[REF] Extract getOrderParams
+  ([18617](https://github.com/civicrm/civicrm-core/pull/18617))**
+
+- **[REF] Filter params in completetransaction
+  ([18321](https://github.com/civicrm/civicrm-core/pull/18321))**
+
+- **[REF] Fix compatability with Drupal 9 installing of var_dumper
+  ([18679](https://github.com/civicrm/civicrm-core/pull/18679))**
+
+- **[REF] Add test for existing Participant batch update cancel and fix to not
+  call BaseIPN->cancelled
+  ([18318](https://github.com/civicrm/civicrm-core/pull/18318))**
+
+- **[REF] Use helper function to check if multiLingual
+  ([604](https://github.com/civicrm/civicrm-drupal/pull/604))**
+
+- **[REF] Update Versions file and remove Net_URL class as doesn't appear…
+  ([310](https://github.com/civicrm/civicrm-packages/pull/310))**
+
+- **[REF] Remove Eway Libraries and XML_Util as they are now shipped as p…
+  ([306](https://github.com/civicrm/civicrm-packages/pull/306))**
+
+- **[REF] Add in css classes to make the save and preview button on the C…
+  ([18647](https://github.com/civicrm/civicrm-core/pull/18647))**
+
+- **[REF] Move daoName generation so we don't need to pass the variable name
+  ([18552](https://github.com/civicrm/civicrm-core/pull/18552))**
+
+- **[REF] Very minor cleanup
+  ([18604](https://github.com/civicrm/civicrm-core/pull/18604))**
+
+- **[REF] Fix Event location to create it's locations directly rather than via
+  shared methods ([18586](https://github.com/civicrm/civicrm-core/pull/18586))**
+
+- **[REF] Consolidate retrieval of searchFormValues
+  ([18591](https://github.com/civicrm/civicrm-core/pull/18591))**
+
+- **[REF] Include recently added core extensions into distmaker
+  ([18597](https://github.com/civicrm/civicrm-core/pull/18597))**
+
+- **[REF] Extract getFormValues
+  ([18510](https://github.com/civicrm/civicrm-core/pull/18510))**
+
+- **[REF] Remove checks as to whether entityShortName is in the component  array
+  ([18538](https://github.com/civicrm/civicrm-core/pull/18538))**
+
+- **[REF] Merge code - Move determination about location type to the
+  getDAOForLocation…
+  ([18562](https://github.com/civicrm/civicrm-core/pull/18562))**
+
+- **[REF] Remove unreachable lines
+  ([18535](https://github.com/civicrm/civicrm-core/pull/18535))**
+
+- **[REF] Remove wrangling on activityType param
+  ([18558](https://github.com/civicrm/civicrm-core/pull/18558))**
+
+- **[REF] Finally remove deprecated ids handling
+  ([18557](https://github.com/civicrm/civicrm-core/pull/18557))**
+
+- **[REF] Update composer compile plugin to latest version
+  ([18553](https://github.com/civicrm/civicrm-core/pull/18553))**
+
+- **(REF) Make it easier for extensions to define basic bundles
+  ([18660](https://github.com/civicrm/civicrm-core/pull/18660))**
+
+- **[REF] Follow up cleanup from Event Location
+  ([18608](https://github.com/civicrm/civicrm-core/pull/18608))**
+
+- **(REF) Switch to composer-compile-lib
+  ([18646](https://github.com/civicrm/civicrm-core/pull/18646))**
+
+- **[REF] Remove XML_Util dependancy within ewaysingle extension
+  ([18676](https://github.com/civicrm/civicrm-core/pull/18676))**
+
+- **Remove long-deprecated hook_civicrm_tabs
+  ([18503](https://github.com/civicrm/civicrm-core/pull/18503))**
+
+- **Remove redundant custom field types
+  ([18378](https://github.com/civicrm/civicrm-core/pull/18378) and
+  ([622](https://github.com/civicrm/civicrm-drupal/pull/622))**
+
+- **Remove unnecessary call to 'validateData' from pdf generator
+  ([18367](https://github.com/civicrm/civicrm-core/pull/18367))**
+
+- **Remove unnecessary debug from tests which messes up array output
+  ([18446](https://github.com/civicrm/civicrm-core/pull/18446))**
+
+- **Remove error handling from loadObjects
+  ([18393](https://github.com/civicrm/civicrm-core/pull/18393))**
+
+- **Remove deprecated code lines
+  ([18490](https://github.com/civicrm/civicrm-core/pull/18490))**
+
+- **Remove CRM_Contact_BAO_Contact::getPrimaryOpenId
+  ([18424](https://github.com/civicrm/civicrm-core/pull/18424))**
+
+- **Remove inaccessible call to baseIPN failed
+  ([18369](https://github.com/civicrm/civicrm-core/pull/18369))**
+
+- **Remove pass-by-ref in PaypalProIPN::single
+  ([18337](https://github.com/civicrm/civicrm-core/pull/18337))**
+
+- **Remove obsolete load-bootstrap.js
+  ([18551](https://github.com/civicrm/civicrm-core/pull/18551))**
+
+- **Remove deprecated ids param
+  ([18375](https://github.com/civicrm/civicrm-core/pull/18375))**
+
+- **Remove unused deprecated handling for partial_amount_to_pay
+  ([18328](https://github.com/civicrm/civicrm-core/pull/18328))**
+
+- **Minor test data fix up  - ensure domain contact's email is primary
+  ([18561](https://github.com/civicrm/civicrm-core/pull/18561))**
+
+- **Minor test fix
+  ([18560](https://github.com/civicrm/civicrm-core/pull/18560))**
+
+- **Preliminary cleanup on test
+  ([18346](https://github.com/civicrm/civicrm-core/pull/18346))**
+
+- **Fix test to use validateAllContributions
+  ([18348](https://github.com/civicrm/civicrm-core/pull/18348))**
+
+- **Afform Tests - Fix extension tests when run via `civi-test-run`
+  ([18511](https://github.com/civicrm/civicrm-core/pull/18511))**
+
+- **Test fix - use valid membership type
+  ([18507](https://github.com/civicrm/civicrm-core/pull/18507))**
+
+- **Test cleanup fix
+  ([18601](https://github.com/civicrm/civicrm-core/pull/18601))**
+
+- **[Civi\Test] Fix test output noise
+  ([18638](https://github.com/civicrm/civicrm-core/pull/18638))**
+
+- **[Test framework] Wrong group id in mailing test setup
+  ([18626](https://github.com/civicrm/civicrm-core/pull/18626))**
+
+- **Add test to cover existing v3 api setting of tax_amount on line items
+  ([18351](https://github.com/civicrm/civicrm-core/pull/18351))**
+
+- **Add unit test that ultimately failed to hit the desired code but does add
+  cover ([18708](https://github.com/civicrm/civicrm-core/pull/18708))**
+
+- **[NFC/Test] Unit test activity-contact variations
+  ([18619](https://github.com/civicrm/civicrm-core/pull/18619))**
+
+- **[NFC/Test] Unit test for target contacts on Bulk Email when mailing in
+  batches ([18584](https://github.com/civicrm/civicrm-core/pull/18584))**
+
+- **[NFC] Remove trailing whitespace
+  ([18476](https://github.com/civicrm/civicrm-core/pull/18476))**
+
+- **[NFC] Aim to reduce memory usage in create single value alter test by…
+  ([18394](https://github.com/civicrm/civicrm-core/pull/18394))**
+
+- **[NFC/Test framework] Make class name match file name
+  ([18392](https://github.com/civicrm/civicrm-core/pull/18392))**
+
+- **[NFC] Minor cleanup - use strict comparison where possible
+  ([18573](https://github.com/civicrm/civicrm-core/pull/18573))**
+
+- **[NFC] Enable APIv4 Testing on the statusPrefence API Tests
+  ([18366](https://github.com/civicrm/civicrm-core/pull/18366))**
+
+- **[NFC] Clarify what CRM_Price_BAO_Priceset::getMembershipCount does
+  ([18426](https://github.com/civicrm/civicrm-core/pull/18426))**
+
+- **[NFC] Enable APIv4 testing on the Fin ACL Extension Line Item test
+  ([18478](https://github.com/civicrm/civicrm-core/pull/18478))**
+
+- **Enotice fix ([18620](https://github.com/civicrm/civicrm-core/pull/18620))**
+
+- **Enotice fix ([18707](https://github.com/civicrm/civicrm-core/pull/18707))**
+
+- **Update civicrm_handler_field_contact_image.inc
+  ([625](https://github.com/civicrm/civicrm-drupal/pull/625))**
+
+  Fixes a notice.
+
+- **Update civicrm_handler_field_pseudo_constant.inc
+  ([626](https://github.com/civicrm/civicrm-drupal/pull/626))**
+
+  Fixes a notice.
+
+- **Update composer-download-plugin to v3.0.0 to support usage of composer 2.x
+  ([18899](https://github.com/civicrm/civicrm-core/pull/18899))**
+
+## <a name="credits"></a>Credits
+
+This release was developed by the following code authors:
+
+AGH Strategies - Alice Frumin, Andrew Hunt; Agileware - Justin Freeman; Bastien
+Ho; Blackfly Solutions - Alan Dixon; CEDC - Laryn Kragt Bakker; Christian Wach;
+Circle Interactive - Pradeep Nayak; CiviCRM - Coleman Watts, Tim Otten;
+CiviDesk - Sunil Pawar; CompuCorp - Camilo Rodriguez, Ivan; Coop SymbioTIC -
+Mathieu Lutfy; Dave D; iXiam - Luciano Spiegel; JMA Consulting - Monish Deb,
+Seamus Lee; John Kingsnorth; Lighthouse Consulting and Design - Brian
+Shaughnessy; Megaphone Technology Consulting - Dennis P. Osorio, Jon Goldberg;
+MJW Consulting - Matthew Wire; QED42 - Swastik Pareek; Richard van Oosterhout;
+Semper IT - Karin Gerritsen; Squiffle Consulting - Aidan Saunders; Tadpole
+Collective - Kevin Cristiano; Wikimedia Foundation - Eileen McNaughton
+
+Most authors also reviewed code for this release; in addition, the following
+reviewers contributed their comments:
+
+Abeilles en Vélo / Bees on a bike; Artful Robot - Rich Lott; Betty Dolfing;
+CiviCoop - Jaap Jansma; CiviCRM - Josh Gowans; CiviDesk - Nicolas Ganivet,
+Yashodha Chaku; CompuCorp - René Olivo; Freeform Solutions - Herb van den Dool;
+Fuzion - Jitendra Purohit, Luke Stewart; Irene Meisel; JMA Consulting - Joe
+Murray; Lemniscus - Noah Miller; MJCO - Mikey O'Toole; Tony Maynard-Smith;
+Wikimedia Foundation - Maggie Epps
+
+## <a name="feedback"></a>Feedback
+
+These release notes are edited by Alice Frumin and Andrew Hunt.  If you'd like
+to provide feedback on them, please log in to https://chat.civicrm.org/civicrm
+and contact `@agh1`.
diff --git a/civicrm/setup/plugins/blocks/advanced.tpl.php b/civicrm/setup/plugins/blocks/advanced.tpl.php
index 971d22c1fd5a3fcdc59c00878e969ed806ef1831..abfc0392604922e9ef9663e0eed42870d09358e0 100644
--- a/civicrm/setup/plugins/blocks/advanced.tpl.php
+++ b/civicrm/setup/plugins/blocks/advanced.tpl.php
@@ -26,7 +26,7 @@ endif; ?>
           <div>
 
           <input type="text" name="civisetup[advanced][db]" value="<?php echo htmlentities($model->extras['advanced']['db']); ?>" data-original="<?php echo htmlentities($model->extras['advanced']['db']); ?>">
-          <input id="db_apply_button" type="submit" name="civisetup[action][Start]" value="<?php echo htmlentities(ts('Apply')); ?>" />
+          <button id="db_apply_button" type="submit" name="civisetup[action][Start]"><?php echo htmlentities(ts('Apply')); ?></button>
           <a href="" onclick="civisetupAdvancedDbCancel(); return false;" title="<?php echo htmlentities(ts('Cancel')) ?>"><i class="fa fa-close"></i></a>
           <script type="text/javascript">
             function civisetupAdvancedDbCancel() {
diff --git a/civicrm/setup/plugins/blocks/install.tpl.php b/civicrm/setup/plugins/blocks/install.tpl.php
index 81e005f1ab7b5ed4a3f3e5a9f1d48a5de119f0db..7785ad2aae5edcf593d9ca3ab9d6afab93dd1e98 100644
--- a/civicrm/setup/plugins/blocks/install.tpl.php
+++ b/civicrm/setup/plugins/blocks/install.tpl.php
@@ -1,9 +1,8 @@
 <?php if (!defined('CIVI_SETUP')): exit("Installation plugins must only be loaded by the installer.\n");
 endif; ?>
 <div class="action-box">
-  <input id="install_button" type="submit" name="civisetup[action][Install]"
-         value="<?php echo htmlentities(ts('Install CiviCRM')); ?>"
-         onclick="document.getElementById('saving_top').style.display = ''; this.value = '<?php echo ts('Installing CiviCRM...', array('escape' => 'js')); ?>'"/>
+  <button id="install_button" type="submit" name="civisetup[action][Install]"
+         onclick="document.getElementById('saving_top').style.display = ''; this.innerHTML = '<?php echo ts('Installing CiviCRM...', array('escape' => 'js')); ?>'"><?php echo htmlentities(ts('Install CiviCRM')); ?></button>
   <div id="saving_top" style="display: none;">
 &nbsp;   <img src="<?php echo htmlentities($installURLPath . "network-save.gif") ?>"/>
     <?php echo ts('(this will take a few minutes)'); ?>
diff --git a/civicrm/setup/plugins/blocks/requirements.tpl.php b/civicrm/setup/plugins/blocks/requirements.tpl.php
index 54979fdf3c87564e3a7846f897450c23e0da9f8d..844406249be3738a066b0274459a3d093f72a38d 100644
--- a/civicrm/setup/plugins/blocks/requirements.tpl.php
+++ b/civicrm/setup/plugins/blocks/requirements.tpl.php
@@ -46,7 +46,7 @@ uasort($msgs, function($a, $b) {
 </table>
 
 <div class="action-box">
-  <input id="recheck_button" type="submit" name="civisetup[action][Start]" value="<?php echo htmlentities(ts('Refresh')); ?>" />
+  <button id="recheck_button" type="submit" name="civisetup[action][Start]"><?php echo htmlentities(ts('Refresh')); ?></button>
   <div class="advancedTip">
     <?php echo ts('After updating your system, refresh to test the requirements again.'); ?>
   </div>
diff --git a/civicrm/setup/plugins/init/Backdrop.civi-setup.php b/civicrm/setup/plugins/init/Backdrop.civi-setup.php
index 57e867f90c366b5816a3a5bfc67dac8182b23109..2320b88dace623244d904118b1d3147093f953bc 100644
--- a/civicrm/setup/plugins/init/Backdrop.civi-setup.php
+++ b/civicrm/setup/plugins/init/Backdrop.civi-setup.php
@@ -39,11 +39,13 @@ if (!defined('CIVI_SETUP')) {
 
     // Compute DSN.
     global $databases;
+    $ssl_params = \Civi\Setup\DrupalUtil::guessSslParams($databases['default']['default']);
     $model->db = $model->cmsDb = array(
       'server' => \Civi\Setup\DbUtil::encodeHostPort($databases['default']['default']['host'], $databases['default']['default']['port'] ?: NULL),
       'username' => $databases['default']['default']['username'],
       'password' => $databases['default']['default']['password'],
       'database' => $databases['default']['default']['database'],
+      'ssl_params' => empty($ssl_params) ? NULL : $ssl_params,
     );
 
     // Compute URLs
diff --git a/civicrm/setup/plugins/init/Drupal.civi-setup.php b/civicrm/setup/plugins/init/Drupal.civi-setup.php
index b24d7c164cba6e70d5b6b7ca8bd2ebbcc2c5bd74..d57ff432c21cfa4f80be5129073b00d7e4a9dceb 100644
--- a/civicrm/setup/plugins/init/Drupal.civi-setup.php
+++ b/civicrm/setup/plugins/init/Drupal.civi-setup.php
@@ -37,11 +37,13 @@ if (!defined('CIVI_SETUP')) {
 
     // Compute DSN.
     global $databases;
+    $ssl_params = \Civi\Setup\DrupalUtil::guessSslParams($databases['default']['default']);
     $model->db = $model->cmsDb = array(
       'server' => \Civi\Setup\DbUtil::encodeHostPort($databases['default']['default']['host'], $databases['default']['default']['port'] ?: NULL),
       'username' => $databases['default']['default']['username'],
       'password' => $databases['default']['default']['password'],
       'database' => $databases['default']['default']['database'],
+      'ssl_params' => empty($ssl_params) ? NULL : $ssl_params,
     );
 
     // Compute cmsBaseUrl.
diff --git a/civicrm/setup/plugins/init/Drupal8.civi-setup.php b/civicrm/setup/plugins/init/Drupal8.civi-setup.php
index a693cba92c4cd4adca82e8b711560b623f865709..22034e90895400b5d3cb81cb4617ee90b35ede6c 100644
--- a/civicrm/setup/plugins/init/Drupal8.civi-setup.php
+++ b/civicrm/setup/plugins/init/Drupal8.civi-setup.php
@@ -40,11 +40,13 @@ if (!defined('CIVI_SETUP')) {
 
     // Compute DSN.
     $connectionOptions = \Drupal::database()->getConnectionOptions();
+    $ssl_params = \Civi\Setup\DrupalUtil::guessSslParams($connectionOptions);
     $model->db = $model->cmsDb = array(
       'server' => \Civi\Setup\DbUtil::encodeHostPort($connectionOptions['host'], $connectionOptions['port'] ?: NULL),
       'username' => $connectionOptions['username'],
       'password' => $connectionOptions['password'],
       'database' => $connectionOptions['database'],
+      'ssl_params' => empty($ssl_params) ? NULL : $ssl_params,
     );
 
     // Compute cmsBaseUrl.
diff --git a/civicrm/setup/plugins/installFiles/InstallSettingsFile.civi-setup.php b/civicrm/setup/plugins/installFiles/InstallSettingsFile.civi-setup.php
index 29aedb2b073b2e66a765f4f6116555b5738c7591..5422292f32a5f5e41bfd8d5e33929cd139025bff 100644
--- a/civicrm/setup/plugins/installFiles/InstallSettingsFile.civi-setup.php
+++ b/civicrm/setup/plugins/installFiles/InstallSettingsFile.civi-setup.php
@@ -71,6 +71,13 @@ if (!defined('CIVI_SETUP')) {
     $params['CMSdbPass'] = addslashes($m->cmsDb['password']);
     $params['CMSdbHost'] = addslashes($m->cmsDb['server']);
     $params['CMSdbName'] = addslashes($m->cmsDb['database']);
+    // The '&' prefix is awkward, but we don't know what's already in the file.
+    // At the time of writing, it has ?new_link=true. If that is removed,
+    // then need to update this.
+    // The PHP_QUERY_RFC3986 is important because PEAR::DB will interpret plus
+    // signs as a reference to its old DSN format and mangle the DSN, so we
+    // need to use %20 for spaces.
+    $params['CMSdbSSL'] = empty($m->cmsDb['ssl_params']) ? '' : addslashes('&' . http_build_query($m->cmsDb['ssl_params'], '', '&', PHP_QUERY_RFC3986));
     $params['siteKey'] = addslashes($m->siteKey);
 
     $extraSettings = array();
diff --git a/civicrm/setup/res/template.css b/civicrm/setup/res/template.css
index 5a2b3ea1060896e84c97e6e4337fa3f7852e78b8..a06f97a2b8441da00e16b87bbee719076768517c 100644
--- a/civicrm/setup/res/template.css
+++ b/civicrm/setup/res/template.css
@@ -15,7 +15,7 @@ body {
   float: left;
   margin-left: 10%;
   margin-top: 50px;
-  margin-right: 20%; 
+  margin-right: 20%;
   display: inline-flex;
 }
 
@@ -39,7 +39,7 @@ body {
     100% { left: 0; color: #555;}
 }
 
-  
+
 .civicrm-setup-header hr{
   border-bottom: 2px solid #fff;
   border-top: 2px solid #ddd;
@@ -217,7 +217,7 @@ body {
   text-align: center;
   margin: 2em 0.5em;
 }
-.civicrm-setup-body input[type=submit] {
+.civicrm-setup-body button[type=submit] {
   padding:15px 25px;
   background:#82C459;
   color: white;
@@ -227,10 +227,10 @@ body {
   border-radius: 5px;
   font-size: 20px;
 }
-.civicrm-setup-body input[type=submit]:hover {
+.civicrm-setup-body button[type=submit]:hover {
   background: #60A237;
 }
-.civicrm-setup-body input[type=submit]:disabled {
+.civicrm-setup-body button[type=submit]:disabled {
   background: #888;
   cursor: not-allowed;
 }
@@ -267,4 +267,3 @@ body {
     width: 95%;
   }
 }
-
diff --git a/civicrm/setup/src/Setup/DrupalUtil.php b/civicrm/setup/src/Setup/DrupalUtil.php
index 0f5ab95205b02ca0fc6893cb2e4f6b116821a59b..8d1e95bc2e7208156cb950b6fa26c975454d670d 100644
--- a/civicrm/setup/src/Setup/DrupalUtil.php
+++ b/civicrm/setup/src/Setup/DrupalUtil.php
@@ -71,4 +71,58 @@ class DrupalUtil {
      */
   }
 
+  /**
+   * Guess if the CMS is using SSL for MySQL and what the corresponding
+   * parameters should be for PEAR::DB.
+   *
+   * Not all combinations will work. See the install docs for a list of known
+   * configurations that do. We don't enforce that here since we're just
+   * trying to guess a default based on what they already have.
+   *
+   * @param array $cmsDatabaseParams
+   *   The contents of the section from drupal's settings.php where it defines
+   *   the $database array, usually under 'default'.
+   * @return array
+   *   The corresponding guessed params for PEAR::DB.
+   */
+  public static function guessSslParams(array $cmsDatabaseParams):array {
+    // If the pdo-mysql extension isn't loaded or they have nothing in drupal
+    // config for pdo, then we're done. PDO isn't required for Civi, but note
+    // the references to PDO constants below would fail and they obviously
+    // wouldn't have them in drupal config then.
+    if (empty($cmsDatabaseParams['pdo']) || !extension_loaded('pdo_mysql')) {
+      return [];
+    }
+
+    $pdo = $cmsDatabaseParams['pdo'];
+
+    $pdo_map = [
+      \PDO::MYSQL_ATTR_SSL_CA => 'ca',
+      \PDO::MYSQL_ATTR_SSL_KEY => 'key',
+      \PDO::MYSQL_ATTR_SSL_CERT => 'cert',
+      \PDO::MYSQL_ATTR_SSL_CAPATH => 'capath',
+      \PDO::MYSQL_ATTR_SSL_CIPHER => 'cipher',
+    ];
+
+    $ssl_params = [];
+
+    // If they have one set in drupal config and it's a string, then copy
+    // it over verbatim.
+    foreach ($pdo_map as $pdo_name => $ssl_name) {
+      if (!empty($pdo[$pdo_name]) && is_string($pdo[$pdo_name])) {
+        $ssl_params[$ssl_name] = $pdo[$pdo_name];
+      }
+    }
+
+    // No client certificate or server verification, but want SSL. Return our
+    // made-up indicator ssl=1 that isn't a real mysqli option but which we
+    // recognize. It's possible they have other params set too which we pass
+    // along from above, but that may not be compatible but it's up to them.
+    if (($pdo[\PDO::MYSQL_ATTR_SSL_CA] ?? NULL) === TRUE && ($pdo[\PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT] ?? NULL) === FALSE) {
+      $ssl_params['ssl'] = 1;
+    }
+
+    return $ssl_params;
+  }
+
 }
diff --git a/civicrm/setup/src/Setup/UI/SetupController.php b/civicrm/setup/src/Setup/UI/SetupController.php
index c7e685f9fff8ffc7720dfcaf122ee5c375c13a66..022929552816a5cb5f39bc6f265ee7f456a60916 100644
--- a/civicrm/setup/src/Setup/UI/SetupController.php
+++ b/civicrm/setup/src/Setup/UI/SetupController.php
@@ -247,7 +247,7 @@ class SetupController implements SetupControllerInterface {
    *
    * @param array $fields
    *   HTTP inputs -- e.g. with a form element like this:
-   *   `<input type="submit" name="civisetup[action][Foo]" value="Do the foo">`
+   *   `<button type="submit" name="civisetup[action][Foo]">Do the foo</button>`
    * @param string $default
    *   The action-name to return if no other action is identified.
    * @return string
diff --git a/civicrm/sql/civicrm.mysql b/civicrm/sql/civicrm.mysql
index e4aebd60919280b122599a7adcfbfc9aee955b5e..49ba9fbc3e7722dca0cafb8504aaddfc7ff59063 100644
--- a/civicrm/sql/civicrm.mysql
+++ b/civicrm/sql/civicrm.mysql
@@ -103,7 +103,6 @@ DROP TABLE IF EXISTS `civicrm_group_nesting`;
 DROP TABLE IF EXISTS `civicrm_group_contact_cache`;
 DROP TABLE IF EXISTS `civicrm_subscription_history`;
 DROP TABLE IF EXISTS `civicrm_group`;
-DROP TABLE IF EXISTS `civicrm_acl_cache`;
 DROP TABLE IF EXISTS `civicrm_status_pref`;
 DROP TABLE IF EXISTS `civicrm_word_replacement`;
 DROP TABLE IF EXISTS `civicrm_print_label`;
@@ -167,6 +166,7 @@ DROP TABLE IF EXISTS `civicrm_relationship_type`;
 DROP TABLE IF EXISTS `civicrm_acl_contact_cache`;
 DROP TABLE IF EXISTS `civicrm_contact`;
 DROP TABLE IF EXISTS `civicrm_acl_entity_role`;
+DROP TABLE IF EXISTS `civicrm_acl_cache`;
 DROP TABLE IF EXISTS `civicrm_acl`;
 DROP TABLE IF EXISTS `civicrm_recurring_entity`;
 DROP TABLE IF EXISTS `civicrm_action_mapping`;
@@ -564,6 +564,36 @@ CREATE TABLE `civicrm_acl` (
  
 )  ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci  ;
 
+-- /*******************************************************
+-- *
+-- * civicrm_acl_cache
+-- *
+-- * Cache for acls and contacts
+-- *
+-- *******************************************************/
+CREATE TABLE `civicrm_acl_cache` (
+
+
+     `id` int unsigned NOT NULL AUTO_INCREMENT  COMMENT 'Unique table ID',
+     `contact_id` int unsigned    COMMENT 'Foreign Key to Contact',
+     `acl_id` int unsigned NOT NULL   COMMENT 'Foreign Key to ACL',
+     `modified_date` timestamp NULL   COMMENT 'When was this cache entry last modified' 
+,
+        PRIMARY KEY (`id`)
+ 
+    ,     INDEX `index_contact_id`(
+        contact_id
+  )
+  ,     INDEX `index_acl_id`(
+        acl_id
+  )
+  ,     INDEX `index_modified_date`(
+        modified_date
+  )
+  
+,          CONSTRAINT FK_civicrm_acl_cache_acl_id FOREIGN KEY (`acl_id`) REFERENCES `civicrm_acl`(`id`) ON DELETE CASCADE  
+)  ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci  ;
+
 -- /*******************************************************
 -- *
 -- * civicrm_acl_entity_role
@@ -744,7 +774,7 @@ CREATE TABLE `civicrm_acl_contact_cache` (
       , operation
   )
   
-,          CONSTRAINT FK_civicrm_acl_contact_cache_contact_id FOREIGN KEY (`contact_id`) REFERENCES `civicrm_contact`(`id`) ON DELETE CASCADE  
+ 
 )  ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci  ;
 
 -- /*******************************************************
@@ -2068,7 +2098,9 @@ CREATE TABLE `civicrm_mail_settings` (
      `password` varchar(255)    COMMENT 'password to use when polling',
      `is_ssl` tinyint    COMMENT 'whether to use SSL or not',
      `source` varchar(255)    COMMENT 'folder to poll from when using IMAP, path to poll from when using Maildir, etc.',
-     `activity_status` varchar(255)    COMMENT 'Name of status to use when creating email to activity.' 
+     `activity_status` varchar(255)    COMMENT 'Name of status to use when creating email to activity.',
+     `is_non_case_email_skipped` tinyint   DEFAULT 0 COMMENT 'Enabling this option will have CiviCRM skip any emails that do not have the Case ID or Case Hash so that the system will only process emails that can be placed on case records. Any emails that are not processed will be moved to the ignored folder.',
+     `is_contact_creation_disabled_if_no_match` tinyint   DEFAULT 0  
 ,
         PRIMARY KEY (`id`)
  
@@ -2567,33 +2599,6 @@ CREATE TABLE `civicrm_status_pref` (
 ,          CONSTRAINT FK_civicrm_status_pref_domain_id FOREIGN KEY (`domain_id`) REFERENCES `civicrm_domain`(`id`)   
 )  ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci  ;
 
--- /*******************************************************
--- *
--- * civicrm_acl_cache
--- *
--- * Cache for acls and contacts
--- *
--- *******************************************************/
-CREATE TABLE `civicrm_acl_cache` (
-
-
-     `id` int unsigned NOT NULL AUTO_INCREMENT  COMMENT 'Unique table ID',
-     `contact_id` int unsigned    COMMENT 'Foreign Key to Contact',
-     `acl_id` int unsigned NOT NULL   COMMENT 'Foreign Key to ACL',
-     `modified_date` timestamp NULL   COMMENT 'When was this cache entry last modified' 
-,
-        PRIMARY KEY (`id`)
- 
-    ,     INDEX `index_acl_id`(
-        acl_id
-  )
-  ,     INDEX `index_modified_date`(
-        modified_date
-  )
-  
-,          CONSTRAINT FK_civicrm_acl_cache_contact_id FOREIGN KEY (`contact_id`) REFERENCES `civicrm_contact`(`id`) ON DELETE CASCADE,          CONSTRAINT FK_civicrm_acl_cache_acl_id FOREIGN KEY (`acl_id`) REFERENCES `civicrm_acl`(`id`) ON DELETE CASCADE  
-)  ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci  ;
-
 -- /*******************************************************
 -- *
 -- * civicrm_group
@@ -2606,7 +2611,7 @@ CREATE TABLE `civicrm_group` (
 
      `id` int unsigned NOT NULL AUTO_INCREMENT  COMMENT 'Group ID',
      `name` varchar(64)    COMMENT 'Internal name of Group.',
-     `title` varchar(64)    COMMENT 'Name of Group.',
+     `title` varchar(255)    COMMENT 'Name of Group.',
      `description` text    COMMENT 'Optional verbose description of the group.',
      `source` varchar(64)    COMMENT 'Module or process which created this group.',
      `saved_search_id` int unsigned    COMMENT 'FK to saved search table.',
@@ -2623,7 +2628,9 @@ CREATE TABLE `civicrm_group` (
      `is_hidden` tinyint   DEFAULT 0 COMMENT 'Is this group hidden?',
      `is_reserved` tinyint   DEFAULT 0 ,
      `created_id` int unsigned    COMMENT 'FK to contact table.',
-     `modified_id` int unsigned    COMMENT 'FK to contact table.' 
+     `modified_id` int unsigned    COMMENT 'FK to contact table.',
+     `frontend_title` varchar(255)   DEFAULT NULL COMMENT 'Alternative public title for this Group.',
+     `frontend_description` text   DEFAULT NULL COMMENT 'Alternative public description of the group.' 
 ,
         PRIMARY KEY (`id`)
  
@@ -3049,7 +3056,7 @@ CREATE TABLE `civicrm_membership_type` (
      `minimum_fee` decimal(18,9)   DEFAULT 0 COMMENT 'Minimum fee for this membership (0 for free/complimentary memberships).',
      `duration_unit` varchar(8)    COMMENT 'Unit in which membership period is expressed.',
      `duration_interval` int    COMMENT 'Number of duration units in membership period (e.g. 1 year, 12 months).',
-     `period_type` varchar(8)    COMMENT 'Rolling membership period starts on signup date. Fixed membership periods start on fixed_period_start_day.',
+     `period_type` varchar(8) NOT NULL   COMMENT 'Rolling membership period starts on signup date. Fixed membership periods start on fixed_period_start_day.',
      `fixed_period_start_day` int    COMMENT 'For fixed period memberships, month and day (mmdd) on which subscription/membership will start. Period start is back-dated unless after rollover day.',
      `fixed_period_rollover_day` int    COMMENT 'For fixed period memberships, signups after this day (mmdd) rollover to next period.',
      `relationship_type_id` varchar(64)    COMMENT 'FK to Relationship Type ID',
@@ -3257,7 +3264,7 @@ CREATE TABLE `civicrm_price_set` (
      `financial_type_id` int unsigned   DEFAULT NULL COMMENT 'FK to Financial Type(for membership price sets only).',
      `is_quick_config` tinyint   DEFAULT 0 COMMENT 'Is set if edited on Contribution or Event Page rather than through Manage Price Sets',
      `is_reserved` tinyint   DEFAULT 0 COMMENT 'Is this a predefined system price set  (i.e. it can not be deleted, edited)?',
-     `min_amount` int unsigned   DEFAULT 0 COMMENT 'Minimum Amount required for this set.' 
+     `min_amount` decimal(20,2)   DEFAULT 0.0 COMMENT 'Minimum Amount required for this set.' 
 ,
         PRIMARY KEY (`id`)
  
diff --git a/civicrm/sql/civicrm_data.mysql b/civicrm/sql/civicrm_data.mysql
index 8bb41cad738989a3d29841538e15cb518430a9a3..54c6939135d39f703eb466b9f20219ca6ea04031 100644
--- a/civicrm/sql/civicrm_data.mysql
+++ b/civicrm/sql/civicrm_data.mysql
@@ -1496,7 +1496,7 @@ INSERT INTO civicrm_state_province (id, country_id, abbreviation, name) VALUES
 (2597, 1226, "AGB", "Argyll and Bute"),
 (2598, 1226, "ARM", "Co Armagh"),
 (2606, 1226, "BDF", "Bedfordshire"),
-(2612, 1226, "BGW", "Gwent"),
+(2612, 1226, "BGW", "Blaenau Gwent"),
 (2620, 1226, "BST", "Bristol, City of"),
 (2622, 1226, "BKM", "Buckinghamshire"),
 (2626, 1226, "CAM", "Cambridgeshire"),
@@ -1565,7 +1565,7 @@ INSERT INTO civicrm_state_province (id, country_id, abbreviation, name) VALUES
 (2786, 1226, "STG", "Stirling"),
 (2791, 1226, "SFK", "Suffolk"),
 (2793, 1226, "SRY", "Surrey"),
-(2804, 1226, "VGL", "Mid Glamorgan"),
+(2804, 1226, "VGL", "Vale of Glamorgan, The"),
 (2811, 1226, "WAR", "Warwickshire"),
 (2813, 1226, "WDU", "West Dunbartonshire"),
 (2814, 1226, "WLN", "West Lothian"),
@@ -3969,7 +3969,6 @@ INSERT INTO civicrm_state_province (id, country_id, abbreviation, name) VALUES
 
 -- new UK provinces (CRM-5224)
 (10013, 1226, "CWD", "Clwyd"),
-(10014, 1226, "DFD", "Dyfed"),
 (10015, 1226, "SGM", "South Glamorgan"),
 
 -- Haiti (CRM-5628)
@@ -4388,7 +4387,38 @@ INSERT INTO civicrm_state_province (id, country_id, abbreviation, name) VALUES
 (NULL, 1080, "09", "Woleu-Ntem"),
 
 -- dev/Core#131 Missing UK State
-(NULL, 1226, "MON", "Monmouthshire");
+(NULL, 1226, "MON", "Monmouthshire"),
+
+-- dev/core#2027 Missing subdivisions for Northern Ireland and Wales
+(NULL, 1226, "ANN", "Antrim and Newtownabbey"),
+(NULL, 1226, "AND", "Ards and North Down"),
+(NULL, 1226, "ABC", "Armagh City, Banbridge and Craigavon"),
+(NULL, 1226, "BFS", "Belfast"),
+(NULL, 1226, "CCG", "Causeway Coast and Glens"),
+(NULL, 1226, "DRS", "Derry City and Strabane"),
+(NULL, 1226, "FMO", "Fermanagh and Omagh"),
+(NULL, 1226, "LBC", "Lisburn and Castlereagh"),
+(NULL, 1226, "MEA", "Mid and East Antrim"),
+(NULL, 1226, "MUL", "Mid Ulster"),
+(NULL, 1226, "NMD", "Newry, Mourne and Down"),
+
+(NULL, 1226, "BGE", "Bridgend"),
+(NULL, 1226, "CAY", "Caerphilly"),
+(NULL, 1226, "CRF", "Cardiff"),
+(NULL, 1226, "CRF", "Carmarthenshire"),
+(NULL, 1226, "CGN", "Ceredigion"),
+(NULL, 1226, "CWY", "Conwy"),
+(NULL, 1226, "DEN", "Denbighshire"),
+(NULL, 1226, "FLN", "Flintshire"),
+(NULL, 1226, "AGY", "Isle of Anglesey"),
+(NULL, 1226, "MTY", "Merthyr Tydfil"),
+(NULL, 1226, "NTL", "Neath Port Talbot"),
+(NULL, 1226, "NWP", "Newport"),
+(NULL, 1226, "PEM", "Pembrokeshire"),
+(NULL, 1226, "RCT", "Rhondda, Cynon, Taff"),
+(NULL, 1226, "SWA", "Swansea"),
+(NULL, 1226, "TOF", "Torfaen"),
+(NULL, 1226, "WRX", "Wrexham");
 -- +--------------------------------------------------------------------+
 -- | Copyright CiviCRM LLC. All rights reserved.                        |
 -- |                                                                    |
@@ -4621,7 +4651,7 @@ SET @contactID := LAST_INSERT_ID();
 
 INSERT INTO civicrm_email (contact_id, location_type_id, email, is_primary, is_billing, on_hold, hold_date, reset_date)
 VALUES
-(@contactID, 1, 'fixme.domainemail@example.org', 0, 0, 0, NULL, NULL);
+(@contactID, 1, 'fixme.domainemail@example.org', 1, 0, 0, NULL, NULL);
 
 INSERT INTO civicrm_domain (name, version, contact_id) VALUES (@domainName, '2.2', @contactID);
 SELECT @domainID := id FROM civicrm_domain where name = 'Default Domain Name';
@@ -5945,7 +5975,6 @@ VALUES
  ('PayPal_Express',     'PayPal - Express',       NULL,1,0,'User Name','Password','Signature',NULL,'Payment_PayPalImpl','https://www.paypal.com/','https://api-3t.paypal.com/',NULL,'https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif','https://www.sandbox.paypal.com/','https://api-3t.sandbox.paypal.com/',NULL,'https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif',2, 1),
  ('AuthNet',            'Authorize.Net',          NULL,1,0,'API Login','Payment Key','MD5 Hash',NULL,'Payment_AuthorizeNet','https://secure2.authorize.net/gateway/transact.dll',NULL,'https://api2.authorize.net/xml/v1/request.api',NULL,'https://test.authorize.net/gateway/transact.dll',NULL,'https://apitest.authorize.net/xml/v1/request.api',NULL,1,1),
  ('PayJunction',        'PayJunction',            NULL,0,0,'User Name','Password',NULL,NULL,'Payment_PayJunction','https://payjunction.com/quick_link',NULL,NULL,NULL,'https://www.payjunctionlabs.com/quick_link',NULL,NULL,NULL,1,1),
- ('eWAY',               'eWAY (Single Currency)', NULL,0,0,'Customer ID',NULL,NULL,NULL,'Payment_eWAY','https://www.eway.com.au/gateway_cvn/xmlpayment.asp',NULL,NULL,NULL,'https://www.eway.com.au/gateway_cvn/xmltest/testpage.asp',NULL,NULL,NULL,1,0),
  ('Dummy',              'Dummy Payment Processor',NULL,1,1,'User Name',NULL,NULL,NULL,'Payment_Dummy',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1),
  ('Elavon',             'Elavon Payment Processor','Elavon / Nova Virtual Merchant',0,0,'SSL Merchant ID ','SSL User ID','SSL PIN',NULL,'Payment_Elavon','https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do',NULL,NULL,NULL,'https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do',NULL,NULL,NULL,1,0),
  ('Realex',             'Realex Payment',         NULL,0,0,'Merchant ID', 'Password', NULL, 'Account', 'Payment_Realex', 'https://epage.payandshop.com/epage.cgi', NULL, NULL, NULL, 'https://epage.payandshop.com/epage-remote.cgi', NULL, NULL, NULL, 1, 0),
@@ -23090,6 +23119,7 @@ VALUES
 -- in the setup routine based on their tags & using the standard extension install api.
 -- do not try this at home folks.
 INSERT IGNORE INTO civicrm_extension (type, full_name, name, label, file, is_active) VALUES ('module', 'sequentialcreditnotes', 'Sequential credit notes', 'Sequential credit notes', 'sequentialcreditnotes', 1);
+INSERT IGNORE INTO civicrm_extension (type, full_name, name, label, file, is_active) VALUES ('module', 'greenwich', 'Theme: Greenwich', 'Theme: Greenwich', 'greenwich', 1);
 INSERT IGNORE INTO civicrm_extension (type, full_name, name, label, file, is_active) VALUES ('module', 'eventcart', 'Event cart', 'Event cart', 'eventcart', 1);
 INSERT IGNORE INTO civicrm_extension (type, full_name, name, label, file, is_active) VALUES ('module', 'financialacls', 'Financial ACLs', 'Financial ACLs', 'financialacls', 1);
 -- +--------------------------------------------------------------------+
@@ -23896,4 +23926,4 @@ INSERT INTO `civicrm_report_instance`
     ( `domain_id`, `title`, `report_id`, `description`, `permission`, `form_values`)
 VALUES
     (  @domainID, 'Survey Details', 'survey/detail', 'Detailed report for canvassing, phone-banking, walk lists or other surveys.', 'access CiviReport', 'a:39:{s:6:"fields";a:2:{s:9:"sort_name";s:1:"1";s:6:"result";s:1:"1";}s:22:"assignee_contact_id_op";s:2:"eq";s:25:"assignee_contact_id_value";s:0:"";s:12:"sort_name_op";s:3:"has";s:15:"sort_name_value";s:0:"";s:17:"street_number_min";s:0:"";s:17:"street_number_max";s:0:"";s:16:"street_number_op";s:3:"lte";s:19:"street_number_value";s:0:"";s:14:"street_name_op";s:3:"has";s:17:"street_name_value";s:0:"";s:15:"postal_code_min";s:0:"";s:15:"postal_code_max";s:0:"";s:14:"postal_code_op";s:3:"lte";s:17:"postal_code_value";s:0:"";s:7:"city_op";s:3:"has";s:10:"city_value";s:0:"";s:20:"state_province_id_op";s:2:"in";s:23:"state_province_id_value";a:0:{}s:13:"country_id_op";s:2:"in";s:16:"country_id_value";a:0:{}s:12:"survey_id_op";s:2:"in";s:15:"survey_id_value";a:0:{}s:12:"status_id_op";s:2:"eq";s:15:"status_id_value";s:1:"1";s:11:"custom_1_op";s:2:"in";s:14:"custom_1_value";a:0:{}s:11:"custom_2_op";s:2:"in";s:14:"custom_2_value";a:0:{}s:17:"custom_3_relative";s:1:"0";s:13:"custom_3_from";s:0:"";s:11:"custom_3_to";s:0:"";s:11:"description";s:75:"Detailed report for canvassing, phone-banking, walk lists or other surveys.";s:13:"email_subject";s:0:"";s:8:"email_to";s:0:"";s:8:"email_cc";s:0:"";s:10:"permission";s:17:"access CiviReport";s:6:"groups";s:0:"";s:9:"domain_id";i:1;}');
-UPDATE civicrm_domain SET version = '5.30.1';
+UPDATE civicrm_domain SET version = '5.31.0';
diff --git a/civicrm/sql/civicrm_drop.mysql b/civicrm/sql/civicrm_drop.mysql
index f8c3b79a5f7bba3334e5848f4c0e95425932191e..ab54c4db19154f152a44f6991ce827ae6b6e723b 100644
--- a/civicrm/sql/civicrm_drop.mysql
+++ b/civicrm/sql/civicrm_drop.mysql
@@ -90,7 +90,6 @@ DROP TABLE IF EXISTS `civicrm_group_nesting`;
 DROP TABLE IF EXISTS `civicrm_group_contact_cache`;
 DROP TABLE IF EXISTS `civicrm_subscription_history`;
 DROP TABLE IF EXISTS `civicrm_group`;
-DROP TABLE IF EXISTS `civicrm_acl_cache`;
 DROP TABLE IF EXISTS `civicrm_status_pref`;
 DROP TABLE IF EXISTS `civicrm_word_replacement`;
 DROP TABLE IF EXISTS `civicrm_print_label`;
@@ -154,6 +153,7 @@ DROP TABLE IF EXISTS `civicrm_relationship_type`;
 DROP TABLE IF EXISTS `civicrm_acl_contact_cache`;
 DROP TABLE IF EXISTS `civicrm_contact`;
 DROP TABLE IF EXISTS `civicrm_acl_entity_role`;
+DROP TABLE IF EXISTS `civicrm_acl_cache`;
 DROP TABLE IF EXISTS `civicrm_acl`;
 DROP TABLE IF EXISTS `civicrm_recurring_entity`;
 DROP TABLE IF EXISTS `civicrm_action_mapping`;
diff --git a/civicrm/sql/civicrm_generated.mysql b/civicrm/sql/civicrm_generated.mysql
index d3f61f51b377be90fc49dfb719949808dd91c6ee..d81d4f7c3aba1bff1ec20e0fbd0eca19c4046c6d 100644
--- a/civicrm/sql/civicrm_generated.mysql
+++ b/civicrm/sql/civicrm_generated.mysql
@@ -1,8 +1,8 @@
--- MySQL dump 10.13  Distrib 5.7.30, for Linux (x86_64)
+-- MySQL dump 10.13  Distrib 5.7.31, for Linux (x86_64)
 --
 -- Host: 127.0.0.1    Database: 47testcivi_yg7kx
 -- ------------------------------------------------------
--- Server version	5.7.30-0ubuntu0.18.04.1
+-- Server version	5.7.31-0ubuntu0.18.04.1
 
 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
 /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
@@ -87,7 +87,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_activity` WRITE;
 /*!40000 ALTER TABLE `civicrm_activity` DISABLE KEYS */;
-INSERT INTO `civicrm_activity` (`id`, `source_record_id`, `activity_type_id`, `subject`, `activity_date_time`, `duration`, `location`, `phone_id`, `phone_number`, `details`, `status_id`, `priority_id`, `parent_id`, `is_test`, `medium_id`, `is_auto`, `relationship_id`, `is_current_revision`, `original_id`, `result`, `is_deleted`, `campaign_id`, `engagement_level`, `weight`, `is_star`, `created_date`, `modified_date`) VALUES (1,NULL,10,'Subject for Pledge Acknowledgment','2020-02-10 22:36:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(2,NULL,9,'Subject for Tell a Friend','2020-07-10 09:36:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(3,NULL,9,'Subject for Tell a Friend','2019-10-23 21:11:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(4,NULL,10,'Subject for Pledge Acknowledgment','2020-01-25 21:48:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(5,NULL,9,'Subject for Tell a Friend','2020-04-09 13:53:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(6,NULL,10,'Subject for Pledge Acknowledgment','2019-11-28 12:45:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(7,NULL,10,'Subject for Pledge Acknowledgment','2019-11-25 11:57:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(8,NULL,9,'Subject for Tell a Friend','2020-07-01 21:13:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(9,NULL,9,'Subject for Tell a Friend','2019-12-04 18:07:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(10,NULL,9,'Subject for Tell a Friend','2020-01-10 18:16:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(11,NULL,10,'Subject for Pledge Acknowledgment','2019-11-12 17:06:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(12,NULL,9,'Subject for Tell a Friend','2019-10-09 00:12:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(13,NULL,9,'Subject for Tell a Friend','2019-12-28 00:37:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(14,NULL,10,'Subject for Pledge Acknowledgment','2019-09-18 15:30:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(15,NULL,9,'Subject for Tell a Friend','2020-04-23 01:33:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(16,NULL,10,'Subject for Pledge Acknowledgment','2020-02-06 22:59:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(17,NULL,9,'Subject for Tell a Friend','2020-05-14 08:33:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(18,NULL,9,'Subject for Tell a Friend','2020-03-03 16:08:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(19,NULL,9,'Subject for Tell a Friend','2020-01-02 11:31:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(20,NULL,9,'Subject for Tell a Friend','2020-01-21 15:32:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(21,NULL,9,'Subject for Tell a Friend','2019-11-19 15:55:14',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(22,NULL,10,'Subject for Pledge Acknowledgment','2020-02-09 19:43:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(23,NULL,9,'Subject for Tell a Friend','2020-04-23 07:17:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(24,NULL,9,'Subject for Tell a Friend','2020-05-06 04:29:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(25,NULL,9,'Subject for Tell a Friend','2019-11-10 18:19:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(26,NULL,10,'Subject for Pledge Acknowledgment','2020-03-16 23:19:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(27,NULL,9,'Subject for Tell a Friend','2020-07-01 12:22:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(28,NULL,10,'Subject for Pledge Acknowledgment','2020-07-19 00:40:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(29,NULL,10,'Subject for Pledge Acknowledgment','2020-05-25 00:37:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(30,NULL,10,'Subject for Pledge Acknowledgment','2020-05-19 14:18:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(31,NULL,10,'Subject for Pledge Acknowledgment','2020-07-01 04:28:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(32,NULL,9,'Subject for Tell a Friend','2019-08-15 21:07:14',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(33,NULL,10,'Subject for Pledge Acknowledgment','2020-05-11 15:40:24',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(34,NULL,9,'Subject for Tell a Friend','2020-02-12 20:09:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(35,NULL,10,'Subject for Pledge Acknowledgment','2019-11-26 11:16:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(36,NULL,10,'Subject for Pledge Acknowledgment','2019-11-28 03:25:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(37,NULL,9,'Subject for Tell a Friend','2020-07-15 01:35:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(38,NULL,9,'Subject for Tell a Friend','2020-02-19 22:18:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(39,NULL,9,'Subject for Tell a Friend','2020-05-29 00:51:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(40,NULL,9,'Subject for Tell a Friend','2020-04-08 16:09:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(41,NULL,9,'Subject for Tell a Friend','2019-11-30 17:37:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(42,NULL,10,'Subject for Pledge Acknowledgment','2019-08-29 22:36:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(43,NULL,10,'Subject for Pledge Acknowledgment','2019-07-27 04:48:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(44,NULL,9,'Subject for Tell a Friend','2020-02-07 08:33:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(45,NULL,10,'Subject for Pledge Acknowledgment','2019-10-08 06:33:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(46,NULL,9,'Subject for Tell a Friend','2019-11-07 05:39:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(47,NULL,9,'Subject for Tell a Friend','2020-07-16 04:56:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(48,NULL,10,'Subject for Pledge Acknowledgment','2020-06-24 04:44:23',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(49,NULL,9,'Subject for Tell a Friend','2019-09-05 17:00:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(50,NULL,9,'Subject for Tell a Friend','2019-12-16 01:54:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(51,NULL,10,'Subject for Pledge Acknowledgment','2020-06-22 23:12:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(52,NULL,10,'Subject for Pledge Acknowledgment','2019-08-01 06:53:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(53,NULL,9,'Subject for Tell a Friend','2019-09-09 21:56:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(54,NULL,9,'Subject for Tell a Friend','2020-06-25 15:15:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(55,NULL,9,'Subject for Tell a Friend','2020-04-20 19:09:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(56,NULL,9,'Subject for Tell a Friend','2020-01-28 00:48:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(57,NULL,9,'Subject for Tell a Friend','2020-05-31 02:51:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(58,NULL,10,'Subject for Pledge Acknowledgment','2019-10-01 15:16:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(59,NULL,10,'Subject for Pledge Acknowledgment','2020-02-24 09:22:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(60,NULL,10,'Subject for Pledge Acknowledgment','2019-12-11 02:10:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(61,NULL,10,'Subject for Pledge Acknowledgment','2020-07-21 06:13:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(62,NULL,10,'Subject for Pledge Acknowledgment','2020-05-01 05:20:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(63,NULL,9,'Subject for Tell a Friend','2020-01-09 06:28:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(64,NULL,9,'Subject for Tell a Friend','2020-01-15 21:39:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(65,NULL,10,'Subject for Pledge Acknowledgment','2020-02-12 10:56:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(66,NULL,9,'Subject for Tell a Friend','2019-10-14 23:33:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(67,NULL,10,'Subject for Pledge Acknowledgment','2020-05-02 17:30:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(68,NULL,9,'Subject for Tell a Friend','2019-09-07 02:51:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(69,NULL,9,'Subject for Tell a Friend','2019-11-18 18:30:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(70,NULL,10,'Subject for Pledge Acknowledgment','2020-01-02 13:01:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(71,NULL,10,'Subject for Pledge Acknowledgment','2019-08-19 11:52:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(72,NULL,9,'Subject for Tell a Friend','2019-10-25 18:35:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(73,NULL,9,'Subject for Tell a Friend','2019-09-29 08:51:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(74,NULL,10,'Subject for Pledge Acknowledgment','2020-06-02 16:46:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(75,NULL,10,'Subject for Pledge Acknowledgment','2020-01-20 03:15:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(76,NULL,10,'Subject for Pledge Acknowledgment','2020-06-13 14:51:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(77,NULL,10,'Subject for Pledge Acknowledgment','2020-05-09 23:16:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(78,NULL,9,'Subject for Tell a Friend','2019-12-07 02:04:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(79,NULL,10,'Subject for Pledge Acknowledgment','2019-11-11 07:23:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(80,NULL,10,'Subject for Pledge Acknowledgment','2020-01-26 14:54:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(81,NULL,10,'Subject for Pledge Acknowledgment','2020-06-21 19:10:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(82,NULL,10,'Subject for Pledge Acknowledgment','2020-05-09 04:20:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(83,NULL,9,'Subject for Tell a Friend','2019-11-30 23:20:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(84,NULL,9,'Subject for Tell a Friend','2019-11-03 17:00:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(85,NULL,10,'Subject for Pledge Acknowledgment','2020-07-24 05:06:07',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(86,NULL,10,'Subject for Pledge Acknowledgment','2020-07-10 13:36:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(87,NULL,10,'Subject for Pledge Acknowledgment','2019-10-22 05:26:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(88,NULL,10,'Subject for Pledge Acknowledgment','2020-03-08 05:00:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(89,NULL,10,'Subject for Pledge Acknowledgment','2020-04-22 11:44:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(90,NULL,9,'Subject for Tell a Friend','2020-03-14 00:53:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(91,NULL,10,'Subject for Pledge Acknowledgment','2019-08-10 22:23:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(92,NULL,9,'Subject for Tell a Friend','2020-04-08 23:35:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(93,NULL,9,'Subject for Tell a Friend','2019-12-29 00:02:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(94,NULL,9,'Subject for Tell a Friend','2020-02-28 23:00:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(95,NULL,9,'Subject for Tell a Friend','2019-08-06 11:09:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(96,NULL,10,'Subject for Pledge Acknowledgment','2019-12-13 16:50:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(97,NULL,10,'Subject for Pledge Acknowledgment','2019-11-02 22:14:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(98,NULL,9,'Subject for Tell a Friend','2019-08-08 17:07:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(99,NULL,9,'Subject for Tell a Friend','2020-01-04 06:20:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(100,NULL,9,'Subject for Tell a Friend','2020-01-08 07:54:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(101,NULL,9,'Subject for Tell a Friend','2020-02-18 02:05:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(102,NULL,10,'Subject for Pledge Acknowledgment','2020-06-07 05:18:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(103,NULL,10,'Subject for Pledge Acknowledgment','2019-11-16 01:08:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(104,NULL,9,'Subject for Tell a Friend','2020-06-02 23:35:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(105,NULL,10,'Subject for Pledge Acknowledgment','2020-03-09 08:49:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(106,NULL,9,'Subject for Tell a Friend','2019-12-20 12:35:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(107,NULL,10,'Subject for Pledge Acknowledgment','2019-12-16 12:53:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(108,NULL,9,'Subject for Tell a Friend','2020-06-25 08:57:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(109,NULL,9,'Subject for Tell a Friend','2020-07-24 02:07:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(110,NULL,10,'Subject for Pledge Acknowledgment','2020-03-12 13:01:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(111,NULL,9,'Subject for Tell a Friend','2020-05-03 10:42:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(112,NULL,9,'Subject for Tell a Friend','2020-05-27 20:44:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(113,NULL,10,'Subject for Pledge Acknowledgment','2020-05-07 22:55:07',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(114,NULL,9,'Subject for Tell a Friend','2020-03-09 00:54:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(115,NULL,9,'Subject for Tell a Friend','2019-10-07 20:47:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(116,NULL,10,'Subject for Pledge Acknowledgment','2020-01-19 09:08:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(117,NULL,10,'Subject for Pledge Acknowledgment','2020-06-03 04:14:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(118,NULL,10,'Subject for Pledge Acknowledgment','2020-02-16 10:07:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(119,NULL,9,'Subject for Tell a Friend','2019-10-13 06:54:07',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(120,NULL,9,'Subject for Tell a Friend','2019-08-15 17:03:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(121,NULL,10,'Subject for Pledge Acknowledgment','2020-05-10 03:12:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(122,NULL,9,'Subject for Tell a Friend','2020-06-19 13:14:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(123,NULL,9,'Subject for Tell a Friend','2020-05-27 01:04:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(124,NULL,9,'Subject for Tell a Friend','2020-03-23 01:13:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(125,NULL,10,'Subject for Pledge Acknowledgment','2020-05-27 03:27:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(126,NULL,9,'Subject for Tell a Friend','2020-06-07 01:14:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(127,NULL,9,'Subject for Tell a Friend','2020-03-19 10:17:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(128,NULL,10,'Subject for Pledge Acknowledgment','2020-02-08 22:25:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(129,NULL,9,'Subject for Tell a Friend','2019-10-06 17:15:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(130,NULL,9,'Subject for Tell a Friend','2019-09-14 11:17:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(131,NULL,9,'Subject for Tell a Friend','2019-10-20 23:58:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(132,NULL,9,'Subject for Tell a Friend','2019-11-07 13:58:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(133,NULL,9,'Subject for Tell a Friend','2019-11-18 14:37:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(134,NULL,9,'Subject for Tell a Friend','2019-09-17 13:14:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(135,NULL,9,'Subject for Tell a Friend','2020-04-10 02:52:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(136,NULL,9,'Subject for Tell a Friend','2020-01-09 10:16:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(137,NULL,10,'Subject for Pledge Acknowledgment','2020-02-26 00:42:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(138,NULL,10,'Subject for Pledge Acknowledgment','2020-07-18 16:35:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(139,NULL,9,'Subject for Tell a Friend','2019-11-17 16:14:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(140,NULL,10,'Subject for Pledge Acknowledgment','2019-10-06 04:50:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(141,NULL,10,'Subject for Pledge Acknowledgment','2019-10-06 11:23:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(142,NULL,10,'Subject for Pledge Acknowledgment','2020-06-05 13:39:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(143,NULL,10,'Subject for Pledge Acknowledgment','2020-05-04 09:52:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(144,NULL,10,'Subject for Pledge Acknowledgment','2020-06-13 21:43:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(145,NULL,10,'Subject for Pledge Acknowledgment','2019-11-04 15:35:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(146,NULL,9,'Subject for Tell a Friend','2019-11-16 17:27:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(147,NULL,10,'Subject for Pledge Acknowledgment','2020-02-13 01:40:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(148,NULL,10,'Subject for Pledge Acknowledgment','2019-08-13 22:41:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(149,NULL,10,'Subject for Pledge Acknowledgment','2020-04-11 07:00:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(150,NULL,10,'Subject for Pledge Acknowledgment','2020-06-11 03:48:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(151,NULL,9,'Subject for Tell a Friend','2019-10-13 12:26:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(152,NULL,9,'Subject for Tell a Friend','2020-03-13 08:10:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(153,NULL,9,'Subject for Tell a Friend','2019-12-18 06:53:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(154,NULL,10,'Subject for Pledge Acknowledgment','2019-12-31 11:27:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(155,NULL,10,'Subject for Pledge Acknowledgment','2019-09-06 16:09:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(156,NULL,10,'Subject for Pledge Acknowledgment','2019-11-05 20:33:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(157,NULL,10,'Subject for Pledge Acknowledgment','2019-09-08 18:46:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(158,NULL,10,'Subject for Pledge Acknowledgment','2019-11-14 02:03:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(159,NULL,10,'Subject for Pledge Acknowledgment','2019-09-05 12:00:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(160,NULL,10,'Subject for Pledge Acknowledgment','2019-11-04 18:20:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(161,NULL,10,'Subject for Pledge Acknowledgment','2019-09-02 20:02:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(162,NULL,9,'Subject for Tell a Friend','2019-08-04 07:24:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(163,NULL,10,'Subject for Pledge Acknowledgment','2019-12-30 12:40:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(164,NULL,9,'Subject for Tell a Friend','2020-01-13 09:55:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:03','2020-07-24 05:34:03'),(165,NULL,9,'Subject for Tell a Friend','2020-05-22 02:13:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(166,NULL,10,'Subject for Pledge Acknowledgment','2020-03-07 20:20:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(167,NULL,9,'Subject for Tell a Friend','2019-12-07 17:37:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(168,NULL,9,'Subject for Tell a Friend','2020-01-23 05:29:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(169,NULL,10,'Subject for Pledge Acknowledgment','2020-03-06 01:58:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(170,NULL,10,'Subject for Pledge Acknowledgment','2020-05-02 05:51:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(171,NULL,9,'Subject for Tell a Friend','2020-02-23 09:46:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(172,NULL,10,'Subject for Pledge Acknowledgment','2020-02-19 18:24:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(173,NULL,10,'Subject for Pledge Acknowledgment','2020-07-11 01:44:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(174,NULL,9,'Subject for Tell a Friend','2019-12-20 10:58:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(175,NULL,10,'Subject for Pledge Acknowledgment','2019-12-13 01:20:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(176,NULL,9,'Subject for Tell a Friend','2019-09-08 10:07:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(177,NULL,10,'Subject for Pledge Acknowledgment','2019-11-07 14:17:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(178,NULL,9,'Subject for Tell a Friend','2019-12-11 02:01:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(179,NULL,10,'Subject for Pledge Acknowledgment','2019-11-20 00:32:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(180,NULL,10,'Subject for Pledge Acknowledgment','2020-05-20 05:10:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(181,NULL,9,'Subject for Tell a Friend','2019-08-09 15:29:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(182,NULL,10,'Subject for Pledge Acknowledgment','2019-12-08 14:38:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(183,NULL,9,'Subject for Tell a Friend','2020-06-27 14:10:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(184,NULL,10,'Subject for Pledge Acknowledgment','2019-09-18 01:16:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(185,NULL,10,'Subject for Pledge Acknowledgment','2020-06-26 06:46:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(186,NULL,9,'Subject for Tell a Friend','2020-01-27 11:13:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(187,NULL,9,'Subject for Tell a Friend','2019-07-31 00:01:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(188,NULL,10,'Subject for Pledge Acknowledgment','2019-07-31 03:25:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(189,NULL,9,'Subject for Tell a Friend','2020-06-29 10:20:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(190,NULL,9,'Subject for Tell a Friend','2020-01-10 02:53:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(191,NULL,10,'Subject for Pledge Acknowledgment','2020-02-25 13:46:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(192,NULL,10,'Subject for Pledge Acknowledgment','2020-05-31 10:43:07',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(193,NULL,9,'Subject for Tell a Friend','2019-11-23 11:48:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(194,NULL,10,'Subject for Pledge Acknowledgment','2019-12-14 14:32:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(195,NULL,10,'Subject for Pledge Acknowledgment','2020-03-11 19:59:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(196,NULL,9,'Subject for Tell a Friend','2020-07-19 16:48:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(197,NULL,10,'Subject for Pledge Acknowledgment','2020-07-06 05:44:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(198,NULL,9,'Subject for Tell a Friend','2020-04-12 17:17:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(199,NULL,10,'Subject for Pledge Acknowledgment','2020-02-07 08:00:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(200,NULL,9,'Subject for Tell a Friend','2020-03-01 09:47:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(201,NULL,9,'Subject for Tell a Friend','2019-11-17 03:20:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(202,NULL,9,'Subject for Tell a Friend','2020-05-19 11:32:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(203,NULL,10,'Subject for Pledge Acknowledgment','2020-06-12 16:55:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(204,NULL,9,'Subject for Tell a Friend','2020-03-11 19:26:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(205,NULL,9,'Subject for Tell a Friend','2020-04-08 08:16:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(206,NULL,9,'Subject for Tell a Friend','2020-06-30 04:29:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(207,NULL,10,'Subject for Pledge Acknowledgment','2020-02-11 02:21:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(208,NULL,10,'Subject for Pledge Acknowledgment','2020-01-11 21:31:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(209,NULL,9,'Subject for Tell a Friend','2019-09-02 16:14:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(210,NULL,10,'Subject for Pledge Acknowledgment','2020-06-05 16:10:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(211,NULL,10,'Subject for Pledge Acknowledgment','2019-11-20 17:01:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(212,NULL,10,'Subject for Pledge Acknowledgment','2020-03-07 17:14:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(213,NULL,9,'Subject for Tell a Friend','2020-05-09 23:38:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(214,NULL,9,'Subject for Tell a Friend','2019-10-27 17:22:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(215,NULL,10,'Subject for Pledge Acknowledgment','2020-06-28 16:21:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(216,NULL,9,'Subject for Tell a Friend','2019-11-14 23:18:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(217,NULL,10,'Subject for Pledge Acknowledgment','2020-01-22 09:26:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(218,NULL,9,'Subject for Tell a Friend','2019-12-30 22:38:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(219,NULL,10,'Subject for Pledge Acknowledgment','2020-05-29 16:35:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(220,NULL,9,'Subject for Tell a Friend','2019-08-22 08:39:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(221,NULL,10,'Subject for Pledge Acknowledgment','2020-06-12 09:26:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(222,NULL,10,'Subject for Pledge Acknowledgment','2020-04-16 20:38:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(223,NULL,9,'Subject for Tell a Friend','2020-02-07 05:03:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(224,NULL,10,'Subject for Pledge Acknowledgment','2020-07-06 12:55:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(225,NULL,9,'Subject for Tell a Friend','2020-06-19 11:31:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(226,NULL,10,'Subject for Pledge Acknowledgment','2020-02-23 18:01:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(227,NULL,10,'Subject for Pledge Acknowledgment','2020-06-26 14:42:23',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(228,NULL,10,'Subject for Pledge Acknowledgment','2019-11-06 23:22:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(229,NULL,9,'Subject for Tell a Friend','2019-08-08 11:36:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(230,NULL,9,'Subject for Tell a Friend','2020-05-27 01:43:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(231,NULL,10,'Subject for Pledge Acknowledgment','2019-11-20 04:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(232,NULL,9,'Subject for Tell a Friend','2020-01-15 13:23:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(233,NULL,9,'Subject for Tell a Friend','2019-08-14 16:16:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(234,NULL,9,'Subject for Tell a Friend','2020-07-03 19:32:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(235,NULL,9,'Subject for Tell a Friend','2019-09-06 19:28:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(236,NULL,10,'Subject for Pledge Acknowledgment','2020-02-10 00:44:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(237,NULL,10,'Subject for Pledge Acknowledgment','2020-05-01 22:31:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(238,NULL,9,'Subject for Tell a Friend','2020-04-28 23:59:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(239,NULL,10,'Subject for Pledge Acknowledgment','2020-03-08 04:37:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(240,NULL,9,'Subject for Tell a Friend','2019-12-07 22:06:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(241,NULL,9,'Subject for Tell a Friend','2020-02-29 20:52:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(242,NULL,9,'Subject for Tell a Friend','2020-06-12 21:13:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(243,NULL,9,'Subject for Tell a Friend','2020-06-13 08:27:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(244,NULL,10,'Subject for Pledge Acknowledgment','2019-10-29 18:25:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(245,NULL,9,'Subject for Tell a Friend','2020-06-28 09:05:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(246,NULL,10,'Subject for Pledge Acknowledgment','2020-06-23 03:41:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(247,NULL,9,'Subject for Tell a Friend','2020-05-17 06:36:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(248,NULL,9,'Subject for Tell a Friend','2019-12-07 12:45:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(249,NULL,9,'Subject for Tell a Friend','2019-10-10 07:28:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(250,NULL,9,'Subject for Tell a Friend','2020-01-27 08:09:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(251,NULL,9,'Subject for Tell a Friend','2020-05-06 10:14:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(252,NULL,10,'Subject for Pledge Acknowledgment','2020-02-11 08:57:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(253,NULL,9,'Subject for Tell a Friend','2019-09-19 13:01:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(254,NULL,10,'Subject for Pledge Acknowledgment','2020-02-06 19:48:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(255,NULL,10,'Subject for Pledge Acknowledgment','2020-03-21 10:07:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(256,NULL,9,'Subject for Tell a Friend','2020-04-26 07:02:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(257,NULL,10,'Subject for Pledge Acknowledgment','2019-10-03 03:50:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(258,NULL,10,'Subject for Pledge Acknowledgment','2019-09-14 20:44:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(259,NULL,9,'Subject for Tell a Friend','2020-01-21 02:50:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(260,NULL,9,'Subject for Tell a Friend','2019-10-18 20:45:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(261,NULL,9,'Subject for Tell a Friend','2019-11-04 21:46:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(262,NULL,9,'Subject for Tell a Friend','2019-09-19 16:50:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(263,NULL,10,'Subject for Pledge Acknowledgment','2020-07-12 05:54:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(264,NULL,10,'Subject for Pledge Acknowledgment','2019-12-09 20:53:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(265,NULL,9,'Subject for Tell a Friend','2020-05-27 22:39:23',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(266,NULL,10,'Subject for Pledge Acknowledgment','2019-09-05 22:01:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(267,NULL,9,'Subject for Tell a Friend','2019-12-19 23:37:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(268,NULL,9,'Subject for Tell a Friend','2020-01-13 08:31:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(269,NULL,10,'Subject for Pledge Acknowledgment','2019-12-16 23:57:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(270,NULL,9,'Subject for Tell a Friend','2020-07-22 20:24:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(271,NULL,10,'Subject for Pledge Acknowledgment','2020-04-05 19:39:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(272,NULL,9,'Subject for Tell a Friend','2019-09-14 20:38:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(273,NULL,10,'Subject for Pledge Acknowledgment','2020-01-21 06:14:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(274,NULL,10,'Subject for Pledge Acknowledgment','2020-07-11 05:43:14',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(275,NULL,10,'Subject for Pledge Acknowledgment','2020-02-08 01:11:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(276,NULL,10,'Subject for Pledge Acknowledgment','2020-05-06 03:12:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(277,NULL,10,'Subject for Pledge Acknowledgment','2020-06-27 01:08:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(278,NULL,10,'Subject for Pledge Acknowledgment','2019-11-04 02:21:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(279,NULL,9,'Subject for Tell a Friend','2020-03-10 08:13:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(280,NULL,10,'Subject for Pledge Acknowledgment','2019-12-17 00:22:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(281,NULL,10,'Subject for Pledge Acknowledgment','2019-11-05 08:09:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(282,NULL,9,'Subject for Tell a Friend','2020-02-07 20:17:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(283,NULL,9,'Subject for Tell a Friend','2020-03-31 02:35:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(284,NULL,9,'Subject for Tell a Friend','2019-08-29 22:50:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(285,NULL,10,'Subject for Pledge Acknowledgment','2020-07-07 17:26:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(286,NULL,10,'Subject for Pledge Acknowledgment','2019-09-07 06:13:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(287,NULL,10,'Subject for Pledge Acknowledgment','2020-04-12 02:30:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(288,NULL,10,'Subject for Pledge Acknowledgment','2019-09-29 03:07:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(289,NULL,9,'Subject for Tell a Friend','2019-10-15 09:15:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(290,NULL,9,'Subject for Tell a Friend','2019-10-07 17:32:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(291,NULL,10,'Subject for Pledge Acknowledgment','2019-08-17 03:43:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(292,NULL,9,'Subject for Tell a Friend','2019-12-21 06:36:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(293,NULL,10,'Subject for Pledge Acknowledgment','2020-03-28 13:15:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(294,NULL,10,'Subject for Pledge Acknowledgment','2020-07-01 01:51:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(295,NULL,10,'Subject for Pledge Acknowledgment','2020-01-17 14:41:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(296,NULL,9,'Subject for Tell a Friend','2019-09-26 17:24:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(297,NULL,9,'Subject for Tell a Friend','2019-12-21 16:03:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(298,NULL,9,'Subject for Tell a Friend','2020-04-21 21:33:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(299,NULL,9,'Subject for Tell a Friend','2020-02-14 20:10:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(300,NULL,10,'Subject for Pledge Acknowledgment','2020-01-24 14:23:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(301,NULL,9,'Subject for Tell a Friend','2019-12-01 21:35:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(302,NULL,10,'Subject for Pledge Acknowledgment','2020-02-14 21:34:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(303,NULL,10,'Subject for Pledge Acknowledgment','2020-04-08 14:59:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(304,NULL,9,'Subject for Tell a Friend','2020-02-29 19:42:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(305,NULL,10,'Subject for Pledge Acknowledgment','2020-03-05 05:50:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(306,NULL,10,'Subject for Pledge Acknowledgment','2019-08-06 00:49:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(307,NULL,9,'Subject for Tell a Friend','2020-01-07 20:38:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(308,NULL,10,'Subject for Pledge Acknowledgment','2020-01-24 22:18:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(309,NULL,9,'Subject for Tell a Friend','2020-07-16 16:49:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(310,NULL,10,'Subject for Pledge Acknowledgment','2020-02-05 12:19:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(311,NULL,10,'Subject for Pledge Acknowledgment','2019-08-30 17:55:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(312,NULL,9,'Subject for Tell a Friend','2020-02-26 10:22:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(313,NULL,10,'Subject for Pledge Acknowledgment','2020-05-23 08:57:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(314,NULL,9,'Subject for Tell a Friend','2020-03-05 17:20:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(315,NULL,10,'Subject for Pledge Acknowledgment','2020-05-17 01:32:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(316,NULL,10,'Subject for Pledge Acknowledgment','2020-01-14 23:30:23',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(317,NULL,9,'Subject for Tell a Friend','2020-02-18 06:24:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(318,NULL,9,'Subject for Tell a Friend','2020-06-19 11:37:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(319,NULL,9,'Subject for Tell a Friend','2019-09-29 08:14:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(320,NULL,9,'Subject for Tell a Friend','2020-02-22 00:37:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(321,NULL,10,'Subject for Pledge Acknowledgment','2019-12-08 18:25:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(322,NULL,10,'Subject for Pledge Acknowledgment','2019-10-17 10:56:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(323,NULL,10,'Subject for Pledge Acknowledgment','2020-04-23 01:57:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(324,NULL,10,'Subject for Pledge Acknowledgment','2020-06-27 17:47:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(325,NULL,10,'Subject for Pledge Acknowledgment','2020-03-19 18:32:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(326,NULL,10,'Subject for Pledge Acknowledgment','2019-09-17 22:07:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(327,NULL,10,'Subject for Pledge Acknowledgment','2019-11-13 18:58:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(328,NULL,10,'Subject for Pledge Acknowledgment','2020-04-08 04:02:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(329,NULL,10,'Subject for Pledge Acknowledgment','2020-04-01 09:38:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(330,NULL,9,'Subject for Tell a Friend','2020-07-22 05:32:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(331,NULL,9,'Subject for Tell a Friend','2019-10-16 20:27:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(332,NULL,10,'Subject for Pledge Acknowledgment','2020-05-11 22:33:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(333,NULL,10,'Subject for Pledge Acknowledgment','2020-01-30 06:55:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(334,NULL,10,'Subject for Pledge Acknowledgment','2020-04-24 18:48:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(335,NULL,10,'Subject for Pledge Acknowledgment','2019-09-28 14:50:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(336,NULL,9,'Subject for Tell a Friend','2019-08-12 20:49:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(337,NULL,9,'Subject for Tell a Friend','2019-11-13 10:04:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(338,NULL,10,'Subject for Pledge Acknowledgment','2020-02-08 16:21:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(339,NULL,10,'Subject for Pledge Acknowledgment','2020-06-29 19:20:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(340,NULL,10,'Subject for Pledge Acknowledgment','2019-08-22 01:48:14',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(341,NULL,9,'Subject for Tell a Friend','2019-10-25 08:48:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(342,NULL,10,'Subject for Pledge Acknowledgment','2020-05-31 11:03:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(343,NULL,9,'Subject for Tell a Friend','2019-08-18 03:55:07',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(344,NULL,9,'Subject for Tell a Friend','2019-07-30 00:06:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(345,NULL,9,'Subject for Tell a Friend','2019-10-12 17:31:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(346,NULL,9,'Subject for Tell a Friend','2019-10-27 18:37:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(347,NULL,10,'Subject for Pledge Acknowledgment','2020-06-09 01:47:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(348,NULL,9,'Subject for Tell a Friend','2020-06-02 23:04:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(349,NULL,9,'Subject for Tell a Friend','2020-01-20 04:15:24',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(350,NULL,10,'Subject for Pledge Acknowledgment','2020-06-27 05:57:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(351,NULL,10,'Subject for Pledge Acknowledgment','2020-01-25 12:44:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(352,NULL,10,'Subject for Pledge Acknowledgment','2020-01-28 17:13:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(353,NULL,10,'Subject for Pledge Acknowledgment','2020-01-14 21:30:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(354,NULL,10,'Subject for Pledge Acknowledgment','2020-03-10 11:48:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(355,NULL,10,'Subject for Pledge Acknowledgment','2020-06-22 18:03:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(356,NULL,9,'Subject for Tell a Friend','2020-04-09 08:16:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(357,NULL,9,'Subject for Tell a Friend','2019-11-28 20:50:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(358,NULL,10,'Subject for Pledge Acknowledgment','2020-05-31 07:03:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(359,NULL,10,'Subject for Pledge Acknowledgment','2019-10-23 11:48:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(360,NULL,9,'Subject for Tell a Friend','2019-11-18 11:48:24',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(361,NULL,10,'Subject for Pledge Acknowledgment','2019-08-22 01:51:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(362,NULL,10,'Subject for Pledge Acknowledgment','2020-02-18 17:40:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(363,NULL,10,'Subject for Pledge Acknowledgment','2019-10-23 04:11:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(364,NULL,10,'Subject for Pledge Acknowledgment','2020-02-07 14:10:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(365,NULL,10,'Subject for Pledge Acknowledgment','2020-05-14 20:15:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(366,NULL,9,'Subject for Tell a Friend','2020-05-05 23:45:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(367,NULL,10,'Subject for Pledge Acknowledgment','2019-09-24 07:43:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(368,NULL,10,'Subject for Pledge Acknowledgment','2020-06-10 04:34:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(369,NULL,10,'Subject for Pledge Acknowledgment','2019-08-08 11:17:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(370,NULL,10,'Subject for Pledge Acknowledgment','2020-04-08 08:41:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(371,NULL,10,'Subject for Pledge Acknowledgment','2020-06-13 22:12:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(372,NULL,9,'Subject for Tell a Friend','2020-05-30 07:26:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(373,NULL,9,'Subject for Tell a Friend','2020-04-09 09:28:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(374,NULL,10,'Subject for Pledge Acknowledgment','2020-03-15 22:12:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(375,NULL,10,'Subject for Pledge Acknowledgment','2019-09-05 18:06:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(376,NULL,9,'Subject for Tell a Friend','2020-06-12 22:31:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(377,NULL,10,'Subject for Pledge Acknowledgment','2019-11-29 07:58:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(378,NULL,9,'Subject for Tell a Friend','2020-05-28 04:19:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(379,NULL,9,'Subject for Tell a Friend','2019-09-02 12:53:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(380,NULL,9,'Subject for Tell a Friend','2019-10-05 03:57:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(381,NULL,9,'Subject for Tell a Friend','2019-12-15 02:41:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(382,NULL,9,'Subject for Tell a Friend','2020-06-18 14:58:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(383,NULL,10,'Subject for Pledge Acknowledgment','2019-12-25 10:03:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(384,NULL,10,'Subject for Pledge Acknowledgment','2020-07-22 08:38:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(385,NULL,10,'Subject for Pledge Acknowledgment','2020-03-22 19:02:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(386,NULL,9,'Subject for Tell a Friend','2020-04-02 17:16:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(387,NULL,10,'Subject for Pledge Acknowledgment','2019-11-16 08:11:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(388,NULL,10,'Subject for Pledge Acknowledgment','2020-05-18 08:39:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(389,NULL,10,'Subject for Pledge Acknowledgment','2019-09-24 02:32:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(390,NULL,9,'Subject for Tell a Friend','2020-07-03 14:14:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(391,NULL,10,'Subject for Pledge Acknowledgment','2019-08-20 12:40:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(392,NULL,10,'Subject for Pledge Acknowledgment','2019-08-02 01:56:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(393,NULL,9,'Subject for Tell a Friend','2020-06-09 22:00:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(394,NULL,10,'Subject for Pledge Acknowledgment','2020-05-05 23:00:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(395,NULL,9,'Subject for Tell a Friend','2019-07-31 09:57:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(396,NULL,9,'Subject for Tell a Friend','2020-03-05 04:12:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(397,NULL,9,'Subject for Tell a Friend','2020-04-02 17:34:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(398,NULL,10,'Subject for Pledge Acknowledgment','2020-05-04 10:26:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(399,NULL,10,'Subject for Pledge Acknowledgment','2019-11-16 18:32:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(400,NULL,9,'Subject for Tell a Friend','2020-05-23 19:16:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(401,NULL,9,'Subject for Tell a Friend','2019-08-30 22:46:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(402,NULL,10,'Subject for Pledge Acknowledgment','2020-04-08 15:29:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(403,NULL,9,'Subject for Tell a Friend','2020-02-16 04:02:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(404,NULL,10,'Subject for Pledge Acknowledgment','2019-12-26 07:54:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(405,NULL,10,'Subject for Pledge Acknowledgment','2019-12-18 16:37:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(406,NULL,10,'Subject for Pledge Acknowledgment','2019-08-08 16:44:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(407,NULL,9,'Subject for Tell a Friend','2020-04-19 04:26:23',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(408,NULL,9,'Subject for Tell a Friend','2020-03-25 23:46:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(409,NULL,10,'Subject for Pledge Acknowledgment','2020-02-26 12:32:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(410,NULL,9,'Subject for Tell a Friend','2019-10-06 18:55:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(411,NULL,10,'Subject for Pledge Acknowledgment','2020-01-13 02:54:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(412,NULL,9,'Subject for Tell a Friend','2019-07-30 11:10:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(413,NULL,10,'Subject for Pledge Acknowledgment','2020-07-02 20:51:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(414,NULL,10,'Subject for Pledge Acknowledgment','2020-03-28 14:14:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(415,NULL,10,'Subject for Pledge Acknowledgment','2019-10-29 11:43:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(416,NULL,9,'Subject for Tell a Friend','2020-07-03 09:41:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(417,NULL,9,'Subject for Tell a Friend','2020-01-25 20:49:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(418,NULL,10,'Subject for Pledge Acknowledgment','2020-02-04 07:28:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(419,NULL,9,'Subject for Tell a Friend','2019-09-17 21:01:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(420,NULL,9,'Subject for Tell a Friend','2019-12-10 11:40:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(421,NULL,10,'Subject for Pledge Acknowledgment','2020-05-15 20:52:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(422,NULL,10,'Subject for Pledge Acknowledgment','2020-04-13 21:09:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(423,NULL,9,'Subject for Tell a Friend','2020-06-03 21:24:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(424,NULL,10,'Subject for Pledge Acknowledgment','2019-08-23 01:19:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(425,NULL,10,'Subject for Pledge Acknowledgment','2019-10-13 18:46:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(426,NULL,9,'Subject for Tell a Friend','2020-03-26 09:54:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(427,NULL,10,'Subject for Pledge Acknowledgment','2019-10-12 08:31:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(428,NULL,10,'Subject for Pledge Acknowledgment','2019-10-29 00:26:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(429,NULL,9,'Subject for Tell a Friend','2020-07-02 11:54:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(430,NULL,10,'Subject for Pledge Acknowledgment','2019-12-20 06:30:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(431,NULL,10,'Subject for Pledge Acknowledgment','2020-04-21 02:15:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(432,NULL,10,'Subject for Pledge Acknowledgment','2020-01-19 14:07:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(433,NULL,9,'Subject for Tell a Friend','2020-07-17 01:52:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(434,NULL,9,'Subject for Tell a Friend','2019-11-09 15:37:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(435,NULL,10,'Subject for Pledge Acknowledgment','2019-08-29 11:56:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(436,NULL,9,'Subject for Tell a Friend','2019-10-06 13:22:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(437,NULL,9,'Subject for Tell a Friend','2020-07-14 03:54:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(438,NULL,10,'Subject for Pledge Acknowledgment','2019-10-18 16:58:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(439,NULL,9,'Subject for Tell a Friend','2020-02-12 15:48:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(440,NULL,10,'Subject for Pledge Acknowledgment','2019-08-08 09:50:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(441,NULL,10,'Subject for Pledge Acknowledgment','2019-10-15 01:03:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(442,NULL,9,'Subject for Tell a Friend','2020-01-30 01:44:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(443,NULL,9,'Subject for Tell a Friend','2020-06-10 21:00:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(444,NULL,10,'Subject for Pledge Acknowledgment','2019-12-09 16:05:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(445,NULL,9,'Subject for Tell a Friend','2020-02-10 03:53:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(446,NULL,10,'Subject for Pledge Acknowledgment','2019-08-12 20:53:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(447,NULL,9,'Subject for Tell a Friend','2020-03-19 16:30:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(448,NULL,9,'Subject for Tell a Friend','2019-12-23 14:30:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(449,NULL,10,'Subject for Pledge Acknowledgment','2019-12-08 21:53:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(450,NULL,9,'Subject for Tell a Friend','2020-06-28 01:45:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(451,1,6,'$ 125.00-Apr 2007 Mailer 1','2010-04-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(452,2,6,'$ 50.00-Online: Save the Penguins','2010-03-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(453,3,6,'$ 25.00-Apr 2007 Mailer 1','2010-04-29 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(454,4,6,'$ 50.00-Apr 2007 Mailer 1','2010-04-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(455,5,6,'$ 500.00-Apr 2007 Mailer 1','2010-04-15 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(456,6,6,'$ 175.00-Apr 2007 Mailer 1','2010-04-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(457,7,6,'$ 50.00-Online: Save the Penguins','2010-03-27 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(458,8,6,'$ 10.00-Online: Save the Penguins','2010-03-08 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(459,9,6,'$ 250.00-Online: Save the Penguins','2010-04-22 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(460,10,6,NULL,'2009-07-01 11:53:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(461,11,6,NULL,'2009-07-01 12:55:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(462,12,6,NULL,'2009-10-01 11:53:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(463,13,6,NULL,'2009-12-01 12:55:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(464,1,7,'General','2020-07-24 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(465,2,7,'Student','2020-07-23 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(466,3,7,'General','2020-07-22 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(467,4,7,'Student','2020-07-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(468,5,7,'General','2018-06-22 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(469,6,7,'Student','2020-07-19 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(470,7,7,'General','2020-07-18 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(471,8,7,'Student','2020-07-17 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(472,9,7,'General','2020-07-16 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(473,10,7,'General','2018-05-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(474,11,7,'Lifetime','2020-07-14 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(475,12,7,'Student','2020-07-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(476,13,7,'General','2020-07-12 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(477,14,7,'Student','2020-07-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(478,15,7,'General','2018-04-03 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(479,16,7,'Student','2020-07-09 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(480,17,7,'General','2020-07-08 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(481,18,7,'Student','2020-07-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(482,19,7,'General','2020-07-06 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(483,20,7,'Student','2019-07-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(484,21,7,'General','2020-07-04 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(485,22,7,'Lifetime','2020-07-03 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(486,23,7,'General','2020-07-02 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(487,24,7,'Student','2020-07-01 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(488,25,7,'General','2018-01-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(489,26,7,'Student','2020-06-29 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(490,27,7,'General','2020-06-28 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(491,28,7,'Student','2020-06-27 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(492,29,7,'General','2020-06-26 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(493,30,7,'Student','2019-06-25 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(494,14,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(495,15,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(496,16,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(497,17,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(498,18,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(499,19,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(500,20,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(501,21,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(502,22,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(503,23,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(504,24,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(505,25,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(506,26,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(507,27,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(508,28,6,'$ 100.00 - General Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(509,29,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(510,30,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(511,31,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(512,32,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(513,33,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(514,34,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(515,35,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(516,36,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(517,37,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(518,38,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(519,39,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(520,40,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(521,41,6,'$ 50.00 - Student Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(522,42,6,'$ 1200.00 - Lifetime Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(523,43,6,'$ 1200.00 - Lifetime Membership: Offline signup','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(525,1,5,'NULL','2009-01-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(526,2,5,'NULL','2008-05-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(527,3,5,'NULL','2008-05-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(528,4,5,'NULL','2008-10-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(529,5,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(530,6,5,'NULL','2008-03-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(531,7,5,'NULL','2009-07-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(532,8,5,'NULL','2009-03-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(533,9,5,'NULL','2008-02-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(534,10,5,'NULL','2008-02-01 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(535,11,5,'NULL','2009-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(536,12,5,'NULL','2009-03-06 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(537,13,5,'NULL','2008-06-04 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(538,14,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(539,15,5,'NULL','2008-07-04 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(540,16,5,'NULL','2009-01-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(541,17,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(542,18,5,'NULL','2009-03-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(543,19,5,'NULL','2008-10-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(544,20,5,'NULL','2009-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(545,21,5,'NULL','2008-03-25 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(546,22,5,'NULL','2009-10-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(547,23,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(548,24,5,'NULL','2008-03-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(549,25,5,'NULL','2008-04-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(550,26,5,'NULL','2009-01-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(551,27,5,'NULL','2008-05-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(552,28,5,'NULL','2009-12-12 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(553,29,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(554,30,5,'NULL','2009-12-14 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(555,31,5,'NULL','2009-12-15 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(556,32,5,'NULL','2009-07-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(557,33,5,'NULL','2009-03-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(558,34,5,'NULL','2009-12-15 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(559,35,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(560,36,5,'NULL','2009-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(561,37,5,'NULL','2009-03-06 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(562,38,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(563,39,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(564,40,5,'NULL','2009-12-14 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(565,41,5,'NULL','2009-01-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(566,42,5,'NULL','2009-12-15 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(567,43,5,'NULL','2009-03-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(568,44,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(569,45,5,'NULL','2009-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(570,46,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(571,47,5,'NULL','2009-10-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(572,48,5,'NULL','2009-12-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(573,49,5,'NULL','2009-03-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(574,50,5,'NULL','2009-04-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(575,45,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(576,46,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(577,47,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(578,48,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(579,49,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(580,50,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(581,51,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(582,52,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(583,53,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(584,54,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(585,55,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(586,56,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(587,57,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(588,58,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(589,59,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(590,60,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(591,61,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(592,62,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(593,63,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(594,64,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(595,65,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(596,66,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(597,67,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(598,68,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(599,69,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(600,70,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(601,71,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(602,72,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(603,73,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(604,74,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(605,75,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(606,76,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(607,77,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(608,78,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(609,79,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(610,80,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(611,81,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(612,82,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(613,83,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(614,84,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(615,85,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(616,86,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(617,87,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(618,88,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(619,89,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(620,90,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(621,91,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(622,92,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(623,93,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04'),(624,94,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-07-24 15:34:04',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-07-24 05:34:04','2020-07-24 05:34:04');
+INSERT INTO `civicrm_activity` (`id`, `source_record_id`, `activity_type_id`, `subject`, `activity_date_time`, `duration`, `location`, `phone_id`, `phone_number`, `details`, `status_id`, `priority_id`, `parent_id`, `is_test`, `medium_id`, `is_auto`, `relationship_id`, `is_current_revision`, `original_id`, `result`, `is_deleted`, `campaign_id`, `engagement_level`, `weight`, `is_star`, `created_date`, `modified_date`) VALUES (1,NULL,10,'Subject for Pledge Acknowledgment','2020-10-02 08:42:14',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(2,NULL,9,'Subject for Tell a Friend','2020-04-07 01:30:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(3,NULL,10,'Subject for Pledge Acknowledgment','2019-10-18 22:18:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(4,NULL,10,'Subject for Pledge Acknowledgment','2020-07-29 08:13:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(5,NULL,10,'Subject for Pledge Acknowledgment','2019-11-02 17:42:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(6,NULL,10,'Subject for Pledge Acknowledgment','2020-01-29 10:23:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(7,NULL,9,'Subject for Tell a Friend','2019-12-24 03:21:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(8,NULL,9,'Subject for Tell a Friend','2020-08-28 15:28:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(9,NULL,9,'Subject for Tell a Friend','2020-05-30 13:07:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(10,NULL,9,'Subject for Tell a Friend','2019-12-16 10:13:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(11,NULL,9,'Subject for Tell a Friend','2020-09-29 00:29:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(12,NULL,10,'Subject for Pledge Acknowledgment','2020-07-21 23:04:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(13,NULL,9,'Subject for Tell a Friend','2020-08-13 13:23:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(14,NULL,10,'Subject for Pledge Acknowledgment','2020-01-23 11:01:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(15,NULL,9,'Subject for Tell a Friend','2020-06-03 14:50:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(16,NULL,10,'Subject for Pledge Acknowledgment','2020-06-05 04:20:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(17,NULL,9,'Subject for Tell a Friend','2019-10-30 10:52:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(18,NULL,9,'Subject for Tell a Friend','2020-01-02 11:07:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(19,NULL,10,'Subject for Pledge Acknowledgment','2020-01-27 10:18:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(20,NULL,9,'Subject for Tell a Friend','2020-03-21 05:58:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(21,NULL,9,'Subject for Tell a Friend','2019-10-19 16:04:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(22,NULL,10,'Subject for Pledge Acknowledgment','2019-11-24 22:08:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(23,NULL,10,'Subject for Pledge Acknowledgment','2020-06-06 16:32:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(24,NULL,9,'Subject for Tell a Friend','2020-01-05 14:17:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(25,NULL,9,'Subject for Tell a Friend','2019-11-01 06:46:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(26,NULL,10,'Subject for Pledge Acknowledgment','2020-04-26 06:12:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(27,NULL,9,'Subject for Tell a Friend','2020-09-28 12:48:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(28,NULL,10,'Subject for Pledge Acknowledgment','2020-03-31 09:59:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(29,NULL,9,'Subject for Tell a Friend','2020-06-23 12:22:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(30,NULL,10,'Subject for Pledge Acknowledgment','2020-08-04 09:24:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(31,NULL,9,'Subject for Tell a Friend','2020-06-13 16:11:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(32,NULL,10,'Subject for Pledge Acknowledgment','2020-05-27 06:48:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(33,NULL,9,'Subject for Tell a Friend','2020-08-15 22:20:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(34,NULL,9,'Subject for Tell a Friend','2020-07-05 13:41:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(35,NULL,10,'Subject for Pledge Acknowledgment','2020-08-11 19:48:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(36,NULL,10,'Subject for Pledge Acknowledgment','2020-02-24 16:09:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(37,NULL,9,'Subject for Tell a Friend','2020-02-16 05:03:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(38,NULL,10,'Subject for Pledge Acknowledgment','2020-07-31 11:42:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(39,NULL,9,'Subject for Tell a Friend','2020-04-08 20:29:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(40,NULL,10,'Subject for Pledge Acknowledgment','2020-01-29 02:06:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(41,NULL,10,'Subject for Pledge Acknowledgment','2020-03-13 00:31:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(42,NULL,10,'Subject for Pledge Acknowledgment','2020-08-02 19:05:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(43,NULL,10,'Subject for Pledge Acknowledgment','2019-12-01 21:46:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(44,NULL,10,'Subject for Pledge Acknowledgment','2020-08-19 08:42:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(45,NULL,9,'Subject for Tell a Friend','2020-03-30 20:01:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(46,NULL,9,'Subject for Tell a Friend','2020-09-14 01:54:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(47,NULL,9,'Subject for Tell a Friend','2020-06-23 15:38:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(48,NULL,9,'Subject for Tell a Friend','2020-05-01 05:00:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(49,NULL,9,'Subject for Tell a Friend','2020-07-03 12:16:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(50,NULL,9,'Subject for Tell a Friend','2020-03-03 09:08:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(51,NULL,9,'Subject for Tell a Friend','2020-07-03 02:17:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(52,NULL,10,'Subject for Pledge Acknowledgment','2020-01-17 21:26:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(53,NULL,9,'Subject for Tell a Friend','2019-10-17 21:51:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(54,NULL,9,'Subject for Tell a Friend','2019-11-22 00:16:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(55,NULL,9,'Subject for Tell a Friend','2020-08-31 11:31:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(56,NULL,9,'Subject for Tell a Friend','2020-05-26 12:06:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(57,NULL,9,'Subject for Tell a Friend','2020-09-27 15:44:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(58,NULL,10,'Subject for Pledge Acknowledgment','2020-08-09 16:08:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(59,NULL,10,'Subject for Pledge Acknowledgment','2020-01-04 12:25:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(60,NULL,9,'Subject for Tell a Friend','2020-09-25 14:20:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(61,NULL,10,'Subject for Pledge Acknowledgment','2019-10-10 06:09:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(62,NULL,10,'Subject for Pledge Acknowledgment','2020-03-30 02:20:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(63,NULL,10,'Subject for Pledge Acknowledgment','2020-08-20 11:56:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(64,NULL,9,'Subject for Tell a Friend','2020-04-15 04:21:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(65,NULL,9,'Subject for Tell a Friend','2019-11-27 12:48:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(66,NULL,10,'Subject for Pledge Acknowledgment','2020-06-15 16:26:24',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(67,NULL,10,'Subject for Pledge Acknowledgment','2020-02-12 06:26:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(68,NULL,9,'Subject for Tell a Friend','2020-02-14 12:35:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(69,NULL,10,'Subject for Pledge Acknowledgment','2020-01-11 09:13:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(70,NULL,9,'Subject for Tell a Friend','2020-04-22 12:15:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(71,NULL,9,'Subject for Tell a Friend','2020-01-17 16:59:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(72,NULL,10,'Subject for Pledge Acknowledgment','2020-02-24 14:19:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(73,NULL,10,'Subject for Pledge Acknowledgment','2019-11-23 20:11:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(74,NULL,10,'Subject for Pledge Acknowledgment','2020-08-15 15:57:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(75,NULL,10,'Subject for Pledge Acknowledgment','2020-08-08 01:13:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(76,NULL,10,'Subject for Pledge Acknowledgment','2020-01-02 09:47:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(77,NULL,10,'Subject for Pledge Acknowledgment','2020-01-11 07:41:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(78,NULL,9,'Subject for Tell a Friend','2020-05-25 13:10:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(79,NULL,10,'Subject for Pledge Acknowledgment','2019-12-03 17:02:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(80,NULL,10,'Subject for Pledge Acknowledgment','2020-04-23 13:24:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(81,NULL,9,'Subject for Tell a Friend','2020-09-28 06:10:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(82,NULL,9,'Subject for Tell a Friend','2020-07-15 18:49:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(83,NULL,10,'Subject for Pledge Acknowledgment','2019-12-09 06:50:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(84,NULL,10,'Subject for Pledge Acknowledgment','2019-10-19 03:38:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(85,NULL,10,'Subject for Pledge Acknowledgment','2020-09-27 06:20:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:13','2020-10-08 01:49:13'),(86,NULL,9,'Subject for Tell a Friend','2019-12-05 22:06:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(87,NULL,9,'Subject for Tell a Friend','2019-11-02 23:47:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(88,NULL,9,'Subject for Tell a Friend','2020-04-21 05:12:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(89,NULL,9,'Subject for Tell a Friend','2020-01-23 14:52:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(90,NULL,9,'Subject for Tell a Friend','2020-02-07 17:15:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(91,NULL,9,'Subject for Tell a Friend','2020-06-10 22:05:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(92,NULL,9,'Subject for Tell a Friend','2020-05-03 03:53:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(93,NULL,10,'Subject for Pledge Acknowledgment','2020-09-12 06:43:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(94,NULL,9,'Subject for Tell a Friend','2020-01-22 06:14:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(95,NULL,9,'Subject for Tell a Friend','2020-01-28 07:02:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(96,NULL,9,'Subject for Tell a Friend','2020-08-16 17:21:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(97,NULL,9,'Subject for Tell a Friend','2019-11-10 16:38:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(98,NULL,9,'Subject for Tell a Friend','2020-03-20 12:33:24',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(99,NULL,10,'Subject for Pledge Acknowledgment','2019-10-27 13:58:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(100,NULL,10,'Subject for Pledge Acknowledgment','2020-05-02 23:40:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(101,NULL,10,'Subject for Pledge Acknowledgment','2020-02-04 06:47:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(102,NULL,10,'Subject for Pledge Acknowledgment','2020-03-24 15:45:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(103,NULL,10,'Subject for Pledge Acknowledgment','2020-02-11 07:48:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(104,NULL,9,'Subject for Tell a Friend','2020-07-23 11:24:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(105,NULL,9,'Subject for Tell a Friend','2019-11-27 01:01:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(106,NULL,10,'Subject for Pledge Acknowledgment','2019-10-28 12:56:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(107,NULL,9,'Subject for Tell a Friend','2020-10-04 17:37:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(108,NULL,9,'Subject for Tell a Friend','2020-01-26 13:32:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(109,NULL,10,'Subject for Pledge Acknowledgment','2019-12-11 14:18:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(110,NULL,9,'Subject for Tell a Friend','2020-08-15 16:02:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(111,NULL,9,'Subject for Tell a Friend','2019-12-19 10:49:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(112,NULL,9,'Subject for Tell a Friend','2020-06-20 07:40:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(113,NULL,9,'Subject for Tell a Friend','2020-06-07 05:32:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(114,NULL,9,'Subject for Tell a Friend','2020-09-26 17:39:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(115,NULL,9,'Subject for Tell a Friend','2020-04-24 13:22:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(116,NULL,10,'Subject for Pledge Acknowledgment','2019-11-14 16:31:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(117,NULL,10,'Subject for Pledge Acknowledgment','2019-12-17 23:22:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(118,NULL,10,'Subject for Pledge Acknowledgment','2019-12-09 10:44:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(119,NULL,9,'Subject for Tell a Friend','2020-06-09 22:31:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(120,NULL,9,'Subject for Tell a Friend','2020-06-15 04:49:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(121,NULL,9,'Subject for Tell a Friend','2020-04-20 08:44:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(122,NULL,10,'Subject for Pledge Acknowledgment','2020-09-12 03:14:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(123,NULL,10,'Subject for Pledge Acknowledgment','2020-07-17 21:21:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(124,NULL,9,'Subject for Tell a Friend','2020-04-23 01:15:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(125,NULL,10,'Subject for Pledge Acknowledgment','2020-03-20 09:28:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(126,NULL,9,'Subject for Tell a Friend','2020-04-08 02:12:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(127,NULL,10,'Subject for Pledge Acknowledgment','2020-06-22 07:37:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(128,NULL,9,'Subject for Tell a Friend','2019-11-07 01:13:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(129,NULL,9,'Subject for Tell a Friend','2020-04-09 09:06:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(130,NULL,9,'Subject for Tell a Friend','2020-08-07 16:34:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(131,NULL,10,'Subject for Pledge Acknowledgment','2020-02-08 01:10:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(132,NULL,9,'Subject for Tell a Friend','2020-03-11 05:53:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(133,NULL,9,'Subject for Tell a Friend','2019-12-02 18:38:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(134,NULL,9,'Subject for Tell a Friend','2020-01-31 21:53:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(135,NULL,10,'Subject for Pledge Acknowledgment','2020-06-22 11:14:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(136,NULL,10,'Subject for Pledge Acknowledgment','2020-07-25 03:39:07',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(137,NULL,10,'Subject for Pledge Acknowledgment','2020-03-21 09:49:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(138,NULL,10,'Subject for Pledge Acknowledgment','2019-11-23 02:09:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(139,NULL,9,'Subject for Tell a Friend','2020-01-22 16:21:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(140,NULL,10,'Subject for Pledge Acknowledgment','2019-10-17 15:15:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(141,NULL,10,'Subject for Pledge Acknowledgment','2020-09-29 16:51:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(142,NULL,9,'Subject for Tell a Friend','2020-06-12 03:21:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(143,NULL,10,'Subject for Pledge Acknowledgment','2019-12-23 22:46:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(144,NULL,9,'Subject for Tell a Friend','2020-03-28 08:45:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(145,NULL,10,'Subject for Pledge Acknowledgment','2019-11-01 09:38:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(146,NULL,9,'Subject for Tell a Friend','2020-04-29 16:24:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(147,NULL,9,'Subject for Tell a Friend','2020-03-23 11:41:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(148,NULL,9,'Subject for Tell a Friend','2020-02-22 07:30:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(149,NULL,9,'Subject for Tell a Friend','2020-04-05 17:32:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(150,NULL,9,'Subject for Tell a Friend','2020-09-13 05:46:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(151,NULL,10,'Subject for Pledge Acknowledgment','2020-04-16 12:52:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(152,NULL,9,'Subject for Tell a Friend','2020-07-09 03:25:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(153,NULL,10,'Subject for Pledge Acknowledgment','2020-07-15 23:49:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(154,NULL,9,'Subject for Tell a Friend','2020-09-11 05:14:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(155,NULL,9,'Subject for Tell a Friend','2020-08-07 00:32:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(156,NULL,9,'Subject for Tell a Friend','2019-12-01 17:12:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(157,NULL,10,'Subject for Pledge Acknowledgment','2019-12-11 08:57:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(158,NULL,9,'Subject for Tell a Friend','2020-08-27 03:36:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(159,NULL,9,'Subject for Tell a Friend','2020-07-11 01:58:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(160,NULL,9,'Subject for Tell a Friend','2020-05-02 14:26:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(161,NULL,10,'Subject for Pledge Acknowledgment','2020-01-05 01:28:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(162,NULL,10,'Subject for Pledge Acknowledgment','2020-03-18 07:43:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(163,NULL,9,'Subject for Tell a Friend','2020-07-13 09:29:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(164,NULL,9,'Subject for Tell a Friend','2020-09-12 14:18:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(165,NULL,10,'Subject for Pledge Acknowledgment','2020-02-12 05:41:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(166,NULL,10,'Subject for Pledge Acknowledgment','2020-04-30 11:27:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(167,NULL,10,'Subject for Pledge Acknowledgment','2020-08-27 20:46:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(168,NULL,10,'Subject for Pledge Acknowledgment','2020-03-10 14:39:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(169,NULL,9,'Subject for Tell a Friend','2019-12-11 13:19:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(170,NULL,9,'Subject for Tell a Friend','2020-06-26 04:59:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(171,NULL,10,'Subject for Pledge Acknowledgment','2019-12-15 07:50:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(172,NULL,10,'Subject for Pledge Acknowledgment','2020-03-24 00:09:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(173,NULL,9,'Subject for Tell a Friend','2019-11-10 09:05:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(174,NULL,9,'Subject for Tell a Friend','2019-10-30 08:16:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(175,NULL,10,'Subject for Pledge Acknowledgment','2020-03-30 01:05:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(176,NULL,10,'Subject for Pledge Acknowledgment','2020-06-09 03:37:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(177,NULL,10,'Subject for Pledge Acknowledgment','2020-04-18 10:49:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(178,NULL,9,'Subject for Tell a Friend','2020-03-16 15:14:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(179,NULL,9,'Subject for Tell a Friend','2020-01-24 11:45:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(180,NULL,9,'Subject for Tell a Friend','2020-03-17 09:44:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(181,NULL,9,'Subject for Tell a Friend','2020-03-10 02:38:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(182,NULL,10,'Subject for Pledge Acknowledgment','2019-12-02 09:17:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(183,NULL,10,'Subject for Pledge Acknowledgment','2020-02-12 09:50:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(184,NULL,9,'Subject for Tell a Friend','2020-06-27 18:32:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(185,NULL,10,'Subject for Pledge Acknowledgment','2019-11-12 10:46:24',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(186,NULL,10,'Subject for Pledge Acknowledgment','2020-10-02 21:03:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(187,NULL,10,'Subject for Pledge Acknowledgment','2020-07-31 11:28:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(188,NULL,10,'Subject for Pledge Acknowledgment','2020-07-28 05:00:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(189,NULL,9,'Subject for Tell a Friend','2019-11-12 16:46:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(190,NULL,9,'Subject for Tell a Friend','2020-07-24 10:57:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(191,NULL,10,'Subject for Pledge Acknowledgment','2020-01-03 14:05:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(192,NULL,10,'Subject for Pledge Acknowledgment','2020-05-25 22:37:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(193,NULL,10,'Subject for Pledge Acknowledgment','2020-09-17 23:09:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(194,NULL,9,'Subject for Tell a Friend','2020-07-13 03:21:24',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(195,NULL,10,'Subject for Pledge Acknowledgment','2020-05-18 21:34:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(196,NULL,9,'Subject for Tell a Friend','2020-06-28 03:26:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(197,NULL,9,'Subject for Tell a Friend','2020-07-19 09:21:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(198,NULL,10,'Subject for Pledge Acknowledgment','2020-01-03 14:19:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(199,NULL,10,'Subject for Pledge Acknowledgment','2020-09-24 23:46:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(200,NULL,9,'Subject for Tell a Friend','2020-08-30 22:51:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(201,NULL,10,'Subject for Pledge Acknowledgment','2019-10-20 14:29:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(202,NULL,9,'Subject for Tell a Friend','2020-09-22 01:06:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(203,NULL,9,'Subject for Tell a Friend','2020-07-28 23:18:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(204,NULL,10,'Subject for Pledge Acknowledgment','2019-10-16 13:30:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(205,NULL,10,'Subject for Pledge Acknowledgment','2020-03-24 04:14:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(206,NULL,9,'Subject for Tell a Friend','2020-02-03 22:48:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(207,NULL,9,'Subject for Tell a Friend','2020-02-17 12:54:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(208,NULL,10,'Subject for Pledge Acknowledgment','2020-03-29 22:36:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(209,NULL,9,'Subject for Tell a Friend','2020-01-07 23:36:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(210,NULL,10,'Subject for Pledge Acknowledgment','2020-09-21 00:17:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(211,NULL,10,'Subject for Pledge Acknowledgment','2020-07-26 11:51:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(212,NULL,10,'Subject for Pledge Acknowledgment','2020-07-28 12:45:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(213,NULL,9,'Subject for Tell a Friend','2020-01-26 02:43:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(214,NULL,10,'Subject for Pledge Acknowledgment','2020-05-22 19:16:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(215,NULL,9,'Subject for Tell a Friend','2020-05-08 23:34:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(216,NULL,9,'Subject for Tell a Friend','2019-12-03 01:28:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(217,NULL,10,'Subject for Pledge Acknowledgment','2019-11-12 07:36:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(218,NULL,9,'Subject for Tell a Friend','2020-05-04 02:23:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(219,NULL,10,'Subject for Pledge Acknowledgment','2020-01-12 04:37:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(220,NULL,9,'Subject for Tell a Friend','2020-06-23 06:47:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(221,NULL,9,'Subject for Tell a Friend','2019-10-15 08:20:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(222,NULL,10,'Subject for Pledge Acknowledgment','2020-04-17 16:31:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(223,NULL,10,'Subject for Pledge Acknowledgment','2020-05-04 12:32:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(224,NULL,10,'Subject for Pledge Acknowledgment','2020-07-17 07:06:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(225,NULL,9,'Subject for Tell a Friend','2020-10-05 00:32:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(226,NULL,9,'Subject for Tell a Friend','2019-11-22 19:47:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(227,NULL,10,'Subject for Pledge Acknowledgment','2019-10-21 04:04:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(228,NULL,9,'Subject for Tell a Friend','2020-04-28 15:48:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(229,NULL,10,'Subject for Pledge Acknowledgment','2020-06-04 13:55:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(230,NULL,9,'Subject for Tell a Friend','2020-06-25 00:21:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(231,NULL,9,'Subject for Tell a Friend','2019-12-26 03:21:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(232,NULL,9,'Subject for Tell a Friend','2020-07-10 14:00:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(233,NULL,10,'Subject for Pledge Acknowledgment','2020-08-23 15:11:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(234,NULL,10,'Subject for Pledge Acknowledgment','2019-11-05 22:58:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(235,NULL,9,'Subject for Tell a Friend','2020-07-26 11:19:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(236,NULL,9,'Subject for Tell a Friend','2020-02-28 20:32:07',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(237,NULL,9,'Subject for Tell a Friend','2020-05-29 02:36:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(238,NULL,9,'Subject for Tell a Friend','2020-08-14 08:48:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(239,NULL,9,'Subject for Tell a Friend','2020-01-24 16:50:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(240,NULL,10,'Subject for Pledge Acknowledgment','2020-01-02 22:28:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(241,NULL,10,'Subject for Pledge Acknowledgment','2020-03-22 05:28:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(242,NULL,10,'Subject for Pledge Acknowledgment','2020-03-09 12:23:23',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(243,NULL,9,'Subject for Tell a Friend','2020-08-19 18:59:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(244,NULL,9,'Subject for Tell a Friend','2020-05-03 12:06:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(245,NULL,10,'Subject for Pledge Acknowledgment','2020-01-25 11:18:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(246,NULL,9,'Subject for Tell a Friend','2019-12-26 21:04:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(247,NULL,10,'Subject for Pledge Acknowledgment','2019-12-30 12:03:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(248,NULL,9,'Subject for Tell a Friend','2020-06-20 13:08:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(249,NULL,10,'Subject for Pledge Acknowledgment','2020-01-26 10:42:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(250,NULL,9,'Subject for Tell a Friend','2020-02-13 03:22:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(251,NULL,10,'Subject for Pledge Acknowledgment','2020-03-02 09:16:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(252,NULL,10,'Subject for Pledge Acknowledgment','2020-01-04 05:14:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(253,NULL,9,'Subject for Tell a Friend','2020-03-06 23:46:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(254,NULL,10,'Subject for Pledge Acknowledgment','2020-08-08 16:49:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(255,NULL,10,'Subject for Pledge Acknowledgment','2020-09-28 05:14:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(256,NULL,9,'Subject for Tell a Friend','2020-05-17 13:29:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(257,NULL,9,'Subject for Tell a Friend','2020-05-13 04:07:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(258,NULL,9,'Subject for Tell a Friend','2019-11-08 05:00:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(259,NULL,10,'Subject for Pledge Acknowledgment','2020-03-29 07:30:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(260,NULL,9,'Subject for Tell a Friend','2020-01-30 23:38:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(261,NULL,9,'Subject for Tell a Friend','2019-10-30 10:02:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(262,NULL,10,'Subject for Pledge Acknowledgment','2020-02-04 15:54:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(263,NULL,9,'Subject for Tell a Friend','2020-08-29 20:54:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(264,NULL,10,'Subject for Pledge Acknowledgment','2020-03-28 22:05:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(265,NULL,9,'Subject for Tell a Friend','2020-08-23 06:53:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(266,NULL,10,'Subject for Pledge Acknowledgment','2020-09-12 15:38:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(267,NULL,10,'Subject for Pledge Acknowledgment','2020-02-29 16:35:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(268,NULL,10,'Subject for Pledge Acknowledgment','2019-12-25 18:06:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(269,NULL,9,'Subject for Tell a Friend','2020-09-27 20:53:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(270,NULL,9,'Subject for Tell a Friend','2019-11-07 07:59:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(271,NULL,10,'Subject for Pledge Acknowledgment','2020-05-23 04:19:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(272,NULL,9,'Subject for Tell a Friend','2020-09-16 11:44:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(273,NULL,9,'Subject for Tell a Friend','2020-01-16 21:52:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(274,NULL,10,'Subject for Pledge Acknowledgment','2020-05-11 13:20:07',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(275,NULL,9,'Subject for Tell a Friend','2020-04-20 07:49:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(276,NULL,10,'Subject for Pledge Acknowledgment','2020-02-09 21:16:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(277,NULL,9,'Subject for Tell a Friend','2020-08-30 02:59:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(278,NULL,10,'Subject for Pledge Acknowledgment','2020-08-13 01:39:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(279,NULL,9,'Subject for Tell a Friend','2020-08-25 22:50:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(280,NULL,9,'Subject for Tell a Friend','2020-04-24 09:17:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(281,NULL,10,'Subject for Pledge Acknowledgment','2020-08-23 04:05:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(282,NULL,10,'Subject for Pledge Acknowledgment','2019-12-09 13:59:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(283,NULL,10,'Subject for Pledge Acknowledgment','2020-06-13 21:43:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(284,NULL,9,'Subject for Tell a Friend','2020-06-11 22:20:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(285,NULL,10,'Subject for Pledge Acknowledgment','2020-06-04 08:51:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(286,NULL,9,'Subject for Tell a Friend','2019-11-19 17:21:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(287,NULL,9,'Subject for Tell a Friend','2020-05-05 16:10:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(288,NULL,10,'Subject for Pledge Acknowledgment','2020-10-07 22:55:23',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(289,NULL,9,'Subject for Tell a Friend','2020-07-20 08:09:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(290,NULL,10,'Subject for Pledge Acknowledgment','2020-04-19 06:35:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(291,NULL,9,'Subject for Tell a Friend','2020-06-08 05:24:04',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(292,NULL,10,'Subject for Pledge Acknowledgment','2019-11-14 18:07:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(293,NULL,9,'Subject for Tell a Friend','2020-04-08 21:17:53',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(294,NULL,10,'Subject for Pledge Acknowledgment','2020-02-14 20:38:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(295,NULL,10,'Subject for Pledge Acknowledgment','2020-04-18 09:29:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(296,NULL,10,'Subject for Pledge Acknowledgment','2020-02-06 05:02:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(297,NULL,9,'Subject for Tell a Friend','2019-11-01 18:02:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(298,NULL,9,'Subject for Tell a Friend','2019-11-11 09:16:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(299,NULL,10,'Subject for Pledge Acknowledgment','2020-02-22 23:13:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(300,NULL,10,'Subject for Pledge Acknowledgment','2020-06-29 17:18:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(301,NULL,9,'Subject for Tell a Friend','2020-07-15 14:29:11',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(302,NULL,9,'Subject for Tell a Friend','2020-02-27 15:19:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(303,NULL,10,'Subject for Pledge Acknowledgment','2020-04-15 02:11:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(304,NULL,9,'Subject for Tell a Friend','2019-10-30 22:34:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(305,NULL,10,'Subject for Pledge Acknowledgment','2020-07-20 11:10:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(306,NULL,9,'Subject for Tell a Friend','2020-09-11 23:00:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(307,NULL,10,'Subject for Pledge Acknowledgment','2020-07-15 10:52:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(308,NULL,9,'Subject for Tell a Friend','2020-07-01 17:22:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(309,NULL,9,'Subject for Tell a Friend','2020-08-17 12:55:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(310,NULL,9,'Subject for Tell a Friend','2020-09-21 00:27:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(311,NULL,9,'Subject for Tell a Friend','2020-09-13 14:47:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(312,NULL,9,'Subject for Tell a Friend','2020-07-09 02:18:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(313,NULL,10,'Subject for Pledge Acknowledgment','2020-06-09 19:29:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(314,NULL,10,'Subject for Pledge Acknowledgment','2020-05-29 11:03:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(315,NULL,10,'Subject for Pledge Acknowledgment','2019-12-30 08:30:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(316,NULL,10,'Subject for Pledge Acknowledgment','2020-05-11 23:02:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(317,NULL,10,'Subject for Pledge Acknowledgment','2020-01-20 14:10:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(318,NULL,10,'Subject for Pledge Acknowledgment','2019-11-04 04:45:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(319,NULL,9,'Subject for Tell a Friend','2019-10-30 13:09:05',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(320,NULL,10,'Subject for Pledge Acknowledgment','2020-07-06 01:13:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(321,NULL,9,'Subject for Tell a Friend','2020-03-18 22:09:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(322,NULL,9,'Subject for Tell a Friend','2020-04-22 22:45:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(323,NULL,10,'Subject for Pledge Acknowledgment','2020-06-13 22:03:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(324,NULL,9,'Subject for Tell a Friend','2019-11-07 02:38:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(325,NULL,9,'Subject for Tell a Friend','2020-02-08 22:00:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(326,NULL,9,'Subject for Tell a Friend','2020-09-14 01:30:24',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(327,NULL,10,'Subject for Pledge Acknowledgment','2019-12-19 08:02:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(328,NULL,10,'Subject for Pledge Acknowledgment','2019-12-11 08:52:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(329,NULL,9,'Subject for Tell a Friend','2020-03-02 10:46:26',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(330,NULL,9,'Subject for Tell a Friend','2020-03-02 11:47:14',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(331,NULL,10,'Subject for Pledge Acknowledgment','2019-10-30 00:09:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(332,NULL,9,'Subject for Tell a Friend','2019-11-16 20:42:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(333,NULL,10,'Subject for Pledge Acknowledgment','2019-10-29 06:48:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(334,NULL,10,'Subject for Pledge Acknowledgment','2020-02-15 13:54:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(335,NULL,10,'Subject for Pledge Acknowledgment','2020-03-19 11:39:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(336,NULL,10,'Subject for Pledge Acknowledgment','2020-04-13 10:58:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(337,NULL,10,'Subject for Pledge Acknowledgment','2020-03-13 04:18:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(338,NULL,10,'Subject for Pledge Acknowledgment','2020-10-04 08:20:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(339,NULL,9,'Subject for Tell a Friend','2020-05-14 22:30:21',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(340,NULL,10,'Subject for Pledge Acknowledgment','2019-10-27 08:31:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(341,NULL,9,'Subject for Tell a Friend','2020-01-21 22:03:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(342,NULL,9,'Subject for Tell a Friend','2020-07-27 21:08:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(343,NULL,10,'Subject for Pledge Acknowledgment','2020-01-21 06:15:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(344,NULL,9,'Subject for Tell a Friend','2020-05-04 14:49:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(345,NULL,9,'Subject for Tell a Friend','2020-06-02 06:43:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(346,NULL,10,'Subject for Pledge Acknowledgment','2020-03-19 15:59:19',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(347,NULL,9,'Subject for Tell a Friend','2020-09-01 07:49:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(348,NULL,9,'Subject for Tell a Friend','2019-10-12 02:36:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(349,NULL,9,'Subject for Tell a Friend','2020-02-08 00:02:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(350,NULL,9,'Subject for Tell a Friend','2020-06-28 10:58:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(351,NULL,9,'Subject for Tell a Friend','2019-10-19 04:49:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(352,NULL,9,'Subject for Tell a Friend','2020-08-21 22:18:33',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(353,NULL,9,'Subject for Tell a Friend','2019-11-10 00:52:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(354,NULL,10,'Subject for Pledge Acknowledgment','2020-10-04 07:36:18',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(355,NULL,9,'Subject for Tell a Friend','2020-04-17 12:19:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(356,NULL,10,'Subject for Pledge Acknowledgment','2020-09-13 10:41:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(357,NULL,9,'Subject for Tell a Friend','2019-10-28 02:00:43',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(358,NULL,10,'Subject for Pledge Acknowledgment','2020-02-15 17:46:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(359,NULL,9,'Subject for Tell a Friend','2019-12-22 02:23:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(360,NULL,9,'Subject for Tell a Friend','2020-10-06 06:47:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(361,NULL,10,'Subject for Pledge Acknowledgment','2020-04-12 08:43:14',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(362,NULL,9,'Subject for Tell a Friend','2019-11-10 17:34:23',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(363,NULL,10,'Subject for Pledge Acknowledgment','2020-05-19 18:07:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(364,NULL,9,'Subject for Tell a Friend','2020-03-21 22:00:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(365,NULL,10,'Subject for Pledge Acknowledgment','2020-09-11 22:39:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(366,NULL,10,'Subject for Pledge Acknowledgment','2020-06-17 05:06:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(367,NULL,9,'Subject for Tell a Friend','2019-10-30 20:16:24',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(368,NULL,9,'Subject for Tell a Friend','2020-07-02 02:17:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(369,NULL,9,'Subject for Tell a Friend','2020-05-25 01:47:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(370,NULL,10,'Subject for Pledge Acknowledgment','2020-06-25 09:23:49',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(371,NULL,9,'Subject for Tell a Friend','2020-03-23 11:26:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(372,NULL,10,'Subject for Pledge Acknowledgment','2020-03-01 20:49:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(373,NULL,9,'Subject for Tell a Friend','2020-10-02 03:38:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(374,NULL,9,'Subject for Tell a Friend','2019-11-21 16:33:13',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(375,NULL,9,'Subject for Tell a Friend','2020-05-31 10:28:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(376,NULL,9,'Subject for Tell a Friend','2020-07-07 13:15:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(377,NULL,10,'Subject for Pledge Acknowledgment','2019-11-22 22:23:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(378,NULL,10,'Subject for Pledge Acknowledgment','2020-03-13 22:08:06',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(379,NULL,9,'Subject for Tell a Friend','2020-05-13 17:08:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(380,NULL,10,'Subject for Pledge Acknowledgment','2020-01-19 21:04:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(381,NULL,10,'Subject for Pledge Acknowledgment','2020-02-26 01:05:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(382,NULL,10,'Subject for Pledge Acknowledgment','2020-02-21 10:31:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(383,NULL,10,'Subject for Pledge Acknowledgment','2019-10-31 21:40:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(384,NULL,9,'Subject for Tell a Friend','2020-02-08 00:17:40',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(385,NULL,9,'Subject for Tell a Friend','2019-11-02 14:46:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(386,NULL,10,'Subject for Pledge Acknowledgment','2020-04-27 20:47:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(387,NULL,10,'Subject for Pledge Acknowledgment','2020-02-06 10:58:03',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(388,NULL,9,'Subject for Tell a Friend','2020-04-15 00:12:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(389,NULL,10,'Subject for Pledge Acknowledgment','2020-01-06 15:31:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(390,NULL,10,'Subject for Pledge Acknowledgment','2020-09-21 20:22:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(391,NULL,9,'Subject for Tell a Friend','2019-10-23 12:11:39',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(392,NULL,9,'Subject for Tell a Friend','2020-03-16 14:22:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(393,NULL,9,'Subject for Tell a Friend','2020-01-07 12:31:35',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(394,NULL,10,'Subject for Pledge Acknowledgment','2020-04-17 12:10:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(395,NULL,9,'Subject for Tell a Friend','2020-08-29 23:20:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(396,NULL,9,'Subject for Tell a Friend','2020-03-09 19:36:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(397,NULL,10,'Subject for Pledge Acknowledgment','2020-04-14 01:50:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(398,NULL,10,'Subject for Pledge Acknowledgment','2020-06-04 15:04:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(399,NULL,9,'Subject for Tell a Friend','2020-09-25 21:10:25',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(400,NULL,9,'Subject for Tell a Friend','2020-03-20 23:07:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(401,NULL,9,'Subject for Tell a Friend','2020-04-21 20:02:48',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(402,NULL,9,'Subject for Tell a Friend','2019-10-28 13:03:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(403,NULL,10,'Subject for Pledge Acknowledgment','2020-05-27 07:55:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(404,NULL,9,'Subject for Tell a Friend','2020-09-24 00:47:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(405,NULL,9,'Subject for Tell a Friend','2019-12-02 13:30:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(406,NULL,9,'Subject for Tell a Friend','2019-11-17 00:41:22',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(407,NULL,10,'Subject for Pledge Acknowledgment','2020-01-10 01:08:20',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(408,NULL,10,'Subject for Pledge Acknowledgment','2019-12-14 14:47:08',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(409,NULL,10,'Subject for Pledge Acknowledgment','2019-10-14 10:39:12',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(410,NULL,10,'Subject for Pledge Acknowledgment','2020-09-23 20:41:31',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(411,NULL,9,'Subject for Tell a Friend','2020-08-10 00:45:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(412,NULL,10,'Subject for Pledge Acknowledgment','2019-12-23 23:48:17',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(413,NULL,10,'Subject for Pledge Acknowledgment','2019-12-01 01:04:30',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(414,NULL,10,'Subject for Pledge Acknowledgment','2020-04-01 07:00:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(415,NULL,10,'Subject for Pledge Acknowledgment','2019-11-10 17:03:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(416,NULL,10,'Subject for Pledge Acknowledgment','2020-07-15 04:42:14',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(417,NULL,9,'Subject for Tell a Friend','2020-04-25 00:47:10',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(418,NULL,10,'Subject for Pledge Acknowledgment','2019-11-21 23:37:28',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(419,NULL,10,'Subject for Pledge Acknowledgment','2020-03-21 09:35:47',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(420,NULL,10,'Subject for Pledge Acknowledgment','2020-06-10 22:06:46',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(421,NULL,10,'Subject for Pledge Acknowledgment','2019-10-28 21:00:09',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(422,NULL,9,'Subject for Tell a Friend','2020-05-13 10:42:15',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(423,NULL,9,'Subject for Tell a Friend','2019-11-13 21:09:59',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(424,NULL,10,'Subject for Pledge Acknowledgment','2019-10-28 23:11:36',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(425,NULL,10,'Subject for Pledge Acknowledgment','2020-05-07 00:17:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(426,NULL,10,'Subject for Pledge Acknowledgment','2020-07-31 10:35:42',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(427,NULL,10,'Subject for Pledge Acknowledgment','2020-08-15 11:01:56',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(428,NULL,9,'Subject for Tell a Friend','2020-07-15 04:56:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(429,NULL,9,'Subject for Tell a Friend','2020-09-01 03:34:32',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(430,NULL,9,'Subject for Tell a Friend','2020-05-31 18:58:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(431,NULL,9,'Subject for Tell a Friend','2020-07-03 12:12:02',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(432,NULL,9,'Subject for Tell a Friend','2020-05-20 08:51:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(433,NULL,9,'Subject for Tell a Friend','2020-03-16 08:15:27',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(434,NULL,10,'Subject for Pledge Acknowledgment','2020-07-20 21:59:34',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(435,NULL,10,'Subject for Pledge Acknowledgment','2020-07-04 04:43:01',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(436,NULL,10,'Subject for Pledge Acknowledgment','2020-04-29 22:47:55',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(437,NULL,10,'Subject for Pledge Acknowledgment','2020-04-21 22:58:58',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(438,NULL,10,'Subject for Pledge Acknowledgment','2020-09-14 18:18:07',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(439,NULL,10,'Subject for Pledge Acknowledgment','2019-11-29 20:48:51',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(440,NULL,10,'Subject for Pledge Acknowledgment','2020-05-04 09:44:57',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(441,NULL,10,'Subject for Pledge Acknowledgment','2020-03-03 17:41:52',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(442,NULL,9,'Subject for Tell a Friend','2020-04-10 10:57:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(443,NULL,9,'Subject for Tell a Friend','2019-11-02 05:36:37',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(444,NULL,9,'Subject for Tell a Friend','2019-11-27 17:53:14',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(445,NULL,10,'Subject for Pledge Acknowledgment','2020-06-17 16:35:44',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(446,NULL,10,'Subject for Pledge Acknowledgment','2020-05-03 10:34:45',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(447,NULL,9,'Subject for Tell a Friend','2019-10-26 02:44:29',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(448,NULL,9,'Subject for Tell a Friend','2020-07-24 02:52:16',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(449,NULL,9,'Subject for Tell a Friend','2020-02-23 07:06:38',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(450,NULL,9,'Subject for Tell a Friend','2019-11-05 12:52:54',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(451,1,6,'$ 125.00-Apr 2007 Mailer 1','2010-04-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(452,2,6,'$ 50.00-Online: Save the Penguins','2010-03-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(453,3,6,'$ 25.00-Apr 2007 Mailer 1','2010-04-29 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(454,4,6,'$ 50.00-Apr 2007 Mailer 1','2010-04-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(455,5,6,'$ 500.00-Apr 2007 Mailer 1','2010-04-15 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(456,6,6,'$ 175.00-Apr 2007 Mailer 1','2010-04-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(457,7,6,'$ 50.00-Online: Save the Penguins','2010-03-27 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(458,8,6,'$ 10.00-Online: Save the Penguins','2010-03-08 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(459,9,6,'$ 250.00-Online: Save the Penguins','2010-04-22 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(460,10,6,NULL,'2009-07-01 11:53:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(461,11,6,NULL,'2009-07-01 12:55:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(462,12,6,NULL,'2009-10-01 11:53:50',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(463,13,6,NULL,'2009-12-01 12:55:41',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:14','2020-10-08 01:49:14'),(464,1,7,'General','2020-10-08 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(465,2,7,'Student','2020-10-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(466,3,7,'General','2020-10-06 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(467,4,7,'Student','2020-10-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(468,5,7,'Student','2019-10-04 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(469,6,7,'Student','2020-10-03 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(470,7,7,'General','2020-10-02 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(471,8,7,'Student','2020-10-01 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(472,9,7,'General','2020-09-30 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(473,10,7,'General','2018-07-28 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(474,11,7,'Lifetime','2020-09-28 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(475,12,7,'Student','2020-09-27 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(476,13,7,'General','2020-09-26 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(477,14,7,'Student','2020-09-25 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(478,15,7,'General','2018-06-18 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(479,16,7,'Student','2020-09-23 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(480,17,7,'General','2020-09-22 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(481,18,7,'Student','2020-09-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(482,19,7,'General','2020-09-20 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(483,20,7,'General','2018-05-09 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(484,21,7,'General','2020-09-18 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(485,22,7,'Lifetime','2020-09-17 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(486,23,7,'General','2020-09-16 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(487,24,7,'Student','2020-09-15 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(488,25,7,'General','2018-03-30 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(489,26,7,'Student','2020-09-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(490,27,7,'General','2020-09-12 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(491,28,7,'Student','2020-09-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(492,29,7,'General','2020-09-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(493,30,7,'General','2018-02-18 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(494,14,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(495,15,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(496,16,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(497,17,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(498,18,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(499,19,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(500,20,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(501,21,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(502,22,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(503,23,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(504,24,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(505,25,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(506,26,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(507,27,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(508,28,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(509,29,6,'$ 100.00 - General Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(510,30,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(511,31,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(512,32,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(513,33,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(514,34,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(515,35,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(516,36,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(517,37,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(518,38,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(519,39,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(520,40,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(521,41,6,'$ 50.00 - Student Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(522,42,6,'$ 1200.00 - Lifetime Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(523,43,6,'$ 1200.00 - Lifetime Membership: Offline signup','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Membership Payment',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(525,1,5,'NULL','2009-01-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(526,2,5,'NULL','2008-05-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(527,3,5,'NULL','2008-05-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(528,4,5,'NULL','2008-10-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(529,5,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(530,6,5,'NULL','2008-03-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(531,7,5,'NULL','2009-07-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(532,8,5,'NULL','2009-03-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(533,9,5,'NULL','2008-02-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(534,10,5,'NULL','2008-02-01 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(535,11,5,'NULL','2009-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(536,12,5,'NULL','2009-03-06 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(537,13,5,'NULL','2008-06-04 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(538,14,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(539,15,5,'NULL','2008-07-04 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(540,16,5,'NULL','2009-01-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(541,17,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(542,18,5,'NULL','2009-03-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(543,19,5,'NULL','2008-10-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(544,20,5,'NULL','2009-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(545,21,5,'NULL','2008-03-25 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(546,22,5,'NULL','2009-10-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(547,23,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(548,24,5,'NULL','2008-03-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(549,25,5,'NULL','2008-04-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(550,26,5,'NULL','2009-01-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(551,27,5,'NULL','2008-05-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(552,28,5,'NULL','2009-12-12 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(553,29,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(554,30,5,'NULL','2009-12-14 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(555,31,5,'NULL','2009-12-15 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(556,32,5,'NULL','2009-07-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(557,33,5,'NULL','2009-03-07 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(558,34,5,'NULL','2009-12-15 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(559,35,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(560,36,5,'NULL','2009-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(561,37,5,'NULL','2009-03-06 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(562,38,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(563,39,5,'NULL','2008-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(564,40,5,'NULL','2009-12-14 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(565,41,5,'NULL','2009-01-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(566,42,5,'NULL','2009-12-15 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(567,43,5,'NULL','2009-03-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(568,44,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(569,45,5,'NULL','2009-01-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(570,46,5,'NULL','2009-12-13 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(571,47,5,'NULL','2009-10-21 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(572,48,5,'NULL','2009-12-10 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(573,49,5,'NULL','2009-03-11 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(574,50,5,'NULL','2009-04-05 00:00:00',NULL,NULL,NULL,NULL,NULL,2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(575,45,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(576,46,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(577,47,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(578,48,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(579,49,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(580,50,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(581,51,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(582,52,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(583,53,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(584,54,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(585,55,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(586,56,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(587,57,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(588,58,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(589,59,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(590,60,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(591,61,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(592,62,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(593,63,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(594,64,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(595,65,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(596,66,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(597,67,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(598,68,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(599,69,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(600,70,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(601,71,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(602,72,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(603,73,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(604,74,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(605,75,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(606,76,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(607,77,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(608,78,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(609,79,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(610,80,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(611,81,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(612,82,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(613,83,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(614,84,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(615,85,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(616,86,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(617,87,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(618,88,6,'$ 800.00 - Rain-forest Cup Youth Soccer Tournament : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(619,89,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(620,90,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(621,91,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(622,92,6,'$ 50.00 - Fall Fundraiser Dinner : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(623,93,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15'),(624,94,6,'$ 50.00 - Summer Solstice Festival Day Concert : Offline registration','2020-10-08 12:49:15',NULL,NULL,NULL,NULL,'Participant',2,NULL,NULL,0,NULL,0,NULL,1,NULL,NULL,0,NULL,NULL,NULL,0,'2020-10-08 01:49:15','2020-10-08 01:49:15');
 /*!40000 ALTER TABLE `civicrm_activity` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -97,7 +97,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_activity_contact` WRITE;
 /*!40000 ALTER TABLE `civicrm_activity_contact` DISABLE KEYS */;
-INSERT INTO `civicrm_activity_contact` (`id`, `activity_id`, `contact_id`, `record_type_id`) VALUES (323,214,1,3),(235,153,2,3),(562,379,2,3),(585,395,2,3),(668,451,2,2),(78,49,3,3),(86,54,3,3),(159,104,3,3),(452,299,3,3),(189,123,4,3),(263,174,4,3),(650,439,4,3),(669,452,4,2),(364,241,5,3),(684,467,5,2),(727,510,5,2),(760,543,5,2),(312,206,6,3),(670,453,6,2),(772,555,6,2),(62,39,7,3),(115,73,7,3),(698,481,7,2),(733,516,7,2),(84,53,8,3),(448,297,8,3),(640,433,8,3),(664,448,8,3),(671,454,8,2),(756,539,8,2),(303,201,9,3),(403,265,9,3),(414,272,9,3),(129,84,10,3),(33,20,11,3),(259,171,11,3),(21,13,12,3),(326,216,12,3),(514,344,12,3),(611,412,12,3),(685,468,12,2),(713,496,12,2),(667,450,13,3),(708,491,13,2),(737,520,13,2),(656,443,14,3),(196,127,15,3),(230,151,15,2),(232,152,15,2),(234,153,15,2),(236,154,15,2),(237,155,15,2),(238,156,15,2),(239,157,15,2),(240,158,15,2),(241,159,15,2),(242,160,15,2),(243,161,15,2),(244,162,15,2),(246,163,15,2),(247,164,15,2),(249,165,15,2),(251,166,15,2),(252,167,15,2),(254,168,15,2),(256,169,15,2),(257,170,15,2),(258,171,15,2),(260,172,15,2),(261,173,15,2),(262,174,15,2),(264,175,15,2),(265,176,15,2),(267,177,15,2),(268,178,15,2),(270,179,15,2),(271,180,15,2),(272,181,15,2),(273,181,15,3),(274,182,15,2),(275,183,15,2),(277,184,15,2),(278,185,15,2),(279,186,15,2),(281,187,15,2),(283,188,15,2),(284,189,15,2),(286,190,15,2),(288,191,15,2),(289,192,15,2),(290,193,15,2),(292,194,15,2),(293,195,15,2),(294,196,15,2),(296,197,15,2),(297,198,15,2),(299,199,15,2),(300,200,15,2),(302,201,15,2),(304,202,15,2),(306,203,15,2),(307,204,15,2),(309,205,15,2),(311,206,15,2),(313,207,15,2),(314,208,15,2),(315,209,15,2),(317,210,15,2),(318,211,15,2),(319,212,15,2),(320,213,15,2),(322,214,15,2),(324,215,15,2),(325,216,15,2),(327,217,15,2),(328,218,15,2),(330,219,15,2),(331,220,15,2),(333,221,15,2),(334,222,15,2),(335,223,15,2),(337,224,15,2),(338,225,15,2),(340,226,15,2),(341,227,15,2),(342,228,15,2),(343,229,15,2),(345,230,15,2),(347,231,15,2),(348,232,15,2),(350,233,15,2),(352,234,15,2),(354,235,15,2),(356,236,15,2),(357,237,15,2),(358,238,15,2),(360,239,15,2),(361,240,15,2),(363,241,15,2),(365,242,15,2),(367,243,15,2),(369,244,15,2),(370,245,15,2),(372,246,15,2),(373,247,15,2),(375,248,15,2),(377,249,15,2),(379,250,15,2),(381,251,15,2),(383,252,15,2),(384,253,15,2),(386,254,15,2),(387,255,15,2),(388,256,15,2),(390,257,15,2),(391,258,15,2),(392,259,15,2),(394,260,15,2),(396,261,15,2),(398,262,15,2),(400,263,15,2),(401,264,15,2),(402,265,15,2),(404,266,15,2),(405,267,15,2),(407,268,15,2),(409,269,15,2),(410,270,15,2),(412,271,15,2),(413,272,15,2),(415,273,15,2),(416,274,15,2),(417,275,15,2),(418,276,15,2),(419,277,15,2),(420,278,15,2),(421,279,15,2),(423,280,15,2),(424,281,15,2),(425,282,15,2),(427,283,15,2),(429,284,15,2),(431,285,15,2),(432,286,15,2),(433,287,15,2),(434,288,15,2),(435,289,15,2),(437,290,15,2),(439,291,15,2),(440,292,15,2),(442,293,15,2),(443,294,15,2),(444,295,15,2),(445,296,15,2),(447,297,15,2),(449,298,15,2),(451,299,15,2),(453,300,15,2),(35,21,16,3),(408,268,16,3),(436,289,16,3),(470,312,16,3),(512,343,16,3),(621,419,16,3),(672,455,16,2),(385,253,17,3),(696,479,17,2),(732,515,17,2),(51,32,18,3),(175,114,18,3),(177,115,18,3),(225,146,18,3),(780,563,18,2),(673,456,19,2),(768,551,19,2),(155,101,20,3),(389,256,20,3),(703,486,20,2),(722,505,20,2),(127,83,21,3),(209,134,21,3),(463,307,21,3),(518,346,21,3),(767,550,21,2),(90,56,22,3),(496,331,22,3),(473,314,23,3),(544,366,23,3),(779,562,23,2),(336,223,24,3),(344,229,24,3),(765,548,24,2),(19,12,25,3),(521,348,25,3),(149,98,26,3),(316,209,26,3),(450,298,26,3),(509,341,26,3),(568,382,28,3),(54,34,29,3),(64,40,29,3),(104,66,29,3),(109,69,29,3),(382,251,29,3),(40,24,30,3),(770,553,30,2),(205,132,31,3),(753,536,31,2),(374,247,32,3),(399,262,32,3),(679,462,32,2),(680,463,32,2),(1,1,33,2),(2,2,33,2),(4,3,33,2),(6,4,33,2),(7,5,33,2),(9,6,33,2),(10,7,33,2),(11,8,33,2),(13,9,33,2),(15,10,33,2),(17,11,33,2),(18,12,33,2),(20,13,33,2),(22,14,33,2),(23,15,33,2),(25,16,33,2),(26,17,33,2),(28,18,33,2),(30,19,33,2),(32,20,33,2),(34,21,33,2),(36,22,33,2),(37,23,33,2),(39,24,33,2),(41,25,33,2),(43,26,33,2),(44,27,33,2),(46,28,33,2),(47,29,33,2),(48,30,33,2),(49,31,33,2),(50,32,33,2),(52,33,33,2),(53,34,33,2),(55,35,33,2),(56,36,33,2),(57,37,33,2),(59,38,33,2),(61,39,33,2),(63,40,33,2),(65,41,33,2),(67,42,33,2),(68,43,33,2),(69,44,33,2),(71,45,33,2),(72,46,33,2),(74,47,33,2),(76,48,33,2),(77,49,33,2),(79,50,33,2),(81,51,33,2),(82,52,33,2),(83,53,33,2),(85,54,33,2),(87,55,33,2),(89,56,33,2),(91,57,33,2),(93,58,33,2),(94,59,33,2),(95,60,33,2),(96,61,33,2),(97,62,33,2),(98,63,33,2),(100,64,33,2),(102,65,33,2),(103,66,33,2),(105,67,33,2),(106,68,33,2),(108,69,33,2),(110,70,33,2),(111,71,33,2),(112,72,33,2),(114,73,33,2),(116,74,33,2),(117,75,33,2),(118,76,33,2),(119,77,33,2),(120,78,33,2),(122,79,33,2),(123,80,33,2),(124,81,33,2),(125,82,33,2),(126,83,33,2),(128,84,33,2),(130,85,33,2),(131,86,33,2),(132,87,33,2),(133,88,33,2),(134,89,33,2),(135,90,33,2),(137,91,33,2),(138,92,33,2),(140,93,33,2),(142,94,33,2),(144,95,33,2),(146,96,33,2),(147,97,33,2),(148,98,33,2),(150,99,33,2),(152,100,33,2),(154,101,33,2),(156,102,33,2),(157,103,33,2),(158,104,33,2),(160,105,33,2),(161,106,33,2),(163,107,33,2),(164,108,33,2),(166,109,33,2),(168,110,33,2),(169,111,33,2),(171,112,33,2),(173,113,33,2),(174,114,33,2),(176,115,33,2),(178,116,33,2),(179,117,33,2),(180,118,33,2),(181,119,33,2),(183,120,33,2),(185,121,33,2),(186,122,33,2),(188,123,33,2),(190,124,33,2),(192,125,33,2),(193,126,33,2),(195,127,33,2),(197,128,33,2),(198,129,33,2),(200,130,33,2),(202,131,33,2),(204,132,33,2),(206,133,33,2),(208,134,33,2),(210,135,33,2),(212,136,33,2),(214,137,33,2),(215,138,33,2),(216,139,33,2),(218,140,33,2),(219,141,33,2),(220,142,33,2),(221,143,33,2),(222,144,33,2),(223,145,33,2),(224,146,33,2),(226,147,33,2),(227,148,33,2),(228,149,33,2),(229,150,33,2),(301,200,33,3),(380,250,33,3),(441,292,33,3),(676,459,34,2),(31,19,35,3),(248,164,35,3),(3,2,36,3),(121,78,36,3),(143,94,36,3),(12,8,37,3),(217,139,37,3),(245,162,37,3),(481,319,37,3),(566,381,37,3),(446,296,38,3),(329,218,39,3),(406,267,39,3),(531,356,39,3),(688,471,39,2),(729,512,39,2),(80,50,41,3),(701,484,41,2),(721,504,41,2),(762,545,41,2),(16,10,42,3),(24,15,43,3),(678,461,43,2),(368,243,44,3),(773,556,44,2),(38,23,45,3),(88,55,45,3),(305,202,45,3),(66,41,46,3),(151,99,46,3),(165,108,46,3),(167,109,46,3),(477,317,47,3),(635,429,47,3),(101,64,48,3),(359,238,48,3),(557,376,48,3),(5,3,49,3),(42,25,49,3),(213,136,49,3),(298,198,49,3),(553,373,49,3),(605,408,49,3),(778,561,49,2),(58,37,51,3),(428,283,51,3),(231,151,52,3),(459,304,52,3),(207,133,54,3),(282,187,54,3),(321,213,54,3),(589,397,54,3),(595,401,54,3),(627,423,54,3),(763,546,54,2),(266,176,55,3),(280,186,55,3),(92,57,56,3),(199,129,56,3),(422,279,56,3),(749,532,56,2),(136,90,57,3),(455,301,57,3),(551,372,57,3),(754,537,57,2),(60,38,58,3),(564,380,59,3),(250,165,60,3),(285,189,60,3),(332,220,60,3),(504,337,60,3),(775,558,60,2),(291,193,61,3),(466,309,61,3),(172,112,63,3),(351,233,63,3),(397,261,63,3),(690,473,63,2),(716,499,63,2),(355,235,64,3),(426,282,65,3),(659,445,65,3),(211,135,66,3),(378,249,66,3),(560,378,66,3),(203,131,67,3),(255,168,67,3),(346,230,67,3),(694,477,67,2),(731,514,67,2),(8,5,68,3),(750,533,68,2),(502,336,69,3),(603,407,69,3),(70,44,70,3),(201,130,70,3),(371,245,70,3),(662,447,70,3),(787,570,70,2),(533,357,71,3),(618,417,71,3),(677,460,71,2),(107,68,72,3),(746,529,73,2),(308,204,74,3),(430,284,74,3),(516,345,74,3),(706,489,74,2),(736,519,74,2),(233,152,75,3),(99,63,76,3),(113,72,76,3),(654,442,77,3),(45,27,78,3),(139,92,78,3),(153,100,78,3),(616,416,78,3),(623,420,78,3),(709,492,78,2),(725,508,78,2),(253,167,79,3),(523,349,80,3),(645,436,80,3),(695,478,80,2),(718,501,80,2),(395,260,81,3),(587,396,81,3),(182,119,82,3),(631,426,82,3),(674,457,82,2),(27,17,83,3),(187,122,83,3),(362,240,83,3),(593,400,84,3),(598,403,84,3),(494,330,85,3),(647,437,85,3),(184,120,86,3),(194,126,86,3),(339,225,86,3),(353,234,86,3),(537,360,86,3),(582,393,86,3),(29,18,87,3),(608,410,87,3),(438,290,88,3),(578,390,88,3),(310,205,89,3),(411,270,89,3),(191,124,90,3),(785,568,90,2),(376,248,91,3),(393,259,91,3),(162,106,92,3),(287,190,92,3),(349,232,92,3),(675,458,92,2),(141,93,93,3),(479,318,93,3),(573,386,93,3),(761,544,94,2),(700,483,95,2),(734,517,95,2),(744,527,95,2),(145,95,96,3),(276,183,96,3),(73,46,97,3),(170,111,98,3),(483,320,98,3),(642,434,98,3),(786,569,98,2),(269,178,99,3),(295,196,99,3),(366,242,99,3),(702,485,99,2),(740,523,99,2),(782,565,99,2),(14,9,100,3),(75,47,100,3),(764,547,102,2),(681,464,103,2),(711,494,103,2),(745,528,103,2),(789,572,105,2),(791,574,106,2),(686,469,108,2),(728,511,108,2),(757,540,109,2),(790,573,110,2),(755,538,111,2),(771,554,114,2),(777,560,120,2),(689,472,127,2),(715,498,127,2),(774,557,129,2),(784,567,130,2),(697,480,131,2),(719,502,131,2),(682,465,132,2),(726,509,132,2),(752,535,133,2),(704,487,134,2),(735,518,134,2),(742,525,140,2),(691,474,145,2),(739,522,145,2),(747,530,155,2),(710,493,156,2),(738,521,156,2),(692,475,159,2),(730,513,159,2),(699,482,161,2),(720,503,161,2),(759,542,162,2),(707,490,164,2),(724,507,164,2),(776,559,165,2),(743,526,167,2),(748,531,170,2),(751,534,172,2),(687,470,173,2),(714,497,173,2),(769,552,175,2),(683,466,179,2),(712,495,179,2),(766,549,180,2),(693,476,188,2),(717,500,188,2),(454,301,193,2),(456,302,193,2),(457,303,193,2),(458,304,193,2),(460,305,193,2),(461,306,193,2),(462,307,193,2),(464,308,193,2),(465,309,193,2),(467,310,193,2),(468,311,193,2),(469,312,193,2),(471,313,193,2),(472,314,193,2),(474,315,193,2),(475,316,193,2),(476,317,193,2),(478,318,193,2),(480,319,193,2),(482,320,193,2),(484,321,193,2),(485,322,193,2),(486,323,193,2),(487,324,193,2),(488,325,193,2),(489,326,193,2),(490,327,193,2),(491,328,193,2),(492,329,193,2),(493,330,193,2),(495,331,193,2),(497,332,193,2),(498,333,193,2),(499,334,193,2),(500,335,193,2),(501,336,193,2),(503,337,193,2),(505,338,193,2),(506,339,193,2),(507,340,193,2),(508,341,193,2),(510,342,193,2),(511,343,193,2),(513,344,193,2),(515,345,193,2),(517,346,193,2),(519,347,193,2),(520,348,193,2),(522,349,193,2),(524,350,193,2),(525,351,193,2),(526,352,193,2),(527,353,193,2),(528,354,193,2),(529,355,193,2),(530,356,193,2),(532,357,193,2),(534,358,193,2),(535,359,193,2),(536,360,193,2),(538,361,193,2),(539,362,193,2),(540,363,193,2),(541,364,193,2),(542,365,193,2),(543,366,193,2),(545,367,193,2),(546,368,193,2),(547,369,193,2),(548,370,193,2),(549,371,193,2),(550,372,193,2),(552,373,193,2),(554,374,193,2),(555,375,193,2),(556,376,193,2),(558,377,193,2),(559,378,193,2),(561,379,193,2),(563,380,193,2),(565,381,193,2),(567,382,193,2),(569,383,193,2),(570,384,193,2),(571,385,193,2),(572,386,193,2),(574,387,193,2),(575,388,193,2),(576,389,193,2),(577,390,193,2),(579,391,193,2),(580,392,193,2),(581,393,193,2),(583,394,193,2),(584,395,193,2),(586,396,193,2),(588,397,193,2),(590,398,193,2),(591,399,193,2),(592,400,193,2),(594,401,193,2),(596,402,193,2),(597,403,193,2),(599,404,193,2),(600,405,193,2),(601,406,193,2),(602,407,193,2),(604,408,193,2),(606,409,193,2),(607,410,193,2),(609,411,193,2),(610,412,193,2),(612,413,193,2),(613,414,193,2),(614,415,193,2),(615,416,193,2),(617,417,193,2),(619,418,193,2),(620,419,193,2),(622,420,193,2),(624,421,193,2),(625,422,193,2),(626,423,193,2),(628,424,193,2),(629,425,193,2),(630,426,193,2),(632,427,193,2),(633,428,193,2),(634,429,193,2),(636,430,193,2),(637,431,193,2),(638,432,193,2),(639,433,193,2),(641,434,193,2),(643,435,193,2),(644,436,193,2),(646,437,193,2),(648,438,193,2),(649,439,193,2),(651,440,193,2),(652,441,193,2),(653,442,193,2),(655,443,193,2),(657,444,193,2),(658,445,193,2),(660,446,193,2),(661,447,193,2),(663,448,193,2),(665,449,193,2),(666,450,193,2),(788,571,194,2),(705,488,195,2),(723,506,195,2),(758,541,195,2),(783,566,196,2),(781,564,200,2);
+INSERT INTO `civicrm_activity_contact` (`id`, `activity_id`, `contact_id`, `record_type_id`) VALUES (362,236,1,3),(653,429,1,3),(139,91,2,3),(207,133,2,3),(468,306,2,3),(503,329,2,3),(620,404,2,3),(655,430,2,3),(686,451,2,2),(716,481,2,2),(753,518,2,2),(42,27,3,3),(281,181,3,3),(521,342,3,3),(558,364,3,3),(26,17,4,3),(79,51,4,3),(617,402,4,3),(687,452,4,2),(805,570,4,2),(88,56,5,3),(275,178,5,3),(446,291,5,3),(516,339,5,3),(69,46,6,3),(366,238,6,3),(552,360,6,3),(688,453,6,2),(1,1,7,2),(2,2,7,2),(4,3,7,2),(5,4,7,2),(6,5,7,2),(7,6,7,2),(8,7,7,2),(10,8,7,2),(12,9,7,2),(14,10,7,2),(16,11,7,2),(18,12,7,2),(19,13,7,2),(21,14,7,2),(22,15,7,2),(24,16,7,2),(25,17,7,2),(27,18,7,2),(29,19,7,2),(30,20,7,2),(32,21,7,2),(34,22,7,2),(35,23,7,2),(36,24,7,2),(38,25,7,2),(40,26,7,2),(41,27,7,2),(43,28,7,2),(44,29,7,2),(46,30,7,2),(47,31,7,2),(49,32,7,2),(50,33,7,2),(52,34,7,2),(54,35,7,2),(55,36,7,2),(56,37,7,2),(58,38,7,2),(59,39,7,2),(61,40,7,2),(62,41,7,2),(63,42,7,2),(64,43,7,2),(65,44,7,2),(66,45,7,2),(68,46,7,2),(70,47,7,2),(72,48,7,2),(74,49,7,2),(76,50,7,2),(78,51,7,2),(80,52,7,2),(81,53,7,2),(83,54,7,2),(85,55,7,2),(87,56,7,2),(89,57,7,2),(91,58,7,2),(92,59,7,2),(93,60,7,2),(95,61,7,2),(96,62,7,2),(97,63,7,2),(98,64,7,2),(100,65,7,2),(102,66,7,2),(103,67,7,2),(104,68,7,2),(106,69,7,2),(107,70,7,2),(109,71,7,2),(111,72,7,2),(112,73,7,2),(113,74,7,2),(114,75,7,2),(115,76,7,2),(116,77,7,2),(117,78,7,2),(119,79,7,2),(120,80,7,2),(121,81,7,2),(123,82,7,2),(125,83,7,2),(126,84,7,2),(127,85,7,2),(128,86,7,2),(130,87,7,2),(132,88,7,2),(134,89,7,2),(136,90,7,2),(138,91,7,2),(140,92,7,2),(142,93,7,2),(143,94,7,2),(145,95,7,2),(147,96,7,2),(149,97,7,2),(151,98,7,2),(153,99,7,2),(154,100,7,2),(155,101,7,2),(156,102,7,2),(157,103,7,2),(158,104,7,2),(160,105,7,2),(162,106,7,2),(163,107,7,2),(165,108,7,2),(167,109,7,2),(168,110,7,2),(170,111,7,2),(172,112,7,2),(174,113,7,2),(176,114,7,2),(178,115,7,2),(180,116,7,2),(181,117,7,2),(182,118,7,2),(183,119,7,2),(185,120,7,2),(187,121,7,2),(189,122,7,2),(190,123,7,2),(191,124,7,2),(193,125,7,2),(194,126,7,2),(196,127,7,2),(197,128,7,2),(199,129,7,2),(201,130,7,2),(203,131,7,2),(204,132,7,2),(206,133,7,2),(208,134,7,2),(210,135,7,2),(211,136,7,2),(212,137,7,2),(213,138,7,2),(214,139,7,2),(216,140,7,2),(217,141,7,2),(218,142,7,2),(220,143,7,2),(221,144,7,2),(223,145,7,2),(224,146,7,2),(226,147,7,2),(228,148,7,2),(230,149,7,2),(232,150,7,2),(519,341,7,3),(673,443,7,3),(37,24,8,3),(200,129,8,3),(381,248,8,3),(539,352,8,3),(689,454,8,2),(637,417,9,3),(768,533,9,2),(659,432,10,3),(131,87,11,3),(122,81,13,3),(164,107,13,3),(352,230,14,3),(508,332,14,3),(198,128,15,3),(48,31,16,3),(690,455,16,2),(344,225,17,3),(765,530,17,2),(192,124,18,3),(318,207,18,3),(401,261,18,3),(535,350,18,3),(723,488,18,2),(741,506,18,2),(691,456,19,2),(775,540,19,2),(312,203,20,3),(144,94,21,3),(222,144,21,3),(449,293,21,3),(475,310,21,3),(17,11,22,3),(349,228,22,3),(394,257,22,3),(550,359,22,3),(727,492,22,2),(743,508,22,2),(784,549,22,2),(248,159,23,3),(270,174,23,3),(301,196,23,3),(321,209,23,3),(613,400,23,3),(615,401,23,3),(388,253,24,3),(3,2,25,3),(77,50,25,3),(101,65,25,3),(547,357,25,3),(529,347,26,3),(541,353,26,3),(711,476,26,2),(734,499,26,2),(264,170,27,3),(487,319,27,3),(582,379,27,3),(778,543,27,2),(169,110,28,3),(215,139,28,3),(293,190,28,3),(440,287,28,3),(701,466,28,2),(730,495,28,2),(285,184,29,3),(776,541,30,2),(57,37,31,3),(291,189,31,3),(356,232,31,3),(643,422,31,3),(495,324,32,3),(697,462,32,2),(698,463,32,2),(195,126,33,3),(555,362,33,3),(679,447,33,3),(99,64,34,3),(407,265,34,3),(566,369,34,3),(694,459,34,2),(53,34,35,3),(60,39,36,3),(256,164,36,3),(316,206,36,3),(422,275,36,3),(562,367,36,3),(761,526,36,2),(67,45,37,3),(430,280,37,3),(479,312,37,3),(28,18,38,3),(205,132,38,3),(473,309,38,3),(781,546,38,2),(412,269,39,3),(786,551,39,2),(443,289,40,3),(645,423,40,3),(141,92,41,3),(209,134,41,3),(262,169,41,3),(544,355,41,3),(630,411,41,3),(465,304,42,3),(661,433,42,3),(696,461,43,2),(681,448,44,3),(133,88,46,3),(651,428,46,3),(9,7,47,3),(71,47,47,3),(175,113,47,3),(331,216,47,3),(428,279,47,3),(460,301,47,3),(594,388,47,3),(780,545,47,2),(375,244,48,3),(110,71,49,3),(392,256,49,3),(20,13,50,3),(105,68,50,3),(233,150,50,3),(334,218,50,3),(574,374,50,3),(683,449,50,3),(808,573,51,2),(675,444,52,3),(13,9,53,3),(419,273,53,3),(600,392,53,3),(135,89,54,3),(713,478,54,2),(735,500,54,2),(73,48,55,3),(378,246,55,3),(497,325,55,3),(685,450,55,3),(150,97,56,3),(177,114,56,3),(279,180,57,3),(364,237,57,3),(471,308,57,3),(721,486,57,2),(740,505,57,2),(791,556,57,2),(202,130,58,3),(399,260,58,3),(23,15,59,3),(526,345,59,3),(576,375,59,3),(707,472,59,2),(732,497,59,2),(396,258,60,3),(505,330,60,3),(607,396,61,3),(219,142,62,3),(239,154,62,3),(490,321,62,3),(704,469,62,2),(748,513,62,2),(45,29,63,3),(454,297,63,3),(700,465,63,2),(745,510,63,2),(802,567,64,2),(94,60,65,3),(588,384,65,3),(796,561,65,2),(118,78,66,3),(225,146,66,3),(227,147,66,3),(303,197,66,3),(173,112,67,3),(537,351,67,3),(11,8,69,3),(108,70,69,3),(179,115,70,3),(657,431,70,3),(671,442,70,3),(241,155,71,3),(339,221,71,3),(414,270,71,3),(695,460,71,2),(39,25,72,3),(15,10,73,3),(129,86,73,3),(243,156,73,3),(337,220,73,3),(602,393,73,3),(785,550,73,2),(329,215,74,3),(417,272,74,3),(709,474,75,2),(757,522,75,2),(229,148,76,3),(456,298,76,3),(725,490,76,2),(742,507,76,2),(760,525,76,2),(569,371,77,3),(622,405,77,3),(801,566,77,2),(246,158,79,3),(710,475,79,2),(750,515,79,2),(774,539,79,2),(31,20,80,3),(250,160,80,3),(354,231,80,3),(438,286,80,3),(605,395,80,3),(590,385,81,3),(706,471,81,2),(749,514,81,2),(234,151,82,2),(235,152,82,2),(237,153,82,2),(238,154,82,2),(240,155,82,2),(242,156,82,2),(244,157,82,2),(245,158,82,2),(247,159,82,2),(249,160,82,2),(251,161,82,2),(252,162,82,2),(253,163,82,2),(255,164,82,2),(257,165,82,2),(258,166,82,2),(259,167,82,2),(260,168,82,2),(261,169,82,2),(263,170,82,2),(265,171,82,2),(266,172,82,2),(267,173,82,2),(269,174,82,2),(271,175,82,2),(272,176,82,2),(273,177,82,2),(274,178,82,2),(276,179,82,2),(278,180,82,2),(280,181,82,2),(282,182,82,2),(283,183,82,2),(284,184,82,2),(286,185,82,2),(287,186,82,2),(288,187,82,2),(289,188,82,2),(290,189,82,2),(292,190,82,2),(294,191,82,2),(295,192,82,2),(296,193,82,2),(297,194,82,2),(299,195,82,2),(300,196,82,2),(302,197,82,2),(304,198,82,2),(305,199,82,2),(306,200,82,2),(308,201,82,2),(309,202,82,2),(311,203,82,2),(313,204,82,2),(314,205,82,2),(315,206,82,2),(317,207,82,2),(319,208,82,2),(320,209,82,2),(322,210,82,2),(323,211,82,2),(324,212,82,2),(325,213,82,2),(327,214,82,2),(328,215,82,2),(330,216,82,2),(332,217,82,2),(333,218,82,2),(335,219,82,2),(336,220,82,2),(338,221,82,2),(340,222,82,2),(341,223,82,2),(342,224,82,2),(343,225,82,2),(345,226,82,2),(347,227,82,2),(348,228,82,2),(350,229,82,2),(351,230,82,2),(353,231,82,2),(355,232,82,2),(357,233,82,2),(358,234,82,2),(359,235,82,2),(361,236,82,2),(363,237,82,2),(365,238,82,2),(367,239,82,2),(369,240,82,2),(370,241,82,2),(371,242,82,2),(372,243,82,2),(374,244,82,2),(376,245,82,2),(377,246,82,2),(379,247,82,2),(380,248,82,2),(382,249,82,2),(383,250,82,2),(385,251,82,2),(386,252,82,2),(387,253,82,2),(389,254,82,2),(390,255,82,2),(391,256,82,2),(393,257,82,2),(395,258,82,2),(397,259,82,2),(398,260,82,2),(400,261,82,2),(402,262,82,2),(403,263,82,2),(405,264,82,2),(406,265,82,2),(408,266,82,2),(409,267,82,2),(410,268,82,2),(411,269,82,2),(413,270,82,2),(415,271,82,2),(416,272,82,2),(418,273,82,2),(420,274,82,2),(421,275,82,2),(423,276,82,2),(424,277,82,2),(426,278,82,2),(427,279,82,2),(429,280,82,2),(431,281,82,2),(432,282,82,2),(433,283,82,2),(434,284,82,2),(436,285,82,2),(437,286,82,2),(439,287,82,2),(441,288,82,2),(442,289,82,2),(444,290,82,2),(445,291,82,2),(447,292,82,2),(448,293,82,2),(450,294,82,2),(451,295,82,2),(452,296,82,2),(453,297,82,2),(455,298,82,2),(457,299,82,2),(458,300,82,2),(578,376,82,3),(692,457,82,2),(86,55,83,3),(298,194,83,3),(307,200,83,3),(310,202,83,3),(33,21,84,3),(51,33,84,3),(82,53,84,3),(186,120,84,3),(598,391,84,3),(84,54,85,3),(524,344,85,3),(254,163,86,3),(368,239,86,3),(477,311,87,3),(779,544,87,2),(146,95,88,3),(268,173,88,3),(166,108,89,3),(360,235,89,3),(384,250,89,3),(533,349,89,3),(75,49,90,3),(161,105,90,3),(231,149,90,3),(373,243,90,3),(152,98,91,3),(184,119,91,3),(236,152,91,3),(783,548,91,2),(171,111,92,3),(462,302,92,3),(693,458,92,2),(425,277,93,3),(492,322,93,3),(798,563,93,2),(159,104,95,3),(346,226,95,3),(624,406,95,3),(90,57,96,3),(188,121,96,3),(435,284,96,3),(611,399,96,3),(137,90,97,3),(326,213,97,3),(531,348,97,3),(572,373,97,3),(769,534,98,2),(124,82,100,3),(148,96,101,3),(277,179,101,3),(404,263,101,3),(499,326,101,3),(564,368,101,3),(797,562,104,2),(792,557,105,2),(717,482,108,2),(737,502,108,2),(790,555,108,2),(714,479,110,2),(752,517,110,2),(712,477,114,2),(751,516,114,2),(763,528,114,2),(788,553,116,2),(718,483,118,2),(738,503,118,2),(777,542,118,2),(726,491,120,2),(756,521,120,2),(459,301,124,2),(461,302,124,2),(463,303,124,2),(464,304,124,2),(466,305,124,2),(467,306,124,2),(469,307,124,2),(470,308,124,2),(472,309,124,2),(474,310,124,2),(476,311,124,2),(478,312,124,2),(480,313,124,2),(481,314,124,2),(482,315,124,2),(483,316,124,2),(484,317,124,2),(485,318,124,2),(486,319,124,2),(488,320,124,2),(489,321,124,2),(491,322,124,2),(493,323,124,2),(494,324,124,2),(496,325,124,2),(498,326,124,2),(500,327,124,2),(501,328,124,2),(502,329,124,2),(504,330,124,2),(506,331,124,2),(507,332,124,2),(509,333,124,2),(510,334,124,2),(511,335,124,2),(512,336,124,2),(513,337,124,2),(514,338,124,2),(515,339,124,2),(517,340,124,2),(518,341,124,2),(520,342,124,2),(522,343,124,2),(523,344,124,2),(525,345,124,2),(527,346,124,2),(528,347,124,2),(530,348,124,2),(532,349,124,2),(534,350,124,2),(536,351,124,2),(538,352,124,2),(540,353,124,2),(542,354,124,2),(543,355,124,2),(545,356,124,2),(546,357,124,2),(548,358,124,2),(549,359,124,2),(551,360,124,2),(553,361,124,2),(554,362,124,2),(556,363,124,2),(557,364,124,2),(559,365,124,2),(560,366,124,2),(561,367,124,2),(563,368,124,2),(565,369,124,2),(567,370,124,2),(568,371,124,2),(570,372,124,2),(571,373,124,2),(573,374,124,2),(575,375,124,2),(577,376,124,2),(579,377,124,2),(580,378,124,2),(581,379,124,2),(583,380,124,2),(584,381,124,2),(585,382,124,2),(586,383,124,2),(587,384,124,2),(589,385,124,2),(591,386,124,2),(592,387,124,2),(593,388,124,2),(595,389,124,2),(596,390,124,2),(597,391,124,2),(599,392,124,2),(601,393,124,2),(603,394,124,2),(604,395,124,2),(606,396,124,2),(608,397,124,2),(609,398,124,2),(610,399,124,2),(612,400,124,2),(614,401,124,2),(616,402,124,2),(618,403,124,2),(619,404,124,2),(621,405,124,2),(623,406,124,2),(625,407,124,2),(626,408,124,2),(627,409,124,2),(628,410,124,2),(629,411,124,2),(631,412,124,2),(632,413,124,2),(633,414,124,2),(634,415,124,2),(635,416,124,2),(636,417,124,2),(638,418,124,2),(639,419,124,2),(640,420,124,2),(641,421,124,2),(642,422,124,2),(644,423,124,2),(646,424,124,2),(647,425,124,2),(648,426,124,2),(649,427,124,2),(650,428,124,2),(652,429,124,2),(654,430,124,2),(656,431,124,2),(658,432,124,2),(660,433,124,2),(662,434,124,2),(663,435,124,2),(664,436,124,2),(665,437,124,2),(666,438,124,2),(667,439,124,2),(668,440,124,2),(669,441,124,2),(670,442,124,2),(672,443,124,2),(674,444,124,2),(676,445,124,2),(677,446,124,2),(678,447,124,2),(680,448,124,2),(682,449,124,2),(684,450,124,2),(728,493,125,2),(744,509,125,2),(787,552,125,2),(702,467,126,2),(746,511,126,2),(771,536,127,2),(803,568,128,2),(795,560,129,2),(724,489,131,2),(755,520,131,2),(715,480,132,2),(736,501,132,2),(705,470,134,2),(731,496,134,2),(804,569,135,2),(762,527,136,2),(699,464,140,2),(729,494,140,2),(789,554,146,2),(806,571,147,2),(764,529,148,2),(809,574,150,2),(773,538,151,2),(766,531,152,2),(720,485,156,2),(758,523,156,2),(772,537,158,2),(799,564,159,2),(719,484,161,2),(739,504,161,2),(793,558,161,2),(703,468,165,2),(747,512,165,2),(767,532,166,2),(722,487,167,2),(754,519,167,2),(807,572,171,2),(708,473,178,2),(733,498,178,2),(800,565,178,2),(794,559,181,2),(770,535,196,2),(782,547,199,2);
 /*!40000 ALTER TABLE `civicrm_activity_contact` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -107,7 +107,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_address` WRITE;
 /*!40000 ALTER TABLE `civicrm_address` DISABLE KEYS */;
-INSERT INTO `civicrm_address` (`id`, `contact_id`, `location_type_id`, `is_primary`, `is_billing`, `street_address`, `street_number`, `street_number_suffix`, `street_number_predirectional`, `street_name`, `street_type`, `street_number_postdirectional`, `street_unit`, `supplemental_address_1`, `supplemental_address_2`, `supplemental_address_3`, `city`, `county_id`, `state_province_id`, `postal_code_suffix`, `postal_code`, `usps_adc`, `country_id`, `geo_code_1`, `geo_code_2`, `manual_geo_code`, `timezone`, `name`, `master_id`) VALUES (1,24,1,1,0,'684Y Woodbridge Blvd NE',684,'Y',NULL,'Woodbridge','Blvd','NE',NULL,NULL,NULL,NULL,'Lawrence',1,1020,NULL,'01840',NULL,1228,42.706941,-71.16181,0,NULL,NULL,NULL),(2,124,1,1,0,'842S Main Ave N',842,'S',NULL,'Main','Ave','N',NULL,NULL,NULL,NULL,'Swengel',1,1037,NULL,'17880',NULL,1228,40.978059,-77.08184,0,NULL,NULL,NULL),(3,57,1,1,0,'438V Main Path W',438,'V',NULL,'Main','Path','W',NULL,NULL,NULL,NULL,'Sun Valley',1,1011,NULL,'83353',NULL,1228,43.661373,-114.18191,0,NULL,NULL,NULL),(4,17,1,1,0,'49W Jackson Blvd SE',49,'W',NULL,'Jackson','Blvd','SE',NULL,NULL,NULL,NULL,'Parkman',1,1034,NULL,'44080',NULL,1228,41.372452,-81.06617,0,NULL,NULL,NULL),(5,182,1,1,0,'392O Green Path W',392,'O',NULL,'Green','Path','W',NULL,NULL,NULL,NULL,'Stapleton',1,1000,NULL,'36578',NULL,1228,30.744745,-87.81486,0,NULL,NULL,NULL),(6,99,1,1,0,'665Z Maple Dr E',665,'Z',NULL,'Maple','Dr','E',NULL,NULL,NULL,NULL,'Greenmountain',1,1032,NULL,'28740',NULL,1228,36.023817,-82.29237,0,NULL,NULL,NULL),(7,33,1,1,0,'866D Main Pl N',866,'D',NULL,'Main','Pl','N',NULL,NULL,NULL,NULL,'Ladson',1,1039,NULL,'29456',NULL,1228,32.993571,-80.12165,0,NULL,NULL,NULL),(8,179,1,1,0,'501L Martin Luther King Path SW',501,'L',NULL,'Martin Luther King','Path','SW',NULL,NULL,NULL,NULL,'Kiamesha Lake',1,1031,NULL,'12751',NULL,1228,41.679152,-74.657,0,NULL,NULL,NULL),(9,164,1,1,0,'220E Beech Dr N',220,'E',NULL,'Beech','Dr','N',NULL,NULL,NULL,NULL,'North Sandwich',1,1028,NULL,'03259',NULL,1228,43.880005,-71.39475,0,NULL,NULL,NULL),(10,193,1,1,0,'441B Martin Luther King Blvd N',441,'B',NULL,'Martin Luther King','Blvd','N',NULL,NULL,NULL,NULL,'Louisburg',1,1032,NULL,'27549',NULL,1228,36.062239,-78.24953,0,NULL,NULL,NULL),(11,76,1,1,0,'407F Van Ness St W',407,'F',NULL,'Van Ness','St','W',NULL,NULL,NULL,NULL,'Swan Lake',1,1031,NULL,'12783',NULL,1228,41.736523,-74.82634,0,NULL,NULL,NULL),(12,162,1,1,0,'99A Main Pl SE',99,'A',NULL,'Main','Pl','SE',NULL,NULL,NULL,NULL,'Pago Pago',1,1052,NULL,'96799',NULL,1228,-7.209975,-170.7716,0,NULL,NULL,NULL),(13,66,1,1,0,'215Q Beech Ave SE',215,'Q',NULL,'Beech','Ave','SE',NULL,NULL,NULL,NULL,'Gun Barrel City',1,1042,NULL,'75156',NULL,1228,32.290819,-96.114108,0,NULL,NULL,NULL),(14,92,1,1,0,'969U El Camino Blvd E',969,'U',NULL,'El Camino','Blvd','E',NULL,NULL,NULL,NULL,'Decatur',1,1014,NULL,'50067',NULL,1228,40.734072,-93.85169,0,NULL,NULL,NULL),(15,167,1,1,0,'385V College Rd NW',385,'V',NULL,'College','Rd','NW',NULL,NULL,NULL,NULL,'El Paso',1,1042,NULL,'88558',NULL,1228,31.694842,-106.299987,0,NULL,NULL,NULL),(16,183,1,1,0,'76C Dowlen Path E',76,'C',NULL,'Dowlen','Path','E',NULL,NULL,NULL,NULL,'Monson',1,1018,NULL,'04464',NULL,1228,45.303916,-69.51368,0,NULL,NULL,NULL),(17,175,1,1,0,'963L Second Pl SE',963,'L',NULL,'Second','Pl','SE',NULL,NULL,NULL,NULL,'Lake Havasu City',1,1002,NULL,'86403',NULL,1228,34.483582,-114.33694,0,NULL,NULL,NULL),(18,129,1,1,0,'429H Martin Luther King Dr SW',429,'H',NULL,'Martin Luther King','Dr','SW',NULL,NULL,NULL,NULL,'Sarasota',1,1008,NULL,'34234',NULL,1228,27.365622,-82.53556,0,NULL,NULL,NULL),(19,197,1,1,0,'41J Dowlen Dr NW',41,'J',NULL,'Dowlen','Dr','NW',NULL,NULL,NULL,NULL,'Findlay',1,1034,NULL,'45840',NULL,1228,41.037325,-83.64576,0,NULL,NULL,NULL),(20,7,1,1,0,'439C Green St SW',439,'C',NULL,'Green','St','SW',NULL,NULL,NULL,NULL,'Buffalo',1,1014,NULL,'52728',NULL,1228,41.456515,-90.73252,0,NULL,NULL,NULL),(21,154,1,1,0,'475T El Camino Ln W',475,'T',NULL,'El Camino','Ln','W',NULL,NULL,NULL,NULL,'Huxley',1,1014,NULL,'50124',NULL,1228,41.893335,-93.59844,0,NULL,NULL,NULL),(22,51,1,1,0,'877S Cadell Way SW',877,'S',NULL,'Cadell','Way','SW',NULL,NULL,NULL,NULL,'Mount Pleasant',1,1008,NULL,'32352',NULL,1228,30.665715,-84.75363,0,NULL,NULL,NULL),(23,143,1,1,0,'544N Jackson Dr SW',544,'N',NULL,'Jackson','Dr','SW',NULL,NULL,NULL,NULL,'Dahlen',1,1033,NULL,'58224',NULL,1228,48.173113,-97.95766,0,NULL,NULL,NULL),(24,77,1,1,0,'577N Maple Blvd SW',577,'N',NULL,'Maple','Blvd','SW',NULL,NULL,NULL,NULL,'Spokane',1,1046,NULL,'99210',NULL,1228,47.653568,-117.431742,0,NULL,NULL,NULL),(25,84,1,1,0,'428M Green Ln S',428,'M',NULL,'Green','Ln','S',NULL,NULL,NULL,NULL,'Ponca City',1,1035,NULL,'74603',NULL,1228,36.796349,-97.106166,0,NULL,NULL,NULL),(26,88,1,1,0,'723Z Beech Path W',723,'Z',NULL,'Beech','Path','W',NULL,NULL,NULL,NULL,'Anaheim',1,1004,NULL,'92899',NULL,1228,33.640302,-117.769442,0,NULL,NULL,NULL),(27,30,1,1,0,'703U Bay Pl W',703,'U',NULL,'Bay','Pl','W',NULL,NULL,NULL,NULL,'Mollusk',1,1045,NULL,'22517',NULL,1228,37.75028,-76.578109,0,NULL,NULL,NULL),(28,2,1,1,0,'543B Maple Rd SE',543,'B',NULL,'Maple','Rd','SE',NULL,NULL,NULL,NULL,'Sunspot',1,1030,NULL,'88349',NULL,1228,32.8672,-105.781129,0,NULL,NULL,NULL),(29,156,1,1,0,'269A Lincoln Pl SW',269,'A',NULL,'Lincoln','Pl','SW',NULL,NULL,NULL,NULL,'Urbana',1,1013,NULL,'46990',NULL,1228,40.898561,-85.7457,0,NULL,NULL,NULL),(30,118,1,1,0,'663O Second Rd W',663,'O',NULL,'Second','Rd','W',NULL,NULL,NULL,NULL,'Foxhome',1,1022,NULL,'56543',NULL,1228,46.290371,-96.33238,0,NULL,NULL,NULL),(31,87,1,1,0,'426A Caulder St E',426,'A',NULL,'Caulder','St','E',NULL,NULL,NULL,NULL,'Turner',1,1036,NULL,'97392',NULL,1228,44.807739,-122.9485,0,NULL,NULL,NULL),(32,23,1,1,0,'171T Lincoln St NE',171,'T',NULL,'Lincoln','St','NE',NULL,NULL,NULL,NULL,'West Lebanon',1,1037,NULL,'15783',NULL,1228,40.601789,-79.35524,0,NULL,NULL,NULL),(33,5,1,1,0,'127G Pine Way S',127,'G',NULL,'Pine','Way','S',NULL,NULL,NULL,NULL,'Collierville',1,1041,NULL,'38027',NULL,1228,35.201738,-89.971538,0,NULL,NULL,NULL),(34,199,1,1,0,'284M Dowlen St N',284,'M',NULL,'Dowlen','St','N',NULL,NULL,NULL,NULL,'Saint Jo',1,1042,NULL,'76265',NULL,1228,33.701692,-97.53029,0,NULL,NULL,NULL),(35,176,1,1,0,'86O States Path SE',86,'O',NULL,'States','Path','SE',NULL,NULL,NULL,NULL,'Cape Coral',1,1008,NULL,'33914',NULL,1228,26.579862,-82.00227,0,NULL,NULL,NULL),(36,132,1,1,0,'561V Dowlen Blvd SE',561,'V',NULL,'Dowlen','Blvd','SE',NULL,NULL,NULL,NULL,'Colts Neck',1,1029,NULL,'07722',NULL,1228,40.300226,-74.18306,0,NULL,NULL,NULL),(37,80,1,1,0,'307B Maple Way S',307,'B',NULL,'Maple','Way','S',NULL,NULL,NULL,NULL,'Savannah',1,1009,NULL,'31411',NULL,1228,31.927434,-81.0425,0,NULL,NULL,NULL),(38,44,1,1,0,'3C Dowlen Pl SW',3,'C',NULL,'Dowlen','Pl','SW',NULL,NULL,NULL,NULL,'Sea Island',1,1009,NULL,'31561',NULL,1228,31.198914,-81.332211,0,NULL,NULL,NULL),(39,96,1,1,0,'329R Northpoint Ave N',329,'R',NULL,'Northpoint','Ave','N',NULL,NULL,NULL,NULL,'Jacksonville',1,1008,NULL,'32206',NULL,1228,30.351006,-81.64664,0,NULL,NULL,NULL),(40,166,1,1,0,'583Q Dowlen Pl W',583,'Q',NULL,'Dowlen','Pl','W',NULL,NULL,NULL,NULL,'Cascade',1,1005,NULL,'80809',NULL,1228,38.911701,-104.98731,0,NULL,NULL,NULL),(41,52,1,1,0,'780Z Northpoint Blvd SE',780,'Z',NULL,'Northpoint','Blvd','SE',NULL,NULL,NULL,NULL,'Morehead City',1,1032,NULL,'28557',NULL,1228,34.729839,-76.75219,0,NULL,NULL,NULL),(42,16,1,1,0,'706L Main Path E',706,'L',NULL,'Main','Path','E',NULL,NULL,NULL,NULL,'Usk',1,1046,NULL,'99180',NULL,1228,48.295497,-117.29236,0,NULL,NULL,NULL),(43,139,1,1,0,'779I Woodbridge Path SW',779,'I',NULL,'Woodbridge','Path','SW',NULL,NULL,NULL,NULL,'Columbus',1,1034,NULL,'43219',NULL,1228,40.002514,-82.92589,0,NULL,NULL,NULL),(44,127,1,1,0,'11Q Dowlen Blvd SE',11,'Q',NULL,'Dowlen','Blvd','SE',NULL,NULL,NULL,NULL,'Santa Clara',1,1004,NULL,'95051',NULL,1228,37.346241,-121.9846,0,NULL,NULL,NULL),(45,172,1,1,0,'375K Van Ness Ave NE',375,'K',NULL,'Van Ness','Ave','NE',NULL,NULL,NULL,NULL,'Ferguson',1,1032,NULL,'28624',NULL,1228,36.110425,-81.42262,0,NULL,NULL,NULL),(46,11,1,1,0,'321Z Green Path W',321,'Z',NULL,'Green','Path','W',NULL,NULL,NULL,NULL,'Florence',1,1039,NULL,'29503',NULL,1228,34.062999,-79.650627,0,NULL,NULL,NULL),(47,128,1,1,0,'480E Jackson Blvd E',480,'E',NULL,'Jackson','Blvd','E',NULL,NULL,NULL,NULL,'Wascott',1,1048,NULL,'54383',NULL,1228,46.18508,-91.959307,0,NULL,NULL,NULL),(48,38,1,1,0,'5C Main Dr W',5,'C',NULL,'Main','Dr','W',NULL,NULL,NULL,NULL,'Cuthbert',1,1009,NULL,'31740',NULL,1228,31.781815,-84.76444,0,NULL,NULL,NULL),(49,136,1,1,0,'579N Main Rd SE',579,'N',NULL,'Main','Rd','SE',NULL,NULL,NULL,NULL,'Kendall',1,1048,NULL,'54638',NULL,1228,43.795422,-90.37609,0,NULL,NULL,NULL),(50,32,1,1,0,'275C Jackson Ave N',275,'C',NULL,'Jackson','Ave','N',NULL,NULL,NULL,NULL,'Denver',1,1037,NULL,'17517',NULL,1228,40.234392,-76.12655,0,NULL,NULL,NULL),(51,27,1,1,0,'228Q Main Rd NW',228,'Q',NULL,'Main','Rd','NW',NULL,NULL,NULL,NULL,'Mount Pleasant',1,1034,NULL,'43939',NULL,1228,40.176109,-80.79979,0,NULL,NULL,NULL),(52,116,1,1,0,'797G Main Ln S',797,'G',NULL,'Main','Ln','S',NULL,NULL,NULL,NULL,'Louisville',1,1016,NULL,'40291',NULL,1228,38.147232,-85.59169,0,NULL,NULL,NULL),(53,106,1,1,0,'747A El Camino Way NW',747,'A',NULL,'El Camino','Way','NW',NULL,NULL,NULL,NULL,'Harmony',1,1038,NULL,'02829',NULL,1228,41.879298,-71.589357,0,NULL,NULL,NULL),(54,22,1,1,0,'680G Caulder Blvd E',680,'G',NULL,'Caulder','Blvd','E',NULL,NULL,NULL,NULL,'Yoncalla',1,1036,NULL,'97499',NULL,1228,43.593788,-123.26602,0,NULL,NULL,NULL),(55,115,1,1,0,'485N States Dr SW',485,'N',NULL,'States','Dr','SW',NULL,NULL,NULL,NULL,'Ardmore',1,1035,NULL,'73403',NULL,1228,34.288884,-97.248074,0,NULL,NULL,NULL),(56,35,1,1,0,'218T Lincoln Ave SW',218,'T',NULL,'Lincoln','Ave','SW',NULL,NULL,NULL,NULL,'Parchman',1,1023,NULL,'38738',NULL,1228,33.922146,-90.54366,0,NULL,NULL,NULL),(57,177,1,1,0,'994U Martin Luther King Pl NE',994,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'Dallas',1,1042,NULL,'75250',NULL,1228,32.767268,-96.777626,0,NULL,NULL,NULL),(58,150,1,1,0,'352X Second Way N',352,'X',NULL,'Second','Way','N',NULL,NULL,NULL,NULL,'Trout Dale',1,1045,NULL,'24378',NULL,1228,36.684567,-81.43411,0,NULL,NULL,NULL),(59,72,1,1,0,'644M Main Dr N',644,'M',NULL,'Main','Dr','N',NULL,NULL,NULL,NULL,'Wilmington',1,1007,NULL,'19893',NULL,1228,39.564499,-75.597047,0,NULL,NULL,NULL),(60,21,1,1,0,'935N Second Pl S',935,'N',NULL,'Second','Pl','S',NULL,NULL,NULL,NULL,'Union City',1,1034,NULL,'45390',NULL,1228,40.20451,-84.78292,0,NULL,NULL,NULL),(61,19,1,1,0,'555F Green Dr S',555,'F',NULL,'Green','Dr','S',NULL,NULL,NULL,NULL,'Pleasant Grove',1,1004,NULL,'95668',NULL,1228,38.8323,-121.51661,0,NULL,NULL,NULL),(62,168,1,1,0,'169U Green St NW',169,'U',NULL,'Green','St','NW',NULL,NULL,NULL,NULL,'Eastwood',1,1016,NULL,'40018',NULL,1228,38.22977,-85.66304,0,NULL,NULL,NULL),(63,101,1,1,0,'967B Dowlen Pl S',967,'B',NULL,'Dowlen','Pl','S',NULL,NULL,NULL,NULL,'Strawberry Plains',1,1041,NULL,'37871',NULL,1228,36.04051,-83.67934,0,NULL,NULL,NULL),(64,98,1,1,0,'706B Cadell Ln SW',706,'B',NULL,'Cadell','Ln','SW',NULL,NULL,NULL,NULL,'Augusta',1,1009,NULL,'30917',NULL,1228,33.527678,-82.235542,0,NULL,NULL,NULL),(65,163,1,1,0,'296I States Path E',296,'I',NULL,'States','Path','E',NULL,NULL,NULL,NULL,'Heber',1,1002,NULL,'85928',NULL,1228,34.563994,-110.55929,0,NULL,NULL,NULL),(66,142,3,1,0,'787I Bay Pl W',787,'I',NULL,'Bay','Pl','W',NULL,'Subscriptions Dept',NULL,NULL,'Mccleary',1,1046,NULL,'98557',NULL,1228,47.054419,-123.2739,0,NULL,NULL,NULL),(67,170,2,1,0,'787I Bay Pl W',787,'I',NULL,'Bay','Pl','W',NULL,'Subscriptions Dept',NULL,NULL,'Mccleary',1,1046,NULL,'98557',NULL,1228,47.054419,-123.2739,0,NULL,NULL,66),(68,174,3,1,0,'698Y Northpoint Blvd NW',698,'Y',NULL,'Northpoint','Blvd','NW',NULL,'Donor Relations',NULL,NULL,'West Greene',1,1000,NULL,'35491',NULL,1228,32.835692,-87.956884,0,NULL,NULL,NULL),(69,185,2,1,0,'698Y Northpoint Blvd NW',698,'Y',NULL,'Northpoint','Blvd','NW',NULL,'Donor Relations',NULL,NULL,'West Greene',1,1000,NULL,'35491',NULL,1228,32.835692,-87.956884,0,NULL,NULL,68),(70,105,3,1,0,'35Y Maple Ln N',35,'Y',NULL,'Maple','Ln','N',NULL,'Disbursements',NULL,NULL,'Gateway',1,1003,NULL,'72733',NULL,1228,36.486424,-93.927748,0,NULL,NULL,NULL),(71,151,2,1,0,'35Y Maple Ln N',35,'Y',NULL,'Maple','Ln','N',NULL,'Disbursements',NULL,NULL,'Gateway',1,1003,NULL,'72733',NULL,1228,36.486424,-93.927748,0,NULL,NULL,70),(72,144,3,1,0,'900W Van Ness Dr SE',900,'W',NULL,'Van Ness','Dr','SE',NULL,'c/o OPDC',NULL,NULL,'Perris',1,1004,NULL,'92572',NULL,1228,33.752886,-116.055617,0,NULL,NULL,NULL),(73,18,2,1,0,'900W Van Ness Dr SE',900,'W',NULL,'Van Ness','Dr','SE',NULL,'c/o OPDC',NULL,NULL,'Perris',1,1004,NULL,'92572',NULL,1228,33.752886,-116.055617,0,NULL,NULL,72),(74,148,3,1,0,'241O Van Ness Way NE',241,'O',NULL,'Van Ness','Way','NE',NULL,'c/o PO Plus',NULL,NULL,'Dallas',1,1042,NULL,'75243',NULL,1228,32.912225,-96.73688,0,NULL,NULL,NULL),(75,104,2,1,0,'241O Van Ness Way NE',241,'O',NULL,'Van Ness','Way','NE',NULL,'c/o PO Plus',NULL,NULL,'Dallas',1,1042,NULL,'75243',NULL,1228,32.912225,-96.73688,0,NULL,NULL,74),(76,90,3,1,0,'99D Beech Ave SW',99,'D',NULL,'Beech','Ave','SW',NULL,'Mailstop 101',NULL,NULL,'Rebecca',1,1009,NULL,'31783',NULL,1228,31.767986,-83.47325,0,NULL,NULL,NULL),(77,86,3,1,0,'188H Beech Way W',188,'H',NULL,'Beech','Way','W',NULL,'Cuffe Parade',NULL,NULL,'Silver Spring',1,1019,NULL,'20997',NULL,1228,39.143979,-77.207617,0,NULL,NULL,NULL),(78,197,2,0,0,'188H Beech Way W',188,'H',NULL,'Beech','Way','W',NULL,'Cuffe Parade',NULL,NULL,'Silver Spring',1,1019,NULL,'20997',NULL,1228,39.143979,-77.207617,0,NULL,NULL,77),(79,56,3,1,0,'427Z Beech Ln N',427,'Z',NULL,'Beech','Ln','N',NULL,'Attn: Accounting',NULL,NULL,'Kings Mountain',1,1016,NULL,'40442',NULL,1228,37.351449,-84.7219,0,NULL,NULL,NULL),(80,62,3,1,0,'132F Jackson St NE',132,'F',NULL,'Jackson','St','NE',NULL,'Subscriptions Dept',NULL,NULL,'Collins',1,1014,NULL,'50055',NULL,1228,41.880967,-93.29691,0,NULL,NULL,NULL),(81,137,3,1,0,'924Z States Rd E',924,'Z',NULL,'States','Rd','E',NULL,'Attn: Development',NULL,NULL,'Aptos',1,1004,NULL,'95001',NULL,1228,37.05297,-121.949418,0,NULL,NULL,NULL),(82,34,2,1,0,'924Z States Rd E',924,'Z',NULL,'States','Rd','E',NULL,'Attn: Development',NULL,NULL,'Aptos',1,1004,NULL,'95001',NULL,1228,37.05297,-121.949418,0,NULL,NULL,81),(83,14,3,1,0,'385N States Way SW',385,'N',NULL,'States','Way','SW',NULL,'Disbursements',NULL,NULL,'Ballston Lake',1,1031,NULL,'12019',NULL,1228,42.916343,-73.86657,0,NULL,NULL,NULL),(84,178,3,1,0,'657X Dowlen Ave NW',657,'X',NULL,'Dowlen','Ave','NW',NULL,'c/o PO Plus',NULL,NULL,'Lake Como',1,1008,NULL,'32157',NULL,1228,29.467357,-81.57164,0,NULL,NULL,NULL),(85,117,3,1,0,'801K Main St W',801,'K',NULL,'Main','St','W',NULL,'Community Relations',NULL,NULL,'Willow City',1,1033,NULL,'58384',NULL,1228,48.609924,-100.26587,0,NULL,NULL,NULL),(86,85,2,1,0,'801K Main St W',801,'K',NULL,'Main','St','W',NULL,'Community Relations',NULL,NULL,'Willow City',1,1033,NULL,'58384',NULL,1228,48.609924,-100.26587,0,NULL,NULL,85),(87,157,3,1,0,'787X Lincoln Dr E',787,'X',NULL,'Lincoln','Dr','E',NULL,'Urgent',NULL,NULL,'Moxahala',1,1034,NULL,'43761',NULL,1228,39.740299,-82.248369,0,NULL,NULL,NULL),(88,57,2,0,0,'787X Lincoln Dr E',787,'X',NULL,'Lincoln','Dr','E',NULL,'Urgent',NULL,NULL,'Moxahala',1,1034,NULL,'43761',NULL,1228,39.740299,-82.248369,0,NULL,NULL,87),(89,91,3,1,0,'854O Green Rd NE',854,'O',NULL,'Green','Rd','NE',NULL,'Subscriptions Dept',NULL,NULL,'Allakaket',1,1001,NULL,'99720',NULL,1228,66.557586,-152.6559,0,NULL,NULL,NULL),(90,120,2,1,0,'854O Green Rd NE',854,'O',NULL,'Green','Rd','NE',NULL,'Subscriptions Dept',NULL,NULL,'Allakaket',1,1001,NULL,'99720',NULL,1228,66.557586,-152.6559,0,NULL,NULL,89),(91,73,3,1,0,'251Y Van Ness St NW',251,'Y',NULL,'Van Ness','St','NW',NULL,'c/o OPDC',NULL,NULL,'Yakima',1,1046,NULL,'98907',NULL,1228,46.628757,-120.573967,0,NULL,NULL,NULL),(92,75,2,1,0,'251Y Van Ness St NW',251,'Y',NULL,'Van Ness','St','NW',NULL,'c/o OPDC',NULL,NULL,'Yakima',1,1046,NULL,'98907',NULL,1228,46.628757,-120.573967,0,NULL,NULL,91),(93,79,3,1,0,'753P Main Pl NW',753,'P',NULL,'Main','Pl','NW',NULL,'Payables Dept.',NULL,NULL,'Ogdensburg',1,1048,NULL,'54962',NULL,1228,44.481372,-89.03101,0,NULL,NULL,NULL),(94,37,3,1,0,'879J Jackson Ave S',879,'J',NULL,'Jackson','Ave','S',NULL,'Receiving',NULL,NULL,'Copeland',1,1015,NULL,'67837',NULL,1228,37.554849,-100.67514,0,NULL,NULL,NULL),(95,36,2,1,0,'879J Jackson Ave S',879,'J',NULL,'Jackson','Ave','S',NULL,'Receiving',NULL,NULL,'Copeland',1,1015,NULL,'67837',NULL,1228,37.554849,-100.67514,0,NULL,NULL,94),(96,46,3,1,0,'374P Green Ave S',374,'P',NULL,'Green','Ave','S',NULL,'Subscriptions Dept',NULL,NULL,'Tampa',1,1008,NULL,'33697',NULL,1228,27.871964,-82.438841,0,NULL,NULL,NULL),(97,20,2,1,0,'374P Green Ave S',374,'P',NULL,'Green','Ave','S',NULL,'Subscriptions Dept',NULL,NULL,'Tampa',1,1008,NULL,'33697',NULL,1228,27.871964,-82.438841,0,NULL,NULL,96),(98,50,3,1,0,'632O College Ave NW',632,'O',NULL,'College','Ave','NW',NULL,'Editorial Dept',NULL,NULL,'Lakewood',1,1029,NULL,'08701',NULL,1228,40.082782,-74.2094,0,NULL,NULL,NULL),(99,89,2,1,0,'632O College Ave NW',632,'O',NULL,'College','Ave','NW',NULL,'Editorial Dept',NULL,NULL,'Lakewood',1,1029,NULL,'08701',NULL,1228,40.082782,-74.2094,0,NULL,NULL,98),(100,125,1,1,0,'321Z Green Path W',321,'Z',NULL,'Green','Path','W',NULL,NULL,NULL,NULL,'Florence',1,1039,NULL,'29503',NULL,1228,34.062999,-79.650627,0,NULL,NULL,46),(101,74,1,1,0,'321Z Green Path W',321,'Z',NULL,'Green','Path','W',NULL,NULL,NULL,NULL,'Florence',1,1039,NULL,'29503',NULL,1228,34.062999,-79.650627,0,NULL,NULL,46),(102,47,1,1,0,'321Z Green Path W',321,'Z',NULL,'Green','Path','W',NULL,NULL,NULL,NULL,'Florence',1,1039,NULL,'29503',NULL,1228,34.062999,-79.650627,0,NULL,NULL,46),(103,172,1,0,0,'967Z College Path E',967,'Z',NULL,'College','Path','E',NULL,NULL,NULL,NULL,'Michigan City',1,1023,NULL,'38647',NULL,1228,34.975571,-89.25982,0,NULL,NULL,NULL),(104,102,1,1,0,'480E Jackson Blvd E',480,'E',NULL,'Jackson','Blvd','E',NULL,NULL,NULL,NULL,'Wascott',1,1048,NULL,'54383',NULL,1228,46.18508,-91.959307,0,NULL,NULL,47),(105,126,1,1,0,'480E Jackson Blvd E',480,'E',NULL,'Jackson','Blvd','E',NULL,NULL,NULL,NULL,'Wascott',1,1048,NULL,'54383',NULL,1228,46.18508,-91.959307,0,NULL,NULL,47),(106,9,1,1,0,'480E Jackson Blvd E',480,'E',NULL,'Jackson','Blvd','E',NULL,NULL,NULL,NULL,'Wascott',1,1048,NULL,'54383',NULL,1228,46.18508,-91.959307,0,NULL,NULL,47),(107,159,1,1,0,'434Z Beech Blvd NW',434,'Z',NULL,'Beech','Blvd','NW',NULL,NULL,NULL,NULL,'Carteret',1,1029,NULL,'07008',NULL,1228,40.582504,-74.22997,0,NULL,NULL,NULL),(108,149,1,1,0,'5C Main Dr W',5,'C',NULL,'Main','Dr','W',NULL,NULL,NULL,NULL,'Cuthbert',1,1009,NULL,'31740',NULL,1228,31.781815,-84.76444,0,NULL,NULL,48),(109,40,1,1,0,'5C Main Dr W',5,'C',NULL,'Main','Dr','W',NULL,NULL,NULL,NULL,'Cuthbert',1,1009,NULL,'31740',NULL,1228,31.781815,-84.76444,0,NULL,NULL,48),(110,85,1,0,0,'5C Main Dr W',5,'C',NULL,'Main','Dr','W',NULL,NULL,NULL,NULL,'Cuthbert',1,1009,NULL,'31740',NULL,1228,31.781815,-84.76444,0,NULL,NULL,48),(111,198,1,1,0,'5C Main Dr W',5,'C',NULL,'Main','Dr','W',NULL,NULL,NULL,NULL,'Cuthbert',1,1009,NULL,'31740',NULL,1228,31.781815,-84.76444,0,NULL,NULL,48),(112,170,1,0,0,'579N Main Rd SE',579,'N',NULL,'Main','Rd','SE',NULL,NULL,NULL,NULL,'Kendall',1,1048,NULL,'54638',NULL,1228,43.795422,-90.37609,0,NULL,NULL,49),(113,134,1,1,0,'579N Main Rd SE',579,'N',NULL,'Main','Rd','SE',NULL,NULL,NULL,NULL,'Kendall',1,1048,NULL,'54638',NULL,1228,43.795422,-90.37609,0,NULL,NULL,49),(114,100,1,1,0,'579N Main Rd SE',579,'N',NULL,'Main','Rd','SE',NULL,NULL,NULL,NULL,'Kendall',1,1048,NULL,'54638',NULL,1228,43.795422,-90.37609,0,NULL,NULL,49),(115,192,1,1,0,'506M States St E',506,'M',NULL,'States','St','E',NULL,NULL,NULL,NULL,'East Windsor',1,1006,NULL,'06088',NULL,1228,41.908464,-72.60547,0,NULL,NULL,NULL),(116,113,1,1,0,'275C Jackson Ave N',275,'C',NULL,'Jackson','Ave','N',NULL,NULL,NULL,NULL,'Denver',1,1037,NULL,'17517',NULL,1228,40.234392,-76.12655,0,NULL,NULL,50),(117,59,1,1,0,'275C Jackson Ave N',275,'C',NULL,'Jackson','Ave','N',NULL,NULL,NULL,NULL,'Denver',1,1037,NULL,'17517',NULL,1228,40.234392,-76.12655,0,NULL,NULL,50),(118,110,1,1,0,'275C Jackson Ave N',275,'C',NULL,'Jackson','Ave','N',NULL,NULL,NULL,NULL,'Denver',1,1037,NULL,'17517',NULL,1228,40.234392,-76.12655,0,NULL,NULL,50),(119,34,1,0,0,'275C Jackson Ave N',275,'C',NULL,'Jackson','Ave','N',NULL,NULL,NULL,NULL,'Denver',1,1037,NULL,'17517',NULL,1228,40.234392,-76.12655,0,NULL,NULL,50),(120,160,1,1,0,'228Q Main Rd NW',228,'Q',NULL,'Main','Rd','NW',NULL,NULL,NULL,NULL,'Mount Pleasant',1,1034,NULL,'43939',NULL,1228,40.176109,-80.79979,0,NULL,NULL,51),(121,147,1,1,0,'228Q Main Rd NW',228,'Q',NULL,'Main','Rd','NW',NULL,NULL,NULL,NULL,'Mount Pleasant',1,1034,NULL,'43939',NULL,1228,40.176109,-80.79979,0,NULL,NULL,51),(122,151,1,0,0,'228Q Main Rd NW',228,'Q',NULL,'Main','Rd','NW',NULL,NULL,NULL,NULL,'Mount Pleasant',1,1034,NULL,'43939',NULL,1228,40.176109,-80.79979,0,NULL,NULL,51),(123,191,1,1,0,'228Q Main Rd NW',228,'Q',NULL,'Main','Rd','NW',NULL,NULL,NULL,NULL,'Mount Pleasant',1,1034,NULL,'43939',NULL,1228,40.176109,-80.79979,0,NULL,NULL,51),(124,196,1,1,0,'797G Main Ln S',797,'G',NULL,'Main','Ln','S',NULL,NULL,NULL,NULL,'Louisville',1,1016,NULL,'40291',NULL,1228,38.147232,-85.59169,0,NULL,NULL,52),(125,94,1,1,0,'797G Main Ln S',797,'G',NULL,'Main','Ln','S',NULL,NULL,NULL,NULL,'Louisville',1,1016,NULL,'40291',NULL,1228,38.147232,-85.59169,0,NULL,NULL,52),(126,188,1,1,0,'797G Main Ln S',797,'G',NULL,'Main','Ln','S',NULL,NULL,NULL,NULL,'Louisville',1,1016,NULL,'40291',NULL,1228,38.147232,-85.59169,0,NULL,NULL,52),(127,82,1,1,0,'312Q Second Blvd NE',312,'Q',NULL,'Second','Blvd','NE',NULL,NULL,NULL,NULL,'Round Rock',1,1042,NULL,'78681',NULL,1228,30.518975,-97.71439,0,NULL,NULL,NULL),(128,173,1,1,0,'747A El Camino Way NW',747,'A',NULL,'El Camino','Way','NW',NULL,NULL,NULL,NULL,'Harmony',1,1038,NULL,'02829',NULL,1228,41.879298,-71.589357,0,NULL,NULL,53),(129,28,1,1,0,'747A El Camino Way NW',747,'A',NULL,'El Camino','Way','NW',NULL,NULL,NULL,NULL,'Harmony',1,1038,NULL,'02829',NULL,1228,41.879298,-71.589357,0,NULL,NULL,53),(130,133,1,1,0,'747A El Camino Way NW',747,'A',NULL,'El Camino','Way','NW',NULL,NULL,NULL,NULL,'Harmony',1,1038,NULL,'02829',NULL,1228,41.879298,-71.589357,0,NULL,NULL,53),(131,195,1,1,0,'216S Northpoint Ave NW',216,'S',NULL,'Northpoint','Ave','NW',NULL,NULL,NULL,NULL,'Kearneysville',1,1047,NULL,'25429',NULL,1228,39.349586,-77.878957,0,NULL,NULL,NULL),(132,112,1,1,0,'680G Caulder Blvd E',680,'G',NULL,'Caulder','Blvd','E',NULL,NULL,NULL,NULL,'Yoncalla',1,1036,NULL,'97499',NULL,1228,43.593788,-123.26602,0,NULL,NULL,54),(133,152,1,1,0,'680G Caulder Blvd E',680,'G',NULL,'Caulder','Blvd','E',NULL,NULL,NULL,NULL,'Yoncalla',1,1036,NULL,'97499',NULL,1228,43.593788,-123.26602,0,NULL,NULL,54),(134,61,1,1,0,'680G Caulder Blvd E',680,'G',NULL,'Caulder','Blvd','E',NULL,NULL,NULL,NULL,'Yoncalla',1,1036,NULL,'97499',NULL,1228,43.593788,-123.26602,0,NULL,NULL,54),(135,141,1,1,0,'680G Caulder Blvd E',680,'G',NULL,'Caulder','Blvd','E',NULL,NULL,NULL,NULL,'Yoncalla',1,1036,NULL,'97499',NULL,1228,43.593788,-123.26602,0,NULL,NULL,54),(136,54,1,1,0,'485N States Dr SW',485,'N',NULL,'States','Dr','SW',NULL,NULL,NULL,NULL,'Ardmore',1,1035,NULL,'73403',NULL,1228,34.288884,-97.248074,0,NULL,NULL,55),(137,155,1,1,0,'485N States Dr SW',485,'N',NULL,'States','Dr','SW',NULL,NULL,NULL,NULL,'Ardmore',1,1035,NULL,'73403',NULL,1228,34.288884,-97.248074,0,NULL,NULL,55),(138,29,1,1,0,'485N States Dr SW',485,'N',NULL,'States','Dr','SW',NULL,NULL,NULL,NULL,'Ardmore',1,1035,NULL,'73403',NULL,1228,34.288884,-97.248074,0,NULL,NULL,55),(139,108,1,1,0,'485N States Dr SW',485,'N',NULL,'States','Dr','SW',NULL,NULL,NULL,NULL,'Ardmore',1,1035,NULL,'73403',NULL,1228,34.288884,-97.248074,0,NULL,NULL,55),(140,201,1,1,0,'218T Lincoln Ave SW',218,'T',NULL,'Lincoln','Ave','SW',NULL,NULL,NULL,NULL,'Parchman',1,1023,NULL,'38738',NULL,1228,33.922146,-90.54366,0,NULL,NULL,56),(141,63,1,1,0,'218T Lincoln Ave SW',218,'T',NULL,'Lincoln','Ave','SW',NULL,NULL,NULL,NULL,'Parchman',1,1023,NULL,'38738',NULL,1228,33.922146,-90.54366,0,NULL,NULL,56),(142,95,1,1,0,'218T Lincoln Ave SW',218,'T',NULL,'Lincoln','Ave','SW',NULL,NULL,NULL,NULL,'Parchman',1,1023,NULL,'38738',NULL,1228,33.922146,-90.54366,0,NULL,NULL,56),(143,103,1,1,0,'218T Lincoln Ave SW',218,'T',NULL,'Lincoln','Ave','SW',NULL,NULL,NULL,NULL,'Parchman',1,1023,NULL,'38738',NULL,1228,33.922146,-90.54366,0,NULL,NULL,56),(144,68,1,1,0,'994U Martin Luther King Pl NE',994,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'Dallas',1,1042,NULL,'75250',NULL,1228,32.767268,-96.777626,0,NULL,NULL,57),(145,114,1,1,0,'994U Martin Luther King Pl NE',994,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'Dallas',1,1042,NULL,'75250',NULL,1228,32.767268,-96.777626,0,NULL,NULL,57),(146,70,1,1,0,'994U Martin Luther King Pl NE',994,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'Dallas',1,1042,NULL,'75250',NULL,1228,32.767268,-96.777626,0,NULL,NULL,57),(147,107,1,1,0,'994U Martin Luther King Pl NE',994,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'Dallas',1,1042,NULL,'75250',NULL,1228,32.767268,-96.777626,0,NULL,NULL,57),(148,130,1,1,0,'352X Second Way N',352,'X',NULL,'Second','Way','N',NULL,NULL,NULL,NULL,'Trout Dale',1,1045,NULL,'24378',NULL,1228,36.684567,-81.43411,0,NULL,NULL,58),(149,140,1,1,0,'352X Second Way N',352,'X',NULL,'Second','Way','N',NULL,NULL,NULL,NULL,'Trout Dale',1,1045,NULL,'24378',NULL,1228,36.684567,-81.43411,0,NULL,NULL,58),(150,58,1,1,0,'352X Second Way N',352,'X',NULL,'Second','Way','N',NULL,NULL,NULL,NULL,'Trout Dale',1,1045,NULL,'24378',NULL,1228,36.684567,-81.43411,0,NULL,NULL,58),(151,10,1,1,0,'352X Second Way N',352,'X',NULL,'Second','Way','N',NULL,NULL,NULL,NULL,'Trout Dale',1,1045,NULL,'24378',NULL,1228,36.684567,-81.43411,0,NULL,NULL,58),(152,48,1,1,0,'644M Main Dr N',644,'M',NULL,'Main','Dr','N',NULL,NULL,NULL,NULL,'Wilmington',1,1007,NULL,'19893',NULL,1228,39.564499,-75.597047,0,NULL,NULL,59),(153,78,1,1,0,'644M Main Dr N',644,'M',NULL,'Main','Dr','N',NULL,NULL,NULL,NULL,'Wilmington',1,1007,NULL,'19893',NULL,1228,39.564499,-75.597047,0,NULL,NULL,59),(154,181,1,1,0,'644M Main Dr N',644,'M',NULL,'Main','Dr','N',NULL,NULL,NULL,NULL,'Wilmington',1,1007,NULL,'19893',NULL,1228,39.564499,-75.597047,0,NULL,NULL,59),(155,187,1,1,0,'765E States Rd NE',765,'E',NULL,'States','Rd','NE',NULL,NULL,NULL,NULL,'Sebring',1,1008,NULL,'33870',NULL,1228,27.483817,-81.42131,0,NULL,NULL,NULL),(156,43,1,1,0,'935N Second Pl S',935,'N',NULL,'Second','Pl','S',NULL,NULL,NULL,NULL,'Union City',1,1034,NULL,'45390',NULL,1228,40.20451,-84.78292,0,NULL,NULL,60),(157,20,1,0,0,'935N Second Pl S',935,'N',NULL,'Second','Pl','S',NULL,NULL,NULL,NULL,'Union City',1,1034,NULL,'45390',NULL,1228,40.20451,-84.78292,0,NULL,NULL,60),(158,13,1,1,0,'935N Second Pl S',935,'N',NULL,'Second','Pl','S',NULL,NULL,NULL,NULL,'Union City',1,1034,NULL,'45390',NULL,1228,40.20451,-84.78292,0,NULL,NULL,60),(159,135,1,1,0,'759K Lincoln St SW',759,'K',NULL,'Lincoln','St','SW',NULL,NULL,NULL,NULL,'Dutchtown',1,1024,NULL,'63745',NULL,1228,37.24237,-89.69768,0,NULL,NULL,NULL),(160,131,1,1,0,'555F Green Dr S',555,'F',NULL,'Green','Dr','S',NULL,NULL,NULL,NULL,'Pleasant Grove',1,1004,NULL,'95668',NULL,1228,38.8323,-121.51661,0,NULL,NULL,61),(161,89,1,0,0,'555F Green Dr S',555,'F',NULL,'Green','Dr','S',NULL,NULL,NULL,NULL,'Pleasant Grove',1,1004,NULL,'95668',NULL,1228,38.8323,-121.51661,0,NULL,NULL,61),(162,75,1,0,0,'555F Green Dr S',555,'F',NULL,'Green','Dr','S',NULL,NULL,NULL,NULL,'Pleasant Grove',1,1004,NULL,'95668',NULL,1228,38.8323,-121.51661,0,NULL,NULL,61),(163,194,1,1,0,'78O Maple Rd E',78,'O',NULL,'Maple','Rd','E',NULL,NULL,NULL,NULL,'Meservey',1,1014,NULL,'50457',NULL,1228,42.916174,-93.48318,0,NULL,NULL,NULL),(164,153,1,1,0,'169U Green St NW',169,'U',NULL,'Green','St','NW',NULL,NULL,NULL,NULL,'Eastwood',1,1016,NULL,'40018',NULL,1228,38.22977,-85.66304,0,NULL,NULL,62),(165,121,1,1,0,'169U Green St NW',169,'U',NULL,'Green','St','NW',NULL,NULL,NULL,NULL,'Eastwood',1,1016,NULL,'40018',NULL,1228,38.22977,-85.66304,0,NULL,NULL,62),(166,39,1,1,0,'169U Green St NW',169,'U',NULL,'Green','St','NW',NULL,NULL,NULL,NULL,'Eastwood',1,1016,NULL,'40018',NULL,1228,38.22977,-85.66304,0,NULL,NULL,62),(167,104,1,0,0,'169U Green St NW',169,'U',NULL,'Green','St','NW',NULL,NULL,NULL,NULL,'Eastwood',1,1016,NULL,'40018',NULL,1228,38.22977,-85.66304,0,NULL,NULL,62),(168,189,1,1,0,'967B Dowlen Pl S',967,'B',NULL,'Dowlen','Pl','S',NULL,NULL,NULL,NULL,'Strawberry Plains',1,1041,NULL,'37871',NULL,1228,36.04051,-83.67934,0,NULL,NULL,63),(169,36,1,0,0,'967B Dowlen Pl S',967,'B',NULL,'Dowlen','Pl','S',NULL,NULL,NULL,NULL,'Strawberry Plains',1,1041,NULL,'37871',NULL,1228,36.04051,-83.67934,0,NULL,NULL,63),(170,26,1,1,0,'967B Dowlen Pl S',967,'B',NULL,'Dowlen','Pl','S',NULL,NULL,NULL,NULL,'Strawberry Plains',1,1041,NULL,'37871',NULL,1228,36.04051,-83.67934,0,NULL,NULL,63),(171,42,1,1,0,'967B Dowlen Pl S',967,'B',NULL,'Dowlen','Pl','S',NULL,NULL,NULL,NULL,'Strawberry Plains',1,1041,NULL,'37871',NULL,1228,36.04051,-83.67934,0,NULL,NULL,63),(172,200,1,1,0,'706B Cadell Ln SW',706,'B',NULL,'Cadell','Ln','SW',NULL,NULL,NULL,NULL,'Augusta',1,1009,NULL,'30917',NULL,1228,33.527678,-82.235542,0,NULL,NULL,64),(173,69,1,1,0,'706B Cadell Ln SW',706,'B',NULL,'Cadell','Ln','SW',NULL,NULL,NULL,NULL,'Augusta',1,1009,NULL,'30917',NULL,1228,33.527678,-82.235542,0,NULL,NULL,64),(174,109,1,1,0,'706B Cadell Ln SW',706,'B',NULL,'Cadell','Ln','SW',NULL,NULL,NULL,NULL,'Augusta',1,1009,NULL,'30917',NULL,1228,33.527678,-82.235542,0,NULL,NULL,64),(175,171,1,1,0,'706B Cadell Ln SW',706,'B',NULL,'Cadell','Ln','SW',NULL,NULL,NULL,NULL,'Augusta',1,1009,NULL,'30917',NULL,1228,33.527678,-82.235542,0,NULL,NULL,64),(176,180,1,1,0,'296I States Path E',296,'I',NULL,'States','Path','E',NULL,NULL,NULL,NULL,'Heber',1,1002,NULL,'85928',NULL,1228,34.563994,-110.55929,0,NULL,NULL,65),(177,158,1,1,0,'296I States Path E',296,'I',NULL,'States','Path','E',NULL,NULL,NULL,NULL,'Heber',1,1002,NULL,'85928',NULL,1228,34.563994,-110.55929,0,NULL,NULL,65),(178,4,1,1,0,'296I States Path E',296,'I',NULL,'States','Path','E',NULL,NULL,NULL,NULL,'Heber',1,1002,NULL,'85928',NULL,1228,34.563994,-110.55929,0,NULL,NULL,65),(179,25,1,1,0,'912H El Camino Way SE',912,'H',NULL,'El Camino','Way','SE',NULL,NULL,NULL,NULL,'Conetoe',1,1032,NULL,'27819',NULL,1228,35.818414,-77.45335,0,NULL,NULL,NULL),(180,NULL,1,1,1,'14S El Camino Way E',14,'S',NULL,'El Camino','Way',NULL,NULL,NULL,NULL,NULL,'Collinsville',NULL,1006,NULL,'6022',NULL,1228,41.8328,-72.9253,0,NULL,NULL,NULL),(181,NULL,1,1,1,'11B Woodbridge Path SW',11,'B',NULL,'Woodbridge','Path',NULL,NULL,NULL,NULL,NULL,'Dayton',NULL,1034,NULL,'45417',NULL,1228,39.7531,-84.2471,0,NULL,NULL,NULL),(182,NULL,1,1,1,'581O Lincoln Dr SW',581,'O',NULL,'Lincoln','Dr',NULL,NULL,NULL,NULL,NULL,'Santa Fe',NULL,1030,NULL,'87594',NULL,1228,35.5212,-105.982,0,NULL,NULL,NULL);
+INSERT INTO `civicrm_address` (`id`, `contact_id`, `location_type_id`, `is_primary`, `is_billing`, `street_address`, `street_number`, `street_number_suffix`, `street_number_predirectional`, `street_name`, `street_type`, `street_number_postdirectional`, `street_unit`, `supplemental_address_1`, `supplemental_address_2`, `supplemental_address_3`, `city`, `county_id`, `state_province_id`, `postal_code_suffix`, `postal_code`, `usps_adc`, `country_id`, `geo_code_1`, `geo_code_2`, `manual_geo_code`, `timezone`, `name`, `master_id`) VALUES (1,159,1,1,0,'442Q Cadell Ln S',442,'Q',NULL,'Cadell','Ln','S',NULL,NULL,NULL,NULL,'Greenwood',1,1023,NULL,'38930',NULL,1228,33.528734,-90.17663,0,NULL,NULL,NULL),(2,18,1,1,0,'756K Dowlen Way S',756,'K',NULL,'Dowlen','Way','S',NULL,NULL,NULL,NULL,'Mechanicsburg',1,1012,NULL,'62545',NULL,1228,39.77386,-89.39012,0,NULL,NULL,NULL),(3,131,1,1,0,'540F El Camino St SE',540,'F',NULL,'El Camino','St','SE',NULL,NULL,NULL,NULL,'Bakersfield',1,1004,NULL,'93381',NULL,1228,35.294405,-118.905173,0,NULL,NULL,NULL),(4,34,1,1,0,'282R Dowlen Path S',282,'R',NULL,'Dowlen','Path','S',NULL,NULL,NULL,NULL,'Canute',1,1035,NULL,'73626',NULL,1228,35.394,-99.28001,0,NULL,NULL,NULL),(5,163,1,1,0,'435W Martin Luther King Pl SW',435,'W',NULL,'Martin Luther King','Pl','SW',NULL,NULL,NULL,NULL,'Mass City',1,1021,NULL,'49948',NULL,1228,46.730077,-89.02038,0,NULL,NULL,NULL),(6,85,1,1,0,'681U Beech Pl NW',681,'U',NULL,'Beech','Pl','NW',NULL,NULL,NULL,NULL,'Tahoma',1,1004,NULL,'96142',NULL,1228,39.037696,-120.12438,0,NULL,NULL,NULL),(7,57,1,1,0,'459I Beech St SW',459,'I',NULL,'Beech','St','SW',NULL,NULL,NULL,NULL,'Trout',1,1017,NULL,'71371',NULL,1228,31.695553,-92.22751,0,NULL,NULL,NULL),(8,173,1,1,0,'512P Cadell Ave N',512,'P',NULL,'Cadell','Ave','N',NULL,NULL,NULL,NULL,'Green Spring',1,1047,NULL,'26722',NULL,1228,39.509416,-78.6438,0,NULL,NULL,NULL),(9,27,1,1,0,'272I Pine St W',272,'I',NULL,'Pine','St','W',NULL,NULL,NULL,NULL,'Herndon',1,1045,NULL,'20170',NULL,1228,38.977109,-77.38527,0,NULL,NULL,NULL),(10,133,1,1,0,'833I El Camino Ln W',833,'I',NULL,'El Camino','Ln','W',NULL,NULL,NULL,NULL,'Pleasanton',1,1004,NULL,'94566',NULL,1228,37.658898,-121.87149,0,NULL,NULL,NULL),(11,182,1,1,0,'686X Caulder Pl SW',686,'X',NULL,'Caulder','Pl','SW',NULL,NULL,NULL,NULL,'Richfield',1,1032,NULL,'28137',NULL,1228,35.49326,-80.25524,0,NULL,NULL,NULL),(12,33,1,1,0,'694W Main Way SW',694,'W',NULL,'Main','Way','SW',NULL,NULL,NULL,NULL,'Laurel',1,1008,NULL,'34272',NULL,1228,27.146963,-82.425512,0,NULL,NULL,NULL),(13,171,1,1,0,'578F Martin Luther King Pl SW',578,'F',NULL,'Martin Luther King','Pl','SW',NULL,NULL,NULL,NULL,'Spring Lake',1,1022,NULL,'56680',NULL,1228,47.663689,-93.94631,0,NULL,NULL,NULL),(14,101,1,1,0,'390G Second Ave N',390,'G',NULL,'Second','Ave','N',NULL,NULL,NULL,NULL,'Man',1,1047,NULL,'25635',NULL,1228,37.729265,-81.87853,0,NULL,NULL,NULL),(15,134,1,1,0,'125O Bay Path W',125,'O',NULL,'Bay','Path','W',NULL,NULL,NULL,NULL,'Dallesport',1,1046,NULL,'98617',NULL,1228,45.632051,-121.16835,0,NULL,NULL,NULL),(16,97,1,1,0,'532X Maple Ln SW',532,'X',NULL,'Maple','Ln','SW',NULL,NULL,NULL,NULL,'Atwater',1,1012,NULL,'62511',NULL,1228,39.346468,-89.73278,0,NULL,NULL,NULL),(17,16,1,1,0,'603P Bay Path NW',603,'P',NULL,'Bay','Path','NW',NULL,NULL,NULL,NULL,'Hayden',1,1011,NULL,'83835',NULL,1228,47.773595,-116.74907,0,NULL,NULL,NULL),(18,147,1,1,0,'742R Caulder Rd NW',742,'R',NULL,'Caulder','Rd','NW',NULL,NULL,NULL,NULL,'Sublette',1,1012,NULL,'61367',NULL,1228,41.638122,-89.26889,0,NULL,NULL,NULL),(19,137,1,1,0,'569Q Second St N',569,'Q',NULL,'Second','St','N',NULL,NULL,NULL,NULL,'Miller City',1,1034,NULL,'45864',NULL,1228,41.103776,-84.131541,0,NULL,NULL,NULL),(20,195,1,1,0,'456J El Camino Ave N',456,'J',NULL,'El Camino','Ave','N',NULL,NULL,NULL,NULL,'Clifton',1,1041,NULL,'38425',NULL,1228,35.401188,-87.97188,0,NULL,NULL,NULL),(21,108,1,1,0,'797F Jackson St S',797,'F',NULL,'Jackson','St','S',NULL,NULL,NULL,NULL,'Delray Beach',1,1008,NULL,'33447',NULL,1228,26.645895,-80.430269,0,NULL,NULL,NULL),(22,90,1,1,0,'688E Lincoln Rd S',688,'E',NULL,'Lincoln','Rd','S',NULL,NULL,NULL,NULL,'Grand Forks',1,1033,NULL,'58202',NULL,1228,47.920679,-97.07228,0,NULL,NULL,NULL),(23,135,1,1,0,'128W Second Dr NE',128,'W',NULL,'Second','Dr','NE',NULL,NULL,NULL,NULL,'True',1,1047,NULL,'25988',NULL,1228,37.648541,-80.877395,0,NULL,NULL,NULL),(24,47,1,1,0,'915D El Camino Pl NW',915,'D',NULL,'El Camino','Pl','NW',NULL,NULL,NULL,NULL,'Cedarville',1,1021,NULL,'49719',NULL,1228,45.998074,-84.32615,0,NULL,NULL,NULL),(25,166,1,1,0,'800U States Blvd W',800,'U',NULL,'States','Blvd','W',NULL,NULL,NULL,NULL,'Live Oak',1,1004,NULL,'95953',NULL,1228,39.25209,-121.69439,0,NULL,NULL,NULL),(26,143,1,1,0,'684N Pine Blvd NW',684,'N',NULL,'Pine','Blvd','NW',NULL,NULL,NULL,NULL,'Oklahoma City',1,1035,NULL,'73118',NULL,1228,35.515008,-97.53106,0,NULL,NULL,NULL),(27,84,1,1,0,'255Y Pine Ln S',255,'Y',NULL,'Pine','Ln','S',NULL,NULL,NULL,NULL,'West Medford',1,1020,NULL,'02156',NULL,1228,42.446396,-71.459405,0,NULL,NULL,NULL),(28,169,1,1,0,'137S Woodbridge Ave S',137,'S',NULL,'Woodbridge','Ave','S',NULL,NULL,NULL,NULL,'Peerless',1,1025,NULL,'59253',NULL,1228,48.730966,-105.85564,0,NULL,NULL,NULL),(29,113,1,1,0,'764Z El Camino Dr NE',764,'Z',NULL,'El Camino','Dr','NE',NULL,NULL,NULL,NULL,'Parker City',1,1013,NULL,'47368',NULL,1228,40.187403,-85.20421,0,NULL,NULL,NULL),(30,17,1,1,0,'923K Northpoint Ave S',923,'K',NULL,'Northpoint','Ave','S',NULL,NULL,NULL,NULL,'Portage',1,1043,NULL,'84331',NULL,1228,41.909031,-112.32322,0,NULL,NULL,NULL),(31,176,1,1,0,'399U Northpoint Pl NE',399,'U',NULL,'Northpoint','Pl','NE',NULL,NULL,NULL,NULL,'Washington',1,1050,NULL,'20315',NULL,1228,38.928861,-77.017948,0,NULL,NULL,NULL),(32,60,1,1,0,'966T Northpoint Path W',966,'T',NULL,'Northpoint','Path','W',NULL,NULL,NULL,NULL,'Camas Valley',1,1036,NULL,'97416',NULL,1228,43.054446,-123.6864,0,NULL,NULL,NULL),(33,40,1,1,0,'227S Dowlen Pl SE',227,'S',NULL,'Dowlen','Pl','SE',NULL,NULL,NULL,NULL,'Lost Creek',1,1047,NULL,'26385',NULL,1228,39.163304,-80.35527,0,NULL,NULL,NULL),(34,23,1,1,0,'476G Green Ave NE',476,'G',NULL,'Green','Ave','NE',NULL,NULL,NULL,NULL,'Glenmont',1,1034,NULL,'44628',NULL,1228,40.527648,-82.14312,0,NULL,NULL,NULL),(35,130,1,1,0,'727M Beech Rd SW',727,'M',NULL,'Beech','Rd','SW',NULL,NULL,NULL,NULL,'Satin',1,1042,NULL,'76685',NULL,1228,31.35797,-97.02091,0,NULL,NULL,NULL),(36,99,1,1,0,'92A Lincoln Ln S',92,'A',NULL,'Lincoln','Ln','S',NULL,NULL,NULL,NULL,'Capron',1,1045,NULL,'23829',NULL,1228,36.724498,-77.21893,0,NULL,NULL,NULL),(37,106,1,1,0,'800X Second Ave S',800,'X',NULL,'Second','Ave','S',NULL,NULL,NULL,NULL,'Baltimore',1,1019,NULL,'21283',NULL,1228,39.284707,-76.620489,0,NULL,NULL,NULL),(38,14,1,1,0,'607Z Green Blvd SE',607,'Z',NULL,'Green','Blvd','SE',NULL,NULL,NULL,NULL,'Trempealeau',1,1048,NULL,'54661',NULL,1228,44.026843,-91.4513,0,NULL,NULL,NULL),(39,31,1,1,0,'228I Woodbridge Way W',228,'I',NULL,'Woodbridge','Way','W',NULL,NULL,NULL,NULL,'South Beloit',1,1012,NULL,'61080',NULL,1228,42.484835,-89.02756,0,NULL,NULL,NULL),(40,117,1,1,0,'962D Caulder Ln SE',962,'D',NULL,'Caulder','Ln','SE',NULL,NULL,NULL,NULL,'Provo',1,1043,NULL,'84605',NULL,1228,40.176975,-111.536036,0,NULL,NULL,NULL),(41,87,1,1,0,'187H College Ln W',187,'H',NULL,'College','Ln','W',NULL,NULL,NULL,NULL,'Lisle',1,1012,NULL,'60532',NULL,1228,41.789079,-88.08536,0,NULL,NULL,NULL),(42,192,1,1,0,'342E Woodbridge Ln N',342,'E',NULL,'Woodbridge','Ln','N',NULL,NULL,NULL,NULL,'Genoa',1,1003,NULL,'71840',NULL,1228,33.316578,-93.854484,0,NULL,NULL,NULL),(43,197,1,1,0,'215B Beech Dr N',215,'B',NULL,'Beech','Dr','N',NULL,NULL,NULL,NULL,'East Moline',1,1012,NULL,'61244',NULL,1228,41.518733,-90.41788,0,NULL,NULL,NULL),(44,21,1,1,0,'357I Green Rd W',357,'I',NULL,'Green','Rd','W',NULL,NULL,NULL,NULL,'Nicholls',1,1009,NULL,'31554',NULL,1228,31.495983,-82.62928,0,NULL,NULL,NULL),(45,181,1,1,0,'322H Lincoln Path NE',322,'H',NULL,'Lincoln','Path','NE',NULL,NULL,NULL,NULL,'Altoona',1,1014,NULL,'50009',NULL,1228,41.644716,-93.46641,0,NULL,NULL,NULL),(46,46,1,1,0,'767H Maple Ave N',767,'H',NULL,'Maple','Ave','N',NULL,NULL,NULL,NULL,'Fork',1,1039,NULL,'29543',NULL,1228,34.289399,-79.27039,0,NULL,NULL,NULL),(47,177,1,1,0,'11E Caulder St NE',11,'E',NULL,'Caulder','St','NE',NULL,NULL,NULL,NULL,'Pittsburg',1,1024,NULL,'65724',NULL,1228,37.85245,-93.31817,0,NULL,NULL,NULL),(48,107,1,1,0,'27V Dowlen Dr NW',27,'V',NULL,'Dowlen','Dr','NW',NULL,NULL,NULL,NULL,'Tahlequah',1,1035,NULL,'74465',NULL,1228,35.900074,-95.040008,0,NULL,NULL,NULL),(49,191,1,1,0,'141A Maple Ave N',141,'A',NULL,'Maple','Ave','N',NULL,NULL,NULL,NULL,'Santa Cruz',1,1004,NULL,'95065',NULL,1228,37.010322,-121.98523,0,NULL,NULL,NULL),(50,168,1,1,0,'691U Martin Luther King Dr NE',691,'U',NULL,'Martin Luther King','Dr','NE',NULL,NULL,NULL,NULL,'Bridgeton',1,1029,NULL,'08302',NULL,1228,39.445164,-75.24215,0,NULL,NULL,NULL),(51,88,1,1,0,'742E States Pl S',742,'E',NULL,'States','Pl','S',NULL,NULL,NULL,NULL,'Tampa',1,1008,NULL,'33630',NULL,1228,27.871964,-82.438841,0,NULL,NULL,NULL),(52,129,1,1,0,'402U Martin Luther King Pl NE',402,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'West Lebanon',1,1013,NULL,'47991',NULL,1228,40.277121,-87.413,0,NULL,NULL,NULL),(53,83,1,1,0,'913M Bay St N',913,'M',NULL,'Bay','St','N',NULL,NULL,NULL,NULL,'Milwaukee',1,1048,NULL,'53277',NULL,1228,43.038863,-87.902384,0,NULL,NULL,NULL),(54,52,1,1,0,'214G Lincoln Ln SE',214,'G',NULL,'Lincoln','Ln','SE',NULL,NULL,NULL,NULL,'Harrisburg',1,1037,NULL,'17129',NULL,1228,40.261516,-76.880884,0,NULL,NULL,NULL),(55,160,1,1,0,'173K Pine Way E',173,'K',NULL,'Pine','Way','E',NULL,NULL,NULL,NULL,'Morgantown',1,1013,NULL,'46160',NULL,1228,39.351269,-86.26806,0,NULL,NULL,NULL),(56,170,1,1,0,'562F Caulder Ave SE',562,'F',NULL,'Caulder','Ave','SE',NULL,NULL,NULL,NULL,'Milford',1,1013,NULL,'46542',NULL,1228,41.408621,-85.86531,0,NULL,NULL,NULL),(57,5,1,1,0,'840L Lincoln Dr NE',840,'L',NULL,'Lincoln','Dr','NE',NULL,NULL,NULL,NULL,'Big Springs',1,1047,NULL,'26137',NULL,1228,38.991483,-81.06772,0,NULL,NULL,NULL),(58,51,1,1,0,'354M Jackson Path NE',354,'M',NULL,'Jackson','Path','NE',NULL,NULL,NULL,NULL,'Golden City',1,1024,NULL,'64748',NULL,1228,37.371365,-94.09057,0,NULL,NULL,NULL),(59,139,1,1,0,'722Q El Camino Pl W',722,'Q',NULL,'El Camino','Pl','W',NULL,NULL,NULL,NULL,'Petaluma',1,1004,NULL,'94952',NULL,1228,38.243734,-122.69345,0,NULL,NULL,NULL),(60,199,1,1,0,'968V Caulder Pl S',968,'V',NULL,'Caulder','Pl','S',NULL,NULL,NULL,NULL,'Springdale',1,1003,NULL,'72764',NULL,1228,36.182407,-94.1082,0,NULL,NULL,NULL),(61,8,1,1,0,'825R Van Ness Rd E',825,'R',NULL,'Van Ness','Rd','E',NULL,NULL,NULL,NULL,'Bradyville',1,1041,NULL,'37026',NULL,1228,35.699599,-86.10976,0,NULL,NULL,NULL),(62,72,1,1,0,'603B Cadell Path E',603,'B',NULL,'Cadell','Path','E',NULL,NULL,NULL,NULL,'Wolf Creek',1,1025,NULL,'59648',NULL,1228,47.035168,-112.09073,0,NULL,NULL,NULL),(63,136,1,1,0,'292J College St S',292,'J',NULL,'College','St','S',NULL,NULL,NULL,NULL,'Effingham',1,1039,NULL,'29541',NULL,1228,34.070033,-79.75793,0,NULL,NULL,NULL),(64,74,1,1,0,'492E Lincoln Path E',492,'E',NULL,'Lincoln','Path','E',NULL,NULL,NULL,NULL,'Wells River',1,1044,NULL,'05081',NULL,1228,44.135828,-72.09061,0,NULL,NULL,NULL),(65,69,3,1,0,'474I Northpoint Ave NW',474,'I',NULL,'Northpoint','Ave','NW',NULL,'Receiving',NULL,NULL,'Lewisville',1,1011,NULL,'83431',NULL,1228,43.694827,-112.01477,0,NULL,NULL,NULL),(66,174,2,1,0,'474I Northpoint Ave NW',474,'I',NULL,'Northpoint','Ave','NW',NULL,'Receiving',NULL,NULL,'Lewisville',1,1011,NULL,'83431',NULL,1228,43.694827,-112.01477,0,NULL,NULL,65),(67,122,3,1,0,'495G Green Blvd W',495,'G',NULL,'Green','Blvd','W',NULL,'c/o PO Plus',NULL,NULL,'Hiawatha',1,1043,NULL,'84527',NULL,1228,39.640779,-110.560697,0,NULL,NULL,NULL),(68,148,2,1,0,'495G Green Blvd W',495,'G',NULL,'Green','Blvd','W',NULL,'c/o PO Plus',NULL,NULL,'Hiawatha',1,1043,NULL,'84527',NULL,1228,39.640779,-110.560697,0,NULL,NULL,67),(69,39,3,1,0,'233S Beech Blvd E',233,'S',NULL,'Beech','Blvd','E',NULL,'Payables Dept.',NULL,NULL,'Wardensville',1,1047,NULL,'26851',NULL,1228,39.066543,-78.6218,0,NULL,NULL,NULL),(70,73,3,1,0,'129T Bay Rd N',129,'T',NULL,'Bay','Rd','N',NULL,'c/o OPDC',NULL,NULL,'Glentana',1,1025,NULL,'59240',NULL,1228,48.330241,-106.609665,0,NULL,NULL,NULL),(71,78,3,1,0,'847C Beech Pl SE',847,'C',NULL,'Beech','Pl','SE',NULL,'Receiving',NULL,NULL,'Glen Spey',1,1031,NULL,'12737',NULL,1228,41.48397,-74.81186,0,NULL,NULL,NULL),(72,98,3,1,0,'684Y Woodbridge Blvd NE',684,'Y',NULL,'Woodbridge','Blvd','NE',NULL,'Editorial Dept',NULL,NULL,'Prestonsburg',1,1016,NULL,'41653',NULL,1228,37.667872,-82.75876,0,NULL,NULL,NULL),(73,80,3,1,0,'486X Main Blvd W',486,'X',NULL,'Main','Blvd','W',NULL,'Community Relations',NULL,NULL,'Fairbanks',1,1001,NULL,'99709',NULL,1228,64.854937,-147.87406,0,NULL,NULL,NULL),(74,159,2,0,0,'486X Main Blvd W',486,'X',NULL,'Main','Blvd','W',NULL,'Community Relations',NULL,NULL,'Fairbanks',1,1001,NULL,'99709',NULL,1228,64.854937,-147.87406,0,NULL,NULL,73),(75,196,3,1,0,'610V Dowlen St N',610,'V',NULL,'Dowlen','St','N',NULL,'Payables Dept.',NULL,NULL,'Verdigre',1,1026,NULL,'68783',NULL,1228,42.620877,-98.12001,0,NULL,NULL,NULL),(76,142,3,1,0,'509E Lincoln Ln SE',509,'E',NULL,'Lincoln','Ln','SE',NULL,'Community Relations',NULL,NULL,'Hartland',1,1048,NULL,'53029',NULL,1228,43.132743,-88.34737,0,NULL,NULL,NULL),(77,32,2,1,0,'509E Lincoln Ln SE',509,'E',NULL,'Lincoln','Ln','SE',NULL,'Community Relations',NULL,NULL,'Hartland',1,1048,NULL,'53029',NULL,1228,43.132743,-88.34737,0,NULL,NULL,76),(78,38,3,1,0,'205C Beech Ln SE',205,'C',NULL,'Beech','Ln','SE',NULL,'c/o PO Plus',NULL,NULL,'Adna',1,1046,NULL,'98522',NULL,1228,46.571323,-123.298384,0,NULL,NULL,NULL),(79,45,2,1,0,'205C Beech Ln SE',205,'C',NULL,'Beech','Ln','SE',NULL,'c/o PO Plus',NULL,NULL,'Adna',1,1046,NULL,'98522',NULL,1228,46.571323,-123.298384,0,NULL,NULL,78),(80,189,3,1,0,'284Z Lincoln Blvd SW',284,'Z',NULL,'Lincoln','Blvd','SW',NULL,'Attn: Development',NULL,NULL,'Sage',1,1003,NULL,'72573',NULL,1228,36.058198,-91.80836,0,NULL,NULL,NULL),(81,119,2,1,0,'284Z Lincoln Blvd SW',284,'Z',NULL,'Lincoln','Blvd','SW',NULL,'Attn: Development',NULL,NULL,'Sage',1,1003,NULL,'72573',NULL,1228,36.058198,-91.80836,0,NULL,NULL,80),(82,162,3,1,0,'651C Cadell Pl SW',651,'C',NULL,'Cadell','Pl','SW',NULL,'Urgent',NULL,NULL,'Groton',1,1006,NULL,'06340',NULL,1228,41.345331,-72.04524,0,NULL,NULL,NULL),(83,178,2,1,0,'651C Cadell Pl SW',651,'C',NULL,'Cadell','Pl','SW',NULL,'Urgent',NULL,NULL,'Groton',1,1006,NULL,'06340',NULL,1228,41.345331,-72.04524,0,NULL,NULL,82),(84,100,3,1,0,'364I Second Dr NW',364,'I',NULL,'Second','Dr','NW',NULL,'Mailstop 101',NULL,NULL,'Burke',1,1045,NULL,'22015',NULL,1228,38.788646,-77.27888,0,NULL,NULL,NULL),(85,106,2,0,0,'364I Second Dr NW',364,'I',NULL,'Second','Dr','NW',NULL,'Mailstop 101',NULL,NULL,'Burke',1,1045,NULL,'22015',NULL,1228,38.788646,-77.27888,0,NULL,NULL,84),(86,3,3,1,0,'987Q Green Rd E',987,'Q',NULL,'Green','Rd','E',NULL,'Payables Dept.',NULL,NULL,'Wildie',1,1016,NULL,'40492',NULL,1228,37.345751,-84.31614,0,NULL,NULL,NULL),(87,192,2,0,0,'987Q Green Rd E',987,'Q',NULL,'Green','Rd','E',NULL,'Payables Dept.',NULL,NULL,'Wildie',1,1016,NULL,'40492',NULL,1228,37.345751,-84.31614,0,NULL,NULL,86),(88,179,3,1,0,'368K Main Path SE',368,'K',NULL,'Main','Path','SE',NULL,'Receiving',NULL,NULL,'Eastpoint',1,1008,NULL,'32328',NULL,1228,29.825252,-84.89247,0,NULL,NULL,NULL),(89,154,2,1,0,'368K Main Path SE',368,'K',NULL,'Main','Path','SE',NULL,'Receiving',NULL,NULL,'Eastpoint',1,1008,NULL,'32328',NULL,1228,29.825252,-84.89247,0,NULL,NULL,88),(90,4,3,1,0,'48G Woodbridge Pl N',48,'G',NULL,'Woodbridge','Pl','N',NULL,'Mailstop 101',NULL,NULL,'Minneapolis',1,1022,NULL,'55428',NULL,1228,45.059997,-93.37702,0,NULL,NULL,NULL),(91,118,2,1,0,'48G Woodbridge Pl N',48,'G',NULL,'Woodbridge','Pl','N',NULL,'Mailstop 101',NULL,NULL,'Minneapolis',1,1022,NULL,'55428',NULL,1228,45.059997,-93.37702,0,NULL,NULL,90),(92,152,3,1,0,'23Y Jackson Blvd N',23,'Y',NULL,'Jackson','Blvd','N',NULL,'c/o PO Plus',NULL,NULL,'Newark',1,1029,NULL,'07197',NULL,1228,40.79185,-74.245241,0,NULL,NULL,NULL),(93,110,2,1,0,'23Y Jackson Blvd N',23,'Y',NULL,'Jackson','Blvd','N',NULL,'c/o PO Plus',NULL,NULL,'Newark',1,1029,NULL,'07197',NULL,1228,40.79185,-74.245241,0,NULL,NULL,92),(94,61,3,1,0,'85L Pine Way SW',85,'L',NULL,'Pine','Way','SW',NULL,'Subscriptions Dept',NULL,NULL,'New Haven',1,1021,NULL,'48048',NULL,1228,42.739751,-82.79758,0,NULL,NULL,NULL),(95,13,2,1,0,'85L Pine Way SW',85,'L',NULL,'Pine','Way','SW',NULL,'Subscriptions Dept',NULL,NULL,'New Haven',1,1021,NULL,'48048',NULL,1228,42.739751,-82.79758,0,NULL,NULL,94),(96,91,3,1,0,'163K Pine Ave SW',163,'K',NULL,'Pine','Ave','SW',NULL,'Mailstop 101',NULL,NULL,'Potosi',1,1048,NULL,'53820',NULL,1228,42.695285,-90.69309,0,NULL,NULL,NULL),(97,104,3,1,0,'944E Pine Way SW',944,'E',NULL,'Pine','Way','SW',NULL,'c/o PO Plus',NULL,NULL,'Wessington Springs',1,1040,NULL,'57382',NULL,1228,44.051324,-98.63556,0,NULL,NULL,NULL),(98,113,2,0,0,'944E Pine Way SW',944,'E',NULL,'Pine','Way','SW',NULL,'c/o PO Plus',NULL,NULL,'Wessington Springs',1,1040,NULL,'57382',NULL,1228,44.051324,-98.63556,0,NULL,NULL,97),(99,2,1,1,0,'322H Lincoln Path NE',322,'H',NULL,'Lincoln','Path','NE',NULL,NULL,NULL,NULL,'Altoona',1,1014,NULL,'50009',NULL,1228,41.644716,-93.46641,0,NULL,NULL,45),(100,148,1,0,0,'322H Lincoln Path NE',322,'H',NULL,'Lincoln','Path','NE',NULL,NULL,NULL,NULL,'Altoona',1,1014,NULL,'50009',NULL,1228,41.644716,-93.46641,0,NULL,NULL,45),(101,161,1,1,0,'322H Lincoln Path NE',322,'H',NULL,'Lincoln','Path','NE',NULL,NULL,NULL,NULL,'Altoona',1,1014,NULL,'50009',NULL,1228,41.644716,-93.46641,0,NULL,NULL,45),(102,105,1,1,0,'143K Martin Luther King Pl E',143,'K',NULL,'Martin Luther King','Pl','E',NULL,NULL,NULL,NULL,'Staten Island',1,1031,NULL,'10301',NULL,1228,40.631775,-74.09432,0,NULL,NULL,NULL),(103,145,1,1,0,'767H Maple Ave N',767,'H',NULL,'Maple','Ave','N',NULL,NULL,NULL,NULL,'Fork',1,1039,NULL,'29543',NULL,1228,34.289399,-79.27039,0,NULL,NULL,46),(104,121,1,1,0,'767H Maple Ave N',767,'H',NULL,'Maple','Ave','N',NULL,NULL,NULL,NULL,'Fork',1,1039,NULL,'29543',NULL,1228,34.289399,-79.27039,0,NULL,NULL,46),(105,37,1,1,0,'767H Maple Ave N',767,'H',NULL,'Maple','Ave','N',NULL,NULL,NULL,NULL,'Fork',1,1039,NULL,'29543',NULL,1228,34.289399,-79.27039,0,NULL,NULL,46),(106,132,1,1,0,'767H Maple Ave N',767,'H',NULL,'Maple','Ave','N',NULL,NULL,NULL,NULL,'Fork',1,1039,NULL,'29543',NULL,1228,34.289399,-79.27039,0,NULL,NULL,46),(107,154,1,0,0,'11E Caulder St NE',11,'E',NULL,'Caulder','St','NE',NULL,NULL,NULL,NULL,'Pittsburg',1,1024,NULL,'65724',NULL,1228,37.85245,-93.31817,0,NULL,NULL,47),(108,190,1,1,0,'11E Caulder St NE',11,'E',NULL,'Caulder','St','NE',NULL,NULL,NULL,NULL,'Pittsburg',1,1024,NULL,'65724',NULL,1228,37.85245,-93.31817,0,NULL,NULL,47),(109,77,1,1,0,'11E Caulder St NE',11,'E',NULL,'Caulder','St','NE',NULL,NULL,NULL,NULL,'Pittsburg',1,1024,NULL,'65724',NULL,1228,37.85245,-93.31817,0,NULL,NULL,47),(110,49,1,1,0,'984C Main Ln E',984,'C',NULL,'Main','Ln','E',NULL,NULL,NULL,NULL,'Carlsbad',1,1004,NULL,'92002',NULL,1228,33.198032,-117.234701,0,NULL,NULL,NULL),(111,79,1,1,0,'27V Dowlen Dr NW',27,'V',NULL,'Dowlen','Dr','NW',NULL,NULL,NULL,NULL,'Tahlequah',1,1035,NULL,'74465',NULL,1228,35.900074,-95.040008,0,NULL,NULL,48),(112,29,1,1,0,'27V Dowlen Dr NW',27,'V',NULL,'Dowlen','Dr','NW',NULL,NULL,NULL,NULL,'Tahlequah',1,1035,NULL,'74465',NULL,1228,35.900074,-95.040008,0,NULL,NULL,48),(113,63,1,1,0,'27V Dowlen Dr NW',27,'V',NULL,'Dowlen','Dr','NW',NULL,NULL,NULL,NULL,'Tahlequah',1,1035,NULL,'74465',NULL,1228,35.900074,-95.040008,0,NULL,NULL,48),(114,198,1,1,0,'27V Dowlen Dr NW',27,'V',NULL,'Dowlen','Dr','NW',NULL,NULL,NULL,NULL,'Tahlequah',1,1035,NULL,'74465',NULL,1228,35.900074,-95.040008,0,NULL,NULL,48),(115,92,1,1,0,'141A Maple Ave N',141,'A',NULL,'Maple','Ave','N',NULL,NULL,NULL,NULL,'Santa Cruz',1,1004,NULL,'95065',NULL,1228,37.010322,-121.98523,0,NULL,NULL,49),(116,86,1,1,0,'141A Maple Ave N',141,'A',NULL,'Maple','Ave','N',NULL,NULL,NULL,NULL,'Santa Cruz',1,1004,NULL,'95065',NULL,1228,37.010322,-121.98523,0,NULL,NULL,49),(117,96,1,1,0,'141A Maple Ave N',141,'A',NULL,'Maple','Ave','N',NULL,NULL,NULL,NULL,'Santa Cruz',1,1004,NULL,'95065',NULL,1228,37.010322,-121.98523,0,NULL,NULL,49),(118,127,1,1,0,'227T Lincoln Blvd NW',227,'T',NULL,'Lincoln','Blvd','NW',NULL,NULL,NULL,NULL,'Midvale',1,1011,NULL,'83645',NULL,1228,44.426905,-116.62405,0,NULL,NULL,NULL),(119,150,1,1,0,'691U Martin Luther King Dr NE',691,'U',NULL,'Martin Luther King','Dr','NE',NULL,NULL,NULL,NULL,'Bridgeton',1,1029,NULL,'08302',NULL,1228,39.445164,-75.24215,0,NULL,NULL,50),(120,116,1,1,0,'691U Martin Luther King Dr NE',691,'U',NULL,'Martin Luther King','Dr','NE',NULL,NULL,NULL,NULL,'Bridgeton',1,1029,NULL,'08302',NULL,1228,39.445164,-75.24215,0,NULL,NULL,50),(121,43,1,1,0,'691U Martin Luther King Dr NE',691,'U',NULL,'Martin Luther King','Dr','NE',NULL,NULL,NULL,NULL,'Bridgeton',1,1029,NULL,'08302',NULL,1228,39.445164,-75.24215,0,NULL,NULL,50),(122,201,1,1,0,'691U Martin Luther King Dr NE',691,'U',NULL,'Martin Luther King','Dr','NE',NULL,NULL,NULL,NULL,'Bridgeton',1,1029,NULL,'08302',NULL,1228,39.445164,-75.24215,0,NULL,NULL,50),(123,7,1,1,0,'742E States Pl S',742,'E',NULL,'States','Pl','S',NULL,NULL,NULL,NULL,'Tampa',1,1008,NULL,'33630',NULL,1228,27.871964,-82.438841,0,NULL,NULL,51),(124,155,1,1,0,'742E States Pl S',742,'E',NULL,'States','Pl','S',NULL,NULL,NULL,NULL,'Tampa',1,1008,NULL,'33630',NULL,1228,27.871964,-82.438841,0,NULL,NULL,51),(125,112,1,1,0,'742E States Pl S',742,'E',NULL,'States','Pl','S',NULL,NULL,NULL,NULL,'Tampa',1,1008,NULL,'33630',NULL,1228,27.871964,-82.438841,0,NULL,NULL,51),(126,55,1,1,0,'697V Bay Blvd E',697,'V',NULL,'Bay','Blvd','E',NULL,NULL,NULL,NULL,'Indianapolis',1,1013,NULL,'46253',NULL,1228,39.779492,-86.132837,0,NULL,NULL,NULL),(127,75,1,1,0,'402U Martin Luther King Pl NE',402,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'West Lebanon',1,1013,NULL,'47991',NULL,1228,40.277121,-87.413,0,NULL,NULL,52),(128,65,1,1,0,'402U Martin Luther King Pl NE',402,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'West Lebanon',1,1013,NULL,'47991',NULL,1228,40.277121,-87.413,0,NULL,NULL,52),(129,128,1,1,0,'402U Martin Luther King Pl NE',402,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'West Lebanon',1,1013,NULL,'47991',NULL,1228,40.277121,-87.413,0,NULL,NULL,52),(130,48,1,1,0,'402U Martin Luther King Pl NE',402,'U',NULL,'Martin Luther King','Pl','NE',NULL,NULL,NULL,NULL,'West Lebanon',1,1013,NULL,'47991',NULL,1228,40.277121,-87.413,0,NULL,NULL,52),(131,115,1,1,0,'913M Bay St N',913,'M',NULL,'Bay','St','N',NULL,NULL,NULL,NULL,'Milwaukee',1,1048,NULL,'53277',NULL,1228,43.038863,-87.902384,0,NULL,NULL,53),(132,41,1,1,0,'913M Bay St N',913,'M',NULL,'Bay','St','N',NULL,NULL,NULL,NULL,'Milwaukee',1,1048,NULL,'53277',NULL,1228,43.038863,-87.902384,0,NULL,NULL,53),(133,36,1,1,0,'913M Bay St N',913,'M',NULL,'Bay','St','N',NULL,NULL,NULL,NULL,'Milwaukee',1,1048,NULL,'53277',NULL,1228,43.038863,-87.902384,0,NULL,NULL,53),(134,118,1,0,0,'913M Bay St N',913,'M',NULL,'Bay','St','N',NULL,NULL,NULL,NULL,'Milwaukee',1,1048,NULL,'53277',NULL,1228,43.038863,-87.902384,0,NULL,NULL,53),(135,11,1,1,0,'214G Lincoln Ln SE',214,'G',NULL,'Lincoln','Ln','SE',NULL,NULL,NULL,NULL,'Harrisburg',1,1037,NULL,'17129',NULL,1228,40.261516,-76.880884,0,NULL,NULL,54),(136,68,1,1,0,'214G Lincoln Ln SE',214,'G',NULL,'Lincoln','Ln','SE',NULL,NULL,NULL,NULL,'Harrisburg',1,1037,NULL,'17129',NULL,1228,40.261516,-76.880884,0,NULL,NULL,54),(137,157,1,1,0,'214G Lincoln Ln SE',214,'G',NULL,'Lincoln','Ln','SE',NULL,NULL,NULL,NULL,'Harrisburg',1,1037,NULL,'17129',NULL,1228,40.261516,-76.880884,0,NULL,NULL,54),(138,93,1,1,0,'214G Lincoln Ln SE',214,'G',NULL,'Lincoln','Ln','SE',NULL,NULL,NULL,NULL,'Harrisburg',1,1037,NULL,'17129',NULL,1228,40.261516,-76.880884,0,NULL,NULL,54),(139,114,1,1,0,'173K Pine Way E',173,'K',NULL,'Pine','Way','E',NULL,NULL,NULL,NULL,'Morgantown',1,1013,NULL,'46160',NULL,1228,39.351269,-86.26806,0,NULL,NULL,55),(140,126,1,1,0,'173K Pine Way E',173,'K',NULL,'Pine','Way','E',NULL,NULL,NULL,NULL,'Morgantown',1,1013,NULL,'46160',NULL,1228,39.351269,-86.26806,0,NULL,NULL,55),(141,53,1,1,0,'173K Pine Way E',173,'K',NULL,'Pine','Way','E',NULL,NULL,NULL,NULL,'Morgantown',1,1013,NULL,'46160',NULL,1228,39.351269,-86.26806,0,NULL,NULL,55),(142,167,1,1,0,'173K Pine Way E',173,'K',NULL,'Pine','Way','E',NULL,NULL,NULL,NULL,'Morgantown',1,1013,NULL,'46160',NULL,1228,39.351269,-86.26806,0,NULL,NULL,55),(143,174,1,0,0,'562F Caulder Ave SE',562,'F',NULL,'Caulder','Ave','SE',NULL,NULL,NULL,NULL,'Milford',1,1013,NULL,'46542',NULL,1228,41.408621,-85.86531,0,NULL,NULL,56),(144,110,1,0,0,'562F Caulder Ave SE',562,'F',NULL,'Caulder','Ave','SE',NULL,NULL,NULL,NULL,'Milford',1,1013,NULL,'46542',NULL,1228,41.408621,-85.86531,0,NULL,NULL,56),(145,54,1,1,0,'562F Caulder Ave SE',562,'F',NULL,'Caulder','Ave','SE',NULL,NULL,NULL,NULL,'Milford',1,1013,NULL,'46542',NULL,1228,41.408621,-85.86531,0,NULL,NULL,56),(146,13,1,0,0,'845G El Camino Ln NW',845,'G',NULL,'El Camino','Ln','NW',NULL,NULL,NULL,NULL,'Augusta',1,1009,NULL,'30916',NULL,1228,33.386041,-82.090996,0,NULL,NULL,NULL),(147,42,1,1,0,'840L Lincoln Dr NE',840,'L',NULL,'Lincoln','Dr','NE',NULL,NULL,NULL,NULL,'Big Springs',1,1047,NULL,'26137',NULL,1228,38.991483,-81.06772,0,NULL,NULL,57),(148,186,1,1,0,'840L Lincoln Dr NE',840,'L',NULL,'Lincoln','Dr','NE',NULL,NULL,NULL,NULL,'Big Springs',1,1047,NULL,'26137',NULL,1228,38.991483,-81.06772,0,NULL,NULL,57),(149,103,1,1,0,'840L Lincoln Dr NE',840,'L',NULL,'Lincoln','Dr','NE',NULL,NULL,NULL,NULL,'Big Springs',1,1047,NULL,'26137',NULL,1228,38.991483,-81.06772,0,NULL,NULL,57),(150,119,1,0,0,'840L Lincoln Dr NE',840,'L',NULL,'Lincoln','Dr','NE',NULL,NULL,NULL,NULL,'Big Springs',1,1047,NULL,'26137',NULL,1228,38.991483,-81.06772,0,NULL,NULL,57),(151,15,1,1,0,'354M Jackson Path NE',354,'M',NULL,'Jackson','Path','NE',NULL,NULL,NULL,NULL,'Golden City',1,1024,NULL,'64748',NULL,1228,37.371365,-94.09057,0,NULL,NULL,58),(152,156,1,1,0,'354M Jackson Path NE',354,'M',NULL,'Jackson','Path','NE',NULL,NULL,NULL,NULL,'Golden City',1,1024,NULL,'64748',NULL,1228,37.371365,-94.09057,0,NULL,NULL,58),(153,165,1,1,0,'354M Jackson Path NE',354,'M',NULL,'Jackson','Path','NE',NULL,NULL,NULL,NULL,'Golden City',1,1024,NULL,'64748',NULL,1228,37.371365,-94.09057,0,NULL,NULL,58),(154,172,1,1,0,'354M Jackson Path NE',354,'M',NULL,'Jackson','Path','NE',NULL,NULL,NULL,NULL,'Golden City',1,1024,NULL,'64748',NULL,1228,37.371365,-94.09057,0,NULL,NULL,58),(155,89,1,1,0,'722Q El Camino Pl W',722,'Q',NULL,'El Camino','Pl','W',NULL,NULL,NULL,NULL,'Petaluma',1,1004,NULL,'94952',NULL,1228,38.243734,-122.69345,0,NULL,NULL,59),(156,194,1,1,0,'722Q El Camino Pl W',722,'Q',NULL,'El Camino','Pl','W',NULL,NULL,NULL,NULL,'Petaluma',1,1004,NULL,'94952',NULL,1228,38.243734,-122.69345,0,NULL,NULL,59),(157,149,1,1,0,'722Q El Camino Pl W',722,'Q',NULL,'El Camino','Pl','W',NULL,NULL,NULL,NULL,'Petaluma',1,1004,NULL,'94952',NULL,1228,38.243734,-122.69345,0,NULL,NULL,59),(158,24,1,1,0,'722Q El Camino Pl W',722,'Q',NULL,'El Camino','Pl','W',NULL,NULL,NULL,NULL,'Petaluma',1,1004,NULL,'94952',NULL,1228,38.243734,-122.69345,0,NULL,NULL,59),(159,59,1,1,0,'968V Caulder Pl S',968,'V',NULL,'Caulder','Pl','S',NULL,NULL,NULL,NULL,'Springdale',1,1003,NULL,'72764',NULL,1228,36.182407,-94.1082,0,NULL,NULL,60),(160,10,1,1,0,'968V Caulder Pl S',968,'V',NULL,'Caulder','Pl','S',NULL,NULL,NULL,NULL,'Springdale',1,1003,NULL,'72764',NULL,1228,36.182407,-94.1082,0,NULL,NULL,60),(161,178,1,0,0,'968V Caulder Pl S',968,'V',NULL,'Caulder','Pl','S',NULL,NULL,NULL,NULL,'Springdale',1,1003,NULL,'72764',NULL,1228,36.182407,-94.1082,0,NULL,NULL,60),(162,71,1,1,0,'525Y Beech Path NW',525,'Y',NULL,'Beech','Path','NW',NULL,NULL,NULL,NULL,'Joliet',1,1012,NULL,'60433',NULL,1228,41.511644,-88.05698,0,NULL,NULL,NULL),(163,124,1,1,0,'825R Van Ness Rd E',825,'R',NULL,'Van Ness','Rd','E',NULL,NULL,NULL,NULL,'Bradyville',1,1041,NULL,'37026',NULL,1228,35.699599,-86.10976,0,NULL,NULL,61),(164,82,1,1,0,'825R Van Ness Rd E',825,'R',NULL,'Van Ness','Rd','E',NULL,NULL,NULL,NULL,'Bradyville',1,1041,NULL,'37026',NULL,1228,35.699599,-86.10976,0,NULL,NULL,61),(165,81,1,1,0,'825R Van Ness Rd E',825,'R',NULL,'Van Ness','Rd','E',NULL,NULL,NULL,NULL,'Bradyville',1,1041,NULL,'37026',NULL,1228,35.699599,-86.10976,0,NULL,NULL,61),(166,50,1,1,0,'825R Van Ness Rd E',825,'R',NULL,'Van Ness','Rd','E',NULL,NULL,NULL,NULL,'Bradyville',1,1041,NULL,'37026',NULL,1228,35.699599,-86.10976,0,NULL,NULL,61),(167,123,1,1,0,'603B Cadell Path E',603,'B',NULL,'Cadell','Path','E',NULL,NULL,NULL,NULL,'Wolf Creek',1,1025,NULL,'59648',NULL,1228,47.035168,-112.09073,0,NULL,NULL,62),(168,6,1,1,0,'603B Cadell Path E',603,'B',NULL,'Cadell','Path','E',NULL,NULL,NULL,NULL,'Wolf Creek',1,1025,NULL,'59648',NULL,1228,47.035168,-112.09073,0,NULL,NULL,62),(169,146,1,1,0,'603B Cadell Path E',603,'B',NULL,'Cadell','Path','E',NULL,NULL,NULL,NULL,'Wolf Creek',1,1025,NULL,'59648',NULL,1228,47.035168,-112.09073,0,NULL,NULL,62),(170,144,1,1,0,'603B Cadell Path E',603,'B',NULL,'Cadell','Path','E',NULL,NULL,NULL,NULL,'Wolf Creek',1,1025,NULL,'59648',NULL,1228,47.035168,-112.09073,0,NULL,NULL,62),(171,138,1,1,0,'292J College St S',292,'J',NULL,'College','St','S',NULL,NULL,NULL,NULL,'Effingham',1,1039,NULL,'29541',NULL,1228,34.070033,-79.75793,0,NULL,NULL,63),(172,12,1,1,0,'292J College St S',292,'J',NULL,'College','St','S',NULL,NULL,NULL,NULL,'Effingham',1,1039,NULL,'29541',NULL,1228,34.070033,-79.75793,0,NULL,NULL,63),(173,35,1,1,0,'292J College St S',292,'J',NULL,'College','St','S',NULL,NULL,NULL,NULL,'Effingham',1,1039,NULL,'29541',NULL,1228,34.070033,-79.75793,0,NULL,NULL,63),(174,9,1,1,0,'292J College St S',292,'J',NULL,'College','St','S',NULL,NULL,NULL,NULL,'Effingham',1,1039,NULL,'29541',NULL,1228,34.070033,-79.75793,0,NULL,NULL,63),(175,164,1,1,0,'492E Lincoln Path E',492,'E',NULL,'Lincoln','Path','E',NULL,NULL,NULL,NULL,'Wells River',1,1044,NULL,'05081',NULL,1228,44.135828,-72.09061,0,NULL,NULL,64),(176,62,1,1,0,'492E Lincoln Path E',492,'E',NULL,'Lincoln','Path','E',NULL,NULL,NULL,NULL,'Wells River',1,1044,NULL,'05081',NULL,1228,44.135828,-72.09061,0,NULL,NULL,64),(177,45,1,0,0,'492E Lincoln Path E',492,'E',NULL,'Lincoln','Path','E',NULL,NULL,NULL,NULL,'Wells River',1,1044,NULL,'05081',NULL,1228,44.135828,-72.09061,0,NULL,NULL,64),(178,120,1,1,0,'631Q Cadell Ln SW',631,'Q',NULL,'Cadell','Ln','SW',NULL,NULL,NULL,NULL,'Clarkrange',1,1041,NULL,'38553',NULL,1228,36.209271,-85.00757,0,NULL,NULL,NULL),(179,NULL,1,1,1,'14S El Camino Way E',14,'S',NULL,'El Camino','Way',NULL,NULL,NULL,NULL,NULL,'Collinsville',NULL,1006,NULL,'6022',NULL,1228,41.8328,-72.9253,0,NULL,NULL,NULL),(180,NULL,1,1,1,'11B Woodbridge Path SW',11,'B',NULL,'Woodbridge','Path',NULL,NULL,NULL,NULL,NULL,'Dayton',NULL,1034,NULL,'45417',NULL,1228,39.7531,-84.2471,0,NULL,NULL,NULL),(181,NULL,1,1,1,'581O Lincoln Dr SW',581,'O',NULL,'Lincoln','Dr',NULL,NULL,NULL,NULL,NULL,'Santa Fe',NULL,1030,NULL,'87594',NULL,1228,35.5212,-105.982,0,NULL,NULL,NULL);
 /*!40000 ALTER TABLE `civicrm_address` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -208,7 +208,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_contact` WRITE;
 /*!40000 ALTER TABLE `civicrm_contact` DISABLE KEYS */;
-INSERT INTO `civicrm_contact` (`id`, `contact_type`, `contact_sub_type`, `do_not_email`, `do_not_phone`, `do_not_mail`, `do_not_sms`, `do_not_trade`, `is_opt_out`, `legal_identifier`, `external_identifier`, `sort_name`, `display_name`, `nick_name`, `legal_name`, `image_URL`, `preferred_communication_method`, `preferred_language`, `preferred_mail_format`, `hash`, `api_key`, `source`, `first_name`, `middle_name`, `last_name`, `prefix_id`, `suffix_id`, `formal_title`, `communication_style_id`, `email_greeting_id`, `email_greeting_custom`, `email_greeting_display`, `postal_greeting_id`, `postal_greeting_custom`, `postal_greeting_display`, `addressee_id`, `addressee_custom`, `addressee_display`, `job_title`, `gender_id`, `birth_date`, `is_deceased`, `deceased_date`, `household_name`, `primary_contact_id`, `organization_name`, `sic_code`, `user_unique_id`, `employer_id`, `is_deleted`, `created_date`, `modified_date`) VALUES (1,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Default Organization','Default Organization',NULL,'Default Organization',NULL,NULL,NULL,'Both',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,'Default Organization',NULL,NULL,NULL,0,NULL,'2020-07-24 05:33:57'),(2,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Olsen, Iris','Iris Olsen',NULL,NULL,NULL,'5',NULL,'Both','313880548',NULL,'Sample Data','Iris','L','Olsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Iris',1,NULL,'Dear Iris',1,NULL,'Iris Olsen',NULL,1,'1959-02-03',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(3,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Terrell, Roland','Dr. Roland Terrell Jr.',NULL,NULL,NULL,NULL,NULL,'Both','731518019',NULL,'Sample Data','Roland','I','Terrell',4,1,NULL,NULL,1,NULL,'Dear Roland',1,NULL,'Dear Roland',1,NULL,'Dr. Roland Terrell Jr.',NULL,2,'1936-05-11',1,'2019-07-28',NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(4,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Deforest-Cooper, Teddy','Teddy Deforest-Cooper',NULL,NULL,NULL,'4',NULL,'Both','641137824',NULL,'Sample Data','Teddy','','Deforest-Cooper',NULL,NULL,NULL,NULL,1,NULL,'Dear Teddy',1,NULL,'Dear Teddy',1,NULL,'Teddy Deforest-Cooper',NULL,NULL,'1984-01-05',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(5,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'wilson.troy87@example.net','wilson.troy87@example.net',NULL,NULL,NULL,'2',NULL,'Both','2903429136',NULL,'Sample Data',NULL,NULL,NULL,3,NULL,NULL,NULL,1,NULL,'Dear wilson.troy87@example.net',1,NULL,'Dear wilson.troy87@example.net',1,NULL,'wilson.troy87@example.net',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(6,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Bachman, Beula','Mrs. Beula Bachman',NULL,NULL,NULL,NULL,NULL,'Both','1024437619',NULL,'Sample Data','Beula','P','Bachman',1,NULL,NULL,NULL,1,NULL,'Dear Beula',1,NULL,'Dear Beula',1,NULL,'Mrs. Beula Bachman',NULL,1,'1996-10-29',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(7,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Patel, Erik','Erik Patel Jr.',NULL,NULL,NULL,'1',NULL,'Both','1879150423',NULL,'Sample Data','Erik','','Patel',NULL,1,NULL,NULL,1,NULL,'Dear Erik',1,NULL,'Dear Erik',1,NULL,'Erik Patel Jr.',NULL,2,'1972-03-06',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(8,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Reynolds, Ashley','Ashley Reynolds II',NULL,NULL,NULL,'3',NULL,'Both','3873693132',NULL,'Sample Data','Ashley','','Reynolds',NULL,3,NULL,NULL,1,NULL,'Dear Ashley',1,NULL,'Dear Ashley',1,NULL,'Ashley Reynolds II',NULL,2,'1962-07-08',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(9,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Müller, Tanya','Tanya Müller',NULL,NULL,NULL,'2',NULL,'Both','1478253205',NULL,'Sample Data','Tanya','C','Müller',NULL,NULL,NULL,NULL,1,NULL,'Dear Tanya',1,NULL,'Dear Tanya',1,NULL,'Tanya Müller',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(10,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Müller, Rolando','Rolando Müller II',NULL,NULL,NULL,NULL,NULL,'Both','2804310363',NULL,'Sample Data','Rolando','B','Müller',NULL,3,NULL,NULL,1,NULL,'Dear Rolando',1,NULL,'Dear Rolando',1,NULL,'Rolando Müller II',NULL,NULL,'1959-07-21',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(11,'Household',NULL,0,1,0,0,0,0,NULL,NULL,'Nielsen family','Nielsen family',NULL,NULL,NULL,NULL,NULL,'Both','766698874',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Nielsen family',5,NULL,'Dear Nielsen family',2,NULL,'Nielsen family',NULL,NULL,NULL,0,NULL,'Nielsen family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(12,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'McReynolds, Damaris','Damaris McReynolds',NULL,NULL,NULL,NULL,NULL,'Both','2561970052',NULL,'Sample Data','Damaris','G','McReynolds',NULL,NULL,NULL,NULL,1,NULL,'Dear Damaris',1,NULL,'Dear Damaris',1,NULL,'Damaris McReynolds',NULL,1,'1949-09-14',1,'2020-05-20',NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(13,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'russellr2@airmail.co.nz','russellr2@airmail.co.nz',NULL,NULL,NULL,'1',NULL,'Both','3934547049',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear russellr2@airmail.co.nz',1,NULL,'Dear russellr2@airmail.co.nz',1,NULL,'russellr2@airmail.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(14,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Ballston Lake Technology Fund','Ballston Lake Technology Fund',NULL,NULL,NULL,'5',NULL,'Both','2168563222',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Ballston Lake Technology Fund',NULL,NULL,NULL,0,NULL,NULL,26,'Ballston Lake Technology Fund',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(15,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Adams, Merrie','Mrs. Merrie Adams',NULL,NULL,NULL,'5',NULL,'Both','2760007401',NULL,'Sample Data','Merrie','','Adams',1,NULL,NULL,NULL,1,NULL,'Dear Merrie',1,NULL,'Dear Merrie',1,NULL,'Mrs. Merrie Adams',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(16,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Yadav, Elbert','Elbert Yadav',NULL,NULL,NULL,'1',NULL,'Both','2557263059',NULL,'Sample Data','Elbert','S','Yadav',NULL,NULL,NULL,NULL,1,NULL,'Dear Elbert',1,NULL,'Dear Elbert',1,NULL,'Elbert Yadav',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(17,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Samson, Bernadette','Bernadette Samson',NULL,NULL,NULL,'1',NULL,'Both','1089960007',NULL,'Sample Data','Bernadette','B','Samson',NULL,NULL,NULL,NULL,1,NULL,'Dear Bernadette',1,NULL,'Dear Bernadette',1,NULL,'Bernadette Samson',NULL,1,'1978-06-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:00'),(18,'Individual',NULL,1,1,0,0,0,0,NULL,NULL,'Cruz, Russell','Russell Cruz Sr.',NULL,NULL,NULL,'3',NULL,'Both','3756174623',NULL,'Sample Data','Russell','','Cruz',NULL,2,NULL,NULL,1,NULL,'Dear Russell',1,NULL,'Dear Russell',1,NULL,'Russell Cruz Sr.',NULL,NULL,'1989-05-15',0,NULL,NULL,NULL,'Global Empowerment Alliance',NULL,NULL,144,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(19,'Household',NULL,0,0,0,0,1,0,NULL,NULL,'Terrell-Dimitrov family','Terrell-Dimitrov family',NULL,NULL,NULL,'2',NULL,'Both','4038472664',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Terrell-Dimitrov family',5,NULL,'Dear Terrell-Dimitrov family',2,NULL,'Terrell-Dimitrov family',NULL,NULL,NULL,0,NULL,'Terrell-Dimitrov family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(20,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'iveyr@infomail.co.uk','iveyr@infomail.co.uk',NULL,NULL,NULL,NULL,NULL,'Both','2912254191',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear iveyr@infomail.co.uk',1,NULL,'Dear iveyr@infomail.co.uk',1,NULL,'iveyr@infomail.co.uk',NULL,NULL,NULL,0,NULL,NULL,NULL,'Green Peace Initiative',NULL,NULL,46,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(21,'Household',NULL,0,1,0,0,0,0,NULL,NULL,'Reynolds family','Reynolds family',NULL,NULL,NULL,'4',NULL,'Both','4119726021',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Reynolds family',5,NULL,'Dear Reynolds family',2,NULL,'Reynolds family',NULL,NULL,NULL,0,NULL,'Reynolds family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(22,'Household',NULL,0,0,0,0,1,0,NULL,NULL,'Samuels family','Samuels family',NULL,NULL,NULL,NULL,NULL,'Both','350459294',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Samuels family',5,NULL,'Dear Samuels family',2,NULL,'Samuels family',NULL,NULL,NULL,0,NULL,'Samuels family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(23,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Wattson, Rosario','Dr. Rosario Wattson',NULL,NULL,NULL,NULL,NULL,'Both','661817002',NULL,'Sample Data','Rosario','P','Wattson',4,NULL,NULL,NULL,1,NULL,'Dear Rosario',1,NULL,'Dear Rosario',1,NULL,'Dr. Rosario Wattson',NULL,2,'1943-12-10',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(24,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Terry, Jacob','Jacob Terry Jr.',NULL,NULL,NULL,'2',NULL,'Both','1878863134',NULL,'Sample Data','Jacob','I','Terry',NULL,1,NULL,NULL,1,NULL,'Dear Jacob',1,NULL,'Dear Jacob',1,NULL,'Jacob Terry Jr.',NULL,2,'1939-02-07',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:00'),(25,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Cooper, Irvin','Irvin Cooper',NULL,NULL,NULL,NULL,NULL,'Both','1295806812',NULL,'Sample Data','Irvin','J','Cooper',NULL,NULL,NULL,NULL,1,NULL,'Dear Irvin',1,NULL,'Dear Irvin',1,NULL,'Irvin Cooper',NULL,2,'1989-11-19',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(26,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'et.jameson52@sample.co.in','et.jameson52@sample.co.in',NULL,NULL,NULL,NULL,NULL,'Both','459222156',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear et.jameson52@sample.co.in',1,NULL,'Dear et.jameson52@sample.co.in',1,NULL,'et.jameson52@sample.co.in',NULL,NULL,NULL,0,NULL,NULL,NULL,'Ballston Lake Technology Fund',NULL,NULL,14,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(27,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Prentice family','Prentice family',NULL,NULL,NULL,'1',NULL,'Both','3313623671',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Prentice family',5,NULL,'Dear Prentice family',2,NULL,'Prentice family',NULL,NULL,NULL,0,NULL,'Prentice family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(28,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jameson, Angelika','Angelika Jameson',NULL,NULL,NULL,NULL,NULL,'Both','4294957055',NULL,'Sample Data','Angelika','','Jameson',NULL,NULL,NULL,NULL,1,NULL,'Dear Angelika',1,NULL,'Dear Angelika',1,NULL,'Angelika Jameson',NULL,1,'2002-07-02',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(29,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Dimitrov, Miguel','Dr. Miguel Dimitrov',NULL,NULL,NULL,'4',NULL,'Both','1550560736',NULL,'Sample Data','Miguel','O','Dimitrov',4,NULL,NULL,NULL,1,NULL,'Dear Miguel',1,NULL,'Dear Miguel',1,NULL,'Dr. Miguel Dimitrov',NULL,2,NULL,0,NULL,NULL,NULL,'Collins Peace Fund',NULL,NULL,62,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(30,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'McReynolds, Claudio','Claudio McReynolds II',NULL,NULL,NULL,NULL,NULL,'Both','4155247760',NULL,'Sample Data','Claudio','','McReynolds',NULL,3,NULL,NULL,1,NULL,'Dear Claudio',1,NULL,'Dear Claudio',1,NULL,'Claudio McReynolds II',NULL,2,'1983-02-19',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(31,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Smith, Andrew','Dr. Andrew Smith Sr.',NULL,NULL,NULL,'1',NULL,'Both','2297505615',NULL,'Sample Data','Andrew','Q','Smith',4,2,NULL,NULL,1,NULL,'Dear Andrew',1,NULL,'Dear Andrew',1,NULL,'Dr. Andrew Smith Sr.',NULL,2,'1961-01-04',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(32,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'McReynolds-Parker family','McReynolds-Parker family',NULL,NULL,NULL,'2',NULL,'Both','3292490842',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear McReynolds-Parker family',5,NULL,'Dear McReynolds-Parker family',2,NULL,'McReynolds-Parker family',NULL,NULL,NULL,0,NULL,'McReynolds-Parker family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(33,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Adams, Jina','Mrs. Jina Adams',NULL,NULL,NULL,NULL,NULL,'Both','3136326826',NULL,'Sample Data','Jina','','Adams',1,NULL,NULL,NULL,1,NULL,'Dear Jina',1,NULL,'Dear Jina',1,NULL,'Mrs. Jina Adams',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(34,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'McReynolds, Carlos','Mr. Carlos McReynolds III',NULL,NULL,NULL,'1',NULL,'Both','1986804051',NULL,'Sample Data','Carlos','N','McReynolds',3,4,NULL,NULL,1,NULL,'Dear Carlos',1,NULL,'Dear Carlos',1,NULL,'Mr. Carlos McReynolds III',NULL,NULL,'1956-07-21',0,NULL,NULL,NULL,'Aptos Sustainability Center',NULL,NULL,137,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(35,'Household',NULL,1,0,0,0,1,0,NULL,NULL,'Jones family','Jones family',NULL,NULL,NULL,NULL,NULL,'Both','1110516799',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Jones family',5,NULL,'Dear Jones family',2,NULL,'Jones family',NULL,NULL,NULL,0,NULL,'Jones family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(36,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'meijameson@infomail.org','meijameson@infomail.org',NULL,NULL,NULL,NULL,NULL,'Both','1125318142',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear meijameson@infomail.org',1,NULL,'Dear meijameson@infomail.org',1,NULL,'meijameson@infomail.org',NULL,NULL,NULL,0,NULL,NULL,NULL,'Urban Action School',NULL,NULL,37,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(37,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Urban Action School','Urban Action School',NULL,NULL,NULL,'5',NULL,'Both','3196441086',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Urban Action School',NULL,NULL,NULL,0,NULL,NULL,36,'Urban Action School',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(38,'Household',NULL,1,0,0,0,0,0,NULL,NULL,'Parker-Grant family','Parker-Grant family',NULL,NULL,NULL,NULL,NULL,'Both','1787926850',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Parker-Grant family',5,NULL,'Dear Parker-Grant family',2,NULL,'Parker-Grant family',NULL,NULL,NULL,0,NULL,'Parker-Grant family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(39,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Blackwell, Merrie','Mrs. Merrie Blackwell',NULL,NULL,NULL,'1',NULL,'Both','2696737168',NULL,'Sample Data','Merrie','','Blackwell',1,NULL,NULL,NULL,1,NULL,'Dear Merrie',1,NULL,'Dear Merrie',1,NULL,'Mrs. Merrie Blackwell',NULL,1,'1993-07-08',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(40,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'parker-grant.barry@spamalot.biz','parker-grant.barry@spamalot.biz',NULL,NULL,NULL,NULL,NULL,'Both','2161362069',NULL,'Sample Data',NULL,NULL,NULL,3,NULL,NULL,NULL,1,NULL,'Dear parker-grant.barry@spamalot.biz',1,NULL,'Dear parker-grant.barry@spamalot.biz',1,NULL,'parker-grant.barry@spamalot.biz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(41,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'barkley.brittney@testmail.info','barkley.brittney@testmail.info',NULL,NULL,NULL,NULL,NULL,'Both','1727360930',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear barkley.brittney@testmail.info',1,NULL,'Dear barkley.brittney@testmail.info',1,NULL,'barkley.brittney@testmail.info',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(42,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jameson, Clint','Dr. Clint Jameson',NULL,NULL,NULL,NULL,NULL,'Both','3622436306',NULL,'Sample Data','Clint','F','Jameson',4,NULL,NULL,NULL,1,NULL,'Dear Clint',1,NULL,'Dear Clint',1,NULL,'Dr. Clint Jameson',NULL,2,'1964-11-05',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(43,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Reynolds, Beula','Mrs. Beula Reynolds',NULL,NULL,NULL,NULL,NULL,'Both','2930391993',NULL,'Sample Data','Beula','','Reynolds',1,NULL,NULL,NULL,1,NULL,'Dear Beula',1,NULL,'Dear Beula',1,NULL,'Mrs. Beula Reynolds',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(44,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Cooper, Errol','Dr. Errol Cooper',NULL,NULL,NULL,'1',NULL,'Both','932311595',NULL,'Sample Data','Errol','F','Cooper',4,NULL,NULL,NULL,1,NULL,'Dear Errol',1,NULL,'Dear Errol',1,NULL,'Dr. Errol Cooper',NULL,NULL,'1976-11-20',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(45,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wilson, Teresa','Teresa Wilson',NULL,NULL,NULL,'5',NULL,'Both','4075437794',NULL,'Sample Data','Teresa','B','Wilson',NULL,NULL,NULL,NULL,1,NULL,'Dear Teresa',1,NULL,'Dear Teresa',1,NULL,'Teresa Wilson',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(46,'Organization',NULL,0,0,0,0,1,0,NULL,NULL,'Green Peace Initiative','Green Peace Initiative',NULL,NULL,NULL,'2',NULL,'Both','719241772',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Green Peace Initiative',NULL,NULL,NULL,0,NULL,NULL,20,'Green Peace Initiative',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(47,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Nielsen, Irvin','Irvin Nielsen II',NULL,NULL,NULL,'4',NULL,'Both','587649212',NULL,'Sample Data','Irvin','','Nielsen',NULL,3,NULL,NULL,1,NULL,'Dear Irvin',1,NULL,'Dear Irvin',1,NULL,'Irvin Nielsen II',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(48,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Parker, Betty','Ms. Betty Parker',NULL,NULL,NULL,NULL,NULL,'Both','3536451591',NULL,'Sample Data','Betty','','Parker',2,NULL,NULL,NULL,1,NULL,'Dear Betty',1,NULL,'Dear Betty',1,NULL,'Ms. Betty Parker',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(49,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jones, Felisha','Mrs. Felisha Jones',NULL,NULL,NULL,NULL,NULL,'Both','2947770839',NULL,'Sample Data','Felisha','','Jones',1,NULL,NULL,NULL,1,NULL,'Dear Felisha',1,NULL,'Dear Felisha',1,NULL,'Mrs. Felisha Jones',NULL,NULL,'1996-12-25',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(50,'Organization',NULL,1,0,0,0,0,0,NULL,NULL,'College Health Association','College Health Association',NULL,NULL,NULL,'2',NULL,'Both','545736158',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'College Health Association',NULL,NULL,NULL,0,NULL,NULL,89,'College Health Association',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(51,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Patel, Scarlet','Dr. Scarlet Patel',NULL,NULL,NULL,'3',NULL,'Both','2187618008',NULL,'Sample Data','Scarlet','','Patel',4,NULL,NULL,NULL,1,NULL,'Dear Scarlet',1,NULL,'Dear Scarlet',1,NULL,'Dr. Scarlet Patel',NULL,NULL,'1994-12-26',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(52,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Smith, Brigette','Ms. Brigette Smith',NULL,NULL,NULL,NULL,NULL,'Both','3717206438',NULL,'Sample Data','Brigette','N','Smith',2,NULL,NULL,NULL,1,NULL,'Dear Brigette',1,NULL,'Dear Brigette',1,NULL,'Ms. Brigette Smith',NULL,1,'1971-01-17',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(53,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wattson, Tanya','Dr. Tanya Wattson',NULL,NULL,NULL,'1',NULL,'Both','3050543156',NULL,'Sample Data','Tanya','','Wattson',4,NULL,NULL,NULL,1,NULL,'Dear Tanya',1,NULL,'Dear Tanya',1,NULL,'Dr. Tanya Wattson',NULL,NULL,'1998-02-28',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(54,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Blackwell-Dimitrov, Carylon','Dr. Carylon Blackwell-Dimitrov',NULL,NULL,NULL,'1',NULL,'Both','3691303768',NULL,'Sample Data','Carylon','O','Blackwell-Dimitrov',4,NULL,NULL,NULL,1,NULL,'Dear Carylon',1,NULL,'Dear Carylon',1,NULL,'Dr. Carylon Blackwell-Dimitrov',NULL,1,'1981-08-27',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(55,'Individual',NULL,1,0,0,0,1,0,NULL,NULL,'Lee, Clint','Clint Lee III',NULL,NULL,NULL,NULL,NULL,'Both','1676794419',NULL,'Sample Data','Clint','','Lee',NULL,4,NULL,NULL,1,NULL,'Dear Clint',1,NULL,'Dear Clint',1,NULL,'Clint Lee III',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(56,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Kentucky Software Initiative','Kentucky Software Initiative',NULL,NULL,NULL,'3',NULL,'Both','276138517',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Kentucky Software Initiative',NULL,NULL,NULL,0,NULL,NULL,189,'Kentucky Software Initiative',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(57,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Nielsen, Rolando','Rolando Nielsen II',NULL,NULL,NULL,'2',NULL,'Both','1720954446',NULL,'Sample Data','Rolando','O','Nielsen',NULL,3,NULL,NULL,1,NULL,'Dear Rolando',1,NULL,'Dear Rolando',1,NULL,'Rolando Nielsen II',NULL,NULL,'1954-02-20',0,NULL,NULL,NULL,'Moxahala Development Alliance',NULL,NULL,157,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(58,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Müller, Rebekah','Ms. Rebekah Müller',NULL,NULL,NULL,'2',NULL,'Both','3543648262',NULL,'Sample Data','Rebekah','L','Müller',2,NULL,NULL,NULL,1,NULL,'Dear Rebekah',1,NULL,'Dear Rebekah',1,NULL,'Ms. Rebekah Müller',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(59,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'McReynolds-Parker, Winford','Mr. Winford McReynolds-Parker Jr.',NULL,NULL,NULL,NULL,NULL,'Both','2391669230',NULL,'Sample Data','Winford','','McReynolds-Parker',3,1,NULL,NULL,1,NULL,'Dear Winford',1,NULL,'Dear Winford',1,NULL,'Mr. Winford McReynolds-Parker Jr.',NULL,2,'1985-01-31',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(60,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wilson, Maxwell','Maxwell Wilson III',NULL,NULL,NULL,'3',NULL,'Both','2894206629',NULL,'Sample Data','Maxwell','','Wilson',NULL,4,NULL,NULL,1,NULL,'Dear Maxwell',1,NULL,'Dear Maxwell',1,NULL,'Maxwell Wilson III',NULL,2,'1997-10-19',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(61,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Samuels, Mei','Mei Samuels',NULL,NULL,NULL,'5',NULL,'Both','2521418918',NULL,'Sample Data','Mei','X','Samuels',NULL,NULL,NULL,NULL,1,NULL,'Dear Mei',1,NULL,'Dear Mei',1,NULL,'Mei Samuels',NULL,NULL,'2010-05-06',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(62,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Collins Peace Fund','Collins Peace Fund',NULL,NULL,NULL,NULL,NULL,'Both','3588916649',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Collins Peace Fund',NULL,NULL,NULL,0,NULL,NULL,29,'Collins Peace Fund',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(63,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'estajones@spamalot.co.uk','estajones@spamalot.co.uk',NULL,NULL,NULL,'4',NULL,'Both','377997108',NULL,'Sample Data',NULL,NULL,NULL,1,NULL,NULL,NULL,1,NULL,'Dear estajones@spamalot.co.uk',1,NULL,'Dear estajones@spamalot.co.uk',1,NULL,'estajones@spamalot.co.uk',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(64,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Patel, Kathleen','Kathleen Patel',NULL,NULL,NULL,NULL,NULL,'Both','3805387262',NULL,'Sample Data','Kathleen','Q','Patel',NULL,NULL,NULL,NULL,1,NULL,'Dear Kathleen',1,NULL,'Dear Kathleen',1,NULL,'Kathleen Patel',NULL,NULL,'1990-09-16',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(65,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Parker, Jed','Jed Parker',NULL,NULL,NULL,'4',NULL,'Both','1794622526',NULL,'Sample Data','Jed','','Parker',NULL,NULL,NULL,NULL,1,NULL,'Dear Jed',1,NULL,'Dear Jed',1,NULL,'Jed Parker',NULL,2,'1964-08-28',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(66,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Cooper, Magan','Dr. Magan Cooper',NULL,NULL,NULL,NULL,NULL,'Both','791506082',NULL,'Sample Data','Magan','','Cooper',4,NULL,NULL,NULL,1,NULL,'Dear Magan',1,NULL,'Dear Magan',1,NULL,'Dr. Magan Cooper',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(67,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Łąchowski, Juliann','Dr. Juliann Łąchowski',NULL,NULL,NULL,'1',NULL,'Both','3477087731',NULL,'Sample Data','Juliann','','Łąchowski',4,NULL,NULL,NULL,1,NULL,'Dear Juliann',1,NULL,'Dear Juliann',1,NULL,'Dr. Juliann Łąchowski',NULL,1,'1979-01-06',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(68,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Samson, Delana','Delana Samson',NULL,NULL,NULL,'3',NULL,'Both','1637206028',NULL,'Sample Data','Delana','','Samson',NULL,NULL,NULL,NULL,1,NULL,'Dear Delana',1,NULL,'Dear Delana',1,NULL,'Delana Samson',NULL,NULL,'1971-11-14',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(69,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'González, Allen','Allen González',NULL,NULL,NULL,'4',NULL,'Both','4052635631',NULL,'Sample Data','Allen','R','González',NULL,NULL,NULL,NULL,1,NULL,'Dear Allen',1,NULL,'Dear Allen',1,NULL,'Allen González',NULL,NULL,'2002-12-04',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(70,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'lsamson18@airmail.org','lsamson18@airmail.org',NULL,NULL,NULL,'2',NULL,'Both','320447877',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear lsamson18@airmail.org',1,NULL,'Dear lsamson18@airmail.org',1,NULL,'lsamson18@airmail.org',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(71,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Dimitrov, Megan','Mrs. Megan Dimitrov',NULL,NULL,NULL,'3',NULL,'Both','604448148',NULL,'Sample Data','Megan','B','Dimitrov',1,NULL,NULL,NULL,1,NULL,'Dear Megan',1,NULL,'Dear Megan',1,NULL,'Mrs. Megan Dimitrov',NULL,NULL,'1985-05-06',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(72,'Household',NULL,0,0,0,0,1,0,NULL,NULL,'Prentice-Parker family','Prentice-Parker family',NULL,NULL,NULL,'2',NULL,'Both','569884084',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Prentice-Parker family',5,NULL,'Dear Prentice-Parker family',2,NULL,'Prentice-Parker family',NULL,NULL,NULL,0,NULL,'Prentice-Parker family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(73,'Organization',NULL,0,1,0,0,1,0,NULL,NULL,'Van Ness Technology Services','Van Ness Technology Services',NULL,NULL,NULL,NULL,NULL,'Both','720387242',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Van Ness Technology Services',NULL,NULL,NULL,0,NULL,NULL,75,'Van Ness Technology Services',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(74,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Nielsen, Heidi','Heidi Nielsen',NULL,NULL,NULL,'1',NULL,'Both','4011366793',NULL,'Sample Data','Heidi','','Nielsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Heidi',1,NULL,'Dear Heidi',1,NULL,'Heidi Nielsen',NULL,NULL,'1997-11-22',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(75,'Individual',NULL,1,0,0,0,1,0,NULL,NULL,'Terrell-Dimitrov, Lashawnda','Lashawnda Terrell-Dimitrov',NULL,NULL,NULL,NULL,NULL,'Both','3509495725',NULL,'Sample Data','Lashawnda','E','Terrell-Dimitrov',NULL,NULL,NULL,NULL,1,NULL,'Dear Lashawnda',1,NULL,'Dear Lashawnda',1,NULL,'Lashawnda Terrell-Dimitrov',NULL,1,'1988-05-30',0,NULL,NULL,NULL,'Van Ness Technology Services',NULL,NULL,73,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(76,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Olsen, Shad','Shad Olsen',NULL,NULL,NULL,'1',NULL,'Both','2007691638',NULL,'Sample Data','Shad','H','Olsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Shad',1,NULL,'Dear Shad',1,NULL,'Shad Olsen',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(77,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Jameson, Elbert','Elbert Jameson III',NULL,NULL,NULL,NULL,NULL,'Both','3057069270',NULL,'Sample Data','Elbert','','Jameson',NULL,4,NULL,NULL,1,NULL,'Dear Elbert',1,NULL,'Dear Elbert',1,NULL,'Elbert Jameson III',NULL,2,'1976-09-30',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(78,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'prentice-parker.j.ashley@mymail.co.in','prentice-parker.j.ashley@mymail.co.in',NULL,NULL,NULL,'4',NULL,'Both','730991373',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear prentice-parker.j.ashley@mymail.co.in',1,NULL,'Dear prentice-parker.j.ashley@mymail.co.in',1,NULL,'prentice-parker.j.ashley@mymail.co.in',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(79,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Ogdensburg Poetry Partners','Ogdensburg Poetry Partners',NULL,NULL,NULL,'4',NULL,'Both','3260380550',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Ogdensburg Poetry Partners',NULL,NULL,NULL,0,NULL,NULL,NULL,'Ogdensburg Poetry Partners',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(80,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Reynolds, Betty','Mrs. Betty Reynolds',NULL,NULL,NULL,NULL,NULL,'Both','1042239873',NULL,'Sample Data','Betty','Z','Reynolds',1,NULL,NULL,NULL,1,NULL,'Dear Betty',1,NULL,'Dear Betty',1,NULL,'Mrs. Betty Reynolds',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(81,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Ivanov, Maria','Maria Ivanov',NULL,NULL,NULL,'4',NULL,'Both','3158128082',NULL,'Sample Data','Maria','L','Ivanov',NULL,NULL,NULL,NULL,1,NULL,'Dear Maria',1,NULL,'Dear Maria',1,NULL,'Maria Ivanov',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(82,'Individual',NULL,1,0,0,0,1,0,NULL,NULL,'Wagner, Truman','Truman Wagner',NULL,NULL,NULL,NULL,NULL,'Both','1216392752',NULL,'Sample Data','Truman','','Wagner',NULL,NULL,NULL,NULL,1,NULL,'Dear Truman',1,NULL,'Dear Truman',1,NULL,'Truman Wagner',NULL,2,'1989-08-08',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(83,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Cooper, Norris','Norris Cooper Jr.',NULL,NULL,NULL,'2',NULL,'Both','750501935',NULL,'Sample Data','Norris','U','Cooper',NULL,1,NULL,NULL,1,NULL,'Dear Norris',1,NULL,'Dear Norris',1,NULL,'Norris Cooper Jr.',NULL,2,'2005-06-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(84,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'bachmanl95@mymail.net','bachmanl95@mymail.net',NULL,NULL,NULL,NULL,NULL,'Both','2981810594',NULL,'Sample Data',NULL,NULL,NULL,3,1,NULL,NULL,1,NULL,'Dear bachmanl95@mymail.net',1,NULL,'Dear bachmanl95@mymail.net',1,NULL,'bachmanl95@mymail.net',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(85,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Parker-Grant, Felisha','Felisha Parker-Grant',NULL,NULL,NULL,NULL,NULL,'Both','2163378685',NULL,'Sample Data','Felisha','U','Parker-Grant',NULL,NULL,NULL,NULL,1,NULL,'Dear Felisha',1,NULL,'Dear Felisha',1,NULL,'Felisha Parker-Grant',NULL,1,'2007-01-09',0,NULL,NULL,NULL,'Main Health Collective',NULL,NULL,117,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(86,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Beech Development Trust','Beech Development Trust',NULL,NULL,NULL,'3',NULL,'Both','1453966991',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Beech Development Trust',NULL,NULL,NULL,0,NULL,NULL,197,'Beech Development Trust',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(87,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Wattson, Elina','Dr. Elina Wattson',NULL,NULL,NULL,NULL,NULL,'Both','452291784',NULL,'Sample Data','Elina','','Wattson',4,NULL,NULL,NULL,1,NULL,'Dear Elina',1,NULL,'Dear Elina',1,NULL,'Dr. Elina Wattson',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(88,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Samson, Elizabeth','Elizabeth Samson',NULL,NULL,NULL,'5',NULL,'Both','2428742753',NULL,'Sample Data','Elizabeth','K','Samson',NULL,NULL,NULL,NULL,1,NULL,'Dear Elizabeth',1,NULL,'Dear Elizabeth',1,NULL,'Elizabeth Samson',NULL,NULL,'1981-02-21',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(89,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Terrell-Dimitrov, Miguel','Miguel Terrell-Dimitrov II',NULL,NULL,NULL,'1',NULL,'Both','4265323067',NULL,'Sample Data','Miguel','','Terrell-Dimitrov',NULL,3,NULL,NULL,1,NULL,'Dear Miguel',1,NULL,'Dear Miguel',1,NULL,'Miguel Terrell-Dimitrov II',NULL,2,'2011-03-11',0,NULL,NULL,NULL,'College Health Association',NULL,NULL,50,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(90,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Rebecca Culture Fellowship','Rebecca Culture Fellowship',NULL,NULL,NULL,'5',NULL,'Both','1680760940',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Rebecca Culture Fellowship',NULL,NULL,NULL,0,NULL,NULL,NULL,'Rebecca Culture Fellowship',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(91,'Organization',NULL,0,1,0,0,0,0,NULL,NULL,'Green Poetry Partnership','Green Poetry Partnership',NULL,NULL,NULL,NULL,NULL,'Both','63354461',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Green Poetry Partnership',NULL,NULL,NULL,0,NULL,NULL,120,'Green Poetry Partnership',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(92,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Müller, Allen','Dr. Allen Müller',NULL,NULL,NULL,NULL,NULL,'Both','2000293400',NULL,'Sample Data','Allen','T','Müller',4,NULL,NULL,NULL,1,NULL,'Dear Allen',1,NULL,'Dear Allen',1,NULL,'Dr. Allen Müller',NULL,2,'1958-06-13',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(93,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Cruz, Daren','Daren Cruz III',NULL,NULL,NULL,NULL,NULL,'Both','2509817815',NULL,'Sample Data','Daren','I','Cruz',NULL,4,NULL,NULL,1,NULL,'Dear Daren',1,NULL,'Dear Daren',1,NULL,'Daren Cruz III',NULL,2,'2003-04-16',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(94,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'angelikaw@testmail.co.uk','angelikaw@testmail.co.uk',NULL,NULL,NULL,NULL,NULL,'Both','3179233862',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear angelikaw@testmail.co.uk',1,NULL,'Dear angelikaw@testmail.co.uk',1,NULL,'angelikaw@testmail.co.uk',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(95,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'jones.kathlyn3@mymail.co.uk','jones.kathlyn3@mymail.co.uk',NULL,NULL,NULL,NULL,NULL,'Both','1082573825',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear jones.kathlyn3@mymail.co.uk',1,NULL,'Dear jones.kathlyn3@mymail.co.uk',1,NULL,'jones.kathlyn3@mymail.co.uk',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(96,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Terry, Elbert','Elbert Terry',NULL,NULL,NULL,NULL,NULL,'Both','2300910688',NULL,'Sample Data','Elbert','','Terry',NULL,NULL,NULL,NULL,1,NULL,'Dear Elbert',1,NULL,'Dear Elbert',1,NULL,'Elbert Terry',NULL,2,'2007-11-08',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(97,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Patel, Allen','Allen Patel Sr.',NULL,NULL,NULL,'1',NULL,'Both','1350110979',NULL,'Sample Data','Allen','W','Patel',NULL,2,NULL,NULL,1,NULL,'Dear Allen',1,NULL,'Dear Allen',1,NULL,'Allen Patel Sr.',NULL,NULL,'1988-01-06',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(98,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'González family','González family',NULL,NULL,NULL,'2',NULL,'Both','3263723758',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear González family',5,NULL,'Dear González family',2,NULL,'González family',NULL,NULL,NULL,0,NULL,'González family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(99,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Terry, Esta','Esta Terry',NULL,NULL,NULL,'4',NULL,'Both','3888791883',NULL,'Sample Data','Esta','I','Terry',NULL,NULL,NULL,NULL,1,NULL,'Dear Esta',1,NULL,'Dear Esta',1,NULL,'Esta Terry',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:00'),(100,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Barkley, Lawerence','Lawerence Barkley III',NULL,NULL,NULL,'2',NULL,'Both','3430625301',NULL,'Sample Data','Lawerence','','Barkley',NULL,4,NULL,NULL,1,NULL,'Dear Lawerence',1,NULL,'Dear Lawerence',1,NULL,'Lawerence Barkley III',NULL,2,'2009-06-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(101,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Jameson family','Jameson family',NULL,NULL,NULL,'1',NULL,'Both','2255649769',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Jameson family',5,NULL,'Dear Jameson family',2,NULL,'Jameson family',NULL,NULL,NULL,0,NULL,'Jameson family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(102,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'rbachman-mller15@airmail.co.in','rbachman-mller15@airmail.co.in',NULL,NULL,NULL,'2',NULL,'Both','2698008935',NULL,'Sample Data',NULL,NULL,NULL,2,NULL,NULL,NULL,1,NULL,'Dear rbachman-mller15@airmail.co.in',1,NULL,'Dear rbachman-mller15@airmail.co.in',1,NULL,'rbachman-mller15@airmail.co.in',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(103,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jones, Winford','Mr. Winford Jones',NULL,NULL,NULL,NULL,NULL,'Both','3992988064',NULL,'Sample Data','Winford','Y','Jones',3,NULL,NULL,NULL,1,NULL,'Dear Winford',1,NULL,'Dear Winford',1,NULL,'Mr. Winford Jones',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(104,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Blackwell, Scott','Dr. Scott Blackwell III',NULL,NULL,NULL,NULL,NULL,'Both','1650464224',NULL,'Sample Data','Scott','','Blackwell',4,4,NULL,NULL,1,NULL,'Dear Scott',1,NULL,'Dear Scott',1,NULL,'Dr. Scott Blackwell III',NULL,NULL,'1973-04-27',0,NULL,NULL,NULL,'Dallas Peace Partnership',NULL,NULL,148,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(105,'Organization',NULL,0,0,0,0,1,0,NULL,NULL,'Urban Culture Services','Urban Culture Services',NULL,NULL,NULL,NULL,NULL,'Both','1795621606',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Urban Culture Services',NULL,NULL,NULL,0,NULL,NULL,151,'Urban Culture Services',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(106,'Household',NULL,0,0,0,0,1,0,NULL,NULL,'Jameson family','Jameson family',NULL,NULL,NULL,NULL,NULL,'Both','2255649769',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Jameson family',5,NULL,'Dear Jameson family',2,NULL,'Jameson family',NULL,NULL,NULL,0,NULL,'Jameson family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(107,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Samson, Truman','Truman Samson II',NULL,NULL,NULL,'3',NULL,'Both','2209308970',NULL,'Sample Data','Truman','','Samson',NULL,3,NULL,NULL,1,NULL,'Dear Truman',1,NULL,'Dear Truman',1,NULL,'Truman Samson II',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(108,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Dimitrov, Clint','Mr. Clint Dimitrov III',NULL,NULL,NULL,NULL,NULL,'Both','2522553536',NULL,'Sample Data','Clint','','Dimitrov',3,4,NULL,NULL,1,NULL,'Dear Clint',1,NULL,'Dear Clint',1,NULL,'Mr. Clint Dimitrov III',NULL,NULL,'1965-09-14',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(109,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'González, Carylon','Ms. Carylon González',NULL,NULL,NULL,'2',NULL,'Both','3685317689',NULL,'Sample Data','Carylon','Q','González',2,NULL,NULL,NULL,1,NULL,'Dear Carylon',1,NULL,'Dear Carylon',1,NULL,'Ms. Carylon González',NULL,1,'1988-07-29',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(110,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'McReynolds-Parker, Norris','Norris McReynolds-Parker',NULL,NULL,NULL,'2',NULL,'Both','3076044215',NULL,'Sample Data','Norris','','McReynolds-Parker',NULL,NULL,NULL,NULL,1,NULL,'Dear Norris',1,NULL,'Dear Norris',1,NULL,'Norris McReynolds-Parker',NULL,2,'2006-09-13',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(111,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Robertson, Elizabeth','Elizabeth Robertson',NULL,NULL,NULL,NULL,NULL,'Both','3762031116',NULL,'Sample Data','Elizabeth','','Robertson',NULL,NULL,NULL,NULL,1,NULL,'Dear Elizabeth',1,NULL,'Dear Elizabeth',1,NULL,'Elizabeth Robertson',NULL,NULL,'1988-06-03',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(112,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'samuels.i.nicole4@airmail.info','samuels.i.nicole4@airmail.info',NULL,NULL,NULL,'5',NULL,'Both','120602388',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear samuels.i.nicole4@airmail.info',1,NULL,'Dear samuels.i.nicole4@airmail.info',1,NULL,'samuels.i.nicole4@airmail.info',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(113,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Parker, Teresa','Teresa Parker',NULL,NULL,NULL,'4',NULL,'Both','1643019663',NULL,'Sample Data','Teresa','W','Parker',NULL,NULL,NULL,NULL,1,NULL,'Dear Teresa',1,NULL,'Dear Teresa',1,NULL,'Teresa Parker',NULL,1,'1957-07-05',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(114,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Samson, Lincoln','Lincoln Samson',NULL,NULL,NULL,NULL,NULL,'Both','1364687804',NULL,'Sample Data','Lincoln','G','Samson',NULL,NULL,NULL,NULL,1,NULL,'Dear Lincoln',1,NULL,'Dear Lincoln',1,NULL,'Lincoln Samson',NULL,2,'1985-04-21',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(115,'Household',NULL,1,0,0,0,0,0,NULL,NULL,'Dimitrov family','Dimitrov family',NULL,NULL,NULL,'4',NULL,'Both','3351288571',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Dimitrov family',5,NULL,'Dear Dimitrov family',2,NULL,'Dimitrov family',NULL,NULL,NULL,0,NULL,'Dimitrov family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(116,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Wagner family','Wagner family',NULL,NULL,NULL,NULL,NULL,'Both','1570966486',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Wagner family',5,NULL,'Dear Wagner family',2,NULL,'Wagner family',NULL,NULL,NULL,0,NULL,'Wagner family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(117,'Organization',NULL,1,0,0,0,0,0,NULL,NULL,'Main Health Collective','Main Health Collective',NULL,NULL,NULL,'1',NULL,'Both','842368736',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Main Health Collective',NULL,NULL,NULL,0,NULL,NULL,85,'Main Health Collective',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(118,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Prentice, Maria','Mr. Maria Prentice Sr.',NULL,NULL,NULL,NULL,NULL,'Both','3954129997',NULL,'Sample Data','Maria','P','Prentice',3,2,NULL,NULL,1,NULL,'Dear Maria',1,NULL,'Dear Maria',1,NULL,'Mr. Maria Prentice Sr.',NULL,NULL,'1935-01-16',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(119,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Terrell, Santina','Santina Terrell',NULL,NULL,NULL,NULL,NULL,'Both','2039698555',NULL,'Sample Data','Santina','','Terrell',NULL,NULL,NULL,NULL,1,NULL,'Dear Santina',1,NULL,'Dear Santina',1,NULL,'Santina Terrell',NULL,1,'1967-07-20',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(120,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Patel, Megan','Megan Patel',NULL,NULL,NULL,NULL,NULL,'Both','2159576941',NULL,'Sample Data','Megan','L','Patel',NULL,NULL,NULL,NULL,1,NULL,'Dear Megan',1,NULL,'Dear Megan',1,NULL,'Megan Patel',NULL,1,'2009-05-20',0,NULL,NULL,NULL,'Green Poetry Partnership',NULL,NULL,91,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(121,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Blackwell, Brent','Mr. Brent Blackwell',NULL,NULL,NULL,'2',NULL,'Both','1795154981',NULL,'Sample Data','Brent','V','Blackwell',3,NULL,NULL,NULL,1,NULL,'Dear Brent',1,NULL,'Dear Brent',1,NULL,'Mr. Brent Blackwell',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(122,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Olsen, Rebekah','Rebekah Olsen',NULL,NULL,NULL,'3',NULL,'Both','174179615',NULL,'Sample Data','Rebekah','U','Olsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Rebekah',1,NULL,'Dear Rebekah',1,NULL,'Rebekah Olsen',NULL,1,'1969-05-17',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(123,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Lee, Jed','Dr. Jed Lee',NULL,NULL,NULL,'2',NULL,'Both','301771502',NULL,'Sample Data','Jed','','Lee',4,NULL,NULL,NULL,1,NULL,'Dear Jed',1,NULL,'Dear Jed',1,NULL,'Dr. Jed Lee',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(124,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'allenlee@airmail.biz','allenlee@airmail.biz',NULL,NULL,NULL,NULL,NULL,'Both','4294528252',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear allenlee@airmail.biz',1,NULL,'Dear allenlee@airmail.biz',1,NULL,'allenlee@airmail.biz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:00'),(125,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Nielsen, Ashlie','Ms. Ashlie Nielsen',NULL,NULL,NULL,'3',NULL,'Both','89218160',NULL,'Sample Data','Ashlie','','Nielsen',2,NULL,NULL,NULL,1,NULL,'Dear Ashlie',1,NULL,'Dear Ashlie',1,NULL,'Ms. Ashlie Nielsen',NULL,1,'1975-06-30',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(126,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'shadmller@testing.co.nz','shadmller@testing.co.nz',NULL,NULL,NULL,'2',NULL,'Both','1507946841',NULL,'Sample Data',NULL,NULL,NULL,NULL,3,NULL,NULL,1,NULL,'Dear shadmller@testing.co.nz',1,NULL,'Dear shadmller@testing.co.nz',1,NULL,'shadmller@testing.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(127,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Jacobs, Scott','Dr. Scott Jacobs',NULL,NULL,NULL,NULL,NULL,'Both','2229288735',NULL,'Sample Data','Scott','F','Jacobs',4,NULL,NULL,NULL,1,NULL,'Dear Scott',1,NULL,'Dear Scott',1,NULL,'Dr. Scott Jacobs',NULL,2,'1972-11-24',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(128,'Household',NULL,1,0,0,0,1,0,NULL,NULL,'Müller family','Müller family',NULL,NULL,NULL,'2',NULL,'Both','1144797465',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Müller family',5,NULL,'Dear Müller family',2,NULL,'Müller family',NULL,NULL,NULL,0,NULL,'Müller family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(129,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Prentice, Valene','Dr. Valene Prentice',NULL,NULL,NULL,NULL,NULL,'Both','2953436948',NULL,'Sample Data','Valene','','Prentice',4,NULL,NULL,NULL,1,NULL,'Dear Valene',1,NULL,'Dear Valene',1,NULL,'Dr. Valene Prentice',NULL,1,'1977-03-22',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(130,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'justinamller@mymail.co.in','justinamller@mymail.co.in',NULL,NULL,NULL,NULL,NULL,'Both','1563618154',NULL,'Sample Data',NULL,NULL,NULL,2,NULL,NULL,NULL,1,NULL,'Dear justinamller@mymail.co.in',1,NULL,'Dear justinamller@mymail.co.in',1,NULL,'justinamller@mymail.co.in',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(131,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'dimitrov.bernadette@fakemail.org','dimitrov.bernadette@fakemail.org',NULL,NULL,NULL,'1',NULL,'Both','3271603303',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear dimitrov.bernadette@fakemail.org',1,NULL,'Dear dimitrov.bernadette@fakemail.org',1,NULL,'dimitrov.bernadette@fakemail.org',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(132,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Parker, Shad','Shad Parker',NULL,NULL,NULL,'2',NULL,'Both','23650208',NULL,'Sample Data','Shad','','Parker',NULL,NULL,NULL,NULL,1,NULL,'Dear Shad',1,NULL,'Dear Shad',1,NULL,'Shad Parker',NULL,2,'2004-01-25',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(133,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jameson, Jackson','Jackson Jameson',NULL,NULL,NULL,'4',NULL,'Both','680754950',NULL,'Sample Data','Jackson','F','Jameson',NULL,NULL,NULL,NULL,1,NULL,'Dear Jackson',1,NULL,'Dear Jackson',1,NULL,'Jackson Jameson',NULL,2,'2008-11-01',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(134,'Individual',NULL,1,1,0,0,0,0,NULL,NULL,'Barkley, Kenny','Dr. Kenny Barkley',NULL,NULL,NULL,'4',NULL,'Both','3409558741',NULL,'Sample Data','Kenny','X','Barkley',4,NULL,NULL,NULL,1,NULL,'Dear Kenny',1,NULL,'Dear Kenny',1,NULL,'Dr. Kenny Barkley',NULL,NULL,'1991-08-09',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(135,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Reynolds, Claudio','Mr. Claudio Reynolds Jr.',NULL,NULL,NULL,'5',NULL,'Both','2468699495',NULL,'Sample Data','Claudio','','Reynolds',3,1,NULL,NULL,1,NULL,'Dear Claudio',1,NULL,'Dear Claudio',1,NULL,'Mr. Claudio Reynolds Jr.',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(136,'Household',NULL,0,1,0,0,0,0,NULL,NULL,'Barkley family','Barkley family',NULL,NULL,NULL,'1',NULL,'Both','2888062109',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Barkley family',5,NULL,'Dear Barkley family',2,NULL,'Barkley family',NULL,NULL,NULL,0,NULL,'Barkley family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(137,'Organization',NULL,0,0,0,0,1,0,NULL,NULL,'Aptos Sustainability Center','Aptos Sustainability Center',NULL,NULL,NULL,'4',NULL,'Both','1081050098',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Aptos Sustainability Center',NULL,NULL,NULL,0,NULL,NULL,34,'Aptos Sustainability Center',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(138,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Parker, Heidi','Mrs. Heidi Parker',NULL,NULL,NULL,'3',NULL,'Both','3690123952',NULL,'Sample Data','Heidi','','Parker',1,NULL,NULL,NULL,1,NULL,'Dear Heidi',1,NULL,'Dear Heidi',1,NULL,'Mrs. Heidi Parker',NULL,1,'1978-04-21',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:00'),(139,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Parker, Kathleen','Kathleen Parker',NULL,NULL,NULL,NULL,NULL,'Both','295233156',NULL,'Sample Data','Kathleen','Q','Parker',NULL,NULL,NULL,NULL,1,NULL,'Dear Kathleen',1,NULL,'Dear Kathleen',1,NULL,'Kathleen Parker',NULL,1,'1972-04-04',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(140,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Müller, Ashlie','Ashlie Müller',NULL,NULL,NULL,'2',NULL,'Both','3515081294',NULL,'Sample Data','Ashlie','','Müller',NULL,NULL,NULL,NULL,1,NULL,'Dear Ashlie',1,NULL,'Dear Ashlie',1,NULL,'Ashlie Müller',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(141,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Samuels, Brent','Brent Samuels',NULL,NULL,NULL,NULL,NULL,'Both','3250906077',NULL,'Sample Data','Brent','','Samuels',NULL,NULL,NULL,NULL,1,NULL,'Dear Brent',1,NULL,'Dear Brent',1,NULL,'Brent Samuels',NULL,2,'1959-05-05',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(142,'Organization',NULL,0,1,0,0,0,0,NULL,NULL,'Global Technology Collective','Global Technology Collective',NULL,NULL,NULL,NULL,NULL,'Both','102297836',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Global Technology Collective',NULL,NULL,NULL,0,NULL,NULL,170,'Global Technology Collective',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(143,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wattson, Bernadette','Bernadette Wattson',NULL,NULL,NULL,'1',NULL,'Both','1191372822',NULL,'Sample Data','Bernadette','','Wattson',NULL,NULL,NULL,NULL,1,NULL,'Dear Bernadette',1,NULL,'Dear Bernadette',1,NULL,'Bernadette Wattson',NULL,1,'1973-05-27',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(144,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Global Empowerment Alliance','Global Empowerment Alliance',NULL,NULL,NULL,'3',NULL,'Both','180120760',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Global Empowerment Alliance',NULL,NULL,NULL,0,NULL,NULL,18,'Global Empowerment Alliance',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(145,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Nielsen, Clint','Clint Nielsen',NULL,NULL,NULL,'2',NULL,'Both','2083087169',NULL,'Sample Data','Clint','','Nielsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Clint',1,NULL,'Dear Clint',1,NULL,'Clint Nielsen',NULL,NULL,'1936-05-16',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(146,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Jacobs, Jay','Jay Jacobs',NULL,NULL,NULL,NULL,NULL,'Both','281953359',NULL,'Sample Data','Jay','F','Jacobs',NULL,NULL,NULL,NULL,1,NULL,'Dear Jay',1,NULL,'Dear Jay',1,NULL,'Jay Jacobs',NULL,2,'1937-11-24',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(147,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Prentice, Herminia','Dr. Herminia Prentice',NULL,NULL,NULL,NULL,NULL,'Both','4072784830',NULL,'Sample Data','Herminia','','Prentice',4,NULL,NULL,NULL,1,NULL,'Dear Herminia',1,NULL,'Dear Herminia',1,NULL,'Dr. Herminia Prentice',NULL,1,'1973-07-28',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(148,'Organization',NULL,0,0,0,0,1,0,NULL,NULL,'Dallas Peace Partnership','Dallas Peace Partnership',NULL,NULL,NULL,'3',NULL,'Both','762488419',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Dallas Peace Partnership',NULL,NULL,NULL,0,NULL,NULL,104,'Dallas Peace Partnership',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(149,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Grant, Delana','Delana Grant',NULL,NULL,NULL,'3',NULL,'Both','2844860785',NULL,'Sample Data','Delana','','Grant',NULL,NULL,NULL,NULL,1,NULL,'Dear Delana',1,NULL,'Dear Delana',1,NULL,'Delana Grant',NULL,1,'1981-08-31',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(150,'Household',NULL,0,0,0,0,1,0,NULL,NULL,'Müller family','Müller family',NULL,NULL,NULL,'3',NULL,'Both','1144797465',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Müller family',5,NULL,'Dear Müller family',2,NULL,'Müller family',NULL,NULL,NULL,0,NULL,'Müller family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(151,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Prentice, Billy','Dr. Billy Prentice',NULL,NULL,NULL,'3',NULL,'Both','3571999002',NULL,'Sample Data','Billy','F','Prentice',4,NULL,NULL,NULL,1,NULL,'Dear Billy',1,NULL,'Dear Billy',1,NULL,'Dr. Billy Prentice',NULL,2,'1977-04-09',0,NULL,NULL,NULL,'Urban Culture Services',NULL,NULL,105,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(152,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'samuels.ray@fakemail.co.pl','samuels.ray@fakemail.co.pl',NULL,NULL,NULL,NULL,NULL,'Both','4175065650',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear samuels.ray@fakemail.co.pl',1,NULL,'Dear samuels.ray@fakemail.co.pl',1,NULL,'samuels.ray@fakemail.co.pl',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(153,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Blackwell, Kacey','Kacey Blackwell',NULL,NULL,NULL,'5',NULL,'Both','3163269089',NULL,'Sample Data','Kacey','F','Blackwell',NULL,NULL,NULL,NULL,1,NULL,'Dear Kacey',1,NULL,'Dear Kacey',1,NULL,'Kacey Blackwell',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(154,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Patel, Irvin','Irvin Patel Jr.',NULL,NULL,NULL,'5',NULL,'Both','1842023876',NULL,'Sample Data','Irvin','K','Patel',NULL,1,NULL,NULL,1,NULL,'Dear Irvin',1,NULL,'Dear Irvin',1,NULL,'Irvin Patel Jr.',NULL,2,'1976-10-13',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(155,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'rodrigod11@sample.org','rodrigod11@sample.org',NULL,NULL,NULL,'4',NULL,'Both','1416913895',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear rodrigod11@sample.org',1,NULL,'Dear rodrigod11@sample.org',1,NULL,'rodrigod11@sample.org',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(156,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Samuels, Damaris','Mrs. Damaris Samuels',NULL,NULL,NULL,NULL,NULL,'Both','3144894953',NULL,'Sample Data','Damaris','H','Samuels',1,NULL,NULL,NULL,1,NULL,'Dear Damaris',1,NULL,'Dear Damaris',1,NULL,'Mrs. Damaris Samuels',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(157,'Organization',NULL,1,0,0,0,0,0,NULL,NULL,'Moxahala Development Alliance','Moxahala Development Alliance',NULL,NULL,NULL,NULL,NULL,'Both','1518555478',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Moxahala Development Alliance',NULL,NULL,NULL,0,NULL,NULL,57,'Moxahala Development Alliance',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(158,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Deforest-Cooper, Lashawnda','Lashawnda Deforest-Cooper',NULL,NULL,NULL,'3',NULL,'Both','303860140',NULL,'Sample Data','Lashawnda','N','Deforest-Cooper',NULL,NULL,NULL,NULL,1,NULL,'Dear Lashawnda',1,NULL,'Dear Lashawnda',1,NULL,'Lashawnda Deforest-Cooper',NULL,1,'1996-07-20',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(159,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'mller.billy29@testmail.info','mller.billy29@testmail.info',NULL,NULL,NULL,NULL,NULL,'Both','131366858',NULL,'Sample Data',NULL,NULL,NULL,3,4,NULL,NULL,1,NULL,'Dear mller.billy29@testmail.info',1,NULL,'Dear mller.billy29@testmail.info',1,NULL,'mller.billy29@testmail.info',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(160,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Prentice, Scarlet','Scarlet Prentice',NULL,NULL,NULL,NULL,NULL,'Both','3056236127',NULL,'Sample Data','Scarlet','A','Prentice',NULL,NULL,NULL,NULL,1,NULL,'Dear Scarlet',1,NULL,'Dear Scarlet',1,NULL,'Scarlet Prentice',NULL,NULL,'1977-08-18',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(161,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Jensen, Shauna','Shauna Jensen',NULL,NULL,NULL,NULL,NULL,'Both','108136044',NULL,'Sample Data','Shauna','X','Jensen',NULL,NULL,NULL,NULL,1,NULL,'Dear Shauna',1,NULL,'Dear Shauna',1,NULL,'Shauna Jensen',NULL,1,'1949-03-08',1,'2019-11-19',NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(162,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Blackwell, Bernadette','Bernadette Blackwell',NULL,NULL,NULL,NULL,NULL,'Both','527011185',NULL,'Sample Data','Bernadette','X','Blackwell',NULL,NULL,NULL,NULL,1,NULL,'Dear Bernadette',1,NULL,'Dear Bernadette',1,NULL,'Bernadette Blackwell',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(163,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Deforest-Cooper family','Deforest-Cooper family',NULL,NULL,NULL,'1',NULL,'Both','1424194023',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Deforest-Cooper family',5,NULL,'Dear Deforest-Cooper family',2,NULL,'Deforest-Cooper family',NULL,NULL,NULL,0,NULL,'Deforest-Cooper family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(164,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Samuels, Brittney','Brittney Samuels',NULL,NULL,NULL,NULL,NULL,'Both','3183617598',NULL,'Sample Data','Brittney','A','Samuels',NULL,NULL,NULL,NULL,1,NULL,'Dear Brittney',1,NULL,'Dear Brittney',1,NULL,'Brittney Samuels',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(165,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Wagner, Brigette','Brigette Wagner',NULL,NULL,NULL,'2',NULL,'Both','3285817434',NULL,'Sample Data','Brigette','','Wagner',NULL,NULL,NULL,NULL,1,NULL,'Dear Brigette',1,NULL,'Dear Brigette',1,NULL,'Brigette Wagner',NULL,NULL,'1950-02-18',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(166,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Zope, Jina','Jina Zope',NULL,NULL,NULL,NULL,NULL,'Both','2020833032',NULL,'Sample Data','Jina','K','Zope',NULL,NULL,NULL,NULL,1,NULL,'Dear Jina',1,NULL,'Dear Jina',1,NULL,'Jina Zope',NULL,1,'2009-09-18',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(167,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Smith, Jay','Mr. Jay Smith',NULL,NULL,NULL,'2',NULL,'Both','2744125186',NULL,'Sample Data','Jay','G','Smith',3,NULL,NULL,NULL,1,NULL,'Dear Jay',1,NULL,'Dear Jay',1,NULL,'Mr. Jay Smith',NULL,2,NULL,1,'2020-03-27',NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(168,'Household',NULL,1,0,0,0,0,0,NULL,NULL,'Blackwell family','Blackwell family',NULL,NULL,NULL,NULL,NULL,'Both','3218641510',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Blackwell family',5,NULL,'Dear Blackwell family',2,NULL,'Blackwell family',NULL,NULL,NULL,0,NULL,'Blackwell family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(169,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Deforest, Tanya','Tanya Deforest',NULL,NULL,NULL,'2',NULL,'Both','3707213011',NULL,'Sample Data','Tanya','','Deforest',NULL,NULL,NULL,NULL,1,NULL,'Dear Tanya',1,NULL,'Dear Tanya',1,NULL,'Tanya Deforest',NULL,1,'1981-05-30',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:00'),(170,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Barkley, Bernadette','Bernadette Barkley',NULL,NULL,NULL,NULL,NULL,'Both','2929366721',NULL,'Sample Data','Bernadette','','Barkley',NULL,NULL,NULL,NULL,1,NULL,'Dear Bernadette',1,NULL,'Dear Bernadette',1,NULL,'Bernadette Barkley',NULL,1,NULL,0,NULL,NULL,NULL,'Global Technology Collective',NULL,NULL,142,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(171,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'González, Toby','Mr. Toby González III',NULL,NULL,NULL,'4',NULL,'Both','3133453740',NULL,'Sample Data','Toby','','González',3,4,NULL,NULL,1,NULL,'Dear Toby',1,NULL,'Dear Toby',1,NULL,'Mr. Toby González III',NULL,2,'1972-09-01',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(172,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Cooper, Betty','Betty Cooper',NULL,NULL,NULL,NULL,NULL,'Both','2283344606',NULL,'Sample Data','Betty','I','Cooper',NULL,NULL,NULL,NULL,1,NULL,'Dear Betty',1,NULL,'Dear Betty',1,NULL,'Betty Cooper',NULL,NULL,'1976-03-24',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(173,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'bjameson@spamalot.co.nz','bjameson@spamalot.co.nz',NULL,NULL,NULL,'5',NULL,'Both','1343613532',NULL,'Sample Data',NULL,NULL,NULL,1,NULL,NULL,NULL,1,NULL,'Dear bjameson@spamalot.co.nz',1,NULL,'Dear bjameson@spamalot.co.nz',1,NULL,'bjameson@spamalot.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(174,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Northpoint Development School','Northpoint Development School',NULL,NULL,NULL,'3',NULL,'Both','3168400042',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Northpoint Development School',NULL,NULL,NULL,0,NULL,NULL,185,'Northpoint Development School',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(175,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Dimitrov, Kenny','Kenny Dimitrov Sr.',NULL,NULL,NULL,'3',NULL,'Both','2698867379',NULL,'Sample Data','Kenny','X','Dimitrov',NULL,2,NULL,NULL,1,NULL,'Dear Kenny',1,NULL,'Dear Kenny',1,NULL,'Kenny Dimitrov Sr.',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(176,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Dimitrov, Sherman','Mr. Sherman Dimitrov Sr.',NULL,NULL,NULL,NULL,NULL,'Both','2018073117',NULL,'Sample Data','Sherman','','Dimitrov',3,2,NULL,NULL,1,NULL,'Dear Sherman',1,NULL,'Dear Sherman',1,NULL,'Mr. Sherman Dimitrov Sr.',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(177,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Samson family','Samson family',NULL,NULL,NULL,NULL,NULL,'Both','333421926',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Samson family',5,NULL,'Dear Samson family',2,NULL,'Samson family',NULL,NULL,NULL,0,NULL,'Samson family',NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(178,'Organization',NULL,0,0,0,0,1,0,NULL,NULL,'Sierra Software Solutions','Sierra Software Solutions',NULL,NULL,NULL,NULL,NULL,'Both','4103954497',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Sierra Software Solutions',NULL,NULL,NULL,0,NULL,NULL,186,'Sierra Software Solutions',NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(179,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Samuels, Carylon','Carylon Samuels',NULL,NULL,NULL,'2',NULL,'Both','707612001',NULL,'Sample Data','Carylon','C','Samuels',NULL,NULL,NULL,NULL,1,NULL,'Dear Carylon',1,NULL,'Dear Carylon',1,NULL,'Carylon Samuels',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(180,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Deforest-Cooper, Eleonor','Dr. Eleonor Deforest-Cooper',NULL,NULL,NULL,NULL,NULL,'Both','303402137',NULL,'Sample Data','Eleonor','E','Deforest-Cooper',4,NULL,NULL,NULL,1,NULL,'Dear Eleonor',1,NULL,'Dear Eleonor',1,NULL,'Dr. Eleonor Deforest-Cooper',NULL,NULL,'1970-01-19',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(181,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Prentice-Parker, Maria','Maria Prentice-Parker',NULL,NULL,NULL,NULL,NULL,'Both','265905038',NULL,'Sample Data','Maria','G','Prentice-Parker',NULL,NULL,NULL,NULL,1,NULL,'Dear Maria',1,NULL,'Dear Maria',1,NULL,'Maria Prentice-Parker',NULL,2,'2008-02-25',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(182,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Müller, Juliann','Juliann Müller',NULL,NULL,NULL,NULL,NULL,'Both','307897793',NULL,'Sample Data','Juliann','S','Müller',NULL,NULL,NULL,NULL,1,NULL,'Dear Juliann',1,NULL,'Dear Juliann',1,NULL,'Juliann Müller',NULL,NULL,'1954-04-19',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:00'),(183,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'McReynolds, Sharyn','Mrs. Sharyn McReynolds',NULL,NULL,NULL,'1',NULL,'Both','1394669244',NULL,'Sample Data','Sharyn','','McReynolds',1,NULL,NULL,NULL,1,NULL,'Dear Sharyn',1,NULL,'Dear Sharyn',1,NULL,'Mrs. Sharyn McReynolds',NULL,1,'1983-06-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(184,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Ivanov, Kiara','Kiara Ivanov',NULL,NULL,NULL,NULL,NULL,'Both','1100955182',NULL,'Sample Data','Kiara','M','Ivanov',NULL,NULL,NULL,NULL,1,NULL,'Dear Kiara',1,NULL,'Dear Kiara',1,NULL,'Kiara Ivanov',NULL,1,'1955-10-09',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(185,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'mller.scott40@airmail.info','mller.scott40@airmail.info',NULL,NULL,NULL,'4',NULL,'Both','91445264',NULL,'Sample Data',NULL,NULL,NULL,NULL,2,NULL,NULL,1,NULL,'Dear mller.scott40@airmail.info',1,NULL,'Dear mller.scott40@airmail.info',1,NULL,'mller.scott40@airmail.info',NULL,NULL,NULL,0,NULL,NULL,NULL,'Northpoint Development School',NULL,NULL,174,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(186,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Roberts, Jina','Jina Roberts',NULL,NULL,NULL,'5',NULL,'Both','3944144091',NULL,'Sample Data','Jina','P','Roberts',NULL,NULL,NULL,NULL,1,NULL,'Dear Jina',1,NULL,'Dear Jina',1,NULL,'Jina Roberts',NULL,1,'1986-12-20',0,NULL,NULL,NULL,'Sierra Software Solutions',NULL,NULL,178,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(187,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Prentice, Troy','Troy Prentice',NULL,NULL,NULL,'1',NULL,'Both','2143976390',NULL,'Sample Data','Troy','W','Prentice',NULL,NULL,NULL,NULL,1,NULL,'Dear Troy',1,NULL,'Dear Troy',1,NULL,'Troy Prentice',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(188,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wagner, Felisha','Mrs. Felisha Wagner',NULL,NULL,NULL,NULL,NULL,'Both','2346582969',NULL,'Sample Data','Felisha','T','Wagner',1,NULL,NULL,NULL,1,NULL,'Dear Felisha',1,NULL,'Dear Felisha',1,NULL,'Mrs. Felisha Wagner',NULL,1,'1986-11-16',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(189,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jameson, Margaret','Ms. Margaret Jameson',NULL,NULL,NULL,NULL,NULL,'Both','1719938872',NULL,'Sample Data','Margaret','S','Jameson',2,NULL,NULL,NULL,1,NULL,'Dear Margaret',1,NULL,'Dear Margaret',1,NULL,'Ms. Margaret Jameson',NULL,1,'1970-11-21',0,NULL,NULL,NULL,'Kentucky Software Initiative',NULL,NULL,56,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(190,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Barkley, Carylon','Carylon Barkley',NULL,NULL,NULL,NULL,NULL,'Both','3982709827',NULL,'Sample Data','Carylon','L','Barkley',NULL,NULL,NULL,NULL,1,NULL,'Dear Carylon',1,NULL,'Dear Carylon',1,NULL,'Carylon Barkley',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(191,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Prentice, Toby','Dr. Toby Prentice',NULL,NULL,NULL,'5',NULL,'Both','3734648232',NULL,'Sample Data','Toby','E','Prentice',4,NULL,NULL,NULL,1,NULL,'Dear Toby',1,NULL,'Dear Toby',1,NULL,'Dr. Toby Prentice',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(192,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'lbarkley69@sample.net','lbarkley69@sample.net',NULL,NULL,NULL,'3',NULL,'Both','2275713838',NULL,'Sample Data',NULL,NULL,NULL,NULL,1,NULL,NULL,1,NULL,'Dear lbarkley69@sample.net',1,NULL,'Dear lbarkley69@sample.net',1,NULL,'lbarkley69@sample.net',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(193,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'allanjameson35@infomail.net','allanjameson35@infomail.net',NULL,NULL,NULL,'1',NULL,'Both','2766671914',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear allanjameson35@infomail.net',1,NULL,'Dear allanjameson35@infomail.net',1,NULL,'allanjameson35@infomail.net',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(194,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Terrell, Landon','Landon Terrell',NULL,NULL,NULL,NULL,NULL,'Both','4168752118',NULL,'Sample Data','Landon','H','Terrell',NULL,NULL,NULL,NULL,1,NULL,'Dear Landon',1,NULL,'Dear Landon',1,NULL,'Landon Terrell',NULL,2,'1962-03-21',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(195,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jameson, Kenny','Kenny Jameson Jr.',NULL,NULL,NULL,NULL,NULL,'Both','3782185889',NULL,'Sample Data','Kenny','P','Jameson',NULL,1,NULL,NULL,1,NULL,'Dear Kenny',1,NULL,'Dear Kenny',1,NULL,'Kenny Jameson Jr.',NULL,NULL,'1990-03-18',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(196,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wagner, Kandace','Ms. Kandace Wagner',NULL,NULL,NULL,'2',NULL,'Both','34193694',NULL,'Sample Data','Kandace','Z','Wagner',2,NULL,NULL,NULL,1,NULL,'Dear Kandace',1,NULL,'Dear Kandace',1,NULL,'Ms. Kandace Wagner',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(197,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Yadav, Elina','Ms. Elina Yadav',NULL,NULL,NULL,'2',NULL,'Both','3672729828',NULL,'Sample Data','Elina','','Yadav',2,NULL,NULL,NULL,1,NULL,'Dear Elina',1,NULL,'Dear Elina',1,NULL,'Ms. Elina Yadav',NULL,1,'1995-04-06',0,NULL,NULL,NULL,'Beech Development Trust',NULL,NULL,86,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(198,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'parker.rolando@lol.org','parker.rolando@lol.org',NULL,NULL,NULL,'1',NULL,'Both','4169452322',NULL,'Sample Data',NULL,NULL,NULL,NULL,4,NULL,NULL,1,NULL,'Dear parker.rolando@lol.org',1,NULL,'Dear parker.rolando@lol.org',1,NULL,'parker.rolando@lol.org',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:02'),(199,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wilson, Jed','Dr. Jed Wilson',NULL,NULL,NULL,'2',NULL,'Both','1260634010',NULL,'Sample Data','Jed','','Wilson',4,NULL,NULL,NULL,1,NULL,'Dear Jed',1,NULL,'Dear Jed',1,NULL,'Dr. Jed Wilson',NULL,NULL,'1966-05-27',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:01'),(200,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Blackwell-González, Felisha','Felisha Blackwell-González',NULL,NULL,NULL,'1',NULL,'Both','1633535452',NULL,'Sample Data','Felisha','Y','Blackwell-González',NULL,NULL,NULL,NULL,1,NULL,'Dear Felisha',1,NULL,'Dear Felisha',1,NULL,'Felisha Blackwell-González',NULL,NULL,'1970-05-19',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03'),(201,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Parker-Jones, Iris','Iris Parker-Jones',NULL,NULL,NULL,NULL,NULL,'Both','803629539',NULL,'Sample Data','Iris','','Parker-Jones',NULL,NULL,NULL,NULL,1,NULL,'Dear Iris',1,NULL,'Dear Iris',1,NULL,'Iris Parker-Jones',NULL,NULL,'1965-05-10',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-07-24 05:34:00','2020-07-24 05:34:03');
+INSERT INTO `civicrm_contact` (`id`, `contact_type`, `contact_sub_type`, `do_not_email`, `do_not_phone`, `do_not_mail`, `do_not_sms`, `do_not_trade`, `is_opt_out`, `legal_identifier`, `external_identifier`, `sort_name`, `display_name`, `nick_name`, `legal_name`, `image_URL`, `preferred_communication_method`, `preferred_language`, `preferred_mail_format`, `hash`, `api_key`, `source`, `first_name`, `middle_name`, `last_name`, `prefix_id`, `suffix_id`, `formal_title`, `communication_style_id`, `email_greeting_id`, `email_greeting_custom`, `email_greeting_display`, `postal_greeting_id`, `postal_greeting_custom`, `postal_greeting_display`, `addressee_id`, `addressee_custom`, `addressee_display`, `job_title`, `gender_id`, `birth_date`, `is_deceased`, `deceased_date`, `household_name`, `primary_contact_id`, `organization_name`, `sic_code`, `user_unique_id`, `employer_id`, `is_deleted`, `created_date`, `modified_date`) VALUES (1,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Default Organization','Default Organization',NULL,'Default Organization',NULL,NULL,NULL,'Both',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,'Default Organization',NULL,NULL,NULL,0,NULL,'2020-10-08 01:49:08'),(2,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Blackwell, Felisha','Dr. Felisha Blackwell',NULL,NULL,NULL,'1',NULL,'Both','3871892634',NULL,'Sample Data','Felisha','','Blackwell',4,NULL,NULL,NULL,1,NULL,'Dear Felisha',1,NULL,'Dear Felisha',1,NULL,'Dr. Felisha Blackwell',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(3,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Global Technology Initiative','Global Technology Initiative',NULL,NULL,NULL,NULL,NULL,'Both','395459504',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Global Technology Initiative',NULL,NULL,NULL,0,NULL,NULL,192,'Global Technology Initiative',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(4,'Organization',NULL,0,1,0,0,0,0,NULL,NULL,'Creative Technology School','Creative Technology School',NULL,NULL,NULL,'1',NULL,'Both','2451597640',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Creative Technology School',NULL,NULL,NULL,0,NULL,NULL,118,'Creative Technology School',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(5,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Samuels family','Samuels family',NULL,NULL,NULL,'1',NULL,'Both','350459294',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Samuels family',5,NULL,'Dear Samuels family',2,NULL,'Samuels family',NULL,NULL,NULL,0,NULL,'Samuels family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(6,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wagner, Norris','Dr. Norris Wagner',NULL,NULL,NULL,'2',NULL,'Both','1406133979',NULL,'Sample Data','Norris','','Wagner',4,NULL,NULL,NULL,1,NULL,'Dear Norris',1,NULL,'Dear Norris',1,NULL,'Dr. Norris Wagner',NULL,2,'1980-10-28',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(7,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Adams, Heidi','Dr. Heidi Adams',NULL,NULL,NULL,'3',NULL,'Both','2566619667',NULL,'Sample Data','Heidi','V','Adams',4,NULL,NULL,NULL,1,NULL,'Dear Heidi',1,NULL,'Dear Heidi',1,NULL,'Dr. Heidi Adams',NULL,1,'1986-06-22',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(8,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Adams family','Adams family',NULL,NULL,NULL,'3',NULL,'Both','1515323104',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Adams family',5,NULL,'Dear Adams family',2,NULL,'Adams family',NULL,NULL,NULL,0,NULL,'Adams family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(9,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wattson, Shad','Shad Wattson Jr.',NULL,NULL,NULL,'5',NULL,'Both','2057635546',NULL,'Sample Data','Shad','','Wattson',NULL,1,NULL,NULL,1,NULL,'Dear Shad',1,NULL,'Dear Shad',1,NULL,'Shad Wattson Jr.',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(10,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Müller, Brzęczysław','Brzęczysław Müller III',NULL,NULL,NULL,'4',NULL,'Both','1266385966',NULL,'Sample Data','Brzęczysław','W','Müller',NULL,4,NULL,NULL,1,NULL,'Dear Brzęczysław',1,NULL,'Dear Brzęczysław',1,NULL,'Brzęczysław Müller III',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(11,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Olsen, Kandace','Dr. Kandace Olsen',NULL,NULL,NULL,'3',NULL,'Both','1609191321',NULL,'Sample Data','Kandace','I','Olsen',4,NULL,NULL,NULL,1,NULL,'Dear Kandace',1,NULL,'Dear Kandace',1,NULL,'Dr. Kandace Olsen',NULL,NULL,'1970-06-01',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(12,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Wattson-Barkley, Iris','Iris Wattson-Barkley',NULL,NULL,NULL,'5',NULL,'Both','478411357',NULL,'Sample Data','Iris','X','Wattson-Barkley',NULL,NULL,NULL,NULL,1,NULL,'Dear Iris',1,NULL,'Dear Iris',1,NULL,'Iris Wattson-Barkley',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(13,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Díaz, Roland','Dr. Roland Díaz Jr.',NULL,NULL,NULL,NULL,NULL,'Both','2252303156',NULL,'Sample Data','Roland','','Díaz',4,1,NULL,NULL,1,NULL,'Dear Roland',1,NULL,'Dear Roland',1,NULL,'Dr. Roland Díaz Jr.',NULL,2,'1975-04-29',0,NULL,NULL,NULL,'New Haven Food Fellowship',NULL,NULL,61,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(14,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Lee, Toby','Dr. Toby Lee',NULL,NULL,NULL,'3',NULL,'Both','1467160380',NULL,'Sample Data','Toby','','Lee',4,NULL,NULL,NULL,1,NULL,'Dear Toby',1,NULL,'Dear Toby',1,NULL,'Dr. Toby Lee',NULL,2,'1963-03-03',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(15,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'jones.jina87@fakemail.co.pl','jones.jina87@fakemail.co.pl',NULL,NULL,NULL,'5',NULL,'Both','3808752072',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear jones.jina87@fakemail.co.pl',1,NULL,'Dear jones.jina87@fakemail.co.pl',1,NULL,'jones.jina87@fakemail.co.pl',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(16,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Jacobs, Santina','Santina Jacobs',NULL,NULL,NULL,NULL,NULL,'Both','2675448515',NULL,'Sample Data','Santina','','Jacobs',NULL,NULL,NULL,NULL,1,NULL,'Dear Santina',1,NULL,'Dear Santina',1,NULL,'Santina Jacobs',NULL,1,'1953-06-05',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(17,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Terry, Teddy','Teddy Terry',NULL,NULL,NULL,'2',NULL,'Both','1402049800',NULL,'Sample Data','Teddy','','Terry',NULL,NULL,NULL,NULL,1,NULL,'Dear Teddy',1,NULL,'Dear Teddy',1,NULL,'Teddy Terry',NULL,2,'1936-04-19',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(18,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Wattson, Laree','Mrs. Laree Wattson',NULL,NULL,NULL,'3',NULL,'Both','291866407',NULL,'Sample Data','Laree','','Wattson',1,NULL,NULL,NULL,1,NULL,'Dear Laree',1,NULL,'Dear Laree',1,NULL,'Mrs. Laree Wattson',NULL,1,'1936-06-09',1,'2020-02-15',NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(19,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Zope, Claudio','Claudio Zope',NULL,NULL,NULL,'4',NULL,'Both','3870428103',NULL,'Sample Data','Claudio','R','Zope',NULL,NULL,NULL,NULL,1,NULL,'Dear Claudio',1,NULL,'Dear Claudio',1,NULL,'Claudio Zope',NULL,2,'1955-07-30',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(20,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Patel, Irvin','Dr. Irvin Patel II',NULL,NULL,NULL,'3',NULL,'Both','1842023876',NULL,'Sample Data','Irvin','V','Patel',4,3,NULL,NULL,1,NULL,'Dear Irvin',1,NULL,'Dear Irvin',1,NULL,'Dr. Irvin Patel II',NULL,2,'1940-07-17',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(21,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Grant, Mei','Ms. Mei Grant',NULL,NULL,NULL,'4',NULL,'Both','3865539072',NULL,'Sample Data','Mei','','Grant',2,NULL,NULL,NULL,1,NULL,'Dear Mei',1,NULL,'Dear Mei',1,NULL,'Ms. Mei Grant',NULL,NULL,'1985-10-15',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(22,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Reynolds, Jackson','Mr. Jackson Reynolds',NULL,NULL,NULL,NULL,NULL,'Both','1209096771',NULL,'Sample Data','Jackson','R','Reynolds',3,NULL,NULL,NULL,1,NULL,'Dear Jackson',1,NULL,'Dear Jackson',1,NULL,'Mr. Jackson Reynolds',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(23,'Individual',NULL,1,1,0,0,0,0,NULL,NULL,'Cooper, Santina','Santina Cooper',NULL,NULL,NULL,NULL,NULL,'Both','6221287',NULL,'Sample Data','Santina','T','Cooper',NULL,NULL,NULL,NULL,1,NULL,'Dear Santina',1,NULL,'Dear Santina',1,NULL,'Santina Cooper',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(24,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Robertson, Erik','Erik Robertson',NULL,NULL,NULL,'2',NULL,'Both','2467576767',NULL,'Sample Data','Erik','','Robertson',NULL,NULL,NULL,NULL,1,NULL,'Dear Erik',1,NULL,'Dear Erik',1,NULL,'Erik Robertson',NULL,NULL,'1997-09-01',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(25,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Díaz, Kiara','Ms. Kiara Díaz',NULL,NULL,NULL,NULL,NULL,'Both','1388377581',NULL,'Sample Data','Kiara','C','Díaz',2,NULL,NULL,NULL,1,NULL,'Dear Kiara',1,NULL,'Dear Kiara',1,NULL,'Ms. Kiara Díaz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(26,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Bachman, Truman','Truman Bachman',NULL,NULL,NULL,NULL,NULL,'Both','3082046682',NULL,'Sample Data','Truman','','Bachman',NULL,NULL,NULL,NULL,1,NULL,'Dear Truman',1,NULL,'Dear Truman',1,NULL,'Truman Bachman',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(27,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Cooper, Carlos','Carlos Cooper',NULL,NULL,NULL,'5',NULL,'Both','1878475884',NULL,'Sample Data','Carlos','','Cooper',NULL,NULL,NULL,NULL,1,NULL,'Dear Carlos',1,NULL,'Dear Carlos',1,NULL,'Carlos Cooper',NULL,2,'1980-11-26',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(28,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Olsen, Kacey','Mrs. Kacey Olsen',NULL,NULL,NULL,NULL,NULL,'Both','1976380939',NULL,'Sample Data','Kacey','B','Olsen',1,NULL,NULL,NULL,1,NULL,'Dear Kacey',1,NULL,'Dear Kacey',1,NULL,'Mrs. Kacey Olsen',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(29,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Grant-Nielsen, Allan','Allan Grant-Nielsen Jr.',NULL,NULL,NULL,'2',NULL,'Both','968111698',NULL,'Sample Data','Allan','J','Grant-Nielsen',NULL,1,NULL,NULL,1,NULL,'Dear Allan',1,NULL,'Dear Allan',1,NULL,'Allan Grant-Nielsen Jr.',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(30,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wagner, Billy','Mr. Billy Wagner',NULL,NULL,NULL,'3',NULL,'Both','1288341691',NULL,'Sample Data','Billy','I','Wagner',3,NULL,NULL,NULL,1,NULL,'Dear Billy',1,NULL,'Dear Billy',1,NULL,'Mr. Billy Wagner',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(31,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Müller, Lincoln','Mr. Lincoln Müller II',NULL,NULL,NULL,NULL,NULL,'Both','676015767',NULL,'Sample Data','Lincoln','','Müller',3,3,NULL,NULL,1,NULL,'Dear Lincoln',1,NULL,'Dear Lincoln',1,NULL,'Mr. Lincoln Müller II',NULL,2,'1995-03-31',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(32,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'adamss12@fakemail.biz','adamss12@fakemail.biz',NULL,NULL,NULL,NULL,NULL,'Both','1148769062',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear adamss12@fakemail.biz',1,NULL,'Dear adamss12@fakemail.biz',1,NULL,'adamss12@fakemail.biz',NULL,NULL,NULL,0,NULL,NULL,NULL,'Hartland Empowerment Fund',NULL,NULL,142,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(33,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'González, Damaris','Damaris González',NULL,NULL,NULL,'4',NULL,'Both','1257732273',NULL,'Sample Data','Damaris','W','González',NULL,NULL,NULL,NULL,1,NULL,'Dear Damaris',1,NULL,'Dear Damaris',1,NULL,'Damaris González',NULL,1,'1985-12-06',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(34,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'shadw@sample.co.in','shadw@sample.co.in',NULL,NULL,NULL,NULL,NULL,'Both','1479398341',NULL,'Sample Data',NULL,NULL,NULL,3,3,NULL,NULL,1,NULL,'Dear shadw@sample.co.in',1,NULL,'Dear shadw@sample.co.in',1,NULL,'shadw@sample.co.in',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(35,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Wattson-Barkley, Sanford','Sanford Wattson-Barkley',NULL,NULL,NULL,NULL,NULL,'Both','2257667424',NULL,'Sample Data','Sanford','','Wattson-Barkley',NULL,NULL,NULL,NULL,1,NULL,'Dear Sanford',1,NULL,'Dear Sanford',1,NULL,'Sanford Wattson-Barkley',NULL,2,'1973-02-03',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(36,'Individual',NULL,1,1,0,0,1,0,NULL,NULL,'Müller-Parker, Rosario','Dr. Rosario Müller-Parker Sr.',NULL,NULL,NULL,NULL,NULL,'Both','1340111974',NULL,'Sample Data','Rosario','','Müller-Parker',4,2,NULL,NULL,1,NULL,'Dear Rosario',1,NULL,'Dear Rosario',1,NULL,'Dr. Rosario Müller-Parker Sr.',NULL,2,'1986-11-25',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(37,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Samson, Felisha','Felisha Samson',NULL,NULL,NULL,'2',NULL,'Both','1987564812',NULL,'Sample Data','Felisha','E','Samson',NULL,NULL,NULL,NULL,1,NULL,'Dear Felisha',1,NULL,'Dear Felisha',1,NULL,'Felisha Samson',NULL,NULL,'2000-12-01',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(38,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Washington Sports Services','Washington Sports Services',NULL,NULL,NULL,NULL,NULL,'Both','3529310715',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Washington Sports Services',NULL,NULL,NULL,0,NULL,NULL,45,'Washington Sports Services',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(39,'Organization',NULL,0,0,0,0,1,0,NULL,NULL,'Wardensville Empowerment Services','Wardensville Empowerment Services',NULL,NULL,NULL,'4',NULL,'Both','575156102',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Wardensville Empowerment Services',NULL,NULL,NULL,0,NULL,NULL,42,'Wardensville Empowerment Services',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(40,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Ivanov, Scott','Scott Ivanov',NULL,NULL,NULL,'3',NULL,'Both','1336634478',NULL,'Sample Data','Scott','','Ivanov',NULL,NULL,NULL,NULL,1,NULL,'Dear Scott',1,NULL,'Dear Scott',1,NULL,'Scott Ivanov',NULL,2,'1979-08-02',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(41,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Müller-Parker, Troy','Dr. Troy Müller-Parker',NULL,NULL,NULL,NULL,NULL,'Both','3295573208',NULL,'Sample Data','Troy','','Müller-Parker',4,NULL,NULL,NULL,1,NULL,'Dear Troy',1,NULL,'Dear Troy',1,NULL,'Dr. Troy Müller-Parker',NULL,2,'1987-04-28',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(42,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Cruz-Samuels, Carylon','Carylon Cruz-Samuels',NULL,NULL,NULL,'5',NULL,'Both','2899692986',NULL,'Sample Data','Carylon','','Cruz-Samuels',NULL,NULL,NULL,NULL,1,NULL,'Dear Carylon',1,NULL,'Dear Carylon',1,NULL,'Carylon Cruz-Samuels',NULL,1,NULL,0,NULL,NULL,NULL,'Wardensville Empowerment Services',NULL,NULL,39,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(43,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Parker, Barry','Barry Parker Jr.',NULL,NULL,NULL,NULL,NULL,'Both','259830884',NULL,'Sample Data','Barry','H','Parker',NULL,1,NULL,NULL,1,NULL,'Dear Barry',1,NULL,'Dear Barry',1,NULL,'Barry Parker Jr.',NULL,NULL,'2003-02-20',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(44,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Wagner, Margaret','Mrs. Margaret Wagner',NULL,NULL,NULL,NULL,NULL,'Both','2539132666',NULL,'Sample Data','Margaret','W','Wagner',1,NULL,NULL,NULL,1,NULL,'Dear Margaret',1,NULL,'Dear Margaret',1,NULL,'Mrs. Margaret Wagner',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(45,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jacobs, Erik','Erik Jacobs',NULL,NULL,NULL,'1',NULL,'Both','3805338166',NULL,'Sample Data','Erik','','Jacobs',NULL,NULL,NULL,NULL,1,NULL,'Dear Erik',1,NULL,'Dear Erik',1,NULL,'Erik Jacobs',NULL,NULL,'1977-05-17',0,NULL,NULL,NULL,'Washington Sports Services',NULL,NULL,38,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(46,'Household',NULL,0,1,0,0,1,0,NULL,NULL,'Samson family','Samson family',NULL,NULL,NULL,'5',NULL,'Both','333421926',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Samson family',5,NULL,'Dear Samson family',2,NULL,'Samson family',NULL,NULL,NULL,0,NULL,'Samson family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(47,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'tanyar@lol.co.nz','tanyar@lol.co.nz',NULL,NULL,NULL,NULL,NULL,'Both','3951794089',NULL,'Sample Data',NULL,NULL,NULL,2,NULL,NULL,NULL,1,NULL,'Dear tanyar@lol.co.nz',1,NULL,'Dear tanyar@lol.co.nz',1,NULL,'tanyar@lol.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(48,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Yadav, Craig','Craig Yadav',NULL,NULL,NULL,NULL,NULL,'Both','1298063266',NULL,'Sample Data','Craig','G','Yadav',NULL,NULL,NULL,NULL,1,NULL,'Dear Craig',1,NULL,'Dear Craig',1,NULL,'Craig Yadav',NULL,2,'1968-05-14',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(49,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Olsen, Sanford','Dr. Sanford Olsen',NULL,NULL,NULL,'1',NULL,'Both','2408737591',NULL,'Sample Data','Sanford','','Olsen',4,NULL,NULL,NULL,1,NULL,'Dear Sanford',1,NULL,'Dear Sanford',1,NULL,'Dr. Sanford Olsen',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(50,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'radams57@spamalot.co.nz','radams57@spamalot.co.nz',NULL,NULL,NULL,NULL,NULL,'Both','3958482289',NULL,'Sample Data',NULL,NULL,NULL,4,4,NULL,NULL,1,NULL,'Dear radams57@spamalot.co.nz',1,NULL,'Dear radams57@spamalot.co.nz',1,NULL,'radams57@spamalot.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(51,'Household',NULL,1,1,0,0,0,0,NULL,NULL,'Jones family','Jones family',NULL,NULL,NULL,NULL,NULL,'Both','1110516799',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Jones family',5,NULL,'Dear Jones family',2,NULL,'Jones family',NULL,NULL,NULL,0,NULL,'Jones family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(52,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Terrell-Olsen family','Terrell-Olsen family',NULL,NULL,NULL,'2',NULL,'Both','2799081956',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Terrell-Olsen family',5,NULL,'Dear Terrell-Olsen family',2,NULL,'Terrell-Olsen family',NULL,NULL,NULL,0,NULL,'Terrell-Olsen family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(53,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Nielsen-Łąchowski, Tanya','Tanya Nielsen-Łąchowski',NULL,NULL,NULL,NULL,NULL,'Both','1541712436',NULL,'Sample Data','Tanya','','Nielsen-Łąchowski',NULL,NULL,NULL,NULL,1,NULL,'Dear Tanya',1,NULL,'Dear Tanya',1,NULL,'Tanya Nielsen-Łąchowski',NULL,NULL,'2014-05-14',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(54,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'dazk@notmail.info','dazk@notmail.info',NULL,NULL,NULL,'5',NULL,'Both','4172585050',NULL,'Sample Data',NULL,NULL,NULL,1,NULL,NULL,NULL,1,NULL,'Dear dazk@notmail.info',1,NULL,'Dear dazk@notmail.info',1,NULL,'dazk@notmail.info',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(55,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Parker, Scott','Dr. Scott Parker',NULL,NULL,NULL,'5',NULL,'Both','3303025093',NULL,'Sample Data','Scott','Y','Parker',4,NULL,NULL,NULL,1,NULL,'Dear Scott',1,NULL,'Dear Scott',1,NULL,'Dr. Scott Parker',NULL,2,'1973-11-28',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(56,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Wilson, Ashley','Ashley Wilson',NULL,NULL,NULL,NULL,NULL,'Both','1909485085',NULL,'Sample Data','Ashley','','Wilson',NULL,NULL,NULL,NULL,1,NULL,'Dear Ashley',1,NULL,'Dear Ashley',1,NULL,'Ashley Wilson',NULL,2,'1941-11-10',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(57,'Individual',NULL,1,1,0,0,0,0,NULL,NULL,'Olsen, Elbert','Elbert Olsen Sr.',NULL,NULL,NULL,NULL,NULL,'Both','2334086497',NULL,'Sample Data','Elbert','','Olsen',NULL,2,NULL,NULL,1,NULL,'Dear Elbert',1,NULL,'Dear Elbert',1,NULL,'Elbert Olsen Sr.',NULL,2,'1956-09-20',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(58,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Robertson, Russell','Russell Robertson III',NULL,NULL,NULL,NULL,NULL,'Both','3573168465',NULL,'Sample Data','Russell','W','Robertson',NULL,4,NULL,NULL,1,NULL,'Dear Russell',1,NULL,'Dear Russell',1,NULL,'Russell Robertson III',NULL,2,'1959-08-02',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(59,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Olsen-Müller, Kacey','Dr. Kacey Olsen-Müller',NULL,NULL,NULL,'2',NULL,'Both','2458808750',NULL,'Sample Data','Kacey','','Olsen-Müller',4,NULL,NULL,NULL,1,NULL,'Dear Kacey',1,NULL,'Dear Kacey',1,NULL,'Dr. Kacey Olsen-Müller',NULL,1,'1980-08-07',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(60,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Jacobs, Andrew','Mr. Andrew Jacobs III',NULL,NULL,NULL,NULL,NULL,'Both','2805225818',NULL,'Sample Data','Andrew','','Jacobs',3,4,NULL,NULL,1,NULL,'Dear Andrew',1,NULL,'Dear Andrew',1,NULL,'Mr. Andrew Jacobs III',NULL,NULL,'1974-01-13',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(61,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'New Haven Food Fellowship','New Haven Food Fellowship',NULL,NULL,NULL,NULL,NULL,'Both','350782056',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'New Haven Food Fellowship',NULL,NULL,NULL,0,NULL,NULL,13,'New Haven Food Fellowship',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(62,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jacobs, Miguel','Miguel Jacobs',NULL,NULL,NULL,NULL,NULL,'Both','4282987958',NULL,'Sample Data','Miguel','','Jacobs',NULL,NULL,NULL,NULL,1,NULL,'Dear Miguel',1,NULL,'Dear Miguel',1,NULL,'Miguel Jacobs',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(63,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Grant-Nielsen, Mei','Mei Grant-Nielsen',NULL,NULL,NULL,NULL,NULL,'Both','4120732370',NULL,'Sample Data','Mei','W','Grant-Nielsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Mei',1,NULL,'Dear Mei',1,NULL,'Mei Grant-Nielsen',NULL,1,'2016-06-25',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(64,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Ivanov, Elizabeth','Ms. Elizabeth Ivanov',NULL,NULL,NULL,NULL,NULL,'Both','818500223',NULL,'Sample Data','Elizabeth','','Ivanov',2,NULL,NULL,NULL,1,NULL,'Dear Elizabeth',1,NULL,'Dear Elizabeth',1,NULL,'Ms. Elizabeth Ivanov',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(65,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Yadav, Ashlie','Ashlie Yadav',NULL,NULL,NULL,'4',NULL,'Both','1118293525',NULL,'Sample Data','Ashlie','S','Yadav',NULL,NULL,NULL,NULL,1,NULL,'Dear Ashlie',1,NULL,'Dear Ashlie',1,NULL,'Ashlie Yadav',NULL,1,'2012-03-30',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(66,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Prentice, Barry','Barry Prentice',NULL,NULL,NULL,NULL,NULL,'Both','3550869584',NULL,'Sample Data','Barry','','Prentice',NULL,NULL,NULL,NULL,1,NULL,'Dear Barry',1,NULL,'Dear Barry',1,NULL,'Barry Prentice',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(67,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Dimitrov, Toby','Toby Dimitrov Jr.',NULL,NULL,NULL,NULL,NULL,'Both','4067537771',NULL,'Sample Data','Toby','','Dimitrov',NULL,1,NULL,NULL,1,NULL,'Dear Toby',1,NULL,'Dear Toby',1,NULL,'Toby Dimitrov Jr.',NULL,2,'1942-11-13',1,'2020-02-07',NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(68,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Terrell-Olsen, Toby','Toby Terrell-Olsen Jr.',NULL,NULL,NULL,NULL,NULL,'Both','2408415157',NULL,'Sample Data','Toby','','Terrell-Olsen',NULL,1,NULL,NULL,1,NULL,'Dear Toby',1,NULL,'Dear Toby',1,NULL,'Toby Terrell-Olsen Jr.',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(69,'Organization',NULL,1,1,0,0,0,0,NULL,NULL,'Idaho Advocacy Academy','Idaho Advocacy Academy',NULL,NULL,NULL,NULL,NULL,'Both','1129556388',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Idaho Advocacy Academy',NULL,NULL,NULL,0,NULL,NULL,174,'Idaho Advocacy Academy',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(70,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Cruz, Lashawnda','Ms. Lashawnda Cruz',NULL,NULL,NULL,NULL,NULL,'Both','2604537313',NULL,'Sample Data','Lashawnda','Q','Cruz',2,NULL,NULL,NULL,1,NULL,'Dear Lashawnda',1,NULL,'Dear Lashawnda',1,NULL,'Ms. Lashawnda Cruz',NULL,1,'1949-12-18',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(71,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Müller, Russell','Russell Müller',NULL,NULL,NULL,NULL,NULL,'Both','1078913970',NULL,'Sample Data','Russell','','Müller',NULL,NULL,NULL,NULL,1,NULL,'Dear Russell',1,NULL,'Dear Russell',1,NULL,'Russell Müller',NULL,NULL,'1954-11-19',0,NULL,NULL,NULL,'Urban Environmental Fund',NULL,NULL,196,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(72,'Household',NULL,0,1,0,0,0,0,NULL,NULL,'Wagner family','Wagner family',NULL,NULL,NULL,NULL,NULL,'Both','1570966486',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Wagner family',5,NULL,'Dear Wagner family',2,NULL,'Wagner family',NULL,NULL,NULL,0,NULL,'Wagner family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(73,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Montana Environmental School','Montana Environmental School',NULL,NULL,NULL,NULL,NULL,'Both','1677788641',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Montana Environmental School',NULL,NULL,NULL,0,NULL,NULL,NULL,'Montana Environmental School',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(74,'Household',NULL,0,1,0,0,0,0,NULL,NULL,'Jacobs family','Jacobs family',NULL,NULL,NULL,NULL,NULL,'Both','1498986649',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Jacobs family',5,NULL,'Dear Jacobs family',2,NULL,'Jacobs family',NULL,NULL,NULL,0,NULL,'Jacobs family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(75,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Yadav, Kathlyn','Kathlyn Yadav',NULL,NULL,NULL,NULL,NULL,'Both','892825163',NULL,'Sample Data','Kathlyn','','Yadav',NULL,NULL,NULL,NULL,1,NULL,'Dear Kathlyn',1,NULL,'Dear Kathlyn',1,NULL,'Kathlyn Yadav',NULL,NULL,'1965-01-01',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(76,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Reynolds, Troy','Troy Reynolds III',NULL,NULL,NULL,NULL,NULL,'Both','3318751273',NULL,'Sample Data','Troy','E','Reynolds',NULL,4,NULL,NULL,1,NULL,'Dear Troy',1,NULL,'Dear Troy',1,NULL,'Troy Reynolds III',NULL,2,'1989-01-30',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(77,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Olsen, Brigette','Brigette Olsen',NULL,NULL,NULL,'2',NULL,'Both','2958585175',NULL,'Sample Data','Brigette','','Olsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Brigette',1,NULL,'Dear Brigette',1,NULL,'Brigette Olsen',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(78,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Beech Poetry Association','Beech Poetry Association',NULL,NULL,NULL,NULL,NULL,'Both','2511092918',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Beech Poetry Association',NULL,NULL,NULL,0,NULL,NULL,172,'Beech Poetry Association',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(79,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Nielsen, Shauna','Shauna Nielsen',NULL,NULL,NULL,NULL,NULL,'Both','2058149080',NULL,'Sample Data','Shauna','O','Nielsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Shauna',1,NULL,'Dear Shauna',1,NULL,'Shauna Nielsen',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(80,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Alaska Poetry Systems','Alaska Poetry Systems',NULL,NULL,NULL,NULL,NULL,'Both','70940274',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Alaska Poetry Systems',NULL,NULL,NULL,0,NULL,NULL,159,'Alaska Poetry Systems',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(81,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'kathlynadams@airmail.co.in','kathlynadams@airmail.co.in',NULL,NULL,NULL,NULL,NULL,'Both','1709654457',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear kathlynadams@airmail.co.in',1,NULL,'Dear kathlynadams@airmail.co.in',1,NULL,'kathlynadams@airmail.co.in',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(82,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Adams, Sanford','Sanford Adams Sr.',NULL,NULL,NULL,NULL,NULL,'Both','2528802212',NULL,'Sample Data','Sanford','','Adams',NULL,2,NULL,NULL,1,NULL,'Dear Sanford',1,NULL,'Dear Sanford',1,NULL,'Sanford Adams Sr.',NULL,2,'1981-03-12',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(83,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Müller-Parker family','Müller-Parker family',NULL,NULL,NULL,NULL,NULL,'Both','1060469531',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Müller-Parker family',5,NULL,'Dear Müller-Parker family',2,NULL,'Müller-Parker family',NULL,NULL,NULL,0,NULL,'Müller-Parker family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(84,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Smith, Justina','Justina Smith',NULL,NULL,NULL,NULL,NULL,'Both','16511477',NULL,'Sample Data','Justina','','Smith',NULL,NULL,NULL,NULL,1,NULL,'Dear Justina',1,NULL,'Dear Justina',1,NULL,'Justina Smith',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(85,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Smith, Rosario','Rosario Smith',NULL,NULL,NULL,NULL,NULL,'Both','701125213',NULL,'Sample Data','Rosario','H','Smith',NULL,NULL,NULL,NULL,1,NULL,'Dear Rosario',1,NULL,'Dear Rosario',1,NULL,'Rosario Smith',NULL,2,'1964-01-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(86,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Blackwell-Jameson, Kacey','Kacey Blackwell-Jameson',NULL,NULL,NULL,'4',NULL,'Both','1650116109',NULL,'Sample Data','Kacey','','Blackwell-Jameson',NULL,NULL,NULL,NULL,1,NULL,'Dear Kacey',1,NULL,'Dear Kacey',1,NULL,'Kacey Blackwell-Jameson',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(87,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Yadav, Magan','Dr. Magan Yadav',NULL,NULL,NULL,'4',NULL,'Both','88790956',NULL,'Sample Data','Magan','V','Yadav',4,NULL,NULL,NULL,1,NULL,'Dear Magan',1,NULL,'Dear Magan',1,NULL,'Dr. Magan Yadav',NULL,1,'1961-11-03',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(88,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Parker-Adams family','Parker-Adams family',NULL,NULL,NULL,NULL,NULL,'Both','4037478390',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Parker-Adams family',5,NULL,'Dear Parker-Adams family',2,NULL,'Parker-Adams family',NULL,NULL,NULL,0,NULL,'Parker-Adams family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(89,'Individual',NULL,1,0,0,0,1,0,NULL,NULL,'Cruz, Santina','Santina Cruz',NULL,NULL,NULL,NULL,NULL,'Both','2716363511',NULL,'Sample Data','Santina','N','Cruz',NULL,NULL,NULL,NULL,1,NULL,'Dear Santina',1,NULL,'Dear Santina',1,NULL,'Santina Cruz',NULL,NULL,'1988-08-18',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(90,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Blackwell, Sherman','Mr. Sherman Blackwell Sr.',NULL,NULL,NULL,'5',NULL,'Both','2994560608',NULL,'Sample Data','Sherman','','Blackwell',3,2,NULL,NULL,1,NULL,'Dear Sherman',1,NULL,'Dear Sherman',1,NULL,'Mr. Sherman Blackwell Sr.',NULL,2,'1984-06-17',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(91,'Organization',NULL,1,0,0,0,0,0,NULL,NULL,'Wisconsin Music Academy','Wisconsin Music Academy',NULL,NULL,NULL,'1',NULL,'Both','64183055',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Wisconsin Music Academy',NULL,NULL,NULL,0,NULL,NULL,NULL,'Wisconsin Music Academy',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(92,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jameson, Kacey','Kacey Jameson',NULL,NULL,NULL,'3',NULL,'Both','2233552494',NULL,'Sample Data','Kacey','T','Jameson',NULL,NULL,NULL,NULL,1,NULL,'Dear Kacey',1,NULL,'Dear Kacey',1,NULL,'Kacey Jameson',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(93,'Individual',NULL,1,1,0,0,1,0,NULL,NULL,'Terrell, Ray','Ray Terrell',NULL,NULL,NULL,'2',NULL,'Both','2095931492',NULL,'Sample Data','Ray','','Terrell',NULL,NULL,NULL,NULL,1,NULL,'Dear Ray',1,NULL,'Dear Ray',1,NULL,'Ray Terrell',NULL,2,'1983-04-04',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(94,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'roberts.magan@testing.info','roberts.magan@testing.info',NULL,NULL,NULL,'2',NULL,'Both','80327731',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear roberts.magan@testing.info',1,NULL,'Dear roberts.magan@testing.info',1,NULL,'roberts.magan@testing.info',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(95,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'olsen.jed18@notmail.co.nz','olsen.jed18@notmail.co.nz',NULL,NULL,NULL,NULL,NULL,'Both','1419849527',NULL,'Sample Data',NULL,NULL,NULL,3,3,NULL,NULL,1,NULL,'Dear olsen.jed18@notmail.co.nz',1,NULL,'Dear olsen.jed18@notmail.co.nz',1,NULL,'olsen.jed18@notmail.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(96,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Blackwell-Jameson, Delana','Delana Blackwell-Jameson',NULL,NULL,NULL,NULL,NULL,'Both','3361452081',NULL,'Sample Data','Delana','','Blackwell-Jameson',NULL,NULL,NULL,NULL,1,NULL,'Dear Delana',1,NULL,'Dear Delana',1,NULL,'Delana Blackwell-Jameson',NULL,1,'1999-01-03',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(97,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Jacobs, Magan','Magan Jacobs',NULL,NULL,NULL,'1',NULL,'Both','905810081',NULL,'Sample Data','Magan','O','Jacobs',NULL,NULL,NULL,NULL,1,NULL,'Dear Magan',1,NULL,'Dear Magan',1,NULL,'Magan Jacobs',NULL,1,'1974-03-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(98,'Organization',NULL,0,1,0,0,0,0,NULL,NULL,'Kentucky Poetry Partnership','Kentucky Poetry Partnership',NULL,NULL,NULL,NULL,NULL,'Both','2889570362',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Kentucky Poetry Partnership',NULL,NULL,NULL,0,NULL,NULL,NULL,'Kentucky Poetry Partnership',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(99,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Barkley, Kenny','Mr. Kenny Barkley III',NULL,NULL,NULL,'4',NULL,'Both','3409558741',NULL,'Sample Data','Kenny','','Barkley',3,4,NULL,NULL,1,NULL,'Dear Kenny',1,NULL,'Dear Kenny',1,NULL,'Mr. Kenny Barkley III',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(100,'Organization',NULL,1,0,0,0,0,0,NULL,NULL,'Virginia Health Systems','Virginia Health Systems',NULL,NULL,NULL,'4',NULL,'Both','1772209561',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Virginia Health Systems',NULL,NULL,NULL,0,NULL,NULL,106,'Virginia Health Systems',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(101,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Łąchowski, Elina','Dr. Elina Łąchowski',NULL,NULL,NULL,NULL,NULL,'Both','1014989559',NULL,'Sample Data','Elina','Z','Łąchowski',4,NULL,NULL,NULL,1,NULL,'Dear Elina',1,NULL,'Dear Elina',1,NULL,'Dr. Elina Łąchowski',NULL,1,'1939-09-02',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(102,'Individual',NULL,1,1,0,0,0,0,NULL,NULL,'Roberts, Alexia','Dr. Alexia Roberts',NULL,NULL,NULL,NULL,NULL,'Both','1143708335',NULL,'Sample Data','Alexia','','Roberts',4,NULL,NULL,NULL,1,NULL,'Dear Alexia',1,NULL,'Dear Alexia',1,NULL,'Dr. Alexia Roberts',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(103,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Samuels, Sherman','Sherman Samuels',NULL,NULL,NULL,'5',NULL,'Both','4034661197',NULL,'Sample Data','Sherman','W','Samuels',NULL,NULL,NULL,NULL,1,NULL,'Dear Sherman',1,NULL,'Dear Sherman',1,NULL,'Sherman Samuels',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(104,'Organization',NULL,0,1,0,0,0,0,NULL,NULL,'Pine Health Center','Pine Health Center',NULL,NULL,NULL,NULL,NULL,'Both','3739509592',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Pine Health Center',NULL,NULL,NULL,0,NULL,NULL,113,'Pine Health Center',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(105,'Individual',NULL,1,0,0,0,1,0,NULL,NULL,'oblackwell@notmail.org','oblackwell@notmail.org',NULL,NULL,NULL,NULL,NULL,'Both','1014724465',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear oblackwell@notmail.org',1,NULL,'Dear oblackwell@notmail.org',1,NULL,'oblackwell@notmail.org',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(106,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Grant, Alida','Ms. Alida Grant',NULL,NULL,NULL,'3',NULL,'Both','2081339758',NULL,'Sample Data','Alida','D','Grant',2,NULL,NULL,NULL,1,NULL,'Dear Alida',1,NULL,'Dear Alida',1,NULL,'Ms. Alida Grant',NULL,1,NULL,0,NULL,NULL,NULL,'Virginia Health Systems',NULL,NULL,100,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(107,'Household',NULL,0,0,0,0,1,0,NULL,NULL,'Grant-Nielsen family','Grant-Nielsen family',NULL,NULL,NULL,NULL,NULL,'Both','1860093015',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Grant-Nielsen family',5,NULL,'Dear Grant-Nielsen family',2,NULL,'Grant-Nielsen family',NULL,NULL,NULL,0,NULL,'Grant-Nielsen family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(108,'Individual',NULL,1,1,0,0,0,0,NULL,NULL,'deforest.eleonor32@example.org','deforest.eleonor32@example.org',NULL,NULL,NULL,'4',NULL,'Both','3785596547',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear deforest.eleonor32@example.org',1,NULL,'Dear deforest.eleonor32@example.org',1,NULL,'deforest.eleonor32@example.org',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(109,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Zope, Iris','Mrs. Iris Zope',NULL,NULL,NULL,'1',NULL,'Both','3326964728',NULL,'Sample Data','Iris','X','Zope',1,NULL,NULL,NULL,1,NULL,'Dear Iris',1,NULL,'Dear Iris',1,NULL,'Mrs. Iris Zope',NULL,NULL,'1977-09-02',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(110,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Díaz, Teresa','Teresa Díaz',NULL,NULL,NULL,'3',NULL,'Both','572489835',NULL,'Sample Data','Teresa','G','Díaz',NULL,NULL,NULL,NULL,1,NULL,'Dear Teresa',1,NULL,'Dear Teresa',1,NULL,'Teresa Díaz',NULL,NULL,'1982-04-30',0,NULL,NULL,NULL,'Jackson Education Trust',NULL,NULL,152,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(111,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Ivanov, Ray','Dr. Ray Ivanov II',NULL,NULL,NULL,NULL,NULL,'Both','2368574076',NULL,'Sample Data','Ray','O','Ivanov',4,3,NULL,NULL,1,NULL,'Dear Ray',1,NULL,'Dear Ray',1,NULL,'Dr. Ray Ivanov II',NULL,2,'1978-11-14',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(112,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Parker-Adams, Shauna','Shauna Parker-Adams',NULL,NULL,NULL,'2',NULL,'Both','2659124785',NULL,'Sample Data','Shauna','','Parker-Adams',NULL,NULL,NULL,NULL,1,NULL,'Dear Shauna',1,NULL,'Dear Shauna',1,NULL,'Shauna Parker-Adams',NULL,NULL,'1993-01-24',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(113,'Individual',NULL,1,0,0,0,1,0,NULL,NULL,'wattson.esta@mymail.co.nz','wattson.esta@mymail.co.nz',NULL,NULL,NULL,NULL,NULL,'Both','1346839604',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear wattson.esta@mymail.co.nz',1,NULL,'Dear wattson.esta@mymail.co.nz',1,NULL,'wattson.esta@mymail.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,'Pine Health Center',NULL,NULL,104,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(114,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Łąchowski, Lou','Lou Łąchowski Sr.',NULL,NULL,NULL,'3',NULL,'Both','4023887052',NULL,'Sample Data','Lou','L','Łąchowski',NULL,2,NULL,NULL,1,NULL,'Dear Lou',1,NULL,'Dear Lou',1,NULL,'Lou Łąchowski Sr.',NULL,2,'1956-04-29',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(115,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'parkerd@sample.co.nz','parkerd@sample.co.nz',NULL,NULL,NULL,NULL,NULL,'Both','40269579',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear parkerd@sample.co.nz',1,NULL,'Dear parkerd@sample.co.nz',1,NULL,'parkerd@sample.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(116,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Parker, Kathleen','Kathleen Parker',NULL,NULL,NULL,NULL,NULL,'Both','295233156',NULL,'Sample Data','Kathleen','','Parker',NULL,NULL,NULL,NULL,1,NULL,'Dear Kathleen',1,NULL,'Dear Kathleen',1,NULL,'Kathleen Parker',NULL,NULL,'1996-05-21',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(117,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'barkleyr@fishmail.org','barkleyr@fishmail.org',NULL,NULL,NULL,NULL,NULL,'Both','926404155',NULL,'Sample Data',NULL,NULL,NULL,NULL,2,NULL,NULL,1,NULL,'Dear barkleyr@fishmail.org',1,NULL,'Dear barkleyr@fishmail.org',1,NULL,'barkleyr@fishmail.org',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(118,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Müller, Erik','Mr. Erik Müller',NULL,NULL,NULL,'2',NULL,'Both','826359334',NULL,'Sample Data','Erik','','Müller',3,NULL,NULL,NULL,1,NULL,'Dear Erik',1,NULL,'Dear Erik',1,NULL,'Mr. Erik Müller',NULL,NULL,'1972-04-15',0,NULL,NULL,NULL,'Creative Technology School',NULL,NULL,4,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(119,'Individual',NULL,1,0,0,0,1,0,NULL,NULL,'Samuels, Daren','Daren Samuels Sr.',NULL,NULL,NULL,'5',NULL,'Both','198671176',NULL,'Sample Data','Daren','I','Samuels',NULL,2,NULL,NULL,1,NULL,'Dear Daren',1,NULL,'Dear Daren',1,NULL,'Daren Samuels Sr.',NULL,2,'1958-08-18',0,NULL,NULL,NULL,'Lincoln Software Association',NULL,NULL,189,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(120,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Jacobs, Craig','Dr. Craig Jacobs II',NULL,NULL,NULL,NULL,NULL,'Both','2112460975',NULL,'Sample Data','Craig','','Jacobs',4,3,NULL,NULL,1,NULL,'Dear Craig',1,NULL,'Dear Craig',1,NULL,'Dr. Craig Jacobs II',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(121,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Samson, Teresa','Teresa Samson',NULL,NULL,NULL,NULL,NULL,'Both','719335163',NULL,'Sample Data','Teresa','','Samson',NULL,NULL,NULL,NULL,1,NULL,'Dear Teresa',1,NULL,'Dear Teresa',1,NULL,'Teresa Samson',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(122,'Organization',NULL,1,0,0,0,0,0,NULL,NULL,'Hiawatha Agriculture Systems','Hiawatha Agriculture Systems',NULL,NULL,NULL,'1',NULL,'Both','3321987896',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Hiawatha Agriculture Systems',NULL,NULL,NULL,0,NULL,NULL,148,'Hiawatha Agriculture Systems',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(123,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Wagner, Magan','Magan Wagner',NULL,NULL,NULL,NULL,NULL,'Both','822485998',NULL,'Sample Data','Magan','T','Wagner',NULL,NULL,NULL,NULL,1,NULL,'Dear Magan',1,NULL,'Dear Magan',1,NULL,'Magan Wagner',NULL,1,'1987-01-31',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(124,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Adams, Sharyn','Sharyn Adams',NULL,NULL,NULL,'1',NULL,'Both','4201826843',NULL,'Sample Data','Sharyn','K','Adams',NULL,NULL,NULL,NULL,1,NULL,'Dear Sharyn',1,NULL,'Dear Sharyn',1,NULL,'Sharyn Adams',NULL,1,'1969-05-10',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(125,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'Patel, Tanya','Tanya Patel',NULL,NULL,NULL,NULL,NULL,'Both','2136955790',NULL,'Sample Data','Tanya','','Patel',NULL,NULL,NULL,NULL,1,NULL,'Dear Tanya',1,NULL,'Dear Tanya',1,NULL,'Tanya Patel',NULL,1,'1994-10-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(126,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Nielsen-Łąchowski, Esta','Esta Nielsen-Łąchowski',NULL,NULL,NULL,NULL,NULL,'Both','1630043281',NULL,'Sample Data','Esta','Z','Nielsen-Łąchowski',NULL,NULL,NULL,NULL,1,NULL,'Dear Esta',1,NULL,'Dear Esta',1,NULL,'Esta Nielsen-Łąchowski',NULL,1,'1987-10-24',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(127,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Blackwell, Russell','Russell Blackwell',NULL,NULL,NULL,'3',NULL,'Both','2850885391',NULL,'Sample Data','Russell','D','Blackwell',NULL,NULL,NULL,NULL,1,NULL,'Dear Russell',1,NULL,'Dear Russell',1,NULL,'Russell Blackwell',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(128,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Yadav, Carylon','Dr. Carylon Yadav',NULL,NULL,NULL,NULL,NULL,'Both','2107986081',NULL,'Sample Data','Carylon','Q','Yadav',4,NULL,NULL,NULL,1,NULL,'Dear Carylon',1,NULL,'Dear Carylon',1,NULL,'Dr. Carylon Yadav',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(129,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Yadav family','Yadav family',NULL,NULL,NULL,NULL,NULL,'Both','1777336212',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Yadav family',5,NULL,'Dear Yadav family',2,NULL,'Yadav family',NULL,NULL,NULL,0,NULL,'Yadav family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(130,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'McReynolds, Lashawnda','Lashawnda McReynolds',NULL,NULL,NULL,'5',NULL,'Both','1885036358',NULL,'Sample Data','Lashawnda','','McReynolds',NULL,NULL,NULL,NULL,1,NULL,'Dear Lashawnda',1,NULL,'Dear Lashawnda',1,NULL,'Lashawnda McReynolds',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(131,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jacobs, Scarlet','Ms. Scarlet Jacobs',NULL,NULL,NULL,'1',NULL,'Both','4251552782',NULL,'Sample Data','Scarlet','G','Jacobs',2,NULL,NULL,NULL,1,NULL,'Dear Scarlet',1,NULL,'Dear Scarlet',1,NULL,'Ms. Scarlet Jacobs',NULL,NULL,'1988-12-12',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(132,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Samson, Ray','Mr. Ray Samson Sr.',NULL,NULL,NULL,NULL,NULL,'Both','3926508474',NULL,'Sample Data','Ray','','Samson',3,2,NULL,NULL,1,NULL,'Dear Ray',1,NULL,'Dear Ray',1,NULL,'Mr. Ray Samson Sr.',NULL,2,'1979-09-28',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(133,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Wilson, Ashlie','Dr. Ashlie Wilson',NULL,NULL,NULL,NULL,NULL,'Both','3378806110',NULL,'Sample Data','Ashlie','G','Wilson',4,NULL,NULL,NULL,1,NULL,'Dear Ashlie',1,NULL,'Dear Ashlie',1,NULL,'Dr. Ashlie Wilson',NULL,1,'1977-01-16',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(134,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Reynolds, Scarlet','Scarlet Reynolds',NULL,NULL,NULL,'5',NULL,'Both','2964954269',NULL,'Sample Data','Scarlet','E','Reynolds',NULL,NULL,NULL,NULL,1,NULL,'Dear Scarlet',1,NULL,'Dear Scarlet',1,NULL,'Scarlet Reynolds',NULL,NULL,'1971-08-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(135,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Cooper, Shad','Mr. Shad Cooper',NULL,NULL,NULL,NULL,NULL,'Both','3562872158',NULL,'Sample Data','Shad','G','Cooper',3,NULL,NULL,NULL,1,NULL,'Dear Shad',1,NULL,'Dear Shad',1,NULL,'Mr. Shad Cooper',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(136,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Wattson-Barkley family','Wattson-Barkley family',NULL,NULL,NULL,NULL,NULL,'Both','3291293233',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Wattson-Barkley family',5,NULL,'Dear Wattson-Barkley family',2,NULL,'Wattson-Barkley family',NULL,NULL,NULL,0,NULL,'Wattson-Barkley family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(137,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Łąchowski, Heidi','Ms. Heidi Łąchowski',NULL,NULL,NULL,'5',NULL,'Both','1305700724',NULL,'Sample Data','Heidi','K','Łąchowski',2,NULL,NULL,NULL,1,NULL,'Dear Heidi',1,NULL,'Dear Heidi',1,NULL,'Ms. Heidi Łąchowski',NULL,NULL,'1958-11-05',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(138,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'barkleyv@notmail.co.nz','barkleyv@notmail.co.nz',NULL,NULL,NULL,NULL,NULL,'Both','314636392',NULL,'Sample Data',NULL,NULL,NULL,1,NULL,NULL,NULL,1,NULL,'Dear barkleyv@notmail.co.nz',1,NULL,'Dear barkleyv@notmail.co.nz',1,NULL,'barkleyv@notmail.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(139,'Household',NULL,0,1,0,0,1,0,NULL,NULL,'Robertson-Cruz family','Robertson-Cruz family',NULL,NULL,NULL,NULL,NULL,'Both','2957021336',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Robertson-Cruz family',5,NULL,'Dear Robertson-Cruz family',2,NULL,'Robertson-Cruz family',NULL,NULL,NULL,0,NULL,'Robertson-Cruz family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(140,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Jacobs, Sherman','Sherman Jacobs III',NULL,NULL,NULL,NULL,NULL,'Both','4209151044',NULL,'Sample Data','Sherman','V','Jacobs',NULL,4,NULL,NULL,1,NULL,'Dear Sherman',1,NULL,'Dear Sherman',1,NULL,'Sherman Jacobs III',NULL,2,'1992-06-01',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(141,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Nielsen, Jerome','Jerome Nielsen',NULL,NULL,NULL,NULL,NULL,'Both','3652715063',NULL,'Sample Data','Jerome','A','Nielsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Jerome',1,NULL,'Dear Jerome',1,NULL,'Jerome Nielsen',NULL,2,'1984-02-15',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(142,'Organization',NULL,1,0,0,0,0,0,NULL,NULL,'Hartland Empowerment Fund','Hartland Empowerment Fund',NULL,NULL,NULL,'2',NULL,'Both','282342948',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Hartland Empowerment Fund',NULL,NULL,NULL,0,NULL,NULL,32,'Hartland Empowerment Fund',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(143,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'justinachowski@spamalot.co.uk','justinachowski@spamalot.co.uk',NULL,NULL,NULL,NULL,NULL,'Both','615330049',NULL,'Sample Data',NULL,NULL,NULL,2,NULL,NULL,NULL,1,NULL,'Dear justinachowski@spamalot.co.uk',1,NULL,'Dear justinachowski@spamalot.co.uk',1,NULL,'justinachowski@spamalot.co.uk',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(144,'Individual',NULL,1,1,0,0,0,0,NULL,NULL,'Wagner, Sherman','Sherman Wagner Sr.',NULL,NULL,NULL,'3',NULL,'Both','3748346179',NULL,'Sample Data','Sherman','','Wagner',NULL,2,NULL,NULL,1,NULL,'Dear Sherman',1,NULL,'Dear Sherman',1,NULL,'Sherman Wagner Sr.',NULL,NULL,'1980-06-06',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(145,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'tsamson25@fakemail.com','tsamson25@fakemail.com',NULL,NULL,NULL,NULL,NULL,'Both','2229294932',NULL,'Sample Data',NULL,NULL,NULL,1,NULL,NULL,NULL,1,NULL,'Dear tsamson25@fakemail.com',1,NULL,'Dear tsamson25@fakemail.com',1,NULL,'tsamson25@fakemail.com',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(146,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'wagner.teresa@notmail.co.in','wagner.teresa@notmail.co.in',NULL,NULL,NULL,NULL,NULL,'Both','899367582',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear wagner.teresa@notmail.co.in',1,NULL,'Dear wagner.teresa@notmail.co.in',1,NULL,'wagner.teresa@notmail.co.in',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(147,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jameson, Damaris','Damaris Jameson',NULL,NULL,NULL,'4',NULL,'Both','2629827382',NULL,'Sample Data','Damaris','','Jameson',NULL,NULL,NULL,NULL,1,NULL,'Dear Damaris',1,NULL,'Dear Damaris',1,NULL,'Damaris Jameson',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(148,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'rodrigoblackwell@spamalot.co.pl','rodrigoblackwell@spamalot.co.pl',NULL,NULL,NULL,NULL,NULL,'Both','131550475',NULL,'Sample Data',NULL,NULL,NULL,3,1,NULL,NULL,1,NULL,'Dear rodrigoblackwell@spamalot.co.pl',1,NULL,'Dear rodrigoblackwell@spamalot.co.pl',1,NULL,'rodrigoblackwell@spamalot.co.pl',NULL,NULL,NULL,0,NULL,NULL,NULL,'Hiawatha Agriculture Systems',NULL,NULL,122,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(149,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Robertson-Cruz, Santina','Ms. Santina Robertson-Cruz',NULL,NULL,NULL,'5',NULL,'Both','3017173600',NULL,'Sample Data','Santina','','Robertson-Cruz',2,NULL,NULL,NULL,1,NULL,'Dear Santina',1,NULL,'Dear Santina',1,NULL,'Ms. Santina Robertson-Cruz',NULL,1,'1984-02-07',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(150,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'González-Parker, Jackson','Mr. Jackson González-Parker Sr.',NULL,NULL,NULL,'2',NULL,'Both','90879272',NULL,'Sample Data','Jackson','G','González-Parker',3,2,NULL,NULL,1,NULL,'Dear Jackson',1,NULL,'Dear Jackson',1,NULL,'Mr. Jackson González-Parker Sr.',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(151,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'González, Ashley','Ms. Ashley González',NULL,NULL,NULL,'3',NULL,'Both','1248338675',NULL,'Sample Data','Ashley','','González',2,NULL,NULL,NULL,1,NULL,'Dear Ashley',1,NULL,'Dear Ashley',1,NULL,'Ms. Ashley González',NULL,1,'1990-12-20',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(152,'Organization',NULL,1,0,0,0,0,0,NULL,NULL,'Jackson Education Trust','Jackson Education Trust',NULL,NULL,NULL,NULL,NULL,'Both','4144381426',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Jackson Education Trust',NULL,NULL,NULL,0,NULL,NULL,110,'Jackson Education Trust',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(153,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'daz.omar15@testing.co.pl','daz.omar15@testing.co.pl',NULL,NULL,NULL,'2',NULL,'Both','277896804',NULL,'Sample Data',NULL,NULL,NULL,NULL,1,NULL,NULL,1,NULL,'Dear daz.omar15@testing.co.pl',1,NULL,'Dear daz.omar15@testing.co.pl',1,NULL,'daz.omar15@testing.co.pl',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(154,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Olsen, Valene','Valene Olsen',NULL,NULL,NULL,NULL,NULL,'Both','2597710713',NULL,'Sample Data','Valene','U','Olsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Valene',1,NULL,'Dear Valene',1,NULL,'Valene Olsen',NULL,1,NULL,0,NULL,NULL,NULL,'Eastpoint Sports Center',NULL,NULL,179,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(155,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Parker-Adams, Ashley','Ashley Parker-Adams II',NULL,NULL,NULL,'2',NULL,'Both','1496749530',NULL,'Sample Data','Ashley','Y','Parker-Adams',NULL,3,NULL,NULL,1,NULL,'Dear Ashley',1,NULL,'Dear Ashley',1,NULL,'Ashley Parker-Adams II',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(156,'Individual',NULL,1,1,0,0,0,0,NULL,NULL,'jonest@notmail.info','jonest@notmail.info',NULL,NULL,NULL,NULL,NULL,'Both','1278689747',NULL,'Sample Data',NULL,NULL,NULL,2,NULL,NULL,NULL,1,NULL,'Dear jonest@notmail.info',1,NULL,'Dear jonest@notmail.info',1,NULL,'jonest@notmail.info',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(157,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Terrell-Olsen, Jed','Jed Terrell-Olsen',NULL,NULL,NULL,'4',NULL,'Both','3804232006',NULL,'Sample Data','Jed','Z','Terrell-Olsen',NULL,NULL,NULL,NULL,1,NULL,'Dear Jed',1,NULL,'Dear Jed',1,NULL,'Jed Terrell-Olsen',NULL,NULL,'2008-05-31',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(158,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Jacobs, Damaris','Damaris Jacobs',NULL,NULL,NULL,NULL,NULL,'Both','2985152224',NULL,'Sample Data','Damaris','W','Jacobs',NULL,NULL,NULL,NULL,1,NULL,'Dear Damaris',1,NULL,'Dear Damaris',1,NULL,'Damaris Jacobs',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:11'),(159,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Robertson, Elina','Elina Robertson',NULL,NULL,NULL,NULL,NULL,'Both','2118897804',NULL,'Sample Data','Elina','G','Robertson',NULL,NULL,NULL,NULL,1,NULL,'Dear Elina',1,NULL,'Dear Elina',1,NULL,'Elina Robertson',NULL,1,NULL,0,NULL,NULL,NULL,'Alaska Poetry Systems',NULL,NULL,80,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(160,'Household',NULL,1,0,0,0,0,0,NULL,NULL,'Nielsen-Łąchowski family','Nielsen-Łąchowski family',NULL,NULL,NULL,'1',NULL,'Both','1204079032',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Nielsen-Łąchowski family',5,NULL,'Dear Nielsen-Łąchowski family',2,NULL,'Nielsen-Łąchowski family',NULL,NULL,NULL,0,NULL,'Nielsen-Łąchowski family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(161,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Blackwell, Andrew','Andrew Blackwell',NULL,NULL,NULL,'1',NULL,'Both','2328901373',NULL,'Sample Data','Andrew','','Blackwell',NULL,NULL,NULL,NULL,1,NULL,'Dear Andrew',1,NULL,'Dear Andrew',1,NULL,'Andrew Blackwell',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(162,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Groton Advocacy Center','Groton Advocacy Center',NULL,NULL,NULL,'5',NULL,'Both','2208787949',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Groton Advocacy Center',NULL,NULL,NULL,0,NULL,NULL,178,'Groton Advocacy Center',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(163,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Reynolds, Barry','Barry Reynolds',NULL,NULL,NULL,'4',NULL,'Both','3819576802',NULL,'Sample Data','Barry','','Reynolds',NULL,NULL,NULL,NULL,1,NULL,'Dear Barry',1,NULL,'Dear Barry',1,NULL,'Barry Reynolds',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(164,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jacobs, Sharyn','Sharyn Jacobs',NULL,NULL,NULL,NULL,NULL,'Both','3551005381',NULL,'Sample Data','Sharyn','K','Jacobs',NULL,NULL,NULL,NULL,1,NULL,'Dear Sharyn',1,NULL,'Dear Sharyn',1,NULL,'Sharyn Jacobs',NULL,1,'1981-07-31',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(165,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jones, Bernadette','Dr. Bernadette Jones',NULL,NULL,NULL,'5',NULL,'Both','357713234',NULL,'Sample Data','Bernadette','','Jones',4,NULL,NULL,NULL,1,NULL,'Dear Bernadette',1,NULL,'Dear Bernadette',1,NULL,'Dr. Bernadette Jones',NULL,1,'1983-08-14',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(166,'Individual',NULL,1,0,0,0,1,0,NULL,NULL,'Lee, Valene','Ms. Valene Lee',NULL,NULL,NULL,'1',NULL,'Both','1883527175',NULL,'Sample Data','Valene','','Lee',2,NULL,NULL,NULL,1,NULL,'Dear Valene',1,NULL,'Dear Valene',1,NULL,'Ms. Valene Lee',NULL,NULL,NULL,1,'2020-07-27',NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(167,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Nielsen, Landon','Dr. Landon Nielsen',NULL,NULL,NULL,'2',NULL,'Both','1226832678',NULL,'Sample Data','Landon','','Nielsen',4,NULL,NULL,NULL,1,NULL,'Dear Landon',1,NULL,'Dear Landon',1,NULL,'Dr. Landon Nielsen',NULL,2,'1989-07-28',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(168,'Household',NULL,0,0,0,0,1,0,NULL,NULL,'Parker family','Parker family',NULL,NULL,NULL,NULL,NULL,'Both','425242179',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Parker family',5,NULL,'Dear Parker family',2,NULL,'Parker family',NULL,NULL,NULL,0,NULL,'Parker family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(169,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'mller.j.craig@spamalot.org','mller.j.craig@spamalot.org',NULL,NULL,NULL,'2',NULL,'Both','145937486',NULL,'Sample Data',NULL,NULL,NULL,4,NULL,NULL,NULL,1,NULL,'Dear mller.j.craig@spamalot.org',1,NULL,'Dear mller.j.craig@spamalot.org',1,NULL,'mller.j.craig@spamalot.org',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(170,'Household',NULL,0,1,0,0,0,0,NULL,NULL,'Díaz family','Díaz family',NULL,NULL,NULL,NULL,NULL,'Both','2169249835',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Díaz family',5,NULL,'Dear Díaz family',2,NULL,'Díaz family',NULL,NULL,NULL,0,NULL,'Díaz family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(171,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Cruz, Jed','Jed Cruz',NULL,NULL,NULL,NULL,NULL,'Both','1892758308',NULL,'Sample Data','Jed','','Cruz',NULL,NULL,NULL,NULL,1,NULL,'Dear Jed',1,NULL,'Dear Jed',1,NULL,'Jed Cruz',NULL,NULL,'1936-03-10',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(172,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Jones, Teddy','Dr. Teddy Jones II',NULL,NULL,NULL,'1',NULL,'Both','820289912',NULL,'Sample Data','Teddy','','Jones',4,3,NULL,NULL,1,NULL,'Dear Teddy',1,NULL,'Dear Teddy',1,NULL,'Dr. Teddy Jones II',NULL,2,NULL,0,NULL,NULL,NULL,'Beech Poetry Association',NULL,NULL,78,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(173,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Lee, Errol','Errol Lee II',NULL,NULL,NULL,'3',NULL,'Both','1182001849',NULL,'Sample Data','Errol','H','Lee',NULL,3,NULL,NULL,1,NULL,'Dear Errol',1,NULL,'Dear Errol',1,NULL,'Errol Lee II',NULL,2,'1940-07-24',1,'2020-10-03',NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(174,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Díaz, Arlyne','Dr. Arlyne Díaz',NULL,NULL,NULL,'1',NULL,'Both','4265577068',NULL,'Sample Data','Arlyne','','Díaz',4,NULL,NULL,NULL,1,NULL,'Dear Arlyne',1,NULL,'Dear Arlyne',1,NULL,'Dr. Arlyne Díaz',NULL,1,NULL,0,NULL,NULL,NULL,'Idaho Advocacy Academy',NULL,NULL,69,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(175,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Roberts, Errol','Errol Roberts II',NULL,NULL,NULL,NULL,NULL,'Both','152825771',NULL,'Sample Data','Errol','','Roberts',NULL,3,NULL,NULL,1,NULL,'Dear Errol',1,NULL,'Dear Errol',1,NULL,'Errol Roberts II',NULL,2,'1976-12-15',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(176,'Individual',NULL,1,0,0,0,1,0,NULL,NULL,'Müller, Jerome','Jerome Müller',NULL,NULL,NULL,NULL,NULL,'Both','225098761',NULL,'Sample Data','Jerome','','Müller',NULL,NULL,NULL,NULL,1,NULL,'Dear Jerome',1,NULL,'Dear Jerome',1,NULL,'Jerome Müller',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(177,'Household',NULL,1,0,0,0,0,0,NULL,NULL,'Olsen family','Olsen family',NULL,NULL,NULL,NULL,NULL,'Both','1990073228',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Olsen family',5,NULL,'Dear Olsen family',2,NULL,'Olsen family',NULL,NULL,NULL,0,NULL,'Olsen family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(178,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Müller, Jay','Jay Müller',NULL,NULL,NULL,NULL,NULL,'Both','1474211624',NULL,'Sample Data','Jay','V','Müller',NULL,NULL,NULL,NULL,1,NULL,'Dear Jay',1,NULL,'Dear Jay',1,NULL,'Jay Müller',NULL,2,'2010-02-05',0,NULL,NULL,NULL,'Groton Advocacy Center',NULL,NULL,162,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(179,'Organization',NULL,0,0,0,0,0,0,NULL,NULL,'Eastpoint Sports Center','Eastpoint Sports Center',NULL,NULL,NULL,'3',NULL,'Both','1606932161',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Eastpoint Sports Center',NULL,NULL,NULL,0,NULL,NULL,154,'Eastpoint Sports Center',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(180,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Łąchowski, Lashawnda','Lashawnda Łąchowski',NULL,NULL,NULL,NULL,NULL,'Both','4065862951',NULL,'Sample Data','Lashawnda','','Łąchowski',NULL,NULL,NULL,NULL,1,NULL,'Dear Lashawnda',1,NULL,'Dear Lashawnda',1,NULL,'Lashawnda Łąchowski',NULL,NULL,'1971-04-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(181,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Blackwell family','Blackwell family',NULL,NULL,NULL,'3',NULL,'Both','3218641510',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Blackwell family',5,NULL,'Dear Blackwell family',2,NULL,'Blackwell family',NULL,NULL,NULL,0,NULL,'Blackwell family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(182,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Bachman, Elina','Mrs. Elina Bachman',NULL,NULL,NULL,NULL,NULL,'Both','3576497791',NULL,'Sample Data','Elina','','Bachman',1,NULL,NULL,NULL,1,NULL,'Dear Elina',1,NULL,'Dear Elina',1,NULL,'Mrs. Elina Bachman',NULL,1,'1976-01-23',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(183,'Individual',NULL,0,1,0,0,0,0,NULL,NULL,'ewilson@testing.co.nz','ewilson@testing.co.nz',NULL,NULL,NULL,NULL,NULL,'Both','1902535890',NULL,'Sample Data',NULL,NULL,NULL,4,3,NULL,NULL,1,NULL,'Dear ewilson@testing.co.nz',1,NULL,'Dear ewilson@testing.co.nz',1,NULL,'ewilson@testing.co.nz',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(184,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Nielsen, Russell','Russell Nielsen Sr.',NULL,NULL,NULL,'5',NULL,'Both','2180719783',NULL,'Sample Data','Russell','','Nielsen',NULL,2,NULL,NULL,1,NULL,'Dear Russell',1,NULL,'Dear Russell',1,NULL,'Russell Nielsen Sr.',NULL,2,'1948-07-04',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(185,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Robertson, Kathlyn','Kathlyn Robertson',NULL,NULL,NULL,'1',NULL,'Both','1571361016',NULL,'Sample Data','Kathlyn','I','Robertson',NULL,NULL,NULL,NULL,1,NULL,'Dear Kathlyn',1,NULL,'Dear Kathlyn',1,NULL,'Kathlyn Robertson',NULL,1,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(186,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'Samuels, Troy','Troy Samuels',NULL,NULL,NULL,NULL,NULL,'Both','2799330146',NULL,'Sample Data','Troy','','Samuels',NULL,NULL,NULL,NULL,1,NULL,'Dear Troy',1,NULL,'Dear Troy',1,NULL,'Troy Samuels',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(187,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Samson, Allen','Mr. Allen Samson Jr.',NULL,NULL,NULL,NULL,NULL,'Both','551135847',NULL,'Sample Data','Allen','S','Samson',3,1,NULL,NULL,1,NULL,'Dear Allen',1,NULL,'Dear Allen',1,NULL,'Mr. Allen Samson Jr.',NULL,2,'1961-07-08',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(188,'Individual',NULL,1,1,0,0,0,0,NULL,NULL,'Zope, Landon','Landon Zope',NULL,NULL,NULL,NULL,NULL,'Both','4025242907',NULL,'Sample Data','Landon','','Zope',NULL,NULL,NULL,NULL,1,NULL,'Dear Landon',1,NULL,'Dear Landon',1,NULL,'Landon Zope',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(189,'Organization',NULL,1,0,0,0,0,0,NULL,NULL,'Lincoln Software Association','Lincoln Software Association',NULL,NULL,NULL,NULL,NULL,'Both','217878592',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Lincoln Software Association',NULL,NULL,NULL,0,NULL,NULL,119,'Lincoln Software Association',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(190,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Olsen, Ray','Dr. Ray Olsen',NULL,NULL,NULL,NULL,NULL,'Both','1640487275',NULL,'Sample Data','Ray','W','Olsen',4,NULL,NULL,NULL,1,NULL,'Dear Ray',1,NULL,'Dear Ray',1,NULL,'Dr. Ray Olsen',NULL,2,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(191,'Household',NULL,0,0,0,0,1,0,NULL,NULL,'Blackwell-Jameson family','Blackwell-Jameson family',NULL,NULL,NULL,NULL,NULL,'Both','1628042122',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Blackwell-Jameson family',5,NULL,'Dear Blackwell-Jameson family',2,NULL,'Blackwell-Jameson family',NULL,NULL,NULL,0,NULL,'Blackwell-Jameson family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(192,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'kaceymller@example.info','kaceymller@example.info',NULL,NULL,NULL,NULL,NULL,'Both','210756677',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,'Dear kaceymller@example.info',1,NULL,'Dear kaceymller@example.info',1,NULL,'kaceymller@example.info',NULL,NULL,NULL,0,NULL,NULL,NULL,'Global Technology Initiative',NULL,NULL,3,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(193,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Müller, Brigette','Brigette Müller',NULL,NULL,NULL,'1',NULL,'Both','3572143002',NULL,'Sample Data','Brigette','P','Müller',NULL,NULL,NULL,NULL,1,NULL,'Dear Brigette',1,NULL,'Dear Brigette',1,NULL,'Brigette Müller',NULL,NULL,'1957-09-06',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(194,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Robertson-Cruz, Lincoln','Lincoln Robertson-Cruz',NULL,NULL,NULL,'2',NULL,'Both','2782488749',NULL,'Sample Data','Lincoln','N','Robertson-Cruz',NULL,NULL,NULL,NULL,1,NULL,'Dear Lincoln',1,NULL,'Dear Lincoln',1,NULL,'Lincoln Robertson-Cruz',NULL,2,'2013-04-13',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(195,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Nielsen, Ashley','Mr. Ashley Nielsen',NULL,NULL,NULL,'1',NULL,'Both','3185921843',NULL,'Sample Data','Ashley','','Nielsen',3,NULL,NULL,NULL,1,NULL,'Dear Ashley',1,NULL,'Dear Ashley',1,NULL,'Mr. Ashley Nielsen',NULL,2,'1995-02-13',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(196,'Organization',NULL,0,1,0,0,0,0,NULL,NULL,'Urban Environmental Fund','Urban Environmental Fund',NULL,NULL,NULL,NULL,NULL,'Both','2426364778',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,3,NULL,'Urban Environmental Fund',NULL,NULL,NULL,0,NULL,NULL,71,'Urban Environmental Fund',NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(197,'Individual',NULL,0,0,0,0,1,0,NULL,NULL,'bryonroberts8@mymail.co.in','bryonroberts8@mymail.co.in',NULL,NULL,NULL,'4',NULL,'Both','1192180829',NULL,'Sample Data',NULL,NULL,NULL,3,NULL,NULL,NULL,1,NULL,'Dear bryonroberts8@mymail.co.in',1,NULL,'Dear bryonroberts8@mymail.co.in',1,NULL,'bryonroberts8@mymail.co.in',NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(198,'Individual',NULL,1,0,0,0,0,0,NULL,NULL,'Grant, Teddy','Dr. Teddy Grant',NULL,NULL,NULL,NULL,NULL,'Both','2998068499',NULL,'Sample Data','Teddy','J','Grant',4,NULL,NULL,NULL,1,NULL,'Dear Teddy',1,NULL,'Dear Teddy',1,NULL,'Dr. Teddy Grant',NULL,2,'1986-01-30',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13'),(199,'Household',NULL,0,0,0,0,0,0,NULL,NULL,'Müller family','Müller family',NULL,NULL,NULL,NULL,NULL,'Both','1144797465',NULL,'Sample Data',NULL,NULL,NULL,NULL,NULL,NULL,NULL,5,NULL,'Dear Müller family',5,NULL,'Dear Müller family',2,NULL,'Müller family',NULL,NULL,NULL,0,NULL,'Müller family',NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(200,'Individual',NULL,0,0,0,0,0,0,NULL,NULL,'Deforest, Delana','Delana Deforest',NULL,NULL,NULL,NULL,NULL,'Both','1044596846',NULL,'Sample Data','Delana','I','Deforest',NULL,NULL,NULL,NULL,1,NULL,'Dear Delana',1,NULL,'Dear Delana',1,NULL,'Delana Deforest',NULL,NULL,'1993-01-11',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:12'),(201,'Individual',NULL,0,1,0,0,1,0,NULL,NULL,'Parker, Teddy','Dr. Teddy Parker',NULL,NULL,NULL,NULL,NULL,'Both','1804413700',NULL,'Sample Data','Teddy','Q','Parker',4,NULL,NULL,NULL,1,NULL,'Dear Teddy',1,NULL,'Dear Teddy',1,NULL,'Dr. Teddy Parker',NULL,2,'1956-08-07',0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'2020-10-08 01:49:11','2020-10-08 01:49:13');
 /*!40000 ALTER TABLE `civicrm_contact` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -228,7 +228,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_contribution` WRITE;
 /*!40000 ALTER TABLE `civicrm_contribution` DISABLE KEYS */;
-INSERT INTO `civicrm_contribution` (`id`, `contact_id`, `financial_type_id`, `contribution_page_id`, `payment_instrument_id`, `receive_date`, `non_deductible_amount`, `total_amount`, `fee_amount`, `net_amount`, `trxn_id`, `invoice_id`, `invoice_number`, `currency`, `cancel_date`, `cancel_reason`, `receipt_date`, `thankyou_date`, `source`, `amount_level`, `contribution_recur_id`, `is_test`, `is_pay_later`, `contribution_status_id`, `address_id`, `check_number`, `campaign_id`, `creditnote_id`, `tax_amount`, `revenue_recognition_date`, `is_template`) VALUES (1,2,1,NULL,4,'2010-04-11 00:00:00',0.00,125.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'1041',NULL,NULL,NULL,NULL,0),(2,4,1,NULL,1,'2010-03-21 00:00:00',0.00,50.00,NULL,NULL,'P20901X1',NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Online: Save the Penguins',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(3,6,1,NULL,4,'2010-04-29 00:00:00',0.00,25.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'2095',NULL,NULL,NULL,NULL,0),(4,8,1,NULL,4,'2010-04-11 00:00:00',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'10552',NULL,NULL,NULL,NULL,0),(5,16,1,NULL,4,'2010-04-15 00:00:00',0.00,500.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'509',NULL,NULL,NULL,NULL,0),(6,19,1,NULL,4,'2010-04-11 00:00:00',0.00,175.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'102',NULL,NULL,NULL,NULL,0),(7,82,1,NULL,1,'2010-03-27 00:00:00',0.00,50.00,NULL,NULL,'P20193L2',NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Online: Save the Penguins',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(8,92,1,NULL,1,'2010-03-08 00:00:00',0.00,10.00,NULL,NULL,'P40232Y3',NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Online: Help CiviCRM',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(9,34,1,NULL,1,'2010-04-22 00:00:00',0.00,250.00,NULL,NULL,'P20193L6',NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Online: Help CiviCRM',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(10,71,1,NULL,1,'2009-07-01 11:53:50',0.00,500.00,NULL,NULL,'PL71',NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(11,43,1,NULL,1,'2009-07-01 12:55:41',0.00,200.00,NULL,NULL,'PL43II',NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(12,32,1,NULL,1,'2009-10-01 11:53:50',0.00,200.00,NULL,NULL,'PL32I',NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(13,32,1,NULL,1,'2009-12-01 12:55:41',0.00,200.00,NULL,NULL,'PL32II',NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(14,103,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(15,179,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(16,12,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(17,173,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(18,127,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(19,63,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(20,188,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(21,80,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(22,131,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(23,161,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(24,41,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(25,20,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(26,195,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(27,164,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(28,78,2,NULL,1,'2020-07-24 15:34:04',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(29,132,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(30,5,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(31,108,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(32,39,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(33,159,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(34,67,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(35,17,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(36,7,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(37,95,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(38,134,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(39,74,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(40,13,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(41,156,2,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(42,145,2,NULL,1,'2020-07-24 15:34:04',0.00,1200.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Lifetime Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(43,99,2,NULL,1,'2020-07-24 15:34:04',0.00,1200.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Lifetime Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(45,5,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(46,6,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(47,8,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(48,18,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(49,19,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(50,21,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(51,23,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(52,24,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(53,30,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(54,31,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(55,41,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(56,44,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(57,49,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(58,54,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(59,56,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(60,57,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(61,60,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(62,68,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(63,70,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(64,73,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(65,90,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(66,94,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(67,95,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(68,98,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(69,99,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(70,102,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(71,103,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(72,105,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(73,106,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(74,109,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(75,110,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(76,111,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(77,114,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(78,120,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(79,129,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(80,130,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(81,133,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(82,140,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(83,155,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(84,162,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(85,165,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(86,167,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(87,170,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(88,172,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(89,175,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(90,180,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(91,194,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(92,195,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(93,196,4,NULL,1,'2020-07-24 15:34:04',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(94,200,4,NULL,1,'2020-07-24 15:34:04',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-07-24 15:34:04',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0);
+INSERT INTO `civicrm_contribution` (`id`, `contact_id`, `financial_type_id`, `contribution_page_id`, `payment_instrument_id`, `receive_date`, `non_deductible_amount`, `total_amount`, `fee_amount`, `net_amount`, `trxn_id`, `invoice_id`, `invoice_number`, `currency`, `cancel_date`, `cancel_reason`, `receipt_date`, `thankyou_date`, `source`, `amount_level`, `contribution_recur_id`, `is_test`, `is_pay_later`, `contribution_status_id`, `address_id`, `check_number`, `campaign_id`, `creditnote_id`, `tax_amount`, `revenue_recognition_date`, `is_template`) VALUES (1,2,1,NULL,4,'2010-04-11 00:00:00',0.00,125.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'1041',NULL,NULL,NULL,NULL,0),(2,4,1,NULL,1,'2010-03-21 00:00:00',0.00,50.00,NULL,NULL,'P20901X1',NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Online: Save the Penguins',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(3,6,1,NULL,4,'2010-04-29 00:00:00',0.00,25.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'2095',NULL,NULL,NULL,NULL,0),(4,8,1,NULL,4,'2010-04-11 00:00:00',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'10552',NULL,NULL,NULL,NULL,0),(5,16,1,NULL,4,'2010-04-15 00:00:00',0.00,500.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'509',NULL,NULL,NULL,NULL,0),(6,19,1,NULL,4,'2010-04-11 00:00:00',0.00,175.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Apr 2007 Mailer 1',NULL,NULL,0,0,1,NULL,'102',NULL,NULL,NULL,NULL,0),(7,82,1,NULL,1,'2010-03-27 00:00:00',0.00,50.00,NULL,NULL,'P20193L2',NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Online: Save the Penguins',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(8,92,1,NULL,1,'2010-03-08 00:00:00',0.00,10.00,NULL,NULL,'P40232Y3',NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Online: Help CiviCRM',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(9,34,1,NULL,1,'2010-04-22 00:00:00',0.00,250.00,NULL,NULL,'P20193L6',NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Online: Help CiviCRM',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(10,71,1,NULL,1,'2009-07-01 11:53:50',0.00,500.00,NULL,NULL,'PL71',NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(11,43,1,NULL,1,'2009-07-01 12:55:41',0.00,200.00,NULL,NULL,'PL43II',NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(12,32,1,NULL,1,'2009-10-01 11:53:50',0.00,200.00,NULL,NULL,'PL32I',NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(13,32,1,NULL,1,'2009-12-01 12:55:41',0.00,200.00,NULL,NULL,'PL32II',NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(14,140,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(15,28,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(16,134,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(17,59,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(18,178,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(19,26,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(20,54,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(21,132,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(22,108,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(23,118,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(24,161,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(25,57,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(26,18,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(27,76,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(28,22,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(29,125,2,NULL,1,'2020-10-08 12:49:15',0.00,100.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'General Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(30,63,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(31,126,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(32,165,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(33,62,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(34,81,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(35,79,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(36,114,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(37,110,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(38,2,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(39,167,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(40,131,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(41,120,2,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Student Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(42,75,2,NULL,1,'2020-10-08 12:49:15',0.00,1200.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Lifetime Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(43,156,2,NULL,1,'2020-10-08 12:49:15',0.00,1200.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,NULL,NULL,'Lifetime Membership: Offline signup',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(45,4,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(46,9,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(47,17,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(48,19,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(49,22,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(50,27,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(51,30,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(52,36,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(53,38,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(54,39,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(55,47,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(56,51,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(57,57,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(58,64,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(59,65,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(60,73,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(61,76,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(62,77,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(63,79,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(64,87,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(65,91,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(66,93,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(67,98,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(68,104,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(69,105,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(70,108,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(71,114,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(72,116,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(73,118,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(74,125,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(75,127,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(76,128,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(77,129,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(78,135,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(79,136,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(80,146,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(81,147,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(82,148,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(83,150,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(84,151,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(85,152,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(86,158,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(87,159,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(88,161,4,NULL,1,'2020-10-08 12:49:15',0.00,800.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Rain-forest Cup Youth Soccer Tournament : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(89,166,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(90,171,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(91,178,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(92,181,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Fall Fundraiser Dinner : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(93,196,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0),(94,199,4,NULL,1,'2020-10-08 12:49:15',0.00,50.00,NULL,NULL,NULL,NULL,NULL,'USD',NULL,NULL,'2020-10-08 12:49:15',NULL,'Summer Solstice Festival Day Concert : Offline registration',NULL,NULL,0,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0);
 /*!40000 ALTER TABLE `civicrm_contribution` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -266,7 +266,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_contribution_soft` WRITE;
 /*!40000 ALTER TABLE `civicrm_contribution_soft` DISABLE KEYS */;
-INSERT INTO `civicrm_contribution_soft` (`id`, `contribution_id`, `contact_id`, `amount`, `currency`, `pcp_id`, `pcp_display_in_roll`, `pcp_roll_nickname`, `pcp_personal_note`, `soft_credit_type_id`) VALUES (1,8,57,10.00,'USD',1,1,'Jones Family','Helping Hands',10),(2,9,57,250.00,'USD',1,1,'Annie and the kids','Annie Helps',10);
+INSERT INTO `civicrm_contribution_soft` (`id`, `contribution_id`, `contact_id`, `amount`, `currency`, `pcp_id`, `pcp_display_in_roll`, `pcp_roll_nickname`, `pcp_personal_note`, `soft_credit_type_id`) VALUES (1,8,159,10.00,'USD',1,1,'Jones Family','Helping Hands',10),(2,9,159,250.00,'USD',1,1,'Annie and the kids','Annie Helps',10);
 /*!40000 ALTER TABLE `civicrm_contribution_soft` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -399,7 +399,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_domain` WRITE;
 /*!40000 ALTER TABLE `civicrm_domain` DISABLE KEYS */;
-INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES (1,'Default Domain Name',NULL,'5.30.1',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
+INSERT INTO `civicrm_domain` (`id`, `name`, `description`, `version`, `contact_id`, `locales`, `locale_custom_strings`) VALUES (1,'Default Domain Name',NULL,'5.31.0',1,NULL,'a:1:{s:5:\"en_US\";a:0:{}}');
 /*!40000 ALTER TABLE `civicrm_domain` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -409,7 +409,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_email` WRITE;
 /*!40000 ALTER TABLE `civicrm_email` DISABLE KEYS */;
-INSERT INTO `civicrm_email` (`id`, `contact_id`, `location_type_id`, `email`, `is_primary`, `is_billing`, `on_hold`, `is_bulkmail`, `hold_date`, `reset_date`, `signature_text`, `signature_html`) VALUES (1,1,1,'fixme.domainemail@example.org',0,0,0,0,NULL,NULL,NULL,NULL),(2,24,1,'jacobt@fakemail.info',1,0,0,0,NULL,NULL,NULL,NULL),(3,124,1,'allenlee47@testing.net',1,0,0,0,NULL,NULL,NULL,NULL),(4,124,1,'allenlee@airmail.biz',0,0,0,0,NULL,NULL,NULL,NULL),(5,17,1,'bb.samson59@mymail.info',1,0,0,0,NULL,NULL,NULL,NULL),(6,182,1,'mllerj@sample.com',1,0,0,0,NULL,NULL,NULL,NULL),(7,182,1,'js.mller@spamalot.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(8,99,1,'terrye@infomail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(9,81,1,'ivanov.maria@testmail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(10,81,1,'mariai@testing.com',0,0,0,0,NULL,NULL,NULL,NULL),(11,53,1,'wattsont@sample.org',1,0,0,0,NULL,NULL,NULL,NULL),(12,53,1,'twattson@fakemail.com',0,0,0,0,NULL,NULL,NULL,NULL),(13,15,1,'adams.merrie@notmail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(14,179,1,'samuels.c.carylon19@lol.biz',1,0,0,0,NULL,NULL,NULL,NULL),(15,83,1,'coopern43@sample.info',1,0,0,0,NULL,NULL,NULL,NULL),(16,83,1,'norrisc@example.info',0,0,0,0,NULL,NULL,NULL,NULL),(17,164,1,'samuels.a.brittney@sample.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(18,146,1,'jacobs.f.jay51@notmail.org',1,0,0,0,NULL,NULL,NULL,NULL),(19,120,1,'patelm@mymail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(20,193,1,'allanjameson35@infomail.net',1,0,0,0,NULL,NULL,NULL,NULL),(21,76,1,'shado27@testmail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(22,162,1,'bernadetteb@lol.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(23,162,1,'bernadetteblackwell98@example.org',0,0,0,0,NULL,NULL,NULL,NULL),(24,92,1,'allenm@mymail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(25,65,1,'jedparker85@fakemail.org',1,0,0,0,NULL,NULL,NULL,NULL),(26,190,1,'barkley.carylon21@sample.biz',1,0,0,0,NULL,NULL,NULL,NULL),(27,184,1,'ivanov.kiara71@testmail.net',1,0,0,0,NULL,NULL,NULL,NULL),(28,67,1,'chowski.juliann@mymail.net',1,0,0,0,NULL,NULL,NULL,NULL),(29,67,1,'juliann@testing.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(30,185,1,'mller.scott40@airmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(31,175,1,'kx.dimitrov1@mymail.org',1,0,0,0,NULL,NULL,NULL,NULL),(32,129,1,'vprentice@airmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(33,129,1,'vprentice@example.info',0,0,0,0,NULL,NULL,NULL,NULL),(34,197,1,'yadav.elina7@spamalot.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(35,197,1,'elinay@testing.net',0,0,0,0,NULL,NULL,NULL,NULL),(36,122,1,'rebekaho@spamalot.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(37,7,1,'patel.erik@testing.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(38,154,1,'patel.k.irvin@notmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(39,154,1,'irvinpatel59@airmail.com',0,0,0,0,NULL,NULL,NULL,NULL),(40,51,1,'spatel67@lol.net',1,0,0,0,NULL,NULL,NULL,NULL),(41,111,1,'robertson.elizabeth@airmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(42,111,1,'erobertson47@testmail.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(43,143,1,'bernadettewattson@lol.org',1,0,0,0,NULL,NULL,NULL,NULL),(44,143,1,'wattson.bernadette@fishmail.org',0,0,0,0,NULL,NULL,NULL,NULL),(45,77,1,'jameson.elbert@airmail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(46,77,1,'elbertjameson47@lol.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(47,8,1,'ashleyreynolds99@sample.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(48,8,1,'ashleyr@fishmail.com',0,0,0,0,NULL,NULL,NULL,NULL),(49,84,1,'bachmanl95@mymail.net',1,0,0,0,NULL,NULL,NULL,NULL),(50,123,1,'lee.jed@lol.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(51,119,1,'terrell.santina@lol.biz',1,0,0,0,NULL,NULL,NULL,NULL),(52,119,1,'santinaterrell@example.com',0,0,0,0,NULL,NULL,NULL,NULL),(53,60,1,'wilson.maxwell@lol.info',1,0,0,0,NULL,NULL,NULL,NULL),(54,88,1,'elizabeths@testmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(55,41,1,'barkley.brittney@testmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(56,156,1,'damariss@airmail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(57,118,1,'mp.prentice@airmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(58,118,1,'prentice.maria86@spamalot.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(59,49,1,'fjones12@testing.com',1,0,0,0,NULL,NULL,NULL,NULL),(60,23,1,'rp.wattson@example.org',1,0,0,0,NULL,NULL,NULL,NULL),(61,5,1,'wilson.troy87@example.net',1,0,0,0,NULL,NULL,NULL,NULL),(62,93,1,'darenc@spamalot.info',1,0,0,0,NULL,NULL,NULL,NULL),(63,93,1,'cruz.daren@testing.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(64,18,1,'cruz.russell41@fishmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(65,176,1,'shermand10@notmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(66,132,1,'parker.shad@lol.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(67,132,1,'shadp57@testing.com',0,0,0,0,NULL,NULL,NULL,NULL),(68,45,1,'teresawilson92@example.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(69,44,1,'ef.cooper@notmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(70,96,1,'elbertt@testing.com',1,0,0,0,NULL,NULL,NULL,NULL),(71,96,1,'elbertt@sample.info',0,0,0,0,NULL,NULL,NULL,NULL),(72,166,1,'jinazope@notmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(73,166,1,'jk.zope21@sample.info',0,0,0,0,NULL,NULL,NULL,NULL),(74,16,1,'yadav.s.elbert@airmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(75,139,1,'parkerk91@fakemail.info',1,0,0,0,NULL,NULL,NULL,NULL),(76,125,1,'nielsen.ashlie@fishmail.org',1,0,0,0,NULL,NULL,NULL,NULL),(77,159,1,'mller.billy29@testmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(78,102,1,'rbachman-mller15@airmail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(79,126,1,'shadm98@testing.net',1,0,0,0,NULL,NULL,NULL,NULL),(80,126,1,'shadmller@testing.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(81,9,1,'tanyamller@lol.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(82,198,1,'parker.rolando@lol.org',1,0,0,0,NULL,NULL,NULL,NULL),(83,149,1,'dgrant@lol.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(84,40,1,'parker-grant.barry@spamalot.biz',1,0,0,0,NULL,NULL,NULL,NULL),(85,85,1,'fu.parker-grant@mymail.info',1,0,0,0,NULL,NULL,NULL,NULL),(86,192,1,'lawerenceb@testmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(87,192,1,'lbarkley69@sample.net',0,0,0,0,NULL,NULL,NULL,NULL),(88,134,1,'barkley.kenny92@lol.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(89,134,1,'barkley.kenny@testing.biz',0,0,0,0,NULL,NULL,NULL,NULL),(90,113,1,'tw.parker@infomail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(91,59,1,'mcreynolds-parkerw84@example.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(92,110,1,'mcreynolds-parker.norris@spamalot.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(93,147,1,'prentice.herminia@example.net',1,0,0,0,NULL,NULL,NULL,NULL),(94,82,1,'wagnert@testmail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(95,82,1,'trumanwagner@testmail.com',0,0,0,0,NULL,NULL,NULL,NULL),(96,196,1,'kandacewagner62@fakemail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(97,196,1,'kz.wagner@airmail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(98,94,1,'angelikaw@testmail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(99,195,1,'jameson.p.kenny@infomail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(100,195,1,'kennyjameson3@fishmail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(101,173,1,'bjameson@spamalot.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(102,133,1,'jamesonj8@airmail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(103,133,1,'jamesonj@infomail.info',0,0,0,0,NULL,NULL,NULL,NULL),(104,112,1,'samuels.i.nicole4@airmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(105,152,1,'rays@lol.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(106,152,1,'samuels.ray@fakemail.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(107,61,1,'meis62@fakemail.info',1,0,0,0,NULL,NULL,NULL,NULL),(108,54,1,'carylonblackwell-dimitrov@testing.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(109,54,1,'carylonblackwell-dimitrov@mymail.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(110,155,1,'dimitrovr@spamalot.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(111,155,1,'rodrigod11@sample.org',0,0,0,0,NULL,NULL,NULL,NULL),(112,29,1,'dimitrov.o.miguel@fishmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(113,29,1,'migueldimitrov35@airmail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(114,103,1,'winfordj26@notmail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(115,103,1,'wy.jones@testing.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(116,201,1,'parker-jones.iris54@example.info',1,0,0,0,NULL,NULL,NULL,NULL),(117,201,1,'irisp@notmail.com',0,0,0,0,NULL,NULL,NULL,NULL),(118,63,1,'estajones@spamalot.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(119,95,1,'kathlynjones@testing.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(120,95,1,'jones.kathlyn3@mymail.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(121,107,1,'samson.truman@sample.biz',1,0,0,0,NULL,NULL,NULL,NULL),(122,107,1,'samson.truman@testmail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(123,68,1,'samson.delana@fishmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(124,114,1,'lincolns72@testmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(125,70,1,'samson.lincoln@spamalot.org',1,0,0,0,NULL,NULL,NULL,NULL),(126,70,1,'lsamson18@airmail.org',0,0,0,0,NULL,NULL,NULL,NULL),(127,130,1,'justinamller@mymail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(128,140,1,'ashliemller@airmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(129,48,1,'parker.betty35@lol.com',1,0,0,0,NULL,NULL,NULL,NULL),(130,78,1,'aj.prentice-parker@spamalot.info',1,0,0,0,NULL,NULL,NULL,NULL),(131,78,1,'prentice-parker.j.ashley@mymail.co.in',0,0,0,0,NULL,NULL,NULL,NULL),(132,20,1,'reynoldsi@airmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(133,20,1,'iveyr@infomail.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(134,13,1,'russellreynolds35@testing.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(135,13,1,'russellr2@airmail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(136,194,1,'landonterrell60@mymail.com',1,0,0,0,NULL,NULL,NULL,NULL),(137,194,1,'terrelll23@airmail.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(138,131,1,'dimitrov.bernadette@fakemail.org',1,0,0,0,NULL,NULL,NULL,NULL),(139,89,1,'terrell-dimitrov.miguel@notmail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(140,75,1,'lashawndat70@lol.com',1,0,0,0,NULL,NULL,NULL,NULL),(141,75,1,'terrell-dimitrovl@lol.com',0,0,0,0,NULL,NULL,NULL,NULL),(142,121,1,'blackwell.brent@spamalot.biz',1,0,0,0,NULL,NULL,NULL,NULL),(143,189,1,'margaretjameson65@spamalot.org',1,0,0,0,NULL,NULL,NULL,NULL),(144,189,1,'jameson.margaret@infomail.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(145,36,1,'meijameson@infomail.org',1,0,0,0,NULL,NULL,NULL,NULL),(146,26,1,'eleonorjameson@mymail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(147,26,1,'et.jameson52@sample.co.in',0,0,0,0,NULL,NULL,NULL,NULL),(148,171,1,'tobyg37@airmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(149,171,1,'gonzlez.toby35@sample.net',0,0,0,0,NULL,NULL,NULL,NULL),(150,200,1,'blackwell-gonzlez.felisha@fakemail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(151,200,1,'felishab98@spamalot.com',0,0,0,0,NULL,NULL,NULL,NULL),(152,69,1,'allengonzlez70@notmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(153,69,1,'gonzlez.allen60@testing.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(154,180,1,'deforest-coopere@infomail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(155,180,1,'ee.deforest-cooper@fakemail.info',0,0,0,0,NULL,NULL,NULL,NULL),(156,4,1,'teddydeforest-cooper@airmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(157,174,3,'info@northpointdevelopmentschool.org',1,0,0,0,NULL,NULL,NULL,NULL),(158,185,2,'@northpointdevelopmentschool.org',0,0,0,0,NULL,NULL,NULL,NULL),(159,105,3,'info@urbanculture.org',1,0,0,0,NULL,NULL,NULL,NULL),(160,151,2,'billyp74@urbanculture.org',1,0,0,0,NULL,NULL,NULL,NULL),(161,144,3,'service@globalempowerment.org',1,0,0,0,NULL,NULL,NULL,NULL),(162,18,2,'russellcruz@globalempowerment.org',0,0,0,0,NULL,NULL,NULL,NULL),(163,148,3,'info@dallaspartnership.org',1,0,0,0,NULL,NULL,NULL,NULL),(164,104,2,'blackwell.scott15@dallaspartnership.org',1,0,0,0,NULL,NULL,NULL,NULL),(165,90,3,'service@rebeccafellowship.org',1,0,0,0,NULL,NULL,NULL,NULL),(166,86,3,'sales@beechdevelopmenttrust.org',1,0,0,0,NULL,NULL,NULL,NULL),(167,197,2,'eyadav83@beechdevelopmenttrust.org',0,0,0,0,NULL,NULL,NULL,NULL),(168,56,3,'service@kentuckyinitiative.org',1,0,0,0,NULL,NULL,NULL,NULL),(169,189,2,'jamesonm@kentuckyinitiative.org',0,0,0,0,NULL,NULL,NULL,NULL),(170,137,3,'info@aptossustainability.org',1,0,0,0,NULL,NULL,NULL,NULL),(171,34,2,'carlosm4@aptossustainability.org',1,0,0,0,NULL,NULL,NULL,NULL),(172,14,3,'feedback@bltechnologyfund.org',1,0,0,0,NULL,NULL,NULL,NULL),(173,26,2,'81@bltechnologyfund.org',0,0,0,0,NULL,NULL,NULL,NULL),(174,178,3,'sales@sierrasoftwaresolutions.org',1,0,0,0,NULL,NULL,NULL,NULL),(175,186,2,'robertsj87@sierrasoftwaresolutions.org',1,0,0,0,NULL,NULL,NULL,NULL),(176,117,3,'feedback@maincollective.org',1,0,0,0,NULL,NULL,NULL,NULL),(177,85,2,'fu.parker-grant@maincollective.org',0,0,0,0,NULL,NULL,NULL,NULL),(178,157,3,'contact@moxahaladevelopmentalliance.org',1,0,0,0,NULL,NULL,NULL,NULL),(179,57,2,'rolandonielsen@moxahaladevelopmentalliance.org',1,0,0,0,NULL,NULL,NULL,NULL),(180,91,3,'contact@greenpoetry.org',1,0,0,0,NULL,NULL,NULL,NULL),(181,120,2,'meganpatel@greenpoetry.org',0,0,0,0,NULL,NULL,NULL,NULL),(182,79,3,'sales@ogdensburgpoetry.org',1,0,0,0,NULL,NULL,NULL,NULL),(183,37,3,'contact@urbanactionschool.org',1,0,0,0,NULL,NULL,NULL,NULL),(184,36,2,'.28@urbanactionschool.org',0,0,0,0,NULL,NULL,NULL,NULL),(185,46,3,'sales@greeninitiative.org',1,0,0,0,NULL,NULL,NULL,NULL),(186,20,2,'11@greeninitiative.org',0,0,0,0,NULL,NULL,NULL,NULL),(187,50,3,'contact@collegehealthassociation.org',1,0,0,0,NULL,NULL,NULL,NULL),(188,89,2,'miguelterrell-dimitrov@collegehealthassociation.org',0,0,0,0,NULL,NULL,NULL,NULL),(189,NULL,1,'development@example.org',0,0,0,0,NULL,NULL,NULL,NULL),(190,NULL,1,'tournaments@example.org',0,0,0,0,NULL,NULL,NULL,NULL),(191,NULL,1,'celebration@example.org',0,0,0,0,NULL,NULL,NULL,NULL);
+INSERT INTO `civicrm_email` (`id`, `contact_id`, `location_type_id`, `email`, `is_primary`, `is_billing`, `on_hold`, `is_bulkmail`, `hold_date`, `reset_date`, `signature_text`, `signature_html`) VALUES (1,1,1,'fixme.domainemail@example.org',1,0,0,0,NULL,NULL,NULL,NULL),(2,200,1,'delanadeforest29@airmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(3,44,1,'wagner.margaret@sample.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(4,193,1,'bp.mller@fakemail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(5,193,1,'mller.brigette@mymail.co.in',0,0,0,0,NULL,NULL,NULL,NULL),(6,131,1,'scarletj51@sample.net',1,0,0,0,NULL,NULL,NULL,NULL),(7,131,1,'jacobs.g.scarlet@testmail.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(8,34,1,'wattson.shad57@example.info',1,0,0,0,NULL,NULL,NULL,NULL),(9,34,1,'shadw@sample.co.in',0,0,0,0,NULL,NULL,NULL,NULL),(10,153,1,'daz.omar15@testing.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(11,95,1,'olsen.jed18@notmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(12,185,1,'kathlynr@sample.info',1,0,0,0,NULL,NULL,NULL,NULL),(13,27,1,'cooperc@testing.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(14,27,1,'carloscooper@mymail.biz',0,0,0,0,NULL,NULL,NULL,NULL),(15,182,1,'elinab@example.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(16,101,1,'chowski.z.elina@airmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(17,101,1,'elina49@lol.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(18,134,1,'scarletreynolds@spamalot.biz',1,0,0,0,NULL,NULL,NULL,NULL),(19,134,1,'reynolds.scarlet@spamalot.org',0,0,0,0,NULL,NULL,NULL,NULL),(20,97,1,'mo.jacobs@infomail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(21,16,1,'jacobs.santina93@testing.biz',1,0,0,0,NULL,NULL,NULL,NULL),(22,147,1,'damarisjameson79@testing.net',1,0,0,0,NULL,NULL,NULL,NULL),(23,147,1,'jameson.damaris@testing.co.in',0,0,0,0,NULL,NULL,NULL,NULL),(24,180,1,'chowskil@example.info',1,0,0,0,NULL,NULL,NULL,NULL),(25,111,1,'ivanov.o.ray38@airmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(26,183,1,'wilson.elbert@testing.com',1,0,0,0,NULL,NULL,NULL,NULL),(27,183,1,'ewilson@testing.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(28,108,1,'eleonord@fishmail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(29,108,1,'deforest.eleonor32@example.org',0,0,0,0,NULL,NULL,NULL,NULL),(30,76,1,'reynolds.troy53@airmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(31,76,1,'reynoldst@notmail.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(32,135,1,'sg.cooper@testing.org',1,0,0,0,NULL,NULL,NULL,NULL),(33,47,1,'tanyar@lol.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(34,25,1,'kc.daz@mymail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(35,25,1,'kiarad82@mymail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(36,94,1,'mroberts62@airmail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(37,94,1,'roberts.magan@testing.info',0,0,0,0,NULL,NULL,NULL,NULL),(38,30,1,'wagner.i.billy41@fishmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(39,30,1,'bi.wagner22@lol.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(40,22,1,'reynolds.jackson1@notmail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(41,22,1,'jacksonr@fishmail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(42,143,1,'justinachowski@spamalot.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(43,84,1,'justinas@mymail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(44,84,1,'smith.justina@infomail.biz',0,0,0,0,NULL,NULL,NULL,NULL),(45,169,1,'mller.craig40@lol.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(46,169,1,'mller.j.craig@spamalot.org',0,0,0,0,NULL,NULL,NULL,NULL),(47,113,1,'wattson.esta63@example.com',1,0,0,0,NULL,NULL,NULL,NULL),(48,113,1,'wattson.esta@mymail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(49,58,1,'robertson.w.russell89@mymail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(50,176,1,'jeromem@testmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(51,176,1,'jeromemller@testmail.org',0,0,0,0,NULL,NULL,NULL,NULL),(52,60,1,'jacobs.andrew95@fakemail.com',1,0,0,0,NULL,NULL,NULL,NULL),(53,60,1,'ajacobs@lol.co.in',0,0,0,0,NULL,NULL,NULL,NULL),(54,130,1,'lashawndamcreynolds@testmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(55,102,1,'alexiaroberts26@infomail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(56,102,1,'roberts.alexia@infomail.org',0,0,0,0,NULL,NULL,NULL,NULL),(57,66,1,'prenticeb58@testmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(58,32,1,'adamss@mymail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(59,32,1,'adamss12@fakemail.biz',0,0,0,0,NULL,NULL,NULL,NULL),(60,187,1,'allensamson41@spamalot.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(61,187,1,'samson.s.allen@testing.net',0,0,0,0,NULL,NULL,NULL,NULL),(62,151,1,'ashleygonzlez@sample.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(63,151,1,'ashleyg@spamalot.net',0,0,0,0,NULL,NULL,NULL,NULL),(64,31,1,'lincolnmller27@testmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(65,117,1,'barkleyr@fishmail.org',1,0,0,0,NULL,NULL,NULL,NULL),(66,64,1,'ivanov.elizabeth@sample.net',1,0,0,0,NULL,NULL,NULL,NULL),(67,87,1,'yadav.v.magan75@fakemail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(68,70,1,'lashawndac62@example.com',1,0,0,0,NULL,NULL,NULL,NULL),(69,192,1,'kaceym@fishmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(70,192,1,'kaceymller@example.info',0,0,0,0,NULL,NULL,NULL,NULL),(71,197,1,'bryonroberts8@mymail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(72,21,1,'grantm@infomail.net',1,0,0,0,NULL,NULL,NULL,NULL),(73,21,1,'meigrant2@mymail.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(74,105,1,'oblackwell@notmail.org',1,0,0,0,NULL,NULL,NULL,NULL),(75,148,1,'rodrigoblackwell@spamalot.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(76,132,1,'rsamson24@sample.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(77,132,1,'rays34@sample.org',0,0,0,0,NULL,NULL,NULL,NULL),(78,145,1,'samson.teresa@notmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(79,145,1,'tsamson25@fakemail.com',0,0,0,0,NULL,NULL,NULL,NULL),(80,121,1,'samsont@testmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(81,121,1,'samson.teresa@testmail.net',0,0,0,0,NULL,NULL,NULL,NULL),(82,49,1,'olsens@testmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(83,154,1,'olsen.valene8@testing.biz',1,0,0,0,NULL,NULL,NULL,NULL),(84,154,1,'olsen.u.valene30@mymail.biz',0,0,0,0,NULL,NULL,NULL,NULL),(85,190,1,'olsen.ray60@airmail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(86,190,1,'olsen.ray8@lol.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(87,77,1,'brigetteolsen@sample.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(88,77,1,'olsen.brigette87@fakemail.org',0,0,0,0,NULL,NULL,NULL,NULL),(89,198,1,'teddygrant@fishmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(90,79,1,'nielsen.o.shauna64@mymail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(91,29,1,'allangrant-nielsen44@mymail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(92,63,1,'meigrant-nielsen9@mymail.com',1,0,0,0,NULL,NULL,NULL,NULL),(93,63,1,'grant-nielsenm@fakemail.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(94,127,1,'blackwell.russell55@testmail.org',1,0,0,0,NULL,NULL,NULL,NULL),(95,86,1,'blackwell-jameson.kacey@mymail.info',1,0,0,0,NULL,NULL,NULL,NULL),(96,201,1,'parker.q.teddy48@mymail.info',1,0,0,0,NULL,NULL,NULL,NULL),(97,43,1,'barryp72@airmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(98,43,1,'bh.parker@infomail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(99,55,1,'scottp@fishmail.org',1,0,0,0,NULL,NULL,NULL,NULL),(100,55,1,'parker.y.scott35@example.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(101,48,1,'yadav.craig4@infomail.org',1,0,0,0,NULL,NULL,NULL,NULL),(102,65,1,'yadav.ashlie43@fishmail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(103,65,1,'yadava@spamalot.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(104,128,1,'carylonyadav70@spamalot.com',1,0,0,0,NULL,NULL,NULL,NULL),(105,118,1,'erikmller6@spamalot.info',1,0,0,0,NULL,NULL,NULL,NULL),(106,118,1,'erikmller63@infomail.com',0,0,0,0,NULL,NULL,NULL,NULL),(107,115,1,'dr.parker12@fakemail.org',1,0,0,0,NULL,NULL,NULL,NULL),(108,115,1,'parkerd@sample.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(109,41,1,'mller-parker.troy51@airmail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(110,36,1,'mller-parker.rosario96@notmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(111,36,1,'rosariomller-parker@sample.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(112,93,1,'rayterrell@example.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(113,93,1,'rayterrell@lol.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(114,68,1,'tobyterrell-olsen@sample.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(115,68,1,'terrell-olsen.toby72@example.biz',0,0,0,0,NULL,NULL,NULL,NULL),(116,157,1,'terrell-olsenj43@testmail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(117,126,1,'ez.nielsen-chowski@fishmail.net',1,0,0,0,NULL,NULL,NULL,NULL),(118,53,1,'tanyanielsen-chowski39@notmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(119,53,1,'tanyanielsen-chowski35@fishmail.co.in',0,0,0,0,NULL,NULL,NULL,NULL),(120,13,1,'rolanddaz18@testmail.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(121,13,1,'daz.roland76@lol.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(122,110,1,'teresad@airmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(123,110,1,'tg.daz@example.net',0,0,0,0,NULL,NULL,NULL,NULL),(124,54,1,'dazk@notmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(125,119,1,'samuels.daren@example.org',1,0,0,0,NULL,NULL,NULL,NULL),(126,186,1,'samuels.troy@mymail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(127,103,1,'shermans@fishmail.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(128,172,1,'jones.teddy7@sample.org',1,0,0,0,NULL,NULL,NULL,NULL),(129,172,1,'jones.teddy@airmail.info',0,0,0,0,NULL,NULL,NULL,NULL),(130,15,1,'jones.jina87@fakemail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(131,156,1,'teresaj@infomail.info',1,0,0,0,NULL,NULL,NULL,NULL),(132,156,1,'jonest@notmail.info',0,0,0,0,NULL,NULL,NULL,NULL),(133,24,1,'robertson.erik35@infomail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(134,24,1,'robertson.erik55@fishmail.co.pl',0,0,0,0,NULL,NULL,NULL,NULL),(135,89,1,'cruzs@testing.net',1,0,0,0,NULL,NULL,NULL,NULL),(136,71,1,'rmller@testing.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(137,59,1,'olsen-mllerk78@mymail.org',1,0,0,0,NULL,NULL,NULL,NULL),(138,59,1,'kolsen-mller@infomail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(139,10,1,'mllerb@lol.co.in',1,0,0,0,NULL,NULL,NULL,NULL),(140,178,1,'jaym14@testmail.info',1,0,0,0,NULL,NULL,NULL,NULL),(141,50,1,'radams57@spamalot.co.nz',1,0,0,0,NULL,NULL,NULL,NULL),(142,124,1,'sharyna@lol.com',1,0,0,0,NULL,NULL,NULL,NULL),(143,81,1,'kathlynadams@lol.com',1,0,0,0,NULL,NULL,NULL,NULL),(144,81,1,'kathlynadams@airmail.co.in',0,0,0,0,NULL,NULL,NULL,NULL),(145,144,1,'shermanwagner@mymail.info',1,0,0,0,NULL,NULL,NULL,NULL),(146,6,1,'wagnern@infomail.biz',1,0,0,0,NULL,NULL,NULL,NULL),(147,146,1,'wagner.teresa@notmail.net',1,0,0,0,NULL,NULL,NULL,NULL),(148,146,1,'wagner.teresa@notmail.co.in',0,0,0,0,NULL,NULL,NULL,NULL),(149,138,1,'vbarkley@notmail.co.uk',1,0,0,0,NULL,NULL,NULL,NULL),(150,138,1,'barkleyv@notmail.co.nz',0,0,0,0,NULL,NULL,NULL,NULL),(151,120,1,'craigj@airmail.co.pl',1,0,0,0,NULL,NULL,NULL,NULL),(152,62,1,'jacobs.miguel35@example.net',1,0,0,0,NULL,NULL,NULL,NULL),(153,62,1,'mjacobs@notmail.co.uk',0,0,0,0,NULL,NULL,NULL,NULL),(154,45,1,'jacobse@testmail.com',1,0,0,0,NULL,NULL,NULL,NULL),(155,69,3,'info@idahoadvocacyacademy.org',1,0,0,0,NULL,NULL,NULL,NULL),(156,174,2,'arlyned@idahoadvocacyacademy.org',1,0,0,0,NULL,NULL,NULL,NULL),(157,39,3,'service@wardensvilleempowerment.org',1,0,0,0,NULL,NULL,NULL,NULL),(158,42,2,'caryloncruz-samuels@wardensvilleempowerment.org',1,0,0,0,NULL,NULL,NULL,NULL),(159,78,3,'contact@beechpoetryassociation.org',1,0,0,0,NULL,NULL,NULL,NULL),(160,172,2,'jones.teddy34@beechpoetryassociation.org',0,0,0,0,NULL,NULL,NULL,NULL),(161,98,3,'info@kentuckypoetry.org',1,0,0,0,NULL,NULL,NULL,NULL),(162,80,3,'contact@alaskapoetrysystems.org',1,0,0,0,NULL,NULL,NULL,NULL),(163,159,2,'elinarobertson81@alaskapoetrysystems.org',1,0,0,0,NULL,NULL,NULL,NULL),(164,196,3,'service@urbanenvironmentalfund.org',1,0,0,0,NULL,NULL,NULL,NULL),(165,71,2,'russellmller@urbanenvironmentalfund.org',0,0,0,0,NULL,NULL,NULL,NULL),(166,142,3,'contact@hartlandempowerment.org',1,0,0,0,NULL,NULL,NULL,NULL),(167,32,2,'.@hartlandempowerment.org',0,0,0,0,NULL,NULL,NULL,NULL),(168,38,3,'service@washingtonservices.org',1,0,0,0,NULL,NULL,NULL,NULL),(169,45,2,'jacobs.erik31@washingtonservices.org',0,0,0,0,NULL,NULL,NULL,NULL),(170,189,3,'info@lincolnsoftwareassociation.org',1,0,0,0,NULL,NULL,NULL,NULL),(171,119,2,'samuels.i.daren@lincolnsoftwareassociation.org',0,0,0,0,NULL,NULL,NULL,NULL),(172,162,3,'service@grotonadvocacy.org',1,0,0,0,NULL,NULL,NULL,NULL),(173,178,2,'mller.v.jay@grotonadvocacy.org',0,0,0,0,NULL,NULL,NULL,NULL),(174,3,3,'info@globalinitiative.org',1,0,0,0,NULL,NULL,NULL,NULL),(175,192,2,'59@globalinitiative.org',0,0,0,0,NULL,NULL,NULL,NULL),(176,4,3,'contact@creativeschool.org',1,0,0,0,NULL,NULL,NULL,NULL),(177,118,2,'mller.erik59@creativeschool.org',0,0,0,0,NULL,NULL,NULL,NULL),(178,61,3,'feedback@nhfoodfellowship.org',1,0,0,0,NULL,NULL,NULL,NULL),(179,13,2,'rdaz28@nhfoodfellowship.org',0,0,0,0,NULL,NULL,NULL,NULL),(180,104,3,'info@pinecenter.org',1,0,0,0,NULL,NULL,NULL,NULL),(181,113,2,'@pinecenter.org',0,0,0,0,NULL,NULL,NULL,NULL),(182,NULL,1,'development@example.org',0,0,0,0,NULL,NULL,NULL,NULL),(183,NULL,1,'tournaments@example.org',0,0,0,0,NULL,NULL,NULL,NULL),(184,NULL,1,'celebration@example.org',0,0,0,0,NULL,NULL,NULL,NULL);
 /*!40000 ALTER TABLE `civicrm_email` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -447,7 +447,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_entity_financial_trxn` WRITE;
 /*!40000 ALTER TABLE `civicrm_entity_financial_trxn` DISABLE KEYS */;
-INSERT INTO `civicrm_entity_financial_trxn` (`id`, `entity_table`, `entity_id`, `financial_trxn_id`, `amount`) VALUES (1,'civicrm_contribution',1,1,125.00),(2,'civicrm_financial_item',1,1,125.00),(3,'civicrm_contribution',2,2,50.00),(4,'civicrm_financial_item',2,2,50.00),(5,'civicrm_contribution',3,3,25.00),(6,'civicrm_financial_item',3,3,25.00),(7,'civicrm_contribution',4,4,50.00),(8,'civicrm_financial_item',4,4,50.00),(9,'civicrm_contribution',5,5,500.00),(10,'civicrm_financial_item',5,5,500.00),(11,'civicrm_contribution',6,6,175.00),(12,'civicrm_financial_item',6,6,175.00),(13,'civicrm_contribution',7,7,50.00),(14,'civicrm_financial_item',7,7,50.00),(15,'civicrm_contribution',8,8,10.00),(16,'civicrm_financial_item',8,8,10.00),(17,'civicrm_contribution',9,9,250.00),(18,'civicrm_financial_item',9,9,250.00),(19,'civicrm_contribution',10,10,500.00),(20,'civicrm_financial_item',10,10,500.00),(21,'civicrm_contribution',11,11,200.00),(22,'civicrm_financial_item',11,11,200.00),(23,'civicrm_contribution',12,12,200.00),(24,'civicrm_financial_item',12,12,200.00),(25,'civicrm_contribution',13,13,200.00),(26,'civicrm_financial_item',13,13,200.00),(27,'civicrm_contribution',14,14,100.00),(28,'civicrm_financial_item',14,14,100.00),(29,'civicrm_contribution',15,15,100.00),(30,'civicrm_financial_item',15,15,100.00),(31,'civicrm_contribution',16,16,100.00),(32,'civicrm_financial_item',16,16,100.00),(33,'civicrm_contribution',17,17,100.00),(34,'civicrm_financial_item',17,17,100.00),(35,'civicrm_contribution',18,18,100.00),(36,'civicrm_financial_item',18,18,100.00),(37,'civicrm_contribution',19,19,100.00),(38,'civicrm_financial_item',19,19,100.00),(39,'civicrm_contribution',20,20,100.00),(40,'civicrm_financial_item',20,20,100.00),(41,'civicrm_contribution',21,21,100.00),(42,'civicrm_financial_item',21,21,100.00),(43,'civicrm_contribution',22,22,100.00),(44,'civicrm_financial_item',22,22,100.00),(45,'civicrm_contribution',23,23,100.00),(46,'civicrm_financial_item',23,23,100.00),(47,'civicrm_contribution',24,24,100.00),(48,'civicrm_financial_item',24,24,100.00),(49,'civicrm_contribution',25,25,100.00),(50,'civicrm_financial_item',25,25,100.00),(51,'civicrm_contribution',26,26,100.00),(52,'civicrm_financial_item',26,26,100.00),(53,'civicrm_contribution',27,27,100.00),(54,'civicrm_financial_item',27,27,100.00),(55,'civicrm_contribution',28,28,100.00),(56,'civicrm_financial_item',28,28,100.00),(57,'civicrm_contribution',29,29,50.00),(58,'civicrm_financial_item',29,29,50.00),(59,'civicrm_contribution',30,30,50.00),(60,'civicrm_financial_item',30,30,50.00),(61,'civicrm_contribution',31,31,50.00),(62,'civicrm_financial_item',31,31,50.00),(63,'civicrm_contribution',32,32,50.00),(64,'civicrm_financial_item',32,32,50.00),(65,'civicrm_contribution',33,33,50.00),(66,'civicrm_financial_item',33,33,50.00),(67,'civicrm_contribution',34,34,50.00),(68,'civicrm_financial_item',34,34,50.00),(69,'civicrm_contribution',35,35,50.00),(70,'civicrm_financial_item',35,35,50.00),(71,'civicrm_contribution',36,36,50.00),(72,'civicrm_financial_item',36,36,50.00),(73,'civicrm_contribution',37,37,50.00),(74,'civicrm_financial_item',37,37,50.00),(75,'civicrm_contribution',38,38,50.00),(76,'civicrm_financial_item',38,38,50.00),(77,'civicrm_contribution',39,39,50.00),(78,'civicrm_financial_item',39,39,50.00),(79,'civicrm_contribution',40,40,50.00),(80,'civicrm_financial_item',40,40,50.00),(81,'civicrm_contribution',41,41,50.00),(82,'civicrm_financial_item',41,41,50.00),(83,'civicrm_contribution',42,42,1200.00),(84,'civicrm_financial_item',42,42,1200.00),(85,'civicrm_contribution',43,43,1200.00),(86,'civicrm_financial_item',43,43,1200.00),(87,'civicrm_contribution',86,44,50.00),(88,'civicrm_financial_item',44,44,50.00),(89,'civicrm_contribution',64,45,50.00),(90,'civicrm_financial_item',45,45,50.00),(91,'civicrm_contribution',59,46,50.00),(92,'civicrm_financial_item',46,46,50.00),(93,'civicrm_contribution',81,47,50.00),(94,'civicrm_financial_item',47,47,50.00),(95,'civicrm_contribution',76,48,50.00),(96,'civicrm_financial_item',48,48,50.00),(97,'civicrm_contribution',92,49,50.00),(98,'civicrm_financial_item',49,49,50.00),(99,'civicrm_contribution',66,50,50.00),(100,'civicrm_financial_item',50,50,50.00),(101,'civicrm_contribution',70,51,50.00),(102,'civicrm_financial_item',51,51,50.00),(103,'civicrm_contribution',49,52,50.00),(104,'civicrm_financial_item',52,52,50.00),(105,'civicrm_contribution',77,53,50.00),(106,'civicrm_financial_item',53,53,50.00),(107,'civicrm_contribution',79,54,50.00),(108,'civicrm_financial_item',54,54,50.00),(109,'civicrm_contribution',78,55,50.00),(110,'civicrm_financial_item',55,55,50.00),(111,'civicrm_contribution',48,56,50.00),(112,'civicrm_financial_item',56,56,50.00),(113,'civicrm_contribution',93,57,50.00),(114,'civicrm_financial_item',57,57,50.00),(115,'civicrm_contribution',68,58,50.00),(116,'civicrm_financial_item',58,58,50.00),(117,'civicrm_contribution',72,59,50.00),(118,'civicrm_financial_item',59,59,50.00),(119,'civicrm_contribution',67,60,800.00),(120,'civicrm_financial_item',60,60,800.00),(121,'civicrm_contribution',83,61,800.00),(122,'civicrm_financial_item',61,61,800.00),(123,'civicrm_contribution',62,62,800.00),(124,'civicrm_financial_item',62,62,800.00),(125,'civicrm_contribution',54,63,800.00),(126,'civicrm_financial_item',63,63,800.00),(127,'civicrm_contribution',47,64,800.00),(128,'civicrm_financial_item',64,64,800.00),(129,'civicrm_contribution',84,65,800.00),(130,'civicrm_financial_item',65,65,800.00),(131,'civicrm_contribution',55,66,800.00),(132,'civicrm_financial_item',66,66,800.00),(133,'civicrm_contribution',52,67,800.00),(134,'civicrm_financial_item',67,67,800.00),(135,'civicrm_contribution',90,68,800.00),(136,'civicrm_financial_item',68,68,800.00),(137,'civicrm_contribution',89,69,800.00),(138,'civicrm_financial_item',69,69,800.00),(139,'civicrm_contribution',46,70,800.00),(140,'civicrm_financial_item',70,70,800.00),(141,'civicrm_contribution',61,71,800.00),(142,'civicrm_financial_item',71,71,800.00),(143,'civicrm_contribution',57,72,800.00),(144,'civicrm_financial_item',72,72,800.00),(145,'civicrm_contribution',94,73,800.00),(146,'civicrm_financial_item',73,73,800.00),(147,'civicrm_contribution',80,74,800.00),(148,'civicrm_financial_item',74,74,800.00),(149,'civicrm_contribution',63,75,800.00),(150,'civicrm_financial_item',75,75,800.00),(151,'civicrm_contribution',75,76,800.00),(152,'civicrm_financial_item',76,76,800.00),(153,'civicrm_contribution',73,77,800.00),(154,'civicrm_financial_item',77,77,800.00),(155,'civicrm_contribution',82,78,50.00),(156,'civicrm_financial_item',78,78,50.00),(157,'civicrm_contribution',71,79,50.00),(158,'civicrm_financial_item',79,79,50.00),(159,'civicrm_contribution',87,80,50.00),(160,'civicrm_financial_item',80,80,50.00),(161,'civicrm_contribution',88,81,50.00),(162,'civicrm_financial_item',81,81,50.00),(163,'civicrm_contribution',60,82,50.00),(164,'civicrm_financial_item',82,82,50.00),(165,'civicrm_contribution',74,83,50.00),(166,'civicrm_financial_item',83,83,50.00),(167,'civicrm_contribution',45,84,50.00),(168,'civicrm_financial_item',84,84,50.00),(169,'civicrm_contribution',58,85,50.00),(170,'civicrm_financial_item',85,85,50.00),(171,'civicrm_contribution',50,86,50.00),(172,'civicrm_financial_item',86,86,50.00),(173,'civicrm_contribution',53,87,50.00),(174,'civicrm_financial_item',87,87,50.00),(175,'civicrm_contribution',56,88,50.00),(176,'civicrm_financial_item',88,88,50.00),(177,'civicrm_contribution',85,89,50.00),(178,'civicrm_financial_item',89,89,50.00),(179,'civicrm_contribution',51,90,50.00),(180,'civicrm_financial_item',90,90,50.00),(181,'civicrm_contribution',69,91,50.00),(182,'civicrm_financial_item',91,91,50.00),(183,'civicrm_contribution',65,92,50.00),(184,'civicrm_financial_item',92,92,50.00),(185,'civicrm_contribution',91,93,50.00),(186,'civicrm_financial_item',93,93,50.00);
+INSERT INTO `civicrm_entity_financial_trxn` (`id`, `entity_table`, `entity_id`, `financial_trxn_id`, `amount`) VALUES (1,'civicrm_contribution',1,1,125.00),(2,'civicrm_financial_item',1,1,125.00),(3,'civicrm_contribution',2,2,50.00),(4,'civicrm_financial_item',2,2,50.00),(5,'civicrm_contribution',3,3,25.00),(6,'civicrm_financial_item',3,3,25.00),(7,'civicrm_contribution',4,4,50.00),(8,'civicrm_financial_item',4,4,50.00),(9,'civicrm_contribution',5,5,500.00),(10,'civicrm_financial_item',5,5,500.00),(11,'civicrm_contribution',6,6,175.00),(12,'civicrm_financial_item',6,6,175.00),(13,'civicrm_contribution',7,7,50.00),(14,'civicrm_financial_item',7,7,50.00),(15,'civicrm_contribution',8,8,10.00),(16,'civicrm_financial_item',8,8,10.00),(17,'civicrm_contribution',9,9,250.00),(18,'civicrm_financial_item',9,9,250.00),(19,'civicrm_contribution',10,10,500.00),(20,'civicrm_financial_item',10,10,500.00),(21,'civicrm_contribution',11,11,200.00),(22,'civicrm_financial_item',11,11,200.00),(23,'civicrm_contribution',12,12,200.00),(24,'civicrm_financial_item',12,12,200.00),(25,'civicrm_contribution',13,13,200.00),(26,'civicrm_financial_item',13,13,200.00),(27,'civicrm_contribution',14,14,100.00),(28,'civicrm_financial_item',14,14,100.00),(29,'civicrm_contribution',15,15,100.00),(30,'civicrm_financial_item',15,15,100.00),(31,'civicrm_contribution',16,16,100.00),(32,'civicrm_financial_item',16,16,100.00),(33,'civicrm_contribution',17,17,100.00),(34,'civicrm_financial_item',17,17,100.00),(35,'civicrm_contribution',18,18,100.00),(36,'civicrm_financial_item',18,18,100.00),(37,'civicrm_contribution',19,19,100.00),(38,'civicrm_financial_item',19,19,100.00),(39,'civicrm_contribution',20,20,100.00),(40,'civicrm_financial_item',20,20,100.00),(41,'civicrm_contribution',21,21,100.00),(42,'civicrm_financial_item',21,21,100.00),(43,'civicrm_contribution',22,22,100.00),(44,'civicrm_financial_item',22,22,100.00),(45,'civicrm_contribution',23,23,100.00),(46,'civicrm_financial_item',23,23,100.00),(47,'civicrm_contribution',24,24,100.00),(48,'civicrm_financial_item',24,24,100.00),(49,'civicrm_contribution',25,25,100.00),(50,'civicrm_financial_item',25,25,100.00),(51,'civicrm_contribution',26,26,100.00),(52,'civicrm_financial_item',26,26,100.00),(53,'civicrm_contribution',27,27,100.00),(54,'civicrm_financial_item',27,27,100.00),(55,'civicrm_contribution',28,28,100.00),(56,'civicrm_financial_item',28,28,100.00),(57,'civicrm_contribution',29,29,100.00),(58,'civicrm_financial_item',29,29,100.00),(59,'civicrm_contribution',30,30,50.00),(60,'civicrm_financial_item',30,30,50.00),(61,'civicrm_contribution',31,31,50.00),(62,'civicrm_financial_item',31,31,50.00),(63,'civicrm_contribution',32,32,50.00),(64,'civicrm_financial_item',32,32,50.00),(65,'civicrm_contribution',33,33,50.00),(66,'civicrm_financial_item',33,33,50.00),(67,'civicrm_contribution',34,34,50.00),(68,'civicrm_financial_item',34,34,50.00),(69,'civicrm_contribution',35,35,50.00),(70,'civicrm_financial_item',35,35,50.00),(71,'civicrm_contribution',36,36,50.00),(72,'civicrm_financial_item',36,36,50.00),(73,'civicrm_contribution',37,37,50.00),(74,'civicrm_financial_item',37,37,50.00),(75,'civicrm_contribution',38,38,50.00),(76,'civicrm_financial_item',38,38,50.00),(77,'civicrm_contribution',39,39,50.00),(78,'civicrm_financial_item',39,39,50.00),(79,'civicrm_contribution',40,40,50.00),(80,'civicrm_financial_item',40,40,50.00),(81,'civicrm_contribution',41,41,50.00),(82,'civicrm_financial_item',41,41,50.00),(83,'civicrm_contribution',42,42,1200.00),(84,'civicrm_financial_item',42,42,1200.00),(85,'civicrm_contribution',43,43,1200.00),(86,'civicrm_financial_item',43,43,1200.00),(87,'civicrm_contribution',52,44,50.00),(88,'civicrm_financial_item',44,44,50.00),(89,'civicrm_contribution',82,45,50.00),(90,'civicrm_financial_item',45,45,50.00),(91,'civicrm_contribution',89,46,50.00),(92,'civicrm_financial_item',46,46,50.00),(93,'civicrm_contribution',93,47,50.00),(94,'civicrm_financial_item',47,47,50.00),(95,'civicrm_contribution',84,48,50.00),(96,'civicrm_financial_item',48,48,50.00),(97,'civicrm_contribution',51,49,50.00),(98,'civicrm_financial_item',49,49,50.00),(99,'civicrm_contribution',64,50,50.00),(100,'civicrm_financial_item',50,50,50.00),(101,'civicrm_contribution',94,51,50.00),(102,'civicrm_financial_item',51,51,50.00),(103,'civicrm_contribution',54,52,50.00),(104,'civicrm_financial_item',52,52,50.00),(105,'civicrm_contribution',80,53,50.00),(106,'civicrm_financial_item',53,53,50.00),(107,'civicrm_contribution',69,54,50.00),(108,'civicrm_financial_item',54,54,50.00),(109,'civicrm_contribution',77,55,50.00),(110,'civicrm_financial_item',55,55,50.00),(111,'civicrm_contribution',66,56,50.00),(112,'civicrm_financial_item',56,56,50.00),(113,'civicrm_contribution',62,57,50.00),(114,'civicrm_financial_item',57,57,50.00),(115,'civicrm_contribution',78,58,50.00),(116,'civicrm_financial_item',58,58,50.00),(117,'civicrm_contribution',90,59,50.00),(118,'civicrm_financial_item',59,59,50.00),(119,'civicrm_contribution',79,60,800.00),(120,'civicrm_financial_item',60,60,800.00),(121,'civicrm_contribution',47,61,800.00),(122,'civicrm_financial_item',61,61,800.00),(123,'civicrm_contribution',46,62,800.00),(124,'civicrm_financial_item',62,62,800.00),(125,'civicrm_contribution',75,63,800.00),(126,'civicrm_financial_item',63,63,800.00),(127,'civicrm_contribution',63,64,800.00),(128,'civicrm_financial_item',64,64,800.00),(129,'civicrm_contribution',73,65,800.00),(130,'civicrm_financial_item',65,65,800.00),(131,'civicrm_contribution',55,66,800.00),(132,'civicrm_financial_item',66,66,800.00),(133,'civicrm_contribution',65,67,800.00),(134,'civicrm_financial_item',67,67,800.00),(135,'civicrm_contribution',49,68,800.00),(136,'civicrm_financial_item',68,68,800.00),(137,'civicrm_contribution',74,69,800.00),(138,'civicrm_financial_item',69,69,800.00),(139,'civicrm_contribution',70,70,800.00),(140,'civicrm_financial_item',70,70,800.00),(141,'civicrm_contribution',88,71,800.00),(142,'civicrm_financial_item',71,71,800.00),(143,'civicrm_contribution',59,72,800.00),(144,'civicrm_financial_item',72,72,800.00),(145,'civicrm_contribution',87,73,800.00),(146,'civicrm_financial_item',73,73,800.00),(147,'civicrm_contribution',58,74,800.00),(148,'civicrm_financial_item',74,74,800.00),(149,'civicrm_contribution',45,75,800.00),(150,'civicrm_financial_item',75,75,800.00),(151,'civicrm_contribution',56,76,800.00),(152,'civicrm_financial_item',76,76,800.00),(153,'civicrm_contribution',83,77,800.00),(154,'civicrm_financial_item',77,77,800.00),(155,'civicrm_contribution',61,78,50.00),(156,'civicrm_financial_item',78,78,50.00),(157,'civicrm_contribution',71,79,50.00),(158,'civicrm_financial_item',79,79,50.00),(159,'civicrm_contribution',85,80,50.00),(160,'civicrm_financial_item',80,80,50.00),(161,'civicrm_contribution',67,81,50.00),(162,'civicrm_financial_item',81,81,50.00),(163,'civicrm_contribution',86,82,50.00),(164,'civicrm_financial_item',82,82,50.00),(165,'civicrm_contribution',48,83,50.00),(166,'civicrm_financial_item',83,83,50.00),(167,'civicrm_contribution',50,84,50.00),(168,'civicrm_financial_item',84,84,50.00),(169,'civicrm_contribution',53,85,50.00),(170,'civicrm_financial_item',85,85,50.00),(171,'civicrm_contribution',60,86,50.00),(172,'civicrm_financial_item',86,86,50.00),(173,'civicrm_contribution',72,87,50.00),(174,'civicrm_financial_item',87,87,50.00),(175,'civicrm_contribution',57,88,50.00),(176,'civicrm_financial_item',88,88,50.00),(177,'civicrm_contribution',92,89,50.00),(178,'civicrm_financial_item',89,89,50.00),(179,'civicrm_contribution',68,90,50.00),(180,'civicrm_financial_item',90,90,50.00),(181,'civicrm_contribution',91,91,50.00),(182,'civicrm_financial_item',91,91,50.00),(183,'civicrm_contribution',76,92,50.00),(184,'civicrm_financial_item',92,92,50.00),(185,'civicrm_contribution',81,93,50.00),(186,'civicrm_financial_item',93,93,50.00);
 /*!40000 ALTER TABLE `civicrm_entity_financial_trxn` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -457,7 +457,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_entity_tag` WRITE;
 /*!40000 ALTER TABLE `civicrm_entity_tag` DISABLE KEYS */;
-INSERT INTO `civicrm_entity_tag` (`id`, `entity_table`, `entity_id`, `tag_id`) VALUES (58,'civicrm_contact',6,4),(59,'civicrm_contact',6,5),(40,'civicrm_contact',8,5),(101,'civicrm_contact',10,5),(6,'civicrm_contact',14,3),(18,'civicrm_contact',15,4),(19,'civicrm_contact',15,5),(13,'civicrm_contact',17,5),(108,'civicrm_contact',20,4),(55,'civicrm_contact',23,5),(121,'civicrm_contact',25,5),(88,'civicrm_contact',28,4),(49,'civicrm_contact',30,4),(50,'civicrm_contact',30,5),(79,'civicrm_contact',34,4),(115,'civicrm_contact',36,4),(116,'civicrm_contact',36,5),(75,'civicrm_contact',40,4),(113,'civicrm_contact',42,4),(114,'civicrm_contact',42,5),(62,'civicrm_contact',44,4),(10,'civicrm_contact',46,1),(47,'civicrm_contact',55,4),(80,'civicrm_contact',59,4),(45,'civicrm_contact',60,4),(46,'civicrm_contact',60,5),(5,'civicrm_contact',62,3),(96,'civicrm_contact',63,4),(97,'civicrm_contact',63,5),(48,'civicrm_contact',64,4),(25,'civicrm_contact',66,4),(26,'civicrm_contact',66,5),(29,'civicrm_contact',67,5),(119,'civicrm_contact',69,4),(120,'civicrm_contact',69,5),(41,'civicrm_contact',71,5),(68,'civicrm_contact',74,5),(24,'civicrm_contact',76,4),(104,'civicrm_contact',78,4),(105,'civicrm_contact',78,5),(9,'civicrm_contact',79,3),(61,'civicrm_contact',80,5),(16,'civicrm_contact',81,4),(17,'civicrm_contact',81,5),(84,'civicrm_contact',82,5),(4,'civicrm_contact',86,1),(53,'civicrm_contact',87,4),(54,'civicrm_contact',87,5),(110,'civicrm_contact',89,5),(8,'civicrm_contact',91,1),(56,'civicrm_contact',93,4),(57,'civicrm_contact',93,5),(85,'civicrm_contact',94,4),(36,'civicrm_contact',97,4),(14,'civicrm_contact',99,4),(15,'civicrm_contact',99,5),(95,'civicrm_contact',103,5),(111,'civicrm_contact',104,4),(2,'civicrm_contact',105,1),(98,'civicrm_contact',107,5),(92,'civicrm_contact',108,4),(93,'civicrm_contact',108,5),(99,'civicrm_contact',114,4),(100,'civicrm_contact',114,5),(7,'civicrm_contact',117,1),(22,'civicrm_contact',120,4),(23,'civicrm_contact',120,5),(112,'civicrm_contact',121,4),(34,'civicrm_contact',122,5),(42,'civicrm_contact',123,4),(43,'civicrm_contact',123,5),(12,'civicrm_contact',124,5),(71,'civicrm_contact',126,4),(72,'civicrm_contact',126,5),(32,'civicrm_contact',129,4),(33,'civicrm_contact',129,5),(78,'civicrm_contact',134,5),(106,'civicrm_contact',135,4),(107,'civicrm_contact',135,5),(66,'civicrm_contact',139,5),(102,'civicrm_contact',140,5),(89,'civicrm_contact',141,4),(90,'civicrm_contact',141,5),(1,'civicrm_contact',142,3),(37,'civicrm_contact',143,5),(82,'civicrm_contact',147,4),(83,'civicrm_contact',147,5),(3,'civicrm_contact',148,3),(91,'civicrm_contact',152,5),(35,'civicrm_contact',154,4),(94,'civicrm_contact',155,5),(51,'civicrm_contact',156,4),(52,'civicrm_contact',156,5),(122,'civicrm_contact',158,4),(69,'civicrm_contact',159,4),(70,'civicrm_contact',159,5),(44,'civicrm_contact',161,5),(21,'civicrm_contact',164,4),(64,'civicrm_contact',165,4),(65,'civicrm_contact',165,5),(63,'civicrm_contact',166,5),(27,'civicrm_contact',167,4),(11,'civicrm_contact',169,5),(117,'civicrm_contact',171,4),(118,'civicrm_contact',171,5),(67,'civicrm_contact',172,5),(60,'civicrm_contact',176,4),(20,'civicrm_contact',179,5),(30,'civicrm_contact',183,4),(31,'civicrm_contact',183,5),(38,'civicrm_contact',186,4),(39,'civicrm_contact',186,5),(103,'civicrm_contact',187,4),(28,'civicrm_contact',190,5),(81,'civicrm_contact',191,5),(76,'civicrm_contact',192,4),(77,'civicrm_contact',192,5),(109,'civicrm_contact',194,4),(86,'civicrm_contact',195,4),(87,'civicrm_contact',195,5),(73,'civicrm_contact',198,4),(74,'civicrm_contact',198,5);
+INSERT INTO `civicrm_entity_tag` (`id`, `entity_table`, `entity_id`, `tag_id`) VALUES (108,'civicrm_contact',6,4),(109,'civicrm_contact',6,5),(110,'civicrm_contact',9,4),(111,'civicrm_contact',9,5),(103,'civicrm_contact',10,4),(112,'civicrm_contact',12,4),(113,'civicrm_contact',12,5),(91,'civicrm_contact',13,4),(56,'civicrm_contact',14,4),(47,'civicrm_contact',17,5),(38,'civicrm_contact',20,5),(50,'civicrm_contact',23,4),(99,'civicrm_contact',24,4),(100,'civicrm_contact',24,5),(20,'civicrm_contact',27,4),(21,'civicrm_contact',27,5),(59,'civicrm_contact',28,4),(72,'civicrm_contact',29,5),(41,'civicrm_contact',30,4),(42,'civicrm_contact',30,5),(57,'civicrm_contact',31,4),(55,'civicrm_contact',32,5),(15,'civicrm_contact',34,4),(2,'civicrm_contact',39,3),(84,'civicrm_contact',41,4),(12,'civicrm_contact',44,4),(37,'civicrm_contact',47,5),(80,'civicrm_contact',48,4),(81,'civicrm_contact',48,5),(68,'civicrm_contact',49,4),(104,'civicrm_contact',50,5),(78,'civicrm_contact',55,5),(17,'civicrm_contact',57,4),(18,'civicrm_contact',57,5),(46,'civicrm_contact',58,4),(48,'civicrm_contact',60,4),(49,'civicrm_contact',60,5),(116,'civicrm_contact',62,5),(58,'civicrm_contact',64,4),(82,'civicrm_contact',65,5),(40,'civicrm_contact',67,5),(87,'civicrm_contact',68,4),(1,'civicrm_contact',69,2),(60,'civicrm_contact',70,5),(102,'civicrm_contact',71,4),(34,'civicrm_contact',76,5),(3,'civicrm_contact',78,1),(4,'civicrm_contact',80,3),(105,'civicrm_contact',82,5),(74,'civicrm_contact',86,4),(35,'civicrm_contact',90,4),(36,'civicrm_contact',90,5),(10,'civicrm_contact',91,3),(85,'civicrm_contact',93,4),(86,'civicrm_contact',93,5),(26,'civicrm_contact',97,4),(51,'civicrm_contact',99,4),(52,'civicrm_contact',99,5),(7,'civicrm_contact',100,3),(25,'civicrm_contact',101,5),(53,'civicrm_contact',102,4),(54,'civicrm_contact',102,5),(62,'civicrm_contact',105,4),(63,'civicrm_contact',105,5),(92,'civicrm_contact',110,5),(30,'civicrm_contact',111,4),(31,'civicrm_contact',111,5),(45,'civicrm_contact',113,5),(77,'civicrm_contact',116,5),(83,'civicrm_contact',118,5),(93,'civicrm_contact',119,5),(114,'civicrm_contact',120,4),(115,'civicrm_contact',120,5),(67,'civicrm_contact',121,4),(89,'civicrm_contact',126,4),(90,'civicrm_contact',126,5),(73,'civicrm_contact',127,4),(65,'civicrm_contact',132,4),(66,'civicrm_contact',132,5),(5,'civicrm_contact',142,2),(43,'civicrm_contact',143,5),(106,'civicrm_contact',144,4),(107,'civicrm_contact',144,5),(27,'civicrm_contact',147,4),(28,'civicrm_contact',147,5),(64,'civicrm_contact',148,4),(9,'civicrm_contact',152,1),(79,'civicrm_contact',155,4),(97,'civicrm_contact',156,4),(98,'civicrm_contact',156,5),(11,'civicrm_contact',158,4),(16,'civicrm_contact',163,5),(39,'civicrm_contact',166,5),(88,'civicrm_contact',167,5),(44,'civicrm_contact',169,4),(23,'civicrm_contact',171,4),(24,'civicrm_contact',171,5),(96,'civicrm_contact',172,4),(29,'civicrm_contact',175,5),(8,'civicrm_contact',179,1),(22,'civicrm_contact',182,4),(32,'civicrm_contact',183,4),(33,'civicrm_contact',183,5),(19,'civicrm_contact',185,4),(94,'civicrm_contact',186,4),(95,'civicrm_contact',186,5),(14,'civicrm_contact',188,5),(6,'civicrm_contact',189,2),(69,'civicrm_contact',190,4),(13,'civicrm_contact',193,5),(101,'civicrm_contact',194,4),(61,'civicrm_contact',197,4),(70,'civicrm_contact',198,4),(71,'civicrm_contact',198,5),(75,'civicrm_contact',201,4),(76,'civicrm_contact',201,5);
 /*!40000 ALTER TABLE `civicrm_entity_tag` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -467,7 +467,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_event` WRITE;
 /*!40000 ALTER TABLE `civicrm_event` DISABLE KEYS */;
-INSERT INTO `civicrm_event` (`id`, `title`, `summary`, `description`, `event_type_id`, `participant_listing_id`, `is_public`, `start_date`, `end_date`, `is_online_registration`, `registration_link_text`, `registration_start_date`, `registration_end_date`, `max_participants`, `event_full_text`, `is_monetary`, `financial_type_id`, `payment_processor`, `is_map`, `is_active`, `fee_label`, `is_show_location`, `loc_block_id`, `default_role_id`, `intro_text`, `footer_text`, `confirm_title`, `confirm_text`, `confirm_footer_text`, `is_email_confirm`, `confirm_email_text`, `confirm_from_name`, `confirm_from_email`, `cc_confirm`, `bcc_confirm`, `default_fee_id`, `default_discount_fee_id`, `thankyou_title`, `thankyou_text`, `thankyou_footer_text`, `is_pay_later`, `pay_later_text`, `pay_later_receipt`, `is_partial_payment`, `initial_amount_label`, `initial_amount_help_text`, `min_initial_amount`, `is_multiple_registrations`, `max_additional_participants`, `allow_same_participant_emails`, `has_waitlist`, `requires_approval`, `expiration_time`, `allow_selfcancelxfer`, `selfcancelxfer_time`, `waitlist_text`, `approval_req_text`, `is_template`, `template_title`, `created_id`, `created_date`, `currency`, `campaign_id`, `is_share`, `is_confirm_enabled`, `parent_event_id`, `slot_label_id`, `dedupe_rule_group_id`, `is_billing_required`) VALUES (1,'Fall Fundraiser Dinner','Kick up your heels at our Fall Fundraiser Dinner/Dance at Glen Echo Park! Come by yourself or bring a partner, friend or the entire family!','This event benefits our teen programs. Admission includes a full 3 course meal and wine or soft drinks. Grab your dancing shoes, bring the kids and come join the party!',3,1,1,'2021-01-24 17:00:00','2021-01-26 17:00:00',1,'Register Now',NULL,NULL,100,'Sorry! The Fall Fundraiser Dinner is full. Please call Jane at 204 222-1000 ext 33 if you want to be added to the waiting list.',1,4,NULL,1,1,'Dinner Contribution',1,1,1,'Fill in the information below to join as at this wonderful dinner event.',NULL,'Confirm Your Registration Information','Review the information below carefully.',NULL,1,'Contact the Development Department if you need to make any changes to your registration.','Fundraising Dept.','development@example.org',NULL,NULL,NULL,NULL,'Thanks for Registering!','<p>Thank you for your support. Your contribution will help us build even better tools.</p><p>Please tell your friends and colleagues about this wonderful event.</p>','<p><a href=https://civicrm.org>Back to CiviCRM Home Page</a></p>',1,'I will send payment by check','Send a check payable to Our Organization within 3 business days to hold your reservation. Checks should be sent to: 100 Main St., Suite 3, San Francisco CA 94110',0,NULL,NULL,NULL,1,0,0,NULL,NULL,NULL,0,0,NULL,NULL,0,NULL,NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(2,'Summer Solstice Festival Day Concert','Festival Day is coming! Join us and help support your parks.','We will gather at noon, learn a song all together,  and then join in a joyous procession to the pavilion. We will be one of many groups performing at this wonderful concert which benefits our city parks.',5,1,1,'2020-07-23 12:00:00','2020-07-23 17:00:00',1,'Register Now',NULL,NULL,50,'We have all the singers we can handle. Come to the pavilion anyway and join in from the audience.',1,2,NULL,NULL,1,'Festival Fee',1,2,1,'Complete the form below and click Continue to register online for the festival. Or you can register by calling us at 204 222-1000 ext 22.','','Confirm Your Registration Information','','',1,'This email confirms your registration. If you have questions or need to change your registration - please do not hesitate to call us.','Event Dept.','events@example.org','',NULL,NULL,NULL,'Thanks for Your Joining In!','<p>Thank you for your support. Your participation will help build new parks.</p><p>Please tell your friends and colleagues about the concert.</p>','<p><a href=https://civicrm.org>Back to CiviCRM Home Page</a></p>',0,NULL,NULL,0,NULL,NULL,NULL,1,0,0,NULL,NULL,NULL,0,0,NULL,NULL,0,NULL,NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(3,'Rain-forest Cup Youth Soccer Tournament','Sign up your team to participate in this fun tournament which benefits several Rain-forest protection groups in the Amazon basin.','This is a FYSA Sanctioned Tournament, which is open to all USSF/FIFA affiliated organizations for boys and girls in age groups: U9-U10 (6v6), U11-U12 (8v8), and U13-U17 (Full Sided).',3,1,1,'2021-02-24 07:00:00','2021-02-27 17:00:00',1,'Register Now',NULL,NULL,500,'Sorry! All available team slots for this tournament have been filled. Contact Jill Futbol for information about the waiting list and next years event.',1,4,NULL,NULL,1,'Tournament Fees',1,3,1,'Complete the form below to register your team for this year\'s tournament.','<em>A Soccer Youth Event</em>','Review and Confirm Your Registration Information','','<em>A Soccer Youth Event</em>',1,'Contact our Tournament Director for eligibility details.','Tournament Director','tournament@example.org','',NULL,NULL,NULL,'Thanks for Your Support!','<p>Thank you for your support. Your participation will help save thousands of acres of rainforest.</p>','<p><a href=https://civicrm.org>Back to CiviCRM Home Page</a></p>',0,NULL,NULL,0,NULL,NULL,NULL,0,0,0,NULL,NULL,NULL,0,0,NULL,NULL,0,NULL,NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(4,NULL,NULL,NULL,4,1,1,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,0,1,NULL,1,NULL,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,0,0,NULL,NULL,1,'Free Meeting without Online Registration',NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(5,NULL,NULL,NULL,4,1,1,NULL,NULL,1,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,0,1,NULL,1,NULL,1,NULL,NULL,'Confirm Your Registration Information',NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'Thanks for Registering!',NULL,NULL,0,NULL,NULL,0,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,0,0,NULL,NULL,1,'Free Meeting with Online Registration',NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(6,NULL,NULL,NULL,1,1,1,NULL,NULL,1,NULL,NULL,NULL,NULL,NULL,1,4,NULL,0,1,'Conference Fee',1,NULL,1,NULL,NULL,'Confirm Your Registration Information',NULL,NULL,1,NULL,'Event Template Dept.','event_templates@example.org',NULL,NULL,NULL,NULL,'Thanks for Registering!',NULL,NULL,0,NULL,NULL,0,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,0,0,NULL,NULL,1,'Paid Conference with Online Registration',NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0);
+INSERT INTO `civicrm_event` (`id`, `title`, `summary`, `description`, `event_type_id`, `participant_listing_id`, `is_public`, `start_date`, `end_date`, `is_online_registration`, `registration_link_text`, `registration_start_date`, `registration_end_date`, `max_participants`, `event_full_text`, `is_monetary`, `financial_type_id`, `payment_processor`, `is_map`, `is_active`, `fee_label`, `is_show_location`, `loc_block_id`, `default_role_id`, `intro_text`, `footer_text`, `confirm_title`, `confirm_text`, `confirm_footer_text`, `is_email_confirm`, `confirm_email_text`, `confirm_from_name`, `confirm_from_email`, `cc_confirm`, `bcc_confirm`, `default_fee_id`, `default_discount_fee_id`, `thankyou_title`, `thankyou_text`, `thankyou_footer_text`, `is_pay_later`, `pay_later_text`, `pay_later_receipt`, `is_partial_payment`, `initial_amount_label`, `initial_amount_help_text`, `min_initial_amount`, `is_multiple_registrations`, `max_additional_participants`, `allow_same_participant_emails`, `has_waitlist`, `requires_approval`, `expiration_time`, `allow_selfcancelxfer`, `selfcancelxfer_time`, `waitlist_text`, `approval_req_text`, `is_template`, `template_title`, `created_id`, `created_date`, `currency`, `campaign_id`, `is_share`, `is_confirm_enabled`, `parent_event_id`, `slot_label_id`, `dedupe_rule_group_id`, `is_billing_required`) VALUES (1,'Fall Fundraiser Dinner','Kick up your heels at our Fall Fundraiser Dinner/Dance at Glen Echo Park! Come by yourself or bring a partner, friend or the entire family!','This event benefits our teen programs. Admission includes a full 3 course meal and wine or soft drinks. Grab your dancing shoes, bring the kids and come join the party!',3,1,1,'2021-04-08 17:00:00','2021-04-10 17:00:00',1,'Register Now',NULL,NULL,100,'Sorry! The Fall Fundraiser Dinner is full. Please call Jane at 204 222-1000 ext 33 if you want to be added to the waiting list.',1,4,NULL,1,1,'Dinner Contribution',1,1,1,'Fill in the information below to join as at this wonderful dinner event.',NULL,'Confirm Your Registration Information','Review the information below carefully.',NULL,1,'Contact the Development Department if you need to make any changes to your registration.','Fundraising Dept.','development@example.org',NULL,NULL,NULL,NULL,'Thanks for Registering!','<p>Thank you for your support. Your contribution will help us build even better tools.</p><p>Please tell your friends and colleagues about this wonderful event.</p>','<p><a href=https://civicrm.org>Back to CiviCRM Home Page</a></p>',1,'I will send payment by check','Send a check payable to Our Organization within 3 business days to hold your reservation. Checks should be sent to: 100 Main St., Suite 3, San Francisco CA 94110',0,NULL,NULL,NULL,1,0,0,NULL,NULL,NULL,0,0,NULL,NULL,0,NULL,NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(2,'Summer Solstice Festival Day Concert','Festival Day is coming! Join us and help support your parks.','We will gather at noon, learn a song all together,  and then join in a joyous procession to the pavilion. We will be one of many groups performing at this wonderful concert which benefits our city parks.',5,1,1,'2020-10-07 12:00:00','2020-10-07 17:00:00',1,'Register Now',NULL,NULL,50,'We have all the singers we can handle. Come to the pavilion anyway and join in from the audience.',1,2,NULL,NULL,1,'Festival Fee',1,2,1,'Complete the form below and click Continue to register online for the festival. Or you can register by calling us at 204 222-1000 ext 22.','','Confirm Your Registration Information','','',1,'This email confirms your registration. If you have questions or need to change your registration - please do not hesitate to call us.','Event Dept.','events@example.org','',NULL,NULL,NULL,'Thanks for Your Joining In!','<p>Thank you for your support. Your participation will help build new parks.</p><p>Please tell your friends and colleagues about the concert.</p>','<p><a href=https://civicrm.org>Back to CiviCRM Home Page</a></p>',0,NULL,NULL,0,NULL,NULL,NULL,1,0,0,NULL,NULL,NULL,0,0,NULL,NULL,0,NULL,NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(3,'Rain-forest Cup Youth Soccer Tournament','Sign up your team to participate in this fun tournament which benefits several Rain-forest protection groups in the Amazon basin.','This is a FYSA Sanctioned Tournament, which is open to all USSF/FIFA affiliated organizations for boys and girls in age groups: U9-U10 (6v6), U11-U12 (8v8), and U13-U17 (Full Sided).',3,1,1,'2021-05-08 07:00:00','2021-05-11 17:00:00',1,'Register Now',NULL,NULL,500,'Sorry! All available team slots for this tournament have been filled. Contact Jill Futbol for information about the waiting list and next years event.',1,4,NULL,NULL,1,'Tournament Fees',1,3,1,'Complete the form below to register your team for this year\'s tournament.','<em>A Soccer Youth Event</em>','Review and Confirm Your Registration Information','','<em>A Soccer Youth Event</em>',1,'Contact our Tournament Director for eligibility details.','Tournament Director','tournament@example.org','',NULL,NULL,NULL,'Thanks for Your Support!','<p>Thank you for your support. Your participation will help save thousands of acres of rainforest.</p>','<p><a href=https://civicrm.org>Back to CiviCRM Home Page</a></p>',0,NULL,NULL,0,NULL,NULL,NULL,0,0,0,NULL,NULL,NULL,0,0,NULL,NULL,0,NULL,NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(4,NULL,NULL,NULL,4,1,1,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,0,1,NULL,1,NULL,1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,0,0,NULL,NULL,1,'Free Meeting without Online Registration',NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(5,NULL,NULL,NULL,4,1,1,NULL,NULL,1,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,0,1,NULL,1,NULL,1,NULL,NULL,'Confirm Your Registration Information',NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'Thanks for Registering!',NULL,NULL,0,NULL,NULL,0,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,0,0,NULL,NULL,1,'Free Meeting with Online Registration',NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0),(6,NULL,NULL,NULL,1,1,1,NULL,NULL,1,NULL,NULL,NULL,NULL,NULL,1,4,NULL,0,1,'Conference Fee',1,NULL,1,NULL,NULL,'Confirm Your Registration Information',NULL,NULL,1,NULL,'Event Template Dept.','event_templates@example.org',NULL,NULL,NULL,NULL,'Thanks for Registering!',NULL,NULL,0,NULL,NULL,0,NULL,NULL,NULL,1,0,1,NULL,NULL,NULL,0,0,NULL,NULL,1,'Paid Conference with Online Registration',NULL,NULL,'USD',NULL,1,1,NULL,NULL,NULL,0);
 /*!40000 ALTER TABLE `civicrm_event` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -495,7 +495,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_extension` WRITE;
 /*!40000 ALTER TABLE `civicrm_extension` DISABLE KEYS */;
-INSERT INTO `civicrm_extension` (`id`, `type`, `full_name`, `name`, `label`, `file`, `schema_version`, `is_active`) VALUES (1,'module','sequentialcreditnotes','Sequential credit notes','Sequential credit notes','sequentialcreditnotes',NULL,1),(2,'module','eventcart','Event cart','Event cart','eventcart',NULL,1),(3,'module','financialacls','Financial ACLs','Financial ACLs','financialacls',NULL,1);
+INSERT INTO `civicrm_extension` (`id`, `type`, `full_name`, `name`, `label`, `file`, `schema_version`, `is_active`) VALUES (1,'module','sequentialcreditnotes','Sequential credit notes','Sequential credit notes','sequentialcreditnotes',NULL,1),(2,'module','greenwich','Theme: Greenwich','Theme: Greenwich','greenwich',NULL,1),(3,'module','eventcart','Event cart','Event cart','eventcart',NULL,1),(4,'module','financialacls','Financial ACLs','Financial ACLs','financialacls',NULL,1);
 /*!40000 ALTER TABLE `civicrm_extension` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -524,7 +524,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_financial_item` WRITE;
 /*!40000 ALTER TABLE `civicrm_financial_item` DISABLE KEYS */;
-INSERT INTO `civicrm_financial_item` (`id`, `created_date`, `transaction_date`, `contact_id`, `description`, `amount`, `currency`, `financial_account_id`, `status_id`, `entity_table`, `entity_id`) VALUES (1,'2020-07-24 05:34:04','2010-04-11 00:00:00',2,'Contribution Amount',125.00,'USD',1,1,'civicrm_line_item',1),(2,'2020-07-24 05:34:04','2010-03-21 00:00:00',4,'Contribution Amount',50.00,'USD',1,1,'civicrm_line_item',2),(3,'2020-07-24 05:34:04','2010-04-29 00:00:00',6,'Contribution Amount',25.00,'USD',1,1,'civicrm_line_item',3),(4,'2020-07-24 05:34:04','2010-04-11 00:00:00',8,'Contribution Amount',50.00,'USD',1,1,'civicrm_line_item',4),(5,'2020-07-24 05:34:04','2010-04-15 00:00:00',16,'Contribution Amount',500.00,'USD',1,1,'civicrm_line_item',5),(6,'2020-07-24 05:34:04','2010-04-11 00:00:00',19,'Contribution Amount',175.00,'USD',1,1,'civicrm_line_item',6),(7,'2020-07-24 05:34:04','2010-03-27 00:00:00',82,'Contribution Amount',50.00,'USD',1,1,'civicrm_line_item',7),(8,'2020-07-24 05:34:04','2010-03-08 00:00:00',92,'Contribution Amount',10.00,'USD',1,1,'civicrm_line_item',8),(9,'2020-07-24 05:34:04','2010-04-22 00:00:00',34,'Contribution Amount',250.00,'USD',1,1,'civicrm_line_item',9),(10,'2020-07-24 05:34:04','2009-07-01 11:53:50',71,'Contribution Amount',500.00,'USD',1,1,'civicrm_line_item',10),(11,'2020-07-24 05:34:04','2009-07-01 12:55:41',43,'Contribution Amount',200.00,'USD',1,1,'civicrm_line_item',11),(12,'2020-07-24 05:34:04','2009-10-01 11:53:50',32,'Contribution Amount',200.00,'USD',1,1,'civicrm_line_item',12),(13,'2020-07-24 05:34:04','2009-12-01 12:55:41',32,'Contribution Amount',200.00,'USD',1,1,'civicrm_line_item',13),(14,'2020-07-24 05:34:04','2020-07-24 15:34:04',103,'General',100.00,'USD',2,1,'civicrm_line_item',16),(15,'2020-07-24 05:34:04','2020-07-24 15:34:04',179,'General',100.00,'USD',2,1,'civicrm_line_item',17),(16,'2020-07-24 05:34:04','2020-07-24 15:34:04',12,'General',100.00,'USD',2,1,'civicrm_line_item',18),(17,'2020-07-24 05:34:04','2020-07-24 15:34:04',173,'General',100.00,'USD',2,1,'civicrm_line_item',19),(18,'2020-07-24 05:34:04','2020-07-24 15:34:04',127,'General',100.00,'USD',2,1,'civicrm_line_item',20),(19,'2020-07-24 05:34:04','2020-07-24 15:34:04',63,'General',100.00,'USD',2,1,'civicrm_line_item',21),(20,'2020-07-24 05:34:04','2020-07-24 15:34:04',188,'General',100.00,'USD',2,1,'civicrm_line_item',22),(21,'2020-07-24 05:34:04','2020-07-24 15:34:04',80,'General',100.00,'USD',2,1,'civicrm_line_item',23),(22,'2020-07-24 05:34:04','2020-07-24 15:34:04',131,'General',100.00,'USD',2,1,'civicrm_line_item',24),(23,'2020-07-24 05:34:04','2020-07-24 15:34:04',161,'General',100.00,'USD',2,1,'civicrm_line_item',25),(24,'2020-07-24 05:34:04','2020-07-24 15:34:04',41,'General',100.00,'USD',2,1,'civicrm_line_item',26),(25,'2020-07-24 05:34:04','2020-07-24 15:34:04',20,'General',100.00,'USD',2,1,'civicrm_line_item',27),(26,'2020-07-24 05:34:04','2020-07-24 15:34:04',195,'General',100.00,'USD',2,1,'civicrm_line_item',28),(27,'2020-07-24 05:34:04','2020-07-24 15:34:04',164,'General',100.00,'USD',2,1,'civicrm_line_item',29),(28,'2020-07-24 05:34:04','2020-07-24 15:34:04',78,'General',100.00,'USD',2,1,'civicrm_line_item',30),(29,'2020-07-24 05:34:04','2020-07-24 15:34:04',132,'Student',50.00,'USD',2,1,'civicrm_line_item',31),(30,'2020-07-24 05:34:04','2020-07-24 15:34:04',5,'Student',50.00,'USD',2,1,'civicrm_line_item',32),(31,'2020-07-24 05:34:04','2020-07-24 15:34:04',108,'Student',50.00,'USD',2,1,'civicrm_line_item',33),(32,'2020-07-24 05:34:04','2020-07-24 15:34:04',39,'Student',50.00,'USD',2,1,'civicrm_line_item',34),(33,'2020-07-24 05:34:04','2020-07-24 15:34:04',159,'Student',50.00,'USD',2,1,'civicrm_line_item',35),(34,'2020-07-24 05:34:04','2020-07-24 15:34:04',67,'Student',50.00,'USD',2,1,'civicrm_line_item',36),(35,'2020-07-24 05:34:04','2020-07-24 15:34:04',17,'Student',50.00,'USD',2,1,'civicrm_line_item',37),(36,'2020-07-24 05:34:04','2020-07-24 15:34:04',7,'Student',50.00,'USD',2,1,'civicrm_line_item',38),(37,'2020-07-24 05:34:05','2020-07-24 15:34:04',95,'Student',50.00,'USD',2,1,'civicrm_line_item',39),(38,'2020-07-24 05:34:05','2020-07-24 15:34:04',134,'Student',50.00,'USD',2,1,'civicrm_line_item',40),(39,'2020-07-24 05:34:05','2020-07-24 15:34:04',74,'Student',50.00,'USD',2,1,'civicrm_line_item',41),(40,'2020-07-24 05:34:05','2020-07-24 15:34:04',13,'Student',50.00,'USD',2,1,'civicrm_line_item',42),(41,'2020-07-24 05:34:05','2020-07-24 15:34:04',156,'Student',50.00,'USD',2,1,'civicrm_line_item',43),(42,'2020-07-24 05:34:05','2020-07-24 15:34:04',145,'Lifetime',1200.00,'USD',2,1,'civicrm_line_item',44),(43,'2020-07-24 05:34:05','2020-07-24 15:34:04',99,'Lifetime',1200.00,'USD',2,1,'civicrm_line_item',45),(44,'2020-07-24 05:34:05','2020-07-24 15:34:04',167,'Soprano',50.00,'USD',2,1,'civicrm_line_item',81),(45,'2020-07-24 05:34:05','2020-07-24 15:34:04',73,'Soprano',50.00,'USD',2,1,'civicrm_line_item',82),(46,'2020-07-24 05:34:05','2020-07-24 15:34:04',56,'Soprano',50.00,'USD',2,1,'civicrm_line_item',83),(47,'2020-07-24 05:34:05','2020-07-24 15:34:04',133,'Soprano',50.00,'USD',2,1,'civicrm_line_item',84),(48,'2020-07-24 05:34:05','2020-07-24 15:34:04',111,'Soprano',50.00,'USD',2,1,'civicrm_line_item',85),(49,'2020-07-24 05:34:05','2020-07-24 15:34:04',195,'Soprano',50.00,'USD',2,1,'civicrm_line_item',86),(50,'2020-07-24 05:34:05','2020-07-24 15:34:04',94,'Soprano',50.00,'USD',2,1,'civicrm_line_item',87),(51,'2020-07-24 05:34:05','2020-07-24 15:34:04',102,'Soprano',50.00,'USD',2,1,'civicrm_line_item',88),(52,'2020-07-24 05:34:05','2020-07-24 15:34:04',19,'Soprano',50.00,'USD',2,1,'civicrm_line_item',89),(53,'2020-07-24 05:34:05','2020-07-24 15:34:04',114,'Soprano',50.00,'USD',2,1,'civicrm_line_item',90),(54,'2020-07-24 05:34:05','2020-07-24 15:34:04',129,'Soprano',50.00,'USD',2,1,'civicrm_line_item',91),(55,'2020-07-24 05:34:05','2020-07-24 15:34:04',120,'Soprano',50.00,'USD',2,1,'civicrm_line_item',92),(56,'2020-07-24 05:34:05','2020-07-24 15:34:04',18,'Soprano',50.00,'USD',2,1,'civicrm_line_item',93),(57,'2020-07-24 05:34:05','2020-07-24 15:34:04',196,'Soprano',50.00,'USD',2,1,'civicrm_line_item',94),(58,'2020-07-24 05:34:05','2020-07-24 15:34:04',98,'Soprano',50.00,'USD',2,1,'civicrm_line_item',95),(59,'2020-07-24 05:34:05','2020-07-24 15:34:04',105,'Soprano',50.00,'USD',2,1,'civicrm_line_item',96),(60,'2020-07-24 05:34:05','2020-07-24 15:34:04',95,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',47),(61,'2020-07-24 05:34:05','2020-07-24 15:34:04',155,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',48),(62,'2020-07-24 05:34:05','2020-07-24 15:34:04',68,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',49),(63,'2020-07-24 05:34:05','2020-07-24 15:34:04',31,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',50),(64,'2020-07-24 05:34:05','2020-07-24 15:34:04',8,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',51),(65,'2020-07-24 05:34:05','2020-07-24 15:34:04',162,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',52),(66,'2020-07-24 05:34:05','2020-07-24 15:34:04',41,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',53),(67,'2020-07-24 05:34:05','2020-07-24 15:34:04',24,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',54),(68,'2020-07-24 05:34:05','2020-07-24 15:34:04',180,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',55),(69,'2020-07-24 05:34:05','2020-07-24 15:34:04',175,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',56),(70,'2020-07-24 05:34:05','2020-07-24 15:34:04',6,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',57),(71,'2020-07-24 05:34:05','2020-07-24 15:34:04',60,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',58),(72,'2020-07-24 05:34:05','2020-07-24 15:34:04',49,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',59),(73,'2020-07-24 05:34:05','2020-07-24 15:34:04',200,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',60),(74,'2020-07-24 05:34:05','2020-07-24 15:34:04',130,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',61),(75,'2020-07-24 05:34:05','2020-07-24 15:34:04',70,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',62),(76,'2020-07-24 05:34:05','2020-07-24 15:34:04',110,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',63),(77,'2020-07-24 05:34:05','2020-07-24 15:34:04',106,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',64),(78,'2020-07-24 05:34:05','2020-07-24 15:34:04',140,'Single',50.00,'USD',4,1,'civicrm_line_item',65),(79,'2020-07-24 05:34:05','2020-07-24 15:34:04',103,'Single',50.00,'USD',4,1,'civicrm_line_item',66),(80,'2020-07-24 05:34:05','2020-07-24 15:34:04',170,'Single',50.00,'USD',4,1,'civicrm_line_item',67),(81,'2020-07-24 05:34:05','2020-07-24 15:34:04',172,'Single',50.00,'USD',4,1,'civicrm_line_item',68),(82,'2020-07-24 05:34:05','2020-07-24 15:34:04',57,'Single',50.00,'USD',4,1,'civicrm_line_item',69),(83,'2020-07-24 05:34:05','2020-07-24 15:34:04',109,'Single',50.00,'USD',4,1,'civicrm_line_item',70),(84,'2020-07-24 05:34:05','2020-07-24 15:34:04',5,'Single',50.00,'USD',4,1,'civicrm_line_item',71),(85,'2020-07-24 05:34:05','2020-07-24 15:34:04',54,'Single',50.00,'USD',4,1,'civicrm_line_item',72),(86,'2020-07-24 05:34:05','2020-07-24 15:34:04',21,'Single',50.00,'USD',4,1,'civicrm_line_item',73),(87,'2020-07-24 05:34:05','2020-07-24 15:34:04',30,'Single',50.00,'USD',4,1,'civicrm_line_item',74),(88,'2020-07-24 05:34:05','2020-07-24 15:34:04',44,'Single',50.00,'USD',4,1,'civicrm_line_item',75),(89,'2020-07-24 05:34:05','2020-07-24 15:34:04',165,'Single',50.00,'USD',4,1,'civicrm_line_item',76),(90,'2020-07-24 05:34:05','2020-07-24 15:34:04',23,'Single',50.00,'USD',4,1,'civicrm_line_item',77),(91,'2020-07-24 05:34:05','2020-07-24 15:34:04',99,'Single',50.00,'USD',4,1,'civicrm_line_item',78),(92,'2020-07-24 05:34:05','2020-07-24 15:34:04',90,'Single',50.00,'USD',4,1,'civicrm_line_item',79),(93,'2020-07-24 05:34:05','2020-07-24 15:34:04',194,'Single',50.00,'USD',4,1,'civicrm_line_item',80);
+INSERT INTO `civicrm_financial_item` (`id`, `created_date`, `transaction_date`, `contact_id`, `description`, `amount`, `currency`, `financial_account_id`, `status_id`, `entity_table`, `entity_id`) VALUES (1,'2020-10-08 01:49:15','2010-04-11 00:00:00',2,'Contribution Amount',125.00,'USD',1,1,'civicrm_line_item',1),(2,'2020-10-08 01:49:15','2010-03-21 00:00:00',4,'Contribution Amount',50.00,'USD',1,1,'civicrm_line_item',2),(3,'2020-10-08 01:49:15','2010-04-29 00:00:00',6,'Contribution Amount',25.00,'USD',1,1,'civicrm_line_item',3),(4,'2020-10-08 01:49:15','2010-04-11 00:00:00',8,'Contribution Amount',50.00,'USD',1,1,'civicrm_line_item',4),(5,'2020-10-08 01:49:15','2010-04-15 00:00:00',16,'Contribution Amount',500.00,'USD',1,1,'civicrm_line_item',5),(6,'2020-10-08 01:49:15','2010-04-11 00:00:00',19,'Contribution Amount',175.00,'USD',1,1,'civicrm_line_item',6),(7,'2020-10-08 01:49:15','2010-03-27 00:00:00',82,'Contribution Amount',50.00,'USD',1,1,'civicrm_line_item',7),(8,'2020-10-08 01:49:15','2010-03-08 00:00:00',92,'Contribution Amount',10.00,'USD',1,1,'civicrm_line_item',8),(9,'2020-10-08 01:49:15','2010-04-22 00:00:00',34,'Contribution Amount',250.00,'USD',1,1,'civicrm_line_item',9),(10,'2020-10-08 01:49:15','2009-07-01 11:53:50',71,'Contribution Amount',500.00,'USD',1,1,'civicrm_line_item',10),(11,'2020-10-08 01:49:15','2009-07-01 12:55:41',43,'Contribution Amount',200.00,'USD',1,1,'civicrm_line_item',11),(12,'2020-10-08 01:49:15','2009-10-01 11:53:50',32,'Contribution Amount',200.00,'USD',1,1,'civicrm_line_item',12),(13,'2020-10-08 01:49:15','2009-12-01 12:55:41',32,'Contribution Amount',200.00,'USD',1,1,'civicrm_line_item',13),(14,'2020-10-08 01:49:15','2020-10-08 12:49:15',140,'General',100.00,'USD',2,1,'civicrm_line_item',16),(15,'2020-10-08 01:49:15','2020-10-08 12:49:15',28,'General',100.00,'USD',2,1,'civicrm_line_item',17),(16,'2020-10-08 01:49:15','2020-10-08 12:49:15',134,'General',100.00,'USD',2,1,'civicrm_line_item',18),(17,'2020-10-08 01:49:15','2020-10-08 12:49:15',59,'General',100.00,'USD',2,1,'civicrm_line_item',19),(18,'2020-10-08 01:49:15','2020-10-08 12:49:15',178,'General',100.00,'USD',2,1,'civicrm_line_item',20),(19,'2020-10-08 01:49:15','2020-10-08 12:49:15',26,'General',100.00,'USD',2,1,'civicrm_line_item',21),(20,'2020-10-08 01:49:15','2020-10-08 12:49:15',54,'General',100.00,'USD',2,1,'civicrm_line_item',22),(21,'2020-10-08 01:49:15','2020-10-08 12:49:15',132,'General',100.00,'USD',2,1,'civicrm_line_item',23),(22,'2020-10-08 01:49:15','2020-10-08 12:49:15',108,'General',100.00,'USD',2,1,'civicrm_line_item',24),(23,'2020-10-08 01:49:15','2020-10-08 12:49:15',118,'General',100.00,'USD',2,1,'civicrm_line_item',25),(24,'2020-10-08 01:49:15','2020-10-08 12:49:15',161,'General',100.00,'USD',2,1,'civicrm_line_item',26),(25,'2020-10-08 01:49:15','2020-10-08 12:49:15',57,'General',100.00,'USD',2,1,'civicrm_line_item',27),(26,'2020-10-08 01:49:15','2020-10-08 12:49:15',18,'General',100.00,'USD',2,1,'civicrm_line_item',28),(27,'2020-10-08 01:49:15','2020-10-08 12:49:15',76,'General',100.00,'USD',2,1,'civicrm_line_item',29),(28,'2020-10-08 01:49:15','2020-10-08 12:49:15',22,'General',100.00,'USD',2,1,'civicrm_line_item',30),(29,'2020-10-08 01:49:15','2020-10-08 12:49:15',125,'General',100.00,'USD',2,1,'civicrm_line_item',31),(30,'2020-10-08 01:49:15','2020-10-08 12:49:15',63,'Student',50.00,'USD',2,1,'civicrm_line_item',32),(31,'2020-10-08 01:49:15','2020-10-08 12:49:15',126,'Student',50.00,'USD',2,1,'civicrm_line_item',33),(32,'2020-10-08 01:49:15','2020-10-08 12:49:15',165,'Student',50.00,'USD',2,1,'civicrm_line_item',34),(33,'2020-10-08 01:49:15','2020-10-08 12:49:15',62,'Student',50.00,'USD',2,1,'civicrm_line_item',35),(34,'2020-10-08 01:49:15','2020-10-08 12:49:15',81,'Student',50.00,'USD',2,1,'civicrm_line_item',36),(35,'2020-10-08 01:49:15','2020-10-08 12:49:15',79,'Student',50.00,'USD',2,1,'civicrm_line_item',37),(36,'2020-10-08 01:49:15','2020-10-08 12:49:15',114,'Student',50.00,'USD',2,1,'civicrm_line_item',38),(37,'2020-10-08 01:49:15','2020-10-08 12:49:15',110,'Student',50.00,'USD',2,1,'civicrm_line_item',39),(38,'2020-10-08 01:49:15','2020-10-08 12:49:15',2,'Student',50.00,'USD',2,1,'civicrm_line_item',40),(39,'2020-10-08 01:49:15','2020-10-08 12:49:15',167,'Student',50.00,'USD',2,1,'civicrm_line_item',41),(40,'2020-10-08 01:49:15','2020-10-08 12:49:15',131,'Student',50.00,'USD',2,1,'civicrm_line_item',42),(41,'2020-10-08 01:49:15','2020-10-08 12:49:15',120,'Student',50.00,'USD',2,1,'civicrm_line_item',43),(42,'2020-10-08 01:49:15','2020-10-08 12:49:15',75,'Lifetime',1200.00,'USD',2,1,'civicrm_line_item',44),(43,'2020-10-08 01:49:15','2020-10-08 12:49:15',156,'Lifetime',1200.00,'USD',2,1,'civicrm_line_item',45),(44,'2020-10-08 01:49:15','2020-10-08 12:49:15',36,'Soprano',50.00,'USD',2,1,'civicrm_line_item',81),(45,'2020-10-08 01:49:15','2020-10-08 12:49:15',148,'Soprano',50.00,'USD',2,1,'civicrm_line_item',82),(46,'2020-10-08 01:49:15','2020-10-08 12:49:15',166,'Soprano',50.00,'USD',2,1,'civicrm_line_item',83),(47,'2020-10-08 01:49:15','2020-10-08 12:49:15',196,'Soprano',50.00,'USD',2,1,'civicrm_line_item',84),(48,'2020-10-08 01:49:15','2020-10-08 12:49:15',151,'Soprano',50.00,'USD',2,1,'civicrm_line_item',85),(49,'2020-10-08 01:49:15','2020-10-08 12:49:15',30,'Soprano',50.00,'USD',2,1,'civicrm_line_item',86),(50,'2020-10-08 01:49:15','2020-10-08 12:49:15',87,'Soprano',50.00,'USD',2,1,'civicrm_line_item',87),(51,'2020-10-08 01:49:15','2020-10-08 12:49:15',199,'Soprano',50.00,'USD',2,1,'civicrm_line_item',88),(52,'2020-10-08 01:49:15','2020-10-08 12:49:15',39,'Soprano',50.00,'USD',2,1,'civicrm_line_item',89),(53,'2020-10-08 01:49:15','2020-10-08 12:49:15',146,'Soprano',50.00,'USD',2,1,'civicrm_line_item',90),(54,'2020-10-08 01:49:15','2020-10-08 12:49:15',105,'Soprano',50.00,'USD',2,1,'civicrm_line_item',91),(55,'2020-10-08 01:49:15','2020-10-08 12:49:15',129,'Soprano',50.00,'USD',2,1,'civicrm_line_item',92),(56,'2020-10-08 01:49:15','2020-10-08 12:49:15',93,'Soprano',50.00,'USD',2,1,'civicrm_line_item',93),(57,'2020-10-08 01:49:15','2020-10-08 12:49:15',77,'Soprano',50.00,'USD',2,1,'civicrm_line_item',94),(58,'2020-10-08 01:49:15','2020-10-08 12:49:15',135,'Soprano',50.00,'USD',2,1,'civicrm_line_item',95),(59,'2020-10-08 01:49:15','2020-10-08 12:49:15',171,'Soprano',50.00,'USD',2,1,'civicrm_line_item',96),(60,'2020-10-08 01:49:15','2020-10-08 12:49:15',136,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',47),(61,'2020-10-08 01:49:15','2020-10-08 12:49:15',17,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',48),(62,'2020-10-08 01:49:15','2020-10-08 12:49:15',9,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',49),(63,'2020-10-08 01:49:15','2020-10-08 12:49:15',127,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',50),(64,'2020-10-08 01:49:15','2020-10-08 12:49:15',79,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',51),(65,'2020-10-08 01:49:15','2020-10-08 12:49:15',118,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',52),(66,'2020-10-08 01:49:15','2020-10-08 12:49:15',47,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',53),(67,'2020-10-08 01:49:15','2020-10-08 12:49:15',91,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',54),(68,'2020-10-08 01:49:15','2020-10-08 12:49:15',22,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',55),(69,'2020-10-08 01:49:15','2020-10-08 12:49:15',125,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',56),(70,'2020-10-08 01:49:15','2020-10-08 12:49:15',108,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',57),(71,'2020-10-08 01:49:15','2020-10-08 12:49:15',161,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',58),(72,'2020-10-08 01:49:15','2020-10-08 12:49:15',65,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',59),(73,'2020-10-08 01:49:15','2020-10-08 12:49:15',159,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',60),(74,'2020-10-08 01:49:15','2020-10-08 12:49:15',64,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',61),(75,'2020-10-08 01:49:15','2020-10-08 12:49:15',4,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',62),(76,'2020-10-08 01:49:15','2020-10-08 12:49:15',51,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',63),(77,'2020-10-08 01:49:15','2020-10-08 12:49:15',150,'Tiny-tots (ages 5-8)',800.00,'USD',4,1,'civicrm_line_item',64),(78,'2020-10-08 01:49:15','2020-10-08 12:49:15',76,'Single',50.00,'USD',4,1,'civicrm_line_item',65),(79,'2020-10-08 01:49:15','2020-10-08 12:49:15',114,'Single',50.00,'USD',4,1,'civicrm_line_item',66),(80,'2020-10-08 01:49:15','2020-10-08 12:49:15',152,'Single',50.00,'USD',4,1,'civicrm_line_item',67),(81,'2020-10-08 01:49:15','2020-10-08 12:49:15',98,'Single',50.00,'USD',4,1,'civicrm_line_item',68),(82,'2020-10-08 01:49:15','2020-10-08 12:49:15',158,'Single',50.00,'USD',4,1,'civicrm_line_item',69),(83,'2020-10-08 01:49:15','2020-10-08 12:49:15',19,'Single',50.00,'USD',4,1,'civicrm_line_item',70),(84,'2020-10-08 01:49:15','2020-10-08 12:49:15',27,'Single',50.00,'USD',4,1,'civicrm_line_item',71),(85,'2020-10-08 01:49:15','2020-10-08 12:49:15',38,'Single',50.00,'USD',4,1,'civicrm_line_item',72),(86,'2020-10-08 01:49:15','2020-10-08 12:49:15',73,'Single',50.00,'USD',4,1,'civicrm_line_item',73),(87,'2020-10-08 01:49:15','2020-10-08 12:49:15',116,'Single',50.00,'USD',4,1,'civicrm_line_item',74),(88,'2020-10-08 01:49:15','2020-10-08 12:49:15',57,'Single',50.00,'USD',4,1,'civicrm_line_item',75),(89,'2020-10-08 01:49:15','2020-10-08 12:49:15',181,'Single',50.00,'USD',4,1,'civicrm_line_item',76),(90,'2020-10-08 01:49:15','2020-10-08 12:49:15',104,'Single',50.00,'USD',4,1,'civicrm_line_item',77),(91,'2020-10-08 01:49:15','2020-10-08 12:49:15',178,'Single',50.00,'USD',4,1,'civicrm_line_item',78),(92,'2020-10-08 01:49:15','2020-10-08 12:49:15',128,'Single',50.00,'USD',4,1,'civicrm_line_item',79),(93,'2020-10-08 01:49:15','2020-10-08 12:49:15',147,'Single',50.00,'USD',4,1,'civicrm_line_item',80);
 /*!40000 ALTER TABLE `civicrm_financial_item` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -534,7 +534,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_financial_trxn` WRITE;
 /*!40000 ALTER TABLE `civicrm_financial_trxn` DISABLE KEYS */;
-INSERT INTO `civicrm_financial_trxn` (`id`, `from_financial_account_id`, `to_financial_account_id`, `trxn_date`, `total_amount`, `fee_amount`, `net_amount`, `currency`, `is_payment`, `trxn_id`, `trxn_result_code`, `status_id`, `payment_processor_id`, `payment_instrument_id`, `card_type_id`, `check_number`, `pan_truncation`, `order_reference`) VALUES (1,NULL,6,'2010-04-11 00:00:00',125.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'1041',NULL,NULL),(2,NULL,6,'2010-03-21 00:00:00',50.00,NULL,NULL,'USD',1,'P20901X1',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(3,NULL,6,'2010-04-29 00:00:00',25.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'2095',NULL,NULL),(4,NULL,6,'2010-04-11 00:00:00',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'10552',NULL,NULL),(5,NULL,6,'2010-04-15 00:00:00',500.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'509',NULL,NULL),(6,NULL,6,'2010-04-11 00:00:00',175.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'102',NULL,NULL),(7,NULL,6,'2010-03-27 00:00:00',50.00,NULL,NULL,'USD',1,'P20193L2',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(8,NULL,6,'2010-03-08 00:00:00',10.00,NULL,NULL,'USD',1,'P40232Y3',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(9,NULL,6,'2010-04-22 00:00:00',250.00,NULL,NULL,'USD',1,'P20193L6',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(10,NULL,6,'2009-07-01 11:53:50',500.00,NULL,NULL,'USD',1,'PL71',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(11,NULL,6,'2009-07-01 12:55:41',200.00,NULL,NULL,'USD',1,'PL43II',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(12,NULL,6,'2009-10-01 11:53:50',200.00,NULL,NULL,'USD',1,'PL32I',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(13,NULL,6,'2009-12-01 12:55:41',200.00,NULL,NULL,'USD',1,'PL32II',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(14,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(15,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(16,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(17,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(18,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(19,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(20,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(21,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(22,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(23,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(24,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(25,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(26,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(27,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(28,NULL,6,'2020-07-24 15:34:04',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(29,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(30,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(31,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(32,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(33,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(34,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(35,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(36,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(37,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(38,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(39,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(40,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(41,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(42,NULL,6,'2020-07-24 15:34:04',1200.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(43,NULL,6,'2020-07-24 15:34:04',1200.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(44,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(45,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(46,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(47,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(48,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(49,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(50,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(51,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(52,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(53,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(54,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(55,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(56,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(57,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(58,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(59,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(60,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(61,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(62,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(63,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(64,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(65,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(66,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(67,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(68,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(69,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(70,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(71,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(72,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(73,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(74,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(75,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(76,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(77,NULL,6,'2020-07-24 15:34:04',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(78,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(79,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(80,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(81,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(82,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(83,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(84,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(85,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(86,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(87,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(88,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(89,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(90,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(91,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(92,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(93,NULL,6,'2020-07-24 15:34:04',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL);
+INSERT INTO `civicrm_financial_trxn` (`id`, `from_financial_account_id`, `to_financial_account_id`, `trxn_date`, `total_amount`, `fee_amount`, `net_amount`, `currency`, `is_payment`, `trxn_id`, `trxn_result_code`, `status_id`, `payment_processor_id`, `payment_instrument_id`, `card_type_id`, `check_number`, `pan_truncation`, `order_reference`) VALUES (1,NULL,6,'2010-04-11 00:00:00',125.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'1041',NULL,NULL),(2,NULL,6,'2010-03-21 00:00:00',50.00,NULL,NULL,'USD',1,'P20901X1',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(3,NULL,6,'2010-04-29 00:00:00',25.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'2095',NULL,NULL),(4,NULL,6,'2010-04-11 00:00:00',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'10552',NULL,NULL),(5,NULL,6,'2010-04-15 00:00:00',500.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'509',NULL,NULL),(6,NULL,6,'2010-04-11 00:00:00',175.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,4,NULL,'102',NULL,NULL),(7,NULL,6,'2010-03-27 00:00:00',50.00,NULL,NULL,'USD',1,'P20193L2',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(8,NULL,6,'2010-03-08 00:00:00',10.00,NULL,NULL,'USD',1,'P40232Y3',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(9,NULL,6,'2010-04-22 00:00:00',250.00,NULL,NULL,'USD',1,'P20193L6',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(10,NULL,6,'2009-07-01 11:53:50',500.00,NULL,NULL,'USD',1,'PL71',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(11,NULL,6,'2009-07-01 12:55:41',200.00,NULL,NULL,'USD',1,'PL43II',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(12,NULL,6,'2009-10-01 11:53:50',200.00,NULL,NULL,'USD',1,'PL32I',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(13,NULL,6,'2009-12-01 12:55:41',200.00,NULL,NULL,'USD',1,'PL32II',NULL,1,NULL,1,NULL,NULL,NULL,NULL),(14,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(15,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(16,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(17,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(18,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(19,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(20,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(21,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(22,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(23,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(24,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(25,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(26,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(27,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(28,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(29,NULL,6,'2020-10-08 12:49:15',100.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(30,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(31,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(32,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(33,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(34,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(35,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(36,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(37,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(38,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(39,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(40,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(41,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(42,NULL,6,'2020-10-08 12:49:15',1200.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(43,NULL,6,'2020-10-08 12:49:15',1200.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(44,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(45,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(46,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(47,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(48,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(49,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(50,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(51,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(52,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(53,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(54,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(55,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(56,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(57,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(58,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(59,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(60,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(61,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(62,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(63,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(64,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(65,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(66,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(67,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(68,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(69,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(70,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(71,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(72,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(73,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(74,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(75,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(76,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(77,NULL,6,'2020-10-08 12:49:15',800.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(78,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(79,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(80,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(81,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(82,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(83,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(84,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(85,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(86,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(87,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(88,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(89,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(90,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(91,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(92,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL),(93,NULL,6,'2020-10-08 12:49:15',50.00,NULL,NULL,'USD',1,NULL,NULL,1,NULL,1,NULL,NULL,NULL,NULL);
 /*!40000 ALTER TABLE `civicrm_financial_trxn` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -563,7 +563,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_group` WRITE;
 /*!40000 ALTER TABLE `civicrm_group` DISABLE KEYS */;
-INSERT INTO `civicrm_group` (`id`, `name`, `title`, `description`, `source`, `saved_search_id`, `is_active`, `visibility`, `where_clause`, `select_tables`, `where_tables`, `group_type`, `cache_date`, `refresh_date`, `parents`, `children`, `is_hidden`, `is_reserved`, `created_id`, `modified_id`) VALUES (1,'Administrators','Administrators','Contacts in this group are assigned Administrator role permissions.',NULL,NULL,1,'User and User Admin Only',NULL,NULL,NULL,'1',NULL,NULL,NULL,NULL,0,0,NULL,NULL),(2,'Newsletter Subscribers','Newsletter Subscribers',NULL,NULL,NULL,1,'Public Pages',NULL,NULL,NULL,'12',NULL,NULL,NULL,NULL,0,0,NULL,NULL),(3,'Summer Program Volunteers','Summer Program Volunteers',NULL,NULL,NULL,1,'Public Pages',NULL,NULL,NULL,'12',NULL,NULL,NULL,NULL,0,0,NULL,NULL),(4,'Advisory Board','Advisory Board',NULL,NULL,NULL,1,'Public Pages',NULL,NULL,NULL,'12',NULL,NULL,NULL,NULL,0,0,NULL,NULL);
+INSERT INTO `civicrm_group` (`id`, `name`, `title`, `description`, `source`, `saved_search_id`, `is_active`, `visibility`, `where_clause`, `select_tables`, `where_tables`, `group_type`, `cache_date`, `refresh_date`, `parents`, `children`, `is_hidden`, `is_reserved`, `created_id`, `modified_id`, `frontend_title`, `frontend_description`) VALUES (1,'Administrators','Administrators','Contacts in this group are assigned Administrator role permissions.',NULL,NULL,1,'User and User Admin Only',NULL,NULL,NULL,'1',NULL,NULL,NULL,NULL,0,0,NULL,NULL,NULL,NULL),(2,'Newsletter Subscribers','Newsletter Subscribers',NULL,NULL,NULL,1,'Public Pages',NULL,NULL,NULL,'12',NULL,NULL,NULL,NULL,0,0,NULL,NULL,NULL,NULL),(3,'Summer Program Volunteers','Summer Program Volunteers',NULL,NULL,NULL,1,'Public Pages',NULL,NULL,NULL,'12',NULL,NULL,NULL,NULL,0,0,NULL,NULL,NULL,NULL),(4,'Advisory Board','Advisory Board',NULL,NULL,NULL,1,'Public Pages',NULL,NULL,NULL,'12',NULL,NULL,NULL,NULL,0,0,NULL,NULL,NULL,NULL);
 /*!40000 ALTER TABLE `civicrm_group` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -573,7 +573,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_group_contact` WRITE;
 /*!40000 ALTER TABLE `civicrm_group_contact` DISABLE KEYS */;
-INSERT INTO `civicrm_group_contact` (`id`, `group_id`, `contact_id`, `status`, `location_id`, `email_id`) VALUES (1,2,169,'Added',NULL,NULL),(2,2,24,'Added',NULL,NULL),(3,2,124,'Added',NULL,NULL),(4,2,57,'Added',NULL,NULL),(5,2,17,'Added',NULL,NULL),(6,2,182,'Added',NULL,NULL),(7,2,99,'Added',NULL,NULL),(8,2,138,'Added',NULL,NULL),(9,2,81,'Added',NULL,NULL),(10,2,53,'Added',NULL,NULL),(11,2,15,'Added',NULL,NULL),(12,2,33,'Added',NULL,NULL),(13,2,179,'Added',NULL,NULL),(14,2,83,'Added',NULL,NULL),(15,2,164,'Added',NULL,NULL),(16,2,146,'Added',NULL,NULL),(17,2,120,'Added',NULL,NULL),(18,2,193,'Added',NULL,NULL),(19,2,76,'Added',NULL,NULL),(20,2,162,'Added',NULL,NULL),(21,2,66,'Added',NULL,NULL),(22,2,92,'Added',NULL,NULL),(23,2,167,'Added',NULL,NULL),(24,2,65,'Added',NULL,NULL),(25,2,190,'Added',NULL,NULL),(26,2,184,'Added',NULL,NULL),(27,2,67,'Added',NULL,NULL),(28,2,185,'Added',NULL,NULL),(29,2,183,'Added',NULL,NULL),(30,2,175,'Added',NULL,NULL),(31,2,129,'Added',NULL,NULL),(32,2,197,'Added',NULL,NULL),(33,2,122,'Added',NULL,NULL),(34,2,7,'Added',NULL,NULL),(35,2,154,'Added',NULL,NULL),(36,2,51,'Added',NULL,NULL),(37,2,97,'Added',NULL,NULL),(38,2,111,'Added',NULL,NULL),(39,2,143,'Added',NULL,NULL),(40,2,77,'Added',NULL,NULL),(41,2,186,'Added',NULL,NULL),(42,2,12,'Added',NULL,NULL),(43,2,8,'Added',NULL,NULL),(44,2,84,'Added',NULL,NULL),(45,2,71,'Added',NULL,NULL),(46,2,3,'Added',NULL,NULL),(47,2,123,'Added',NULL,NULL),(48,2,119,'Added',NULL,NULL),(49,2,161,'Added',NULL,NULL),(50,2,145,'Added',NULL,NULL),(51,2,60,'Added',NULL,NULL),(52,2,31,'Added',NULL,NULL),(53,2,55,'Added',NULL,NULL),(54,2,88,'Added',NULL,NULL),(55,2,64,'Added',NULL,NULL),(56,2,41,'Added',NULL,NULL),(57,2,30,'Added',NULL,NULL),(58,2,2,'Added',NULL,NULL),(59,2,156,'Added',NULL,NULL),(60,2,118,'Added',NULL,NULL),(61,3,87,'Added',NULL,NULL),(62,3,49,'Added',NULL,NULL),(63,3,23,'Added',NULL,NULL),(64,3,5,'Added',NULL,NULL),(65,3,93,'Added',NULL,NULL),(66,3,18,'Added',NULL,NULL),(67,3,6,'Added',NULL,NULL),(68,3,199,'Added',NULL,NULL),(69,3,176,'Added',NULL,NULL),(70,3,132,'Added',NULL,NULL),(71,3,80,'Added',NULL,NULL),(72,3,45,'Added',NULL,NULL),(73,3,44,'Added',NULL,NULL),(74,3,96,'Added',NULL,NULL),(75,3,166,'Added',NULL,NULL),(76,4,169,'Added',NULL,NULL),(77,4,138,'Added',NULL,NULL),(78,4,164,'Added',NULL,NULL),(79,4,92,'Added',NULL,NULL),(80,4,183,'Added',NULL,NULL),(81,4,51,'Added',NULL,NULL),(82,4,8,'Added',NULL,NULL),(83,4,145,'Added',NULL,NULL);
+INSERT INTO `civicrm_group_contact` (`id`, `group_id`, `contact_id`, `status`, `location_id`, `email_id`) VALUES (1,2,158,'Added',NULL,NULL),(2,2,200,'Added',NULL,NULL),(3,2,44,'Added',NULL,NULL),(4,2,159,'Added',NULL,NULL),(5,2,193,'Added',NULL,NULL),(6,2,18,'Added',NULL,NULL),(7,2,188,'Added',NULL,NULL),(8,2,131,'Added',NULL,NULL),(9,2,34,'Added',NULL,NULL),(10,2,153,'Added',NULL,NULL),(11,2,163,'Added',NULL,NULL),(12,2,85,'Added',NULL,NULL),(13,2,57,'Added',NULL,NULL),(14,2,95,'Added',NULL,NULL),(15,2,185,'Added',NULL,NULL),(16,2,173,'Added',NULL,NULL),(17,2,27,'Added',NULL,NULL),(18,2,133,'Added',NULL,NULL),(19,2,182,'Added',NULL,NULL),(20,2,33,'Added',NULL,NULL),(21,2,171,'Added',NULL,NULL),(22,2,125,'Added',NULL,NULL),(23,2,101,'Added',NULL,NULL),(24,2,134,'Added',NULL,NULL),(25,2,97,'Added',NULL,NULL),(26,2,16,'Added',NULL,NULL),(27,2,147,'Added',NULL,NULL),(28,2,180,'Added',NULL,NULL),(29,2,175,'Added',NULL,NULL),(30,2,137,'Added',NULL,NULL),(31,2,111,'Added',NULL,NULL),(32,2,195,'Added',NULL,NULL),(33,2,183,'Added',NULL,NULL),(34,2,108,'Added',NULL,NULL),(35,2,76,'Added',NULL,NULL),(36,2,109,'Added',NULL,NULL),(37,2,90,'Added',NULL,NULL),(38,2,135,'Added',NULL,NULL),(39,2,47,'Added',NULL,NULL),(40,2,26,'Added',NULL,NULL),(41,2,20,'Added',NULL,NULL),(42,2,25,'Added',NULL,NULL),(43,2,166,'Added',NULL,NULL),(44,2,140,'Added',NULL,NULL),(45,2,67,'Added',NULL,NULL),(46,2,94,'Added',NULL,NULL),(47,2,30,'Added',NULL,NULL),(48,2,22,'Added',NULL,NULL),(49,2,143,'Added',NULL,NULL),(50,2,84,'Added',NULL,NULL),(51,2,169,'Added',NULL,NULL),(52,2,184,'Added',NULL,NULL),(53,2,113,'Added',NULL,NULL),(54,2,141,'Added',NULL,NULL),(55,2,58,'Added',NULL,NULL),(56,2,19,'Added',NULL,NULL),(57,2,17,'Added',NULL,NULL),(58,2,176,'Added',NULL,NULL),(59,2,60,'Added',NULL,NULL),(60,2,40,'Added',NULL,NULL),(61,3,23,'Added',NULL,NULL),(62,3,130,'Added',NULL,NULL),(63,3,99,'Added',NULL,NULL),(64,3,106,'Added',NULL,NULL),(65,3,102,'Added',NULL,NULL),(66,3,66,'Added',NULL,NULL),(67,3,32,'Added',NULL,NULL),(68,3,187,'Added',NULL,NULL),(69,3,14,'Added',NULL,NULL),(70,3,151,'Added',NULL,NULL),(71,3,31,'Added',NULL,NULL),(72,3,117,'Added',NULL,NULL),(73,3,64,'Added',NULL,NULL),(74,3,56,'Added',NULL,NULL),(75,3,28,'Added',NULL,NULL),(76,4,158,'Added',NULL,NULL),(77,4,131,'Added',NULL,NULL),(78,4,185,'Added',NULL,NULL),(79,4,125,'Added',NULL,NULL),(80,4,175,'Added',NULL,NULL),(81,4,109,'Added',NULL,NULL),(82,4,166,'Added',NULL,NULL),(83,4,84,'Added',NULL,NULL);
 /*!40000 ALTER TABLE `civicrm_group_contact` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -638,7 +638,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_line_item` WRITE;
 /*!40000 ALTER TABLE `civicrm_line_item` DISABLE KEYS */;
-INSERT INTO `civicrm_line_item` (`id`, `entity_table`, `entity_id`, `contribution_id`, `price_field_id`, `label`, `qty`, `unit_price`, `line_total`, `participant_count`, `price_field_value_id`, `financial_type_id`, `non_deductible_amount`, `tax_amount`) VALUES (1,'civicrm_contribution',1,1,1,'Contribution Amount',1.00,125.00,125.00,0,1,1,0.00,NULL),(2,'civicrm_contribution',2,2,1,'Contribution Amount',1.00,50.00,50.00,0,1,1,0.00,NULL),(3,'civicrm_contribution',3,3,1,'Contribution Amount',1.00,25.00,25.00,0,1,1,0.00,NULL),(4,'civicrm_contribution',4,4,1,'Contribution Amount',1.00,50.00,50.00,0,1,1,0.00,NULL),(5,'civicrm_contribution',5,5,1,'Contribution Amount',1.00,500.00,500.00,0,1,1,0.00,NULL),(6,'civicrm_contribution',6,6,1,'Contribution Amount',1.00,175.00,175.00,0,1,1,0.00,NULL),(7,'civicrm_contribution',7,7,1,'Contribution Amount',1.00,50.00,50.00,0,1,1,0.00,NULL),(8,'civicrm_contribution',8,8,1,'Contribution Amount',1.00,10.00,10.00,0,1,1,0.00,NULL),(9,'civicrm_contribution',9,9,1,'Contribution Amount',1.00,250.00,250.00,0,1,1,0.00,NULL),(10,'civicrm_contribution',10,10,1,'Contribution Amount',1.00,500.00,500.00,0,1,1,0.00,NULL),(11,'civicrm_contribution',11,11,1,'Contribution Amount',1.00,200.00,200.00,0,1,1,0.00,NULL),(12,'civicrm_contribution',12,12,1,'Contribution Amount',1.00,200.00,200.00,0,1,1,0.00,NULL),(13,'civicrm_contribution',13,13,1,'Contribution Amount',1.00,200.00,200.00,0,1,1,0.00,NULL),(16,'civicrm_membership',1,14,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(17,'civicrm_membership',3,15,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(18,'civicrm_membership',5,16,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(19,'civicrm_membership',7,17,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(20,'civicrm_membership',9,18,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(21,'civicrm_membership',10,19,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(22,'civicrm_membership',13,20,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(23,'civicrm_membership',15,21,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(24,'civicrm_membership',17,22,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(25,'civicrm_membership',19,23,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(26,'civicrm_membership',21,24,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(27,'civicrm_membership',23,25,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(28,'civicrm_membership',25,26,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(29,'civicrm_membership',27,27,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(30,'civicrm_membership',29,28,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(31,'civicrm_membership',2,29,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(32,'civicrm_membership',4,30,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(33,'civicrm_membership',6,31,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(34,'civicrm_membership',8,32,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(35,'civicrm_membership',12,33,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(36,'civicrm_membership',14,34,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(37,'civicrm_membership',16,35,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(38,'civicrm_membership',18,36,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(39,'civicrm_membership',20,37,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(40,'civicrm_membership',24,38,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(41,'civicrm_membership',26,39,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(42,'civicrm_membership',28,40,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(43,'civicrm_membership',30,41,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(44,'civicrm_membership',11,42,4,'Lifetime',1.00,1200.00,1200.00,NULL,9,2,0.00,NULL),(45,'civicrm_membership',22,43,4,'Lifetime',1.00,1200.00,1200.00,NULL,9,2,0.00,NULL),(47,'civicrm_participant',3,67,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(48,'civicrm_participant',6,83,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(49,'civicrm_participant',9,62,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(50,'civicrm_participant',12,54,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(51,'civicrm_participant',15,47,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(52,'civicrm_participant',18,84,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(53,'civicrm_participant',21,55,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(54,'civicrm_participant',24,52,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(55,'civicrm_participant',25,90,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(56,'civicrm_participant',28,89,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(57,'civicrm_participant',31,46,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(58,'civicrm_participant',34,61,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(59,'civicrm_participant',37,57,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(60,'civicrm_participant',40,94,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(61,'civicrm_participant',43,80,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(62,'civicrm_participant',46,63,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(63,'civicrm_participant',49,75,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(64,'civicrm_participant',50,73,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(65,'civicrm_participant',1,82,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(66,'civicrm_participant',4,71,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(67,'civicrm_participant',7,87,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(68,'civicrm_participant',10,88,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(69,'civicrm_participant',13,60,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(70,'civicrm_participant',16,74,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(71,'civicrm_participant',19,45,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(72,'civicrm_participant',22,58,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(73,'civicrm_participant',26,50,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(74,'civicrm_participant',29,53,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(75,'civicrm_participant',32,56,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(76,'civicrm_participant',35,85,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(77,'civicrm_participant',38,51,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(78,'civicrm_participant',41,69,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(79,'civicrm_participant',44,65,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(80,'civicrm_participant',47,91,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(81,'civicrm_participant',2,86,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(82,'civicrm_participant',5,64,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(83,'civicrm_participant',8,59,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(84,'civicrm_participant',11,81,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(85,'civicrm_participant',14,76,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(86,'civicrm_participant',17,92,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(87,'civicrm_participant',20,66,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(88,'civicrm_participant',23,70,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(89,'civicrm_participant',27,49,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(90,'civicrm_participant',30,77,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(91,'civicrm_participant',33,79,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(92,'civicrm_participant',36,78,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(93,'civicrm_participant',39,48,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(94,'civicrm_participant',42,93,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(95,'civicrm_participant',45,68,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(96,'civicrm_participant',48,72,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL);
+INSERT INTO `civicrm_line_item` (`id`, `entity_table`, `entity_id`, `contribution_id`, `price_field_id`, `label`, `qty`, `unit_price`, `line_total`, `participant_count`, `price_field_value_id`, `financial_type_id`, `non_deductible_amount`, `tax_amount`) VALUES (1,'civicrm_contribution',1,1,1,'Contribution Amount',1.00,125.00,125.00,0,1,1,0.00,NULL),(2,'civicrm_contribution',2,2,1,'Contribution Amount',1.00,50.00,50.00,0,1,1,0.00,NULL),(3,'civicrm_contribution',3,3,1,'Contribution Amount',1.00,25.00,25.00,0,1,1,0.00,NULL),(4,'civicrm_contribution',4,4,1,'Contribution Amount',1.00,50.00,50.00,0,1,1,0.00,NULL),(5,'civicrm_contribution',5,5,1,'Contribution Amount',1.00,500.00,500.00,0,1,1,0.00,NULL),(6,'civicrm_contribution',6,6,1,'Contribution Amount',1.00,175.00,175.00,0,1,1,0.00,NULL),(7,'civicrm_contribution',7,7,1,'Contribution Amount',1.00,50.00,50.00,0,1,1,0.00,NULL),(8,'civicrm_contribution',8,8,1,'Contribution Amount',1.00,10.00,10.00,0,1,1,0.00,NULL),(9,'civicrm_contribution',9,9,1,'Contribution Amount',1.00,250.00,250.00,0,1,1,0.00,NULL),(10,'civicrm_contribution',10,10,1,'Contribution Amount',1.00,500.00,500.00,0,1,1,0.00,NULL),(11,'civicrm_contribution',11,11,1,'Contribution Amount',1.00,200.00,200.00,0,1,1,0.00,NULL),(12,'civicrm_contribution',12,12,1,'Contribution Amount',1.00,200.00,200.00,0,1,1,0.00,NULL),(13,'civicrm_contribution',13,13,1,'Contribution Amount',1.00,200.00,200.00,0,1,1,0.00,NULL),(16,'civicrm_membership',1,14,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(17,'civicrm_membership',3,15,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(18,'civicrm_membership',7,16,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(19,'civicrm_membership',9,17,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(20,'civicrm_membership',10,18,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(21,'civicrm_membership',13,19,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(22,'civicrm_membership',15,20,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(23,'civicrm_membership',17,21,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(24,'civicrm_membership',19,22,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(25,'civicrm_membership',20,23,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(26,'civicrm_membership',21,24,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(27,'civicrm_membership',23,25,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(28,'civicrm_membership',25,26,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(29,'civicrm_membership',27,27,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(30,'civicrm_membership',29,28,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(31,'civicrm_membership',30,29,4,'General',1.00,100.00,100.00,NULL,7,2,0.00,NULL),(32,'civicrm_membership',2,30,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(33,'civicrm_membership',4,31,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(34,'civicrm_membership',5,32,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(35,'civicrm_membership',6,33,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(36,'civicrm_membership',8,34,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(37,'civicrm_membership',12,35,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(38,'civicrm_membership',14,36,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(39,'civicrm_membership',16,37,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(40,'civicrm_membership',18,38,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(41,'civicrm_membership',24,39,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(42,'civicrm_membership',26,40,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(43,'civicrm_membership',28,41,4,'Student',1.00,50.00,50.00,NULL,8,2,0.00,NULL),(44,'civicrm_membership',11,42,4,'Lifetime',1.00,1200.00,1200.00,NULL,9,2,0.00,NULL),(45,'civicrm_membership',22,43,4,'Lifetime',1.00,1200.00,1200.00,NULL,9,2,0.00,NULL),(47,'civicrm_participant',3,79,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(48,'civicrm_participant',6,47,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(49,'civicrm_participant',9,46,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(50,'civicrm_participant',12,75,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(51,'civicrm_participant',15,63,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(52,'civicrm_participant',18,73,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(53,'civicrm_participant',21,55,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(54,'civicrm_participant',24,65,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(55,'civicrm_participant',25,49,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(56,'civicrm_participant',28,74,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(57,'civicrm_participant',31,70,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(58,'civicrm_participant',34,88,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(59,'civicrm_participant',37,59,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(60,'civicrm_participant',40,87,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(61,'civicrm_participant',43,58,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(62,'civicrm_participant',46,45,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(63,'civicrm_participant',49,56,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(64,'civicrm_participant',50,83,7,'Tiny-tots (ages 5-8)',1.00,800.00,800.00,0,13,4,0.00,NULL),(65,'civicrm_participant',1,61,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(66,'civicrm_participant',4,71,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(67,'civicrm_participant',7,85,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(68,'civicrm_participant',10,67,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(69,'civicrm_participant',13,86,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(70,'civicrm_participant',16,48,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(71,'civicrm_participant',19,50,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(72,'civicrm_participant',22,53,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(73,'civicrm_participant',26,60,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(74,'civicrm_participant',29,72,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(75,'civicrm_participant',32,57,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(76,'civicrm_participant',35,92,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(77,'civicrm_participant',38,68,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(78,'civicrm_participant',41,91,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(79,'civicrm_participant',44,76,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(80,'civicrm_participant',47,81,8,'Single',1.00,50.00,50.00,0,16,4,0.00,NULL),(81,'civicrm_participant',2,52,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(82,'civicrm_participant',5,82,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(83,'civicrm_participant',8,89,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(84,'civicrm_participant',11,93,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(85,'civicrm_participant',14,84,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(86,'civicrm_participant',17,51,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(87,'civicrm_participant',20,64,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(88,'civicrm_participant',23,94,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(89,'civicrm_participant',27,54,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(90,'civicrm_participant',30,80,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(91,'civicrm_participant',33,69,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(92,'civicrm_participant',36,77,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(93,'civicrm_participant',39,66,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(94,'civicrm_participant',42,62,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(95,'civicrm_participant',45,78,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL),(96,'civicrm_participant',48,90,9,'Soprano',1.00,50.00,50.00,0,21,2,0.00,NULL);
 /*!40000 ALTER TABLE `civicrm_line_item` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -648,7 +648,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_loc_block` WRITE;
 /*!40000 ALTER TABLE `civicrm_loc_block` DISABLE KEYS */;
-INSERT INTO `civicrm_loc_block` (`id`, `address_id`, `email_id`, `phone_id`, `im_id`, `address_2_id`, `email_2_id`, `phone_2_id`, `im_2_id`) VALUES (1,180,189,158,NULL,NULL,NULL,NULL,NULL),(2,181,190,159,NULL,NULL,NULL,NULL,NULL),(3,182,191,160,NULL,NULL,NULL,NULL,NULL);
+INSERT INTO `civicrm_loc_block` (`id`, `address_id`, `email_id`, `phone_id`, `im_id`, `address_2_id`, `email_2_id`, `phone_2_id`, `im_2_id`) VALUES (1,179,182,154,NULL,NULL,NULL,NULL,NULL),(2,180,183,155,NULL,NULL,NULL,NULL,NULL),(3,181,184,156,NULL,NULL,NULL,NULL,NULL);
 /*!40000 ALTER TABLE `civicrm_loc_block` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -677,7 +677,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_mail_settings` WRITE;
 /*!40000 ALTER TABLE `civicrm_mail_settings` DISABLE KEYS */;
-INSERT INTO `civicrm_mail_settings` (`id`, `domain_id`, `name`, `is_default`, `domain`, `localpart`, `return_path`, `protocol`, `server`, `port`, `username`, `password`, `is_ssl`, `source`, `activity_status`) VALUES (1,1,'default',1,'EXAMPLE.ORG',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
+INSERT INTO `civicrm_mail_settings` (`id`, `domain_id`, `name`, `is_default`, `domain`, `localpart`, `return_path`, `protocol`, `server`, `port`, `username`, `password`, `is_ssl`, `source`, `activity_status`, `is_non_case_email_skipped`, `is_contact_creation_disabled_if_no_match`) VALUES (1,1,'default',1,'EXAMPLE.ORG',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,0);
 /*!40000 ALTER TABLE `civicrm_mail_settings` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -897,7 +897,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_membership` WRITE;
 /*!40000 ALTER TABLE `civicrm_membership` DISABLE KEYS */;
-INSERT INTO `civicrm_membership` (`id`, `contact_id`, `membership_type_id`, `join_date`, `start_date`, `end_date`, `source`, `status_id`, `is_override`, `status_override_end_date`, `owner_membership_id`, `max_related`, `is_test`, `is_pay_later`, `contribution_recur_id`, `campaign_id`) VALUES (1,103,1,'2020-07-24','2020-07-24','2022-07-23','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(2,132,2,'2020-07-23','2020-07-23','2021-07-22','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(3,179,1,'2020-07-22','2020-07-22','2022-07-21','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(4,5,2,'2020-07-21','2020-07-21','2021-07-20','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(5,12,1,'2018-06-22','2018-06-22','2020-06-21','Check',3,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(6,108,2,'2020-07-19','2020-07-19','2021-07-18','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(7,173,1,'2020-07-18','2020-07-18','2022-07-17','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(8,39,2,'2020-07-17','2020-07-17','2021-07-16','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(9,127,1,'2020-07-16','2020-07-16','2022-07-15','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(10,63,1,'2018-05-13','2018-05-13','2020-05-12','Check',3,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(11,145,3,'2020-07-14','2020-07-14',NULL,'Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(12,159,2,'2020-07-13','2020-07-13','2021-07-12','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(13,188,1,'2020-07-12','2020-07-12','2022-07-11','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(14,67,2,'2020-07-11','2020-07-11','2021-07-10','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(15,80,1,'2018-04-03','2018-04-03','2020-04-02','Donation',3,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(16,17,2,'2020-07-09','2020-07-09','2021-07-08','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(17,131,1,'2020-07-08','2020-07-08','2022-07-07','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(18,7,2,'2020-07-07','2020-07-07','2021-07-06','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(19,161,1,'2020-07-06','2020-07-06','2022-07-05','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(20,95,2,'2019-07-05','2019-07-05','2020-07-04','Check',4,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(21,41,1,'2020-07-04','2020-07-04','2022-07-03','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(22,99,3,'2020-07-03','2020-07-03',NULL,'Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(23,20,1,'2020-07-02','2020-07-02','2022-07-01','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(24,134,2,'2020-07-01','2020-07-01','2021-06-30','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(25,195,1,'2018-01-13','2018-01-13','2020-01-12','Check',3,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(26,74,2,'2020-06-29','2020-06-29','2021-06-28','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(27,164,1,'2020-06-28','2020-06-28','2022-06-27','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(28,13,2,'2020-06-27','2020-06-27','2021-06-26','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(29,78,1,'2020-06-26','2020-06-26','2022-06-25','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(30,156,2,'2019-06-25','2019-06-25','2020-06-24','Check',4,NULL,NULL,NULL,NULL,0,0,NULL,NULL);
+INSERT INTO `civicrm_membership` (`id`, `contact_id`, `membership_type_id`, `join_date`, `start_date`, `end_date`, `source`, `status_id`, `is_override`, `status_override_end_date`, `owner_membership_id`, `max_related`, `is_test`, `is_pay_later`, `contribution_recur_id`, `campaign_id`) VALUES (1,140,1,'2020-10-08','2020-10-08','2022-10-07','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(2,63,2,'2020-10-07','2020-10-07','2021-10-06','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(3,28,1,'2020-10-06','2020-10-06','2022-10-05','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(4,126,2,'2020-10-05','2020-10-05','2021-10-04','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(5,165,2,'2019-10-04','2019-10-04','2020-10-03','Check',4,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(6,62,2,'2020-10-03','2020-10-03','2021-10-02','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(7,134,1,'2020-10-02','2020-10-02','2022-10-01','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(8,81,2,'2020-10-01','2020-10-01','2021-09-30','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(9,59,1,'2020-09-30','2020-09-30','2022-09-29','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(10,178,1,'2018-07-28','2018-07-28','2020-07-27','Check',3,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(11,75,3,'2020-09-28','2020-09-28',NULL,'Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(12,79,2,'2020-09-27','2020-09-27','2021-09-26','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(13,26,1,'2020-09-26','2020-09-26','2022-09-25','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(14,114,2,'2020-09-25','2020-09-25','2021-09-24','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(15,54,1,'2018-06-18','2018-06-18','2020-06-17','Payment',3,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(16,110,2,'2020-09-23','2020-09-23','2021-09-22','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(17,132,1,'2020-09-22','2020-09-22','2022-09-21','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(18,2,2,'2020-09-21','2020-09-21','2021-09-20','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(19,108,1,'2020-09-20','2020-09-20','2022-09-19','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(20,118,1,'2018-05-09','2018-05-09','2020-05-08','Donation',3,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(21,161,1,'2020-09-18','2020-09-18','2022-09-17','Payment',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(22,156,3,'2020-09-17','2020-09-17',NULL,'Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(23,57,1,'2020-09-16','2020-09-16','2022-09-15','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(24,167,2,'2020-09-15','2020-09-15','2021-09-14','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(25,18,1,'2018-03-30','2018-03-30','2020-03-29','Payment',3,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(26,131,2,'2020-09-13','2020-09-13','2021-09-12','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(27,76,1,'2020-09-12','2020-09-12','2022-09-11','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(28,120,2,'2020-09-11','2020-09-11','2021-09-10','Donation',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(29,22,1,'2020-09-10','2020-09-10','2022-09-09','Check',1,NULL,NULL,NULL,NULL,0,0,NULL,NULL),(30,125,1,'2018-02-18','2018-02-18','2020-02-17','Payment',3,NULL,NULL,NULL,NULL,0,0,NULL,NULL);
 /*!40000 ALTER TABLE `civicrm_membership` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -917,7 +917,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_membership_log` WRITE;
 /*!40000 ALTER TABLE `civicrm_membership_log` DISABLE KEYS */;
-INSERT INTO `civicrm_membership_log` (`id`, `membership_id`, `status_id`, `start_date`, `end_date`, `modified_id`, `modified_date`, `membership_type_id`, `max_related`) VALUES (1,4,1,'2020-07-21','2021-07-20',5,'2020-07-24',2,NULL),(2,18,1,'2020-07-07','2021-07-06',7,'2020-07-24',2,NULL),(3,5,3,'2018-06-22','2020-06-21',12,'2020-07-24',1,NULL),(4,28,1,'2020-06-27','2021-06-26',13,'2020-07-24',2,NULL),(5,16,1,'2020-07-09','2021-07-08',17,'2020-07-24',2,NULL),(6,23,1,'2020-07-02','2022-07-01',20,'2020-07-24',1,NULL),(7,8,1,'2020-07-17','2021-07-16',39,'2020-07-24',2,NULL),(8,21,1,'2020-07-04','2022-07-03',41,'2020-07-24',1,NULL),(9,10,3,'2018-05-13','2020-05-12',63,'2020-07-24',1,NULL),(10,14,1,'2020-07-11','2021-07-10',67,'2020-07-24',2,NULL),(11,26,1,'2020-06-29','2021-06-28',74,'2020-07-24',2,NULL),(12,29,1,'2020-06-26','2022-06-25',78,'2020-07-24',1,NULL),(13,15,3,'2018-04-03','2020-04-02',80,'2020-07-24',1,NULL),(14,20,4,'2019-07-05','2020-07-04',95,'2020-07-24',2,NULL),(15,22,1,'2020-07-03',NULL,99,'2020-07-24',3,NULL),(16,1,1,'2020-07-24','2022-07-23',103,'2020-07-24',1,NULL),(17,6,1,'2020-07-19','2021-07-18',108,'2020-07-24',2,NULL),(18,9,1,'2020-07-16','2022-07-15',127,'2020-07-24',1,NULL),(19,17,1,'2020-07-08','2022-07-07',131,'2020-07-24',1,NULL),(20,2,1,'2020-07-23','2021-07-22',132,'2020-07-24',2,NULL),(21,24,1,'2020-07-01','2021-06-30',134,'2020-07-24',2,NULL),(22,11,1,'2020-07-14',NULL,145,'2020-07-24',3,NULL),(23,30,4,'2019-06-25','2020-06-24',156,'2020-07-24',2,NULL),(24,12,1,'2020-07-13','2021-07-12',159,'2020-07-24',2,NULL),(25,19,1,'2020-07-06','2022-07-05',161,'2020-07-24',1,NULL),(26,27,1,'2020-06-28','2022-06-27',164,'2020-07-24',1,NULL),(27,7,1,'2020-07-18','2022-07-17',173,'2020-07-24',1,NULL),(28,3,1,'2020-07-22','2022-07-21',179,'2020-07-24',1,NULL),(29,13,1,'2020-07-12','2022-07-11',188,'2020-07-24',1,NULL),(30,25,3,'2018-01-13','2020-01-12',195,'2020-07-24',1,NULL);
+INSERT INTO `civicrm_membership_log` (`id`, `membership_id`, `status_id`, `start_date`, `end_date`, `modified_id`, `modified_date`, `membership_type_id`, `max_related`) VALUES (1,18,1,'2020-09-21','2021-09-20',2,'2020-10-08',2,NULL),(2,25,3,'2018-03-30','2020-03-29',18,'2020-10-08',1,NULL),(3,29,1,'2020-09-10','2022-09-09',22,'2020-10-08',1,NULL),(4,13,1,'2020-09-26','2022-09-25',26,'2020-10-08',1,NULL),(5,3,1,'2020-10-06','2022-10-05',28,'2020-10-08',1,NULL),(6,15,3,'2018-06-18','2020-06-17',54,'2020-10-08',1,NULL),(7,23,1,'2020-09-16','2022-09-15',57,'2020-10-08',1,NULL),(8,9,1,'2020-09-30','2022-09-29',59,'2020-10-08',1,NULL),(9,6,1,'2020-10-03','2021-10-02',62,'2020-10-08',2,NULL),(10,2,1,'2020-10-07','2021-10-06',63,'2020-10-08',2,NULL),(11,11,1,'2020-09-28',NULL,75,'2020-10-08',3,NULL),(12,27,1,'2020-09-12','2022-09-11',76,'2020-10-08',1,NULL),(13,12,1,'2020-09-27','2021-09-26',79,'2020-10-08',2,NULL),(14,8,1,'2020-10-01','2021-09-30',81,'2020-10-08',2,NULL),(15,19,1,'2020-09-20','2022-09-19',108,'2020-10-08',1,NULL),(16,16,1,'2020-09-23','2021-09-22',110,'2020-10-08',2,NULL),(17,14,1,'2020-09-25','2021-09-24',114,'2020-10-08',2,NULL),(18,20,3,'2018-05-09','2020-05-08',118,'2020-10-08',1,NULL),(19,28,1,'2020-09-11','2021-09-10',120,'2020-10-08',2,NULL),(20,30,3,'2018-02-18','2020-02-17',125,'2020-10-08',1,NULL),(21,4,1,'2020-10-05','2021-10-04',126,'2020-10-08',2,NULL),(22,26,1,'2020-09-13','2021-09-12',131,'2020-10-08',2,NULL),(23,17,1,'2020-09-22','2022-09-21',132,'2020-10-08',1,NULL),(24,7,1,'2020-10-02','2022-10-01',134,'2020-10-08',1,NULL),(25,1,1,'2020-10-08','2022-10-07',140,'2020-10-08',1,NULL),(26,22,1,'2020-09-17',NULL,156,'2020-10-08',3,NULL),(27,21,1,'2020-09-18','2022-09-17',161,'2020-10-08',1,NULL),(28,5,4,'2019-10-04','2020-10-03',165,'2020-10-08',2,NULL),(29,24,1,'2020-09-15','2021-09-14',167,'2020-10-08',2,NULL),(30,10,3,'2018-07-28','2020-07-27',178,'2020-10-08',1,NULL);
 /*!40000 ALTER TABLE `civicrm_membership_log` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -927,7 +927,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_membership_payment` WRITE;
 /*!40000 ALTER TABLE `civicrm_membership_payment` DISABLE KEYS */;
-INSERT INTO `civicrm_membership_payment` (`id`, `membership_id`, `contribution_id`) VALUES (1,1,14),(2,3,15),(3,5,16),(4,7,17),(5,9,18),(6,10,19),(7,13,20),(8,15,21),(9,17,22),(10,19,23),(11,21,24),(12,23,25),(13,25,26),(14,27,27),(15,29,28),(16,2,29),(17,4,30),(18,6,31),(19,8,32),(20,12,33),(21,14,34),(22,16,35),(23,18,36),(24,20,37),(25,24,38),(26,26,39),(27,28,40),(28,30,41),(29,11,42),(30,22,43);
+INSERT INTO `civicrm_membership_payment` (`id`, `membership_id`, `contribution_id`) VALUES (1,1,14),(2,3,15),(3,7,16),(4,9,17),(5,10,18),(6,13,19),(7,15,20),(8,17,21),(9,19,22),(10,20,23),(11,21,24),(12,23,25),(13,25,26),(14,27,27),(15,29,28),(16,30,29),(17,2,30),(18,4,31),(19,5,32),(20,6,33),(21,8,34),(22,12,35),(23,14,36),(24,16,37),(25,18,38),(26,24,39),(27,26,40),(28,28,41),(29,11,42),(30,22,43);
 /*!40000 ALTER TABLE `civicrm_membership_payment` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -957,7 +957,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_menu` WRITE;
 /*!40000 ALTER TABLE `civicrm_menu` DISABLE KEYS */;
-INSERT INTO `civicrm_menu` (`id`, `domain_id`, `path`, `path_arguments`, `title`, `access_callback`, `access_arguments`, `page_callback`, `page_arguments`, `breadcrumb`, `return_url`, `return_url_args`, `component_id`, `is_active`, `is_public`, `is_exposed`, `is_ssl`, `weight`, `type`, `page_type`, `skipBreadcrumb`, `module_data`) VALUES (1,1,'civicrm/profile',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Profile_Page_Router\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(2,1,'civicrm/profile/create',NULL,'CiviCRM Profile Create','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Profile_Page_Router\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(3,1,'civicrm/profile/view',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Profile_Page_View\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(4,1,'civicrm/ajax/api4',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access AJAX API\";}i:1;s:2:\"or\";}','s:18:\"CRM_Api4_Page_AJAX\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(5,1,'civicrm/api4',NULL,'CiviCRM','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Api4_Page_Api4Explorer\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(6,1,'civicrm/activity','action=add&context=standalone','New Activity','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Activity_Form_Activity\";','s:14:\"attachUpload=1\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(7,1,'civicrm/activity/view',NULL,'View Activity','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Activity_Form_ActivityView\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(8,1,'civicrm/ajax/activity',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:15:\"getCaseActivity\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(9,1,'civicrm/ajax/globalrelationships',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:26:\"getCaseGlobalRelationships\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(10,1,'civicrm/ajax/clientrelationships',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:26:\"getCaseClientRelationships\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(11,1,'civicrm/ajax/caseroles',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:12:\"getCaseRoles\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(12,1,'civicrm/ajax/contactactivity',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:18:\"getContactActivity\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(13,1,'civicrm/ajax/activity/convert',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:21:\"convertToCaseActivity\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(14,1,'civicrm/activity/search',NULL,'Find Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Activity_Controller_Search\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(15,1,'civicrm/pcp',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:16:\"CRM_PCP_Form_PCP\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(16,1,'civicrm/pcp/campaign',NULL,'Setup a Personal Campaign Page - Account Information','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:22:\"CRM_PCP_Controller_PCP\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(17,1,'civicrm/pcp/info',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:20:\"CRM_PCP_Page_PCPInfo\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(18,1,'civicrm/admin/pcp','context=contribute','Personal Campaign Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:16:\"CRM_PCP_Page_PCP\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,362,1,0,NULL,'a:2:{s:4:\"desc\";s:49:\"View and manage existing personal campaign pages.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(19,1,'civicrm/upgrade',NULL,'Upgrade CiviCRM','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Upgrade_Page_Upgrade\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(20,1,'civicrm/export',NULL,'Download Errors','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Export_BAO_Export\";i:1;s:6:\"invoke\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(21,1,'civicrm/export/contact',NULL,'Export Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Export_BAO_Export\";i:1;s:6:\"invoke\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Download Errors\";s:3:\"url\";s:23:\"/civicrm/export?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,'a:0:{}'),(22,1,'civicrm/export/standalone',NULL,'Export','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Export_Controller_Standalone\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Download Errors\";s:3:\"url\";s:23:\"/civicrm/export?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(23,1,'civicrm/admin/options/acl_role',NULL,'ACL Roles','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(24,1,'civicrm/acl',NULL,'Manage ACLs','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:16:\"CRM_ACL_Page_ACL\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(25,1,'civicrm/acl/entityrole',NULL,'Assign Users to ACL Roles','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_ACL_Page_EntityRole\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"Manage ACLs\";s:3:\"url\";s:20:\"/civicrm/acl?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(26,1,'civicrm/acl/basic',NULL,'ACL','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_ACL_Page_ACLBasic\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"Manage ACLs\";s:3:\"url\";s:20:\"/civicrm/acl?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(27,1,'civicrm/file',NULL,'Browse Uploaded files','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access uploaded files\";}i:1;s:3:\"and\";}','s:18:\"CRM_Core_Page_File\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(28,1,'civicrm/file/delete',NULL,'Delete File','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:17:\"CRM_Core_BAO_File\";i:1;s:16:\"deleteAttachment\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:21:\"Browse Uploaded files\";s:3:\"url\";s:21:\"/civicrm/file?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(29,1,'civicrm/friend',NULL,'Tell a Friend','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:15:\"CRM_Friend_Form\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(30,1,'civicrm/logout',NULL,'Log out','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:16:\"CRM_Utils_System\";i:1;s:6:\"logout\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,9999,1,1,NULL,'a:0:{}'),(31,1,'civicrm/i18n',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"translate CiviCRM\";}i:1;s:3:\"and\";}','s:18:\"CRM_Core_I18n_Form\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(32,1,'civicrm/ajax/attachment',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access AJAX API\";}i:1;s:2:\"or\";}','a:2:{i:0;s:29:\"CRM_Core_Page_AJAX_Attachment\";i:1;s:10:\"attachFile\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(33,1,'civicrm/api',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Core_Page_Redirect\";','s:16:\"url=civicrm/api3\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(34,1,'civicrm/api3',NULL,'CiviCRM API v3','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Admin_Page_APIExplorer\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(35,1,'civicrm/ajax/apiexample',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:26:\"CRM_Admin_Page_APIExplorer\";i:1;s:14:\"getExampleFile\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(36,1,'civicrm/ajax/apidoc',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:26:\"CRM_Admin_Page_APIExplorer\";i:1;s:6:\"getDoc\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(37,1,'civicrm/ajax/rest',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access AJAX API\";}i:1;s:2:\"or\";}','a:2:{i:0;s:14:\"CRM_Utils_REST\";i:1;s:4:\"ajax\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(38,1,'civicrm/api/json',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:14:\"CRM_Utils_REST\";i:1;s:8:\"ajaxJson\";}','s:16:\"url=civicrm/api3\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(39,1,'civicrm/inline',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:14:\"CRM_Utils_REST\";i:1;s:12:\"loadTemplate\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(40,1,'civicrm/ajax/chart',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Form_ContributionCharts\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(41,1,'civicrm/asset/builder',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','a:2:{i:0;s:23:\"\\Civi\\Core\\AssetBuilder\";i:1;s:7:\"pageRun\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(42,1,'civicrm/contribute/ajax/tableview',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contribute_Page_DashBoard\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(43,1,'civicrm/payment/ipn',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','a:2:{i:0;s:16:\"CRM_Core_Payment\";i:1;s:9:\"handleIPN\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Payment\";s:3:\"url\";s:39:\"/civicrm/payment?reset=1&amp;action=add\";}}',NULL,NULL,2,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(44,1,'civicrm/batch',NULL,'Batch Data Entry','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:20:\"CRM_Batch_Page_Batch\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(45,1,'civicrm/batch/add',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:20:\"CRM_Batch_Form_Batch\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"Batch Data Entry\";s:3:\"url\";s:22:\"/civicrm/batch?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(46,1,'civicrm/batch/entry',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:20:\"CRM_Batch_Form_Entry\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"Batch Data Entry\";s:3:\"url\";s:22:\"/civicrm/batch?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(47,1,'civicrm/ajax/batch',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Batch_Page_AJAX\";i:1;s:9:\"batchSave\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(48,1,'civicrm/ajax/batchlist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Batch_Page_AJAX\";i:1;s:12:\"getBatchList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(49,1,'civicrm/ajax/inline',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Core_Page_AJAX\";i:1;s:3:\"run\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(50,1,'civicrm/dev/qunit',NULL,'QUnit','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:19:\"CRM_Core_Page_QUnit\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(51,1,'civicrm/profile-editor/schema',NULL,'ProfileEditor','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:25:\"CRM_UF_Page_ProfileEditor\";i:1;s:13:\"getSchemaJSON\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(52,1,'civicrm/a',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"\\Civi\\Angular\\Page\\Main\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(53,1,'civicrm/ajax/angular-modules',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','s:26:\"\\Civi\\Angular\\Page\\Modules\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(54,1,'civicrm/ajax/recurringentity/update-mode',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:34:\"CRM_Core_Page_AJAX_RecurringEntity\";i:1;s:10:\"updateMode\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(55,1,'civicrm/recurringentity/preview',NULL,'Confirm dates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:36:\"CRM_Core_Page_RecurringEntityPreview\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(56,1,'civicrm/ajax/l10n-js',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Core_Resources\";i:1;s:20:\"outputLocalizationJS\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(57,1,'civicrm/shortcode',NULL,'Insert CiviCRM Content','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Core_Form_ShortCode\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(58,1,'civicrm/task/add-to-group',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contact_Form_Task_AddToGroup\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(59,1,'civicrm/task/remove-from-group',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:37:\"CRM_Contact_Form_Task_RemoveFromGroup\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(60,1,'civicrm/task/add-to-tag',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Contact_Form_Task_AddToTag\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(61,1,'civicrm/task/remove-from-tag',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Contact_Form_Task_RemoveFromTag\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(62,1,'civicrm/task/send-email',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Form_Task_Email\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(63,1,'civicrm/task/make-mailing-label',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Form_Task_Label\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(64,1,'civicrm/task/pick-profile',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:33:\"CRM_Contact_Form_Task_PickProfile\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(65,1,'civicrm/task/print-document',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Contact_Form_Task_PDF\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(66,1,'civicrm/task/unhold-email',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Contact_Form_Task_Unhold\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(67,1,'civicrm/task/alter-contact-preference',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contact_Form_Task_AlterPreferences\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(68,1,'civicrm/task/delete-contact',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Contact_Form_Task_Delete\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(69,1,'civicrm/payment/form',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:26:\"CRM_Financial_Form_Payment\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Payment\";s:3:\"url\";s:39:\"/civicrm/payment?reset=1&amp;action=add\";}}',NULL,NULL,2,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(70,1,'civicrm/payment/edit',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:30:\"CRM_Financial_Form_PaymentEdit\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Payment\";s:3:\"url\";s:39:\"/civicrm/payment?reset=1&amp;action=add\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(71,1,'civicrm/import',NULL,'Import','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"import contacts\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Import_Controller\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,400,1,1,NULL,'a:0:{}'),(72,1,'civicrm/import/contact',NULL,'Import Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"import contacts\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:6:\"Import\";s:3:\"url\";s:23:\"/civicrm/import?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,410,1,1,NULL,'a:0:{}'),(73,1,'civicrm/import/activity',NULL,'Import Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"import contacts\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Activity_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:6:\"Import\";s:3:\"url\";s:23:\"/civicrm/import?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,420,1,1,NULL,'a:0:{}'),(74,1,'civicrm/import/custom','id=%%id%%','Import Multi-value Custom Data','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Custom_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:6:\"Import\";s:3:\"url\";s:23:\"/civicrm/import?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,420,1,1,NULL,'a:0:{}'),(75,1,'civicrm/ajax/status',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"import contacts\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:28:\"CRM_Contact_Import_Page_AJAX\";i:1;s:6:\"status\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(76,1,'civicrm/custom/add',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Custom_Form_CustomData\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(77,1,'civicrm/ajax/optionlist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Custom_Page_AJAX\";i:1;s:13:\"getOptionList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(78,1,'civicrm/ajax/reorder',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Custom_Page_AJAX\";i:1;s:11:\"fixOrdering\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(79,1,'civicrm/ajax/multirecordfieldlist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Custom_Page_AJAX\";i:1;s:23:\"getMultiRecordFieldList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(80,1,'civicrm/admin/custom/group',NULL,'Custom Data','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Custom_Page_Group\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:2:{s:4:\"desc\";s:109:\"Configure custom fields to collect and store custom data which is not included in the standard CiviCRM forms.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(81,1,'civicrm/admin/custom/group/field',NULL,'Custom Data Fields','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Custom_Page_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,11,1,0,0,'a:0:{}'),(82,1,'civicrm/admin/custom/group/field/option',NULL,'Custom Field - Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Custom_Page_Option\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(83,1,'civicrm/admin/custom/group/field/add',NULL,'Custom Field - Add','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Custom_Form_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(84,1,'civicrm/admin/custom/group/field/update',NULL,'Custom Field - Edit','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Custom_Form_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(85,1,'civicrm/admin/custom/group/field/move',NULL,'Custom Field - Move','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Custom_Form_MoveField\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(86,1,'civicrm/admin/custom/group/field/changetype',NULL,'Custom Field - Change Type','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Custom_Form_ChangeFieldType\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(87,1,'civicrm/admin/uf/group',NULL,'Profiles','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Page_Group\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:2:{s:4:\"desc\";s:151:\"Profiles allow you to aggregate groups of fields and include them in your site as input forms, contact display pages, and search and listings features.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(88,1,'civicrm/admin/uf/group/field',NULL,'CiviCRM Profile Fields','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Page_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,21,1,0,0,'a:0:{}'),(89,1,'civicrm/admin/uf/group/field/add',NULL,'Add Field','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Form_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,22,1,0,NULL,'a:0:{}'),(90,1,'civicrm/admin/uf/group/field/update',NULL,'Edit Field','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Form_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,23,1,0,NULL,'a:0:{}'),(91,1,'civicrm/admin/uf/group/add',NULL,'New CiviCRM Profile','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Form_Group\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,24,1,0,NULL,'a:0:{}'),(92,1,'civicrm/admin/uf/group/update',NULL,'Profile Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Form_Group\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,25,1,0,NULL,'a:0:{}'),(93,1,'civicrm/admin/uf/group/setting',NULL,'AdditionalInfo Form','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_UF_Form_AdvanceSetting\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,0,1,0,NULL,'a:0:{}'),(94,1,'civicrm/admin/options/activity_type',NULL,'Activity Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,30,1,0,NULL,'a:2:{s:4:\"desc\";s:155:\"CiviCRM has several built-in activity types (meetings, phone calls, emails sent). Track other types of interactions by creating custom activity types here.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(95,1,'civicrm/admin/reltype',NULL,'Relationship Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Admin_Page_RelationshipType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,35,1,0,NULL,'a:2:{s:4:\"desc\";s:148:\"Contacts can be linked to each other through Relationships (e.g. Spouse, Employer, etc.). Define the types of relationships you want to record here.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(96,1,'civicrm/admin/options/subtype',NULL,'Contact Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Admin_Page_ContactType\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,40,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(97,1,'civicrm/admin/options/gender',NULL,'Gender Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,45,1,0,NULL,'a:2:{s:4:\"desc\";s:79:\"Options for assigning gender to individual contacts (e.g. Male, Female, Other).\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(98,1,'civicrm/admin/options/individual_prefix',NULL,'Individual Prefixes (Ms, Mr...)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,50,1,0,NULL,'a:2:{s:4:\"desc\";s:66:\"Options for individual contact prefixes (e.g. Ms., Mr., Dr. etc.).\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(99,1,'civicrm/admin/options/individual_suffix',NULL,'Individual Suffixes (Jr, Sr...)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,55,1,0,NULL,'a:2:{s:4:\"desc\";s:61:\"Options for individual contact suffixes (e.g. Jr., Sr. etc.).\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(100,1,'civicrm/admin/locationType',NULL,'Location Types (Home, Work...)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Page_LocationType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,60,1,0,NULL,'a:2:{s:4:\"desc\";s:94:\"Options for categorizing contact addresses and phone numbers (e.g. Home, Work, Billing, etc.).\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(101,1,'civicrm/admin/options/website_type',NULL,'Website Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,65,1,0,NULL,'a:2:{s:4:\"desc\";s:48:\"Options for assigning website types to contacts.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(102,1,'civicrm/admin/options/instant_messenger_service',NULL,'Instant Messenger Services','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,70,1,0,NULL,'a:2:{s:4:\"desc\";s:79:\"List of IM services which can be used when recording screen-names for contacts.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(103,1,'civicrm/admin/options/mobile_provider',NULL,'Mobile Phone Providers','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,75,1,0,NULL,'a:2:{s:4:\"desc\";s:90:\"List of mobile phone providers which can be assigned when recording contact phone numbers.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(104,1,'civicrm/admin/options/phone_type',NULL,'Phone Type','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,80,1,0,NULL,'a:2:{s:4:\"desc\";s:80:\"Options for assigning phone type to contacts (e.g Phone,\n    Mobile, Fax, Pager)\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(105,1,'civicrm/admin/setting/preferences/display',NULL,'Display Preferences','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_Admin_Form_Preferences_Display\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,90,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(106,1,'civicrm/admin/setting/search',NULL,'Search Preferences','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Admin_Form_Setting_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,95,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(107,1,'civicrm/admin/setting/preferences/date',NULL,'View Date Preferences','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Admin_Page_PreferencesDate\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(108,1,'civicrm/admin/menu',NULL,'Navigation Menu','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Admin_Page_Navigation\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,100,1,0,NULL,'a:2:{s:4:\"desc\";s:79:\"Add or remove menu items, and modify the order of items on the navigation menu.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(109,1,'civicrm/admin/options/wordreplacements',NULL,'Word Replacements','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Admin_Form_WordReplacements\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,105,1,0,NULL,'a:2:{s:4:\"desc\";s:18:\"Word Replacements.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(110,1,'civicrm/admin/options/custom_search',NULL,'Manage Custom Searches','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,110,1,0,NULL,'a:2:{s:4:\"desc\";s:225:\"Developers and accidental techies with a bit of PHP and SQL knowledge can create new search forms to handle specific search and reporting needs which aren\'t covered by the built-in Advanced Search and Search Builder features.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(111,1,'civicrm/admin/domain','action=update','Organization Address and Contact Info','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Contact_Form_Domain\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:2:{s:4:\"desc\";s:150:\"Configure primary contact name, email, return-path and address information. This information is used by CiviMail to identify the sending organization.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(112,1,'civicrm/admin/options/from_email_address',NULL,'From Email Addresses','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:2:{s:4:\"desc\";s:74:\"List of Email Addresses which can be used when sending emails to contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(113,1,'civicrm/admin/messageTemplates',NULL,'Message Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:22:\"edit message templates\";i:1;s:34:\"edit user-driven message templates\";i:2;s:38:\"edit system workflow message templates\";}i:1;s:2:\"or\";}','s:31:\"CRM_Admin_Page_MessageTemplates\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,30,1,0,NULL,'a:2:{s:4:\"desc\";s:130:\"Message templates allow you to save and re-use messages with layouts which you can use when sending email to one or more contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(114,1,'civicrm/admin/messageTemplates/add',NULL,'Message Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:22:\"edit message templates\";i:1;s:34:\"edit user-driven message templates\";i:2;s:38:\"edit system workflow message templates\";}i:1;s:2:\"or\";}','s:31:\"CRM_Admin_Form_MessageTemplates\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:17:\"Message Templates\";s:3:\"url\";s:39:\"/civicrm/admin/messageTemplates?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,262,1,0,NULL,'a:1:{s:4:\"desc\";s:26:\"Add/Edit Message Templates\";}'),(115,1,'civicrm/admin/scheduleReminders',NULL,'Schedule Reminders','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:15:\"edit all events\";}i:1;s:2:\"or\";}','s:32:\"CRM_Admin_Page_ScheduleReminders\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,40,1,0,NULL,'a:2:{s:4:\"desc\";s:19:\"Schedule Reminders.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(116,1,'civicrm/admin/weight',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:16:\"CRM_Utils_Weight\";i:1;s:8:\"fixOrder\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(117,1,'civicrm/admin/options/preferred_communication_method',NULL,'Preferred Communication Methods','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,50,1,0,NULL,'a:2:{s:4:\"desc\";s:117:\"One or more preferred methods of communication can be assigned to each contact. Customize the available options here.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(118,1,'civicrm/admin/labelFormats',NULL,'Label Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Page_LabelFormats\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,60,1,0,NULL,'a:2:{s:4:\"desc\";s:67:\"Configure Label Formats that are used when creating mailing labels.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(119,1,'civicrm/admin/pdfFormats',NULL,'Print Page (PDF) Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Admin_Page_PdfFormats\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,70,1,0,NULL,'a:2:{s:4:\"desc\";s:95:\"Configure PDF Page Formats that can be assigned to Message Templates when creating PDF letters.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(120,1,'civicrm/admin/options/communication_style',NULL,'Communication Style Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,75,1,0,NULL,'a:2:{s:4:\"desc\";s:42:\"Options for Communication Style selection.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(121,1,'civicrm/admin/options/email_greeting',NULL,'Email Greeting Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,80,1,0,NULL,'a:2:{s:4:\"desc\";s:75:\"Options for assigning email greetings to individual and household contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(122,1,'civicrm/admin/options/postal_greeting',NULL,'Postal Greeting Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,90,1,0,NULL,'a:2:{s:4:\"desc\";s:76:\"Options for assigning postal greetings to individual and household contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(123,1,'civicrm/admin/options/addressee',NULL,'Addressee Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,100,1,0,NULL,'a:2:{s:4:\"desc\";s:83:\"Options for assigning addressee to individual, household and organization contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(124,1,'civicrm/admin/setting/localization',NULL,'Languages, Currency, Locations','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Admin_Form_Setting_Localization\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:12:\"Localization\";}'),(125,1,'civicrm/admin/setting/preferences/address',NULL,'Address Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_Admin_Form_Preferences_Address\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:12:\"Localization\";}'),(126,1,'civicrm/admin/setting/date',NULL,'Date Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Date\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,30,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:12:\"Localization\";}'),(127,1,'civicrm/admin/options/languages',NULL,'Preferred Languages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,40,1,0,NULL,'a:2:{s:4:\"desc\";s:30:\"Options for contact languages.\";s:10:\"adminGroup\";s:12:\"Localization\";}'),(128,1,'civicrm/admin/access',NULL,'Access Control','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Admin_Page_Access\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:2:{s:4:\"desc\";s:73:\"Grant or deny access to actions (view, edit...), features and components.\";s:10:\"adminGroup\";s:21:\"Users and Permissions\";}'),(129,1,'civicrm/admin/access/wp-permissions',NULL,'WordPress Access Control','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_ACL_Form_WordPress_Permissions\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:14:\"Access Control\";s:3:\"url\";s:29:\"/civicrm/admin/access?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:1:{s:4:\"desc\";s:65:\"Grant access to CiviCRM components and other CiviCRM permissions.\";}'),(130,1,'civicrm/admin/synchUser',NULL,'Synchronize Users to Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Form_CMSUser\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:2:{s:4:\"desc\";s:71:\"Automatically create a CiviCRM contact record for each CMS user record.\";s:10:\"adminGroup\";s:21:\"Users and Permissions\";}'),(131,1,'civicrm/admin/configtask',NULL,'Configuration Checklist','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Admin_Page_ConfigTaskList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}','civicrm/admin/configtask',NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:55:\"List of configuration tasks with links to each setting.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(132,1,'civicrm/admin/setting/component',NULL,'Enable CiviCRM Components','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Admin_Form_Setting_Component\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:2:{s:4:\"desc\";s:269:\"Enable or disable components (e.g. CiviEvent, CiviMember, etc.) for your site based on the features you need. We recommend disabling any components not being used in order to simplify the user interface. You can easily re-enable components at any time from this screen.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(133,1,'civicrm/admin/extensions',NULL,'Manage Extensions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Admin_Page_Extensions\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,120,1,0,NULL,'a:2:{s:4:\"desc\";s:0:\"\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(134,1,'civicrm/admin/extensions/upgrade',NULL,'Database Upgrades','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Admin_Page_ExtensionsUpgrade\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:17:\"Manage Extensions\";s:3:\"url\";s:33:\"/civicrm/admin/extensions?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(135,1,'civicrm/admin/setting/smtp',NULL,'Outbound Email Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Smtp\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(136,1,'civicrm/admin/paymentProcessor',NULL,'Settings - Payment Processor','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:29:\"administer payment processors\";}i:1;s:3:\"and\";}','s:31:\"CRM_Admin_Page_PaymentProcessor\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,30,1,0,NULL,'a:2:{s:4:\"desc\";s:48:\"Payment Processor setup for CiviCRM transactions\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(137,1,'civicrm/admin/setting/mapping',NULL,'Mapping and Geocoding','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Admin_Form_Setting_Mapping\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,40,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(138,1,'civicrm/admin/setting/misc',NULL,'Misc (Undelete, PDFs, Limits, Logging, Captcha, etc.)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:36:\"CRM_Admin_Form_Setting_Miscellaneous\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,50,1,0,NULL,'a:2:{s:4:\"desc\";s:91:\"Enable undelete/move to trash feature, detailed change logging, ReCAPTCHA to protect forms.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(139,1,'civicrm/admin/setting/path',NULL,'Directories','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Path\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,60,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(140,1,'civicrm/admin/setting/url',NULL,'Resource URLs','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Admin_Form_Setting_Url\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,70,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(141,1,'civicrm/admin/setting/updateConfigBackend',NULL,'Cleanup Caches and Update Paths','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:42:\"CRM_Admin_Form_Setting_UpdateConfigBackend\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,80,1,0,NULL,'a:2:{s:4:\"desc\";s:157:\"Reset the Base Directory Path and Base URL settings - generally when a CiviCRM site is moved to another location in the file system and/or to another domain.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(142,1,'civicrm/admin/setting/uf',NULL,'CMS Database Integration','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Admin_Form_Setting_UF\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,90,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(143,1,'civicrm/admin/options/safe_file_extension',NULL,'Safe File Extension Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,100,1,0,NULL,'a:2:{s:4:\"desc\";s:44:\"File Extensions that can be considered safe.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(144,1,'civicrm/admin/options',NULL,'Option Groups','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,105,1,0,NULL,'a:2:{s:4:\"desc\";s:35:\"Access all meta-data option groups.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(145,1,'civicrm/admin/mapping',NULL,'Import/Export Mappings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Mapping\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,110,1,0,NULL,'a:2:{s:4:\"desc\";s:141:\"Import and Export mappings allow you to easily run the same job multiple times. This option allows you to rename or delete existing mappings.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(146,1,'civicrm/admin/setting/debug',NULL,'Debugging','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Admin_Form_Setting_Debugging\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,120,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(147,1,'civicrm/admin/setting/preferences/multisite',NULL,'Multi Site Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Form_Generic\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,130,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(148,1,'civicrm/admin/setting/preferences/campaign',NULL,'CiviCampaign Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Form_Generic\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:3:{s:4:\"desc\";s:40:\"Configure global CiviCampaign behaviors.\";s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(149,1,'civicrm/admin/setting/preferences/event',NULL,'CiviEvent Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:16:\"access CiviEvent\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Form_Generic\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,420,1,0,NULL,'a:2:{s:4:\"desc\";s:37:\"Configure global CiviEvent behaviors.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(150,1,'civicrm/admin/setting/preferences/mailing',NULL,'CiviMail Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"access CiviMail\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_Admin_Form_Preferences_Mailing\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,430,1,0,NULL,'a:2:{s:4:\"desc\";s:36:\"Configure global CiviMail behaviors.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(151,1,'civicrm/admin/setting/preferences/member',NULL,'CiviMember Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:17:\"access CiviMember\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:33:\"CRM_Admin_Form_Preferences_Member\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,390,1,0,NULL,'a:2:{s:4:\"desc\";s:38:\"Configure global CiviMember behaviors.\";s:10:\"adminGroup\";s:10:\"CiviMember\";}'),(152,1,'civicrm/admin/runjobs',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:16:\"CRM_Utils_System\";i:1;s:20:\"executeScheduledJobs\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:1:{s:4:\"desc\";s:36:\"URL used for running scheduled jobs.\";}'),(153,1,'civicrm/admin/job',NULL,'Scheduled Jobs','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:18:\"CRM_Admin_Page_Job\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1370,1,0,NULL,'a:2:{s:4:\"desc\";s:35:\"Managing periodially running tasks.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(154,1,'civicrm/admin/joblog',NULL,'Scheduled Jobs Log','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Admin_Page_JobLog\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1380,1,0,NULL,'a:2:{s:4:\"desc\";s:46:\"Browsing the log of periodially running tasks.\";s:10:\"adminGroup\";s:6:\"Manage\";}'),(155,1,'civicrm/admin/options/grant_type',NULL,'Grant Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,385,1,0,NULL,'a:2:{s:4:\"desc\";s:148:\"List of types which can be assigned to Grants. (Enable CiviGrant from Administer > Systme Settings > Enable Components if you want to track grants.)\";s:10:\"adminGroup\";s:12:\"Option Lists\";}'),(156,1,'civicrm/admin/paymentProcessorType',NULL,'Payment Processor Type','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Admin_Page_PaymentProcessorType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,390,1,0,NULL,'a:1:{s:4:\"desc\";s:34:\"Payment Processor type information\";}'),(157,1,'civicrm/admin',NULL,'Administer CiviCRM','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:20:\"CRM_Admin_Page_Admin\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,9000,1,1,NULL,'a:0:{}'),(158,1,'civicrm/ajax/navmenu',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:7:\"navMenu\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(159,1,'civicrm/ajax/menutree',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:8:\"menuTree\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(160,1,'civicrm/ajax/statusmsg',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:12:\"getStatusMsg\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(161,1,'civicrm/admin/price',NULL,'Price Sets','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_Price_Page_Set\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,380,1,0,NULL,'a:2:{s:4:\"desc\";s:205:\"Price sets allow you to offer multiple options with associated fees (e.g. pre-conference workshops, additional meals, etc.). Configure Price Sets for events which need more than a single set of fee levels.\";s:10:\"adminGroup\";s:9:\"Customize\";}'),(162,1,'civicrm/admin/price/add','action=add','New Price Set','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_Price_Page_Set\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:10:\"Price Sets\";s:3:\"url\";s:28:\"/civicrm/admin/price?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:1:{s:4:\"desc\";s:205:\"Price sets allow you to offer multiple options with associated fees (e.g. pre-conference workshops, additional meals, etc.). Configure Price Sets for events which need more than a single set of fee levels.\";}'),(163,1,'civicrm/admin/price/field',NULL,'Price Fields','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:20:\"CRM_Price_Page_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:10:\"Price Sets\";s:3:\"url\";s:28:\"/civicrm/admin/price?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,0,'a:0:{}'),(164,1,'civicrm/admin/price/field/option',NULL,'Price Field Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:21:\"CRM_Price_Page_Option\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:10:\"Price Sets\";s:3:\"url\";s:28:\"/civicrm/admin/price?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(165,1,'civicrm/ajax/mapping',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:11:\"mappingList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(166,1,'civicrm/ajax/recipientListing',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:16:\"access CiviEvent\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:16:\"recipientListing\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(167,1,'civicrm/admin/sms/provider',NULL,'Sms Providers','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_SMS_Page_Provider\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,500,1,0,NULL,'a:2:{s:4:\"desc\";s:27:\"To configure a sms provider\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(168,1,'civicrm/sms/send',NULL,'New Mass SMS','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:8:\"send SMS\";}i:1;s:3:\"and\";}','s:23:\"CRM_SMS_Controller_Send\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,610,1,1,NULL,'a:0:{}'),(169,1,'civicrm/sms/callback',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_SMS_Page_Callback\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(170,1,'civicrm/admin/badgelayout','action=browse','Event Name Badge Layouts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Badge_Page_Layout\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,399,1,0,NULL,'a:2:{s:4:\"desc\";s:107:\"Configure name badge layouts for event participants, including logos and what data to include on the badge.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(171,1,'civicrm/admin/badgelayout/add',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Badge_Form_Layout\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:24:\"Event Name Badge Layouts\";s:3:\"url\";s:52:\"/civicrm/admin/badgelayout?reset=1&amp;action=browse\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(172,1,'civicrm/admin/ckeditor',NULL,'Configure CKEditor','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Admin_Page_CKEditorConfig\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(173,1,'civicrm',NULL,'CiviCRM','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Contact_Page_DashBoard\";',NULL,'a:0:{}',NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,'a:0:{}'),(174,1,'civicrm/dashboard',NULL,'CiviCRM Home','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Contact_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,1,NULL,'a:0:{}'),(175,1,'civicrm/dashlet',NULL,'CiviCRM Dashlets','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Contact_Page_Dashlet\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,1,NULL,'a:0:{}'),(176,1,'civicrm/contact/search',NULL,'Find Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:8:\"mode=256\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,10,1,1,NULL,'a:0:{}'),(177,1,'civicrm/contact/image',NULL,'Process Uploaded Images','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access uploaded files\";}i:1;s:3:\"and\";}','a:2:{i:0;s:23:\"CRM_Contact_BAO_Contact\";i:1;s:12:\"processImage\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(178,1,'civicrm/contact/imagefile',NULL,'Get Image File','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','s:26:\"CRM_Contact_Page_ImageFile\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(179,1,'civicrm/contact/search/basic',NULL,'Find Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:8:\"mode=256\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(180,1,'civicrm/contact/search/advanced',NULL,'Advanced Search','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:8:\"mode=512\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,12,1,1,NULL,'a:0:{}'),(181,1,'civicrm/contact/search/builder',NULL,'Search Builder','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:9:\"mode=8192\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,14,1,1,NULL,'a:0:{}'),(182,1,'civicrm/contact/search/custom',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:10:\"mode=16384\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(183,1,'civicrm/contact/search/custom/list',NULL,'Custom Searches','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Page_CustomSearch\";','s:10:\"mode=16384\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,16,1,1,NULL,'a:0:{}'),(184,1,'civicrm/contact/add',NULL,'New Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:24:\"CRM_Contact_Form_Contact\";','s:13:\"addSequence=1\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(185,1,'civicrm/contact/add/individual','ct=Individual','New Individual','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:12:\"add contacts\";}i:1;s:3:\"and\";}','s:24:\"CRM_Contact_Form_Contact\";','s:13:\"addSequence=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Contact\";s:3:\"url\";s:28:\"/civicrm/contact/add?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(186,1,'civicrm/contact/add/household','ct=Household','New Household','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:12:\"add contacts\";}i:1;s:3:\"and\";}','s:24:\"CRM_Contact_Form_Contact\";','s:13:\"addSequence=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Contact\";s:3:\"url\";s:28:\"/civicrm/contact/add?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(187,1,'civicrm/contact/add/organization','ct=Organization','New Organization','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:12:\"add contacts\";}i:1;s:3:\"and\";}','s:24:\"CRM_Contact_Form_Contact\";','s:13:\"addSequence=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Contact\";s:3:\"url\";s:28:\"/civicrm/contact/add?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(188,1,'civicrm/contact/relatedcontact',NULL,'Edit Related Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"access Contact Dashboard\";}i:1;s:3:\"and\";}','s:31:\"CRM_Contact_Form_RelatedContact\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(189,1,'civicrm/contact/merge',NULL,'Merge Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','s:22:\"CRM_Contact_Form_Merge\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(190,1,'civicrm/contact/email',NULL,'Email a Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Form_Task_Email\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(191,1,'civicrm/contact/map',NULL,'Map Location(s)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Contact_Form_Task_Map\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(192,1,'civicrm/contact/map/event',NULL,'Map Event Location','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Contact_Form_Task_Map_Event\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Map Location(s)\";s:3:\"url\";s:28:\"/civicrm/contact/map?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(193,1,'civicrm/contact/view','cid=%%cid%%','Contact Summary','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:29:\"CRM_Contact_Page_View_Summary\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(194,1,'civicrm/contact/view/delete',NULL,'Delete Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:28:\"CRM_Contact_Form_Task_Delete\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(195,1,'civicrm/contact/view/activity','show=1,cid=%%cid%%','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:21:\"CRM_Activity_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(196,1,'civicrm/activity/add','action=add','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Activity_Form_Activity\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(197,1,'civicrm/activity/email/add','action=add','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Form_Task_Email\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(198,1,'civicrm/activity/pdf/add','action=add','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Contact_Form_Task_PDF\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(199,1,'civicrm/contact/view/rel','cid=%%cid%%','Relationships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:34:\"CRM_Contact_Page_View_Relationship\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(200,1,'civicrm/contact/view/group','cid=%%cid%%','Groups','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:34:\"CRM_Contact_Page_View_GroupContact\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(201,1,'civicrm/contact/view/smartgroup','cid=%%cid%%','Smart Groups','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:39:\"CRM_Contact_Page_View_ContactSmartGroup\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(202,1,'civicrm/contact/view/note','cid=%%cid%%','Notes','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:26:\"CRM_Contact_Page_View_Note\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(203,1,'civicrm/contact/view/tag','cid=%%cid%%','Tags','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:25:\"CRM_Contact_Page_View_Tag\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(204,1,'civicrm/contact/view/cd',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:32:\"CRM_Contact_Page_View_CustomData\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(205,1,'civicrm/contact/view/cd/edit',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:27:\"CRM_Contact_Form_CustomData\";','s:13:\"addSequence=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(206,1,'civicrm/contact/view/vcard',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:27:\"CRM_Contact_Page_View_Vcard\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(207,1,'civicrm/contact/view/print',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:27:\"CRM_Contact_Page_View_Print\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(208,1,'civicrm/contact/view/log',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:25:\"CRM_Contact_Page_View_Log\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(209,1,'civicrm/user',NULL,'Contact Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"access Contact Dashboard\";}i:1;s:3:\"and\";}','s:35:\"CRM_Contact_Page_View_UserDashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(210,1,'civicrm/dashlet/activity',NULL,'Activity Dashlet','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Dashlet_Page_Activity\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(211,1,'civicrm/dashlet/blog',NULL,'CiviCRM Blog','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Dashlet_Page_Blog\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(212,1,'civicrm/dashlet/getting-started',NULL,'CiviCRM Resources','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Dashlet_Page_GettingStarted\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(213,1,'civicrm/ajax/relation',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:12:\"relationship\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(214,1,'civicrm/ajax/groupTree',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:9:\"groupTree\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(215,1,'civicrm/ajax/custom',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:11:\"customField\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(216,1,'civicrm/ajax/customvalue',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:17:\"deleteCustomValue\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(217,1,'civicrm/ajax/cmsuser',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:13:\"checkUserName\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(218,1,'civicrm/ajax/checkemail',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:15:\"getContactEmail\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(219,1,'civicrm/ajax/checkphone',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:15:\"getContactPhone\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(220,1,'civicrm/ajax/subtype',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:13:\"buildSubTypes\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(221,1,'civicrm/ajax/dashboard',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:9:\"dashboard\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(222,1,'civicrm/ajax/signature',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:12:\"getSignature\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(223,1,'civicrm/ajax/pdfFormat',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:9:\"pdfFormat\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(224,1,'civicrm/ajax/paperSize',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:9:\"paperSize\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(225,1,'civicrm/ajax/contactref',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:31:\"access contact reference fields\";i:1;s:15:\" access CiviCRM\";}i:1;s:2:\"or\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:16:\"contactReference\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(226,1,'civicrm/dashlet/myCases',NULL,'Case Dashlet','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Dashlet_Page_MyCases\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(227,1,'civicrm/dashlet/allCases',NULL,'All Cases Dashlet','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:31:\"access all cases and activities\";}i:1;s:3:\"and\";}','s:25:\"CRM_Dashlet_Page_AllCases\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(228,1,'civicrm/dashlet/casedashboard',NULL,'Case Dashboard Dashlet','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Dashlet_Page_CaseDashboard\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(229,1,'civicrm/contact/deduperules',NULL,'Find and Merge Duplicate Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer dedupe rules\";i:1;s:24:\"merge duplicate contacts\";}i:1;s:2:\"or\";}','s:28:\"CRM_Contact_Page_DedupeRules\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,105,1,0,NULL,'a:2:{s:4:\"desc\";s:158:\"Manage the rules used to identify potentially duplicate contact records. Scan for duplicates using a selected rule and merge duplicate contact data as needed.\";s:10:\"adminGroup\";s:6:\"Manage\";}'),(230,1,'civicrm/contact/dedupefind',NULL,'Find and Merge Duplicate Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Page_DedupeFind\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(231,1,'civicrm/ajax/dedupefind',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:10:\"getDedupes\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(232,1,'civicrm/contact/dedupemerge',NULL,'Batch Merge Duplicate Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','s:28:\"CRM_Contact_Page_DedupeMerge\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(233,1,'civicrm/dedupe/exception',NULL,'Dedupe Exceptions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contact_Page_DedupeException\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,110,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:6:\"Manage\";}'),(234,1,'civicrm/ajax/dedupeRules',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:16:\"buildDedupeRules\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(235,1,'civicrm/contact/view/useradd','cid=%%cid%%','Add User','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:29:\"CRM_Contact_Page_View_Useradd\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(236,1,'civicrm/ajax/markSelection',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:22:\"selectUnselectContacts\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(237,1,'civicrm/ajax/toggleDedupeSelect',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:18:\"toggleDedupeSelect\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(238,1,'civicrm/ajax/flipDupePairs',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:13:\"flipDupePairs\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(239,1,'civicrm/activity/sms/add','action=add','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:8:\"send SMS\";}i:1;s:3:\"and\";}','s:25:\"CRM_Contact_Form_Task_SMS\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(240,1,'civicrm/ajax/contactrelationships',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"view my contact\";}i:1;s:2:\"or\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:23:\"getContactRelationships\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(241,1,'civicrm/ajax/jqState',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:27:\"CRM_Core_Page_AJAX_Location\";i:1;s:7:\"jqState\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(242,1,'civicrm/ajax/jqCounty',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:27:\"CRM_Core_Page_AJAX_Location\";i:1;s:8:\"jqCounty\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(243,1,'civicrm/group',NULL,'Manage Groups','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:20:\"CRM_Group_Page_Group\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,30,1,1,NULL,'a:0:{}'),(244,1,'civicrm/group/search',NULL,'Group Members','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:8:\"mode=256\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Manage Groups\";s:3:\"url\";s:22:\"/civicrm/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:7:\"comment\";s:164:\"Note: group search already respect ACL, so a strict permission at url level is not required. A simple/basic permission like \'access CiviCRM\' could be used. CRM-5417\";}'),(245,1,'civicrm/group/add',NULL,'New Group','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:11:\"edit groups\";}i:1;s:3:\"and\";}','s:20:\"CRM_Group_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Manage Groups\";s:3:\"url\";s:22:\"/civicrm/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(246,1,'civicrm/ajax/grouplist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Group_Page_AJAX\";i:1;s:12:\"getGroupList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(247,1,'civicrm/tag',NULL,'Tags (Categories)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:11:\"manage tags\";}i:1;s:2:\"or\";}','s:16:\"CRM_Tag_Page_Tag\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,25,1,0,NULL,'a:2:{s:4:\"desc\";s:158:\"Tags are useful for segmenting the contacts in your database into categories (e.g. Staff Member, Donor, Volunteer, etc.). Create and edit available tags here.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(248,1,'civicrm/tag/edit','action=add','New Tag','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:11:\"manage tags\";}i:1;s:2:\"or\";}','s:17:\"CRM_Tag_Form_Edit\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:17:\"Tags (Categories)\";s:3:\"url\";s:20:\"/civicrm/tag?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(249,1,'civicrm/tag/merge',NULL,'Merge Tags','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:11:\"manage tags\";}i:1;s:2:\"or\";}','s:18:\"CRM_Tag_Form_Merge\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:17:\"Tags (Categories)\";s:3:\"url\";s:20:\"/civicrm/tag?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(250,1,'civicrm/ajax/tagTree',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:11:\"manage tags\";}i:1;s:2:\"or\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:10:\"getTagTree\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(251,1,'civicrm/custom',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Custom_Form_CustomDataByType\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(252,1,'civicrm/event/manage/pcp',NULL,'Personal Campaign Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_PCP_Form_Event\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,540,1,1,NULL,'a:0:{}'),(253,1,'civicrm/event/pcp',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:16:\"CRM_PCP_Form_PCP\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(254,1,'civicrm/event/campaign',NULL,'Setup a Personal Campaign Page - Account Information','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:22:\"CRM_PCP_Controller_PCP\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(255,1,'civicrm/event',NULL,'CiviEvent Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:24:\"CRM_Event_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,800,1,1,NULL,'a:1:{s:9:\"component\";s:9:\"CiviEvent\";}'),(256,1,'civicrm/participant/add','action=add','Register New Participant','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_Event_Page_Tab\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:9:\"CiviEvent\";}'),(257,1,'civicrm/event/info',NULL,'Event Information','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:24:\"CRM_Event_Page_EventInfo\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(258,1,'civicrm/event/register',NULL,'Event Registration','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:33:\"CRM_Event_Controller_Registration\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,1,1,1,0,NULL,'a:0:{}'),(259,1,'civicrm/event/confirm',NULL,'Confirm Event Registration','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:46:\"CRM_Event_Form_Registration_ParticipantConfirm\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,1,1,1,0,NULL,'a:0:{}'),(260,1,'civicrm/event/ical',NULL,'Current and Upcoming Events','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:15:\"view event info\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Event_ICalendar\";i:1;s:3:\"run\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(261,1,'civicrm/event/list',NULL,'Current and Upcoming Events','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:15:\"view event info\";}i:1;s:3:\"and\";}','s:19:\"CRM_Event_Page_List\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(262,1,'civicrm/event/participant',NULL,'Event Participants List','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:23:\"view event participants\";}i:1;s:3:\"and\";}','s:33:\"CRM_Event_Page_ParticipantListing\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(263,1,'civicrm/admin/event',NULL,'Manage Events','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:26:\"CRM_Event_Page_ManageEvent\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,370,1,0,NULL,'a:2:{s:4:\"desc\";s:136:\"Create and edit event configuration including times, locations, online registration forms, and fees. Links for iCal and RSS syndication.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(264,1,'civicrm/admin/eventTemplate',NULL,'Event Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:28:\"CRM_Admin_Page_EventTemplate\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,375,1,0,NULL,'a:2:{s:4:\"desc\";s:115:\"Administrators can create Event Templates - which are basically master event records pre-filled with default values\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(265,1,'civicrm/admin/options/event_type',NULL,'Event Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,385,1,0,NULL,'a:2:{s:4:\"desc\";s:143:\"Use Event Types to categorize your events. Event feeds can be filtered by Event Type and participant searches can use Event Type as a criteria.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(266,1,'civicrm/admin/participant_status',NULL,'Participant Status','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:36:\"CRM_Admin_Page_ParticipantStatusType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,390,1,0,NULL,'a:2:{s:4:\"desc\";s:154:\"Define statuses for event participants here (e.g. Registered, Attended, Cancelled...). You can then assign statuses and search for participants by status.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(267,1,'civicrm/admin/options/participant_role',NULL,'Participant Role','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,395,1,0,NULL,'a:2:{s:4:\"desc\";s:138:\"Define participant roles for events here (e.g. Attendee, Host, Speaker...). You can then assign roles and search for participants by role.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(268,1,'civicrm/admin/options/participant_listing',NULL,'Participant Listing Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,398,1,0,NULL,'a:2:{s:4:\"desc\";s:48:\"Template to control participant listing display.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(269,1,'civicrm/admin/options/conference_slot',NULL,'Conference Slot Labels','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,415,1,0,NULL,'a:2:{s:4:\"desc\";s:35:\"Define conference slots and labels.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(270,1,'civicrm/event/search',NULL,'Find Participants','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:27:\"CRM_Event_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,810,1,1,NULL,'a:0:{}'),(271,1,'civicrm/event/manage',NULL,'Manage Events','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:26:\"CRM_Event_Page_ManageEvent\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,820,1,1,NULL,'a:0:{}'),(272,1,'civicrm/event/badge',NULL,'Print Event Name Badge','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:25:\"CRM_Event_Form_Task_Badge\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(273,1,'civicrm/event/manage/settings',NULL,'Event Info and Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:36:\"CRM_Event_Form_ManageEvent_EventInfo\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,910,1,0,NULL,'a:0:{}'),(274,1,'civicrm/event/manage/location',NULL,'Event Location','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:35:\"CRM_Event_Form_ManageEvent_Location\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,930,1,0,NULL,'a:0:{}'),(275,1,'civicrm/event/manage/fee',NULL,'Event Fees','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:30:\"CRM_Event_Form_ManageEvent_Fee\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,920,1,0,NULL,'a:0:{}'),(276,1,'civicrm/event/manage/registration',NULL,'Event Online Registration','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:39:\"CRM_Event_Form_ManageEvent_Registration\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,930,1,0,NULL,'a:0:{}'),(277,1,'civicrm/event/manage/friend',NULL,'Tell a Friend','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:21:\"CRM_Friend_Form_Event\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,940,1,0,NULL,'a:0:{}'),(278,1,'civicrm/event/manage/reminder',NULL,'Schedule Reminders','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:44:\"CRM_Event_Form_ManageEvent_ScheduleReminders\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,950,1,0,NULL,'a:0:{}'),(279,1,'civicrm/event/manage/repeat',NULL,'Repeat Event','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:33:\"CRM_Event_Form_ManageEvent_Repeat\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,960,1,0,NULL,'a:0:{}'),(280,1,'civicrm/event/manage/conference',NULL,'Conference Slots','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:37:\"CRM_Event_Form_ManageEvent_Conference\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,950,1,0,NULL,'a:0:{}'),(281,1,'civicrm/event/add','action=add','New Event','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:36:\"CRM_Event_Form_ManageEvent_EventInfo\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,830,1,0,NULL,'a:0:{}'),(282,1,'civicrm/event/import',NULL,'Import Participants','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:16:\"access CiviEvent\";i:1;s:23:\"edit event participants\";}i:1;s:3:\"and\";}','s:27:\"CRM_Event_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,840,1,1,NULL,'a:0:{}'),(283,1,'civicrm/event/price',NULL,'Manage Price Sets','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_Price_Page_Set\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,850,1,1,NULL,'a:0:{}'),(284,1,'civicrm/event/selfsvcupdate',NULL,'Self-service Registration Update','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:28:\"CRM_Event_Form_SelfSvcUpdate\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,880,1,1,NULL,'a:0:{}'),(285,1,'civicrm/event/selfsvctransfer',NULL,'Self-service Registration Transfer','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:30:\"CRM_Event_Form_SelfSvcTransfer\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,890,1,1,NULL,'a:0:{}'),(286,1,'civicrm/contact/view/participant',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:18:\"CRM_Event_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,4,1,0,NULL,'a:0:{}'),(287,1,'civicrm/ajax/eventFee',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Event_Page_AJAX\";i:1;s:8:\"eventFee\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(288,1,'civicrm/ajax/locBlock',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','a:2:{i:0;s:27:\"CRM_Core_Page_AJAX_Location\";i:1;s:11:\"getLocBlock\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(289,1,'civicrm/event/participant/feeselection',NULL,'Change Registration Selections','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:38:\"CRM_Event_Form_ParticipantFeeSelection\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:23:\"Event Participants List\";s:3:\"url\";s:34:\"/civicrm/event/participant?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(290,1,'civicrm/admin/contribute/pcp',NULL,'Personal Campaign Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_PCP_Form_Contribute\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,450,1,0,NULL,'a:0:{}'),(291,1,'civicrm/contribute/campaign',NULL,'Setup a Personal Campaign Page - Account Information','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:22:\"CRM_PCP_Controller_PCP\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(292,1,'civicrm/contribute',NULL,'CiviContribute Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contribute_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,500,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(293,1,'civicrm/contribute/add','action=add','New Contribution','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:23:\"CRM_Contribute_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(294,1,'civicrm/contribute/chart',NULL,'Contribution Summary - Chart View','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Form_ContributionCharts\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(295,1,'civicrm/contribute/transact',NULL,'CiviContribute','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Controller_Contribution\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,1,NULL,1,0,1,0,NULL,'a:0:{}'),(296,1,'civicrm/admin/contribute',NULL,'Manage Contribution Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:36:\"CRM_Contribute_Page_ContributionPage\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,360,1,0,NULL,'a:2:{s:4:\"desc\";s:242:\"CiviContribute allows you to create and maintain any number of Online Contribution Pages. You can create different pages for different programs or campaigns - and customize text, amounts, types of information collected from contributors, etc.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(297,1,'civicrm/admin/contribute/settings',NULL,'Title and Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:45:\"CRM_Contribute_Form_ContributionPage_Settings\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:0:{}'),(298,1,'civicrm/admin/contribute/amount',NULL,'Contribution Amounts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:43:\"CRM_Contribute_Form_ContributionPage_Amount\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,410,1,0,NULL,'a:0:{}'),(299,1,'civicrm/admin/contribute/membership',NULL,'Membership Section','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Member_Form_MembershipBlock\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,420,1,0,NULL,'a:0:{}'),(300,1,'civicrm/admin/contribute/custom',NULL,'Include Profiles','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:43:\"CRM_Contribute_Form_ContributionPage_Custom\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,430,1,0,NULL,'a:0:{}'),(301,1,'civicrm/admin/contribute/thankyou',NULL,'Thank-you and Receipting','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:45:\"CRM_Contribute_Form_ContributionPage_ThankYou\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,430,1,0,NULL,'a:0:{}'),(302,1,'civicrm/admin/contribute/friend',NULL,'Tell a Friend','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Friend_Form_Contribute\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,440,1,0,NULL,'a:0:{}'),(303,1,'civicrm/admin/contribute/widget',NULL,'Configure Widget','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:43:\"CRM_Contribute_Form_ContributionPage_Widget\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,460,1,0,NULL,'a:0:{}'),(304,1,'civicrm/admin/contribute/premium',NULL,'Premiums','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:44:\"CRM_Contribute_Form_ContributionPage_Premium\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,470,1,0,NULL,'a:0:{}'),(305,1,'civicrm/admin/contribute/addProductToPage',NULL,'Add Products to This Page','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:47:\"CRM_Contribute_Form_ContributionPage_AddProduct\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,480,1,0,NULL,'a:0:{}'),(306,1,'civicrm/admin/contribute/add','action=add','New Contribution Page','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:42:\"CRM_Contribute_Controller_ContributionPage\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(307,1,'civicrm/admin/contribute/managePremiums',NULL,'Manage Premiums','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_Contribute_Page_ManagePremiums\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,365,1,0,NULL,'a:2:{s:4:\"desc\";s:175:\"CiviContribute allows you to configure any number of Premiums which can be offered to contributors as incentives / thank-you gifts. Define the premiums you want to offer here.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(308,1,'civicrm/admin/financial/financialType',NULL,'Financial Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Financial_Page_FinancialType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,580,1,0,NULL,'a:2:{s:4:\"desc\";s:64:\"Formerly civicrm_contribution_type merged into this table in 4.1\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(309,1,'civicrm/payment','action=add','New Payment','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:37:\"CRM_Contribute_Form_AdditionalPayment\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(310,1,'civicrm/admin/financial/financialAccount',NULL,'Financial Accounts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Financial_Page_FinancialAccount\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,370,1,0,NULL,'a:2:{s:4:\"desc\";s:128:\"Financial types are used to categorize contributions for reporting and accounting purposes. These are also referred to as Funds.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(311,1,'civicrm/admin/options/payment_instrument',NULL,'Payment Methods','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,380,1,0,NULL,'a:2:{s:4:\"desc\";s:224:\"You may choose to record the payment instrument used for each contribution. Common payment methods are installed by default (e.g. Check, Cash, Credit Card...). If your site requires additional payment methods, add them here.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(312,1,'civicrm/admin/options/accept_creditcard',NULL,'Accepted Credit Cards','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,395,1,0,NULL,'a:2:{s:4:\"desc\";s:94:\"Credit card options that will be offered to contributors using your Online Contribution pages.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(313,1,'civicrm/admin/options/soft_credit_type',NULL,'Soft Credit Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:86:\"Soft Credit Types that will be offered to contributors during soft credit contribution\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(314,1,'civicrm/contact/view/contribution',NULL,'Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:23:\"CRM_Contribute_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(315,1,'civicrm/contact/view/contributionrecur',NULL,'Recurring Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:37:\"CRM_Contribute_Page_ContributionRecur\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(316,1,'civicrm/contact/view/contribution/additionalinfo',NULL,'Additional Info','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:34:\"CRM_Contribute_Form_AdditionalInfo\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}i:2;a:2:{s:5:\"title\";s:13:\"Contributions\";s:3:\"url\";s:42:\"/civicrm/contact/view/contribution?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(317,1,'civicrm/contribute/search',NULL,'Find Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contribute_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,510,1,1,NULL,'a:0:{}'),(318,1,'civicrm/contribute/searchBatch',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:37:\"CRM_Contribute_Controller_SearchBatch\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,588,1,1,NULL,'a:0:{}'),(319,1,'civicrm/contribute/import',NULL,'Import Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:21:\"access CiviContribute\";i:1;s:18:\"edit contributions\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contribute_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,520,1,1,NULL,'a:0:{}'),(320,1,'civicrm/contribute/manage',NULL,'Manage Contribution Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:36:\"CRM_Contribute_Page_ContributionPage\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,530,1,1,NULL,'a:0:{}'),(321,1,'civicrm/contribute/additionalinfo',NULL,'AdditionalInfo Form','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:34:\"CRM_Contribute_Form_AdditionalInfo\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,0,1,0,NULL,'a:0:{}'),(322,1,'civicrm/ajax/permlocation',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','a:2:{i:0;s:27:\"CRM_Core_Page_AJAX_Location\";i:1;s:23:\"getPermissionedLocation\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(323,1,'civicrm/contribute/unsubscribe',NULL,'Cancel Subscription','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Form_CancelSubscription\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(324,1,'civicrm/contribute/onbehalf',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:43:\"CRM_Contribute_Form_Contribution_OnBehalfOf\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(325,1,'civicrm/contribute/updatebilling',NULL,'Update Billing Details','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:33:\"CRM_Contribute_Form_UpdateBilling\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(326,1,'civicrm/contribute/updaterecur',NULL,'Update Subscription','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Form_UpdateSubscription\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(327,1,'civicrm/contribute/subscriptionstatus',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Page_SubscriptionStatus\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(328,1,'civicrm/admin/financial/financialType/accounts',NULL,'Financial Type Accounts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:39:\"CRM_Financial_Page_FinancialTypeAccount\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:15:\"Financial Types\";s:3:\"url\";s:46:\"/civicrm/admin/financial/financialType?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,581,1,0,NULL,'a:0:{}'),(329,1,'civicrm/financial/batch',NULL,'Accounting Batch','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"create manual batch\";}i:1;s:3:\"and\";}','s:33:\"CRM_Financial_Page_FinancialBatch\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,585,1,0,NULL,'a:0:{}'),(330,1,'civicrm/financial/financialbatches',NULL,'Accounting Batches','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Financial_Page_Batch\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,586,1,0,NULL,'a:0:{}'),(331,1,'civicrm/batchtransaction',NULL,'Accounting Batch','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Financial_Page_BatchTransaction\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,600,1,0,NULL,'a:0:{}'),(332,1,'civicrm/financial/batch/export',NULL,'Accounting Batch Export','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"create manual batch\";}i:1;s:3:\"and\";}','s:25:\"CRM_Financial_Form_Export\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"Accounting Batch\";s:3:\"url\";s:32:\"/civicrm/financial/batch?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,610,1,0,NULL,'a:0:{}'),(333,1,'civicrm/payment/view','action=view','View Payment','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:31:\"CRM_Contribute_Page_PaymentInfo\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Payment\";s:3:\"url\";s:39:\"/civicrm/payment?reset=1&amp;action=add\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(334,1,'civicrm/admin/setting/preferences/contribute',NULL,'CiviContribute Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:21:\"access CiviContribute\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:37:\"CRM_Admin_Form_Preferences_Contribute\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:42:\"Configure global CiviContribute behaviors.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(335,1,'civicrm/contribute/invoice',NULL,'PDF Invoice','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:20:\"checkDownloadInvoice\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','a:2:{i:0;s:32:\"CRM_Contribute_Form_Task_Invoice\";i:1;s:11:\"getPrintPDF\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,620,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(336,1,'civicrm/contribute/invoice/email',NULL,'Email Invoice','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:20:\"checkDownloadInvoice\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contribute_Form_Task_Invoice\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"PDF Invoice\";s:3:\"url\";s:35:\"/civicrm/contribute/invoice?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,630,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(337,1,'civicrm/ajax/softcontributionlist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:24:\"CRM_Contribute_Page_AJAX\";i:1;s:23:\"getSoftContributionRows\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(338,1,'civicrm/contribute/contributionrecur-payments',NULL,'Recurring Contribution\'s Payments','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:45:\"CRM_Contribute_Page_ContributionRecurPayments\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(339,1,'civicrm/membership/recurring-contributions',NULL,'Membership Recurring Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:38:\"CRM_Member_Page_RecurringContributions\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(340,1,'civicrm/member',NULL,'CiviMember Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','s:25:\"CRM_Member_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,3,NULL,NULL,NULL,0,700,1,1,NULL,'a:1:{s:9:\"component\";s:10:\"CiviMember\";}'),(341,1,'civicrm/member/add','action=add','New Membership','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','s:19:\"CRM_Member_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviMember Dashboard\";s:3:\"url\";s:23:\"/civicrm/member?reset=1\";}}',NULL,NULL,3,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:10:\"CiviMember\";}'),(342,1,'civicrm/admin/member/membershipType',NULL,'Membership Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Member_Page_MembershipType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,370,1,0,NULL,'a:2:{s:4:\"desc\";s:174:\"Define the types of memberships you want to offer. For each type, you can specify a \'name\' (Gold Member, Honor Society Member...), a description, duration, and a minimum fee.\";s:10:\"adminGroup\";s:10:\"CiviMember\";}'),(343,1,'civicrm/admin/member/membershipStatus',NULL,'Membership Status Rules','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Member_Page_MembershipStatus\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,380,1,0,NULL,'a:2:{s:4:\"desc\";s:187:\"Status \'rules\' define the current status for a membership based on that membership\'s start and end dates. You can adjust the default status options and rules as needed to meet your needs.\";s:10:\"adminGroup\";s:10:\"CiviMember\";}'),(344,1,'civicrm/contact/view/membership','force=1,cid=%%cid%%','Memberships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:19:\"CRM_Member_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,2,1,0,NULL,'a:0:{}'),(345,1,'civicrm/membership/view',NULL,'Memberships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','s:30:\"CRM_Member_Form_MembershipView\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,390,1,0,NULL,'a:0:{}'),(346,1,'civicrm/member/search',NULL,'Find Memberships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','s:28:\"CRM_Member_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviMember Dashboard\";s:3:\"url\";s:23:\"/civicrm/member?reset=1\";}}',NULL,NULL,3,NULL,NULL,NULL,0,710,1,1,NULL,'a:0:{}'),(347,1,'civicrm/member/import',NULL,'Import Memberships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:17:\"access CiviMember\";i:1;s:16:\"edit memberships\";}i:1;s:3:\"and\";}','s:28:\"CRM_Member_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviMember Dashboard\";s:3:\"url\";s:23:\"/civicrm/member?reset=1\";}}',NULL,NULL,3,NULL,NULL,NULL,0,720,1,1,NULL,'a:0:{}'),(348,1,'civicrm/ajax/memType',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Member_Page_AJAX\";i:1;s:21:\"getMemberTypeDefaults\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(349,1,'civicrm/admin/member/membershipType/add',NULL,'Membership Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:17:\"access CiviMember\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Member_Form_MembershipType\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:16:\"Membership Types\";s:3:\"url\";s:44:\"/civicrm/admin/member/membershipType?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(350,1,'civicrm/mailing',NULL,'CiviMail','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";i:2;s:8:\"send SMS\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,600,1,1,NULL,'a:1:{s:9:\"component\";s:8:\"CiviMail\";}'),(351,1,'civicrm/admin/mail',NULL,'Mailer Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Mail\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:2:{s:4:\"desc\";s:61:\"Configure spool period, throttling and other mailer settings.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(352,1,'civicrm/admin/component',NULL,'Headers, Footers, and Automated Messages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:26:\"CRM_Mailing_Page_Component\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,410,1,0,NULL,'a:2:{s:4:\"desc\";s:143:\"Configure the header and footer used for mailings. Customize the content of automated Subscribe, Unsubscribe, Resubscribe and Opt-out messages.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(353,1,'civicrm/admin/options/from_email_address/civimail',NULL,'From Email Addresses','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:4:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}i:3;a:2:{s:5:\"title\";s:20:\"From Email Addresses\";s:3:\"url\";s:49:\"/civicrm/admin/options/from_email_address?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,415,1,0,NULL,'a:2:{s:4:\"desc\";s:74:\"List of Email Addresses which can be used when sending emails to contacts.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(354,1,'civicrm/admin/mailSettings',NULL,'Mail Accounts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Page_MailSettings\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,420,1,0,NULL,'a:2:{s:4:\"desc\";s:32:\"Configure email account setting.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(355,1,'civicrm/mailing/send',NULL,'New Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";i:2;s:17:\"schedule mailings\";}i:1;s:2:\"or\";}','s:27:\"CRM_Mailing_Controller_Send\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,610,1,1,NULL,'a:0:{}'),(356,1,'civicrm/mailing/browse/scheduled','scheduled=true','Find Mailings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:5:{i:0;s:15:\"access CiviMail\";i:1;s:16:\"approve mailings\";i:2;s:15:\"create mailings\";i:3;s:17:\"schedule mailings\";i:4;s:8:\"send SMS\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,620,1,1,NULL,'a:0:{}'),(357,1,'civicrm/mailing/browse/unscheduled','scheduled=false','Find Mailings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";i:2;s:17:\"schedule mailings\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,620,1,1,NULL,'a:0:{}'),(358,1,'civicrm/mailing/browse/archived',NULL,'Find Mailings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,625,1,1,NULL,'a:0:{}'),(359,1,'civicrm/mailing/component',NULL,'Headers, Footers, and Automated Messages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Mailing_Page_Component\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,630,1,1,NULL,'a:0:{}'),(360,1,'civicrm/mailing/unsubscribe',NULL,'Unsubscribe','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:28:\"CRM_Mailing_Form_Unsubscribe\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,640,1,0,NULL,'a:0:{}'),(361,1,'civicrm/mailing/resubscribe',NULL,'Resubscribe','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:28:\"CRM_Mailing_Page_Resubscribe\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,645,1,0,NULL,'a:0:{}'),(362,1,'civicrm/mailing/optout',NULL,'Opt-out','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:23:\"CRM_Mailing_Form_Optout\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,650,1,0,NULL,'a:0:{}'),(363,1,'civicrm/mailing/confirm',NULL,'Confirm','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:24:\"CRM_Mailing_Page_Confirm\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,660,1,0,NULL,'a:0:{}'),(364,1,'civicrm/mailing/subscribe',NULL,'Subscribe','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:26:\"CRM_Mailing_Form_Subscribe\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,660,1,0,NULL,'a:0:{}'),(365,1,'civicrm/mailing/preview',NULL,'Preview Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:4:{i:0;s:15:\"access CiviMail\";i:1;s:16:\"approve mailings\";i:2;s:15:\"create mailings\";i:3;s:17:\"schedule mailings\";}i:1;s:2:\"or\";}','s:24:\"CRM_Mailing_Page_Preview\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,670,1,0,NULL,'a:0:{}'),(366,1,'civicrm/mailing/report','mid=%%mid%%','Mailing Report','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Report\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,680,1,0,NULL,'a:0:{}'),(367,1,'civicrm/mailing/forward',NULL,'Forward Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:31:\"CRM_Mailing_Form_ForwardMailing\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,685,1,0,NULL,'a:0:{}'),(368,1,'civicrm/mailing/queue',NULL,'Sending Mail','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,690,1,0,NULL,'a:0:{}'),(369,1,'civicrm/mailing/report/event',NULL,'Mailing Event','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:22:\"CRM_Mailing_Page_Event\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}i:2;a:2:{s:5:\"title\";s:14:\"Mailing Report\";s:3:\"url\";s:47:\"/civicrm/mailing/report?reset=1&amp;mid=%%mid%%\";}}',NULL,NULL,4,NULL,NULL,NULL,0,695,1,0,NULL,'a:0:{}'),(370,1,'civicrm/ajax/template',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Mailing_Page_AJAX\";i:1;s:8:\"template\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(371,1,'civicrm/mailing/view',NULL,'View Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:28:\"view public CiviMail content\";i:1;s:15:\"access CiviMail\";i:2;s:16:\"approve mailings\";}i:1;s:2:\"or\";}','s:21:\"CRM_Mailing_Page_View\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,800,1,0,NULL,'a:0:{}'),(372,1,'civicrm/mailing/approve',NULL,'Approve Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"access CiviMail\";i:1;s:16:\"approve mailings\";}i:1;s:2:\"or\";}','s:24:\"CRM_Mailing_Form_Approve\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,850,1,0,NULL,'a:0:{}'),(373,1,'civicrm/contact/view/mailing',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:20:\"CRM_Mailing_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(374,1,'civicrm/ajax/contactmailing',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Mailing_Page_AJAX\";i:1;s:18:\"getContactMailings\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(375,1,'civicrm/mailing/url',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','s:20:\"CRM_Mailing_Page_Url\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(376,1,'civicrm/mailing/open',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','s:21:\"CRM_Mailing_Page_Open\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(377,1,'civicrm/grant',NULL,'CiviGrant Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:24:\"CRM_Grant_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,5,NULL,NULL,NULL,0,1000,1,1,NULL,'a:1:{s:9:\"component\";s:9:\"CiviGrant\";}'),(378,1,'civicrm/grant/info',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:24:\"CRM_Grant_Page_DashBoard\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviGrant Dashboard\";s:3:\"url\";s:22:\"/civicrm/grant?reset=1\";}}',NULL,NULL,5,NULL,NULL,NULL,0,0,1,0,NULL,'a:0:{}'),(379,1,'civicrm/grant/search',NULL,'Find Grants','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:27:\"CRM_Grant_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviGrant Dashboard\";s:3:\"url\";s:22:\"/civicrm/grant?reset=1\";}}',NULL,NULL,5,NULL,NULL,NULL,0,1010,1,1,NULL,'a:0:{}'),(380,1,'civicrm/grant/add','action=add','New Grant','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:18:\"CRM_Grant_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviGrant Dashboard\";s:3:\"url\";s:22:\"/civicrm/grant?reset=1\";}}',NULL,NULL,5,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:9:\"CiviGrant\";}'),(381,1,'civicrm/contact/view/grant',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:18:\"CRM_Grant_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(382,1,'civicrm/pledge',NULL,'CiviPledge Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:25:\"CRM_Pledge_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,6,NULL,NULL,NULL,0,550,1,1,NULL,'a:1:{s:9:\"component\";s:10:\"CiviPledge\";}'),(383,1,'civicrm/pledge/search',NULL,'Find Pledges','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:28:\"CRM_Pledge_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviPledge Dashboard\";s:3:\"url\";s:23:\"/civicrm/pledge?reset=1\";}}',NULL,NULL,6,NULL,NULL,NULL,0,560,1,1,NULL,'a:0:{}'),(384,1,'civicrm/contact/view/pledge','force=1,cid=%%cid%%','Pledges','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:19:\"CRM_Pledge_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,570,1,0,NULL,'a:0:{}'),(385,1,'civicrm/pledge/add','action=add','New Pledge','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:19:\"CRM_Pledge_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviPledge Dashboard\";s:3:\"url\";s:23:\"/civicrm/pledge?reset=1\";}}',NULL,NULL,6,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:10:\"CiviPledge\";}'),(386,1,'civicrm/pledge/payment',NULL,'Pledge Payments','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:23:\"CRM_Pledge_Page_Payment\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviPledge Dashboard\";s:3:\"url\";s:23:\"/civicrm/pledge?reset=1\";}}',NULL,NULL,6,NULL,NULL,NULL,0,580,1,0,NULL,'a:0:{}'),(387,1,'civicrm/ajax/pledgeAmount',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:17:\"access CiviPledge\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Pledge_Page_AJAX\";i:1;s:17:\"getPledgeDefaults\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(388,1,'civicrm/case',NULL,'CiviCase Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Case_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,900,1,1,NULL,'a:1:{s:9:\"component\";s:8:\"CiviCase\";}'),(389,1,'civicrm/case/add',NULL,'Open Case','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:18:\"CRM_Case_Form_Case\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:8:\"CiviCase\";}'),(390,1,'civicrm/case/search',NULL,'Find Cases','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Case_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,910,1,1,NULL,'a:0:{}'),(391,1,'civicrm/case/activity',NULL,'Case Activity','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Case_Form_Activity\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(392,1,'civicrm/case/report',NULL,'Case Activity Audit','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:31:\"access all cases and activities\";}i:1;s:3:\"and\";}','s:20:\"CRM_Case_Form_Report\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(393,1,'civicrm/case/cd/edit',NULL,'Case Custom Set','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Case_Form_CustomData\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(394,1,'civicrm/contact/view/case',NULL,'Case','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:17:\"CRM_Case_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(395,1,'civicrm/case/activity/view',NULL,'Activity View','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Case_Form_ActivityView\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Case Activity\";s:3:\"url\";s:30:\"/civicrm/case/activity?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(396,1,'civicrm/contact/view/case/editClient',NULL,'Assign to Another Client','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:24:\"CRM_Case_Form_EditClient\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}i:2;a:2:{s:5:\"title\";s:4:\"Case\";s:3:\"url\";s:34:\"/civicrm/contact/view/case?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(397,1,'civicrm/case/addToCase',NULL,'File on Case','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Case_Form_ActivityToCase\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(398,1,'civicrm/case/details',NULL,'Case Details','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Case_Page_CaseDetails\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(399,1,'civicrm/admin/setting/case',NULL,'CiviCase Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Case\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,380,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(400,1,'civicrm/admin/options/case_type',NULL,'Case Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"administer CiviCase\";}i:1;s:3:\"and\";}','s:22:\"CRM_Core_Page_Redirect\";','s:24:\"url=civicrm/a/#/caseType\";','a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,390,1,0,NULL,'a:2:{s:4:\"desc\";s:137:\"List of types which can be assigned to Cases. (Enable the Cases tab from System Settings - Enable Components if you want to track cases.)\";s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(401,1,'civicrm/admin/options/redaction_rule',NULL,'Redaction Rules','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"administer CiviCase\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:2:{s:4:\"desc\";s:223:\"List of rules which can be applied to user input strings so that the redacted output can be recognized as repeated instances of the same string or can be identified as a \"semantic type of the data element\" within case data.\";s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(402,1,'civicrm/admin/options/case_status',NULL,'Case Statuses','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"administer CiviCase\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:2:{s:4:\"desc\";s:48:\"List of statuses that can be assigned to a case.\";s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(403,1,'civicrm/admin/options/encounter_medium',NULL,'Encounter Mediums','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"administer CiviCase\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:2:{s:4:\"desc\";s:26:\"List of encounter mediums.\";s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(404,1,'civicrm/case/report/print',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:31:\"access all cases and activities\";}i:1;s:3:\"and\";}','a:2:{i:0;s:28:\"CRM_Case_XMLProcessor_Report\";i:1;s:15:\"printCaseReport\";}',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}i:2;a:2:{s:5:\"title\";s:19:\"Case Activity Audit\";s:3:\"url\";s:28:\"/civicrm/case/report?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(405,1,'civicrm/case/ajax/addclient',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:9:\"addClient\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(406,1,'civicrm/case/ajax/processtags',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:15:\"processCaseTags\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(407,1,'civicrm/case/ajax/details',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:11:\"CaseDetails\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(408,1,'civicrm/ajax/delcaserole',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:15:\"deleteCaseRoles\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(409,1,'civicrm/ajax/get-cases',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:8:\"getCases\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(410,1,'civicrm/report',NULL,'CiviReport','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:22:\"CRM_Report_Page_Report\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1200,1,1,NULL,'a:1:{s:9:\"component\";s:10:\"CiviReport\";}'),(411,1,'civicrm/report/list',NULL,'CiviCRM Reports','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:28:\"CRM_Report_Page_InstanceList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:10:\"CiviReport\";s:3:\"url\";s:23:\"/civicrm/report?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(412,1,'civicrm/report/template/list',NULL,'Create New Report from Template','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer Reports\";}i:1;s:3:\"and\";}','s:28:\"CRM_Report_Page_TemplateList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:10:\"CiviReport\";s:3:\"url\";s:23:\"/civicrm/report?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1220,1,1,NULL,'a:0:{}'),(413,1,'civicrm/report/options/report_template',NULL,'Manage Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer Reports\";}i:1;s:3:\"and\";}','s:23:\"CRM_Report_Page_Options\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:10:\"CiviReport\";s:3:\"url\";s:23:\"/civicrm/report?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1241,1,1,NULL,'a:0:{}'),(414,1,'civicrm/admin/report/register',NULL,'Register Report','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer Reports\";}i:1;s:3:\"and\";}','s:24:\"CRM_Report_Form_Register\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:1:{s:4:\"desc\";s:30:\"Register the Report templates.\";}'),(415,1,'civicrm/report/instance',NULL,'Report','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:24:\"CRM_Report_Page_Instance\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:10:\"CiviReport\";s:3:\"url\";s:23:\"/civicrm/report?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(416,1,'civicrm/admin/report/template/list',NULL,'Create New Report from Template','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:28:\"CRM_Report_Page_TemplateList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:49:\"Component wise listing of all available templates\";s:10:\"adminGroup\";s:10:\"CiviReport\";}'),(417,1,'civicrm/admin/report/options/report_template',NULL,'Manage Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:23:\"CRM_Report_Page_Options\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:45:\"Browse, Edit and Delete the Report templates.\";s:10:\"adminGroup\";s:10:\"CiviReport\";}'),(418,1,'civicrm/admin/report/list',NULL,'Reports Listing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Report_Page_InstanceList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:60:\"Browse existing report, change report criteria and settings.\";s:10:\"adminGroup\";s:10:\"CiviReport\";}'),(419,1,'civicrm/campaign',NULL,'Campaign Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:27:\"CRM_Campaign_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(420,1,'civicrm/campaign/add',NULL,'New Campaign','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:26:\"CRM_Campaign_Form_Campaign\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Campaign Dashboard\";s:3:\"url\";s:25:\"/civicrm/campaign?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(421,1,'civicrm/survey/add',NULL,'New Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:29:\"CRM_Campaign_Form_Survey_Main\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(422,1,'civicrm/campaign/vote',NULL,'Conduct Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:4:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";i:2;s:25:\"reserve campaign contacts\";i:3;s:27:\"interview campaign contacts\";}i:1;s:2:\"or\";}','s:22:\"CRM_Campaign_Page_Vote\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Campaign Dashboard\";s:3:\"url\";s:25:\"/civicrm/campaign?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(423,1,'civicrm/admin/campaign/surveyType',NULL,'Survey Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:23:\"administer CiviCampaign\";}i:1;s:3:\"and\";}','s:28:\"CRM_Campaign_Page_SurveyType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(424,1,'civicrm/admin/options/campaign_type',NULL,'Campaign Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,2,1,0,NULL,'a:3:{s:4:\"desc\";s:47:\"categorize your campaigns using campaign types.\";s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(425,1,'civicrm/admin/options/campaign_status',NULL,'Campaign Status','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,3,1,0,NULL,'a:3:{s:4:\"desc\";s:34:\"Define statuses for campaign here.\";s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(426,1,'civicrm/admin/options/engagement_index',NULL,'Engagement Index','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,4,1,0,NULL,'a:3:{s:4:\"desc\";s:18:\"Engagement levels.\";s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(427,1,'civicrm/survey/search','op=interview','Record Respondents Interview','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";i:2;s:27:\"interview campaign contacts\";}i:1;s:2:\"or\";}','s:30:\"CRM_Campaign_Controller_Search\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(428,1,'civicrm/campaign/gotv',NULL,'GOTV (Track Voters)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:4:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";i:2;s:25:\"release campaign contacts\";i:3;s:22:\"gotv campaign contacts\";}i:1;s:2:\"or\";}','s:22:\"CRM_Campaign_Form_Gotv\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Campaign Dashboard\";s:3:\"url\";s:25:\"/civicrm/campaign?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(429,1,'civicrm/petition/add',NULL,'New Petition','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:26:\"CRM_Campaign_Form_Petition\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(430,1,'civicrm/petition/sign',NULL,'Sign Petition','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"sign CiviCRM Petition\";}i:1;s:3:\"and\";}','s:36:\"CRM_Campaign_Form_Petition_Signature\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(431,1,'civicrm/petition/browse',NULL,'View Petition Signatures','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Campaign_Page_Petition\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(432,1,'civicrm/petition/confirm',NULL,'Email address verified','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"sign CiviCRM Petition\";}i:1;s:3:\"and\";}','s:34:\"CRM_Campaign_Page_Petition_Confirm\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(433,1,'civicrm/petition/thankyou',NULL,'Thank You','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"sign CiviCRM Petition\";}i:1;s:3:\"and\";}','s:35:\"CRM_Campaign_Page_Petition_ThankYou\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(434,1,'civicrm/campaign/registerInterview',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";i:2;s:27:\"interview campaign contacts\";}i:1;s:2:\"or\";}','a:2:{i:0;s:22:\"CRM_Campaign_Page_AJAX\";i:1;s:17:\"registerInterview\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Campaign Dashboard\";s:3:\"url\";s:25:\"/civicrm/campaign?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(435,1,'civicrm/survey/configure/main',NULL,'Configure Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:29:\"CRM_Campaign_Form_Survey_Main\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(436,1,'civicrm/survey/configure/questions',NULL,'Configure Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:34:\"CRM_Campaign_Form_Survey_Questions\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(437,1,'civicrm/survey/configure/results',NULL,'Configure Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:32:\"CRM_Campaign_Form_Survey_Results\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(438,1,'civicrm/survey/delete',NULL,'Delete Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:31:\"CRM_Campaign_Form_Survey_Delete\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(439,1,'civicrm/ajax/event/add_participant_to_cart',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:32:\"CRM_Event_Cart_Page_CheckoutAJAX\";i:1;s:23:\"add_participant_to_cart\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(440,1,'civicrm/ajax/event/remove_participant_from_cart',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:32:\"CRM_Event_Cart_Page_CheckoutAJAX\";i:1;s:28:\"remove_participant_from_cart\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(441,1,'civicrm/event/add_to_cart',NULL,'Add Event To Cart','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:29:\"CRM_Event_Cart_Page_AddToCart\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(442,1,'civicrm/event/cart_checkout',NULL,'Cart Checkout','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:34:\"CRM_Event_Cart_Controller_Checkout\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,1,1,1,0,NULL,'a:0:{}'),(443,1,'civicrm/event/remove_from_cart',NULL,'Remove From Cart','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:34:\"CRM_Event_Cart_Page_RemoveFromCart\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(444,1,'civicrm/event/view_cart',NULL,'View Cart','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:28:\"CRM_Event_Cart_Page_ViewCart\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(445,1,'admin',NULL,NULL,NULL,NULL,NULL,NULL,'a:15:{s:14:\"CiviContribute\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:9:{s:32:\"{weight}.Personal Campaign Pages\";a:6:{s:5:\"title\";s:23:\"Personal Campaign Pages\";s:4:\"desc\";s:49:\"View and manage existing personal campaign pages.\";s:2:\"id\";s:21:\"PersonalCampaignPages\";s:3:\"url\";s:49:\"/civicrm/admin/pcp?context=contribute&amp;reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:34:\"{weight}.Manage Contribution Pages\";a:6:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:4:\"desc\";s:242:\"CiviContribute allows you to create and maintain any number of Online Contribution Pages. You can create different pages for different programs or campaigns - and customize text, amounts, types of information collected from contributors, etc.\";s:2:\"id\";s:23:\"ManageContributionPages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Manage Premiums\";a:6:{s:5:\"title\";s:15:\"Manage Premiums\";s:4:\"desc\";s:175:\"CiviContribute allows you to configure any number of Premiums which can be offered to contributors as incentives / thank-you gifts. Define the premiums you want to offer here.\";s:2:\"id\";s:14:\"ManagePremiums\";s:3:\"url\";s:48:\"/civicrm/admin/contribute/managePremiums?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Financial Types\";a:6:{s:5:\"title\";s:15:\"Financial Types\";s:4:\"desc\";s:64:\"Formerly civicrm_contribution_type merged into this table in 4.1\";s:2:\"id\";s:14:\"FinancialTypes\";s:3:\"url\";s:46:\"/civicrm/admin/financial/financialType?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Financial Accounts\";a:6:{s:5:\"title\";s:18:\"Financial Accounts\";s:4:\"desc\";s:128:\"Financial types are used to categorize contributions for reporting and accounting purposes. These are also referred to as Funds.\";s:2:\"id\";s:17:\"FinancialAccounts\";s:3:\"url\";s:49:\"/civicrm/admin/financial/financialAccount?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Payment Methods\";a:6:{s:5:\"title\";s:15:\"Payment Methods\";s:4:\"desc\";s:224:\"You may choose to record the payment instrument used for each contribution. Common payment methods are installed by default (e.g. Check, Cash, Credit Card...). If your site requires additional payment methods, add them here.\";s:2:\"id\";s:14:\"PaymentMethods\";s:3:\"url\";s:49:\"/civicrm/admin/options/payment_instrument?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:30:\"{weight}.Accepted Credit Cards\";a:6:{s:5:\"title\";s:21:\"Accepted Credit Cards\";s:4:\"desc\";s:94:\"Credit card options that will be offered to contributors using your Online Contribution pages.\";s:2:\"id\";s:19:\"AcceptedCreditCards\";s:3:\"url\";s:48:\"/civicrm/admin/options/accept_creditcard?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Soft Credit Types\";a:6:{s:5:\"title\";s:17:\"Soft Credit Types\";s:4:\"desc\";s:86:\"Soft Credit Types that will be offered to contributors during soft credit contribution\";s:2:\"id\";s:15:\"SoftCreditTypes\";s:3:\"url\";s:47:\"/civicrm/admin/options/soft_credit_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:42:\"{weight}.CiviContribute Component Settings\";a:6:{s:5:\"title\";s:33:\"CiviContribute Component Settings\";s:4:\"desc\";s:42:\"Configure global CiviContribute behaviors.\";s:2:\"id\";s:31:\"CiviContributeComponentSettings\";s:3:\"url\";s:53:\"/civicrm/admin/setting/preferences/contribute?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:26:\"Customize Data and Screens\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:19:{s:20:\"{weight}.Custom Data\";a:6:{s:5:\"title\";s:11:\"Custom Data\";s:4:\"desc\";s:109:\"Configure custom fields to collect and store custom data which is not included in the standard CiviCRM forms.\";s:2:\"id\";s:10:\"CustomData\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:17:\"{weight}.Profiles\";a:6:{s:5:\"title\";s:8:\"Profiles\";s:4:\"desc\";s:151:\"Profiles allow you to aggregate groups of fields and include them in your site as input forms, contact display pages, and search and listings features.\";s:2:\"id\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:23:\"{weight}.Activity Types\";a:6:{s:5:\"title\";s:14:\"Activity Types\";s:4:\"desc\";s:155:\"CiviCRM has several built-in activity types (meetings, phone calls, emails sent). Track other types of interactions by creating custom activity types here.\";s:2:\"id\";s:13:\"ActivityTypes\";s:3:\"url\";s:44:\"/civicrm/admin/options/activity_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Relationship Types\";a:6:{s:5:\"title\";s:18:\"Relationship Types\";s:4:\"desc\";s:148:\"Contacts can be linked to each other through Relationships (e.g. Spouse, Employer, etc.). Define the types of relationships you want to record here.\";s:2:\"id\";s:17:\"RelationshipTypes\";s:3:\"url\";s:30:\"/civicrm/admin/reltype?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Contact Types\";a:6:{s:5:\"title\";s:13:\"Contact Types\";s:4:\"desc\";N;s:2:\"id\";s:12:\"ContactTypes\";s:3:\"url\";s:38:\"/civicrm/admin/options/subtype?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:23:\"{weight}.Gender Options\";a:6:{s:5:\"title\";s:14:\"Gender Options\";s:4:\"desc\";s:79:\"Options for assigning gender to individual contacts (e.g. Male, Female, Other).\";s:2:\"id\";s:13:\"GenderOptions\";s:3:\"url\";s:37:\"/civicrm/admin/options/gender?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:40:\"{weight}.Individual Prefixes (Ms, Mr...)\";a:6:{s:5:\"title\";s:31:\"Individual Prefixes (Ms, Mr...)\";s:4:\"desc\";s:66:\"Options for individual contact prefixes (e.g. Ms., Mr., Dr. etc.).\";s:2:\"id\";s:27:\"IndividualPrefixes_Ms_Mr...\";s:3:\"url\";s:48:\"/civicrm/admin/options/individual_prefix?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:40:\"{weight}.Individual Suffixes (Jr, Sr...)\";a:6:{s:5:\"title\";s:31:\"Individual Suffixes (Jr, Sr...)\";s:4:\"desc\";s:61:\"Options for individual contact suffixes (e.g. Jr., Sr. etc.).\";s:2:\"id\";s:27:\"IndividualSuffixes_Jr_Sr...\";s:3:\"url\";s:48:\"/civicrm/admin/options/individual_suffix?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:39:\"{weight}.Location Types (Home, Work...)\";a:6:{s:5:\"title\";s:30:\"Location Types (Home, Work...)\";s:4:\"desc\";s:94:\"Options for categorizing contact addresses and phone numbers (e.g. Home, Work, Billing, etc.).\";s:2:\"id\";s:26:\"LocationTypes_Home_Work...\";s:3:\"url\";s:35:\"/civicrm/admin/locationType?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Website Types\";a:6:{s:5:\"title\";s:13:\"Website Types\";s:4:\"desc\";s:48:\"Options for assigning website types to contacts.\";s:2:\"id\";s:12:\"WebsiteTypes\";s:3:\"url\";s:43:\"/civicrm/admin/options/website_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:35:\"{weight}.Instant Messenger Services\";a:6:{s:5:\"title\";s:26:\"Instant Messenger Services\";s:4:\"desc\";s:79:\"List of IM services which can be used when recording screen-names for contacts.\";s:2:\"id\";s:24:\"InstantMessengerServices\";s:3:\"url\";s:56:\"/civicrm/admin/options/instant_messenger_service?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Mobile Phone Providers\";a:6:{s:5:\"title\";s:22:\"Mobile Phone Providers\";s:4:\"desc\";s:90:\"List of mobile phone providers which can be assigned when recording contact phone numbers.\";s:2:\"id\";s:20:\"MobilePhoneProviders\";s:3:\"url\";s:46:\"/civicrm/admin/options/mobile_provider?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:19:\"{weight}.Phone Type\";a:6:{s:5:\"title\";s:10:\"Phone Type\";s:4:\"desc\";s:80:\"Options for assigning phone type to contacts (e.g Phone,\n    Mobile, Fax, Pager)\";s:2:\"id\";s:9:\"PhoneType\";s:3:\"url\";s:41:\"/civicrm/admin/options/phone_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:28:\"{weight}.Display Preferences\";a:6:{s:5:\"title\";s:19:\"Display Preferences\";s:4:\"desc\";N;s:2:\"id\";s:18:\"DisplayPreferences\";s:3:\"url\";s:50:\"/civicrm/admin/setting/preferences/display?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Search Preferences\";a:6:{s:5:\"title\";s:18:\"Search Preferences\";s:4:\"desc\";N;s:2:\"id\";s:17:\"SearchPreferences\";s:3:\"url\";s:37:\"/civicrm/admin/setting/search?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Navigation Menu\";a:6:{s:5:\"title\";s:15:\"Navigation Menu\";s:4:\"desc\";s:79:\"Add or remove menu items, and modify the order of items on the navigation menu.\";s:2:\"id\";s:14:\"NavigationMenu\";s:3:\"url\";s:27:\"/civicrm/admin/menu?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Word Replacements\";a:6:{s:5:\"title\";s:17:\"Word Replacements\";s:4:\"desc\";s:18:\"Word Replacements.\";s:2:\"id\";s:16:\"WordReplacements\";s:3:\"url\";s:47:\"/civicrm/admin/options/wordreplacements?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Manage Custom Searches\";a:6:{s:5:\"title\";s:22:\"Manage Custom Searches\";s:4:\"desc\";s:225:\"Developers and accidental techies with a bit of PHP and SQL knowledge can create new search forms to handle specific search and reporting needs which aren\'t covered by the built-in Advanced Search and Search Builder features.\";s:2:\"id\";s:20:\"ManageCustomSearches\";s:3:\"url\";s:44:\"/civicrm/admin/options/custom_search?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Tags (Categories)\";a:6:{s:5:\"title\";s:17:\"Tags (Categories)\";s:4:\"desc\";s:158:\"Tags are useful for segmenting the contacts in your database into categories (e.g. Staff Member, Donor, Volunteer, etc.). Create and edit available tags here.\";s:2:\"id\";s:15:\"Tags_Categories\";s:3:\"url\";s:20:\"/civicrm/tag?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:14:\"Communications\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:11:{s:46:\"{weight}.Organization Address and Contact Info\";a:6:{s:5:\"title\";s:37:\"Organization Address and Contact Info\";s:4:\"desc\";s:150:\"Configure primary contact name, email, return-path and address information. This information is used by CiviMail to identify the sending organization.\";s:2:\"id\";s:33:\"OrganizationAddressandContactInfo\";s:3:\"url\";s:47:\"/civicrm/admin/domain?action=update&amp;reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:29:\"{weight}.From Email Addresses\";a:6:{s:5:\"title\";s:20:\"From Email Addresses\";s:4:\"desc\";s:74:\"List of Email Addresses which can be used when sending emails to contacts.\";s:2:\"id\";s:18:\"FromEmailAddresses\";s:3:\"url\";s:49:\"/civicrm/admin/options/from_email_address?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Message Templates\";a:6:{s:5:\"title\";s:17:\"Message Templates\";s:4:\"desc\";s:130:\"Message templates allow you to save and re-use messages with layouts which you can use when sending email to one or more contacts.\";s:2:\"id\";s:16:\"MessageTemplates\";s:3:\"url\";s:39:\"/civicrm/admin/messageTemplates?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Schedule Reminders\";a:6:{s:5:\"title\";s:18:\"Schedule Reminders\";s:4:\"desc\";s:19:\"Schedule Reminders.\";s:2:\"id\";s:17:\"ScheduleReminders\";s:3:\"url\";s:40:\"/civicrm/admin/scheduleReminders?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:40:\"{weight}.Preferred Communication Methods\";a:6:{s:5:\"title\";s:31:\"Preferred Communication Methods\";s:4:\"desc\";s:117:\"One or more preferred methods of communication can be assigned to each contact. Customize the available options here.\";s:2:\"id\";s:29:\"PreferredCommunicationMethods\";s:3:\"url\";s:61:\"/civicrm/admin/options/preferred_communication_method?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Label Formats\";a:6:{s:5:\"title\";s:13:\"Label Formats\";s:4:\"desc\";s:67:\"Configure Label Formats that are used when creating mailing labels.\";s:2:\"id\";s:12:\"LabelFormats\";s:3:\"url\";s:35:\"/civicrm/admin/labelFormats?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:33:\"{weight}.Print Page (PDF) Formats\";a:6:{s:5:\"title\";s:24:\"Print Page (PDF) Formats\";s:4:\"desc\";s:95:\"Configure PDF Page Formats that can be assigned to Message Templates when creating PDF letters.\";s:2:\"id\";s:20:\"PrintPage_PDFFormats\";s:3:\"url\";s:33:\"/civicrm/admin/pdfFormats?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:36:\"{weight}.Communication Style Options\";a:6:{s:5:\"title\";s:27:\"Communication Style Options\";s:4:\"desc\";s:42:\"Options for Communication Style selection.\";s:2:\"id\";s:25:\"CommunicationStyleOptions\";s:3:\"url\";s:50:\"/civicrm/admin/options/communication_style?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Email Greeting Formats\";a:6:{s:5:\"title\";s:22:\"Email Greeting Formats\";s:4:\"desc\";s:75:\"Options for assigning email greetings to individual and household contacts.\";s:2:\"id\";s:20:\"EmailGreetingFormats\";s:3:\"url\";s:45:\"/civicrm/admin/options/email_greeting?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:32:\"{weight}.Postal Greeting Formats\";a:6:{s:5:\"title\";s:23:\"Postal Greeting Formats\";s:4:\"desc\";s:76:\"Options for assigning postal greetings to individual and household contacts.\";s:2:\"id\";s:21:\"PostalGreetingFormats\";s:3:\"url\";s:46:\"/civicrm/admin/options/postal_greeting?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Addressee Formats\";a:6:{s:5:\"title\";s:17:\"Addressee Formats\";s:4:\"desc\";s:83:\"Options for assigning addressee to individual, household and organization contacts.\";s:2:\"id\";s:16:\"AddresseeFormats\";s:3:\"url\";s:40:\"/civicrm/admin/options/addressee?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:12:\"Localization\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:4:{s:39:\"{weight}.Languages, Currency, Locations\";a:6:{s:5:\"title\";s:30:\"Languages, Currency, Locations\";s:4:\"desc\";N;s:2:\"id\";s:28:\"Languages_Currency_Locations\";s:3:\"url\";s:43:\"/civicrm/admin/setting/localization?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Address Settings\";a:6:{s:5:\"title\";s:16:\"Address Settings\";s:4:\"desc\";N;s:2:\"id\";s:15:\"AddressSettings\";s:3:\"url\";s:50:\"/civicrm/admin/setting/preferences/address?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:21:\"{weight}.Date Formats\";a:6:{s:5:\"title\";s:12:\"Date Formats\";s:4:\"desc\";N;s:2:\"id\";s:11:\"DateFormats\";s:3:\"url\";s:35:\"/civicrm/admin/setting/date?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:28:\"{weight}.Preferred Languages\";a:6:{s:5:\"title\";s:19:\"Preferred Languages\";s:4:\"desc\";s:30:\"Options for contact languages.\";s:2:\"id\";s:18:\"PreferredLanguages\";s:3:\"url\";s:40:\"/civicrm/admin/options/languages?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:21:\"Users and Permissions\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:2:{s:23:\"{weight}.Access Control\";a:6:{s:5:\"title\";s:14:\"Access Control\";s:4:\"desc\";s:73:\"Grant or deny access to actions (view, edit...), features and components.\";s:2:\"id\";s:13:\"AccessControl\";s:3:\"url\";s:29:\"/civicrm/admin/access?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:38:\"{weight}.Synchronize Users to Contacts\";a:6:{s:5:\"title\";s:29:\"Synchronize Users to Contacts\";s:4:\"desc\";s:71:\"Automatically create a CiviCRM contact record for each CMS user record.\";s:2:\"id\";s:26:\"SynchronizeUserstoContacts\";s:3:\"url\";s:32:\"/civicrm/admin/synchUser?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:15:\"System Settings\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:18:{s:32:\"{weight}.Configuration Checklist\";a:6:{s:5:\"title\";s:23:\"Configuration Checklist\";s:4:\"desc\";s:55:\"List of configuration tasks with links to each setting.\";s:2:\"id\";s:22:\"ConfigurationChecklist\";s:3:\"url\";s:33:\"/civicrm/admin/configtask?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:34:\"{weight}.Enable CiviCRM Components\";a:6:{s:5:\"title\";s:25:\"Enable CiviCRM Components\";s:4:\"desc\";s:269:\"Enable or disable components (e.g. CiviEvent, CiviMember, etc.) for your site based on the features you need. We recommend disabling any components not being used in order to simplify the user interface. You can easily re-enable components at any time from this screen.\";s:2:\"id\";s:23:\"EnableCiviCRMComponents\";s:3:\"url\";s:40:\"/civicrm/admin/setting/component?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Manage Extensions\";a:6:{s:5:\"title\";s:17:\"Manage Extensions\";s:4:\"desc\";s:0:\"\";s:2:\"id\";s:16:\"ManageExtensions\";s:3:\"url\";s:33:\"/civicrm/admin/extensions?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:32:\"{weight}.Outbound Email Settings\";a:6:{s:5:\"title\";s:23:\"Outbound Email Settings\";s:4:\"desc\";N;s:2:\"id\";s:21:\"OutboundEmailSettings\";s:3:\"url\";s:35:\"/civicrm/admin/setting/smtp?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:37:\"{weight}.Settings - Payment Processor\";a:6:{s:5:\"title\";s:28:\"Settings - Payment Processor\";s:4:\"desc\";s:48:\"Payment Processor setup for CiviCRM transactions\";s:2:\"id\";s:25:\"Settings-PaymentProcessor\";s:3:\"url\";s:39:\"/civicrm/admin/paymentProcessor?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:30:\"{weight}.Mapping and Geocoding\";a:6:{s:5:\"title\";s:21:\"Mapping and Geocoding\";s:4:\"desc\";N;s:2:\"id\";s:19:\"MappingandGeocoding\";s:3:\"url\";s:38:\"/civicrm/admin/setting/mapping?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:62:\"{weight}.Misc (Undelete, PDFs, Limits, Logging, Captcha, etc.)\";a:6:{s:5:\"title\";s:53:\"Misc (Undelete, PDFs, Limits, Logging, Captcha, etc.)\";s:4:\"desc\";s:91:\"Enable undelete/move to trash feature, detailed change logging, ReCAPTCHA to protect forms.\";s:2:\"id\";s:46:\"Misc_Undelete_PDFs_Limits_Logging_Captcha_etc.\";s:3:\"url\";s:35:\"/civicrm/admin/setting/misc?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:20:\"{weight}.Directories\";a:6:{s:5:\"title\";s:11:\"Directories\";s:4:\"desc\";N;s:2:\"id\";s:11:\"Directories\";s:3:\"url\";s:35:\"/civicrm/admin/setting/path?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Resource URLs\";a:6:{s:5:\"title\";s:13:\"Resource URLs\";s:4:\"desc\";N;s:2:\"id\";s:12:\"ResourceURLs\";s:3:\"url\";s:34:\"/civicrm/admin/setting/url?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:40:\"{weight}.Cleanup Caches and Update Paths\";a:6:{s:5:\"title\";s:31:\"Cleanup Caches and Update Paths\";s:4:\"desc\";s:157:\"Reset the Base Directory Path and Base URL settings - generally when a CiviCRM site is moved to another location in the file system and/or to another domain.\";s:2:\"id\";s:27:\"CleanupCachesandUpdatePaths\";s:3:\"url\";s:50:\"/civicrm/admin/setting/updateConfigBackend?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:33:\"{weight}.CMS Database Integration\";a:6:{s:5:\"title\";s:24:\"CMS Database Integration\";s:4:\"desc\";N;s:2:\"id\";s:22:\"CMSDatabaseIntegration\";s:3:\"url\";s:33:\"/civicrm/admin/setting/uf?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:36:\"{weight}.Safe File Extension Options\";a:6:{s:5:\"title\";s:27:\"Safe File Extension Options\";s:4:\"desc\";s:44:\"File Extensions that can be considered safe.\";s:2:\"id\";s:24:\"SafeFileExtensionOptions\";s:3:\"url\";s:50:\"/civicrm/admin/options/safe_file_extension?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Option Groups\";a:6:{s:5:\"title\";s:13:\"Option Groups\";s:4:\"desc\";s:35:\"Access all meta-data option groups.\";s:2:\"id\";s:12:\"OptionGroups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Import/Export Mappings\";a:6:{s:5:\"title\";s:22:\"Import/Export Mappings\";s:4:\"desc\";s:141:\"Import and Export mappings allow you to easily run the same job multiple times. This option allows you to rename or delete existing mappings.\";s:2:\"id\";s:21:\"Import_ExportMappings\";s:3:\"url\";s:30:\"/civicrm/admin/mapping?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:18:\"{weight}.Debugging\";a:6:{s:5:\"title\";s:9:\"Debugging\";s:4:\"desc\";N;s:2:\"id\";s:9:\"Debugging\";s:3:\"url\";s:36:\"/civicrm/admin/setting/debug?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:28:\"{weight}.Multi Site Settings\";a:6:{s:5:\"title\";s:19:\"Multi Site Settings\";s:4:\"desc\";N;s:2:\"id\";s:17:\"MultiSiteSettings\";s:3:\"url\";s:52:\"/civicrm/admin/setting/preferences/multisite?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:23:\"{weight}.Scheduled Jobs\";a:6:{s:5:\"title\";s:14:\"Scheduled Jobs\";s:4:\"desc\";s:35:\"Managing periodially running tasks.\";s:2:\"id\";s:13:\"ScheduledJobs\";s:3:\"url\";s:26:\"/civicrm/admin/job?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Sms Providers\";a:6:{s:5:\"title\";s:13:\"Sms Providers\";s:4:\"desc\";s:27:\"To configure a sms provider\";s:2:\"id\";s:12:\"SmsProviders\";s:3:\"url\";s:35:\"/civicrm/admin/sms/provider?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:12:\"CiviCampaign\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:5:{s:40:\"{weight}.CiviCampaign Component Settings\";a:6:{s:5:\"title\";s:31:\"CiviCampaign Component Settings\";s:4:\"desc\";s:40:\"Configure global CiviCampaign behaviors.\";s:2:\"id\";s:29:\"CiviCampaignComponentSettings\";s:3:\"url\";s:51:\"/civicrm/admin/setting/preferences/campaign?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:21:\"{weight}.Survey Types\";a:6:{s:5:\"title\";s:12:\"Survey Types\";s:4:\"desc\";N;s:2:\"id\";s:11:\"SurveyTypes\";s:3:\"url\";s:42:\"/civicrm/admin/campaign/surveyType?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:23:\"{weight}.Campaign Types\";a:6:{s:5:\"title\";s:14:\"Campaign Types\";s:4:\"desc\";s:47:\"categorize your campaigns using campaign types.\";s:2:\"id\";s:13:\"CampaignTypes\";s:3:\"url\";s:44:\"/civicrm/admin/options/campaign_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Campaign Status\";a:6:{s:5:\"title\";s:15:\"Campaign Status\";s:4:\"desc\";s:34:\"Define statuses for campaign here.\";s:2:\"id\";s:14:\"CampaignStatus\";s:3:\"url\";s:46:\"/civicrm/admin/options/campaign_status?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Engagement Index\";a:6:{s:5:\"title\";s:16:\"Engagement Index\";s:4:\"desc\";s:18:\"Engagement levels.\";s:2:\"id\";s:15:\"EngagementIndex\";s:3:\"url\";s:47:\"/civicrm/admin/options/engagement_index?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:9:\"CiviEvent\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:9:{s:37:\"{weight}.CiviEvent Component Settings\";a:6:{s:5:\"title\";s:28:\"CiviEvent Component Settings\";s:4:\"desc\";s:37:\"Configure global CiviEvent behaviors.\";s:2:\"id\";s:26:\"CiviEventComponentSettings\";s:3:\"url\";s:48:\"/civicrm/admin/setting/preferences/event?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:33:\"{weight}.Event Name Badge Layouts\";a:6:{s:5:\"title\";s:24:\"Event Name Badge Layouts\";s:4:\"desc\";s:107:\"Configure name badge layouts for event participants, including logos and what data to include on the badge.\";s:2:\"id\";s:21:\"EventNameBadgeLayouts\";s:3:\"url\";s:52:\"/civicrm/admin/badgelayout?action=browse&amp;reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Manage Events\";a:6:{s:5:\"title\";s:13:\"Manage Events\";s:4:\"desc\";s:136:\"Create and edit event configuration including times, locations, online registration forms, and fees. Links for iCal and RSS syndication.\";s:2:\"id\";s:12:\"ManageEvents\";s:3:\"url\";s:28:\"/civicrm/admin/event?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Event Templates\";a:6:{s:5:\"title\";s:15:\"Event Templates\";s:4:\"desc\";s:115:\"Administrators can create Event Templates - which are basically master event records pre-filled with default values\";s:2:\"id\";s:14:\"EventTemplates\";s:3:\"url\";s:36:\"/civicrm/admin/eventTemplate?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:20:\"{weight}.Event Types\";a:6:{s:5:\"title\";s:11:\"Event Types\";s:4:\"desc\";s:143:\"Use Event Types to categorize your events. Event feeds can be filtered by Event Type and participant searches can use Event Type as a criteria.\";s:2:\"id\";s:10:\"EventTypes\";s:3:\"url\";s:41:\"/civicrm/admin/options/event_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Participant Status\";a:6:{s:5:\"title\";s:18:\"Participant Status\";s:4:\"desc\";s:154:\"Define statuses for event participants here (e.g. Registered, Attended, Cancelled...). You can then assign statuses and search for participants by status.\";s:2:\"id\";s:17:\"ParticipantStatus\";s:3:\"url\";s:41:\"/civicrm/admin/participant_status?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Participant Role\";a:6:{s:5:\"title\";s:16:\"Participant Role\";s:4:\"desc\";s:138:\"Define participant roles for events here (e.g. Attendee, Host, Speaker...). You can then assign roles and search for participants by role.\";s:2:\"id\";s:15:\"ParticipantRole\";s:3:\"url\";s:47:\"/civicrm/admin/options/participant_role?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:38:\"{weight}.Participant Listing Templates\";a:6:{s:5:\"title\";s:29:\"Participant Listing Templates\";s:4:\"desc\";s:48:\"Template to control participant listing display.\";s:2:\"id\";s:27:\"ParticipantListingTemplates\";s:3:\"url\";s:50:\"/civicrm/admin/options/participant_listing?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Conference Slot Labels\";a:6:{s:5:\"title\";s:22:\"Conference Slot Labels\";s:4:\"desc\";s:35:\"Define conference slots and labels.\";s:2:\"id\";s:20:\"ConferenceSlotLabels\";s:3:\"url\";s:46:\"/civicrm/admin/options/conference_slot?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:8:\"CiviMail\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:5:{s:36:\"{weight}.CiviMail Component Settings\";a:6:{s:5:\"title\";s:27:\"CiviMail Component Settings\";s:4:\"desc\";s:36:\"Configure global CiviMail behaviors.\";s:2:\"id\";s:25:\"CiviMailComponentSettings\";s:3:\"url\";s:50:\"/civicrm/admin/setting/preferences/mailing?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Mailer Settings\";a:6:{s:5:\"title\";s:15:\"Mailer Settings\";s:4:\"desc\";s:61:\"Configure spool period, throttling and other mailer settings.\";s:2:\"id\";s:14:\"MailerSettings\";s:3:\"url\";s:27:\"/civicrm/admin/mail?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:49:\"{weight}.Headers, Footers, and Automated Messages\";a:6:{s:5:\"title\";s:40:\"Headers, Footers, and Automated Messages\";s:4:\"desc\";s:143:\"Configure the header and footer used for mailings. Customize the content of automated Subscribe, Unsubscribe, Resubscribe and Opt-out messages.\";s:2:\"id\";s:36:\"Headers_Footers_andAutomatedMessages\";s:3:\"url\";s:32:\"/civicrm/admin/component?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:29:\"{weight}.From Email Addresses\";a:6:{s:5:\"title\";s:20:\"From Email Addresses\";s:4:\"desc\";s:74:\"List of Email Addresses which can be used when sending emails to contacts.\";s:2:\"id\";s:18:\"FromEmailAddresses\";s:3:\"url\";s:58:\"/civicrm/admin/options/from_email_address/civimail?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Mail Accounts\";a:6:{s:5:\"title\";s:13:\"Mail Accounts\";s:4:\"desc\";s:32:\"Configure email account setting.\";s:2:\"id\";s:12:\"MailAccounts\";s:3:\"url\";s:35:\"/civicrm/admin/mailSettings?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:10:\"CiviMember\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:3:{s:38:\"{weight}.CiviMember Component Settings\";a:6:{s:5:\"title\";s:29:\"CiviMember Component Settings\";s:4:\"desc\";s:38:\"Configure global CiviMember behaviors.\";s:2:\"id\";s:27:\"CiviMemberComponentSettings\";s:3:\"url\";s:49:\"/civicrm/admin/setting/preferences/member?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Membership Types\";a:6:{s:5:\"title\";s:16:\"Membership Types\";s:4:\"desc\";s:174:\"Define the types of memberships you want to offer. For each type, you can specify a \'name\' (Gold Member, Honor Society Member...), a description, duration, and a minimum fee.\";s:2:\"id\";s:15:\"MembershipTypes\";s:3:\"url\";s:44:\"/civicrm/admin/member/membershipType?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:32:\"{weight}.Membership Status Rules\";a:6:{s:5:\"title\";s:23:\"Membership Status Rules\";s:4:\"desc\";s:187:\"Status \'rules\' define the current status for a membership based on that membership\'s start and end dates. You can adjust the default status options and rules as needed to meet your needs.\";s:2:\"id\";s:21:\"MembershipStatusRules\";s:3:\"url\";s:46:\"/civicrm/admin/member/membershipStatus?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:6:\"Manage\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:3:{s:27:\"{weight}.Scheduled Jobs Log\";a:6:{s:5:\"title\";s:18:\"Scheduled Jobs Log\";s:4:\"desc\";s:46:\"Browsing the log of periodially running tasks.\";s:2:\"id\";s:16:\"ScheduledJobsLog\";s:3:\"url\";s:29:\"/civicrm/admin/joblog?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:42:\"{weight}.Find and Merge Duplicate Contacts\";a:6:{s:5:\"title\";s:33:\"Find and Merge Duplicate Contacts\";s:4:\"desc\";s:158:\"Manage the rules used to identify potentially duplicate contact records. Scan for duplicates using a selected rule and merge duplicate contact data as needed.\";s:2:\"id\";s:29:\"FindandMergeDuplicateContacts\";s:3:\"url\";s:36:\"/civicrm/contact/deduperules?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Dedupe Exceptions\";a:6:{s:5:\"title\";s:17:\"Dedupe Exceptions\";s:4:\"desc\";N;s:2:\"id\";s:16:\"DedupeExceptions\";s:3:\"url\";s:33:\"/civicrm/dedupe/exception?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:12:\"Option Lists\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:1:{s:20:\"{weight}.Grant Types\";a:6:{s:5:\"title\";s:11:\"Grant Types\";s:4:\"desc\";s:148:\"List of types which can be assigned to Grants. (Enable CiviGrant from Administer > Systme Settings > Enable Components if you want to track grants.)\";s:2:\"id\";s:10:\"GrantTypes\";s:3:\"url\";s:41:\"/civicrm/admin/options/grant_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:9:\"Customize\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:1:{s:19:\"{weight}.Price Sets\";a:6:{s:5:\"title\";s:10:\"Price Sets\";s:4:\"desc\";s:205:\"Price sets allow you to offer multiple options with associated fees (e.g. pre-conference workshops, additional meals, etc.). Configure Price Sets for events which need more than a single set of fee levels.\";s:2:\"id\";s:9:\"PriceSets\";s:3:\"url\";s:28:\"/civicrm/admin/price?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:8:\"CiviCase\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:5:{s:26:\"{weight}.CiviCase Settings\";a:6:{s:5:\"title\";s:17:\"CiviCase Settings\";s:4:\"desc\";N;s:2:\"id\";s:16:\"CiviCaseSettings\";s:3:\"url\";s:35:\"/civicrm/admin/setting/case?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:19:\"{weight}.Case Types\";a:6:{s:5:\"title\";s:10:\"Case Types\";s:4:\"desc\";s:137:\"List of types which can be assigned to Cases. (Enable the Cases tab from System Settings - Enable Components if you want to track cases.)\";s:2:\"id\";s:9:\"CaseTypes\";s:3:\"url\";s:40:\"/civicrm/admin/options/case_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Redaction Rules\";a:6:{s:5:\"title\";s:15:\"Redaction Rules\";s:4:\"desc\";s:223:\"List of rules which can be applied to user input strings so that the redacted output can be recognized as repeated instances of the same string or can be identified as a \"semantic type of the data element\" within case data.\";s:2:\"id\";s:14:\"RedactionRules\";s:3:\"url\";s:45:\"/civicrm/admin/options/redaction_rule?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Case Statuses\";a:6:{s:5:\"title\";s:13:\"Case Statuses\";s:4:\"desc\";s:48:\"List of statuses that can be assigned to a case.\";s:2:\"id\";s:12:\"CaseStatuses\";s:3:\"url\";s:42:\"/civicrm/admin/options/case_status?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Encounter Mediums\";a:6:{s:5:\"title\";s:17:\"Encounter Mediums\";s:4:\"desc\";s:26:\"List of encounter mediums.\";s:2:\"id\";s:16:\"EncounterMediums\";s:3:\"url\";s:47:\"/civicrm/admin/options/encounter_medium?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:10:\"CiviReport\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:3:{s:40:\"{weight}.Create New Report from Template\";a:6:{s:5:\"title\";s:31:\"Create New Report from Template\";s:4:\"desc\";s:49:\"Component wise listing of all available templates\";s:2:\"id\";s:27:\"CreateNewReportfromTemplate\";s:3:\"url\";s:43:\"/civicrm/admin/report/template/list?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Manage Templates\";a:6:{s:5:\"title\";s:16:\"Manage Templates\";s:4:\"desc\";s:45:\"Browse, Edit and Delete the Report templates.\";s:2:\"id\";s:15:\"ManageTemplates\";s:3:\"url\";s:53:\"/civicrm/admin/report/options/report_template?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Reports Listing\";a:6:{s:5:\"title\";s:15:\"Reports Listing\";s:4:\"desc\";s:60:\"Browse existing report, change report criteria and settings.\";s:2:\"id\";s:14:\"ReportsListing\";s:3:\"url\";s:34:\"/civicrm/admin/report/list?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}}',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,NULL,'a:0:{}');
+INSERT INTO `civicrm_menu` (`id`, `domain_id`, `path`, `path_arguments`, `title`, `access_callback`, `access_arguments`, `page_callback`, `page_arguments`, `breadcrumb`, `return_url`, `return_url_args`, `component_id`, `is_active`, `is_public`, `is_exposed`, `is_ssl`, `weight`, `type`, `page_type`, `skipBreadcrumb`, `module_data`) VALUES (1,1,'civicrm/profile',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Profile_Page_Router\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(2,1,'civicrm/profile/create',NULL,'CiviCRM Profile Create','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Profile_Page_Router\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(3,1,'civicrm/profile/view',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Profile_Page_View\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(4,1,'civicrm/ajax/api4',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access AJAX API\";}i:1;s:2:\"or\";}','s:18:\"CRM_Api4_Page_AJAX\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(5,1,'civicrm/api4',NULL,'CiviCRM','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Api4_Page_Api4Explorer\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(6,1,'civicrm/activity','action=add&context=standalone','New Activity','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Activity_Form_Activity\";','s:14:\"attachUpload=1\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(7,1,'civicrm/activity/view',NULL,'View Activity','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Activity_Form_ActivityView\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(8,1,'civicrm/ajax/activity',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:15:\"getCaseActivity\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(9,1,'civicrm/ajax/globalrelationships',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:26:\"getCaseGlobalRelationships\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(10,1,'civicrm/ajax/clientrelationships',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:26:\"getCaseClientRelationships\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(11,1,'civicrm/ajax/caseroles',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:12:\"getCaseRoles\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(12,1,'civicrm/ajax/contactactivity',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:18:\"getContactActivity\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(13,1,'civicrm/ajax/activity/convert',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:22:\"CRM_Activity_Page_AJAX\";i:1;s:21:\"convertToCaseActivity\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(14,1,'civicrm/activity/search',NULL,'Find Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Activity_Controller_Search\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(15,1,'civicrm/pcp',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:16:\"CRM_PCP_Form_PCP\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(16,1,'civicrm/pcp/campaign',NULL,'Setup a Personal Campaign Page - Account Information','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:22:\"CRM_PCP_Controller_PCP\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(17,1,'civicrm/pcp/info',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:20:\"CRM_PCP_Page_PCPInfo\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(18,1,'civicrm/admin/pcp','context=contribute','Personal Campaign Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:16:\"CRM_PCP_Page_PCP\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,362,1,0,NULL,'a:2:{s:4:\"desc\";s:49:\"View and manage existing personal campaign pages.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(19,1,'civicrm/upgrade',NULL,'Upgrade CiviCRM','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Upgrade_Page_Upgrade\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(20,1,'civicrm/export',NULL,'Download Errors','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Export_BAO_Export\";i:1;s:6:\"invoke\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(21,1,'civicrm/export/contact',NULL,'Export Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Export_BAO_Export\";i:1;s:6:\"invoke\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Download Errors\";s:3:\"url\";s:23:\"/civicrm/export?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,'a:0:{}'),(22,1,'civicrm/export/standalone',NULL,'Export','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Export_Controller_Standalone\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Download Errors\";s:3:\"url\";s:23:\"/civicrm/export?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(23,1,'civicrm/admin/options/acl_role',NULL,'ACL Roles','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(24,1,'civicrm/acl',NULL,'Manage ACLs','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:16:\"CRM_ACL_Page_ACL\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(25,1,'civicrm/acl/entityrole',NULL,'Assign Users to ACL Roles','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_ACL_Page_EntityRole\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"Manage ACLs\";s:3:\"url\";s:20:\"/civicrm/acl?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(26,1,'civicrm/acl/basic',NULL,'ACL','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_ACL_Page_ACLBasic\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"Manage ACLs\";s:3:\"url\";s:20:\"/civicrm/acl?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(27,1,'civicrm/file',NULL,'Browse Uploaded files','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access uploaded files\";}i:1;s:3:\"and\";}','s:18:\"CRM_Core_Page_File\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(28,1,'civicrm/file/delete',NULL,'Delete File','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:17:\"CRM_Core_BAO_File\";i:1;s:16:\"deleteAttachment\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:21:\"Browse Uploaded files\";s:3:\"url\";s:21:\"/civicrm/file?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(29,1,'civicrm/friend',NULL,'Tell a Friend','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:15:\"CRM_Friend_Form\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(30,1,'civicrm/logout',NULL,'Log out','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:16:\"CRM_Utils_System\";i:1;s:6:\"logout\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,9999,1,1,NULL,'a:0:{}'),(31,1,'civicrm/i18n',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"translate CiviCRM\";}i:1;s:3:\"and\";}','s:18:\"CRM_Core_I18n_Form\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(32,1,'civicrm/ajax/attachment',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access AJAX API\";}i:1;s:2:\"or\";}','a:2:{i:0;s:29:\"CRM_Core_Page_AJAX_Attachment\";i:1;s:10:\"attachFile\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(33,1,'civicrm/api',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Core_Page_Redirect\";','s:16:\"url=civicrm/api3\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(34,1,'civicrm/api3',NULL,'CiviCRM API v3','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Admin_Page_APIExplorer\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(35,1,'civicrm/ajax/apiexample',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:26:\"CRM_Admin_Page_APIExplorer\";i:1;s:14:\"getExampleFile\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(36,1,'civicrm/ajax/apidoc',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:26:\"CRM_Admin_Page_APIExplorer\";i:1;s:6:\"getDoc\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(37,1,'civicrm/ajax/rest',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access AJAX API\";}i:1;s:2:\"or\";}','a:2:{i:0;s:14:\"CRM_Utils_REST\";i:1;s:4:\"ajax\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(38,1,'civicrm/api/json',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:14:\"CRM_Utils_REST\";i:1;s:8:\"ajaxJson\";}','s:16:\"url=civicrm/api3\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(39,1,'civicrm/inline',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:14:\"CRM_Utils_REST\";i:1;s:12:\"loadTemplate\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(40,1,'civicrm/ajax/chart',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Form_ContributionCharts\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(41,1,'civicrm/asset/builder',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','a:2:{i:0;s:23:\"\\Civi\\Core\\AssetBuilder\";i:1;s:7:\"pageRun\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(42,1,'civicrm/contribute/ajax/tableview',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contribute_Page_DashBoard\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(43,1,'civicrm/payment/ipn',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','a:2:{i:0;s:16:\"CRM_Core_Payment\";i:1;s:9:\"handleIPN\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Payment\";s:3:\"url\";s:39:\"/civicrm/payment?reset=1&amp;action=add\";}}',NULL,NULL,2,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(44,1,'civicrm/batch',NULL,'Batch Data Entry','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:20:\"CRM_Batch_Page_Batch\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(45,1,'civicrm/batch/add',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:20:\"CRM_Batch_Form_Batch\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"Batch Data Entry\";s:3:\"url\";s:22:\"/civicrm/batch?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(46,1,'civicrm/batch/entry',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:20:\"CRM_Batch_Form_Entry\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"Batch Data Entry\";s:3:\"url\";s:22:\"/civicrm/batch?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(47,1,'civicrm/ajax/batch',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Batch_Page_AJAX\";i:1;s:9:\"batchSave\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(48,1,'civicrm/ajax/batchlist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Batch_Page_AJAX\";i:1;s:12:\"getBatchList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(49,1,'civicrm/ajax/inline',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Core_Page_AJAX\";i:1;s:3:\"run\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(50,1,'civicrm/dev/qunit',NULL,'QUnit','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:19:\"CRM_Core_Page_QUnit\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(51,1,'civicrm/profile-editor/schema',NULL,'ProfileEditor','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:25:\"CRM_UF_Page_ProfileEditor\";i:1;s:13:\"getSchemaJSON\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(52,1,'civicrm/a',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"\\Civi\\Angular\\Page\\Main\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(53,1,'civicrm/ajax/angular-modules',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','s:26:\"\\Civi\\Angular\\Page\\Modules\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(54,1,'civicrm/ajax/recurringentity/update-mode',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:34:\"CRM_Core_Page_AJAX_RecurringEntity\";i:1;s:10:\"updateMode\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(55,1,'civicrm/recurringentity/preview',NULL,'Confirm dates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:36:\"CRM_Core_Page_RecurringEntityPreview\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(56,1,'civicrm/ajax/l10n-js',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Core_Resources\";i:1;s:20:\"outputLocalizationJS\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(57,1,'civicrm/shortcode',NULL,'Insert CiviCRM Content','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Core_Form_ShortCode\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(58,1,'civicrm/task/add-to-group',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contact_Form_Task_AddToGroup\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(59,1,'civicrm/task/remove-from-group',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:37:\"CRM_Contact_Form_Task_RemoveFromGroup\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(60,1,'civicrm/task/add-to-tag',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Contact_Form_Task_AddToTag\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(61,1,'civicrm/task/remove-from-tag',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Contact_Form_Task_RemoveFromTag\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(62,1,'civicrm/task/send-email',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Form_Task_Email\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(63,1,'civicrm/task/make-mailing-label',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Form_Task_Label\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(64,1,'civicrm/task/pick-profile',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:33:\"CRM_Contact_Form_Task_PickProfile\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(65,1,'civicrm/task/print-document',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Contact_Form_Task_PDF\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(66,1,'civicrm/task/unhold-email',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Contact_Form_Task_Unhold\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(67,1,'civicrm/task/alter-contact-preference',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contact_Form_Task_AlterPreferences\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(68,1,'civicrm/task/delete-contact',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Contact_Form_Task_Delete\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(69,1,'civicrm/payment/form',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:26:\"CRM_Financial_Form_Payment\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Payment\";s:3:\"url\";s:39:\"/civicrm/payment?reset=1&amp;action=add\";}}',NULL,NULL,2,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(70,1,'civicrm/payment/edit',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:30:\"CRM_Financial_Form_PaymentEdit\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Payment\";s:3:\"url\";s:39:\"/civicrm/payment?reset=1&amp;action=add\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(71,1,'civicrm/import',NULL,'Import','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"import contacts\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Import_Controller\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,400,1,1,NULL,'a:0:{}'),(72,1,'civicrm/import/contact',NULL,'Import Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"import contacts\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:6:\"Import\";s:3:\"url\";s:23:\"/civicrm/import?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,410,1,1,NULL,'a:0:{}'),(73,1,'civicrm/import/activity',NULL,'Import Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"import contacts\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Activity_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:6:\"Import\";s:3:\"url\";s:23:\"/civicrm/import?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,420,1,1,NULL,'a:0:{}'),(74,1,'civicrm/import/custom','id=%%id%%','Import Multi-value Custom Data','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Custom_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:6:\"Import\";s:3:\"url\";s:23:\"/civicrm/import?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,420,1,1,NULL,'a:0:{}'),(75,1,'civicrm/ajax/status',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"import contacts\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:28:\"CRM_Contact_Import_Page_AJAX\";i:1;s:6:\"status\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(76,1,'civicrm/custom/add',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Custom_Form_CustomData\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(77,1,'civicrm/ajax/optionlist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Custom_Page_AJAX\";i:1;s:13:\"getOptionList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(78,1,'civicrm/ajax/reorder',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Custom_Page_AJAX\";i:1;s:11:\"fixOrdering\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(79,1,'civicrm/ajax/multirecordfieldlist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Custom_Page_AJAX\";i:1;s:23:\"getMultiRecordFieldList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(80,1,'civicrm/admin/custom/group',NULL,'Custom Data','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Custom_Page_Group\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:2:{s:4:\"desc\";s:109:\"Configure custom fields to collect and store custom data which is not included in the standard CiviCRM forms.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(81,1,'civicrm/admin/custom/group/field',NULL,'Custom Data Fields','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Custom_Page_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,11,1,0,0,'a:0:{}'),(82,1,'civicrm/admin/custom/group/field/option',NULL,'Custom Field - Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Custom_Page_Option\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(83,1,'civicrm/admin/custom/group/field/add',NULL,'Custom Field - Add','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Custom_Form_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(84,1,'civicrm/admin/custom/group/field/update',NULL,'Custom Field - Edit','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Custom_Form_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(85,1,'civicrm/admin/custom/group/field/move',NULL,'Custom Field - Move','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Custom_Form_MoveField\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"Custom Data\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(86,1,'civicrm/admin/uf/group',NULL,'Profiles','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Page_Group\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:2:{s:4:\"desc\";s:151:\"Profiles allow you to aggregate groups of fields and include them in your site as input forms, contact display pages, and search and listings features.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(87,1,'civicrm/admin/uf/group/field',NULL,'CiviCRM Profile Fields','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Page_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,21,1,0,0,'a:0:{}'),(88,1,'civicrm/admin/uf/group/field/add',NULL,'Add Field','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Form_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,22,1,0,NULL,'a:0:{}'),(89,1,'civicrm/admin/uf/group/field/update',NULL,'Edit Field','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Form_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,23,1,0,NULL,'a:0:{}'),(90,1,'civicrm/admin/uf/group/add',NULL,'New CiviCRM Profile','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Form_Group\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,24,1,0,NULL,'a:0:{}'),(91,1,'civicrm/admin/uf/group/update',NULL,'Profile Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:17:\"CRM_UF_Form_Group\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,25,1,0,NULL,'a:0:{}'),(92,1,'civicrm/admin/uf/group/setting',NULL,'AdditionalInfo Form','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_UF_Form_AdvanceSetting\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,0,1,0,NULL,'a:0:{}'),(93,1,'civicrm/admin/options/activity_type',NULL,'Activity Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,30,1,0,NULL,'a:2:{s:4:\"desc\";s:155:\"CiviCRM has several built-in activity types (meetings, phone calls, emails sent). Track other types of interactions by creating custom activity types here.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(94,1,'civicrm/admin/reltype',NULL,'Relationship Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Admin_Page_RelationshipType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,35,1,0,NULL,'a:2:{s:4:\"desc\";s:148:\"Contacts can be linked to each other through Relationships (e.g. Spouse, Employer, etc.). Define the types of relationships you want to record here.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(95,1,'civicrm/admin/options/subtype',NULL,'Contact Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Admin_Page_ContactType\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,40,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(96,1,'civicrm/admin/options/gender',NULL,'Gender Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,45,1,0,NULL,'a:2:{s:4:\"desc\";s:79:\"Options for assigning gender to individual contacts (e.g. Male, Female, Other).\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(97,1,'civicrm/admin/options/individual_prefix',NULL,'Individual Prefixes (Ms, Mr...)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,50,1,0,NULL,'a:2:{s:4:\"desc\";s:66:\"Options for individual contact prefixes (e.g. Ms., Mr., Dr. etc.).\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(98,1,'civicrm/admin/options/individual_suffix',NULL,'Individual Suffixes (Jr, Sr...)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,55,1,0,NULL,'a:2:{s:4:\"desc\";s:61:\"Options for individual contact suffixes (e.g. Jr., Sr. etc.).\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(99,1,'civicrm/admin/locationType',NULL,'Location Types (Home, Work...)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Page_LocationType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,60,1,0,NULL,'a:2:{s:4:\"desc\";s:94:\"Options for categorizing contact addresses and phone numbers (e.g. Home, Work, Billing, etc.).\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(100,1,'civicrm/admin/options/website_type',NULL,'Website Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,65,1,0,NULL,'a:2:{s:4:\"desc\";s:48:\"Options for assigning website types to contacts.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(101,1,'civicrm/admin/options/instant_messenger_service',NULL,'Instant Messenger Services','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,70,1,0,NULL,'a:2:{s:4:\"desc\";s:79:\"List of IM services which can be used when recording screen-names for contacts.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(102,1,'civicrm/admin/options/mobile_provider',NULL,'Mobile Phone Providers','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,75,1,0,NULL,'a:2:{s:4:\"desc\";s:90:\"List of mobile phone providers which can be assigned when recording contact phone numbers.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(103,1,'civicrm/admin/options/phone_type',NULL,'Phone Type','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,80,1,0,NULL,'a:2:{s:4:\"desc\";s:80:\"Options for assigning phone type to contacts (e.g Phone,\n    Mobile, Fax, Pager)\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(104,1,'civicrm/admin/setting/preferences/display',NULL,'Display Preferences','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_Admin_Form_Preferences_Display\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,90,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(105,1,'civicrm/admin/setting/search',NULL,'Search Preferences','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Admin_Form_Setting_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,95,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(106,1,'civicrm/admin/setting/preferences/date',NULL,'View Date Preferences','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Admin_Page_PreferencesDate\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(107,1,'civicrm/admin/menu',NULL,'Navigation Menu','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Admin_Page_Navigation\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,100,1,0,NULL,'a:2:{s:4:\"desc\";s:79:\"Add or remove menu items, and modify the order of items on the navigation menu.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(108,1,'civicrm/admin/options/wordreplacements',NULL,'Word Replacements','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Admin_Form_WordReplacements\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,105,1,0,NULL,'a:2:{s:4:\"desc\";s:18:\"Word Replacements.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(109,1,'civicrm/admin/options/custom_search',NULL,'Manage Custom Searches','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,110,1,0,NULL,'a:2:{s:4:\"desc\";s:225:\"Developers and accidental techies with a bit of PHP and SQL knowledge can create new search forms to handle specific search and reporting needs which aren\'t covered by the built-in Advanced Search and Search Builder features.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(110,1,'civicrm/admin/domain','action=update','Organization Address and Contact Info','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Contact_Form_Domain\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:2:{s:4:\"desc\";s:150:\"Configure primary contact name, email, return-path and address information. This information is used by CiviMail to identify the sending organization.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(111,1,'civicrm/admin/options/from_email_address',NULL,'From Email Addresses','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:2:{s:4:\"desc\";s:74:\"List of Email Addresses which can be used when sending emails to contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(112,1,'civicrm/admin/messageTemplates',NULL,'Message Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:22:\"edit message templates\";i:1;s:34:\"edit user-driven message templates\";i:2;s:38:\"edit system workflow message templates\";}i:1;s:2:\"or\";}','s:31:\"CRM_Admin_Page_MessageTemplates\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,30,1,0,NULL,'a:2:{s:4:\"desc\";s:130:\"Message templates allow you to save and re-use messages with layouts which you can use when sending email to one or more contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(113,1,'civicrm/admin/messageTemplates/add',NULL,'Message Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:22:\"edit message templates\";i:1;s:34:\"edit user-driven message templates\";i:2;s:38:\"edit system workflow message templates\";}i:1;s:2:\"or\";}','s:31:\"CRM_Admin_Form_MessageTemplates\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:17:\"Message Templates\";s:3:\"url\";s:39:\"/civicrm/admin/messageTemplates?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,262,1,0,NULL,'a:1:{s:4:\"desc\";s:26:\"Add/Edit Message Templates\";}'),(114,1,'civicrm/admin/scheduleReminders',NULL,'Schedule Reminders','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCRM data\";i:1;s:15:\"edit all events\";}i:1;s:2:\"or\";}','s:32:\"CRM_Admin_Page_ScheduleReminders\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,40,1,0,NULL,'a:2:{s:4:\"desc\";s:19:\"Schedule Reminders.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(115,1,'civicrm/admin/weight',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:16:\"CRM_Utils_Weight\";i:1;s:8:\"fixOrder\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(116,1,'civicrm/admin/options/preferred_communication_method',NULL,'Preferred Communication Methods','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,50,1,0,NULL,'a:2:{s:4:\"desc\";s:117:\"One or more preferred methods of communication can be assigned to each contact. Customize the available options here.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(117,1,'civicrm/admin/labelFormats',NULL,'Label Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Page_LabelFormats\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,60,1,0,NULL,'a:2:{s:4:\"desc\";s:67:\"Configure Label Formats that are used when creating mailing labels.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(118,1,'civicrm/admin/pdfFormats',NULL,'Print Page (PDF) Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Admin_Page_PdfFormats\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,70,1,0,NULL,'a:2:{s:4:\"desc\";s:95:\"Configure PDF Page Formats that can be assigned to Message Templates when creating PDF letters.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(119,1,'civicrm/admin/options/communication_style',NULL,'Communication Style Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,75,1,0,NULL,'a:2:{s:4:\"desc\";s:42:\"Options for Communication Style selection.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(120,1,'civicrm/admin/options/email_greeting',NULL,'Email Greeting Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,80,1,0,NULL,'a:2:{s:4:\"desc\";s:75:\"Options for assigning email greetings to individual and household contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(121,1,'civicrm/admin/options/postal_greeting',NULL,'Postal Greeting Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,90,1,0,NULL,'a:2:{s:4:\"desc\";s:76:\"Options for assigning postal greetings to individual and household contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(122,1,'civicrm/admin/options/addressee',NULL,'Addressee Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,100,1,0,NULL,'a:2:{s:4:\"desc\";s:83:\"Options for assigning addressee to individual, household and organization contacts.\";s:10:\"adminGroup\";s:14:\"Communications\";}'),(123,1,'civicrm/admin/setting/localization',NULL,'Languages, Currency, Locations','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Admin_Form_Setting_Localization\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:12:\"Localization\";}'),(124,1,'civicrm/admin/setting/preferences/address',NULL,'Address Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_Admin_Form_Preferences_Address\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:12:\"Localization\";}'),(125,1,'civicrm/admin/setting/date',NULL,'Date Formats','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Date\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,30,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:12:\"Localization\";}'),(126,1,'civicrm/admin/options/languages',NULL,'Preferred Languages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,40,1,0,NULL,'a:2:{s:4:\"desc\";s:30:\"Options for contact languages.\";s:10:\"adminGroup\";s:12:\"Localization\";}'),(127,1,'civicrm/admin/access',NULL,'Access Control','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Admin_Page_Access\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:2:{s:4:\"desc\";s:73:\"Grant or deny access to actions (view, edit...), features and components.\";s:10:\"adminGroup\";s:21:\"Users and Permissions\";}'),(128,1,'civicrm/admin/access/wp-permissions',NULL,'WordPress Access Control','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_ACL_Form_WordPress_Permissions\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:14:\"Access Control\";s:3:\"url\";s:29:\"/civicrm/admin/access?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:1:{s:4:\"desc\";s:65:\"Grant access to CiviCRM components and other CiviCRM permissions.\";}'),(129,1,'civicrm/admin/synchUser',NULL,'Synchronize Users to Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Form_CMSUser\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:2:{s:4:\"desc\";s:71:\"Automatically create a CiviCRM contact record for each CMS user record.\";s:10:\"adminGroup\";s:21:\"Users and Permissions\";}'),(130,1,'civicrm/admin/configtask',NULL,'Configuration Checklist','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Admin_Page_ConfigTaskList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}','civicrm/admin/configtask',NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:55:\"List of configuration tasks with links to each setting.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(131,1,'civicrm/admin/setting/component',NULL,'Enable CiviCRM Components','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Admin_Form_Setting_Component\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:2:{s:4:\"desc\";s:269:\"Enable or disable components (e.g. CiviEvent, CiviMember, etc.) for your site based on the features you need. We recommend disabling any components not being used in order to simplify the user interface. You can easily re-enable components at any time from this screen.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(132,1,'civicrm/admin/extensions',NULL,'Manage Extensions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"administer CiviCRM system\";}i:1;s:3:\"and\";}','s:25:\"CRM_Admin_Page_Extensions\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,120,1,0,NULL,'a:2:{s:4:\"desc\";s:0:\"\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(133,1,'civicrm/admin/extensions/upgrade',NULL,'Database Upgrades','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"administer CiviCRM system\";}i:1;s:3:\"and\";}','s:32:\"CRM_Admin_Page_ExtensionsUpgrade\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:17:\"Manage Extensions\";s:3:\"url\";s:33:\"/civicrm/admin/extensions?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(134,1,'civicrm/admin/setting/smtp',NULL,'Outbound Email Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"administer CiviCRM system\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Smtp\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,20,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(135,1,'civicrm/admin/paymentProcessor',NULL,'Settings - Payment Processor','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:29:\"administer payment processors\";}i:1;s:3:\"and\";}','s:31:\"CRM_Admin_Page_PaymentProcessor\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,30,1,0,NULL,'a:2:{s:4:\"desc\";s:48:\"Payment Processor setup for CiviCRM transactions\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(136,1,'civicrm/admin/setting/mapping',NULL,'Mapping and Geocoding','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Admin_Form_Setting_Mapping\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,40,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(137,1,'civicrm/admin/setting/misc',NULL,'Misc (Undelete, PDFs, Limits, Logging, Captcha, etc.)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:36:\"CRM_Admin_Form_Setting_Miscellaneous\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,50,1,0,NULL,'a:2:{s:4:\"desc\";s:91:\"Enable undelete/move to trash feature, detailed change logging, ReCAPTCHA to protect forms.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(138,1,'civicrm/admin/setting/path',NULL,'Directories','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Path\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,60,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(139,1,'civicrm/admin/setting/url',NULL,'Resource URLs','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Admin_Form_Setting_Url\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,70,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(140,1,'civicrm/admin/setting/updateConfigBackend',NULL,'Cleanup Caches and Update Paths','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:42:\"CRM_Admin_Form_Setting_UpdateConfigBackend\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,80,1,0,NULL,'a:2:{s:4:\"desc\";s:157:\"Reset the Base Directory Path and Base URL settings - generally when a CiviCRM site is moved to another location in the file system and/or to another domain.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(141,1,'civicrm/admin/setting/uf',NULL,'CMS Database Integration','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Admin_Form_Setting_UF\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,90,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(142,1,'civicrm/admin/options/safe_file_extension',NULL,'Safe File Extension Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,100,1,0,NULL,'a:2:{s:4:\"desc\";s:44:\"File Extensions that can be considered safe.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(143,1,'civicrm/admin/options',NULL,'Option Groups','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,105,1,0,NULL,'a:2:{s:4:\"desc\";s:35:\"Access all meta-data option groups.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(144,1,'civicrm/admin/mapping',NULL,'Import/Export Mappings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Mapping\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,110,1,0,NULL,'a:2:{s:4:\"desc\";s:141:\"Import and Export mappings allow you to easily run the same job multiple times. This option allows you to rename or delete existing mappings.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(145,1,'civicrm/admin/setting/debug',NULL,'Debugging','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Admin_Form_Setting_Debugging\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,120,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(146,1,'civicrm/admin/setting/preferences/multisite',NULL,'Multi Site Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Form_Generic\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,130,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:15:\"System Settings\";}'),(147,1,'civicrm/admin/setting/preferences/campaign',NULL,'CiviCampaign Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Form_Generic\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,10,1,0,NULL,'a:3:{s:4:\"desc\";s:40:\"Configure global CiviCampaign behaviors.\";s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(148,1,'civicrm/admin/setting/preferences/event',NULL,'CiviEvent Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:16:\"access CiviEvent\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Form_Generic\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,420,1,0,NULL,'a:2:{s:4:\"desc\";s:37:\"Configure global CiviEvent behaviors.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(149,1,'civicrm/admin/setting/preferences/mailing',NULL,'CiviMail Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"access CiviMail\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_Admin_Form_Preferences_Mailing\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,430,1,0,NULL,'a:2:{s:4:\"desc\";s:36:\"Configure global CiviMail behaviors.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(150,1,'civicrm/admin/setting/preferences/member',NULL,'CiviMember Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:17:\"access CiviMember\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:33:\"CRM_Admin_Form_Preferences_Member\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,390,1,0,NULL,'a:2:{s:4:\"desc\";s:38:\"Configure global CiviMember behaviors.\";s:10:\"adminGroup\";s:10:\"CiviMember\";}'),(151,1,'civicrm/admin/runjobs',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:25:\"administer CiviCRM system\";}i:1;s:3:\"and\";}','a:2:{i:0;s:16:\"CRM_Utils_System\";i:1;s:20:\"executeScheduledJobs\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:1:{s:4:\"desc\";s:36:\"URL used for running scheduled jobs.\";}'),(152,1,'civicrm/admin/job',NULL,'Scheduled Jobs','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:25:\"administer CiviCRM system\";}i:1;s:3:\"and\";}','s:18:\"CRM_Admin_Page_Job\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1370,1,0,NULL,'a:2:{s:4:\"desc\";s:35:\"Managing periodially running tasks.\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(153,1,'civicrm/admin/joblog',NULL,'Scheduled Jobs Log','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:25:\"administer CiviCRM system\";}i:1;s:3:\"and\";}','s:21:\"CRM_Admin_Page_JobLog\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1380,1,0,NULL,'a:2:{s:4:\"desc\";s:46:\"Browsing the log of periodially running tasks.\";s:10:\"adminGroup\";s:6:\"Manage\";}'),(154,1,'civicrm/admin/options/grant_type',NULL,'Grant Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,385,1,0,NULL,'a:2:{s:4:\"desc\";s:148:\"List of types which can be assigned to Grants. (Enable CiviGrant from Administer > Systme Settings > Enable Components if you want to track grants.)\";s:10:\"adminGroup\";s:12:\"Option Lists\";}'),(155,1,'civicrm/admin/paymentProcessorType',NULL,'Payment Processor Type','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Admin_Page_PaymentProcessorType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,390,1,0,NULL,'a:1:{s:4:\"desc\";s:34:\"Payment Processor type information\";}'),(156,1,'civicrm/admin',NULL,'Administer CiviCRM','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:20:\"CRM_Admin_Page_Admin\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,9000,1,1,NULL,'a:0:{}'),(157,1,'civicrm/ajax/navmenu',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:7:\"navMenu\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(158,1,'civicrm/ajax/menutree',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:8:\"menuTree\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(159,1,'civicrm/ajax/statusmsg',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:12:\"getStatusMsg\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(160,1,'civicrm/admin/price',NULL,'Price Sets','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_Price_Page_Set\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,380,1,0,NULL,'a:2:{s:4:\"desc\";s:205:\"Price sets allow you to offer multiple options with associated fees (e.g. pre-conference workshops, additional meals, etc.). Configure Price Sets for events which need more than a single set of fee levels.\";s:10:\"adminGroup\";s:9:\"Customize\";}'),(161,1,'civicrm/admin/price/add','action=add','New Price Set','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_Price_Page_Set\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:10:\"Price Sets\";s:3:\"url\";s:28:\"/civicrm/admin/price?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:1:{s:4:\"desc\";s:205:\"Price sets allow you to offer multiple options with associated fees (e.g. pre-conference workshops, additional meals, etc.). Configure Price Sets for events which need more than a single set of fee levels.\";}'),(162,1,'civicrm/admin/price/field',NULL,'Price Fields','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:20:\"CRM_Price_Page_Field\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:10:\"Price Sets\";s:3:\"url\";s:28:\"/civicrm/admin/price?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,0,'a:0:{}'),(163,1,'civicrm/admin/price/field/option',NULL,'Price Field Options','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:21:\"CRM_Price_Page_Option\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:10:\"Price Sets\";s:3:\"url\";s:28:\"/civicrm/admin/price?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(164,1,'civicrm/ajax/mapping',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:11:\"mappingList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(165,1,'civicrm/ajax/recipientListing',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:16:\"access CiviEvent\";i:1;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:16:\"recipientListing\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(166,1,'civicrm/admin/sms/provider',NULL,'Sms Providers','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_SMS_Page_Provider\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,500,1,0,NULL,'a:2:{s:4:\"desc\";s:27:\"To configure a sms provider\";s:10:\"adminGroup\";s:15:\"System Settings\";}'),(167,1,'civicrm/sms/send',NULL,'New Mass SMS','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:8:\"send SMS\";}i:1;s:3:\"and\";}','s:23:\"CRM_SMS_Controller_Send\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,610,1,1,NULL,'a:0:{}'),(168,1,'civicrm/sms/callback',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_SMS_Page_Callback\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(169,1,'civicrm/admin/badgelayout','action=browse','Event Name Badge Layouts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Badge_Page_Layout\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,399,1,0,NULL,'a:2:{s:4:\"desc\";s:107:\"Configure name badge layouts for event participants, including logos and what data to include on the badge.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(170,1,'civicrm/admin/badgelayout/add',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Badge_Form_Layout\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:24:\"Event Name Badge Layouts\";s:3:\"url\";s:52:\"/civicrm/admin/badgelayout?reset=1&amp;action=browse\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(171,1,'civicrm/admin/ckeditor',NULL,'Configure CKEditor','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Admin_Form_CKEditorConfig\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(172,1,'civicrm',NULL,'CiviCRM','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Contact_Page_DashBoard\";',NULL,'a:0:{}',NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,0,NULL,'a:0:{}'),(173,1,'civicrm/dashboard',NULL,'CiviCRM Home','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Contact_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,0,1,1,NULL,'a:0:{}'),(174,1,'civicrm/dashlet',NULL,'CiviCRM Dashlets','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Contact_Page_Dashlet\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,1,NULL,'a:0:{}'),(175,1,'civicrm/contact/search',NULL,'Find Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:8:\"mode=256\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,10,1,1,NULL,'a:0:{}'),(176,1,'civicrm/contact/image',NULL,'Process Uploaded Images','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access uploaded files\";}i:1;s:3:\"and\";}','a:2:{i:0;s:23:\"CRM_Contact_BAO_Contact\";i:1;s:12:\"processImage\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(177,1,'civicrm/contact/imagefile',NULL,'Get Image File','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','s:26:\"CRM_Contact_Page_ImageFile\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(178,1,'civicrm/contact/search/basic',NULL,'Find Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:8:\"mode=256\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(179,1,'civicrm/contact/search/advanced',NULL,'Advanced Search','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:8:\"mode=512\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,12,1,1,NULL,'a:0:{}'),(180,1,'civicrm/contact/search/builder',NULL,'Search Builder','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:9:\"mode=8192\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,14,1,1,NULL,'a:0:{}'),(181,1,'civicrm/contact/search/custom',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:10:\"mode=16384\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(182,1,'civicrm/contact/search/custom/list',NULL,'Custom Searches','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Page_CustomSearch\";','s:10:\"mode=16384\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Find Contacts\";s:3:\"url\";s:31:\"/civicrm/contact/search?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,16,1,1,NULL,'a:0:{}'),(183,1,'civicrm/contact/add',NULL,'New Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:24:\"CRM_Contact_Form_Contact\";','s:13:\"addSequence=1\";','a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(184,1,'civicrm/contact/add/individual','ct=Individual','New Individual','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:12:\"add contacts\";}i:1;s:3:\"and\";}','s:24:\"CRM_Contact_Form_Contact\";','s:13:\"addSequence=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Contact\";s:3:\"url\";s:28:\"/civicrm/contact/add?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(185,1,'civicrm/contact/add/household','ct=Household','New Household','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:12:\"add contacts\";}i:1;s:3:\"and\";}','s:24:\"CRM_Contact_Form_Contact\";','s:13:\"addSequence=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Contact\";s:3:\"url\";s:28:\"/civicrm/contact/add?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(186,1,'civicrm/contact/add/organization','ct=Organization','New Organization','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:12:\"add contacts\";}i:1;s:3:\"and\";}','s:24:\"CRM_Contact_Form_Contact\";','s:13:\"addSequence=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Contact\";s:3:\"url\";s:28:\"/civicrm/contact/add?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(187,1,'civicrm/contact/relatedcontact',NULL,'Edit Related Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"access Contact Dashboard\";}i:1;s:3:\"and\";}','s:31:\"CRM_Contact_Form_RelatedContact\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(188,1,'civicrm/contact/merge',NULL,'Merge Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','s:22:\"CRM_Contact_Form_Merge\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(189,1,'civicrm/contact/email',NULL,'Email a Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Form_Task_Email\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(190,1,'civicrm/contact/map',NULL,'Map Location(s)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Contact_Form_Task_Map\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(191,1,'civicrm/contact/map/event',NULL,'Map Event Location','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Contact_Form_Task_Map_Event\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Map Location(s)\";s:3:\"url\";s:28:\"/civicrm/contact/map?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(192,1,'civicrm/contact/view','cid=%%cid%%','Contact Summary','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:29:\"CRM_Contact_Page_View_Summary\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(193,1,'civicrm/contact/view/delete',NULL,'Delete Contact','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:28:\"CRM_Contact_Form_Task_Delete\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(194,1,'civicrm/contact/view/activity','show=1,cid=%%cid%%','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:21:\"CRM_Activity_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(195,1,'civicrm/activity/add','action=add','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Activity_Form_Activity\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(196,1,'civicrm/activity/email/add','action=add','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Form_Task_Email\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(197,1,'civicrm/activity/pdf/add','action=add','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Contact_Form_Task_PDF\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(198,1,'civicrm/contact/view/rel','cid=%%cid%%','Relationships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:34:\"CRM_Contact_Page_View_Relationship\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(199,1,'civicrm/contact/view/group','cid=%%cid%%','Groups','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:34:\"CRM_Contact_Page_View_GroupContact\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(200,1,'civicrm/contact/view/smartgroup','cid=%%cid%%','Smart Groups','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:39:\"CRM_Contact_Page_View_ContactSmartGroup\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(201,1,'civicrm/contact/view/note','cid=%%cid%%','Notes','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:26:\"CRM_Contact_Page_View_Note\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(202,1,'civicrm/contact/view/tag','cid=%%cid%%','Tags','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:25:\"CRM_Contact_Page_View_Tag\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(203,1,'civicrm/contact/view/cd',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:32:\"CRM_Contact_Page_View_CustomData\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(204,1,'civicrm/contact/view/cd/edit',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:27:\"CRM_Contact_Form_CustomData\";','s:13:\"addSequence=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(205,1,'civicrm/contact/view/vcard',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:27:\"CRM_Contact_Page_View_Vcard\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(206,1,'civicrm/contact/view/print',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:27:\"CRM_Contact_Page_View_Print\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(207,1,'civicrm/contact/view/log',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:25:\"CRM_Contact_Page_View_Log\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(208,1,'civicrm/user',NULL,'Contact Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"access Contact Dashboard\";}i:1;s:3:\"and\";}','s:35:\"CRM_Contact_Page_View_UserDashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(209,1,'civicrm/dashlet/activity',NULL,'Activity Dashlet','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Dashlet_Page_Activity\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(210,1,'civicrm/dashlet/blog',NULL,'CiviCRM Blog','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:21:\"CRM_Dashlet_Page_Blog\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(211,1,'civicrm/dashlet/getting-started',NULL,'CiviCRM Resources','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Dashlet_Page_GettingStarted\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(212,1,'civicrm/ajax/relation',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:12:\"relationship\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(213,1,'civicrm/ajax/groupTree',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:9:\"groupTree\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(214,1,'civicrm/ajax/custom',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:11:\"customField\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(215,1,'civicrm/ajax/customvalue',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:17:\"deleteCustomValue\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(216,1,'civicrm/ajax/cmsuser',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:13:\"checkUserName\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(217,1,'civicrm/ajax/checkemail',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:15:\"getContactEmail\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(218,1,'civicrm/ajax/checkphone',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:15:\"getContactPhone\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(219,1,'civicrm/ajax/subtype',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:13:\"buildSubTypes\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(220,1,'civicrm/ajax/dashboard',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:9:\"dashboard\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(221,1,'civicrm/ajax/signature',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:12:\"getSignature\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(222,1,'civicrm/ajax/pdfFormat',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:9:\"pdfFormat\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(223,1,'civicrm/ajax/paperSize',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:9:\"paperSize\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(224,1,'civicrm/ajax/contactref',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:31:\"access contact reference fields\";i:1;s:15:\" access CiviCRM\";}i:1;s:2:\"or\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:16:\"contactReference\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(225,1,'civicrm/dashlet/myCases',NULL,'Case Dashlet','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Dashlet_Page_MyCases\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(226,1,'civicrm/dashlet/allCases',NULL,'All Cases Dashlet','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:31:\"access all cases and activities\";}i:1;s:3:\"and\";}','s:25:\"CRM_Dashlet_Page_AllCases\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(227,1,'civicrm/dashlet/casedashboard',NULL,'Case Dashboard Dashlet','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Dashlet_Page_CaseDashboard\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"CiviCRM Dashlets\";s:3:\"url\";s:24:\"/civicrm/dashlet?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(228,1,'civicrm/contact/deduperules',NULL,'Find and Merge Duplicate Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer dedupe rules\";i:1;s:24:\"merge duplicate contacts\";}i:1;s:2:\"or\";}','s:28:\"CRM_Contact_Page_DedupeRules\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,105,1,0,NULL,'a:2:{s:4:\"desc\";s:158:\"Manage the rules used to identify potentially duplicate contact records. Scan for duplicates using a selected rule and merge duplicate contact data as needed.\";s:10:\"adminGroup\";s:6:\"Manage\";}'),(229,1,'civicrm/contact/dedupefind',NULL,'Find and Merge Duplicate Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','s:27:\"CRM_Contact_Page_DedupeFind\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(230,1,'civicrm/ajax/dedupefind',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:10:\"getDedupes\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(231,1,'civicrm/contact/dedupemerge',NULL,'Batch Merge Duplicate Contacts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','s:28:\"CRM_Contact_Page_DedupeMerge\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(232,1,'civicrm/dedupe/exception',NULL,'Dedupe Exceptions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contact_Page_DedupeException\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,110,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:6:\"Manage\";}'),(233,1,'civicrm/ajax/dedupeRules',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:16:\"buildDedupeRules\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(234,1,'civicrm/contact/view/useradd','cid=%%cid%%','Add User','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:29:\"CRM_Contact_Page_View_Useradd\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(235,1,'civicrm/ajax/markSelection',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:22:\"selectUnselectContacts\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(236,1,'civicrm/ajax/toggleDedupeSelect',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:18:\"toggleDedupeSelect\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(237,1,'civicrm/ajax/flipDupePairs',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:24:\"merge duplicate contacts\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:13:\"flipDupePairs\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(238,1,'civicrm/activity/sms/add','action=add','Activities','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:8:\"send SMS\";}i:1;s:3:\"and\";}','s:25:\"CRM_Contact_Form_Task_SMS\";','s:14:\"attachUpload=1\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:12:\"New Activity\";s:3:\"url\";s:63:\"/civicrm/activity?reset=1&amp;action=add&amp;context=standalone\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(239,1,'civicrm/ajax/contactrelationships',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"view my contact\";}i:1;s:2:\"or\";}','a:2:{i:0;s:21:\"CRM_Contact_Page_AJAX\";i:1;s:23:\"getContactRelationships\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(240,1,'civicrm/ajax/jqState',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:27:\"CRM_Core_Page_AJAX_Location\";i:1;s:7:\"jqState\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(241,1,'civicrm/ajax/jqCounty',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:27:\"CRM_Core_Page_AJAX_Location\";i:1;s:8:\"jqCounty\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(242,1,'civicrm/group',NULL,'Manage Groups','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:20:\"CRM_Group_Page_Group\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,30,1,1,NULL,'a:0:{}'),(243,1,'civicrm/group/search',NULL,'Group Members','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contact_Controller_Search\";','s:8:\"mode=256\";','a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Manage Groups\";s:3:\"url\";s:22:\"/civicrm/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:7:\"comment\";s:164:\"Note: group search already respect ACL, so a strict permission at url level is not required. A simple/basic permission like \'access CiviCRM\' could be used. CRM-5417\";}'),(244,1,'civicrm/group/add',NULL,'New Group','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:11:\"edit groups\";}i:1;s:3:\"and\";}','s:20:\"CRM_Group_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:13:\"Manage Groups\";s:3:\"url\";s:22:\"/civicrm/group?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(245,1,'civicrm/ajax/grouplist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Group_Page_AJAX\";i:1;s:12:\"getGroupList\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(246,1,'civicrm/tag',NULL,'Tags (Categories)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:11:\"manage tags\";}i:1;s:2:\"or\";}','s:16:\"CRM_Tag_Page_Tag\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,25,1,0,NULL,'a:2:{s:4:\"desc\";s:158:\"Tags are useful for segmenting the contacts in your database into categories (e.g. Staff Member, Donor, Volunteer, etc.). Create and edit available tags here.\";s:10:\"adminGroup\";s:26:\"Customize Data and Screens\";}'),(247,1,'civicrm/tag/edit','action=add','New Tag','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:11:\"manage tags\";}i:1;s:2:\"or\";}','s:17:\"CRM_Tag_Form_Edit\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:17:\"Tags (Categories)\";s:3:\"url\";s:20:\"/civicrm/tag?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(248,1,'civicrm/tag/merge',NULL,'Merge Tags','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:11:\"manage tags\";}i:1;s:2:\"or\";}','s:18:\"CRM_Tag_Form_Merge\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:17:\"Tags (Categories)\";s:3:\"url\";s:20:\"/civicrm/tag?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(249,1,'civicrm/ajax/tagTree',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:11:\"manage tags\";}i:1;s:2:\"or\";}','a:2:{i:0;s:19:\"CRM_Admin_Page_AJAX\";i:1;s:10:\"getTagTree\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(250,1,'civicrm/custom',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Custom_Form_CustomDataByType\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(251,1,'civicrm/event/manage/pcp',NULL,'Personal Campaign Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_PCP_Form_Event\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,540,1,1,NULL,'a:0:{}'),(252,1,'civicrm/event/pcp',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:16:\"CRM_PCP_Form_PCP\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(253,1,'civicrm/event/campaign',NULL,'Setup a Personal Campaign Page - Account Information','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:22:\"CRM_PCP_Controller_PCP\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(254,1,'civicrm/event',NULL,'CiviEvent Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:24:\"CRM_Event_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,800,1,1,NULL,'a:1:{s:9:\"component\";s:9:\"CiviEvent\";}'),(255,1,'civicrm/participant/add','action=add','Register New Participant','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_Event_Page_Tab\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:9:\"CiviEvent\";}'),(256,1,'civicrm/event/info',NULL,'Event Information','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:24:\"CRM_Event_Page_EventInfo\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(257,1,'civicrm/event/register',NULL,'Event Registration','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:33:\"CRM_Event_Controller_Registration\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,1,1,1,0,NULL,'a:0:{}'),(258,1,'civicrm/event/confirm',NULL,'Confirm Event Registration','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:46:\"CRM_Event_Form_Registration_ParticipantConfirm\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,1,1,1,0,NULL,'a:0:{}'),(259,1,'civicrm/event/ical',NULL,'Current and Upcoming Events','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:15:\"view event info\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Event_ICalendar\";i:1;s:3:\"run\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(260,1,'civicrm/event/list',NULL,'Current and Upcoming Events','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:15:\"view event info\";}i:1;s:3:\"and\";}','s:19:\"CRM_Event_Page_List\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(261,1,'civicrm/event/participant',NULL,'Event Participants List','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:23:\"view event participants\";}i:1;s:3:\"and\";}','s:33:\"CRM_Event_Page_ParticipantListing\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(262,1,'civicrm/admin/event',NULL,'Manage Events','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:26:\"CRM_Event_Page_ManageEvent\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,370,1,0,NULL,'a:2:{s:4:\"desc\";s:136:\"Create and edit event configuration including times, locations, online registration forms, and fees. Links for iCal and RSS syndication.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(263,1,'civicrm/admin/eventTemplate',NULL,'Event Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:28:\"CRM_Admin_Page_EventTemplate\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,375,1,0,NULL,'a:2:{s:4:\"desc\";s:115:\"Administrators can create Event Templates - which are basically master event records pre-filled with default values\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(264,1,'civicrm/admin/options/event_type',NULL,'Event Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,385,1,0,NULL,'a:2:{s:4:\"desc\";s:143:\"Use Event Types to categorize your events. Event feeds can be filtered by Event Type and participant searches can use Event Type as a criteria.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(265,1,'civicrm/admin/participant_status',NULL,'Participant Status','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:36:\"CRM_Admin_Page_ParticipantStatusType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,390,1,0,NULL,'a:2:{s:4:\"desc\";s:154:\"Define statuses for event participants here (e.g. Registered, Attended, Cancelled...). You can then assign statuses and search for participants by status.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(266,1,'civicrm/admin/options/participant_role',NULL,'Participant Role','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,395,1,0,NULL,'a:2:{s:4:\"desc\";s:138:\"Define participant roles for events here (e.g. Attendee, Host, Speaker...). You can then assign roles and search for participants by role.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(267,1,'civicrm/admin/options/participant_listing',NULL,'Participant Listing Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,398,1,0,NULL,'a:2:{s:4:\"desc\";s:48:\"Template to control participant listing display.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(268,1,'civicrm/admin/options/conference_slot',NULL,'Conference Slot Labels','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,415,1,0,NULL,'a:2:{s:4:\"desc\";s:35:\"Define conference slots and labels.\";s:10:\"adminGroup\";s:9:\"CiviEvent\";}'),(269,1,'civicrm/event/search',NULL,'Find Participants','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:27:\"CRM_Event_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,810,1,1,NULL,'a:0:{}'),(270,1,'civicrm/event/manage',NULL,'Manage Events','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:26:\"CRM_Event_Page_ManageEvent\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,820,1,1,NULL,'a:0:{}'),(271,1,'civicrm/event/badge',NULL,'Print Event Name Badge','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:25:\"CRM_Event_Form_Task_Badge\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(272,1,'civicrm/event/manage/settings',NULL,'Event Info and Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:36:\"CRM_Event_Form_ManageEvent_EventInfo\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,910,1,0,NULL,'a:0:{}'),(273,1,'civicrm/event/manage/location',NULL,'Event Location','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:35:\"CRM_Event_Form_ManageEvent_Location\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,930,1,0,NULL,'a:0:{}'),(274,1,'civicrm/event/manage/fee',NULL,'Event Fees','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:30:\"CRM_Event_Form_ManageEvent_Fee\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,920,1,0,NULL,'a:0:{}'),(275,1,'civicrm/event/manage/registration',NULL,'Event Online Registration','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:39:\"CRM_Event_Form_ManageEvent_Registration\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,930,1,0,NULL,'a:0:{}'),(276,1,'civicrm/event/manage/friend',NULL,'Tell a Friend','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:21:\"CRM_Friend_Form_Event\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,940,1,0,NULL,'a:0:{}'),(277,1,'civicrm/event/manage/reminder',NULL,'Schedule Reminders','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:44:\"CRM_Event_Form_ManageEvent_ScheduleReminders\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,950,1,0,NULL,'a:0:{}'),(278,1,'civicrm/event/manage/repeat',NULL,'Repeat Event','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:33:\"CRM_Event_Form_ManageEvent_Repeat\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,960,1,0,NULL,'a:0:{}'),(279,1,'civicrm/event/manage/conference',NULL,'Conference Slots','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:37:\"CRM_Event_Form_ManageEvent_Conference\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Manage Events\";s:3:\"url\";s:29:\"/civicrm/event/manage?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,1,950,1,0,NULL,'a:0:{}'),(280,1,'civicrm/event/add','action=add','New Event','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:36:\"CRM_Event_Form_ManageEvent_EventInfo\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,830,1,0,NULL,'a:0:{}'),(281,1,'civicrm/event/import',NULL,'Import Participants','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:16:\"access CiviEvent\";i:1;s:23:\"edit event participants\";}i:1;s:3:\"and\";}','s:27:\"CRM_Event_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,840,1,1,NULL,'a:0:{}'),(282,1,'civicrm/event/price',NULL,'Manage Price Sets','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:18:\"CRM_Price_Page_Set\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,850,1,1,NULL,'a:0:{}'),(283,1,'civicrm/event/selfsvcupdate',NULL,'Self-service Registration Update','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:28:\"CRM_Event_Form_SelfSvcUpdate\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,880,1,1,NULL,'a:0:{}'),(284,1,'civicrm/event/selfsvctransfer',NULL,'Self-service Registration Transfer','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:30:\"CRM_Event_Form_SelfSvcTransfer\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,890,1,1,NULL,'a:0:{}'),(285,1,'civicrm/contact/view/participant',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:18:\"CRM_Event_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,4,1,0,NULL,'a:0:{}'),(286,1,'civicrm/ajax/eventFee',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','a:2:{i:0;s:19:\"CRM_Event_Page_AJAX\";i:1;s:8:\"eventFee\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(287,1,'civicrm/ajax/locBlock',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','a:2:{i:0;s:27:\"CRM_Core_Page_AJAX_Location\";i:1;s:11:\"getLocBlock\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(288,1,'civicrm/event/participant/feeselection',NULL,'Change Registration Selections','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:38:\"CRM_Event_Form_ParticipantFeeSelection\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}i:2;a:2:{s:5:\"title\";s:23:\"Event Participants List\";s:3:\"url\";s:34:\"/civicrm/event/participant?reset=1\";}}',NULL,NULL,1,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(289,1,'civicrm/admin/contribute/pcp',NULL,'Personal Campaign Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_PCP_Form_Contribute\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,450,1,0,NULL,'a:0:{}'),(290,1,'civicrm/contribute/campaign',NULL,'Setup a Personal Campaign Page - Account Information','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:22:\"CRM_PCP_Controller_PCP\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,1,NULL,0,0,1,0,NULL,'a:0:{}'),(291,1,'civicrm/contribute',NULL,'CiviContribute Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:29:\"CRM_Contribute_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,500,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(292,1,'civicrm/contribute/add','action=add','New Contribution','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:23:\"CRM_Contribute_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(293,1,'civicrm/contribute/chart',NULL,'Contribution Summary - Chart View','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Form_ContributionCharts\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(294,1,'civicrm/contribute/transact',NULL,'CiviContribute','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Controller_Contribution\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,1,NULL,1,0,1,0,NULL,'a:0:{}'),(295,1,'civicrm/admin/contribute',NULL,'Manage Contribution Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:36:\"CRM_Contribute_Page_ContributionPage\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,360,1,0,NULL,'a:2:{s:4:\"desc\";s:242:\"CiviContribute allows you to create and maintain any number of Online Contribution Pages. You can create different pages for different programs or campaigns - and customize text, amounts, types of information collected from contributors, etc.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(296,1,'civicrm/admin/contribute/settings',NULL,'Title and Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:45:\"CRM_Contribute_Form_ContributionPage_Settings\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:0:{}'),(297,1,'civicrm/admin/contribute/amount',NULL,'Contribution Amounts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:43:\"CRM_Contribute_Form_ContributionPage_Amount\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,410,1,0,NULL,'a:0:{}'),(298,1,'civicrm/admin/contribute/membership',NULL,'Membership Section','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:31:\"CRM_Member_Form_MembershipBlock\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,420,1,0,NULL,'a:0:{}'),(299,1,'civicrm/admin/contribute/custom',NULL,'Include Profiles','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:43:\"CRM_Contribute_Form_ContributionPage_Custom\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,430,1,0,NULL,'a:0:{}'),(300,1,'civicrm/admin/contribute/thankyou',NULL,'Thank-you and Receipting','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:45:\"CRM_Contribute_Form_ContributionPage_ThankYou\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,430,1,0,NULL,'a:0:{}'),(301,1,'civicrm/admin/contribute/friend',NULL,'Tell a Friend','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Friend_Form_Contribute\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,440,1,0,NULL,'a:0:{}'),(302,1,'civicrm/admin/contribute/widget',NULL,'Configure Widget','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:43:\"CRM_Contribute_Form_ContributionPage_Widget\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,460,1,0,NULL,'a:0:{}'),(303,1,'civicrm/admin/contribute/premium',NULL,'Premiums','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:44:\"CRM_Contribute_Form_ContributionPage_Premium\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,470,1,0,NULL,'a:0:{}'),(304,1,'civicrm/admin/contribute/addProductToPage',NULL,'Add Products to This Page','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:47:\"CRM_Contribute_Form_ContributionPage_AddProduct\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,480,1,0,NULL,'a:0:{}'),(305,1,'civicrm/admin/contribute/add','action=add','New Contribution Page','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:42:\"CRM_Contribute_Controller_ContributionPage\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(306,1,'civicrm/admin/contribute/managePremiums',NULL,'Manage Premiums','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:34:\"CRM_Contribute_Page_ManagePremiums\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,365,1,0,NULL,'a:2:{s:4:\"desc\";s:175:\"CiviContribute allows you to configure any number of Premiums which can be offered to contributors as incentives / thank-you gifts. Define the premiums you want to offer here.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(307,1,'civicrm/admin/financial/financialType',NULL,'Financial Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Financial_Page_FinancialType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,580,1,0,NULL,'a:2:{s:4:\"desc\";s:64:\"Formerly civicrm_contribution_type merged into this table in 4.1\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(308,1,'civicrm/payment','action=add','New Payment','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:37:\"CRM_Contribute_Form_AdditionalPayment\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(309,1,'civicrm/admin/financial/financialAccount',NULL,'Financial Accounts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Financial_Page_FinancialAccount\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,370,1,0,NULL,'a:2:{s:4:\"desc\";s:128:\"Financial types are used to categorize contributions for reporting and accounting purposes. These are also referred to as Funds.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(310,1,'civicrm/admin/options/payment_instrument',NULL,'Payment Methods','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,380,1,0,NULL,'a:2:{s:4:\"desc\";s:224:\"You may choose to record the payment instrument used for each contribution. Common payment methods are installed by default (e.g. Check, Cash, Credit Card...). If your site requires additional payment methods, add them here.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(311,1,'civicrm/admin/options/accept_creditcard',NULL,'Accepted Credit Cards','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,395,1,0,NULL,'a:2:{s:4:\"desc\";s:94:\"Credit card options that will be offered to contributors using your Online Contribution pages.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(312,1,'civicrm/admin/options/soft_credit_type',NULL,'Soft Credit Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:86:\"Soft Credit Types that will be offered to contributors during soft credit contribution\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(313,1,'civicrm/contact/view/contribution',NULL,'Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:23:\"CRM_Contribute_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(314,1,'civicrm/contact/view/contributionrecur',NULL,'Recurring Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:37:\"CRM_Contribute_Page_ContributionRecur\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(315,1,'civicrm/contact/view/contribution/additionalinfo',NULL,'Additional Info','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:34:\"CRM_Contribute_Form_AdditionalInfo\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}i:2;a:2:{s:5:\"title\";s:13:\"Contributions\";s:3:\"url\";s:42:\"/civicrm/contact/view/contribution?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(316,1,'civicrm/contribute/search',NULL,'Find Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contribute_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,510,1,1,NULL,'a:0:{}'),(317,1,'civicrm/contribute/searchBatch',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:37:\"CRM_Contribute_Controller_SearchBatch\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,588,1,1,NULL,'a:0:{}'),(318,1,'civicrm/contribute/import',NULL,'Import Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:21:\"access CiviContribute\";i:1;s:18:\"edit contributions\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contribute_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,520,1,1,NULL,'a:0:{}'),(319,1,'civicrm/contribute/manage',NULL,'Manage Contribution Pages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:18:\"administer CiviCRM\";i:1;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:36:\"CRM_Contribute_Page_ContributionPage\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,530,1,1,NULL,'a:0:{}'),(320,1,'civicrm/contribute/additionalinfo',NULL,'AdditionalInfo Form','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:34:\"CRM_Contribute_Form_AdditionalInfo\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,0,1,0,NULL,'a:0:{}'),(321,1,'civicrm/ajax/permlocation',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','a:2:{i:0;s:27:\"CRM_Core_Page_AJAX_Location\";i:1;s:23:\"getPermissionedLocation\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(322,1,'civicrm/contribute/unsubscribe',NULL,'Cancel Subscription','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Form_CancelSubscription\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(323,1,'civicrm/contribute/onbehalf',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:43:\"CRM_Contribute_Form_Contribution_OnBehalfOf\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(324,1,'civicrm/contribute/updatebilling',NULL,'Update Billing Details','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:33:\"CRM_Contribute_Form_UpdateBilling\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(325,1,'civicrm/contribute/updaterecur',NULL,'Update Subscription','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Form_UpdateSubscription\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(326,1,'civicrm/contribute/subscriptionstatus',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:25:\"make online contributions\";}i:1;s:3:\"and\";}','s:38:\"CRM_Contribute_Page_SubscriptionStatus\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(327,1,'civicrm/admin/financial/financialType/accounts',NULL,'Financial Type Accounts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:39:\"CRM_Financial_Page_FinancialTypeAccount\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:15:\"Financial Types\";s:3:\"url\";s:46:\"/civicrm/admin/financial/financialType?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,581,1,0,NULL,'a:0:{}'),(328,1,'civicrm/financial/batch',NULL,'Accounting Batch','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"create manual batch\";}i:1;s:3:\"and\";}','s:33:\"CRM_Financial_Page_FinancialBatch\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,585,1,0,NULL,'a:0:{}'),(329,1,'civicrm/financial/financialbatches',NULL,'Accounting Batches','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Financial_Page_Batch\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,586,1,0,NULL,'a:0:{}'),(330,1,'civicrm/batchtransaction',NULL,'Accounting Batch','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:35:\"CRM_Financial_Page_BatchTransaction\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,600,1,0,NULL,'a:0:{}'),(331,1,'civicrm/financial/batch/export',NULL,'Accounting Batch Export','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"create manual batch\";}i:1;s:3:\"and\";}','s:25:\"CRM_Financial_Form_Export\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:16:\"Accounting Batch\";s:3:\"url\";s:32:\"/civicrm/financial/batch?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,610,1,0,NULL,'a:0:{}'),(332,1,'civicrm/payment/view','action=view','View Payment','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:31:\"CRM_Contribute_Page_PaymentInfo\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:11:\"New Payment\";s:3:\"url\";s:39:\"/civicrm/payment?reset=1&amp;action=add\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(333,1,'civicrm/admin/setting/preferences/contribute',NULL,'CiviContribute Component Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:21:\"access CiviContribute\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:37:\"CRM_Admin_Form_Preferences_Contribute\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:42:\"Configure global CiviContribute behaviors.\";s:10:\"adminGroup\";s:14:\"CiviContribute\";}'),(334,1,'civicrm/contribute/invoice',NULL,'PDF Invoice','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:20:\"checkDownloadInvoice\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','a:2:{i:0;s:32:\"CRM_Contribute_Form_Task_Invoice\";i:1;s:11:\"getPrintPDF\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,620,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(335,1,'civicrm/contribute/invoice/email',NULL,'Email Invoice','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:20:\"checkDownloadInvoice\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:32:\"CRM_Contribute_Form_Task_Invoice\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}i:2;a:2:{s:5:\"title\";s:11:\"PDF Invoice\";s:3:\"url\";s:35:\"/civicrm/contribute/invoice?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,630,1,1,NULL,'a:1:{s:9:\"component\";s:14:\"CiviContribute\";}'),(336,1,'civicrm/ajax/softcontributionlist',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:24:\"CRM_Contribute_Page_AJAX\";i:1;s:23:\"getSoftContributionRows\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(337,1,'civicrm/contribute/contributionrecur-payments',NULL,'Recurring Contribution\'s Payments','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:45:\"CRM_Contribute_Page_ContributionRecurPayments\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:24:\"CiviContribute Dashboard\";s:3:\"url\";s:27:\"/civicrm/contribute?reset=1\";}}',NULL,NULL,2,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(338,1,'civicrm/membership/recurring-contributions',NULL,'Membership Recurring Contributions','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"access CiviContribute\";}i:1;s:3:\"and\";}','s:38:\"CRM_Member_Page_RecurringContributions\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(339,1,'civicrm/member',NULL,'CiviMember Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','s:25:\"CRM_Member_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,3,NULL,NULL,NULL,0,700,1,1,NULL,'a:1:{s:9:\"component\";s:10:\"CiviMember\";}'),(340,1,'civicrm/member/add','action=add','New Membership','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','s:19:\"CRM_Member_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviMember Dashboard\";s:3:\"url\";s:23:\"/civicrm/member?reset=1\";}}',NULL,NULL,3,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:10:\"CiviMember\";}'),(341,1,'civicrm/admin/member/membershipType',NULL,'Membership Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Member_Page_MembershipType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,370,1,0,NULL,'a:2:{s:4:\"desc\";s:174:\"Define the types of memberships you want to offer. For each type, you can specify a \'name\' (Gold Member, Honor Society Member...), a description, duration, and a minimum fee.\";s:10:\"adminGroup\";s:10:\"CiviMember\";}'),(342,1,'civicrm/admin/member/membershipStatus',NULL,'Membership Status Rules','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:32:\"CRM_Member_Page_MembershipStatus\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,380,1,0,NULL,'a:2:{s:4:\"desc\";s:187:\"Status \'rules\' define the current status for a membership based on that membership\'s start and end dates. You can adjust the default status options and rules as needed to meet your needs.\";s:10:\"adminGroup\";s:10:\"CiviMember\";}'),(343,1,'civicrm/contact/view/membership','force=1,cid=%%cid%%','Memberships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:19:\"CRM_Member_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,2,1,0,NULL,'a:0:{}'),(344,1,'civicrm/membership/view',NULL,'Memberships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','s:30:\"CRM_Member_Form_MembershipView\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,390,1,0,NULL,'a:0:{}'),(345,1,'civicrm/member/search',NULL,'Find Memberships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','s:28:\"CRM_Member_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviMember Dashboard\";s:3:\"url\";s:23:\"/civicrm/member?reset=1\";}}',NULL,NULL,3,NULL,NULL,NULL,0,710,1,1,NULL,'a:0:{}'),(346,1,'civicrm/member/import',NULL,'Import Memberships','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:17:\"access CiviMember\";i:1;s:16:\"edit memberships\";}i:1;s:3:\"and\";}','s:28:\"CRM_Member_Import_Controller\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviMember Dashboard\";s:3:\"url\";s:23:\"/civicrm/member?reset=1\";}}',NULL,NULL,3,NULL,NULL,NULL,0,720,1,1,NULL,'a:0:{}'),(347,1,'civicrm/ajax/memType',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:17:\"access CiviMember\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Member_Page_AJAX\";i:1;s:21:\"getMemberTypeDefaults\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(348,1,'civicrm/admin/member/membershipType/add',NULL,'Membership Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:17:\"access CiviMember\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:30:\"CRM_Member_Form_MembershipType\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:16:\"Membership Types\";s:3:\"url\";s:44:\"/civicrm/admin/member/membershipType?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:0:{}'),(349,1,'civicrm/mailing',NULL,'CiviMail','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";i:2;s:8:\"send SMS\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,600,1,1,NULL,'a:1:{s:9:\"component\";s:8:\"CiviMail\";}'),(350,1,'civicrm/admin/mail',NULL,'Mailer Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Mail\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:2:{s:4:\"desc\";s:61:\"Configure spool period, throttling and other mailer settings.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(351,1,'civicrm/admin/component',NULL,'Headers, Footers, and Automated Messages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:26:\"CRM_Mailing_Page_Component\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,410,1,0,NULL,'a:2:{s:4:\"desc\";s:143:\"Configure the header and footer used for mailings. Customize the content of automated Subscribe, Unsubscribe, Resubscribe and Opt-out messages.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(352,1,'civicrm/admin/options/from_email_address/civimail',NULL,'From Email Addresses','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:4:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}i:3;a:2:{s:5:\"title\";s:20:\"From Email Addresses\";s:3:\"url\";s:49:\"/civicrm/admin/options/from_email_address?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,415,1,0,NULL,'a:2:{s:4:\"desc\";s:74:\"List of Email Addresses which can be used when sending emails to contacts.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(353,1,'civicrm/admin/mailSettings',NULL,'Mail Accounts','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Page_MailSettings\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,420,1,0,NULL,'a:2:{s:4:\"desc\";s:32:\"Configure email account setting.\";s:10:\"adminGroup\";s:8:\"CiviMail\";}'),(354,1,'civicrm/mailing/send',NULL,'New Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";i:2;s:17:\"schedule mailings\";}i:1;s:2:\"or\";}','s:27:\"CRM_Mailing_Controller_Send\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,610,1,1,NULL,'a:0:{}'),(355,1,'civicrm/mailing/browse/scheduled','scheduled=true','Find Mailings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:5:{i:0;s:15:\"access CiviMail\";i:1;s:16:\"approve mailings\";i:2;s:15:\"create mailings\";i:3;s:17:\"schedule mailings\";i:4;s:8:\"send SMS\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,620,1,1,NULL,'a:0:{}'),(356,1,'civicrm/mailing/browse/unscheduled','scheduled=false','Find Mailings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";i:2;s:17:\"schedule mailings\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,620,1,1,NULL,'a:0:{}'),(357,1,'civicrm/mailing/browse/archived',NULL,'Find Mailings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,625,1,1,NULL,'a:0:{}'),(358,1,'civicrm/mailing/component',NULL,'Headers, Footers, and Automated Messages','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Mailing_Page_Component\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,630,1,1,NULL,'a:0:{}'),(359,1,'civicrm/mailing/unsubscribe',NULL,'Unsubscribe','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:28:\"CRM_Mailing_Form_Unsubscribe\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,640,1,0,NULL,'a:0:{}'),(360,1,'civicrm/mailing/resubscribe',NULL,'Resubscribe','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:28:\"CRM_Mailing_Page_Resubscribe\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,645,1,0,NULL,'a:0:{}'),(361,1,'civicrm/mailing/optout',NULL,'Opt-out','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:23:\"CRM_Mailing_Form_Optout\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,650,1,0,NULL,'a:0:{}'),(362,1,'civicrm/mailing/confirm',NULL,'Confirm','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:24:\"CRM_Mailing_Page_Confirm\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,660,1,0,NULL,'a:0:{}'),(363,1,'civicrm/mailing/subscribe',NULL,'Subscribe','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:26:\"CRM_Mailing_Form_Subscribe\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,660,1,0,NULL,'a:0:{}'),(364,1,'civicrm/mailing/preview',NULL,'Preview Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:4:{i:0;s:15:\"access CiviMail\";i:1;s:16:\"approve mailings\";i:2;s:15:\"create mailings\";i:3;s:17:\"schedule mailings\";}i:1;s:2:\"or\";}','s:24:\"CRM_Mailing_Page_Preview\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,670,1,0,NULL,'a:0:{}'),(365,1,'civicrm/mailing/report','mid=%%mid%%','Mailing Report','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"access CiviMail\";i:1;s:15:\"create mailings\";}i:1;s:2:\"or\";}','s:23:\"CRM_Mailing_Page_Report\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,680,1,0,NULL,'a:0:{}'),(366,1,'civicrm/mailing/forward',NULL,'Forward Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:43:\"access CiviMail subscribe/unsubscribe pages\";}i:1;s:3:\"and\";}','s:31:\"CRM_Mailing_Form_ForwardMailing\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,685,1,0,NULL,'a:0:{}'),(367,1,'civicrm/mailing/queue',NULL,'Sending Mail','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:23:\"CRM_Mailing_Page_Browse\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,690,1,0,NULL,'a:0:{}'),(368,1,'civicrm/mailing/report/event',NULL,'Mailing Event','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:15:\"access CiviMail\";}i:1;s:3:\"and\";}','s:22:\"CRM_Mailing_Page_Event\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}i:2;a:2:{s:5:\"title\";s:14:\"Mailing Report\";s:3:\"url\";s:47:\"/civicrm/mailing/report?reset=1&amp;mid=%%mid%%\";}}',NULL,NULL,4,NULL,NULL,NULL,0,695,1,0,NULL,'a:0:{}'),(369,1,'civicrm/ajax/template',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Mailing_Page_AJAX\";i:1;s:8:\"template\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(370,1,'civicrm/mailing/view',NULL,'View Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:28:\"view public CiviMail content\";i:1;s:15:\"access CiviMail\";i:2;s:16:\"approve mailings\";}i:1;s:2:\"or\";}','s:21:\"CRM_Mailing_Page_View\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,800,1,0,NULL,'a:0:{}'),(371,1,'civicrm/mailing/approve',NULL,'Approve Mailing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:15:\"access CiviMail\";i:1;s:16:\"approve mailings\";}i:1;s:2:\"or\";}','s:24:\"CRM_Mailing_Form_Approve\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,NULL,NULL,0,850,1,0,NULL,'a:0:{}'),(372,1,'civicrm/contact/view/mailing',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:20:\"CRM_Mailing_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(373,1,'civicrm/ajax/contactmailing',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:21:\"CRM_Mailing_Page_AJAX\";i:1;s:18:\"getContactMailings\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(374,1,'civicrm/mailing/url',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','s:20:\"CRM_Mailing_Page_Url\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(375,1,'civicrm/mailing/open',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"*always allow*\";}i:1;s:3:\"and\";}','s:21:\"CRM_Mailing_Page_Open\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:8:\"CiviMail\";s:3:\"url\";s:24:\"/civicrm/mailing?reset=1\";}}',NULL,NULL,4,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(376,1,'civicrm/grant',NULL,'CiviGrant Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:24:\"CRM_Grant_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,5,NULL,NULL,NULL,0,1000,1,1,NULL,'a:1:{s:9:\"component\";s:9:\"CiviGrant\";}'),(377,1,'civicrm/grant/info',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:24:\"CRM_Grant_Page_DashBoard\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviGrant Dashboard\";s:3:\"url\";s:22:\"/civicrm/grant?reset=1\";}}',NULL,NULL,5,NULL,NULL,NULL,0,0,1,0,NULL,'a:0:{}'),(378,1,'civicrm/grant/search',NULL,'Find Grants','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:27:\"CRM_Grant_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviGrant Dashboard\";s:3:\"url\";s:22:\"/civicrm/grant?reset=1\";}}',NULL,NULL,5,NULL,NULL,NULL,0,1010,1,1,NULL,'a:0:{}'),(379,1,'civicrm/grant/add','action=add','New Grant','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:18:\"CRM_Grant_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviGrant Dashboard\";s:3:\"url\";s:22:\"/civicrm/grant?reset=1\";}}',NULL,NULL,5,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:9:\"CiviGrant\";}'),(380,1,'civicrm/contact/view/grant',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:16:\"access CiviGrant\";}i:1;s:3:\"and\";}','s:18:\"CRM_Grant_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(381,1,'civicrm/pledge',NULL,'CiviPledge Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:25:\"CRM_Pledge_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,6,NULL,NULL,NULL,0,550,1,1,NULL,'a:1:{s:9:\"component\";s:10:\"CiviPledge\";}'),(382,1,'civicrm/pledge/search',NULL,'Find Pledges','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:28:\"CRM_Pledge_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviPledge Dashboard\";s:3:\"url\";s:23:\"/civicrm/pledge?reset=1\";}}',NULL,NULL,6,NULL,NULL,NULL,0,560,1,1,NULL,'a:0:{}'),(383,1,'civicrm/contact/view/pledge','force=1,cid=%%cid%%','Pledges','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:19:\"CRM_Pledge_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,570,1,0,NULL,'a:0:{}'),(384,1,'civicrm/pledge/add','action=add','New Pledge','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:19:\"CRM_Pledge_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviPledge Dashboard\";s:3:\"url\";s:23:\"/civicrm/pledge?reset=1\";}}',NULL,NULL,6,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:10:\"CiviPledge\";}'),(385,1,'civicrm/pledge/payment',NULL,'Pledge Payments','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviPledge\";}i:1;s:3:\"and\";}','s:23:\"CRM_Pledge_Page_Payment\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:20:\"CiviPledge Dashboard\";s:3:\"url\";s:23:\"/civicrm/pledge?reset=1\";}}',NULL,NULL,6,NULL,NULL,NULL,0,580,1,0,NULL,'a:0:{}'),(386,1,'civicrm/ajax/pledgeAmount',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:17:\"access CiviPledge\";i:1;s:18:\"administer CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:20:\"CRM_Pledge_Page_AJAX\";i:1;s:17:\"getPledgeDefaults\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(387,1,'civicrm/case',NULL,'CiviCase Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:23:\"CRM_Case_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,900,1,1,NULL,'a:1:{s:9:\"component\";s:8:\"CiviCase\";}'),(388,1,'civicrm/case/add',NULL,'Open Case','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:18:\"CRM_Case_Form_Case\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,1,NULL,'a:1:{s:9:\"component\";s:8:\"CiviCase\";}'),(389,1,'civicrm/case/search',NULL,'Find Cases','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Case_Controller_Search\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,910,1,1,NULL,'a:0:{}'),(390,1,'civicrm/case/activity',NULL,'Case Activity','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Case_Form_Activity\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(391,1,'civicrm/case/report',NULL,'Case Activity Audit','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:31:\"access all cases and activities\";}i:1;s:3:\"and\";}','s:20:\"CRM_Case_Form_Report\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(392,1,'civicrm/case/cd/edit',NULL,'Case Custom Set','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:24:\"CRM_Case_Form_CustomData\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(393,1,'civicrm/contact/view/case',NULL,'Case','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:17:\"CRM_Case_Page_Tab\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(394,1,'civicrm/case/activity/view',NULL,'Activity View','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Case_Form_ActivityView\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Case Activity\";s:3:\"url\";s:30:\"/civicrm/case/activity?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(395,1,'civicrm/contact/view/case/editClient',NULL,'Assign to Another Client','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:14:\"access CiviCRM\";i:1;s:15:\"edit my contact\";i:2;s:15:\"view my contact\";}i:1;s:2:\"or\";}','s:24:\"CRM_Case_Form_EditClient\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:15:\"Contact Summary\";s:3:\"url\";s:45:\"/civicrm/contact/view?reset=1&amp;cid=%%cid%%\";}i:2;a:2:{s:5:\"title\";s:4:\"Case\";s:3:\"url\";s:34:\"/civicrm/contact/view/case?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(396,1,'civicrm/case/addToCase',NULL,'File on Case','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Case_Form_ActivityToCase\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(397,1,'civicrm/case/details',NULL,'Case Details','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:25:\"CRM_Case_Page_CaseDetails\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(398,1,'civicrm/admin/setting/case',NULL,'CiviCase Settings','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:27:\"CRM_Admin_Form_Setting_Case\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,380,1,0,NULL,'a:1:{s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(399,1,'civicrm/admin/options/case_type',NULL,'Case Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"administer CiviCase\";}i:1;s:3:\"and\";}','s:22:\"CRM_Core_Page_Redirect\";','s:24:\"url=civicrm/a/#/caseType\";','a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,390,1,0,NULL,'a:2:{s:4:\"desc\";s:137:\"List of types which can be assigned to Cases. (Enable the Cases tab from System Settings - Enable Components if you want to track cases.)\";s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(400,1,'civicrm/admin/options/redaction_rule',NULL,'Redaction Rules','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"administer CiviCase\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:2:{s:4:\"desc\";s:223:\"List of rules which can be applied to user input strings so that the redacted output can be recognized as repeated instances of the same string or can be identified as a \"semantic type of the data element\" within case data.\";s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(401,1,'civicrm/admin/options/case_status',NULL,'Case Statuses','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"administer CiviCase\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:2:{s:4:\"desc\";s:48:\"List of statuses that can be assigned to a case.\";s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(402,1,'civicrm/admin/options/encounter_medium',NULL,'Encounter Mediums','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:19:\"administer CiviCase\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,400,1,0,NULL,'a:2:{s:4:\"desc\";s:26:\"List of encounter mediums.\";s:10:\"adminGroup\";s:8:\"CiviCase\";}'),(403,1,'civicrm/case/report/print',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:31:\"access all cases and activities\";}i:1;s:3:\"and\";}','a:2:{i:0;s:28:\"CRM_Case_XMLProcessor_Report\";i:1;s:15:\"printCaseReport\";}',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}i:2;a:2:{s:5:\"title\";s:19:\"Case Activity Audit\";s:3:\"url\";s:28:\"/civicrm/case/report?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(404,1,'civicrm/case/ajax/addclient',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:9:\"addClient\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(405,1,'civicrm/case/ajax/processtags',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:15:\"processCaseTags\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,3,NULL,'a:0:{}'),(406,1,'civicrm/case/ajax/details',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:11:\"CaseDetails\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"CiviCase Dashboard\";s:3:\"url\";s:21:\"/civicrm/case?reset=1\";}}',NULL,NULL,7,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(407,1,'civicrm/ajax/delcaserole',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:15:\"deleteCaseRoles\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(408,1,'civicrm/ajax/get-cases',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:18:\"CRM_Case_Page_AJAX\";i:1;s:8:\"getCases\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(409,1,'civicrm/report',NULL,'CiviReport','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:22:\"CRM_Report_Page_Report\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1200,1,1,NULL,'a:1:{s:9:\"component\";s:10:\"CiviReport\";}'),(410,1,'civicrm/report/list',NULL,'CiviCRM Reports','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:28:\"CRM_Report_Page_InstanceList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:10:\"CiviReport\";s:3:\"url\";s:23:\"/civicrm/report?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(411,1,'civicrm/report/template/list',NULL,'Create New Report from Template','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer Reports\";}i:1;s:3:\"and\";}','s:28:\"CRM_Report_Page_TemplateList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:10:\"CiviReport\";s:3:\"url\";s:23:\"/civicrm/report?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1220,1,1,NULL,'a:0:{}'),(412,1,'civicrm/report/options/report_template',NULL,'Manage Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer Reports\";}i:1;s:3:\"and\";}','s:23:\"CRM_Report_Page_Options\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:10:\"CiviReport\";s:3:\"url\";s:23:\"/civicrm/report?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1241,1,1,NULL,'a:0:{}'),(413,1,'civicrm/admin/report/register',NULL,'Register Report','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:18:\"administer Reports\";}i:1;s:3:\"and\";}','s:24:\"CRM_Report_Form_Register\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:1:{s:4:\"desc\";s:30:\"Register the Report templates.\";}'),(414,1,'civicrm/report/instance',NULL,'Report','s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:24:\"CRM_Report_Page_Instance\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:10:\"CiviReport\";s:3:\"url\";s:23:\"/civicrm/report?reset=1\";}}',NULL,NULL,8,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(415,1,'civicrm/admin/report/template/list',NULL,'Create New Report from Template','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:28:\"CRM_Report_Page_TemplateList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:49:\"Component wise listing of all available templates\";s:10:\"adminGroup\";s:10:\"CiviReport\";}'),(416,1,'civicrm/admin/report/options/report_template',NULL,'Manage Templates','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:17:\"access CiviReport\";}i:1;s:3:\"and\";}','s:23:\"CRM_Report_Page_Options\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:45:\"Browse, Edit and Delete the Report templates.\";s:10:\"adminGroup\";s:10:\"CiviReport\";}'),(417,1,'civicrm/admin/report/list',NULL,'Reports Listing','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:28:\"CRM_Report_Page_InstanceList\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:4:\"desc\";s:60:\"Browse existing report, change report criteria and settings.\";s:10:\"adminGroup\";s:10:\"CiviReport\";}'),(418,1,'civicrm/campaign',NULL,'Campaign Dashboard','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:27:\"CRM_Campaign_Page_DashBoard\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(419,1,'civicrm/campaign/add',NULL,'New Campaign','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:26:\"CRM_Campaign_Form_Campaign\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Campaign Dashboard\";s:3:\"url\";s:25:\"/civicrm/campaign?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(420,1,'civicrm/survey/add',NULL,'New Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:29:\"CRM_Campaign_Form_Survey_Main\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(421,1,'civicrm/campaign/vote',NULL,'Conduct Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:4:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";i:2;s:25:\"reserve campaign contacts\";i:3;s:27:\"interview campaign contacts\";}i:1;s:2:\"or\";}','s:22:\"CRM_Campaign_Page_Vote\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Campaign Dashboard\";s:3:\"url\";s:25:\"/civicrm/campaign?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(422,1,'civicrm/admin/campaign/surveyType',NULL,'Survey Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:23:\"administer CiviCampaign\";}i:1;s:3:\"and\";}','s:28:\"CRM_Campaign_Page_SurveyType\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,0,NULL,'a:2:{s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(423,1,'civicrm/admin/options/campaign_type',NULL,'Campaign Types','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,2,1,0,NULL,'a:3:{s:4:\"desc\";s:47:\"categorize your campaigns using campaign types.\";s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(424,1,'civicrm/admin/options/campaign_status',NULL,'Campaign Status','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,3,1,0,NULL,'a:3:{s:4:\"desc\";s:34:\"Define statuses for campaign here.\";s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(425,1,'civicrm/admin/options/engagement_index',NULL,'Engagement Index','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:25:\"administer CiviCRM system\";i:1;s:23:\"administer CiviCRM data\";i:2;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:22:\"CRM_Admin_Page_Options\";',NULL,'a:3:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Administer CiviCRM\";s:3:\"url\";s:22:\"/civicrm/admin?reset=1\";}i:2;a:2:{s:5:\"title\";s:13:\"Option Groups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,1,4,1,0,NULL,'a:3:{s:4:\"desc\";s:18:\"Engagement levels.\";s:10:\"adminGroup\";s:12:\"CiviCampaign\";s:9:\"component\";s:12:\"CiviCampaign\";}'),(426,1,'civicrm/survey/search','op=interview','Record Respondents Interview','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";i:2;s:27:\"interview campaign contacts\";}i:1;s:2:\"or\";}','s:30:\"CRM_Campaign_Controller_Search\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(427,1,'civicrm/campaign/gotv',NULL,'GOTV (Track Voters)','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:4:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";i:2;s:25:\"release campaign contacts\";i:3;s:22:\"gotv campaign contacts\";}i:1;s:2:\"or\";}','s:22:\"CRM_Campaign_Form_Gotv\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Campaign Dashboard\";s:3:\"url\";s:25:\"/civicrm/campaign?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:1:{s:9:\"component\";s:12:\"CiviCampaign\";}'),(428,1,'civicrm/petition/add',NULL,'New Petition','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:26:\"CRM_Campaign_Form_Petition\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(429,1,'civicrm/petition/sign',NULL,'Sign Petition','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"sign CiviCRM Petition\";}i:1;s:3:\"and\";}','s:36:\"CRM_Campaign_Form_Petition_Signature\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(430,1,'civicrm/petition/browse',NULL,'View Petition Signatures','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','s:26:\"CRM_Campaign_Page_Petition\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(431,1,'civicrm/petition/confirm',NULL,'Email address verified','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"sign CiviCRM Petition\";}i:1;s:3:\"and\";}','s:34:\"CRM_Campaign_Page_Petition_Confirm\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(432,1,'civicrm/petition/thankyou',NULL,'Thank You','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:1:{i:0;s:21:\"sign CiviCRM Petition\";}i:1;s:3:\"and\";}','s:35:\"CRM_Campaign_Page_Petition_ThankYou\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(433,1,'civicrm/campaign/registerInterview',NULL,NULL,'a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:3:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";i:2;s:27:\"interview campaign contacts\";}i:1;s:2:\"or\";}','a:2:{i:0;s:22:\"CRM_Campaign_Page_AJAX\";i:1;s:17:\"registerInterview\";}',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:18:\"Campaign Dashboard\";s:3:\"url\";s:25:\"/civicrm/campaign?reset=1\";}}',NULL,NULL,9,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(434,1,'civicrm/survey/configure/main',NULL,'Configure Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:29:\"CRM_Campaign_Form_Survey_Main\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(435,1,'civicrm/survey/configure/questions',NULL,'Configure Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:34:\"CRM_Campaign_Form_Survey_Questions\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(436,1,'civicrm/survey/configure/results',NULL,'Configure Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:32:\"CRM_Campaign_Form_Survey_Results\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(437,1,'civicrm/survey/delete',NULL,'Delete Survey','a:2:{i:0;s:19:\"CRM_Core_Permission\";i:1;s:9:\"checkMenu\";}','a:2:{i:0;a:2:{i:0;s:23:\"administer CiviCampaign\";i:1;s:15:\"manage campaign\";}i:1;s:2:\"or\";}','s:31:\"CRM_Campaign_Form_Survey_Delete\";',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,NULL,NULL,0,1,1,0,NULL,'a:0:{}'),(438,1,'civicrm/ajax/event/add_participant_to_cart',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:32:\"CRM_Event_Cart_Page_CheckoutAJAX\";i:1;s:23:\"add_participant_to_cart\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(439,1,'civicrm/ajax/event/remove_participant_from_cart',NULL,NULL,'s:1:\"1\";','a:2:{i:0;a:1:{i:0;s:14:\"access CiviCRM\";}i:1;s:3:\"and\";}','a:2:{i:0;s:32:\"CRM_Event_Cart_Page_CheckoutAJAX\";i:1;s:28:\"remove_participant_from_cart\";}',NULL,'a:1:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}}',NULL,NULL,NULL,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(440,1,'civicrm/event/add_to_cart',NULL,'Add Event To Cart','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:29:\"CRM_Event_Cart_Page_AddToCart\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(441,1,'civicrm/event/cart_checkout',NULL,'Cart Checkout','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:34:\"CRM_Event_Cart_Controller_Checkout\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,1,1,1,0,NULL,'a:0:{}'),(442,1,'civicrm/event/remove_from_cart',NULL,'Remove From Cart','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:34:\"CRM_Event_Cart_Page_RemoveFromCart\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(443,1,'civicrm/event/view_cart',NULL,'View Cart','s:1:\"1\";','a:2:{i:0;a:2:{i:0;s:14:\"access CiviCRM\";i:1;s:16:\"access CiviEvent\";}i:1;s:3:\"and\";}','s:28:\"CRM_Event_Cart_Page_ViewCart\";',NULL,'a:2:{i:0;a:2:{s:5:\"title\";s:7:\"CiviCRM\";s:3:\"url\";s:16:\"/civicrm?reset=1\";}i:1;a:2:{s:5:\"title\";s:19:\"CiviEvent Dashboard\";s:3:\"url\";s:22:\"/civicrm/event?reset=1\";}}',NULL,NULL,1,NULL,1,NULL,0,1,1,0,NULL,'a:0:{}'),(444,1,'admin',NULL,NULL,NULL,NULL,NULL,NULL,'a:15:{s:14:\"CiviContribute\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:9:{s:32:\"{weight}.Personal Campaign Pages\";a:6:{s:5:\"title\";s:23:\"Personal Campaign Pages\";s:4:\"desc\";s:49:\"View and manage existing personal campaign pages.\";s:2:\"id\";s:21:\"PersonalCampaignPages\";s:3:\"url\";s:49:\"/civicrm/admin/pcp?context=contribute&amp;reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:34:\"{weight}.Manage Contribution Pages\";a:6:{s:5:\"title\";s:25:\"Manage Contribution Pages\";s:4:\"desc\";s:242:\"CiviContribute allows you to create and maintain any number of Online Contribution Pages. You can create different pages for different programs or campaigns - and customize text, amounts, types of information collected from contributors, etc.\";s:2:\"id\";s:23:\"ManageContributionPages\";s:3:\"url\";s:33:\"/civicrm/admin/contribute?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Manage Premiums\";a:6:{s:5:\"title\";s:15:\"Manage Premiums\";s:4:\"desc\";s:175:\"CiviContribute allows you to configure any number of Premiums which can be offered to contributors as incentives / thank-you gifts. Define the premiums you want to offer here.\";s:2:\"id\";s:14:\"ManagePremiums\";s:3:\"url\";s:48:\"/civicrm/admin/contribute/managePremiums?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Financial Types\";a:6:{s:5:\"title\";s:15:\"Financial Types\";s:4:\"desc\";s:64:\"Formerly civicrm_contribution_type merged into this table in 4.1\";s:2:\"id\";s:14:\"FinancialTypes\";s:3:\"url\";s:46:\"/civicrm/admin/financial/financialType?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Financial Accounts\";a:6:{s:5:\"title\";s:18:\"Financial Accounts\";s:4:\"desc\";s:128:\"Financial types are used to categorize contributions for reporting and accounting purposes. These are also referred to as Funds.\";s:2:\"id\";s:17:\"FinancialAccounts\";s:3:\"url\";s:49:\"/civicrm/admin/financial/financialAccount?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Payment Methods\";a:6:{s:5:\"title\";s:15:\"Payment Methods\";s:4:\"desc\";s:224:\"You may choose to record the payment instrument used for each contribution. Common payment methods are installed by default (e.g. Check, Cash, Credit Card...). If your site requires additional payment methods, add them here.\";s:2:\"id\";s:14:\"PaymentMethods\";s:3:\"url\";s:49:\"/civicrm/admin/options/payment_instrument?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:30:\"{weight}.Accepted Credit Cards\";a:6:{s:5:\"title\";s:21:\"Accepted Credit Cards\";s:4:\"desc\";s:94:\"Credit card options that will be offered to contributors using your Online Contribution pages.\";s:2:\"id\";s:19:\"AcceptedCreditCards\";s:3:\"url\";s:48:\"/civicrm/admin/options/accept_creditcard?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Soft Credit Types\";a:6:{s:5:\"title\";s:17:\"Soft Credit Types\";s:4:\"desc\";s:86:\"Soft Credit Types that will be offered to contributors during soft credit contribution\";s:2:\"id\";s:15:\"SoftCreditTypes\";s:3:\"url\";s:47:\"/civicrm/admin/options/soft_credit_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:42:\"{weight}.CiviContribute Component Settings\";a:6:{s:5:\"title\";s:33:\"CiviContribute Component Settings\";s:4:\"desc\";s:42:\"Configure global CiviContribute behaviors.\";s:2:\"id\";s:31:\"CiviContributeComponentSettings\";s:3:\"url\";s:53:\"/civicrm/admin/setting/preferences/contribute?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:26:\"Customize Data and Screens\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:19:{s:20:\"{weight}.Custom Data\";a:6:{s:5:\"title\";s:11:\"Custom Data\";s:4:\"desc\";s:109:\"Configure custom fields to collect and store custom data which is not included in the standard CiviCRM forms.\";s:2:\"id\";s:10:\"CustomData\";s:3:\"url\";s:35:\"/civicrm/admin/custom/group?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:17:\"{weight}.Profiles\";a:6:{s:5:\"title\";s:8:\"Profiles\";s:4:\"desc\";s:151:\"Profiles allow you to aggregate groups of fields and include them in your site as input forms, contact display pages, and search and listings features.\";s:2:\"id\";s:8:\"Profiles\";s:3:\"url\";s:31:\"/civicrm/admin/uf/group?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:23:\"{weight}.Activity Types\";a:6:{s:5:\"title\";s:14:\"Activity Types\";s:4:\"desc\";s:155:\"CiviCRM has several built-in activity types (meetings, phone calls, emails sent). Track other types of interactions by creating custom activity types here.\";s:2:\"id\";s:13:\"ActivityTypes\";s:3:\"url\";s:44:\"/civicrm/admin/options/activity_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Relationship Types\";a:6:{s:5:\"title\";s:18:\"Relationship Types\";s:4:\"desc\";s:148:\"Contacts can be linked to each other through Relationships (e.g. Spouse, Employer, etc.). Define the types of relationships you want to record here.\";s:2:\"id\";s:17:\"RelationshipTypes\";s:3:\"url\";s:30:\"/civicrm/admin/reltype?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Contact Types\";a:6:{s:5:\"title\";s:13:\"Contact Types\";s:4:\"desc\";N;s:2:\"id\";s:12:\"ContactTypes\";s:3:\"url\";s:38:\"/civicrm/admin/options/subtype?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:23:\"{weight}.Gender Options\";a:6:{s:5:\"title\";s:14:\"Gender Options\";s:4:\"desc\";s:79:\"Options for assigning gender to individual contacts (e.g. Male, Female, Other).\";s:2:\"id\";s:13:\"GenderOptions\";s:3:\"url\";s:37:\"/civicrm/admin/options/gender?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:40:\"{weight}.Individual Prefixes (Ms, Mr...)\";a:6:{s:5:\"title\";s:31:\"Individual Prefixes (Ms, Mr...)\";s:4:\"desc\";s:66:\"Options for individual contact prefixes (e.g. Ms., Mr., Dr. etc.).\";s:2:\"id\";s:27:\"IndividualPrefixes_Ms_Mr...\";s:3:\"url\";s:48:\"/civicrm/admin/options/individual_prefix?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:40:\"{weight}.Individual Suffixes (Jr, Sr...)\";a:6:{s:5:\"title\";s:31:\"Individual Suffixes (Jr, Sr...)\";s:4:\"desc\";s:61:\"Options for individual contact suffixes (e.g. Jr., Sr. etc.).\";s:2:\"id\";s:27:\"IndividualSuffixes_Jr_Sr...\";s:3:\"url\";s:48:\"/civicrm/admin/options/individual_suffix?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:39:\"{weight}.Location Types (Home, Work...)\";a:6:{s:5:\"title\";s:30:\"Location Types (Home, Work...)\";s:4:\"desc\";s:94:\"Options for categorizing contact addresses and phone numbers (e.g. Home, Work, Billing, etc.).\";s:2:\"id\";s:26:\"LocationTypes_Home_Work...\";s:3:\"url\";s:35:\"/civicrm/admin/locationType?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Website Types\";a:6:{s:5:\"title\";s:13:\"Website Types\";s:4:\"desc\";s:48:\"Options for assigning website types to contacts.\";s:2:\"id\";s:12:\"WebsiteTypes\";s:3:\"url\";s:43:\"/civicrm/admin/options/website_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:35:\"{weight}.Instant Messenger Services\";a:6:{s:5:\"title\";s:26:\"Instant Messenger Services\";s:4:\"desc\";s:79:\"List of IM services which can be used when recording screen-names for contacts.\";s:2:\"id\";s:24:\"InstantMessengerServices\";s:3:\"url\";s:56:\"/civicrm/admin/options/instant_messenger_service?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Mobile Phone Providers\";a:6:{s:5:\"title\";s:22:\"Mobile Phone Providers\";s:4:\"desc\";s:90:\"List of mobile phone providers which can be assigned when recording contact phone numbers.\";s:2:\"id\";s:20:\"MobilePhoneProviders\";s:3:\"url\";s:46:\"/civicrm/admin/options/mobile_provider?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:19:\"{weight}.Phone Type\";a:6:{s:5:\"title\";s:10:\"Phone Type\";s:4:\"desc\";s:80:\"Options for assigning phone type to contacts (e.g Phone,\n    Mobile, Fax, Pager)\";s:2:\"id\";s:9:\"PhoneType\";s:3:\"url\";s:41:\"/civicrm/admin/options/phone_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:28:\"{weight}.Display Preferences\";a:6:{s:5:\"title\";s:19:\"Display Preferences\";s:4:\"desc\";N;s:2:\"id\";s:18:\"DisplayPreferences\";s:3:\"url\";s:50:\"/civicrm/admin/setting/preferences/display?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Search Preferences\";a:6:{s:5:\"title\";s:18:\"Search Preferences\";s:4:\"desc\";N;s:2:\"id\";s:17:\"SearchPreferences\";s:3:\"url\";s:37:\"/civicrm/admin/setting/search?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Navigation Menu\";a:6:{s:5:\"title\";s:15:\"Navigation Menu\";s:4:\"desc\";s:79:\"Add or remove menu items, and modify the order of items on the navigation menu.\";s:2:\"id\";s:14:\"NavigationMenu\";s:3:\"url\";s:27:\"/civicrm/admin/menu?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Word Replacements\";a:6:{s:5:\"title\";s:17:\"Word Replacements\";s:4:\"desc\";s:18:\"Word Replacements.\";s:2:\"id\";s:16:\"WordReplacements\";s:3:\"url\";s:47:\"/civicrm/admin/options/wordreplacements?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Manage Custom Searches\";a:6:{s:5:\"title\";s:22:\"Manage Custom Searches\";s:4:\"desc\";s:225:\"Developers and accidental techies with a bit of PHP and SQL knowledge can create new search forms to handle specific search and reporting needs which aren\'t covered by the built-in Advanced Search and Search Builder features.\";s:2:\"id\";s:20:\"ManageCustomSearches\";s:3:\"url\";s:44:\"/civicrm/admin/options/custom_search?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Tags (Categories)\";a:6:{s:5:\"title\";s:17:\"Tags (Categories)\";s:4:\"desc\";s:158:\"Tags are useful for segmenting the contacts in your database into categories (e.g. Staff Member, Donor, Volunteer, etc.). Create and edit available tags here.\";s:2:\"id\";s:15:\"Tags_Categories\";s:3:\"url\";s:20:\"/civicrm/tag?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:14:\"Communications\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:11:{s:46:\"{weight}.Organization Address and Contact Info\";a:6:{s:5:\"title\";s:37:\"Organization Address and Contact Info\";s:4:\"desc\";s:150:\"Configure primary contact name, email, return-path and address information. This information is used by CiviMail to identify the sending organization.\";s:2:\"id\";s:33:\"OrganizationAddressandContactInfo\";s:3:\"url\";s:47:\"/civicrm/admin/domain?action=update&amp;reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:29:\"{weight}.From Email Addresses\";a:6:{s:5:\"title\";s:20:\"From Email Addresses\";s:4:\"desc\";s:74:\"List of Email Addresses which can be used when sending emails to contacts.\";s:2:\"id\";s:18:\"FromEmailAddresses\";s:3:\"url\";s:49:\"/civicrm/admin/options/from_email_address?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Message Templates\";a:6:{s:5:\"title\";s:17:\"Message Templates\";s:4:\"desc\";s:130:\"Message templates allow you to save and re-use messages with layouts which you can use when sending email to one or more contacts.\";s:2:\"id\";s:16:\"MessageTemplates\";s:3:\"url\";s:39:\"/civicrm/admin/messageTemplates?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Schedule Reminders\";a:6:{s:5:\"title\";s:18:\"Schedule Reminders\";s:4:\"desc\";s:19:\"Schedule Reminders.\";s:2:\"id\";s:17:\"ScheduleReminders\";s:3:\"url\";s:40:\"/civicrm/admin/scheduleReminders?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:40:\"{weight}.Preferred Communication Methods\";a:6:{s:5:\"title\";s:31:\"Preferred Communication Methods\";s:4:\"desc\";s:117:\"One or more preferred methods of communication can be assigned to each contact. Customize the available options here.\";s:2:\"id\";s:29:\"PreferredCommunicationMethods\";s:3:\"url\";s:61:\"/civicrm/admin/options/preferred_communication_method?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Label Formats\";a:6:{s:5:\"title\";s:13:\"Label Formats\";s:4:\"desc\";s:67:\"Configure Label Formats that are used when creating mailing labels.\";s:2:\"id\";s:12:\"LabelFormats\";s:3:\"url\";s:35:\"/civicrm/admin/labelFormats?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:33:\"{weight}.Print Page (PDF) Formats\";a:6:{s:5:\"title\";s:24:\"Print Page (PDF) Formats\";s:4:\"desc\";s:95:\"Configure PDF Page Formats that can be assigned to Message Templates when creating PDF letters.\";s:2:\"id\";s:20:\"PrintPage_PDFFormats\";s:3:\"url\";s:33:\"/civicrm/admin/pdfFormats?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:36:\"{weight}.Communication Style Options\";a:6:{s:5:\"title\";s:27:\"Communication Style Options\";s:4:\"desc\";s:42:\"Options for Communication Style selection.\";s:2:\"id\";s:25:\"CommunicationStyleOptions\";s:3:\"url\";s:50:\"/civicrm/admin/options/communication_style?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Email Greeting Formats\";a:6:{s:5:\"title\";s:22:\"Email Greeting Formats\";s:4:\"desc\";s:75:\"Options for assigning email greetings to individual and household contacts.\";s:2:\"id\";s:20:\"EmailGreetingFormats\";s:3:\"url\";s:45:\"/civicrm/admin/options/email_greeting?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:32:\"{weight}.Postal Greeting Formats\";a:6:{s:5:\"title\";s:23:\"Postal Greeting Formats\";s:4:\"desc\";s:76:\"Options for assigning postal greetings to individual and household contacts.\";s:2:\"id\";s:21:\"PostalGreetingFormats\";s:3:\"url\";s:46:\"/civicrm/admin/options/postal_greeting?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Addressee Formats\";a:6:{s:5:\"title\";s:17:\"Addressee Formats\";s:4:\"desc\";s:83:\"Options for assigning addressee to individual, household and organization contacts.\";s:2:\"id\";s:16:\"AddresseeFormats\";s:3:\"url\";s:40:\"/civicrm/admin/options/addressee?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:12:\"Localization\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:4:{s:39:\"{weight}.Languages, Currency, Locations\";a:6:{s:5:\"title\";s:30:\"Languages, Currency, Locations\";s:4:\"desc\";N;s:2:\"id\";s:28:\"Languages_Currency_Locations\";s:3:\"url\";s:43:\"/civicrm/admin/setting/localization?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Address Settings\";a:6:{s:5:\"title\";s:16:\"Address Settings\";s:4:\"desc\";N;s:2:\"id\";s:15:\"AddressSettings\";s:3:\"url\";s:50:\"/civicrm/admin/setting/preferences/address?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:21:\"{weight}.Date Formats\";a:6:{s:5:\"title\";s:12:\"Date Formats\";s:4:\"desc\";N;s:2:\"id\";s:11:\"DateFormats\";s:3:\"url\";s:35:\"/civicrm/admin/setting/date?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:28:\"{weight}.Preferred Languages\";a:6:{s:5:\"title\";s:19:\"Preferred Languages\";s:4:\"desc\";s:30:\"Options for contact languages.\";s:2:\"id\";s:18:\"PreferredLanguages\";s:3:\"url\";s:40:\"/civicrm/admin/options/languages?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:21:\"Users and Permissions\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:2:{s:23:\"{weight}.Access Control\";a:6:{s:5:\"title\";s:14:\"Access Control\";s:4:\"desc\";s:73:\"Grant or deny access to actions (view, edit...), features and components.\";s:2:\"id\";s:13:\"AccessControl\";s:3:\"url\";s:29:\"/civicrm/admin/access?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:38:\"{weight}.Synchronize Users to Contacts\";a:6:{s:5:\"title\";s:29:\"Synchronize Users to Contacts\";s:4:\"desc\";s:71:\"Automatically create a CiviCRM contact record for each CMS user record.\";s:2:\"id\";s:26:\"SynchronizeUserstoContacts\";s:3:\"url\";s:32:\"/civicrm/admin/synchUser?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:15:\"System Settings\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:18:{s:32:\"{weight}.Configuration Checklist\";a:6:{s:5:\"title\";s:23:\"Configuration Checklist\";s:4:\"desc\";s:55:\"List of configuration tasks with links to each setting.\";s:2:\"id\";s:22:\"ConfigurationChecklist\";s:3:\"url\";s:33:\"/civicrm/admin/configtask?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:34:\"{weight}.Enable CiviCRM Components\";a:6:{s:5:\"title\";s:25:\"Enable CiviCRM Components\";s:4:\"desc\";s:269:\"Enable or disable components (e.g. CiviEvent, CiviMember, etc.) for your site based on the features you need. We recommend disabling any components not being used in order to simplify the user interface. You can easily re-enable components at any time from this screen.\";s:2:\"id\";s:23:\"EnableCiviCRMComponents\";s:3:\"url\";s:40:\"/civicrm/admin/setting/component?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Manage Extensions\";a:6:{s:5:\"title\";s:17:\"Manage Extensions\";s:4:\"desc\";s:0:\"\";s:2:\"id\";s:16:\"ManageExtensions\";s:3:\"url\";s:33:\"/civicrm/admin/extensions?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:32:\"{weight}.Outbound Email Settings\";a:6:{s:5:\"title\";s:23:\"Outbound Email Settings\";s:4:\"desc\";N;s:2:\"id\";s:21:\"OutboundEmailSettings\";s:3:\"url\";s:35:\"/civicrm/admin/setting/smtp?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:37:\"{weight}.Settings - Payment Processor\";a:6:{s:5:\"title\";s:28:\"Settings - Payment Processor\";s:4:\"desc\";s:48:\"Payment Processor setup for CiviCRM transactions\";s:2:\"id\";s:25:\"Settings-PaymentProcessor\";s:3:\"url\";s:39:\"/civicrm/admin/paymentProcessor?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:30:\"{weight}.Mapping and Geocoding\";a:6:{s:5:\"title\";s:21:\"Mapping and Geocoding\";s:4:\"desc\";N;s:2:\"id\";s:19:\"MappingandGeocoding\";s:3:\"url\";s:38:\"/civicrm/admin/setting/mapping?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:62:\"{weight}.Misc (Undelete, PDFs, Limits, Logging, Captcha, etc.)\";a:6:{s:5:\"title\";s:53:\"Misc (Undelete, PDFs, Limits, Logging, Captcha, etc.)\";s:4:\"desc\";s:91:\"Enable undelete/move to trash feature, detailed change logging, ReCAPTCHA to protect forms.\";s:2:\"id\";s:46:\"Misc_Undelete_PDFs_Limits_Logging_Captcha_etc.\";s:3:\"url\";s:35:\"/civicrm/admin/setting/misc?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:20:\"{weight}.Directories\";a:6:{s:5:\"title\";s:11:\"Directories\";s:4:\"desc\";N;s:2:\"id\";s:11:\"Directories\";s:3:\"url\";s:35:\"/civicrm/admin/setting/path?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Resource URLs\";a:6:{s:5:\"title\";s:13:\"Resource URLs\";s:4:\"desc\";N;s:2:\"id\";s:12:\"ResourceURLs\";s:3:\"url\";s:34:\"/civicrm/admin/setting/url?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:40:\"{weight}.Cleanup Caches and Update Paths\";a:6:{s:5:\"title\";s:31:\"Cleanup Caches and Update Paths\";s:4:\"desc\";s:157:\"Reset the Base Directory Path and Base URL settings - generally when a CiviCRM site is moved to another location in the file system and/or to another domain.\";s:2:\"id\";s:27:\"CleanupCachesandUpdatePaths\";s:3:\"url\";s:50:\"/civicrm/admin/setting/updateConfigBackend?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:33:\"{weight}.CMS Database Integration\";a:6:{s:5:\"title\";s:24:\"CMS Database Integration\";s:4:\"desc\";N;s:2:\"id\";s:22:\"CMSDatabaseIntegration\";s:3:\"url\";s:33:\"/civicrm/admin/setting/uf?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:36:\"{weight}.Safe File Extension Options\";a:6:{s:5:\"title\";s:27:\"Safe File Extension Options\";s:4:\"desc\";s:44:\"File Extensions that can be considered safe.\";s:2:\"id\";s:24:\"SafeFileExtensionOptions\";s:3:\"url\";s:50:\"/civicrm/admin/options/safe_file_extension?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Option Groups\";a:6:{s:5:\"title\";s:13:\"Option Groups\";s:4:\"desc\";s:35:\"Access all meta-data option groups.\";s:2:\"id\";s:12:\"OptionGroups\";s:3:\"url\";s:30:\"/civicrm/admin/options?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Import/Export Mappings\";a:6:{s:5:\"title\";s:22:\"Import/Export Mappings\";s:4:\"desc\";s:141:\"Import and Export mappings allow you to easily run the same job multiple times. This option allows you to rename or delete existing mappings.\";s:2:\"id\";s:21:\"Import_ExportMappings\";s:3:\"url\";s:30:\"/civicrm/admin/mapping?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:18:\"{weight}.Debugging\";a:6:{s:5:\"title\";s:9:\"Debugging\";s:4:\"desc\";N;s:2:\"id\";s:9:\"Debugging\";s:3:\"url\";s:36:\"/civicrm/admin/setting/debug?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:28:\"{weight}.Multi Site Settings\";a:6:{s:5:\"title\";s:19:\"Multi Site Settings\";s:4:\"desc\";N;s:2:\"id\";s:17:\"MultiSiteSettings\";s:3:\"url\";s:52:\"/civicrm/admin/setting/preferences/multisite?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:23:\"{weight}.Scheduled Jobs\";a:6:{s:5:\"title\";s:14:\"Scheduled Jobs\";s:4:\"desc\";s:35:\"Managing periodially running tasks.\";s:2:\"id\";s:13:\"ScheduledJobs\";s:3:\"url\";s:26:\"/civicrm/admin/job?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Sms Providers\";a:6:{s:5:\"title\";s:13:\"Sms Providers\";s:4:\"desc\";s:27:\"To configure a sms provider\";s:2:\"id\";s:12:\"SmsProviders\";s:3:\"url\";s:35:\"/civicrm/admin/sms/provider?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:12:\"CiviCampaign\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:5:{s:40:\"{weight}.CiviCampaign Component Settings\";a:6:{s:5:\"title\";s:31:\"CiviCampaign Component Settings\";s:4:\"desc\";s:40:\"Configure global CiviCampaign behaviors.\";s:2:\"id\";s:29:\"CiviCampaignComponentSettings\";s:3:\"url\";s:51:\"/civicrm/admin/setting/preferences/campaign?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:21:\"{weight}.Survey Types\";a:6:{s:5:\"title\";s:12:\"Survey Types\";s:4:\"desc\";N;s:2:\"id\";s:11:\"SurveyTypes\";s:3:\"url\";s:42:\"/civicrm/admin/campaign/surveyType?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:23:\"{weight}.Campaign Types\";a:6:{s:5:\"title\";s:14:\"Campaign Types\";s:4:\"desc\";s:47:\"categorize your campaigns using campaign types.\";s:2:\"id\";s:13:\"CampaignTypes\";s:3:\"url\";s:44:\"/civicrm/admin/options/campaign_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Campaign Status\";a:6:{s:5:\"title\";s:15:\"Campaign Status\";s:4:\"desc\";s:34:\"Define statuses for campaign here.\";s:2:\"id\";s:14:\"CampaignStatus\";s:3:\"url\";s:46:\"/civicrm/admin/options/campaign_status?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Engagement Index\";a:6:{s:5:\"title\";s:16:\"Engagement Index\";s:4:\"desc\";s:18:\"Engagement levels.\";s:2:\"id\";s:15:\"EngagementIndex\";s:3:\"url\";s:47:\"/civicrm/admin/options/engagement_index?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:9:\"CiviEvent\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:9:{s:37:\"{weight}.CiviEvent Component Settings\";a:6:{s:5:\"title\";s:28:\"CiviEvent Component Settings\";s:4:\"desc\";s:37:\"Configure global CiviEvent behaviors.\";s:2:\"id\";s:26:\"CiviEventComponentSettings\";s:3:\"url\";s:48:\"/civicrm/admin/setting/preferences/event?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:33:\"{weight}.Event Name Badge Layouts\";a:6:{s:5:\"title\";s:24:\"Event Name Badge Layouts\";s:4:\"desc\";s:107:\"Configure name badge layouts for event participants, including logos and what data to include on the badge.\";s:2:\"id\";s:21:\"EventNameBadgeLayouts\";s:3:\"url\";s:52:\"/civicrm/admin/badgelayout?action=browse&amp;reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Manage Events\";a:6:{s:5:\"title\";s:13:\"Manage Events\";s:4:\"desc\";s:136:\"Create and edit event configuration including times, locations, online registration forms, and fees. Links for iCal and RSS syndication.\";s:2:\"id\";s:12:\"ManageEvents\";s:3:\"url\";s:28:\"/civicrm/admin/event?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Event Templates\";a:6:{s:5:\"title\";s:15:\"Event Templates\";s:4:\"desc\";s:115:\"Administrators can create Event Templates - which are basically master event records pre-filled with default values\";s:2:\"id\";s:14:\"EventTemplates\";s:3:\"url\";s:36:\"/civicrm/admin/eventTemplate?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:20:\"{weight}.Event Types\";a:6:{s:5:\"title\";s:11:\"Event Types\";s:4:\"desc\";s:143:\"Use Event Types to categorize your events. Event feeds can be filtered by Event Type and participant searches can use Event Type as a criteria.\";s:2:\"id\";s:10:\"EventTypes\";s:3:\"url\";s:41:\"/civicrm/admin/options/event_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:27:\"{weight}.Participant Status\";a:6:{s:5:\"title\";s:18:\"Participant Status\";s:4:\"desc\";s:154:\"Define statuses for event participants here (e.g. Registered, Attended, Cancelled...). You can then assign statuses and search for participants by status.\";s:2:\"id\";s:17:\"ParticipantStatus\";s:3:\"url\";s:41:\"/civicrm/admin/participant_status?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Participant Role\";a:6:{s:5:\"title\";s:16:\"Participant Role\";s:4:\"desc\";s:138:\"Define participant roles for events here (e.g. Attendee, Host, Speaker...). You can then assign roles and search for participants by role.\";s:2:\"id\";s:15:\"ParticipantRole\";s:3:\"url\";s:47:\"/civicrm/admin/options/participant_role?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:38:\"{weight}.Participant Listing Templates\";a:6:{s:5:\"title\";s:29:\"Participant Listing Templates\";s:4:\"desc\";s:48:\"Template to control participant listing display.\";s:2:\"id\";s:27:\"ParticipantListingTemplates\";s:3:\"url\";s:50:\"/civicrm/admin/options/participant_listing?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:31:\"{weight}.Conference Slot Labels\";a:6:{s:5:\"title\";s:22:\"Conference Slot Labels\";s:4:\"desc\";s:35:\"Define conference slots and labels.\";s:2:\"id\";s:20:\"ConferenceSlotLabels\";s:3:\"url\";s:46:\"/civicrm/admin/options/conference_slot?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:8:\"CiviMail\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:5:{s:36:\"{weight}.CiviMail Component Settings\";a:6:{s:5:\"title\";s:27:\"CiviMail Component Settings\";s:4:\"desc\";s:36:\"Configure global CiviMail behaviors.\";s:2:\"id\";s:25:\"CiviMailComponentSettings\";s:3:\"url\";s:50:\"/civicrm/admin/setting/preferences/mailing?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Mailer Settings\";a:6:{s:5:\"title\";s:15:\"Mailer Settings\";s:4:\"desc\";s:61:\"Configure spool period, throttling and other mailer settings.\";s:2:\"id\";s:14:\"MailerSettings\";s:3:\"url\";s:27:\"/civicrm/admin/mail?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:49:\"{weight}.Headers, Footers, and Automated Messages\";a:6:{s:5:\"title\";s:40:\"Headers, Footers, and Automated Messages\";s:4:\"desc\";s:143:\"Configure the header and footer used for mailings. Customize the content of automated Subscribe, Unsubscribe, Resubscribe and Opt-out messages.\";s:2:\"id\";s:36:\"Headers_Footers_andAutomatedMessages\";s:3:\"url\";s:32:\"/civicrm/admin/component?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:29:\"{weight}.From Email Addresses\";a:6:{s:5:\"title\";s:20:\"From Email Addresses\";s:4:\"desc\";s:74:\"List of Email Addresses which can be used when sending emails to contacts.\";s:2:\"id\";s:18:\"FromEmailAddresses\";s:3:\"url\";s:58:\"/civicrm/admin/options/from_email_address/civimail?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Mail Accounts\";a:6:{s:5:\"title\";s:13:\"Mail Accounts\";s:4:\"desc\";s:32:\"Configure email account setting.\";s:2:\"id\";s:12:\"MailAccounts\";s:3:\"url\";s:35:\"/civicrm/admin/mailSettings?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:10:\"CiviMember\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:3:{s:38:\"{weight}.CiviMember Component Settings\";a:6:{s:5:\"title\";s:29:\"CiviMember Component Settings\";s:4:\"desc\";s:38:\"Configure global CiviMember behaviors.\";s:2:\"id\";s:27:\"CiviMemberComponentSettings\";s:3:\"url\";s:49:\"/civicrm/admin/setting/preferences/member?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Membership Types\";a:6:{s:5:\"title\";s:16:\"Membership Types\";s:4:\"desc\";s:174:\"Define the types of memberships you want to offer. For each type, you can specify a \'name\' (Gold Member, Honor Society Member...), a description, duration, and a minimum fee.\";s:2:\"id\";s:15:\"MembershipTypes\";s:3:\"url\";s:44:\"/civicrm/admin/member/membershipType?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:32:\"{weight}.Membership Status Rules\";a:6:{s:5:\"title\";s:23:\"Membership Status Rules\";s:4:\"desc\";s:187:\"Status \'rules\' define the current status for a membership based on that membership\'s start and end dates. You can adjust the default status options and rules as needed to meet your needs.\";s:2:\"id\";s:21:\"MembershipStatusRules\";s:3:\"url\";s:46:\"/civicrm/admin/member/membershipStatus?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:6:\"Manage\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:3:{s:27:\"{weight}.Scheduled Jobs Log\";a:6:{s:5:\"title\";s:18:\"Scheduled Jobs Log\";s:4:\"desc\";s:46:\"Browsing the log of periodially running tasks.\";s:2:\"id\";s:16:\"ScheduledJobsLog\";s:3:\"url\";s:29:\"/civicrm/admin/joblog?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:42:\"{weight}.Find and Merge Duplicate Contacts\";a:6:{s:5:\"title\";s:33:\"Find and Merge Duplicate Contacts\";s:4:\"desc\";s:158:\"Manage the rules used to identify potentially duplicate contact records. Scan for duplicates using a selected rule and merge duplicate contact data as needed.\";s:2:\"id\";s:29:\"FindandMergeDuplicateContacts\";s:3:\"url\";s:36:\"/civicrm/contact/deduperules?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Dedupe Exceptions\";a:6:{s:5:\"title\";s:17:\"Dedupe Exceptions\";s:4:\"desc\";N;s:2:\"id\";s:16:\"DedupeExceptions\";s:3:\"url\";s:33:\"/civicrm/dedupe/exception?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:12:\"Option Lists\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:1:{s:20:\"{weight}.Grant Types\";a:6:{s:5:\"title\";s:11:\"Grant Types\";s:4:\"desc\";s:148:\"List of types which can be assigned to Grants. (Enable CiviGrant from Administer > Systme Settings > Enable Components if you want to track grants.)\";s:2:\"id\";s:10:\"GrantTypes\";s:3:\"url\";s:41:\"/civicrm/admin/options/grant_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:9:\"Customize\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:1:{s:19:\"{weight}.Price Sets\";a:6:{s:5:\"title\";s:10:\"Price Sets\";s:4:\"desc\";s:205:\"Price sets allow you to offer multiple options with associated fees (e.g. pre-conference workshops, additional meals, etc.). Configure Price Sets for events which need more than a single set of fee levels.\";s:2:\"id\";s:9:\"PriceSets\";s:3:\"url\";s:28:\"/civicrm/admin/price?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:8:\"CiviCase\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:5:{s:26:\"{weight}.CiviCase Settings\";a:6:{s:5:\"title\";s:17:\"CiviCase Settings\";s:4:\"desc\";N;s:2:\"id\";s:16:\"CiviCaseSettings\";s:3:\"url\";s:35:\"/civicrm/admin/setting/case?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:19:\"{weight}.Case Types\";a:6:{s:5:\"title\";s:10:\"Case Types\";s:4:\"desc\";s:137:\"List of types which can be assigned to Cases. (Enable the Cases tab from System Settings - Enable Components if you want to track cases.)\";s:2:\"id\";s:9:\"CaseTypes\";s:3:\"url\";s:40:\"/civicrm/admin/options/case_type?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Redaction Rules\";a:6:{s:5:\"title\";s:15:\"Redaction Rules\";s:4:\"desc\";s:223:\"List of rules which can be applied to user input strings so that the redacted output can be recognized as repeated instances of the same string or can be identified as a \"semantic type of the data element\" within case data.\";s:2:\"id\";s:14:\"RedactionRules\";s:3:\"url\";s:45:\"/civicrm/admin/options/redaction_rule?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:22:\"{weight}.Case Statuses\";a:6:{s:5:\"title\";s:13:\"Case Statuses\";s:4:\"desc\";s:48:\"List of statuses that can be assigned to a case.\";s:2:\"id\";s:12:\"CaseStatuses\";s:3:\"url\";s:42:\"/civicrm/admin/options/case_status?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:26:\"{weight}.Encounter Mediums\";a:6:{s:5:\"title\";s:17:\"Encounter Mediums\";s:4:\"desc\";s:26:\"List of encounter mediums.\";s:2:\"id\";s:16:\"EncounterMediums\";s:3:\"url\";s:47:\"/civicrm/admin/options/encounter_medium?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}s:10:\"CiviReport\";a:2:{s:12:\"component_id\";N;s:6:\"fields\";a:3:{s:40:\"{weight}.Create New Report from Template\";a:6:{s:5:\"title\";s:31:\"Create New Report from Template\";s:4:\"desc\";s:49:\"Component wise listing of all available templates\";s:2:\"id\";s:27:\"CreateNewReportfromTemplate\";s:3:\"url\";s:43:\"/civicrm/admin/report/template/list?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:25:\"{weight}.Manage Templates\";a:6:{s:5:\"title\";s:16:\"Manage Templates\";s:4:\"desc\";s:45:\"Browse, Edit and Delete the Report templates.\";s:2:\"id\";s:15:\"ManageTemplates\";s:3:\"url\";s:53:\"/civicrm/admin/report/options/report_template?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}s:24:\"{weight}.Reports Listing\";a:6:{s:5:\"title\";s:15:\"Reports Listing\";s:4:\"desc\";s:60:\"Browse existing report, change report criteria and settings.\";s:2:\"id\";s:14:\"ReportsListing\";s:3:\"url\";s:34:\"/civicrm/admin/report/list?reset=1\";s:4:\"icon\";N;s:5:\"extra\";N;}}}}',NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,NULL,'a:0:{}');
 /*!40000 ALTER TABLE `civicrm_menu` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -967,7 +967,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_msg_template` WRITE;
 /*!40000 ALTER TABLE `civicrm_msg_template` DISABLE KEYS */;
-INSERT INTO `civicrm_msg_template` (`id`, `msg_title`, `msg_subject`, `msg_text`, `msg_html`, `is_active`, `workflow_id`, `workflow_name`, `is_default`, `is_reserved`, `is_sms`, `pdf_format_id`) VALUES (1,'Cases - Send Copy of an Activity','{if $idHash}[case #{$idHash}]{/if} {$activitySubject}\n','===========================================================\n{ts}Activity Summary{/ts} - {$activityTypeName}\n===========================================================\n{if $isCaseActivity}\n{ts}Your Case Role(s){/ts} : {$contact.role}\n{if $manageCaseURL}\n{ts}Manage Case{/ts} : {$manageCaseURL}\n{/if}\n{/if}\n\n{if $editActURL}\n{ts}Edit activity{/ts} : {$editActURL}\n{/if}\n{if $viewActURL}\n{ts}View activity{/ts} : {$viewActURL}\n{/if}\n\n{foreach from=$activity.fields item=field}\n{if $field.type eq \'Date\'}\n{$field.label}{if $field.category}({$field.category}){/if} : {$field.value|crmDate:$config->dateformatDatetime}\n{else}\n{$field.label}{if $field.category}({$field.category}){/if} : {$field.value}\n{/if}\n{/foreach}\n\n{foreach from=$activity.customGroups key=customGroupName item=customGroup}\n==========================================================\n{$customGroupName}\n==========================================================\n{foreach from=$customGroup item=field}\n{if $field.type eq \'Date\'}\n{$field.label} : {$field.value|crmDate:$config->dateformatDatetime}\n{else}\n{$field.label} : {$field.value}\n{/if}\n{/foreach}\n\n{/foreach}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Activity Summary{/ts} - {$activityTypeName}\n      </th>\n     </tr>\n     {if $isCaseActivity}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Your Case Role(s){/ts}\n       </td>\n       <td {$valueStyle}>\n        {$contact.role}\n       </td>\n      </tr>\n      {if $manageCaseURL}\n       <tr>\n       <td colspan=\"2\" {$valueStyle}>\n     <a href=\"{$manageCaseURL}\" title=\"{ts}Manage Case{/ts}\">{ts}Manage Case{/ts}</a>\n       </td>\n       </tr>\n      {/if}\n     {/if}\n     {if $editActURL}\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n   <a href=\"{$editActURL}\" title=\"{ts}Edit activity{/ts}\">{ts}Edit activity{/ts}</a>\n       </td>\n     </tr>\n     {/if}\n     {if $viewActURL}\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n   <a href=\"{$viewActURL}\" title=\"{ts}View activity{/ts}\">{ts}View activity{/ts}</a>\n       </td>\n     </tr>\n     {/if}\n     {foreach from=$activity.fields item=field}\n      <tr>\n       <td {$labelStyle}>\n        {$field.label}{if $field.category}({$field.category}){/if}\n       </td>\n       <td {$valueStyle}>\n        {if $field.type eq \'Date\'}\n         {$field.value|crmDate:$config->dateformatDatetime}\n        {else}\n         {$field.value}\n        {/if}\n       </td>\n      </tr>\n     {/foreach}\n\n     {foreach from=$activity.customGroups key=customGroupName item=customGroup}\n      <tr>\n       <th {$headerStyle}>\n        {$customGroupName}\n       </th>\n      </tr>\n      {foreach from=$customGroup item=field}\n       <tr>\n        <td {$labelStyle}>\n         {$field.label}\n        </td>\n        <td {$valueStyle}>\n         {if $field.type eq \'Date\'}\n          {$field.value|crmDate:$config->dateformatDatetime}\n         {else}\n          {$field.value}\n         {/if}\n        </td>\n       </tr>\n      {/foreach}\n     {/foreach}\n    </table>\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,820,'case_activity',1,0,0,NULL),(2,'Cases - Send Copy of an Activity','{if $idHash}[case #{$idHash}]{/if} {$activitySubject}\n','===========================================================\n{ts}Activity Summary{/ts} - {$activityTypeName}\n===========================================================\n{if $isCaseActivity}\n{ts}Your Case Role(s){/ts} : {$contact.role}\n{if $manageCaseURL}\n{ts}Manage Case{/ts} : {$manageCaseURL}\n{/if}\n{/if}\n\n{if $editActURL}\n{ts}Edit activity{/ts} : {$editActURL}\n{/if}\n{if $viewActURL}\n{ts}View activity{/ts} : {$viewActURL}\n{/if}\n\n{foreach from=$activity.fields item=field}\n{if $field.type eq \'Date\'}\n{$field.label}{if $field.category}({$field.category}){/if} : {$field.value|crmDate:$config->dateformatDatetime}\n{else}\n{$field.label}{if $field.category}({$field.category}){/if} : {$field.value}\n{/if}\n{/foreach}\n\n{foreach from=$activity.customGroups key=customGroupName item=customGroup}\n==========================================================\n{$customGroupName}\n==========================================================\n{foreach from=$customGroup item=field}\n{if $field.type eq \'Date\'}\n{$field.label} : {$field.value|crmDate:$config->dateformatDatetime}\n{else}\n{$field.label} : {$field.value}\n{/if}\n{/foreach}\n\n{/foreach}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Activity Summary{/ts} - {$activityTypeName}\n      </th>\n     </tr>\n     {if $isCaseActivity}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Your Case Role(s){/ts}\n       </td>\n       <td {$valueStyle}>\n        {$contact.role}\n       </td>\n      </tr>\n      {if $manageCaseURL}\n       <tr>\n       <td colspan=\"2\" {$valueStyle}>\n     <a href=\"{$manageCaseURL}\" title=\"{ts}Manage Case{/ts}\">{ts}Manage Case{/ts}</a>\n       </td>\n       </tr>\n      {/if}\n     {/if}\n     {if $editActURL}\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n   <a href=\"{$editActURL}\" title=\"{ts}Edit activity{/ts}\">{ts}Edit activity{/ts}</a>\n       </td>\n     </tr>\n     {/if}\n     {if $viewActURL}\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n   <a href=\"{$viewActURL}\" title=\"{ts}View activity{/ts}\">{ts}View activity{/ts}</a>\n       </td>\n     </tr>\n     {/if}\n     {foreach from=$activity.fields item=field}\n      <tr>\n       <td {$labelStyle}>\n        {$field.label}{if $field.category}({$field.category}){/if}\n       </td>\n       <td {$valueStyle}>\n        {if $field.type eq \'Date\'}\n         {$field.value|crmDate:$config->dateformatDatetime}\n        {else}\n         {$field.value}\n        {/if}\n       </td>\n      </tr>\n     {/foreach}\n\n     {foreach from=$activity.customGroups key=customGroupName item=customGroup}\n      <tr>\n       <th {$headerStyle}>\n        {$customGroupName}\n       </th>\n      </tr>\n      {foreach from=$customGroup item=field}\n       <tr>\n        <td {$labelStyle}>\n         {$field.label}\n        </td>\n        <td {$valueStyle}>\n         {if $field.type eq \'Date\'}\n          {$field.value|crmDate:$config->dateformatDatetime}\n         {else}\n          {$field.value}\n         {/if}\n        </td>\n       </tr>\n      {/foreach}\n     {/foreach}\n    </table>\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,820,'case_activity',0,1,0,NULL),(3,'Contributions - Duplicate Organization Alert','{ts}CiviContribute Alert: Possible Duplicate Contact Record{/ts} - {contact.display_name}\n','{ts}A contribution / membership signup was made on behalf of the organization listed below.{/ts}\n{ts}The information provided matched multiple existing database records based on the configured Duplicate Matching Rules for your site.{/ts}\n\n{ts}Organization Name{/ts}: {$onBehalfName}\n{ts}Organization Email{/ts}: {$onBehalfEmail}\n{ts}Organization Contact ID{/ts}: {$onBehalfID}\n\n{ts}If you think this may be a duplicate contact which should be merged with an existing record - Go to \"Contacts >> Find and Merge Duplicate Contacts\". Use the strict rule for Organizations to find the potential duplicates and merge them if appropriate.{/ts}\n\n{if $receiptMessage}\n###########################################################\n{ts}Copy of Contribution Receipt{/ts}\n\n###########################################################\n{$receiptMessage}\n\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <p>{ts}A contribution / membership signup was made on behalf of the organization listed below.{/ts}</p>\n    <p>{ts}The information provided matched multiple existing database records based on the configured Duplicate Matching Rules for your site.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Name{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfName}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Email{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfEmail}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Contact ID{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfID}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <p>{ts}If you think this may be a duplicate contact which should be merged with an existing record - Go to \"Contacts >> Find and Merge Duplicate Contacts\". Use the strict rule for Organizations to find the potential duplicates and merge them if appropriate.{/ts}</p>\n   </td>\n  </tr>\n  {if $receiptMessage}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts}Copy of Contribution Receipt{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {* FIXME: the below is most probably not HTML-ised *}\n        {$receiptMessage}\n       </td>\n      </tr>\n     </table>\n    </td>\n   </tr>\n  {/if}\n </table>\n</center>\n\n</body>\n</html>\n',1,821,'contribution_dupalert',1,0,0,NULL),(4,'Contributions - Duplicate Organization Alert','{ts}CiviContribute Alert: Possible Duplicate Contact Record{/ts} - {contact.display_name}\n','{ts}A contribution / membership signup was made on behalf of the organization listed below.{/ts}\n{ts}The information provided matched multiple existing database records based on the configured Duplicate Matching Rules for your site.{/ts}\n\n{ts}Organization Name{/ts}: {$onBehalfName}\n{ts}Organization Email{/ts}: {$onBehalfEmail}\n{ts}Organization Contact ID{/ts}: {$onBehalfID}\n\n{ts}If you think this may be a duplicate contact which should be merged with an existing record - Go to \"Contacts >> Find and Merge Duplicate Contacts\". Use the strict rule for Organizations to find the potential duplicates and merge them if appropriate.{/ts}\n\n{if $receiptMessage}\n###########################################################\n{ts}Copy of Contribution Receipt{/ts}\n\n###########################################################\n{$receiptMessage}\n\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <p>{ts}A contribution / membership signup was made on behalf of the organization listed below.{/ts}</p>\n    <p>{ts}The information provided matched multiple existing database records based on the configured Duplicate Matching Rules for your site.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Name{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfName}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Email{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfEmail}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Contact ID{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfID}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <p>{ts}If you think this may be a duplicate contact which should be merged with an existing record - Go to \"Contacts >> Find and Merge Duplicate Contacts\". Use the strict rule for Organizations to find the potential duplicates and merge them if appropriate.{/ts}</p>\n   </td>\n  </tr>\n  {if $receiptMessage}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts}Copy of Contribution Receipt{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {* FIXME: the below is most probably not HTML-ised *}\n        {$receiptMessage}\n       </td>\n      </tr>\n     </table>\n    </td>\n   </tr>\n  {/if}\n </table>\n</center>\n\n</body>\n</html>\n',1,821,'contribution_dupalert',0,1,0,NULL),(5,'Contributions - Receipt (off-line)','{ts}Contribution Receipt{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $formValues.receipt_text}\n{$formValues.receipt_text}\n{else}{ts}Below you will find a receipt for this contribution.{/ts}{/if}\n\n===========================================================\n{ts}Contribution Information{/ts}\n\n===========================================================\n{ts}Contributor{/ts}: {contact.display_name}\n{ts}Financial Type{/ts}: {$formValues.contributionType_name}\n{if $lineItem}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $getTaxDetails}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $getTaxDetails} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $getTaxDetails}{$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"} {$line.tax_rate|string_format:\"%.2f\"} %   {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if} {/if}   {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $getTaxDetails && $dataArray}\n{ts}Amount before Tax{/ts} : {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset ||  $priceset == 0 || $value != \'\'}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}% : {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm} : {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n\n{if isset($totalTaxAmount) && $totalTaxAmount !== \'null\'}\n{ts}Total Tax Amount{/ts} : {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{ts}Total Amount{/ts} : {$formValues.total_amount|crmMoney:$currency}\n{if $receive_date}\n{ts}Date Received{/ts}: {$receive_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $receipt_date}\n{ts}Receipt Date{/ts}: {$receipt_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $formValues.paidBy and !$formValues.hidden_CreditCard}\n{ts}Paid By{/ts}: {$formValues.paidBy}\n{if $formValues.check_number}\n{ts}Check Number{/ts}: {$formValues.check_number}\n{/if}\n{/if}\n{if $formValues.trxn_id}\n{ts}Transaction ID{/ts}: {$formValues.trxn_id}\n{/if}\n\n{if $ccContribution}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n===========================================================\n{$customName}\n===========================================================\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $softCreditTypes and $softCredits}\n{foreach from=$softCreditTypes item=softCreditType key=n}\n===========================================================\n{$softCreditType}\n===========================================================\n{foreach from=$softCredits.$n item=value key=label}\n{$label}: {$value}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $formValues.product_name}\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$formValues.product_name}\n{if $formValues.product_option}\n{ts}Option{/ts}: {$formValues.product_option}\n{/if}\n{if $formValues.product_sku}\n{ts}SKU{/ts}: {$formValues.product_sku}\n{/if}\n{if $fulfilled_date}\n{ts}Sent{/ts}: {$fulfilled_date|crmDate}\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $formValues.receipt_text}\n     <p>{$formValues.receipt_text|htmlize}</p>\n    {else}\n     <p>{ts}Below you will find a receipt for this contribution.{/ts}</p>\n    {/if}\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Contribution Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Contributor Name{/ts}\n      </td>\n      <td {$valueStyle}>\n       {contact.display_name}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Financial Type{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$formValues.contributionType_name}\n      </td>\n     </tr>\n\n     {if $lineItem and !$is_quick_config}\n      {foreach from=$lineItem item=value key=priceset}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n          <tr>\n           <th>{ts}Item{/ts}</th>\n           <th>{ts}Qty{/ts}</th>\n           <th>{ts}Each{/ts}</th>\n           {if $getTaxDetails}\n             <th>{ts}Subtotal{/ts}</th>\n             <th>{ts}Tax Rate{/ts}</th>\n             <th>{ts}Tax Amount{/ts}</th>\n           {/if}\n           <th>{ts}Total{/ts}</th>\n          </tr>\n          {foreach from=$value item=line}\n           <tr>\n            <td>\n            {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n            </td>\n            <td>\n             {$line.qty}\n            </td>\n            <td>\n             {$line.unit_price|crmMoney:$currency}\n            </td>\n            {if $getTaxDetails}\n              <td>\n                {$line.unit_price*$line.qty|crmMoney:$currency}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                  {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                  {$line.tax_amount|crmMoney:$currency}\n                </td>\n              {else}\n                <td></td>\n                <td></td>\n              {/if}\n            {/if}\n            <td>\n             {$line.line_total+$line.tax_amount|crmMoney:$currency}\n            </td>\n           </tr>\n          {/foreach}\n         </table>\n        </td>\n       </tr>\n      {/foreach}\n     {/if}\n     {if $getTaxDetails && $dataArray}\n       <tr>\n         <td {$labelStyle}>\n           {ts} Amount before Tax : {/ts}\n         </td>\n         <td {$valueStyle}>\n           {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n         </td>\n       </tr>\n\n      {foreach from=$dataArray item=value key=priceset}\n        <tr>\n        {if $priceset ||  $priceset == 0 || $value != \'\'}\n          <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n          <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {else}\n          <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n          <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {/if}\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if isset($totalTaxAmount) && $totalTaxAmount !== \'null\'}\n      <tr>\n        <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n        </td>\n      </tr>\n     {/if}\n\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$formValues.total_amount|crmMoney:$currency}\n      </td>\n     </tr>\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date Received{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|truncate:10:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n      {if $receipt_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Receipt Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receipt_date|truncate:10:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $formValues.paidBy and !$formValues.hidden_CreditCard}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Paid By{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$formValues.paidBy}\n       </td>\n      </tr>\n      {if $formValues.check_number}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Check Number{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.check_number}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $formValues.trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction ID{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$formValues.trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n     {if $ccContribution}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Billing Name and Address{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$billingName}<br />\n        {$address|nl2br}\n       </td>\n      </tr>\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $softCreditTypes and $softCredits}\n      {foreach from=$softCreditTypes item=softCreditType key=n}\n       <tr>\n        <th {$headerStyle}>\n         {$softCreditType}\n        </th>\n       </tr>\n       {foreach from=$softCredits.$n item=value key=label}\n         <tr>\n          <td {$labelStyle}>\n           {$label}\n          </td>\n          <td {$valueStyle}>\n           {$value}\n          </td>\n         </tr>\n        {/foreach}\n       {/foreach}\n     {/if}\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n     {if $formValues.product_name}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$formValues.product_name}\n       </td>\n      </tr>\n      {if $formValues.product_option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.product_option}\n        </td>\n       </tr>\n      {/if}\n      {if $formValues.product_sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.product_sku}\n        </td>\n       </tr>\n      {/if}\n      {if $fulfilled_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Sent{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$fulfilled_date|truncate:10:\'\'|crmDate}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,822,'contribution_offline_receipt',1,0,0,NULL),(6,'Contributions - Receipt (off-line)','{ts}Contribution Receipt{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $formValues.receipt_text}\n{$formValues.receipt_text}\n{else}{ts}Below you will find a receipt for this contribution.{/ts}{/if}\n\n===========================================================\n{ts}Contribution Information{/ts}\n\n===========================================================\n{ts}Contributor{/ts}: {contact.display_name}\n{ts}Financial Type{/ts}: {$formValues.contributionType_name}\n{if $lineItem}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $getTaxDetails}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $getTaxDetails} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $getTaxDetails}{$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"} {$line.tax_rate|string_format:\"%.2f\"} %   {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if} {/if}   {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $getTaxDetails && $dataArray}\n{ts}Amount before Tax{/ts} : {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset ||  $priceset == 0 || $value != \'\'}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}% : {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm} : {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n\n{if isset($totalTaxAmount) && $totalTaxAmount !== \'null\'}\n{ts}Total Tax Amount{/ts} : {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{ts}Total Amount{/ts} : {$formValues.total_amount|crmMoney:$currency}\n{if $receive_date}\n{ts}Date Received{/ts}: {$receive_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $receipt_date}\n{ts}Receipt Date{/ts}: {$receipt_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $formValues.paidBy and !$formValues.hidden_CreditCard}\n{ts}Paid By{/ts}: {$formValues.paidBy}\n{if $formValues.check_number}\n{ts}Check Number{/ts}: {$formValues.check_number}\n{/if}\n{/if}\n{if $formValues.trxn_id}\n{ts}Transaction ID{/ts}: {$formValues.trxn_id}\n{/if}\n\n{if $ccContribution}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n===========================================================\n{$customName}\n===========================================================\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $softCreditTypes and $softCredits}\n{foreach from=$softCreditTypes item=softCreditType key=n}\n===========================================================\n{$softCreditType}\n===========================================================\n{foreach from=$softCredits.$n item=value key=label}\n{$label}: {$value}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $formValues.product_name}\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$formValues.product_name}\n{if $formValues.product_option}\n{ts}Option{/ts}: {$formValues.product_option}\n{/if}\n{if $formValues.product_sku}\n{ts}SKU{/ts}: {$formValues.product_sku}\n{/if}\n{if $fulfilled_date}\n{ts}Sent{/ts}: {$fulfilled_date|crmDate}\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $formValues.receipt_text}\n     <p>{$formValues.receipt_text|htmlize}</p>\n    {else}\n     <p>{ts}Below you will find a receipt for this contribution.{/ts}</p>\n    {/if}\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Contribution Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Contributor Name{/ts}\n      </td>\n      <td {$valueStyle}>\n       {contact.display_name}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Financial Type{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$formValues.contributionType_name}\n      </td>\n     </tr>\n\n     {if $lineItem and !$is_quick_config}\n      {foreach from=$lineItem item=value key=priceset}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n          <tr>\n           <th>{ts}Item{/ts}</th>\n           <th>{ts}Qty{/ts}</th>\n           <th>{ts}Each{/ts}</th>\n           {if $getTaxDetails}\n             <th>{ts}Subtotal{/ts}</th>\n             <th>{ts}Tax Rate{/ts}</th>\n             <th>{ts}Tax Amount{/ts}</th>\n           {/if}\n           <th>{ts}Total{/ts}</th>\n          </tr>\n          {foreach from=$value item=line}\n           <tr>\n            <td>\n            {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n            </td>\n            <td>\n             {$line.qty}\n            </td>\n            <td>\n             {$line.unit_price|crmMoney:$currency}\n            </td>\n            {if $getTaxDetails}\n              <td>\n                {$line.unit_price*$line.qty|crmMoney:$currency}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                  {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                  {$line.tax_amount|crmMoney:$currency}\n                </td>\n              {else}\n                <td></td>\n                <td></td>\n              {/if}\n            {/if}\n            <td>\n             {$line.line_total+$line.tax_amount|crmMoney:$currency}\n            </td>\n           </tr>\n          {/foreach}\n         </table>\n        </td>\n       </tr>\n      {/foreach}\n     {/if}\n     {if $getTaxDetails && $dataArray}\n       <tr>\n         <td {$labelStyle}>\n           {ts} Amount before Tax : {/ts}\n         </td>\n         <td {$valueStyle}>\n           {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n         </td>\n       </tr>\n\n      {foreach from=$dataArray item=value key=priceset}\n        <tr>\n        {if $priceset ||  $priceset == 0 || $value != \'\'}\n          <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n          <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {else}\n          <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n          <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {/if}\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if isset($totalTaxAmount) && $totalTaxAmount !== \'null\'}\n      <tr>\n        <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n        </td>\n      </tr>\n     {/if}\n\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$formValues.total_amount|crmMoney:$currency}\n      </td>\n     </tr>\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date Received{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|truncate:10:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n      {if $receipt_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Receipt Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receipt_date|truncate:10:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $formValues.paidBy and !$formValues.hidden_CreditCard}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Paid By{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$formValues.paidBy}\n       </td>\n      </tr>\n      {if $formValues.check_number}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Check Number{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.check_number}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $formValues.trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction ID{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$formValues.trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n     {if $ccContribution}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Billing Name and Address{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$billingName}<br />\n        {$address|nl2br}\n       </td>\n      </tr>\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $softCreditTypes and $softCredits}\n      {foreach from=$softCreditTypes item=softCreditType key=n}\n       <tr>\n        <th {$headerStyle}>\n         {$softCreditType}\n        </th>\n       </tr>\n       {foreach from=$softCredits.$n item=value key=label}\n         <tr>\n          <td {$labelStyle}>\n           {$label}\n          </td>\n          <td {$valueStyle}>\n           {$value}\n          </td>\n         </tr>\n        {/foreach}\n       {/foreach}\n     {/if}\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n     {if $formValues.product_name}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$formValues.product_name}\n       </td>\n      </tr>\n      {if $formValues.product_option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.product_option}\n        </td>\n       </tr>\n      {/if}\n      {if $formValues.product_sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.product_sku}\n        </td>\n       </tr>\n      {/if}\n      {if $fulfilled_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Sent{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$fulfilled_date|truncate:10:\'\'|crmDate}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,822,'contribution_offline_receipt',0,1,0,NULL),(7,'Contributions - Receipt (on-line)','{if $is_pay_later}{ts}Invoice{/ts}{else}{ts}Receipt{/ts}{/if} - {$title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $receipt_text}\n{$receipt_text}\n{/if}\n{if $is_pay_later}\n\n===========================================================\n{$pay_later_receipt}\n===========================================================\n{/if}\n\n{if $amount}\n===========================================================\n{ts}Contribution Information{/ts}\n\n===========================================================\n{if $lineItem and $priceSetID and !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $dataArray}{$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if} {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Total Amount{/ts}: {$amount|crmMoney:$currency}\n{else}\n{ts}Amount{/ts}: {$amount|crmMoney:$currency} {if $amount_level } - {$amount_level} {/if}\n{/if}\n{/if}\n{if $receive_date}\n\n{ts}Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $is_monetary and $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n\n{if $is_recur}\n{ts}This is a recurring contribution.{/ts}\n\n{if $cancelSubscriptionUrl}\n{ts}You can cancel future contributions at:{/ts}\n\n{$cancelSubscriptionUrl}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts}You can update billing details for this recurring contribution at:{/ts}\n\n{$updateSubscriptionBillingUrl}\n\n{/if}\n\n{if $updateSubscriptionUrl}\n{ts}You can update recurring contribution amount or change the number of installments for this recurring contribution at:{/ts}\n\n{$updateSubscriptionUrl}\n\n{/if}\n{/if}\n\n{if $honor_block_is_active}\n===========================================================\n{$soft_credit_type}\n===========================================================\n{foreach from=$honoreeProfile item=value key=label}\n{$label}: {$value}\n{/foreach}\n{elseif $softCreditTypes and $softCredits}\n{foreach from=$softCreditTypes item=softCreditType key=n}\n===========================================================\n{$softCreditType}\n===========================================================\n{foreach from=$softCredits.$n item=value key=label}\n{$label}: {$value}\n{/foreach}\n{/foreach}\n{/if}\n{if $pcpBlock}\n===========================================================\n{ts}Personal Campaign Page{/ts}\n\n===========================================================\n{ts}Display In Honor Roll{/ts}: {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n\n{if $pcp_roll_nickname}{ts}Nickname{/ts}: {$pcp_roll_nickname}{/if}\n\n{if $pcp_personal_note}{ts}Personal Note{/ts}: {$pcp_personal_note}{/if}\n\n{/if}\n{if $onBehalfProfile}\n===========================================================\n{ts}On Behalf Of{/ts}\n\n===========================================================\n{foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n{$onBehalfName}: {$onBehalfValue}\n{/foreach}\n{/if}\n\n{if $billingName}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n{elseif $email}\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$email}\n{/if} {* End billingName or Email*}\n{if $credit_card_type}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n\n{if $selectPremium }\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$product_name}\n{if $option}\n{ts}Option{/ts}: {$option}\n{/if}\n{if $sku}\n{ts}SKU{/ts}: {$sku}\n{/if}\n{if $start_date}\n{ts}Start Date{/ts}: {$start_date|crmDate}\n{/if}\n{if $end_date}\n{ts}End Date{/ts}: {$end_date|crmDate}\n{/if}\n{if $contact_email OR $contact_phone}\n\n{ts}For information about this premium, contact:{/ts}\n\n{if $contact_email}\n  {$contact_email}\n{/if}\n{if $contact_phone}\n  {$contact_phone}\n{/if}\n{/if}\n{if $is_deductible AND $price}\n\n{ts 1=$price|crmMoney:$currency}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}{/if}\n{/if}\n\n{if $customPre}\n===========================================================\n{$customPre_grouptitle}\n\n===========================================================\n{foreach from=$customPre item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n\n\n{if $customPost}\n===========================================================\n{$customPost_grouptitle}\n\n===========================================================\n{foreach from=$customPost item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $receipt_text}\n     <p>{$receipt_text|htmlize}</p>\n    {/if}\n\n    {if $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  </table>\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n     {if $amount}\n\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Contribution Information{/ts}\n       </th>\n      </tr>\n\n      {if $lineItem and $priceSetID and !$is_quick_config}\n\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Qty{/ts}</th>\n            <th>{ts}Each{/ts}</th>\n            {if $dataArray}\n             <th>{ts}Subtotal{/ts}</th>\n             <th>{ts}Tax Rate{/ts}</th>\n             <th>{ts}Tax Amount{/ts}</th>\n            {/if}\n            <th>{ts}Total{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n             {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n             </td>\n             <td>\n              {$line.qty}\n             </td>\n             <td>\n              {$line.unit_price|crmMoney:$currency}\n             </td>\n             {if $getTaxDetails}\n              <td>\n               {$line.unit_price*$line.qty|crmMoney:$currency}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n               <td>\n                {$line.tax_rate|string_format:\"%.2f\"}%\n               </td>\n               <td>\n                {$line.tax_amount|crmMoney:$currency}\n               </td>\n              {else}\n               <td></td>\n               <td></td>\n              {/if}\n             {/if}\n             <td>\n              {$line.line_total+$line.tax_amount|crmMoney:$currency}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts} Amount before Tax : {/ts}\n         </td>\n         <td {$valueStyle}>\n          {$amount-$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n          {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {else}\n           <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {/if}\n         </tr>\n        {/foreach}\n\n       {/if}\n       {if $totalTaxAmount}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney:$currency}\n        </td>\n       </tr>\n\n      {else}\n\n      {if $totalTaxAmount}\n         <tr>\n           <td {$labelStyle}>\n             {ts}Total Tax Amount{/ts}\n           </td>\n           <td {$valueStyle}>\n             {$totalTaxAmount|crmMoney:$currency}\n           </td>\n         </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney:$currency} {if $amount_level} - {$amount_level}{/if}\n        </td>\n       </tr>\n\n      {/if}\n\n     {/if}\n\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $is_monetary and $trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n    {if $is_recur}\n      <tr>\n        <td  colspan=\"2\" {$labelStyle}>\n          {ts}This is a recurring contribution.{/ts}\n          {if $cancelSubscriptionUrl}\n            {ts 1=$cancelSubscriptionUrl}You can cancel future contributions by <a href=\"%1\">visiting this web page</a>.{/ts}\n          {/if}\n        </td>\n      </tr>\n      {if $updateSubscriptionBillingUrl}\n        <tr>\n          <td colspan=\"2\" {$labelStyle}>\n            {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n      {if $updateSubscriptionUrl}\n        <tr>\n          <td colspan=\"2\" {$labelStyle}>\n            {ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n    {/if}\n\n     {if $honor_block_is_active}\n      <tr>\n       <th {$headerStyle}>\n        {$soft_credit_type}\n       </th>\n      </tr>\n      {foreach from=$honoreeProfile item=value key=label}\n        <tr>\n         <td {$labelStyle}>\n          {$label}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n      {/foreach}\n      {elseif $softCreditTypes and $softCredits}\n      {foreach from=$softCreditTypes item=softCreditType key=n}\n       <tr>\n        <th {$headerStyle}>\n         {$softCreditType}\n        </th>\n       </tr>\n       {foreach from=$softCredits.$n item=value key=label}\n         <tr>\n          <td {$labelStyle}>\n           {$label}\n          </td>\n          <td {$valueStyle}>\n           {$value}\n          </td>\n         </tr>\n        {/foreach}\n       {/foreach}\n     {/if}\n\n     {if $pcpBlock}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Personal Campaign Page{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Display In Honor Roll{/ts}\n       </td>\n       <td {$valueStyle}>\n        {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n       </td>\n      </tr>\n      {if $pcp_roll_nickname}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Nickname{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_roll_nickname}\n        </td>\n       </tr>\n      {/if}\n      {if $pcp_personal_note}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Personal Note{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_personal_note}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $onBehalfProfile}\n      <tr>\n       <th {$headerStyle}>\n        {$onBehalfProfile_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n        <tr>\n         <td {$labelStyle}>\n          {$onBehalfName}\n         </td>\n         <td {$valueStyle}>\n          {$onBehalfValue}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $isShare}\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n            {capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contributionPageId`\" a=true fe=1 h=1}{/capture}\n            {include file=\"CRM/common/SocialNetwork.tpl\" emailMode=true url=$contributionUrl title=$title pageURL=$contributionUrl}\n        </td>\n      </tr>\n     {/if}\n\n     {if $billingName}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n     {elseif $email}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Registered Email{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$email}\n        </td>\n       </tr>\n     {/if}\n\n     {if $credit_card_type}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n     {/if}\n\n     {if $selectPremium}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$product_name}\n       </td>\n      </tr>\n      {if $option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$option}\n        </td>\n       </tr>\n      {/if}\n      {if $sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$sku}\n        </td>\n       </tr>\n      {/if}\n      {if $start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $contact_email OR $contact_phone}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}For information about this premium, contact:{/ts}</p>\n         {if $contact_email}\n          <p>{$contact_email}</p>\n         {/if}\n         {if $contact_phone}\n          <p>{$contact_phone}</p>\n         {/if}\n        </td>\n       </tr>\n      {/if}\n      {if $is_deductible AND $price}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <p>{ts 1=$price|crmMoney:$currency}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}</p>\n         </td>\n        </tr>\n      {/if}\n     {/if}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,823,'contribution_online_receipt',1,0,0,NULL),(8,'Contributions - Receipt (on-line)','{if $is_pay_later}{ts}Invoice{/ts}{else}{ts}Receipt{/ts}{/if} - {$title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $receipt_text}\n{$receipt_text}\n{/if}\n{if $is_pay_later}\n\n===========================================================\n{$pay_later_receipt}\n===========================================================\n{/if}\n\n{if $amount}\n===========================================================\n{ts}Contribution Information{/ts}\n\n===========================================================\n{if $lineItem and $priceSetID and !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $dataArray}{$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if} {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Total Amount{/ts}: {$amount|crmMoney:$currency}\n{else}\n{ts}Amount{/ts}: {$amount|crmMoney:$currency} {if $amount_level } - {$amount_level} {/if}\n{/if}\n{/if}\n{if $receive_date}\n\n{ts}Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $is_monetary and $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n\n{if $is_recur}\n{ts}This is a recurring contribution.{/ts}\n\n{if $cancelSubscriptionUrl}\n{ts}You can cancel future contributions at:{/ts}\n\n{$cancelSubscriptionUrl}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts}You can update billing details for this recurring contribution at:{/ts}\n\n{$updateSubscriptionBillingUrl}\n\n{/if}\n\n{if $updateSubscriptionUrl}\n{ts}You can update recurring contribution amount or change the number of installments for this recurring contribution at:{/ts}\n\n{$updateSubscriptionUrl}\n\n{/if}\n{/if}\n\n{if $honor_block_is_active}\n===========================================================\n{$soft_credit_type}\n===========================================================\n{foreach from=$honoreeProfile item=value key=label}\n{$label}: {$value}\n{/foreach}\n{elseif $softCreditTypes and $softCredits}\n{foreach from=$softCreditTypes item=softCreditType key=n}\n===========================================================\n{$softCreditType}\n===========================================================\n{foreach from=$softCredits.$n item=value key=label}\n{$label}: {$value}\n{/foreach}\n{/foreach}\n{/if}\n{if $pcpBlock}\n===========================================================\n{ts}Personal Campaign Page{/ts}\n\n===========================================================\n{ts}Display In Honor Roll{/ts}: {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n\n{if $pcp_roll_nickname}{ts}Nickname{/ts}: {$pcp_roll_nickname}{/if}\n\n{if $pcp_personal_note}{ts}Personal Note{/ts}: {$pcp_personal_note}{/if}\n\n{/if}\n{if $onBehalfProfile}\n===========================================================\n{ts}On Behalf Of{/ts}\n\n===========================================================\n{foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n{$onBehalfName}: {$onBehalfValue}\n{/foreach}\n{/if}\n\n{if $billingName}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n{elseif $email}\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$email}\n{/if} {* End billingName or Email*}\n{if $credit_card_type}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n\n{if $selectPremium }\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$product_name}\n{if $option}\n{ts}Option{/ts}: {$option}\n{/if}\n{if $sku}\n{ts}SKU{/ts}: {$sku}\n{/if}\n{if $start_date}\n{ts}Start Date{/ts}: {$start_date|crmDate}\n{/if}\n{if $end_date}\n{ts}End Date{/ts}: {$end_date|crmDate}\n{/if}\n{if $contact_email OR $contact_phone}\n\n{ts}For information about this premium, contact:{/ts}\n\n{if $contact_email}\n  {$contact_email}\n{/if}\n{if $contact_phone}\n  {$contact_phone}\n{/if}\n{/if}\n{if $is_deductible AND $price}\n\n{ts 1=$price|crmMoney:$currency}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}{/if}\n{/if}\n\n{if $customPre}\n===========================================================\n{$customPre_grouptitle}\n\n===========================================================\n{foreach from=$customPre item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n\n\n{if $customPost}\n===========================================================\n{$customPost_grouptitle}\n\n===========================================================\n{foreach from=$customPost item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $receipt_text}\n     <p>{$receipt_text|htmlize}</p>\n    {/if}\n\n    {if $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  </table>\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n     {if $amount}\n\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Contribution Information{/ts}\n       </th>\n      </tr>\n\n      {if $lineItem and $priceSetID and !$is_quick_config}\n\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Qty{/ts}</th>\n            <th>{ts}Each{/ts}</th>\n            {if $dataArray}\n             <th>{ts}Subtotal{/ts}</th>\n             <th>{ts}Tax Rate{/ts}</th>\n             <th>{ts}Tax Amount{/ts}</th>\n            {/if}\n            <th>{ts}Total{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n             {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n             </td>\n             <td>\n              {$line.qty}\n             </td>\n             <td>\n              {$line.unit_price|crmMoney:$currency}\n             </td>\n             {if $getTaxDetails}\n              <td>\n               {$line.unit_price*$line.qty|crmMoney:$currency}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n               <td>\n                {$line.tax_rate|string_format:\"%.2f\"}%\n               </td>\n               <td>\n                {$line.tax_amount|crmMoney:$currency}\n               </td>\n              {else}\n               <td></td>\n               <td></td>\n              {/if}\n             {/if}\n             <td>\n              {$line.line_total+$line.tax_amount|crmMoney:$currency}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts} Amount before Tax : {/ts}\n         </td>\n         <td {$valueStyle}>\n          {$amount-$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n          {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {else}\n           <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {/if}\n         </tr>\n        {/foreach}\n\n       {/if}\n       {if $totalTaxAmount}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney:$currency}\n        </td>\n       </tr>\n\n      {else}\n\n      {if $totalTaxAmount}\n         <tr>\n           <td {$labelStyle}>\n             {ts}Total Tax Amount{/ts}\n           </td>\n           <td {$valueStyle}>\n             {$totalTaxAmount|crmMoney:$currency}\n           </td>\n         </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney:$currency} {if $amount_level} - {$amount_level}{/if}\n        </td>\n       </tr>\n\n      {/if}\n\n     {/if}\n\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $is_monetary and $trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n    {if $is_recur}\n      <tr>\n        <td  colspan=\"2\" {$labelStyle}>\n          {ts}This is a recurring contribution.{/ts}\n          {if $cancelSubscriptionUrl}\n            {ts 1=$cancelSubscriptionUrl}You can cancel future contributions by <a href=\"%1\">visiting this web page</a>.{/ts}\n          {/if}\n        </td>\n      </tr>\n      {if $updateSubscriptionBillingUrl}\n        <tr>\n          <td colspan=\"2\" {$labelStyle}>\n            {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n      {if $updateSubscriptionUrl}\n        <tr>\n          <td colspan=\"2\" {$labelStyle}>\n            {ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n    {/if}\n\n     {if $honor_block_is_active}\n      <tr>\n       <th {$headerStyle}>\n        {$soft_credit_type}\n       </th>\n      </tr>\n      {foreach from=$honoreeProfile item=value key=label}\n        <tr>\n         <td {$labelStyle}>\n          {$label}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n      {/foreach}\n      {elseif $softCreditTypes and $softCredits}\n      {foreach from=$softCreditTypes item=softCreditType key=n}\n       <tr>\n        <th {$headerStyle}>\n         {$softCreditType}\n        </th>\n       </tr>\n       {foreach from=$softCredits.$n item=value key=label}\n         <tr>\n          <td {$labelStyle}>\n           {$label}\n          </td>\n          <td {$valueStyle}>\n           {$value}\n          </td>\n         </tr>\n        {/foreach}\n       {/foreach}\n     {/if}\n\n     {if $pcpBlock}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Personal Campaign Page{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Display In Honor Roll{/ts}\n       </td>\n       <td {$valueStyle}>\n        {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n       </td>\n      </tr>\n      {if $pcp_roll_nickname}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Nickname{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_roll_nickname}\n        </td>\n       </tr>\n      {/if}\n      {if $pcp_personal_note}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Personal Note{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_personal_note}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $onBehalfProfile}\n      <tr>\n       <th {$headerStyle}>\n        {$onBehalfProfile_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n        <tr>\n         <td {$labelStyle}>\n          {$onBehalfName}\n         </td>\n         <td {$valueStyle}>\n          {$onBehalfValue}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $isShare}\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n            {capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contributionPageId`\" a=true fe=1 h=1}{/capture}\n            {include file=\"CRM/common/SocialNetwork.tpl\" emailMode=true url=$contributionUrl title=$title pageURL=$contributionUrl}\n        </td>\n      </tr>\n     {/if}\n\n     {if $billingName}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n     {elseif $email}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Registered Email{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$email}\n        </td>\n       </tr>\n     {/if}\n\n     {if $credit_card_type}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n     {/if}\n\n     {if $selectPremium}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$product_name}\n       </td>\n      </tr>\n      {if $option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$option}\n        </td>\n       </tr>\n      {/if}\n      {if $sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$sku}\n        </td>\n       </tr>\n      {/if}\n      {if $start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $contact_email OR $contact_phone}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}For information about this premium, contact:{/ts}</p>\n         {if $contact_email}\n          <p>{$contact_email}</p>\n         {/if}\n         {if $contact_phone}\n          <p>{$contact_phone}</p>\n         {/if}\n        </td>\n       </tr>\n      {/if}\n      {if $is_deductible AND $price}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <p>{ts 1=$price|crmMoney:$currency}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}</p>\n         </td>\n        </tr>\n      {/if}\n     {/if}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,823,'contribution_online_receipt',0,1,0,NULL),(9,'Contributions - Invoice','{if $title}\n  {if $component}\n    {if $component == \'event\'}\n      {ts 1=$title}Event Registration Invoice: %1{/ts}\n    {else}\n      {ts 1=$title}Contribution Invoice: %1{/ts}\n    {/if}\n  {/if}\n{else}\n  {ts}Invoice{/ts}\n{/if}\n - {contact.display_name}\n','{ts}Contribution Invoice{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n      <title></title>\n  </head>\n  <body>\n  <div style=\"padding-top:100px;margin-right:50px;border-style: none;\">\n    {if $config->empoweredBy}\n      <table style=\"margin-top:5px;padding-bottom:50px;\" cellpadding=\"5\" cellspacing=\"0\">\n        <tr>\n          <td><img src=\"{$resourceBase}/i/civi99.png\" height=\"34px\" width=\"99px\"></td>\n        </tr>\n      </table>\n    {/if}\n      <table style=\"font-family: Arial, Verdana, sans-serif;\" width=\"100%\" height=\"100\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\n        <tr>\n          <td width=\"30%\"><b><font size=\"4\" align=\"center\">{ts}INVOICE{/ts}</font></b></td>\n          <td width=\"50%\" valign=\"bottom\"><b><font size=\"1\" align=\"center\">{ts}Invoice Date:{/ts}</font></b></td>\n          <td valign=\"bottom\" style=\"white-space: nowrap\"><b><font size=\"1\" align=\"right\">{$domain_organization}</font></b></td>\n        </tr>\n        <tr>\n          {if $organization_name}\n            <td><font size=\"1\" align=\"center\">{$display_name}  ({$organization_name})</font></td>\n          {else}\n            <td><font size=\"1\" align=\"center\">{$display_name}</font></td>\n          {/if}\n          <td><font size=\"1\" align=\"right\">{$invoice_date}</font></td>\n          <td style=\"white-space: nowrap\">\n            <font size=\"1\" align=\"right\">\n              {if $domain_street_address }{$domain_street_address}{/if}\n              {if $domain_supplemental_address_1 }{$domain_supplemental_address_1}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"center\">{$street_address} {$supplemental_address_1}</font></td>\n          <td><b><font size=\"1\" align=\"right\">{ts}Invoice Number:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_supplemental_address_2 }{$domain_supplemental_address_2}{/if}\n              {if $domain_state }{$domain_state}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"center\">{$supplemental_address_2} {$stateProvinceAbbreviation}</font></td>\n          <td><font size=\"1\" align=\"right\">{$invoice_number}</font></td>\n          <td style=\"white-space: nowrap\">\n            <font size=\"1\" align=\"right\">\n              {if $domain_city}{$domain_city}{/if}\n              {if $domain_postal_code }{$domain_postal_code}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"right\">{$city}  {$postal_code}</font></td>\n          <td height=\"10\"><b><font size=\"1\" align=\"right\">{ts}Reference:{/ts}</font></b></td>\n          <td><font size=\"1\" align=\"right\">{if $domain_country}{$domain_country}{/if}</font></td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"right\"> {$country}</font></td>\n          <td><font size=\"1\" align=\"right\">{$source}</font></td>\n          <td valign=\"top\" style=\"white-space: nowrap\"><font size=\"1\" align=\"right\">{if $domain_email}{$domain_email}{/if}</font> </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td></td>\n          <td valign=\"top\"><font size=\"1\" align=\"right\">{if $domain_phone}{$domain_phone}{/if}</font> </td>\n        </tr>\n      </table>\n\n             <table style=\"padding-top:75px;font-family: Arial, Verdana, sans-serif;\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\n              <tr>\n                <th style=\"text-align:left;font-weight:bold;width:100%\"><font size=\"1\">{ts}Description{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts}Quantity{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts}Unit Price{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{$taxTerm}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts 1=$defaultCurrency}Amount %1{/ts}</font></th>\n              </tr>\n              {foreach from=$lineItem item=value key=priceset name=taxpricevalue}\n                {if $smarty.foreach.taxpricevalue.index eq 0}\n                {else}\n                {/if}\n                <tr>\n                  <td style=\"text-align:left;nowrap\"><font size=\"1\">\n                    {if $value.html_type eq \'Text\'}\n                      {$value.label}\n                    {else}\n                      {$value.field_title} - {$value.label}\n                    {/if}\n                    {if $value.description}\n                      <div>{$value.description|truncate:30:\"...\"}</div>\n                    {/if}\n                   </font>\n                  </td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.qty}</font></td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.unit_price|crmMoney:$currency}</font></td>\n                  {if $value.tax_amount != \'\'}\n                    <td style=\"text-align:right;\"><font size=\"1\">{$value.tax_rate}%</font></td>\n                  {else}\n                    <td style=\"text-align:right;\"><font size=\"1\">{ts 1=$taxTerm}-{/ts}</font></td>\n                  {/if}\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.subTotal|crmMoney:$currency}</font></td>\n                </tr>\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{ts}Sub Total{/ts}</font></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$subTotal|crmMoney:$currency}</font></td>\n              </tr>\n              {foreach from=$dataArray item=value key=priceset}\n                <tr>\n                  <td colspan=\"3\"></td>\n                    {if $priceset}\n                      <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">{ts 1=$taxTerm 2=$priceset}TOTAL %1 %2%{/ts}</font></td>\n                      <td style=\"text-align:right\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                    {elseif $priceset == 0}\n                      <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">{ts 1=$taxTerm}TOTAL %1{/ts}</font></td>\n                      <td style=\"text-align:right\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                </tr>\n              {/if}\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;white-space: nowrap\"><b><font size=\"1\">{ts 1=$defaultCurrency}TOTAL %1{/ts}</font></b></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n             {if $amountDue != 0}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">\n                    {if $contribution_status_id == $refundedStatusId}\n                      {ts}Amount Credited{/ts}\n                    {else}\n                      {ts}Amount Paid{/ts}\n                    {/if}\n                   </font>\n                  </td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$amountPaid|crmMoney:$currency}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td colspan=\"2\"><hr></hr></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"text-align:right;white-space: nowrap\" ><b><font size=\"1\">{ts}AMOUNT DUE:{/ts}</font></b></td>\n                  <td style=\"text-align:right;\"><b><font size=\"1\">{$amountDue|crmMoney:$currency}</font></b></td>\n                </tr>\n              {/if}\n              <br/><br/><br/>\n              <tr>\n                <td colspan=\"5\"></td>\n              </tr>\n              {if $contribution_status_id == $pendingStatusId && $is_pay_later == 1}\n                <tr>\n                  <td colspan=\"3\"><b><font size=\"1\" align=\"center\">{ts 1=$dueDate}DUE DATE: %1{/ts}</font></b></td>\n                  <td colspan=\"2\"></td>\n                </tr>\n              {/if}\n            </table>\n          </td>\n        </tr>\n      </table>\n\n      {if $contribution_status_id == $pendingStatusId && $is_pay_later == 1}\n        <table style=\"margin-top:5px;\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n          <tr>\n            <td><img src=\"{$resourceBase}/i/contribute/cut_line.png\" height=\"15\"></td>\n          </tr>\n        </table>\n\n        <table style=\"margin-top:5px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\" id=\"desc\">\n          <tr>\n            <td width=\"60%\"><b><font size=\"4\" align=\"right\">{ts}PAYMENT ADVICE{/ts}</font></b><br/><br/><font size=\"1\" align=\"left\"><b>{ts}To:{/ts}</b><div style=\"width:24em;word-wrap:break-word;\">\n              {$domain_organization}<br />\n              {$domain_street_address} {$domain_supplemental_address_1}<br />\n              {$domain_supplemental_address_2} {$domain_state}<br />\n              {$domain_city} {$domain_postal_code}<br />\n              {$domain_country}<br />\n              {$domain_email}</div>\n              {$domain_phone}<br />\n             </font><br/><br/><font size=\"1\" align=\"left\">{$notes}</font>\n            </td>\n            <td width=\"40%\">\n              <table cellpadding=\"5\" cellspacing=\"0\"  width=\"100%\" border=\"0\">\n                <tr>\n                  <td width=\"100%\"><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Customer:{/ts}</font></td>\n                  <td style=\"white-space: nowrap\"><font size=\"1\" align=\"right\">{$display_name}</font></td>\n                </tr>\n                <tr>\n                  <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Invoice Number:{/ts}</font></td>\n                  <td><font size=\"1\" align=\"right\">{$invoice_number}</font></td>\n                </tr>\n                <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></td></tr>\n                {if $is_pay_later == 1}\n                  <tr>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Amount Due:{/ts}</font></td>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amount|crmMoney:$currency}</font></td>\n                  </tr>\n                {else}\n                  <tr>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Amount Due:{/ts}</font></td>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amountDue|crmMoney:$currency}</font></td>\n                  </tr>\n                {/if}\n                <tr>\n                  <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Due Date:{/ts}</font></td>\n                  <td><font size=\"1\" align=\"right\">{$dueDate}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></td>\n                </tr>\n              </table>\n      {/if}\n\n      {if $contribution_status_id == $refundedStatusId || $contribution_status_id == $cancelledStatusId}\n      {if $config->empoweredBy}\n        <table style=\"margin-top:2px;padding-left:7px;page-break-before: always;\">\n          <tr>\n            <td><img src=\"{$resourceBase}/i/civi99.png\" height=\"34px\" width=\"99px\"></td>\n          </tr>\n        </table>\n      {/if}\n\n    <center>\n      <table style=\"font-family: Arial, Verdana, sans-serif\" width=\"100%\" height=\"100\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\">\n        <tr>\n          <td style=\"padding-left:15px;\"><b><font size=\"4\" align=\"center\">{ts}CREDIT NOTE{/ts}</font></b></td>\n          <td style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Date:{/ts}</font></b></td>\n          <td><font size=\"1\" align=\"right\">{$domain_organization}</font></td>\n        </tr>\n        <tr>\n          {if $organization_name}\n            <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$display_name}  ({$organization_name})</font></td>\n          {else}\n            <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$display_name}</font></td>\n          {/if}\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$invoice_date}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_street_address }{$domain_street_address}{/if}\n              {if $domain_supplemental_address_1 }{$domain_supplemental_address_1}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$street_address}   {$supplemental_address_1}</font></td>\n          <td style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Credit Note Number:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_supplemental_address_2 }{$domain_supplemental_address_2}{/if}\n              {if $domain_state }{$domain_state}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$supplemental_address_2}  {$stateProvinceAbbreviation}</font></td>\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$creditnote_id}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_city}{$domain_city}{/if}\n              {if $domain_postal_code }{$domain_postal_code}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"right\">{$city}  {$postal_code}</font></td>\n          <td height=\"10\" style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Reference:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_country}{$domain_country}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$source}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_email}{$domain_email}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_phone}{$domain_phone}{/if}\n           </font>\n          </td>\n        </tr>\n      </table>\n\n      <table style=\"margin-top:75px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\" id=\"desc\">\n        <tr>\n          <td colspan=\"2\" {$valueStyle}>\n            <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n              <tr>\n                <th style=\"padding-right:28px;text-align:left;font-weight:bold;width:200px;\"><font size=\"1\">{ts}Description{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts}Quantity{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts}Unit Price{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{$taxTerm}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts 1=$defaultCurrency}Amount %1{/ts}</font></th>\n              </tr>\n              {foreach from=$lineItem item=value key=priceset name=pricevalue}\n                {if $smarty.foreach.pricevalue.index eq 0}\n                  <tr><td colspan=\"5\"><hr size=\"3\" style=\"color:#000;\"></hr></td></tr>\n                {else}\n                  <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n                {/if}\n                <tr>\n                  <td style =\"text-align:left;\"  >\n                    <font size=\"1\">\n                      {if $value.html_type eq \'Text\'}\n                        {$value.label}\n                      {else}\n                        {$value.field_title} - {$value.label}\n                      {/if}\n                      {if $value.description}\n                        <div>{$value.description|truncate:30:\"...\"}</div>\n                      {/if}\n                   </font>\n                  </td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.qty}</font></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.unit_price|crmMoney:$currency}</font></td>\n                  {if $value.tax_amount != \'\'}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.tax_rate}%</font></td>\n                  {else}\n                    <td style=\"padding-left:28px;text-align:right\"><font size=\"1\">{ts 1=$taxTerm}No %1{/ts}</font></td>\n                  {/if}\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.subTotal|crmMoney:$currency}</font></td>\n                </tr>\n              {/foreach}\n              <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts}Sub Total{/ts}</font></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$subTotal|crmMoney:$currency}</font></td>\n              </tr>\n              {foreach from=$dataArray item=value key=priceset}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  {if $priceset}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts 1=$taxTerm 2=$priceset}TOTAL %1 %2%{/ts}</font></td>\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                  {elseif $priceset == 0}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts 1=$taxTerm}TOTAL NO %1{/ts}</font></td>\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                </tr>\n                {/if}\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td colspan=\"2\"><hr></hr></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{ts 1=$defaultCurrency}TOTAL %1{/ts}</font></b></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n              {if $is_pay_later == 0}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts}LESS Credit to invoice(s){/ts}</font></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td colspan=\"2\"><hr></hr></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{ts}REMAINING CREDIT{/ts}</font></b></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{$amountDue|crmMoney:$currency}</font></b></td>\n                  <td style=\"padding-left:28px;\"><font size=\"1\" align=\"right\"></font></td>\n                </tr>\n              {/if}\n              <br/><br/><br/>\n              <tr>\n                <td colspan=\"3\"></td>\n              </tr>\n              <tr>\n                <td></td>\n                <td colspan=\"3\"></td>\n              </tr>\n            </table>\n          </td>\n        </tr>\n      </table>\n\n      <table width=\"100%\" style=\"margin-top:5px;padding-right:45px;\">\n        <tr>\n          <td><img src=\"{$resourceBase}/i/contribute/cut_line.png\" height=\"15\" width=\"100%\"></td>\n        </tr>\n      </table>\n\n      <table style=\"margin-top:6px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\" id=\"desc\">\n        <tr>\n          <td width=\"60%\"><font size=\"4\" align=\"right\"><b>{ts}CREDIT ADVICE{/ts}</b><br/><br /><div style=\"font-size:10px;max-width:300px;\">{ts}Please do not pay on this advice. Deduct the amount of this Credit Note from your next payment to us{/ts}</div><br/></font></td>\n          <td width=\"40%\">\n            <table align=\"right\">\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Customer:{/ts}</font></td>\n                <td><font size=\"1\" align=\"right\">{$display_name}</font></td>\n              </tr>\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Credit Note#:{/ts}</font></td>\n                <td><font size=\"1\" align=\"right\">{$creditnote_id}</font></td>\n              </tr>\n              <tr><td colspan=\"5\"style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Credit Amount:{/ts}</font></td>\n                <td width=\'50px\'><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n            </table>\n          </td>\n        </tr>\n      </table>\n    {/if}\n    </center>\n\n  </div>\n  </body>\n</html>\n',1,824,'contribution_invoice_receipt',1,0,0,NULL),(10,'Contributions - Invoice','{if $title}\n  {if $component}\n    {if $component == \'event\'}\n      {ts 1=$title}Event Registration Invoice: %1{/ts}\n    {else}\n      {ts 1=$title}Contribution Invoice: %1{/ts}\n    {/if}\n  {/if}\n{else}\n  {ts}Invoice{/ts}\n{/if}\n - {contact.display_name}\n','{ts}Contribution Invoice{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n      <title></title>\n  </head>\n  <body>\n  <div style=\"padding-top:100px;margin-right:50px;border-style: none;\">\n    {if $config->empoweredBy}\n      <table style=\"margin-top:5px;padding-bottom:50px;\" cellpadding=\"5\" cellspacing=\"0\">\n        <tr>\n          <td><img src=\"{$resourceBase}/i/civi99.png\" height=\"34px\" width=\"99px\"></td>\n        </tr>\n      </table>\n    {/if}\n      <table style=\"font-family: Arial, Verdana, sans-serif;\" width=\"100%\" height=\"100\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\n        <tr>\n          <td width=\"30%\"><b><font size=\"4\" align=\"center\">{ts}INVOICE{/ts}</font></b></td>\n          <td width=\"50%\" valign=\"bottom\"><b><font size=\"1\" align=\"center\">{ts}Invoice Date:{/ts}</font></b></td>\n          <td valign=\"bottom\" style=\"white-space: nowrap\"><b><font size=\"1\" align=\"right\">{$domain_organization}</font></b></td>\n        </tr>\n        <tr>\n          {if $organization_name}\n            <td><font size=\"1\" align=\"center\">{$display_name}  ({$organization_name})</font></td>\n          {else}\n            <td><font size=\"1\" align=\"center\">{$display_name}</font></td>\n          {/if}\n          <td><font size=\"1\" align=\"right\">{$invoice_date}</font></td>\n          <td style=\"white-space: nowrap\">\n            <font size=\"1\" align=\"right\">\n              {if $domain_street_address }{$domain_street_address}{/if}\n              {if $domain_supplemental_address_1 }{$domain_supplemental_address_1}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"center\">{$street_address} {$supplemental_address_1}</font></td>\n          <td><b><font size=\"1\" align=\"right\">{ts}Invoice Number:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_supplemental_address_2 }{$domain_supplemental_address_2}{/if}\n              {if $domain_state }{$domain_state}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"center\">{$supplemental_address_2} {$stateProvinceAbbreviation}</font></td>\n          <td><font size=\"1\" align=\"right\">{$invoice_number}</font></td>\n          <td style=\"white-space: nowrap\">\n            <font size=\"1\" align=\"right\">\n              {if $domain_city}{$domain_city}{/if}\n              {if $domain_postal_code }{$domain_postal_code}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"right\">{$city}  {$postal_code}</font></td>\n          <td height=\"10\"><b><font size=\"1\" align=\"right\">{ts}Reference:{/ts}</font></b></td>\n          <td><font size=\"1\" align=\"right\">{if $domain_country}{$domain_country}{/if}</font></td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"right\"> {$country}</font></td>\n          <td><font size=\"1\" align=\"right\">{$source}</font></td>\n          <td valign=\"top\" style=\"white-space: nowrap\"><font size=\"1\" align=\"right\">{if $domain_email}{$domain_email}{/if}</font> </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td></td>\n          <td valign=\"top\"><font size=\"1\" align=\"right\">{if $domain_phone}{$domain_phone}{/if}</font> </td>\n        </tr>\n      </table>\n\n             <table style=\"padding-top:75px;font-family: Arial, Verdana, sans-serif;\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\n              <tr>\n                <th style=\"text-align:left;font-weight:bold;width:100%\"><font size=\"1\">{ts}Description{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts}Quantity{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts}Unit Price{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{$taxTerm}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts 1=$defaultCurrency}Amount %1{/ts}</font></th>\n              </tr>\n              {foreach from=$lineItem item=value key=priceset name=taxpricevalue}\n                {if $smarty.foreach.taxpricevalue.index eq 0}\n                {else}\n                {/if}\n                <tr>\n                  <td style=\"text-align:left;nowrap\"><font size=\"1\">\n                    {if $value.html_type eq \'Text\'}\n                      {$value.label}\n                    {else}\n                      {$value.field_title} - {$value.label}\n                    {/if}\n                    {if $value.description}\n                      <div>{$value.description|truncate:30:\"...\"}</div>\n                    {/if}\n                   </font>\n                  </td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.qty}</font></td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.unit_price|crmMoney:$currency}</font></td>\n                  {if $value.tax_amount != \'\'}\n                    <td style=\"text-align:right;\"><font size=\"1\">{$value.tax_rate}%</font></td>\n                  {else}\n                    <td style=\"text-align:right;\"><font size=\"1\">{ts 1=$taxTerm}-{/ts}</font></td>\n                  {/if}\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.subTotal|crmMoney:$currency}</font></td>\n                </tr>\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{ts}Sub Total{/ts}</font></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$subTotal|crmMoney:$currency}</font></td>\n              </tr>\n              {foreach from=$dataArray item=value key=priceset}\n                <tr>\n                  <td colspan=\"3\"></td>\n                    {if $priceset}\n                      <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">{ts 1=$taxTerm 2=$priceset}TOTAL %1 %2%{/ts}</font></td>\n                      <td style=\"text-align:right\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                    {elseif $priceset == 0}\n                      <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">{ts 1=$taxTerm}TOTAL %1{/ts}</font></td>\n                      <td style=\"text-align:right\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                </tr>\n              {/if}\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;white-space: nowrap\"><b><font size=\"1\">{ts 1=$defaultCurrency}TOTAL %1{/ts}</font></b></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n             {if $amountDue != 0}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">\n                    {if $contribution_status_id == $refundedStatusId}\n                      {ts}Amount Credited{/ts}\n                    {else}\n                      {ts}Amount Paid{/ts}\n                    {/if}\n                   </font>\n                  </td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$amountPaid|crmMoney:$currency}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td colspan=\"2\"><hr></hr></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"text-align:right;white-space: nowrap\" ><b><font size=\"1\">{ts}AMOUNT DUE:{/ts}</font></b></td>\n                  <td style=\"text-align:right;\"><b><font size=\"1\">{$amountDue|crmMoney:$currency}</font></b></td>\n                </tr>\n              {/if}\n              <br/><br/><br/>\n              <tr>\n                <td colspan=\"5\"></td>\n              </tr>\n              {if $contribution_status_id == $pendingStatusId && $is_pay_later == 1}\n                <tr>\n                  <td colspan=\"3\"><b><font size=\"1\" align=\"center\">{ts 1=$dueDate}DUE DATE: %1{/ts}</font></b></td>\n                  <td colspan=\"2\"></td>\n                </tr>\n              {/if}\n            </table>\n          </td>\n        </tr>\n      </table>\n\n      {if $contribution_status_id == $pendingStatusId && $is_pay_later == 1}\n        <table style=\"margin-top:5px;\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n          <tr>\n            <td><img src=\"{$resourceBase}/i/contribute/cut_line.png\" height=\"15\"></td>\n          </tr>\n        </table>\n\n        <table style=\"margin-top:5px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\" id=\"desc\">\n          <tr>\n            <td width=\"60%\"><b><font size=\"4\" align=\"right\">{ts}PAYMENT ADVICE{/ts}</font></b><br/><br/><font size=\"1\" align=\"left\"><b>{ts}To:{/ts}</b><div style=\"width:24em;word-wrap:break-word;\">\n              {$domain_organization}<br />\n              {$domain_street_address} {$domain_supplemental_address_1}<br />\n              {$domain_supplemental_address_2} {$domain_state}<br />\n              {$domain_city} {$domain_postal_code}<br />\n              {$domain_country}<br />\n              {$domain_email}</div>\n              {$domain_phone}<br />\n             </font><br/><br/><font size=\"1\" align=\"left\">{$notes}</font>\n            </td>\n            <td width=\"40%\">\n              <table cellpadding=\"5\" cellspacing=\"0\"  width=\"100%\" border=\"0\">\n                <tr>\n                  <td width=\"100%\"><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Customer:{/ts}</font></td>\n                  <td style=\"white-space: nowrap\"><font size=\"1\" align=\"right\">{$display_name}</font></td>\n                </tr>\n                <tr>\n                  <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Invoice Number:{/ts}</font></td>\n                  <td><font size=\"1\" align=\"right\">{$invoice_number}</font></td>\n                </tr>\n                <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></td></tr>\n                {if $is_pay_later == 1}\n                  <tr>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Amount Due:{/ts}</font></td>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amount|crmMoney:$currency}</font></td>\n                  </tr>\n                {else}\n                  <tr>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Amount Due:{/ts}</font></td>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amountDue|crmMoney:$currency}</font></td>\n                  </tr>\n                {/if}\n                <tr>\n                  <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Due Date:{/ts}</font></td>\n                  <td><font size=\"1\" align=\"right\">{$dueDate}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></td>\n                </tr>\n              </table>\n      {/if}\n\n      {if $contribution_status_id == $refundedStatusId || $contribution_status_id == $cancelledStatusId}\n      {if $config->empoweredBy}\n        <table style=\"margin-top:2px;padding-left:7px;page-break-before: always;\">\n          <tr>\n            <td><img src=\"{$resourceBase}/i/civi99.png\" height=\"34px\" width=\"99px\"></td>\n          </tr>\n        </table>\n      {/if}\n\n    <center>\n      <table style=\"font-family: Arial, Verdana, sans-serif\" width=\"100%\" height=\"100\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\">\n        <tr>\n          <td style=\"padding-left:15px;\"><b><font size=\"4\" align=\"center\">{ts}CREDIT NOTE{/ts}</font></b></td>\n          <td style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Date:{/ts}</font></b></td>\n          <td><font size=\"1\" align=\"right\">{$domain_organization}</font></td>\n        </tr>\n        <tr>\n          {if $organization_name}\n            <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$display_name}  ({$organization_name})</font></td>\n          {else}\n            <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$display_name}</font></td>\n          {/if}\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$invoice_date}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_street_address }{$domain_street_address}{/if}\n              {if $domain_supplemental_address_1 }{$domain_supplemental_address_1}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$street_address}   {$supplemental_address_1}</font></td>\n          <td style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Credit Note Number:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_supplemental_address_2 }{$domain_supplemental_address_2}{/if}\n              {if $domain_state }{$domain_state}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$supplemental_address_2}  {$stateProvinceAbbreviation}</font></td>\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$creditnote_id}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_city}{$domain_city}{/if}\n              {if $domain_postal_code }{$domain_postal_code}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"right\">{$city}  {$postal_code}</font></td>\n          <td height=\"10\" style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Reference:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_country}{$domain_country}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$source}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_email}{$domain_email}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_phone}{$domain_phone}{/if}\n           </font>\n          </td>\n        </tr>\n      </table>\n\n      <table style=\"margin-top:75px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\" id=\"desc\">\n        <tr>\n          <td colspan=\"2\" {$valueStyle}>\n            <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n              <tr>\n                <th style=\"padding-right:28px;text-align:left;font-weight:bold;width:200px;\"><font size=\"1\">{ts}Description{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts}Quantity{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts}Unit Price{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{$taxTerm}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts 1=$defaultCurrency}Amount %1{/ts}</font></th>\n              </tr>\n              {foreach from=$lineItem item=value key=priceset name=pricevalue}\n                {if $smarty.foreach.pricevalue.index eq 0}\n                  <tr><td colspan=\"5\"><hr size=\"3\" style=\"color:#000;\"></hr></td></tr>\n                {else}\n                  <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n                {/if}\n                <tr>\n                  <td style =\"text-align:left;\"  >\n                    <font size=\"1\">\n                      {if $value.html_type eq \'Text\'}\n                        {$value.label}\n                      {else}\n                        {$value.field_title} - {$value.label}\n                      {/if}\n                      {if $value.description}\n                        <div>{$value.description|truncate:30:\"...\"}</div>\n                      {/if}\n                   </font>\n                  </td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.qty}</font></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.unit_price|crmMoney:$currency}</font></td>\n                  {if $value.tax_amount != \'\'}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.tax_rate}%</font></td>\n                  {else}\n                    <td style=\"padding-left:28px;text-align:right\"><font size=\"1\">{ts 1=$taxTerm}No %1{/ts}</font></td>\n                  {/if}\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.subTotal|crmMoney:$currency}</font></td>\n                </tr>\n              {/foreach}\n              <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts}Sub Total{/ts}</font></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$subTotal|crmMoney:$currency}</font></td>\n              </tr>\n              {foreach from=$dataArray item=value key=priceset}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  {if $priceset}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts 1=$taxTerm 2=$priceset}TOTAL %1 %2%{/ts}</font></td>\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                  {elseif $priceset == 0}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts 1=$taxTerm}TOTAL NO %1{/ts}</font></td>\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                </tr>\n                {/if}\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td colspan=\"2\"><hr></hr></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{ts 1=$defaultCurrency}TOTAL %1{/ts}</font></b></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n              {if $is_pay_later == 0}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts}LESS Credit to invoice(s){/ts}</font></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td colspan=\"2\"><hr></hr></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{ts}REMAINING CREDIT{/ts}</font></b></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{$amountDue|crmMoney:$currency}</font></b></td>\n                  <td style=\"padding-left:28px;\"><font size=\"1\" align=\"right\"></font></td>\n                </tr>\n              {/if}\n              <br/><br/><br/>\n              <tr>\n                <td colspan=\"3\"></td>\n              </tr>\n              <tr>\n                <td></td>\n                <td colspan=\"3\"></td>\n              </tr>\n            </table>\n          </td>\n        </tr>\n      </table>\n\n      <table width=\"100%\" style=\"margin-top:5px;padding-right:45px;\">\n        <tr>\n          <td><img src=\"{$resourceBase}/i/contribute/cut_line.png\" height=\"15\" width=\"100%\"></td>\n        </tr>\n      </table>\n\n      <table style=\"margin-top:6px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\" id=\"desc\">\n        <tr>\n          <td width=\"60%\"><font size=\"4\" align=\"right\"><b>{ts}CREDIT ADVICE{/ts}</b><br/><br /><div style=\"font-size:10px;max-width:300px;\">{ts}Please do not pay on this advice. Deduct the amount of this Credit Note from your next payment to us{/ts}</div><br/></font></td>\n          <td width=\"40%\">\n            <table align=\"right\">\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Customer:{/ts}</font></td>\n                <td><font size=\"1\" align=\"right\">{$display_name}</font></td>\n              </tr>\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Credit Note#:{/ts}</font></td>\n                <td><font size=\"1\" align=\"right\">{$creditnote_id}</font></td>\n              </tr>\n              <tr><td colspan=\"5\"style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Credit Amount:{/ts}</font></td>\n                <td width=\'50px\'><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n            </table>\n          </td>\n        </tr>\n      </table>\n    {/if}\n    </center>\n\n  </div>\n  </body>\n</html>\n',1,824,'contribution_invoice_receipt',0,1,0,NULL),(11,'Contributions - Recurring Start and End Notification','{ts}Recurring Contribution Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $recur_txnType eq \'START\'}\n{if $auto_renew_membership}\n{ts}Thanks for your auto renew membership sign-up.{/ts}\n\n\n{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This membership will be automatically renewed every %1 %2(s).{/ts}\n\n{if $cancelSubscriptionUrl}\n{ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n{else}\n{ts}Thanks for your recurring contribution sign-up.{/ts}\n\n\n{ts 1=$recur_frequency_interval 2=$recur_frequency_unit 3=$recur_installments}This recurring contribution will be automatically processed every %1 %2(s){/ts}{if $recur_installments } {ts 1=$recur_installments} for a total of %1 installment(s){/ts}{/if}.\n\n{ts}Start Date{/ts}:  {$recur_start_date|crmDate}\n\n{if $cancelSubscriptionUrl}\n{ts 1=$cancelSubscriptionUrl}You can cancel the recurring contribution option by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionUrl}\n{ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n{/if}\n\n{elseif $recur_txnType eq \'END\'}\n{if $auto_renew_membership}\n{ts}Your auto renew membership sign-up has ended and your membership will not be automatically renewed.{/ts}\n\n\n{else}\n{ts}Your recurring contribution term has ended.{/ts}\n\n\n{ts 1=$recur_installments}You have successfully completed %1 recurring contributions. Thank you.{/ts}\n\n\n==================================================\n{ts 1=$recur_installments}Interval of Subscription for %1 installment(s){/ts}\n\n==================================================\n{ts}Start Date{/ts}: {$recur_start_date|crmDate}\n\n{ts}End Date{/ts}: {$recur_end_date|crmDate}\n\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n   </td>\n  </tr>\n\n  <tr>\n   <td>&nbsp;</td>\n  </tr>\n\n    {if $recur_txnType eq \'START\'}\n     {if $auto_renew_membership}\n       <tr>\n        <td>\n         <p>{ts}Thanks for your auto renew membership sign-up.{/ts}</p>\n         <p>{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This membership will be automatically renewed every %1 %2(s). {/ts}</p>\n        </td>\n       </tr>\n       {if $cancelSubscriptionUrl}\n       <tr>\n         <td {$labelStyle}>\n           {ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n         </td>\n       </tr>\n       {/if}\n       {if $updateSubscriptionBillingUrl}\n         <tr>\n          <td {$labelStyle}>\n           {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n         </tr>\n       {/if}\n     {else}\n      <tr>\n       <td>\n        <p>{ts}Thanks for your recurring contribution sign-up.{/ts}</p>\n        <p>{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This recurring contribution will be automatically processed every %1 %2(s){/ts}{if $recur_installments }{ts 1=$recur_installments} for a total of %1 installment(s){/ts}{/if}.</p>\n        <p>{ts}Start Date{/ts}: {$recur_start_date|crmDate}</p>\n       </td>\n      </tr>\n      {if $cancelSubscriptionUrl}\n      <tr>\n        <td {$labelStyle}>\n          {ts 1=$cancelSubscriptionUrl} You can cancel the recurring contribution option by <a href=\"%1\">visiting this web page</a>.{/ts}\n        </td>\n      </tr>\n      {/if}\n      {if $updateSubscriptionBillingUrl}\n        <tr>\n          <td {$labelStyle}>\n            {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n      {if $updateSubscriptionUrl}\n      <tr>\n        <td {$labelStyle}>\n          {ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n        </td>\n      </tr>\n      {/if}\n     {/if}\n\n    {elseif $recur_txnType eq \'END\'}\n\n     {if $auto_renew_membership}\n      <tr>\n       <td>\n        <p>{ts}Your auto renew membership sign-up has ended and your membership will not be automatically renewed.{/ts}</p>\n       </td>\n      </tr>\n     {else}\n      <tr>\n       <td>\n        <p>{ts}Your recurring contribution term has ended.{/ts}</p>\n        <p>{ts 1=$recur_installments}You have successfully completed %1 recurring contributions. Thank you.{/ts}</p>\n       </td>\n      </tr>\n      <tr>\n       <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts 1=$recur_installments}Interval of Subscription for %1 installment(s){/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Start Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$recur_start_date|crmDate}\n       </td>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}End Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$recur_end_date|crmDate}\n       </td>\n      </tr>\n     </table>\n       </td>\n      </tr>\n\n     {/if}\n    {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,825,'contribution_recurring_notify',1,0,0,NULL),(12,'Contributions - Recurring Start and End Notification','{ts}Recurring Contribution Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $recur_txnType eq \'START\'}\n{if $auto_renew_membership}\n{ts}Thanks for your auto renew membership sign-up.{/ts}\n\n\n{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This membership will be automatically renewed every %1 %2(s).{/ts}\n\n{if $cancelSubscriptionUrl}\n{ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n{else}\n{ts}Thanks for your recurring contribution sign-up.{/ts}\n\n\n{ts 1=$recur_frequency_interval 2=$recur_frequency_unit 3=$recur_installments}This recurring contribution will be automatically processed every %1 %2(s){/ts}{if $recur_installments } {ts 1=$recur_installments} for a total of %1 installment(s){/ts}{/if}.\n\n{ts}Start Date{/ts}:  {$recur_start_date|crmDate}\n\n{if $cancelSubscriptionUrl}\n{ts 1=$cancelSubscriptionUrl}You can cancel the recurring contribution option by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionUrl}\n{ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n{/if}\n\n{elseif $recur_txnType eq \'END\'}\n{if $auto_renew_membership}\n{ts}Your auto renew membership sign-up has ended and your membership will not be automatically renewed.{/ts}\n\n\n{else}\n{ts}Your recurring contribution term has ended.{/ts}\n\n\n{ts 1=$recur_installments}You have successfully completed %1 recurring contributions. Thank you.{/ts}\n\n\n==================================================\n{ts 1=$recur_installments}Interval of Subscription for %1 installment(s){/ts}\n\n==================================================\n{ts}Start Date{/ts}: {$recur_start_date|crmDate}\n\n{ts}End Date{/ts}: {$recur_end_date|crmDate}\n\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n   </td>\n  </tr>\n\n  <tr>\n   <td>&nbsp;</td>\n  </tr>\n\n    {if $recur_txnType eq \'START\'}\n     {if $auto_renew_membership}\n       <tr>\n        <td>\n         <p>{ts}Thanks for your auto renew membership sign-up.{/ts}</p>\n         <p>{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This membership will be automatically renewed every %1 %2(s). {/ts}</p>\n        </td>\n       </tr>\n       {if $cancelSubscriptionUrl}\n       <tr>\n         <td {$labelStyle}>\n           {ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n         </td>\n       </tr>\n       {/if}\n       {if $updateSubscriptionBillingUrl}\n         <tr>\n          <td {$labelStyle}>\n           {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n         </tr>\n       {/if}\n     {else}\n      <tr>\n       <td>\n        <p>{ts}Thanks for your recurring contribution sign-up.{/ts}</p>\n        <p>{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This recurring contribution will be automatically processed every %1 %2(s){/ts}{if $recur_installments }{ts 1=$recur_installments} for a total of %1 installment(s){/ts}{/if}.</p>\n        <p>{ts}Start Date{/ts}: {$recur_start_date|crmDate}</p>\n       </td>\n      </tr>\n      {if $cancelSubscriptionUrl}\n      <tr>\n        <td {$labelStyle}>\n          {ts 1=$cancelSubscriptionUrl} You can cancel the recurring contribution option by <a href=\"%1\">visiting this web page</a>.{/ts}\n        </td>\n      </tr>\n      {/if}\n      {if $updateSubscriptionBillingUrl}\n        <tr>\n          <td {$labelStyle}>\n            {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n      {if $updateSubscriptionUrl}\n      <tr>\n        <td {$labelStyle}>\n          {ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n        </td>\n      </tr>\n      {/if}\n     {/if}\n\n    {elseif $recur_txnType eq \'END\'}\n\n     {if $auto_renew_membership}\n      <tr>\n       <td>\n        <p>{ts}Your auto renew membership sign-up has ended and your membership will not be automatically renewed.{/ts}</p>\n       </td>\n      </tr>\n     {else}\n      <tr>\n       <td>\n        <p>{ts}Your recurring contribution term has ended.{/ts}</p>\n        <p>{ts 1=$recur_installments}You have successfully completed %1 recurring contributions. Thank you.{/ts}</p>\n       </td>\n      </tr>\n      <tr>\n       <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts 1=$recur_installments}Interval of Subscription for %1 installment(s){/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Start Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$recur_start_date|crmDate}\n       </td>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}End Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$recur_end_date|crmDate}\n       </td>\n      </tr>\n     </table>\n       </td>\n      </tr>\n\n     {/if}\n    {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,825,'contribution_recurring_notify',0,1,0,NULL),(13,'Contributions - Recurring Cancellation Notification','{ts}Recurring Contribution Cancellation Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Your recurring contribution of %1, every %2 %3 has been cancelled as requested.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Your recurring contribution of %1, every %2 %3 has been cancelled as requested.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,826,'contribution_recurring_cancelled',1,0,0,NULL),(14,'Contributions - Recurring Cancellation Notification','{ts}Recurring Contribution Cancellation Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Your recurring contribution of %1, every %2 %3 has been cancelled as requested.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Your recurring contribution of %1, every %2 %3 has been cancelled as requested.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,826,'contribution_recurring_cancelled',0,1,0,NULL),(15,'Contributions - Recurring Billing Updates','{ts}Recurring Contribution Billing Updates{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Billing details for your recurring contribution of %1, every %2 %3 have been updated.{/ts}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Billing details for your recurring contribution of %1, every %2 %3 have been updated.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n    <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n        <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n            {ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n        </td>\n       </tr>\n  </table>\n</center>\n\n</body>\n</html>\n',1,827,'contribution_recurring_billing',1,0,0,NULL),(16,'Contributions - Recurring Billing Updates','{ts}Recurring Contribution Billing Updates{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Billing details for your recurring contribution of %1, every %2 %3 have been updated.{/ts}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Billing details for your recurring contribution of %1, every %2 %3 have been updated.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n    <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n        <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n            {ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n        </td>\n       </tr>\n  </table>\n</center>\n\n</body>\n</html>\n',1,827,'contribution_recurring_billing',0,1,0,NULL),(17,'Contributions - Recurring Updates','{ts}Recurring Contribution Update Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}Your recurring contribution has been updated as requested:{/ts}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Recurring contribution is for %1, every %2 %3(s){/ts}\n{if $installments}{ts 1=$installments} for %1 installments.{/ts}{/if}\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Your recurring contribution has been updated as requested:{/ts}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Recurring contribution is for %1, every %2 %3(s){/ts}{if $installments}{ts 1=$installments} for %1 installments{/ts}{/if}.</p>\n\n    <p>{ts 1=$receipt_from_email}If you have questions please contact us at %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,828,'contribution_recurring_edit',1,0,0,NULL),(18,'Contributions - Recurring Updates','{ts}Recurring Contribution Update Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}Your recurring contribution has been updated as requested:{/ts}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Recurring contribution is for %1, every %2 %3(s){/ts}\n{if $installments}{ts 1=$installments} for %1 installments.{/ts}{/if}\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Your recurring contribution has been updated as requested:{/ts}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Recurring contribution is for %1, every %2 %3(s){/ts}{if $installments}{ts 1=$installments} for %1 installments{/ts}{/if}.</p>\n\n    <p>{ts 1=$receipt_from_email}If you have questions please contact us at %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,828,'contribution_recurring_edit',0,1,0,NULL),(19,'Personal Campaign Pages - Admin Notification','{ts}Personal Campaign Page Notification{/ts} - {contact.display_name}\n','===========================================================\n{ts}Personal Campaign Page Notification{/ts}\n\n===========================================================\n{ts}Action{/ts}: {if $mode EQ \'Update\'}{ts}Updated personal campaign page{/ts}{else}{ts}New personal campaign page{/ts}{/if}\n{ts}Personal Campaign Page Title{/ts}: {$pcpTitle}\n{ts}Current Status{/ts}: {$pcpStatus}\n{capture assign=pcpURL}{crmURL p=\"civicrm/pcp/info\" q=\"reset=1&id=`$pcpId`\" h=0 a=1}{/capture}\n{ts}View Page{/ts}:\n>> {$pcpURL}\n\n{ts}Supporter{/ts}: {$supporterName}\n>> {$supporterUrl}\n\n{ts}Linked to Contribution Page{/ts}: {$contribPageTitle}\n>> {$contribPageUrl}\n\n{ts}Manage Personal Campaign Pages{/ts}:\n>> {$managePCPUrl}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=pcpURL     }{crmURL p=\"civicrm/pcp/info\" q=\"reset=1&id=`$pcpId`\" h=0 a=1}{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Personal Campaign Page Notification{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Action{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {if $mode EQ \'Update\'}\n        {ts}Updated personal campaign page{/ts}\n       {else}\n        {ts}New personal campaign page{/ts}\n       {/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Personal Campaign Page Title{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$pcpTitle}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Current Status{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$pcpStatus}\n      </td>\n     </tr>\n\n     <tr>\n      <td {$labelStyle}>\n       <a href=\"{$pcpURL}\">{ts}View Page{/ts}</a>\n      </td>\n      <td></td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Supporter{/ts}\n      </td>\n      <td {$valueStyle}>\n       <a href=\"{$supporterUrl}\">{$supporterName}</a>\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Linked to Contribution Page{/ts}\n      </td>\n      <td {$valueStyle}>\n       <a href=\"{$contribPageUrl}\">{$contribPageTitle}</a>\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       <a href=\"{$managePCPUrl}\">{ts}Manage Personal Campaign Pages{/ts}</a>\n      </td>\n      <td></td>\n     </tr>\n\n    </table>\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,829,'pcp_notify',1,0,0,NULL),(20,'Personal Campaign Pages - Admin Notification','{ts}Personal Campaign Page Notification{/ts} - {contact.display_name}\n','===========================================================\n{ts}Personal Campaign Page Notification{/ts}\n\n===========================================================\n{ts}Action{/ts}: {if $mode EQ \'Update\'}{ts}Updated personal campaign page{/ts}{else}{ts}New personal campaign page{/ts}{/if}\n{ts}Personal Campaign Page Title{/ts}: {$pcpTitle}\n{ts}Current Status{/ts}: {$pcpStatus}\n{capture assign=pcpURL}{crmURL p=\"civicrm/pcp/info\" q=\"reset=1&id=`$pcpId`\" h=0 a=1}{/capture}\n{ts}View Page{/ts}:\n>> {$pcpURL}\n\n{ts}Supporter{/ts}: {$supporterName}\n>> {$supporterUrl}\n\n{ts}Linked to Contribution Page{/ts}: {$contribPageTitle}\n>> {$contribPageUrl}\n\n{ts}Manage Personal Campaign Pages{/ts}:\n>> {$managePCPUrl}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=pcpURL     }{crmURL p=\"civicrm/pcp/info\" q=\"reset=1&id=`$pcpId`\" h=0 a=1}{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Personal Campaign Page Notification{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Action{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {if $mode EQ \'Update\'}\n        {ts}Updated personal campaign page{/ts}\n       {else}\n        {ts}New personal campaign page{/ts}\n       {/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Personal Campaign Page Title{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$pcpTitle}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Current Status{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$pcpStatus}\n      </td>\n     </tr>\n\n     <tr>\n      <td {$labelStyle}>\n       <a href=\"{$pcpURL}\">{ts}View Page{/ts}</a>\n      </td>\n      <td></td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Supporter{/ts}\n      </td>\n      <td {$valueStyle}>\n       <a href=\"{$supporterUrl}\">{$supporterName}</a>\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Linked to Contribution Page{/ts}\n      </td>\n      <td {$valueStyle}>\n       <a href=\"{$contribPageUrl}\">{$contribPageTitle}</a>\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       <a href=\"{$managePCPUrl}\">{ts}Manage Personal Campaign Pages{/ts}</a>\n      </td>\n      <td></td>\n     </tr>\n\n    </table>\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,829,'pcp_notify',0,1,0,NULL),(21,'Personal Campaign Pages - Supporter Status Change Notification','{ts 1=$contribPageTitle}Your Personal Campaign Page for %1{/ts} - {contact.display_name}\n','{if $pcpStatus eq \'Approved\'}\n============================\n{ts}Your Personal Campaign Page{/ts}\n\n============================\n\n{ts}Your personal campaign page has been approved and is now live.{/ts}\n\n{ts}Whenever you want to preview, update or promote your page{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser to go to your page{/ts}:\n{$pcpInfoURL}\n\n{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}\n\n{if $isTellFriendEnabled}\n\n{ts}After logging in, you can use this form to promote your fundraising page{/ts}:\n{$pcpTellFriendURL}\n\n{/if}\n\n{if $pcpNotifyEmailAddress}\n{ts}Questions? Send email to{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n\n{* Rejected message *}\n{elseif $pcpStatus eq \'Not Approved\'}\n============================\n{ts}Your Personal Campaign Page{/ts}\n\n============================\n\n{ts}Your personal campaign page has been reviewed. There were some issues with the content which prevented us from approving the page. We are sorry for any inconvenience.{/ts}\n\n{if $pcpNotifyEmailAddress}\n\n{ts}Please contact our site administrator for more information{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n\n    <h1>{ts}Your Personal Campaign Page{/ts}</h1>\n\n    {if $pcpStatus eq \'Approved\'}\n\n     <p>{ts}Your personal campaign page has been approved and is now live.{/ts}</p>\n     <p>{ts}Whenever you want to preview, update or promote your page{/ts}:</p>\n     <ol>\n      <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n      <li><a href=\"{$pcpInfoURL}\">{ts}Go to your page{/ts}</a></li>\n     </ol>\n     <p>{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}</p>\n\n     {if $isTellFriendEnabled}\n      <p><a href=\"{$pcpTellFriendURL}\">{ts}After logging in, you can use this form to promote your fundraising page{/ts}</a></p>\n     {/if}\n\n     {if $pcpNotifyEmailAddress}\n      <p>{ts}Questions? Send email to{/ts}: {$pcpNotifyEmailAddress}</p>\n     {/if}\n\n    {elseif $pcpStatus eq \'Not Approved\'}\n\n     <p>{ts}Your personal campaign page has been reviewed. There were some issues with the content which prevented us from approving the page. We are sorry for any inconvenience.{/ts}</p>\n     {if $pcpNotifyEmailAddress}\n      <p>{ts}Please contact our site administrator for more information{/ts}: {$pcpNotifyEmailAddress}</p>\n     {/if}\n\n    {/if}\n\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,830,'pcp_status_change',1,0,0,NULL),(22,'Personal Campaign Pages - Supporter Status Change Notification','{ts 1=$contribPageTitle}Your Personal Campaign Page for %1{/ts} - {contact.display_name}\n','{if $pcpStatus eq \'Approved\'}\n============================\n{ts}Your Personal Campaign Page{/ts}\n\n============================\n\n{ts}Your personal campaign page has been approved and is now live.{/ts}\n\n{ts}Whenever you want to preview, update or promote your page{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser to go to your page{/ts}:\n{$pcpInfoURL}\n\n{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}\n\n{if $isTellFriendEnabled}\n\n{ts}After logging in, you can use this form to promote your fundraising page{/ts}:\n{$pcpTellFriendURL}\n\n{/if}\n\n{if $pcpNotifyEmailAddress}\n{ts}Questions? Send email to{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n\n{* Rejected message *}\n{elseif $pcpStatus eq \'Not Approved\'}\n============================\n{ts}Your Personal Campaign Page{/ts}\n\n============================\n\n{ts}Your personal campaign page has been reviewed. There were some issues with the content which prevented us from approving the page. We are sorry for any inconvenience.{/ts}\n\n{if $pcpNotifyEmailAddress}\n\n{ts}Please contact our site administrator for more information{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n\n    <h1>{ts}Your Personal Campaign Page{/ts}</h1>\n\n    {if $pcpStatus eq \'Approved\'}\n\n     <p>{ts}Your personal campaign page has been approved and is now live.{/ts}</p>\n     <p>{ts}Whenever you want to preview, update or promote your page{/ts}:</p>\n     <ol>\n      <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n      <li><a href=\"{$pcpInfoURL}\">{ts}Go to your page{/ts}</a></li>\n     </ol>\n     <p>{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}</p>\n\n     {if $isTellFriendEnabled}\n      <p><a href=\"{$pcpTellFriendURL}\">{ts}After logging in, you can use this form to promote your fundraising page{/ts}</a></p>\n     {/if}\n\n     {if $pcpNotifyEmailAddress}\n      <p>{ts}Questions? Send email to{/ts}: {$pcpNotifyEmailAddress}</p>\n     {/if}\n\n    {elseif $pcpStatus eq \'Not Approved\'}\n\n     <p>{ts}Your personal campaign page has been reviewed. There were some issues with the content which prevented us from approving the page. We are sorry for any inconvenience.{/ts}</p>\n     {if $pcpNotifyEmailAddress}\n      <p>{ts}Please contact our site administrator for more information{/ts}: {$pcpNotifyEmailAddress}</p>\n     {/if}\n\n    {/if}\n\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,830,'pcp_status_change',0,1,0,NULL),(23,'Personal Campaign Pages - Supporter Welcome','{ts 1=$contribPageTitle}Your Personal Campaign Page for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=\"$contribPageTitle\"}Thanks for creating a personal campaign page in support of %1.{/ts}\n\n{if $pcpStatus eq \'Approved\'}\n====================\n{ts}Promoting Your Page{/ts}\n\n====================\n{if $isTellFriendEnabled}\n\n{ts}You can begin your fundraising efforts using our \"Tell a Friend\" form{/ts}:\n\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser and follow the prompts{/ts}:\n{$pcpTellFriendURL}\n{else}\n\n{ts}Send email to family, friends and colleagues with a personal message about this campaign.{/ts}\n{ts}Include this link to your fundraising page in your emails{/ts}:\n{$pcpInfoURL}\n{/if}\n\n===================\n{ts}Managing Your Page{/ts}\n\n===================\n{ts}Whenever you want to preview, update or promote your page{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser to go to your page{/ts}:\n{$pcpInfoURL}\n\n{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}\n\n\n{elseif $pcpStatus EQ \'Waiting Review\'}\n{ts}Your page requires administrator review before you can begin your fundraising efforts.{/ts}\n\n\n{ts}A notification email has been sent to the site administrator, and you will receive another notification from them as soon as the review process is complete.{/ts}\n\n\n{ts}You can still preview your page prior to approval{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser{/ts}:\n{$pcpInfoURL}\n\n{/if}\n{if $pcpNotifyEmailAddress}\n{ts}Questions? Send email to{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=\"$contribPageTitle\"}Thanks for creating a personal campaign page in support of %1.{/ts}</p>\n   </td>\n  </tr>\n\n  {if $pcpStatus eq \'Approved\'}\n\n    <tr>\n     <td>\n      <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n       <tr>\n        <th {$headerStyle}>\n         {ts}Promoting Your Page{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {if $isTellFriendEnabled}\n          <p>{ts}You can begin your fundraising efforts using our \"Tell a Friend\" form{/ts}:</p>\n          <ol>\n           <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n           <li><a href=\"{$pcpTellFriendURL}\">{ts}Click this link and follow the prompts{/ts}</a></li>\n          </ol>\n         {else}\n          <p>{ts}Send email to family, friends and colleagues with a personal message about this campaign.{/ts} {ts}Include this link to your fundraising page in your emails{/ts}: {$pcpInfoURL}</p>\n         {/if}\n        </td>\n       </tr>\n       <tr>\n        <th {$headerStyle}>\n         {ts}Managing Your Page{/ts}\n        </th>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}Whenever you want to preview, update or promote your page{/ts}:</p>\n         <ol>\n          <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n          <li><a href=\"{$pcpInfoURL}\">{ts}Go to your page{/ts}</a></li>\n         </ol>\n         <p>{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}</p>\n        </td>\n       </tr>\n       </tr>\n      </table>\n     </td>\n    </tr>\n\n   {elseif $pcpStatus EQ \'Waiting Review\'}\n\n    <tr>\n     <td>\n      <p>{ts}Your page requires administrator review before you can begin your fundraising efforts.{/ts}</p>\n      <p>{ts}A notification email has been sent to the site administrator, and you will receive another notification from them as soon as the review process is complete.{/ts}</p>\n      <p>{ts}You can still preview your page prior to approval{/ts}:</p>\n      <ol>\n       <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n       <li><a href=\"{$pcpInfoURL}\">{ts}Click this link{/ts}</a></li>\n      </ol>\n     </td>\n    </tr>\n\n   {/if}\n\n   {if $pcpNotifyEmailAddress}\n    <tr>\n     <td>\n      <p>{ts}Questions? Send email to{/ts}: {$pcpNotifyEmailAddress}</p>\n     </td>\n    </tr>\n   {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,831,'pcp_supporter_notify',1,0,0,NULL),(24,'Personal Campaign Pages - Supporter Welcome','{ts 1=$contribPageTitle}Your Personal Campaign Page for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=\"$contribPageTitle\"}Thanks for creating a personal campaign page in support of %1.{/ts}\n\n{if $pcpStatus eq \'Approved\'}\n====================\n{ts}Promoting Your Page{/ts}\n\n====================\n{if $isTellFriendEnabled}\n\n{ts}You can begin your fundraising efforts using our \"Tell a Friend\" form{/ts}:\n\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser and follow the prompts{/ts}:\n{$pcpTellFriendURL}\n{else}\n\n{ts}Send email to family, friends and colleagues with a personal message about this campaign.{/ts}\n{ts}Include this link to your fundraising page in your emails{/ts}:\n{$pcpInfoURL}\n{/if}\n\n===================\n{ts}Managing Your Page{/ts}\n\n===================\n{ts}Whenever you want to preview, update or promote your page{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser to go to your page{/ts}:\n{$pcpInfoURL}\n\n{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}\n\n\n{elseif $pcpStatus EQ \'Waiting Review\'}\n{ts}Your page requires administrator review before you can begin your fundraising efforts.{/ts}\n\n\n{ts}A notification email has been sent to the site administrator, and you will receive another notification from them as soon as the review process is complete.{/ts}\n\n\n{ts}You can still preview your page prior to approval{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser{/ts}:\n{$pcpInfoURL}\n\n{/if}\n{if $pcpNotifyEmailAddress}\n{ts}Questions? Send email to{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=\"$contribPageTitle\"}Thanks for creating a personal campaign page in support of %1.{/ts}</p>\n   </td>\n  </tr>\n\n  {if $pcpStatus eq \'Approved\'}\n\n    <tr>\n     <td>\n      <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n       <tr>\n        <th {$headerStyle}>\n         {ts}Promoting Your Page{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {if $isTellFriendEnabled}\n          <p>{ts}You can begin your fundraising efforts using our \"Tell a Friend\" form{/ts}:</p>\n          <ol>\n           <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n           <li><a href=\"{$pcpTellFriendURL}\">{ts}Click this link and follow the prompts{/ts}</a></li>\n          </ol>\n         {else}\n          <p>{ts}Send email to family, friends and colleagues with a personal message about this campaign.{/ts} {ts}Include this link to your fundraising page in your emails{/ts}: {$pcpInfoURL}</p>\n         {/if}\n        </td>\n       </tr>\n       <tr>\n        <th {$headerStyle}>\n         {ts}Managing Your Page{/ts}\n        </th>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}Whenever you want to preview, update or promote your page{/ts}:</p>\n         <ol>\n          <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n          <li><a href=\"{$pcpInfoURL}\">{ts}Go to your page{/ts}</a></li>\n         </ol>\n         <p>{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}</p>\n        </td>\n       </tr>\n       </tr>\n      </table>\n     </td>\n    </tr>\n\n   {elseif $pcpStatus EQ \'Waiting Review\'}\n\n    <tr>\n     <td>\n      <p>{ts}Your page requires administrator review before you can begin your fundraising efforts.{/ts}</p>\n      <p>{ts}A notification email has been sent to the site administrator, and you will receive another notification from them as soon as the review process is complete.{/ts}</p>\n      <p>{ts}You can still preview your page prior to approval{/ts}:</p>\n      <ol>\n       <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n       <li><a href=\"{$pcpInfoURL}\">{ts}Click this link{/ts}</a></li>\n      </ol>\n     </td>\n    </tr>\n\n   {/if}\n\n   {if $pcpNotifyEmailAddress}\n    <tr>\n     <td>\n      <p>{ts}Questions? Send email to{/ts}: {$pcpNotifyEmailAddress}</p>\n     </td>\n    </tr>\n   {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,831,'pcp_supporter_notify',0,1,0,NULL),(25,'Personal Campaign Pages - Owner Notification','{ts}Someone has just donated to your personal campaign page{/ts} - {contact.display_name}\n','===========================================================\n{ts}Personal Campaign Page Owner Notification{/ts}\n\n===========================================================\n{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}You have received a donation at your personal page{/ts}: {$page_title}\n>> {$pcpInfoURL}\n\n{ts}Your fundraising total has been updated.{/ts}\n{ts}The donor\'s information is listed below.  You can choose to contact them and convey your thanks if you wish.{/ts}\n{if $is_honor_roll_enabled}\n    {ts}The donor\'s name has been added to your honor roll unless they asked not to be included.{/ts}\n{/if}\n\n{ts}Received{/ts}: {$receive_date|crmDate}\n\n{ts}Amount{/ts}: {$total_amount|crmMoney:$currency}\n\n{ts}Name{/ts}: {$donors_display_name}\n\n{ts}Email{/ts}: {$donors_email}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n  {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n  <p>{ts}You have received a donation at your personal page{/ts}: <a href=\"{$pcpInfoURL}\">{$page_title}</a></p>\n  <p>{ts}Your fundraising total has been updated.{/ts}<br/>\n    {ts}The donor\'s information is listed below.  You can choose to contact them and convey your thanks if you wish.{/ts} <br/>\n    {if $is_honor_roll_enabled}\n      {ts}The donor\'s name has been added to your honor roll unless they asked not to be included.{/ts}<br/>\n    {/if}\n  </p>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n    <tr><td>{ts}Received{/ts}:</td><td> {$receive_date|crmDate}</td></tr>\n    <tr><td>{ts}Amount{/ts}:</td><td> {$total_amount|crmMoney:$currency}</td></tr>\n    <tr><td>{ts}Name{/ts}:</td><td> {$donors_display_name}</td></tr>\n    <tr><td>{ts}Email{/ts}:</td><td> {$donors_email}</td></tr>\n  </table>\n</body>\n</html>\n',1,832,'pcp_owner_notify',1,0,0,NULL),(26,'Personal Campaign Pages - Owner Notification','{ts}Someone has just donated to your personal campaign page{/ts} - {contact.display_name}\n','===========================================================\n{ts}Personal Campaign Page Owner Notification{/ts}\n\n===========================================================\n{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}You have received a donation at your personal page{/ts}: {$page_title}\n>> {$pcpInfoURL}\n\n{ts}Your fundraising total has been updated.{/ts}\n{ts}The donor\'s information is listed below.  You can choose to contact them and convey your thanks if you wish.{/ts}\n{if $is_honor_roll_enabled}\n    {ts}The donor\'s name has been added to your honor roll unless they asked not to be included.{/ts}\n{/if}\n\n{ts}Received{/ts}: {$receive_date|crmDate}\n\n{ts}Amount{/ts}: {$total_amount|crmMoney:$currency}\n\n{ts}Name{/ts}: {$donors_display_name}\n\n{ts}Email{/ts}: {$donors_email}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n  {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n  <p>{ts}You have received a donation at your personal page{/ts}: <a href=\"{$pcpInfoURL}\">{$page_title}</a></p>\n  <p>{ts}Your fundraising total has been updated.{/ts}<br/>\n    {ts}The donor\'s information is listed below.  You can choose to contact them and convey your thanks if you wish.{/ts} <br/>\n    {if $is_honor_roll_enabled}\n      {ts}The donor\'s name has been added to your honor roll unless they asked not to be included.{/ts}<br/>\n    {/if}\n  </p>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n    <tr><td>{ts}Received{/ts}:</td><td> {$receive_date|crmDate}</td></tr>\n    <tr><td>{ts}Amount{/ts}:</td><td> {$total_amount|crmMoney:$currency}</td></tr>\n    <tr><td>{ts}Name{/ts}:</td><td> {$donors_display_name}</td></tr>\n    <tr><td>{ts}Email{/ts}:</td><td> {$donors_email}</td></tr>\n  </table>\n</body>\n</html>\n',1,832,'pcp_owner_notify',0,1,0,NULL),(27,'Additional Payment Receipt or Refund Notification','{if $isRefund}{ts}Refund Notification{/ts}{else}{ts}Payment Receipt{/ts}{/if}{if $component eq \'event\'} - {$event.title}{/if} - {contact.display_name}\n','{if $emailGreeting}{$emailGreeting},\n{/if}\n\n{if $isRefund}\n{ts}A refund has been issued based on changes in your registration selections.{/ts}\n{else}\n{ts}Below you will find a receipt for this payment.{/ts}\n{/if}\n{if $paymentsComplete}\n{ts}Thank you for completing this payment.{/ts}\n{/if}\n\n{if $isRefund}\n===============================================================================\n\n{ts}Refund Details{/ts}\n\n===============================================================================\n{ts}This Refund Amount{/ts}: {$refundAmount|crmMoney}\n------------------------------------------------------------------------------------\n\n{else}\n===============================================================================\n\n{ts}Payment Details{/ts}\n\n===============================================================================\n{ts}This Payment Amount{/ts}: {$paymentAmount|crmMoney}\n------------------------------------------------------------------------------------\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n\n===============================================================================\n\n{ts}Contribution Details{/ts}\n\n===============================================================================\n{ts}Total Fee{/ts}: {$totalAmount|crmMoney}\n{ts}Total Paid{/ts}: {$totalPaid|crmMoney}\n{ts}Balance Owed{/ts}: {$amountOwed|crmMoney} {* This will be zero after final payment. *}\n\n\n{if $billingName || $address}\n\n===============================================================================\n\n{ts}Billing Name and Address{/ts}\n\n===============================================================================\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_number}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===============================================================================\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{if $component eq \'event\'}\n===============================================================================\n\n{ts}Event Information and Location{/ts}\n\n===============================================================================\n\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{if $event.participant_role}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=emptyBlockStyle }style=\"padding: 10px; border-bottom: 1px solid #999;background-color: #f7f7f7;\"{/capture}\n{capture assign=emptyBlockValueStyle }style=\"padding: 10px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n  <tr>\n    <td>\n      {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n      {if $isRefund}\n        <p>{ts}A refund has been issued based on changes in your registration selections.{/ts}</p>\n      {else}\n        <p>{ts}Below you will find a receipt for this payment.{/ts}</p>\n        {if $paymentsComplete}\n          <p>{ts}Thank you for completing this contribution.{/ts}</p>\n        {/if}\n      {/if}\n    </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n    {if $isRefund}\n      <tr>\n        <th {$headerStyle}>{ts}Refund Details{/ts}</th>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n        {ts}This Refund Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$refundAmount|crmMoney}\n        </td>\n      </tr>\n    {else}\n      <tr>\n        <th {$headerStyle}>{ts}Payment Details{/ts}</th>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n        {ts}This Payment Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$paymentAmount|crmMoney}\n        </td>\n      </tr>\n    {/if}\n    {if $receive_date}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Transaction Date{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$receive_date|crmDate}\n        </td>\n      </tr>\n    {/if}\n    {if $trxn_id}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$trxn_id}\n        </td>\n      </tr>\n    {/if}\n    {if $paidBy}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Paid By{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$paidBy}\n        </td>\n      </tr>\n    {/if}\n    {if $checkNumber}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Check Number{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$checkNumber}\n        </td>\n      </tr>\n    {/if}\n\n  <tr>\n    <th {$headerStyle}>{ts}Contribution Details{/ts}</th>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Total Fee{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$totalAmount|crmMoney}\n    </td>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Total Paid{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$totalPaid|crmMoney}\n    </td>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Balance Owed{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$amountOwed|crmMoney}\n    </td> {* This will be zero after final payment. *}\n  </tr>\n  </table>\n\n  </td>\n  </tr>\n    <tr>\n      <td>\n  <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n    {if $billingName || $address}\n          <tr>\n            <th {$headerStyle}>\n        {ts}Billing Name and Address{/ts}\n            </th>\n          </tr>\n          <tr>\n            <td colspan=\"2\" {$valueStyle}>\n        {$billingName}<br />\n        {$address|nl2br}\n            </td>\n          </tr>\n    {/if}\n    {if $credit_card_number}\n          <tr>\n            <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n            </th>\n          </tr>\n          <tr>\n            <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires:{/ts} {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n            </td>\n          </tr>\n    {/if}\n    {if $component eq \'event\'}\n    <tr>\n      <th {$headerStyle}>\n        {ts}Event Information and Location{/ts}\n      </th>\n    </tr>\n    <tr>\n      <td colspan=\"2\" {$valueStyle}>\n         {$event.event_title}<br />\n        {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n    </tr>\n\n    {if $event.participant_role}\n    <tr>\n      <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n      </td>\n      <td {$valueStyle}>\n        {$event.participant_role}\n      </td>\n    </tr>\n    {/if}\n\n    {if $isShowLocation}\n    <tr>\n      <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n      </td>\n    </tr>\n    {/if}\n\n    {if $location.phone.1.phone || $location.email.1.email}\n    <tr>\n      <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n      </td>\n    </tr>\n    {foreach from=$location.phone item=phone}\n    {if $phone.phone}\n          <tr>\n            <td {$labelStyle}>\n        {if $phone.phone_type}\n        {$phone.phone_type_display}\n        {else}\n        {ts}Phone{/ts}\n        {/if}\n            </td>\n            <td {$valueStyle}>\n        {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n            </td>\n          </tr>\n    {/if}\n    {/foreach}\n    {foreach from=$location.email item=eventEmail}\n    {if $eventEmail.email}\n          <tr>\n            <td {$labelStyle}>\n        {ts}Email{/ts}\n            </td>\n            <td {$valueStyle}>\n        {$eventEmail.email}\n            </td>\n          </tr>\n    {/if}\n    {/foreach}\n    {/if} {*phone block close*}\n    {/if}\n  </table>\n      </td>\n    </tr>\n\n    </table>\n  </center>\n\n </body>\n</html>\n',1,833,'payment_or_refund_notification',1,0,0,NULL),(28,'Additional Payment Receipt or Refund Notification','{if $isRefund}{ts}Refund Notification{/ts}{else}{ts}Payment Receipt{/ts}{/if}{if $component eq \'event\'} - {$event.title}{/if} - {contact.display_name}\n','{if $emailGreeting}{$emailGreeting},\n{/if}\n\n{if $isRefund}\n{ts}A refund has been issued based on changes in your registration selections.{/ts}\n{else}\n{ts}Below you will find a receipt for this payment.{/ts}\n{/if}\n{if $paymentsComplete}\n{ts}Thank you for completing this payment.{/ts}\n{/if}\n\n{if $isRefund}\n===============================================================================\n\n{ts}Refund Details{/ts}\n\n===============================================================================\n{ts}This Refund Amount{/ts}: {$refundAmount|crmMoney}\n------------------------------------------------------------------------------------\n\n{else}\n===============================================================================\n\n{ts}Payment Details{/ts}\n\n===============================================================================\n{ts}This Payment Amount{/ts}: {$paymentAmount|crmMoney}\n------------------------------------------------------------------------------------\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n\n===============================================================================\n\n{ts}Contribution Details{/ts}\n\n===============================================================================\n{ts}Total Fee{/ts}: {$totalAmount|crmMoney}\n{ts}Total Paid{/ts}: {$totalPaid|crmMoney}\n{ts}Balance Owed{/ts}: {$amountOwed|crmMoney} {* This will be zero after final payment. *}\n\n\n{if $billingName || $address}\n\n===============================================================================\n\n{ts}Billing Name and Address{/ts}\n\n===============================================================================\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_number}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===============================================================================\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{if $component eq \'event\'}\n===============================================================================\n\n{ts}Event Information and Location{/ts}\n\n===============================================================================\n\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{if $event.participant_role}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=emptyBlockStyle }style=\"padding: 10px; border-bottom: 1px solid #999;background-color: #f7f7f7;\"{/capture}\n{capture assign=emptyBlockValueStyle }style=\"padding: 10px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n  <tr>\n    <td>\n      {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n      {if $isRefund}\n        <p>{ts}A refund has been issued based on changes in your registration selections.{/ts}</p>\n      {else}\n        <p>{ts}Below you will find a receipt for this payment.{/ts}</p>\n        {if $paymentsComplete}\n          <p>{ts}Thank you for completing this contribution.{/ts}</p>\n        {/if}\n      {/if}\n    </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n    {if $isRefund}\n      <tr>\n        <th {$headerStyle}>{ts}Refund Details{/ts}</th>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n        {ts}This Refund Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$refundAmount|crmMoney}\n        </td>\n      </tr>\n    {else}\n      <tr>\n        <th {$headerStyle}>{ts}Payment Details{/ts}</th>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n        {ts}This Payment Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$paymentAmount|crmMoney}\n        </td>\n      </tr>\n    {/if}\n    {if $receive_date}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Transaction Date{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$receive_date|crmDate}\n        </td>\n      </tr>\n    {/if}\n    {if $trxn_id}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$trxn_id}\n        </td>\n      </tr>\n    {/if}\n    {if $paidBy}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Paid By{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$paidBy}\n        </td>\n      </tr>\n    {/if}\n    {if $checkNumber}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Check Number{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$checkNumber}\n        </td>\n      </tr>\n    {/if}\n\n  <tr>\n    <th {$headerStyle}>{ts}Contribution Details{/ts}</th>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Total Fee{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$totalAmount|crmMoney}\n    </td>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Total Paid{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$totalPaid|crmMoney}\n    </td>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Balance Owed{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$amountOwed|crmMoney}\n    </td> {* This will be zero after final payment. *}\n  </tr>\n  </table>\n\n  </td>\n  </tr>\n    <tr>\n      <td>\n  <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n    {if $billingName || $address}\n          <tr>\n            <th {$headerStyle}>\n        {ts}Billing Name and Address{/ts}\n            </th>\n          </tr>\n          <tr>\n            <td colspan=\"2\" {$valueStyle}>\n        {$billingName}<br />\n        {$address|nl2br}\n            </td>\n          </tr>\n    {/if}\n    {if $credit_card_number}\n          <tr>\n            <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n            </th>\n          </tr>\n          <tr>\n            <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires:{/ts} {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n            </td>\n          </tr>\n    {/if}\n    {if $component eq \'event\'}\n    <tr>\n      <th {$headerStyle}>\n        {ts}Event Information and Location{/ts}\n      </th>\n    </tr>\n    <tr>\n      <td colspan=\"2\" {$valueStyle}>\n         {$event.event_title}<br />\n        {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n    </tr>\n\n    {if $event.participant_role}\n    <tr>\n      <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n      </td>\n      <td {$valueStyle}>\n        {$event.participant_role}\n      </td>\n    </tr>\n    {/if}\n\n    {if $isShowLocation}\n    <tr>\n      <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n      </td>\n    </tr>\n    {/if}\n\n    {if $location.phone.1.phone || $location.email.1.email}\n    <tr>\n      <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n      </td>\n    </tr>\n    {foreach from=$location.phone item=phone}\n    {if $phone.phone}\n          <tr>\n            <td {$labelStyle}>\n        {if $phone.phone_type}\n        {$phone.phone_type_display}\n        {else}\n        {ts}Phone{/ts}\n        {/if}\n            </td>\n            <td {$valueStyle}>\n        {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n            </td>\n          </tr>\n    {/if}\n    {/foreach}\n    {foreach from=$location.email item=eventEmail}\n    {if $eventEmail.email}\n          <tr>\n            <td {$labelStyle}>\n        {ts}Email{/ts}\n            </td>\n            <td {$valueStyle}>\n        {$eventEmail.email}\n            </td>\n          </tr>\n    {/if}\n    {/foreach}\n    {/if} {*phone block close*}\n    {/if}\n  </table>\n      </td>\n    </tr>\n\n    </table>\n  </center>\n\n </body>\n</html>\n',1,833,'payment_or_refund_notification',0,1,0,NULL),(29,'Events - Registration Confirmation and Receipt (off-line)','{ts}Event Confirmation{/ts} - {$event.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n{$event.confirm_email_text}\n{/if}\n\n{if $isOnWaitlist}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}You have been added to the WAIT LIST for this event.{/ts}\n\n{if $isPrimary}\n{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $isRequireApproval}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Your registration has been submitted.{/ts}\n\n{if $isPrimary}\n{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $is_pay_later}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Event Information and Location{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{if $event.participant_role neq \'Attendee\' and $defaultRole}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $email}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Registered Email{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$email}\n{/if}\n{if $event.is_monetary} {* This section for Paid events only.*}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.fee_label}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{if $lineItem}{foreach from=$lineItem item=value key=priceset}\n\n{if $value neq \'skip\'}\n{if $isPrimary}\n{if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n{ts 1=$priceset+1}Participant %1{/ts}\n{/if}\n{/if}\n---------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{capture assign=ts_participant_total}{if $pricesetFieldsCount }{ts}Total Participants{/ts}{/if}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"} {$ts_participant_total|string_format:\"%10s\"}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{foreach from=$value item=line}\n{if $pricesetFieldsCount }{capture assign=ts_participant_count}{$line.participant_count}{/capture}{/if}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney|string_format:\"%10s\"} {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if}  {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {$ts_participant_count|string_format:\"%10s\"}\n{/foreach}\n{/if}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$totalAmount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n{/if}\n\n{if $amount && !$lineItem}\n{foreach from=$amount item=amnt key=level}{$amnt.amount|crmMoney} {$amnt.label}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{if $isPrimary}\n\n{if $balanceAmount}{ts}Total Paid{/ts}{else}{ts}Total Amount{/ts}{/if}: {$totalAmount|crmMoney} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n\n{if $balanceAmount}\n{ts}Balance{/ts}: {$balanceAmount|crmMoney}\n{/if}\n\n{if $pricesetFieldsCount }\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n        {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n        {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n\n{ts}Total Participants{/ts}: {$count}\n{/if}\n\n{if $is_pay_later }\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$register_date|crmDate}\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $financialTypeName}\n{ts}Financial Type{/ts}: {$financialTypeName}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n{if $billingName}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Billing Name and Address{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n{/if} {* End of conditional section for Paid events *}\n\n{if $customPre}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPre_grouptitle}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPre item=value key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n{$customName}: {$value}\n{/if}\n{/foreach}\n{/if}\n\n{if $customPost}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPost_grouptitle}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPost item=value key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n{$customName}: {$value}\n{/if}\n{/foreach}\n{/if}\n{if $customProfile}\n\n{foreach from=$customProfile item=value key=customName}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts 1=$customName+1}Participant Information - Participant %1{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=val key=field}\n{if $field eq \'additionalCustomPre\' or $field eq \'additionalCustomPost\' }\n{if $field eq \'additionalCustomPre\' }\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$additionalCustomPre_grouptitle}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{else}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$additionalCustomPost_grouptitle}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{/if}\n{foreach from=$val item=v key=f}\n{$f}: {$v}\n{/foreach}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n    {if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n     <p>{$event.confirm_email_text|htmlize}</p>\n    {/if}\n\n    {if $isOnWaitlist}\n     <p>{ts}You have been added to the WAIT LIST for this event.{/ts}</p>\n     {if $isPrimary}\n       <p>{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}</p>\n     {/if}\n    {elseif $isRequireApproval}\n     <p>{ts}Your registration has been submitted.{/ts}</p>\n     {if $isPrimary}\n      <p>{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}</p>\n     {/if}\n    {elseif $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n\n     {if $event.participant_role neq \'Attendee\' and $defaultRole}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$event.participant_role}\n       </td>\n      </tr>\n     {/if}\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $location.phone.1.phone || $location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}\n           {$phone.phone_type_display}\n          {else}\n           {ts}Phone{/ts}\n          {/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n     {if $email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$email}\n       </td>\n      </tr>\n     {/if}\n\n\n     {if $event.is_monetary}\n\n      <tr>\n       <th {$headerStyle}>\n        {$event.fee_label}\n       </th>\n      </tr>\n\n      {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n        {if $value neq \'skip\'}\n         {if $isPrimary}\n          {if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n           <tr>\n            <td colspan=\"2\" {$labelStyle}>\n             {ts 1=$priceset+1}Participant %1{/ts}\n            </td>\n           </tr>\n          {/if}\n         {/if}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Qty{/ts}</th>\n             <th>{ts}Each{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n             {/if}\n             <th>{ts}Total{/ts}</th>\n       {if $pricesetFieldsCount }<th>{ts}Total Participants{/ts}</th>{/if}\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td>\n        {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td>\n               {$line.qty}\n              </td>\n              <td>\n               {$line.unit_price|crmMoney}\n              </td>\n              {if $dataArray}\n               <td>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n              {/if}\n              <td>\n               {$line.line_total+$line.tax_amount|crmMoney}\n              </td>\n        {if  $pricesetFieldsCount }\n        <td>\n    {$line.participant_count}\n              </td>\n        {/if}\n             </tr>\n            {/foreach}\n           </table>\n          </td>\n         </tr>\n        {/if}\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalAmount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n          <tr>\n           {if $priceset || $priceset == 0}\n            <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n            <td>&nbsp;{$value|crmMoney:$currency}</td>\n           {else}\n            <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n            <td>&nbsp;{$value|crmMoney:$currency}</td>\n           {/if}\n          </tr>\n        {/foreach}\n       {/if}\n      {/if}\n\n      {if $amount && !$lineItem}\n       {foreach from=$amount item=amnt key=level}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$amnt.amount|crmMoney} {$amnt.label}\n         </td>\n        </tr>\n       {/foreach}\n      {/if}\n      {if $totalTaxAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalTaxAmount|crmMoney:$currency}\n        </td>\n       </tr>\n      {/if}\n      {if $isPrimary}\n       <tr>\n        <td {$labelStyle}>\n        {if $balanceAmount}\n           {ts}Total Paid{/ts}\n        {else}\n           {ts}Total Amount{/ts}\n         {/if}\n        </td>\n        <td {$valueStyle}>\n         {$totalAmount|crmMoney} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n        </td>\n       </tr>\n      {if $balanceAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Balance{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$balanceAmount|crmMoney}\n        </td>\n       </tr>\n      {/if}\n       {if $pricesetFieldsCount }\n     <tr>\n       <td {$labelStyle}>\n   {ts}Total Participants{/ts}</td>\n       <td {$valueStyle}>\n   {assign var=\"count\" value= 0}\n         {foreach from=$lineItem item=pcount}\n         {assign var=\"lineItemCount\" value=0}\n         {if $pcount neq \'skip\'}\n           {foreach from=$pcount item=p_count}\n           {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n           {/foreach}\n           {if $lineItemCount < 1 }\n           assign var=\"lineItemCount\" value=1}\n           {/if}\n           {assign var=\"count\" value=$count+$lineItemCount}\n         {/if}\n         {/foreach}\n   {$count}\n       </td>\n     </tr>\n     {/if}\n       {if $is_pay_later}\n        <tr>\n         <td colspan=\"2\" {$labelStyle}>\n          {$pay_later_receipt}\n         </td>\n        </tr>\n       {/if}\n\n       {if $register_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Registration Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$register_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $financialTypeName}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$financialTypeName}\n         </td>\n        </tr>\n       {/if}\n\n       {if $trxn_id}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction #{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$trxn_id}\n         </td>\n        </tr>\n       {/if}\n\n       {if $paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n         {$paidBy}\n         </td>\n        </tr>\n       {/if}\n\n       {if $checkNumber}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Check Number{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$checkNumber}\n         </td>\n        </tr>\n       {/if}\n\n       {if $billingName}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Billing Name and Address{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}\n         </td>\n        </tr>\n       {/if}\n\n       {if $credit_card_type}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Credit Card Information{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$credit_card_type}<br />\n          {$credit_card_number}<br />\n          {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n      {/if}\n\n     {/if} {* End of conditional section for Paid events *}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=value key=customName}\n       {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=value key=customName}\n       {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customProfile}\n      {foreach from=$customProfile item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {ts 1=$customName+1}Participant Information - Participant %1{/ts}\n        </th>\n       </tr>\n       {foreach from=$value item=val key=field}\n        {if $field eq \'additionalCustomPre\' or $field eq \'additionalCustomPost\'}\n         <tr>\n          <td colspan=\"2\" {$labelStyle}>\n           {if $field eq \'additionalCustomPre\'}\n            {$additionalCustomPre_grouptitle}\n           {else}\n            {$additionalCustomPost_grouptitle}\n           {/if}\n          </td>\n         </tr>\n         {foreach from=$val item=v key=f}\n          <tr>\n           <td {$labelStyle}>\n            {$f}\n           </td>\n           <td {$valueStyle}>\n            {$v}\n           </td>\n          </tr>\n         {/foreach}\n        {/if}\n       {/foreach}\n      {/foreach}\n     {/if}\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,834,'event_offline_receipt',1,0,0,NULL),(30,'Events - Registration Confirmation and Receipt (off-line)','{ts}Event Confirmation{/ts} - {$event.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n{$event.confirm_email_text}\n{/if}\n\n{if $isOnWaitlist}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}You have been added to the WAIT LIST for this event.{/ts}\n\n{if $isPrimary}\n{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $isRequireApproval}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Your registration has been submitted.{/ts}\n\n{if $isPrimary}\n{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $is_pay_later}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Event Information and Location{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{if $event.participant_role neq \'Attendee\' and $defaultRole}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $email}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Registered Email{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$email}\n{/if}\n{if $event.is_monetary} {* This section for Paid events only.*}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.fee_label}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{if $lineItem}{foreach from=$lineItem item=value key=priceset}\n\n{if $value neq \'skip\'}\n{if $isPrimary}\n{if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n{ts 1=$priceset+1}Participant %1{/ts}\n{/if}\n{/if}\n---------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{capture assign=ts_participant_total}{if $pricesetFieldsCount }{ts}Total Participants{/ts}{/if}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"} {$ts_participant_total|string_format:\"%10s\"}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{foreach from=$value item=line}\n{if $pricesetFieldsCount }{capture assign=ts_participant_count}{$line.participant_count}{/capture}{/if}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney|string_format:\"%10s\"} {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if}  {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {$ts_participant_count|string_format:\"%10s\"}\n{/foreach}\n{/if}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$totalAmount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n{/if}\n\n{if $amount && !$lineItem}\n{foreach from=$amount item=amnt key=level}{$amnt.amount|crmMoney} {$amnt.label}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{if $isPrimary}\n\n{if $balanceAmount}{ts}Total Paid{/ts}{else}{ts}Total Amount{/ts}{/if}: {$totalAmount|crmMoney} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n\n{if $balanceAmount}\n{ts}Balance{/ts}: {$balanceAmount|crmMoney}\n{/if}\n\n{if $pricesetFieldsCount }\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n        {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n        {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n\n{ts}Total Participants{/ts}: {$count}\n{/if}\n\n{if $is_pay_later }\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$register_date|crmDate}\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $financialTypeName}\n{ts}Financial Type{/ts}: {$financialTypeName}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n{if $billingName}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Billing Name and Address{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n{/if} {* End of conditional section for Paid events *}\n\n{if $customPre}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPre_grouptitle}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPre item=value key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n{$customName}: {$value}\n{/if}\n{/foreach}\n{/if}\n\n{if $customPost}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPost_grouptitle}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPost item=value key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n{$customName}: {$value}\n{/if}\n{/foreach}\n{/if}\n{if $customProfile}\n\n{foreach from=$customProfile item=value key=customName}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts 1=$customName+1}Participant Information - Participant %1{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=val key=field}\n{if $field eq \'additionalCustomPre\' or $field eq \'additionalCustomPost\' }\n{if $field eq \'additionalCustomPre\' }\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$additionalCustomPre_grouptitle}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{else}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$additionalCustomPost_grouptitle}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{/if}\n{foreach from=$val item=v key=f}\n{$f}: {$v}\n{/foreach}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n    {if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n     <p>{$event.confirm_email_text|htmlize}</p>\n    {/if}\n\n    {if $isOnWaitlist}\n     <p>{ts}You have been added to the WAIT LIST for this event.{/ts}</p>\n     {if $isPrimary}\n       <p>{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}</p>\n     {/if}\n    {elseif $isRequireApproval}\n     <p>{ts}Your registration has been submitted.{/ts}</p>\n     {if $isPrimary}\n      <p>{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}</p>\n     {/if}\n    {elseif $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n\n     {if $event.participant_role neq \'Attendee\' and $defaultRole}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$event.participant_role}\n       </td>\n      </tr>\n     {/if}\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $location.phone.1.phone || $location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}\n           {$phone.phone_type_display}\n          {else}\n           {ts}Phone{/ts}\n          {/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n     {if $email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$email}\n       </td>\n      </tr>\n     {/if}\n\n\n     {if $event.is_monetary}\n\n      <tr>\n       <th {$headerStyle}>\n        {$event.fee_label}\n       </th>\n      </tr>\n\n      {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n        {if $value neq \'skip\'}\n         {if $isPrimary}\n          {if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n           <tr>\n            <td colspan=\"2\" {$labelStyle}>\n             {ts 1=$priceset+1}Participant %1{/ts}\n            </td>\n           </tr>\n          {/if}\n         {/if}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Qty{/ts}</th>\n             <th>{ts}Each{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n             {/if}\n             <th>{ts}Total{/ts}</th>\n       {if $pricesetFieldsCount }<th>{ts}Total Participants{/ts}</th>{/if}\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td>\n        {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td>\n               {$line.qty}\n              </td>\n              <td>\n               {$line.unit_price|crmMoney}\n              </td>\n              {if $dataArray}\n               <td>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n              {/if}\n              <td>\n               {$line.line_total+$line.tax_amount|crmMoney}\n              </td>\n        {if  $pricesetFieldsCount }\n        <td>\n    {$line.participant_count}\n              </td>\n        {/if}\n             </tr>\n            {/foreach}\n           </table>\n          </td>\n         </tr>\n        {/if}\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalAmount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n          <tr>\n           {if $priceset || $priceset == 0}\n            <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n            <td>&nbsp;{$value|crmMoney:$currency}</td>\n           {else}\n            <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n            <td>&nbsp;{$value|crmMoney:$currency}</td>\n           {/if}\n          </tr>\n        {/foreach}\n       {/if}\n      {/if}\n\n      {if $amount && !$lineItem}\n       {foreach from=$amount item=amnt key=level}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$amnt.amount|crmMoney} {$amnt.label}\n         </td>\n        </tr>\n       {/foreach}\n      {/if}\n      {if $totalTaxAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalTaxAmount|crmMoney:$currency}\n        </td>\n       </tr>\n      {/if}\n      {if $isPrimary}\n       <tr>\n        <td {$labelStyle}>\n        {if $balanceAmount}\n           {ts}Total Paid{/ts}\n        {else}\n           {ts}Total Amount{/ts}\n         {/if}\n        </td>\n        <td {$valueStyle}>\n         {$totalAmount|crmMoney} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n        </td>\n       </tr>\n      {if $balanceAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Balance{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$balanceAmount|crmMoney}\n        </td>\n       </tr>\n      {/if}\n       {if $pricesetFieldsCount }\n     <tr>\n       <td {$labelStyle}>\n   {ts}Total Participants{/ts}</td>\n       <td {$valueStyle}>\n   {assign var=\"count\" value= 0}\n         {foreach from=$lineItem item=pcount}\n         {assign var=\"lineItemCount\" value=0}\n         {if $pcount neq \'skip\'}\n           {foreach from=$pcount item=p_count}\n           {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n           {/foreach}\n           {if $lineItemCount < 1 }\n           assign var=\"lineItemCount\" value=1}\n           {/if}\n           {assign var=\"count\" value=$count+$lineItemCount}\n         {/if}\n         {/foreach}\n   {$count}\n       </td>\n     </tr>\n     {/if}\n       {if $is_pay_later}\n        <tr>\n         <td colspan=\"2\" {$labelStyle}>\n          {$pay_later_receipt}\n         </td>\n        </tr>\n       {/if}\n\n       {if $register_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Registration Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$register_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $financialTypeName}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$financialTypeName}\n         </td>\n        </tr>\n       {/if}\n\n       {if $trxn_id}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction #{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$trxn_id}\n         </td>\n        </tr>\n       {/if}\n\n       {if $paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n         {$paidBy}\n         </td>\n        </tr>\n       {/if}\n\n       {if $checkNumber}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Check Number{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$checkNumber}\n         </td>\n        </tr>\n       {/if}\n\n       {if $billingName}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Billing Name and Address{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}\n         </td>\n        </tr>\n       {/if}\n\n       {if $credit_card_type}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Credit Card Information{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$credit_card_type}<br />\n          {$credit_card_number}<br />\n          {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n      {/if}\n\n     {/if} {* End of conditional section for Paid events *}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=value key=customName}\n       {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=value key=customName}\n       {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customProfile}\n      {foreach from=$customProfile item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {ts 1=$customName+1}Participant Information - Participant %1{/ts}\n        </th>\n       </tr>\n       {foreach from=$value item=val key=field}\n        {if $field eq \'additionalCustomPre\' or $field eq \'additionalCustomPost\'}\n         <tr>\n          <td colspan=\"2\" {$labelStyle}>\n           {if $field eq \'additionalCustomPre\'}\n            {$additionalCustomPre_grouptitle}\n           {else}\n            {$additionalCustomPost_grouptitle}\n           {/if}\n          </td>\n         </tr>\n         {foreach from=$val item=v key=f}\n          <tr>\n           <td {$labelStyle}>\n            {$f}\n           </td>\n           <td {$valueStyle}>\n            {$v}\n           </td>\n          </tr>\n         {/foreach}\n        {/if}\n       {/foreach}\n      {/foreach}\n     {/if}\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,834,'event_offline_receipt',0,1,0,NULL),(31,'Events - Registration Confirmation and Receipt (on-line)','{if $isOnWaitlist}{ts}Wait List Confirmation{/ts}{elseif $isRequireApproval}{ts}Registration Request Confirmation{/ts}{else}{ts}Registration Confirmation{/ts}{/if} - {$event.event_title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n{$event.confirm_email_text}\n\n{else}\n  {ts}Thank you for your registration.{/ts}\n  {if $participant_status}{ts 1=$participant_status}This is a confirmation that your registration has been received and your status has been updated to %1.{/ts}\n  {else}{if $isOnWaitlist}{ts}This is a confirmation that your registration has been received and your status has been updated to waitlisted.{/ts}{else}{ts}This is a confirmation that your registration has been received and your status has been updated to registered.{/ts}{/if}\n  {/if}\n{/if}\n\n{if $isOnWaitlist}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}You have been added to the WAIT LIST for this event.{/ts}\n\n{if $isPrimary}\n{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $isRequireApproval}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Your registration has been submitted.{/ts}\n\n{if $isPrimary}\n{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $is_pay_later && !$isAmountzero && !$isAdditionalParticipant}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Event Information and Location{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.event_title}\n{$event.event_start_date|date_format:\"%A\"} {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|date_format:\"%A\"} {$event.event_end_date|crmDate}{/if}{/if}\n{if $conference_sessions}\n\n\n{ts}Your schedule:{/ts}\n{assign var=\'group_by_day\' value=\'NA\'}\n{foreach from=$conference_sessions item=session}\n{if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n{assign var=\'group_by_day\' value=$session.start_date}\n\n{$group_by_day|date_format:\"%m/%d/%Y\"}\n\n\n{/if}\n{$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}\n{if $session.location}    {$session.location}{/if}\n{/foreach}\n{/if}\n\n{if $event.participant_role neq \'Attendee\' and $defaultRole}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $payer.name}\nYou were registered by: {$payer.name}\n{/if}\n{if $event.is_monetary and not $isRequireApproval} {* This section for Paid events only.*}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.fee_label}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{if $lineItem}{foreach from=$lineItem item=value key=priceset}\n\n{if $value neq \'skip\'}\n{if $isPrimary}\n{if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n{ts 1=$priceset+1}Participant %1{/ts} {$part.$priceset.info}\n\n{/if}\n{/if}\n-----------------------------------------------------------{if $pricesetFieldsCount }-----------------------------------------------------{/if}\n\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{if $pricesetFieldsCount }{capture assign=ts_participant_total}{ts}Total Participants{/ts}{/capture}{/if}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"} {$ts_participant_total|string_format:\"%10s\"}\n-----------------------------------------------------------{if $pricesetFieldsCount }-----------------------------------------------------{/if}\n\n{foreach from=$value item=line}\n{if $pricesetFieldsCount }{capture assign=ts_participant_count}{$line.participant_count}{/capture}{/if}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if} {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}{$ts_participant_count|string_format:\"%10s\"}\n{/foreach}\n----------------------------------------------------------------------------------------------------------------\n{if $individual}{ts}Participant Total{/ts} {$individual.$priceset.totalAmtWithTax-$individual.$priceset.totalTaxAmt|crmMoney:$currency|string_format:\"%29s\"} {$individual.$priceset.totalTaxAmt|crmMoney:$currency|string_format:\"%33s\"} {$individual.$priceset.totalAmtWithTax|crmMoney:$currency|string_format:\"%12s\"}{/if}\n{/if}\n{\"\"|string_format:\"%120s\"}\n{/foreach}\n{\"\"|string_format:\"%120s\"}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$totalAmount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n{/if}\n\n{if $amounts && !$lineItem}\n{foreach from=$amounts item=amnt key=level}{$amnt.amount|crmMoney:$currency} {$amnt.label}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{if $isPrimary }\n\n{ts}Total Amount{/ts}: {$totalAmount|crmMoney:$currency} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n\n{if $pricesetFieldsCount }\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n      {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n      {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n\n{ts}Total Participants{/ts}: {$count}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$register_date|crmDate}\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $financialTypeName}\n{ts}Financial Type{/ts}: {$financialTypeName}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n{if $billingName}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Billing Name and Address{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Credit Card Information{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n{/if} {* End of conditional section for Paid events *}\n\n{if $customPre}\n{foreach from=$customPre item=customPr key=i}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPre_grouptitle.$i}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPr item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $customPost}\n{foreach from=$customPost item=customPos key=j}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPost_grouptitle.$j}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPos item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n{if $customProfile}\n\n{foreach from=$customProfile.profile item=eachParticipant key=participantID}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts 1=$participantID+2}Participant Information - Participant %1{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$eachParticipant item=eachProfile key=pid}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$customProfile.title.$pid}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{foreach from=$eachProfile item=val key=field}\n{foreach from=$val item=v key=f}\n{$field}: {$v}\n{/foreach}\n{/foreach}\n{/foreach}\n{/foreach}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $event.allow_selfcancelxfer }\n{ts 1=$event.selfcancelxfer_time}You may transfer your registration to another participant or cancel your registration up to %1 hours before the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}\n   {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n{ts}Transfer or cancel your registration:{/ts} {$selfService}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=tdfirstStyle}style=\"width: 180px; padding-bottom: 15px;\"{/capture}\n{capture assign=tdStyle}style=\"width: 100px;\"{/capture}\n{capture assign=participantTotal}style=\"margin: 0.5em 0 0.5em;padding: 0.5em;background-color: #999999;font-weight: bold;color: #FAFAFA;border-radius: 2px;\"{/capture}\n\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n    {if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n     <p>{$event.confirm_email_text|htmlize}</p>\n\n    {else}\n     <p>{ts}Thank you for your registration.{/ts}\n     {if $participant_status}{ts 1=$participant_status}This is a confirmation that your registration has been received and your status has been updated to <strong> %1</strong>.{/ts}\n     {else}{if $isOnWaitlist}{ts}This is a confirmation that your registration has been received and your status has been updated to <strong>waitlisted</strong>.{/ts}{else}{ts}This is a confirmation that your registration has been received and your status has been updated to <strong>registered<strong>.{/ts}{/if}{/if}</p>\n\n    {/if}\n\n    <p>\n    {if $isOnWaitlist}\n     <p>{ts}You have been added to the WAIT LIST for this event.{/ts}</p>\n     {if $isPrimary}\n       <p>{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}</p>\n     {/if}\n    {elseif $isRequireApproval}\n     <p>{ts}Your registration has been submitted.{/ts}</p>\n     {if $isPrimary}\n      <p>{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}</p>\n     {/if}\n    {elseif $is_pay_later && !$isAmountzero && !$isAdditionalParticipant}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"width:100%; max-width:700px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|date_format:\"%A\"} {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|date_format:\"%A\"} {$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n\n\n     {if $conference_sessions}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n  {ts}Your schedule:{/ts}\n       </td>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n  {assign var=\'group_by_day\' value=\'NA\'}\n  {foreach from=$conference_sessions item=session}\n   {if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n    {assign var=\'group_by_day\' value=$session.start_date}\n          <em>{$group_by_day|date_format:\"%m/%d/%Y\"}</em><br />\n   {/if}\n   {$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}<br />\n   {if $session.location}&nbsp;&nbsp;&nbsp;&nbsp;{$session.location}<br />{/if}\n  {/foreach}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.participant_role neq \'Attendee\' and $defaultRole}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$event.participant_role}\n       </td>\n      </tr>\n     {/if}\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $location.phone.1.phone || $location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}\n           {$phone.phone_type_display}\n          {else}\n           {ts}Phone{/ts}\n          {/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n    {if $event.is_share}\n        <tr>\n            <td colspan=\"2\" {$valueStyle}>\n                {capture assign=eventUrl}{crmURL p=\'civicrm/event/info\' q=\"id=`$event.id`&reset=1\" a=true fe=1 h=1}{/capture}\n                {include file=\"CRM/common/SocialNetwork.tpl\" emailMode=true url=$eventUrl title=$event.title pageURL=$eventUrl}\n            </td>\n        </tr>\n    {/if}\n    {if $payer.name}\n     <tr>\n       <th {$headerStyle}>\n         {ts}You were registered by:{/ts}\n       </th>\n     </tr>\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$payer.name}\n       </td>\n     </tr>\n    {/if}\n    {if $event.is_monetary and not $isRequireApproval}\n\n      <tr>\n       <th {$headerStyle}>\n        {$event.fee_label}\n       </th>\n      </tr>\n\n      {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n        {if $value neq \'skip\'}\n         {if $isPrimary}\n          {if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n           <tr>\n            <td colspan=\"2\" {$labelStyle}>\n             {ts 1=$priceset+1}Participant %1{/ts} {$part.$priceset.info}\n            </td>\n           </tr>\n          {/if}\n         {/if}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Qty{/ts}</th>\n             <th>{ts}Each{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n             {/if}\n             <th>{ts}Total{/ts}</th>\n       {if  $pricesetFieldsCount }<th>{ts}Total Participants{/ts}</th>{/if}\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td {$tdfirstStyle}>\n              {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td {$tdStyle} align=\"middle\">\n               {$line.qty}\n              </td>\n              <td {$tdStyle}>\n               {$line.unit_price|crmMoney:$currency}\n              </td>\n              {if $dataArray}\n               <td {$tdStyle}>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td {$tdStyle}>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td {$tdStyle}>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n              {/if}\n              <td {$tdStyle}>\n               {$line.line_total+$line.tax_amount|crmMoney:$currency}\n              </td>\n        {if $pricesetFieldsCount }<td {$tdStyle}>{$line.participant_count}</td> {/if}\n             </tr>\n            {/foreach}\n            {if $individual}\n              <tr {$participantTotal}>\n                <td colspan=3>{ts}Participant Total{/ts}</td>\n                <td colspan=2>{$individual.$priceset.totalAmtWithTax-$individual.$priceset.totalTaxAmt|crmMoney}</td>\n                <td colspan=1>{$individual.$priceset.totalTaxAmt|crmMoney}</td>\n                <td colspan=2>{$individual.$priceset.totalAmtWithTax|crmMoney}</td>\n              </tr>\n            {/if}\n           </table>\n          </td>\n         </tr>\n        {/if}\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts} Amount Before Tax: {/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalAmount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n          {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {else}\n           <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {/if}\n         </tr>\n        {/foreach}\n       {/if}\n      {/if}\n\n      {if $amounts && !$lineItem}\n       {foreach from=$amounts item=amnt key=level}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$amnt.amount|crmMoney:$currency} {$amnt.label}\n         </td>\n        </tr>\n       {/foreach}\n      {/if}\n\n    {if $totalTaxAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalTaxAmount|crmMoney:$currency}\n        </td>\n       </tr>\n      {/if}\n      {if $isPrimary}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalAmount|crmMoney:$currency} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n        </td>\n       </tr>\n       {if $pricesetFieldsCount }\n     <tr>\n       <td {$labelStyle}>\n      {ts}Total Participants{/ts}</td>\n      <td {$valueStyle}>\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n      {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n      {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n     {$count}\n     </td> </tr>\n      {/if}\n\n       {if $register_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Registration Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$register_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $financialTypeName}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$financialTypeName}\n         </td>\n        </tr>\n       {/if}\n\n       {if $trxn_id}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction #{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$trxn_id}\n         </td>\n        </tr>\n       {/if}\n\n       {if $paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n         {$paidBy}\n         </td>\n        </tr>\n       {/if}\n\n       {if $checkNumber}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Check Number{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$checkNumber}\n         </td>\n        </tr>\n       {/if}\n\n       {if $billingName}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Billing Name and Address{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}\n         </td>\n        </tr>\n       {/if}\n\n       {if $credit_card_type}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Credit Card Information{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$credit_card_type}<br />\n          {$credit_card_number}<br />\n          {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n      {/if}\n\n     {/if} {* End of conditional section for Paid events *}\n\n\n{if $customPre}\n{foreach from=$customPre item=customPr key=i}\n   <tr> <th {$headerStyle}>{$customPre_grouptitle.$i}</th></tr>\n   {foreach from=$customPr item=customValue key=customName}\n   {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n     <tr>\n         <td {$labelStyle}>{$customName}</td>\n         <td {$valueStyle}>{$customValue}</td>\n     </tr>\n   {/if}\n   {/foreach}\n{/foreach}\n{/if}\n\n{if $customPost}\n{foreach from=$customPost item=customPos key=j}\n   <tr> <th {$headerStyle}>{$customPost_grouptitle.$j}</th></tr>\n   {foreach from=$customPos item=customValue key=customName}\n   {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n     <tr>\n         <td {$labelStyle}>{$customName}</td>\n         <td {$valueStyle}>{$customValue}</td>\n     </tr>\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $customProfile}\n{foreach from=$customProfile.profile item=eachParticipant key=participantID}\n     <tr><th {$headerStyle}>{ts 1=$participantID+2}Participant %1{/ts} </th></tr>\n     {foreach from=$eachParticipant item=eachProfile key=pid}\n     <tr><th {$headerStyle}>{$customProfile.title.$pid}</th></tr>\n     {foreach from=$eachProfile item=val key=field}\n     <tr>{foreach from=$val item=v key=f}\n         <td {$labelStyle}>{$field}</td>\n         <td {$valueStyle}>{$v}</td>\n         {/foreach}\n     </tr>\n     {/foreach}\n{/foreach}\n{/foreach}\n{/if}\n\n    {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n    </table>\n    {if $event.allow_selfcancelxfer }\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n        {ts 1=$event.selfcancelxfer_time}You may transfer your registration to another participant or cancel your registration up to %1 hours before the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}<br />\n        {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n        <a href=\"{$selfService}\">{ts}Click here to transfer or cancel your registration.{/ts}</a>\n      </td>\n     </tr>\n    {/if}\n </table>\n</center>\n\n</body>\n</html>\n',1,835,'event_online_receipt',1,0,0,NULL),(32,'Events - Registration Confirmation and Receipt (on-line)','{if $isOnWaitlist}{ts}Wait List Confirmation{/ts}{elseif $isRequireApproval}{ts}Registration Request Confirmation{/ts}{else}{ts}Registration Confirmation{/ts}{/if} - {$event.event_title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n{$event.confirm_email_text}\n\n{else}\n  {ts}Thank you for your registration.{/ts}\n  {if $participant_status}{ts 1=$participant_status}This is a confirmation that your registration has been received and your status has been updated to %1.{/ts}\n  {else}{if $isOnWaitlist}{ts}This is a confirmation that your registration has been received and your status has been updated to waitlisted.{/ts}{else}{ts}This is a confirmation that your registration has been received and your status has been updated to registered.{/ts}{/if}\n  {/if}\n{/if}\n\n{if $isOnWaitlist}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}You have been added to the WAIT LIST for this event.{/ts}\n\n{if $isPrimary}\n{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $isRequireApproval}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Your registration has been submitted.{/ts}\n\n{if $isPrimary}\n{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $is_pay_later && !$isAmountzero && !$isAdditionalParticipant}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Event Information and Location{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.event_title}\n{$event.event_start_date|date_format:\"%A\"} {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|date_format:\"%A\"} {$event.event_end_date|crmDate}{/if}{/if}\n{if $conference_sessions}\n\n\n{ts}Your schedule:{/ts}\n{assign var=\'group_by_day\' value=\'NA\'}\n{foreach from=$conference_sessions item=session}\n{if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n{assign var=\'group_by_day\' value=$session.start_date}\n\n{$group_by_day|date_format:\"%m/%d/%Y\"}\n\n\n{/if}\n{$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}\n{if $session.location}    {$session.location}{/if}\n{/foreach}\n{/if}\n\n{if $event.participant_role neq \'Attendee\' and $defaultRole}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $payer.name}\nYou were registered by: {$payer.name}\n{/if}\n{if $event.is_monetary and not $isRequireApproval} {* This section for Paid events only.*}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.fee_label}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{if $lineItem}{foreach from=$lineItem item=value key=priceset}\n\n{if $value neq \'skip\'}\n{if $isPrimary}\n{if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n{ts 1=$priceset+1}Participant %1{/ts} {$part.$priceset.info}\n\n{/if}\n{/if}\n-----------------------------------------------------------{if $pricesetFieldsCount }-----------------------------------------------------{/if}\n\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{if $pricesetFieldsCount }{capture assign=ts_participant_total}{ts}Total Participants{/ts}{/capture}{/if}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"} {$ts_participant_total|string_format:\"%10s\"}\n-----------------------------------------------------------{if $pricesetFieldsCount }-----------------------------------------------------{/if}\n\n{foreach from=$value item=line}\n{if $pricesetFieldsCount }{capture assign=ts_participant_count}{$line.participant_count}{/capture}{/if}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if} {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}{$ts_participant_count|string_format:\"%10s\"}\n{/foreach}\n----------------------------------------------------------------------------------------------------------------\n{if $individual}{ts}Participant Total{/ts} {$individual.$priceset.totalAmtWithTax-$individual.$priceset.totalTaxAmt|crmMoney:$currency|string_format:\"%29s\"} {$individual.$priceset.totalTaxAmt|crmMoney:$currency|string_format:\"%33s\"} {$individual.$priceset.totalAmtWithTax|crmMoney:$currency|string_format:\"%12s\"}{/if}\n{/if}\n{\"\"|string_format:\"%120s\"}\n{/foreach}\n{\"\"|string_format:\"%120s\"}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$totalAmount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n{/if}\n\n{if $amounts && !$lineItem}\n{foreach from=$amounts item=amnt key=level}{$amnt.amount|crmMoney:$currency} {$amnt.label}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{if $isPrimary }\n\n{ts}Total Amount{/ts}: {$totalAmount|crmMoney:$currency} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n\n{if $pricesetFieldsCount }\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n      {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n      {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n\n{ts}Total Participants{/ts}: {$count}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$register_date|crmDate}\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $financialTypeName}\n{ts}Financial Type{/ts}: {$financialTypeName}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n{if $billingName}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Billing Name and Address{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Credit Card Information{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n{/if} {* End of conditional section for Paid events *}\n\n{if $customPre}\n{foreach from=$customPre item=customPr key=i}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPre_grouptitle.$i}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPr item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $customPost}\n{foreach from=$customPost item=customPos key=j}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPost_grouptitle.$j}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPos item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n{if $customProfile}\n\n{foreach from=$customProfile.profile item=eachParticipant key=participantID}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts 1=$participantID+2}Participant Information - Participant %1{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$eachParticipant item=eachProfile key=pid}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$customProfile.title.$pid}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{foreach from=$eachProfile item=val key=field}\n{foreach from=$val item=v key=f}\n{$field}: {$v}\n{/foreach}\n{/foreach}\n{/foreach}\n{/foreach}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $event.allow_selfcancelxfer }\n{ts 1=$event.selfcancelxfer_time}You may transfer your registration to another participant or cancel your registration up to %1 hours before the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}\n   {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n{ts}Transfer or cancel your registration:{/ts} {$selfService}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=tdfirstStyle}style=\"width: 180px; padding-bottom: 15px;\"{/capture}\n{capture assign=tdStyle}style=\"width: 100px;\"{/capture}\n{capture assign=participantTotal}style=\"margin: 0.5em 0 0.5em;padding: 0.5em;background-color: #999999;font-weight: bold;color: #FAFAFA;border-radius: 2px;\"{/capture}\n\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n    {if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n     <p>{$event.confirm_email_text|htmlize}</p>\n\n    {else}\n     <p>{ts}Thank you for your registration.{/ts}\n     {if $participant_status}{ts 1=$participant_status}This is a confirmation that your registration has been received and your status has been updated to <strong> %1</strong>.{/ts}\n     {else}{if $isOnWaitlist}{ts}This is a confirmation that your registration has been received and your status has been updated to <strong>waitlisted</strong>.{/ts}{else}{ts}This is a confirmation that your registration has been received and your status has been updated to <strong>registered<strong>.{/ts}{/if}{/if}</p>\n\n    {/if}\n\n    <p>\n    {if $isOnWaitlist}\n     <p>{ts}You have been added to the WAIT LIST for this event.{/ts}</p>\n     {if $isPrimary}\n       <p>{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}</p>\n     {/if}\n    {elseif $isRequireApproval}\n     <p>{ts}Your registration has been submitted.{/ts}</p>\n     {if $isPrimary}\n      <p>{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}</p>\n     {/if}\n    {elseif $is_pay_later && !$isAmountzero && !$isAdditionalParticipant}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"width:100%; max-width:700px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|date_format:\"%A\"} {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|date_format:\"%A\"} {$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n\n\n     {if $conference_sessions}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n  {ts}Your schedule:{/ts}\n       </td>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n  {assign var=\'group_by_day\' value=\'NA\'}\n  {foreach from=$conference_sessions item=session}\n   {if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n    {assign var=\'group_by_day\' value=$session.start_date}\n          <em>{$group_by_day|date_format:\"%m/%d/%Y\"}</em><br />\n   {/if}\n   {$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}<br />\n   {if $session.location}&nbsp;&nbsp;&nbsp;&nbsp;{$session.location}<br />{/if}\n  {/foreach}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.participant_role neq \'Attendee\' and $defaultRole}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$event.participant_role}\n       </td>\n      </tr>\n     {/if}\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $location.phone.1.phone || $location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}\n           {$phone.phone_type_display}\n          {else}\n           {ts}Phone{/ts}\n          {/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n    {if $event.is_share}\n        <tr>\n            <td colspan=\"2\" {$valueStyle}>\n                {capture assign=eventUrl}{crmURL p=\'civicrm/event/info\' q=\"id=`$event.id`&reset=1\" a=true fe=1 h=1}{/capture}\n                {include file=\"CRM/common/SocialNetwork.tpl\" emailMode=true url=$eventUrl title=$event.title pageURL=$eventUrl}\n            </td>\n        </tr>\n    {/if}\n    {if $payer.name}\n     <tr>\n       <th {$headerStyle}>\n         {ts}You were registered by:{/ts}\n       </th>\n     </tr>\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$payer.name}\n       </td>\n     </tr>\n    {/if}\n    {if $event.is_monetary and not $isRequireApproval}\n\n      <tr>\n       <th {$headerStyle}>\n        {$event.fee_label}\n       </th>\n      </tr>\n\n      {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n        {if $value neq \'skip\'}\n         {if $isPrimary}\n          {if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n           <tr>\n            <td colspan=\"2\" {$labelStyle}>\n             {ts 1=$priceset+1}Participant %1{/ts} {$part.$priceset.info}\n            </td>\n           </tr>\n          {/if}\n         {/if}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Qty{/ts}</th>\n             <th>{ts}Each{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n             {/if}\n             <th>{ts}Total{/ts}</th>\n       {if  $pricesetFieldsCount }<th>{ts}Total Participants{/ts}</th>{/if}\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td {$tdfirstStyle}>\n              {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td {$tdStyle} align=\"middle\">\n               {$line.qty}\n              </td>\n              <td {$tdStyle}>\n               {$line.unit_price|crmMoney:$currency}\n              </td>\n              {if $dataArray}\n               <td {$tdStyle}>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td {$tdStyle}>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td {$tdStyle}>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n              {/if}\n              <td {$tdStyle}>\n               {$line.line_total+$line.tax_amount|crmMoney:$currency}\n              </td>\n        {if $pricesetFieldsCount }<td {$tdStyle}>{$line.participant_count}</td> {/if}\n             </tr>\n            {/foreach}\n            {if $individual}\n              <tr {$participantTotal}>\n                <td colspan=3>{ts}Participant Total{/ts}</td>\n                <td colspan=2>{$individual.$priceset.totalAmtWithTax-$individual.$priceset.totalTaxAmt|crmMoney}</td>\n                <td colspan=1>{$individual.$priceset.totalTaxAmt|crmMoney}</td>\n                <td colspan=2>{$individual.$priceset.totalAmtWithTax|crmMoney}</td>\n              </tr>\n            {/if}\n           </table>\n          </td>\n         </tr>\n        {/if}\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts} Amount Before Tax: {/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalAmount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n          {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {else}\n           <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {/if}\n         </tr>\n        {/foreach}\n       {/if}\n      {/if}\n\n      {if $amounts && !$lineItem}\n       {foreach from=$amounts item=amnt key=level}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$amnt.amount|crmMoney:$currency} {$amnt.label}\n         </td>\n        </tr>\n       {/foreach}\n      {/if}\n\n    {if $totalTaxAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalTaxAmount|crmMoney:$currency}\n        </td>\n       </tr>\n      {/if}\n      {if $isPrimary}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalAmount|crmMoney:$currency} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n        </td>\n       </tr>\n       {if $pricesetFieldsCount }\n     <tr>\n       <td {$labelStyle}>\n      {ts}Total Participants{/ts}</td>\n      <td {$valueStyle}>\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n      {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n      {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n     {$count}\n     </td> </tr>\n      {/if}\n\n       {if $register_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Registration Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$register_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $financialTypeName}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$financialTypeName}\n         </td>\n        </tr>\n       {/if}\n\n       {if $trxn_id}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction #{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$trxn_id}\n         </td>\n        </tr>\n       {/if}\n\n       {if $paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n         {$paidBy}\n         </td>\n        </tr>\n       {/if}\n\n       {if $checkNumber}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Check Number{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$checkNumber}\n         </td>\n        </tr>\n       {/if}\n\n       {if $billingName}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Billing Name and Address{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}\n         </td>\n        </tr>\n       {/if}\n\n       {if $credit_card_type}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Credit Card Information{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$credit_card_type}<br />\n          {$credit_card_number}<br />\n          {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n      {/if}\n\n     {/if} {* End of conditional section for Paid events *}\n\n\n{if $customPre}\n{foreach from=$customPre item=customPr key=i}\n   <tr> <th {$headerStyle}>{$customPre_grouptitle.$i}</th></tr>\n   {foreach from=$customPr item=customValue key=customName}\n   {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n     <tr>\n         <td {$labelStyle}>{$customName}</td>\n         <td {$valueStyle}>{$customValue}</td>\n     </tr>\n   {/if}\n   {/foreach}\n{/foreach}\n{/if}\n\n{if $customPost}\n{foreach from=$customPost item=customPos key=j}\n   <tr> <th {$headerStyle}>{$customPost_grouptitle.$j}</th></tr>\n   {foreach from=$customPos item=customValue key=customName}\n   {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n     <tr>\n         <td {$labelStyle}>{$customName}</td>\n         <td {$valueStyle}>{$customValue}</td>\n     </tr>\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $customProfile}\n{foreach from=$customProfile.profile item=eachParticipant key=participantID}\n     <tr><th {$headerStyle}>{ts 1=$participantID+2}Participant %1{/ts} </th></tr>\n     {foreach from=$eachParticipant item=eachProfile key=pid}\n     <tr><th {$headerStyle}>{$customProfile.title.$pid}</th></tr>\n     {foreach from=$eachProfile item=val key=field}\n     <tr>{foreach from=$val item=v key=f}\n         <td {$labelStyle}>{$field}</td>\n         <td {$valueStyle}>{$v}</td>\n         {/foreach}\n     </tr>\n     {/foreach}\n{/foreach}\n{/foreach}\n{/if}\n\n    {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n    </table>\n    {if $event.allow_selfcancelxfer }\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n        {ts 1=$event.selfcancelxfer_time}You may transfer your registration to another participant or cancel your registration up to %1 hours before the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}<br />\n        {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n        <a href=\"{$selfService}\">{ts}Click here to transfer or cancel your registration.{/ts}</a>\n      </td>\n     </tr>\n    {/if}\n </table>\n</center>\n\n</body>\n</html>\n',1,835,'event_online_receipt',0,1,0,NULL),(33,'Events - Receipt only','Receipt for {if $events_in_cart} Event Registration{/if} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $is_pay_later}\n  This is being sent to you as an acknowledgement that you have registered one or more members for the following workshop, event or purchase. Please note, however, that the status of your payment is pending, and the registration for this event will not be completed until your payment is received.\n{else}\n  This is being sent to you as a {if $is_refund}confirmation of refund{else}receipt of payment made{/if} for the following workshop, event registration or purchase.\n{/if}\n\n{if $is_pay_later}\n  {$pay_later_receipt}\n{/if}\n\n  Your order number is #{$transaction_id}. {if $line_items && !$is_refund} Information about the workshops will be sent separately to each participant.{/if}\n Here\'s a summary of your transaction placed on {$transaction_date|date_format:\"%D %I:%M %p %Z\"}:\n\n{if $billing_name}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billing_name}\n\n{$billing_street_address}\n\n{$billing_city}, {$billing_state} {$billing_postal_code}\n\n{$email}\n{/if}\n\n{if $source}\n{$source}\n{/if}\n\n\n{foreach from=$line_items item=line_item}\n{$line_item.event->title} ({$line_item.event->start_date|date_format:\"%D\"})\n{if $line_item.event->is_show_location}\n  {$line_item.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n{$line_item.event->start_date|date_format:\"%D %I:%M %p\"} - {$line_item.event->end_date|date_format:\"%I:%M %p\"}\n\n  Quantity: {$line_item.num_participants}\n\n{if $line_item.num_participants > 0}\n  {foreach from=$line_item.participants item=participant}\n    {$participant.display_name}\n  {/foreach}\n{/if}\n{if $line_item.num_waiting_participants > 0}\n  Waitlisted:\n    {foreach from=$line_item.waiting_participants item=participant}\n      {$participant.display_name}\n    {/foreach}\n{/if}\nCost: {$line_item.cost|crmMoney:$currency|string_format:\"%10s\"}\nTotal For This Event: {$line_item.amount|crmMoney:$currency|string_format:\"%10s\"}\n\n{/foreach}\n\n{if $discounts}\nSubtotal: {$sub_total|crmMoney:$currency|string_format:\"%10s\"}\n--------------------------------------\nDiscounts\n{foreach from=$discounts key=myId item=i}\n  {$i.title}: -{$i.amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/if}\n======================================\nTotal: {$total|crmMoney:$currency|string_format:\"%10s\"}\n\n{if $credit_card_type}\n===========================================================\n{ts}Payment Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date.M}/{$credit_card_exp_date.Y}\n{/if}\n\n  If you have questions about the status of your registration or purchase please feel free to contact us.\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n    <title></title>\n  </head>\n  <body>\n    {capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n    {capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n    {capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $is_pay_later}\n      <p>\n        This is being sent to you as an acknowledgement that you have registered one or more members for the following workshop, event or purchase. Please note, however, that the status of your payment is pending, and the registration for this event will not be completed until your payment is received.\n      </p>\n    {else}\n      <p>\n        This is being sent to you as a {if $is_refund}confirmation of refund{else}receipt of payment made{/if} for the following workshop, event registration or purchase.\n      </p>\n    {/if}\n\n    {if $is_pay_later}\n      <p>{$pay_later_receipt}</p>\n    {/if}\n\n    <p>Your order number is #{$transaction_id}. {if $line_items && !$is_refund} Information about the workshops will be sent separately to each participant.{/if}\n  Here\'s a summary of your transaction placed on {$transaction_date|date_format:\"%D %I:%M %p %Z\"}:</p>\n\n{if $billing_name}\n  <table class=\"billing-info\">\n      <tr>\n    <th style=\"text-align: left;\">\n      {ts}Billing Name and Address{/ts}\n    </th>\n      </tr>\n      <tr>\n    <td>\n      {$billing_name}<br />\n      {$billing_street_address}<br />\n      {$billing_city}, {$billing_state} {$billing_postal_code}<br/>\n      <br/>\n      {$email}\n    </td>\n    </tr>\n    </table>\n{/if}\n{if $credit_card_type}\n  <p>&nbsp;</p>\n  <table class=\"billing-info\">\n      <tr>\n    <th style=\"text-align: left;\">\n      {ts}Credit Card Information{/ts}\n    </th>\n      </tr>\n      <tr>\n    <td>\n      {$credit_card_type}<br />\n      {$credit_card_number}<br />\n      {ts}Expires{/ts}: {$credit_card_exp_date.M}/{$credit_card_exp_date.Y}\n    </td>\n    </tr>\n    </table>\n{/if}\n{if $source}\n    <p>&nbsp;</p>\n    {$source}\n{/if}\n    <p>&nbsp;</p>\n    <table width=\"700\">\n      <thead>\n    <tr>\n{if $line_items}\n      <th style=\"text-align: left;\">\n      Event\n      </th>\n      <th style=\"text-align: left;\">\n      Participants\n      </th>\n{/if}\n      <th style=\"text-align: left;\">\n      Price\n      </th>\n      <th style=\"text-align: left;\">\n      Total\n      </th>\n    </tr>\n    </thead>\n      <tbody>\n  {foreach from=$line_items item=line_item}\n  <tr>\n    <td style=\"width: 220px\">\n      {$line_item.event->title} ({$line_item.event->start_date|date_format:\"%D\"})<br />\n      {if $line_item.event->is_show_location}\n        {$line_item.location.address.1.display|nl2br}\n      {/if}{*End of isShowLocation condition*}<br /><br />\n      {$line_item.event->start_date|date_format:\"%D %I:%M %p\"} - {$line_item.event->end_date|date_format:\"%I:%M %p\"}\n    </td>\n    <td style=\"width: 180px\">\n    {$line_item.num_participants}\n      {if $line_item.num_participants > 0}\n      <div class=\"participants\" style=\"padding-left: 10px;\">\n        {foreach from=$line_item.participants item=participant}\n        {$participant.display_name}<br />\n        {/foreach}\n      </div>\n      {/if}\n      {if $line_item.num_waiting_participants > 0}\n      Waitlisted:<br/>\n      <div class=\"participants\" style=\"padding-left: 10px;\">\n        {foreach from=$line_item.waiting_participants item=participant}\n        {$participant.display_name}<br />\n        {/foreach}\n      </div>\n      {/if}\n    </td>\n    <td style=\"width: 100px\">\n      {$line_item.cost|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n    <td style=\"width: 100px\">\n      &nbsp;{$line_item.amount|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n  </tr>\n  {/foreach}\n      </tbody>\n      <tfoot>\n  {if $discounts}\n  <tr>\n    <td>\n    </td>\n    <td>\n    </td>\n    <td>\n      Subtotal:\n    </td>\n    <td>\n      &nbsp;{$sub_total|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n  </tr>\n  {foreach from=$discounts key=myId item=i}\n  <tr>\n    <td>\n      {$i.title}\n    </td>\n    <td>\n    </td>\n    <td>\n    </td>\n    <td>\n      -{$i.amount}\n    </td>\n  </tr>\n  {/foreach}\n  {/if}\n  <tr>\n{if $line_items}\n    <td>\n    </td>\n    <td>\n    </td>\n{/if}\n    <td>\n      <strong>Total:</strong>\n    </td>\n    <td>\n      <strong>&nbsp;{$total|crmMoney:$currency|string_format:\"%10s\"}</strong>\n    </td>\n  </tr>\n      </tfoot>\n    </table>\n\n    If you have questions about the status of your registration or purchase please feel free to contact us.\n  </body>\n</html>\n',1,836,'event_registration_receipt',1,0,0,NULL),(34,'Events - Receipt only','Receipt for {if $events_in_cart} Event Registration{/if} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $is_pay_later}\n  This is being sent to you as an acknowledgement that you have registered one or more members for the following workshop, event or purchase. Please note, however, that the status of your payment is pending, and the registration for this event will not be completed until your payment is received.\n{else}\n  This is being sent to you as a {if $is_refund}confirmation of refund{else}receipt of payment made{/if} for the following workshop, event registration or purchase.\n{/if}\n\n{if $is_pay_later}\n  {$pay_later_receipt}\n{/if}\n\n  Your order number is #{$transaction_id}. {if $line_items && !$is_refund} Information about the workshops will be sent separately to each participant.{/if}\n Here\'s a summary of your transaction placed on {$transaction_date|date_format:\"%D %I:%M %p %Z\"}:\n\n{if $billing_name}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billing_name}\n\n{$billing_street_address}\n\n{$billing_city}, {$billing_state} {$billing_postal_code}\n\n{$email}\n{/if}\n\n{if $source}\n{$source}\n{/if}\n\n\n{foreach from=$line_items item=line_item}\n{$line_item.event->title} ({$line_item.event->start_date|date_format:\"%D\"})\n{if $line_item.event->is_show_location}\n  {$line_item.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n{$line_item.event->start_date|date_format:\"%D %I:%M %p\"} - {$line_item.event->end_date|date_format:\"%I:%M %p\"}\n\n  Quantity: {$line_item.num_participants}\n\n{if $line_item.num_participants > 0}\n  {foreach from=$line_item.participants item=participant}\n    {$participant.display_name}\n  {/foreach}\n{/if}\n{if $line_item.num_waiting_participants > 0}\n  Waitlisted:\n    {foreach from=$line_item.waiting_participants item=participant}\n      {$participant.display_name}\n    {/foreach}\n{/if}\nCost: {$line_item.cost|crmMoney:$currency|string_format:\"%10s\"}\nTotal For This Event: {$line_item.amount|crmMoney:$currency|string_format:\"%10s\"}\n\n{/foreach}\n\n{if $discounts}\nSubtotal: {$sub_total|crmMoney:$currency|string_format:\"%10s\"}\n--------------------------------------\nDiscounts\n{foreach from=$discounts key=myId item=i}\n  {$i.title}: -{$i.amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/if}\n======================================\nTotal: {$total|crmMoney:$currency|string_format:\"%10s\"}\n\n{if $credit_card_type}\n===========================================================\n{ts}Payment Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date.M}/{$credit_card_exp_date.Y}\n{/if}\n\n  If you have questions about the status of your registration or purchase please feel free to contact us.\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n    <title></title>\n  </head>\n  <body>\n    {capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n    {capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n    {capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $is_pay_later}\n      <p>\n        This is being sent to you as an acknowledgement that you have registered one or more members for the following workshop, event or purchase. Please note, however, that the status of your payment is pending, and the registration for this event will not be completed until your payment is received.\n      </p>\n    {else}\n      <p>\n        This is being sent to you as a {if $is_refund}confirmation of refund{else}receipt of payment made{/if} for the following workshop, event registration or purchase.\n      </p>\n    {/if}\n\n    {if $is_pay_later}\n      <p>{$pay_later_receipt}</p>\n    {/if}\n\n    <p>Your order number is #{$transaction_id}. {if $line_items && !$is_refund} Information about the workshops will be sent separately to each participant.{/if}\n  Here\'s a summary of your transaction placed on {$transaction_date|date_format:\"%D %I:%M %p %Z\"}:</p>\n\n{if $billing_name}\n  <table class=\"billing-info\">\n      <tr>\n    <th style=\"text-align: left;\">\n      {ts}Billing Name and Address{/ts}\n    </th>\n      </tr>\n      <tr>\n    <td>\n      {$billing_name}<br />\n      {$billing_street_address}<br />\n      {$billing_city}, {$billing_state} {$billing_postal_code}<br/>\n      <br/>\n      {$email}\n    </td>\n    </tr>\n    </table>\n{/if}\n{if $credit_card_type}\n  <p>&nbsp;</p>\n  <table class=\"billing-info\">\n      <tr>\n    <th style=\"text-align: left;\">\n      {ts}Credit Card Information{/ts}\n    </th>\n      </tr>\n      <tr>\n    <td>\n      {$credit_card_type}<br />\n      {$credit_card_number}<br />\n      {ts}Expires{/ts}: {$credit_card_exp_date.M}/{$credit_card_exp_date.Y}\n    </td>\n    </tr>\n    </table>\n{/if}\n{if $source}\n    <p>&nbsp;</p>\n    {$source}\n{/if}\n    <p>&nbsp;</p>\n    <table width=\"700\">\n      <thead>\n    <tr>\n{if $line_items}\n      <th style=\"text-align: left;\">\n      Event\n      </th>\n      <th style=\"text-align: left;\">\n      Participants\n      </th>\n{/if}\n      <th style=\"text-align: left;\">\n      Price\n      </th>\n      <th style=\"text-align: left;\">\n      Total\n      </th>\n    </tr>\n    </thead>\n      <tbody>\n  {foreach from=$line_items item=line_item}\n  <tr>\n    <td style=\"width: 220px\">\n      {$line_item.event->title} ({$line_item.event->start_date|date_format:\"%D\"})<br />\n      {if $line_item.event->is_show_location}\n        {$line_item.location.address.1.display|nl2br}\n      {/if}{*End of isShowLocation condition*}<br /><br />\n      {$line_item.event->start_date|date_format:\"%D %I:%M %p\"} - {$line_item.event->end_date|date_format:\"%I:%M %p\"}\n    </td>\n    <td style=\"width: 180px\">\n    {$line_item.num_participants}\n      {if $line_item.num_participants > 0}\n      <div class=\"participants\" style=\"padding-left: 10px;\">\n        {foreach from=$line_item.participants item=participant}\n        {$participant.display_name}<br />\n        {/foreach}\n      </div>\n      {/if}\n      {if $line_item.num_waiting_participants > 0}\n      Waitlisted:<br/>\n      <div class=\"participants\" style=\"padding-left: 10px;\">\n        {foreach from=$line_item.waiting_participants item=participant}\n        {$participant.display_name}<br />\n        {/foreach}\n      </div>\n      {/if}\n    </td>\n    <td style=\"width: 100px\">\n      {$line_item.cost|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n    <td style=\"width: 100px\">\n      &nbsp;{$line_item.amount|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n  </tr>\n  {/foreach}\n      </tbody>\n      <tfoot>\n  {if $discounts}\n  <tr>\n    <td>\n    </td>\n    <td>\n    </td>\n    <td>\n      Subtotal:\n    </td>\n    <td>\n      &nbsp;{$sub_total|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n  </tr>\n  {foreach from=$discounts key=myId item=i}\n  <tr>\n    <td>\n      {$i.title}\n    </td>\n    <td>\n    </td>\n    <td>\n    </td>\n    <td>\n      -{$i.amount}\n    </td>\n  </tr>\n  {/foreach}\n  {/if}\n  <tr>\n{if $line_items}\n    <td>\n    </td>\n    <td>\n    </td>\n{/if}\n    <td>\n      <strong>Total:</strong>\n    </td>\n    <td>\n      <strong>&nbsp;{$total|crmMoney:$currency|string_format:\"%10s\"}</strong>\n    </td>\n  </tr>\n      </tfoot>\n    </table>\n\n    If you have questions about the status of your registration or purchase please feel free to contact us.\n  </body>\n</html>\n',1,836,'event_registration_receipt',0,1,0,NULL),(35,'Events - Registration Cancellation Notice','{ts 1=$event.event_title}Event Registration Cancelled for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}Your Event Registration has been cancelled.{/ts}\n\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Your Event Registration has been cancelled.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,837,'participant_cancelled',1,0,0,NULL),(36,'Events - Registration Cancellation Notice','{ts 1=$event.event_title}Event Registration Cancelled for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}Your Event Registration has been cancelled.{/ts}\n\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Your Event Registration has been cancelled.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,837,'participant_cancelled',0,1,0,NULL),(37,'Events - Registration Confirmation Invite','{ts 1=$event.event_title}Confirm your registration for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}This is an invitation to complete your registration that was initially waitlisted.{/ts}\n\n{if !$isAdditional and $participant.id}\n\n===========================================================\n{ts}Confirm Your Registration{/ts}\n\n===========================================================\n{capture assign=confirmUrl}{crmURL p=\'civicrm/event/confirm\' q=\"reset=1&participantId=`$participant.id`&cs=`$checksumValue`\" a=true h=0 fe=1}{/capture}\nClick this link to go to a web page where you can confirm your registration online:\n{$confirmUrl}\n{/if}\n{if $event.allow_selfcancelxfer }\n{ts 1=$event.selfcancelxfer_time}You may transfer your registration to another participant or cancel your registration up to %1 hours before the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}\n   {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n{ts}Transfer or cancel your registration:{/ts} {$selfService}\n{/if}\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n{if $conference_sessions}\n\n\n{ts}Your schedule:{/ts}\n{assign var=\'group_by_day\' value=\'NA\'}\n{foreach from=$conference_sessions item=session}\n{if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n{assign var=\'group_by_day\' value=$session.start_date}\n\n{$group_by_day|date_format:\"%m/%d/%Y\"}\n\n\n{/if}\n{$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}\n{if $session.location}    {$session.location}{/if}\n{/foreach}\n{/if}\n\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}This is an invitation to complete your registration that was initially waitlisted.{/ts}</p>\n   </td>\n  </tr>\n  {if !$isAdditional and $participant.id}\n   <tr>\n    <th {$headerStyle}>\n     {ts}Confirm Your Registration{/ts}\n    </th>\n   </tr>\n   <tr>\n    <td colspan=\"2\" {$valueStyle}>\n     {capture assign=confirmUrl}{crmURL p=\'civicrm/event/confirm\' q=\"reset=1&participantId=`$participant.id`&cs=`$checksumValue`\" a=true h=0 fe=1}{/capture}\n     <a href=\"{$confirmUrl}\">{ts}Click here to confirm and complete your registration{/ts}</a>\n    </td>\n   </tr>\n  {/if}\n  {if $event.allow_selfcancelxfer }\n  {ts}This event allows for{/ts}\n  {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\" h=0 a=1 fe=1}{/capture}\n       <a href=\"{$selfService}\"> {ts}self service cancel or transfer{/ts}</a>\n  {/if}\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     {if $conference_sessions}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n  {ts}Your schedule:{/ts}\n       </td>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n  {assign var=\'group_by_day\' value=\'NA\'}\n  {foreach from=$conference_sessions item=session}\n   {if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n    {assign var=\'group_by_day\' value=$session.start_date}\n          <em>{$group_by_day|date_format:\"%m/%d/%Y\"}</em><br />\n   {/if}\n   {$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}<br />\n   {if $session.location}&nbsp;&nbsp;&nbsp;&nbsp;{$session.location}<br />{/if}\n  {/foreach}\n       </td>\n      </tr>\n     {/if}\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n  {if $event.allow_selfcancelxfer }\n   <tr>\n     <td colspan=\"2\" {$valueStyle}>\n       {ts 1=$event.selfcancelxfer_time}You may transfer your registration to another participant or cancel your registration up to %1 hours before the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}<br />\n         {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n       <a href=\"{$selfService}\">{ts}Click here to transfer or cancel your registration.{/ts}</a>\n     </td>\n   </tr>\n  {/if}\n  <tr>\n   <td colspan=\"2\" {$valueStyle}>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,838,'participant_confirm',1,0,0,NULL),(38,'Events - Registration Confirmation Invite','{ts 1=$event.event_title}Confirm your registration for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}This is an invitation to complete your registration that was initially waitlisted.{/ts}\n\n{if !$isAdditional and $participant.id}\n\n===========================================================\n{ts}Confirm Your Registration{/ts}\n\n===========================================================\n{capture assign=confirmUrl}{crmURL p=\'civicrm/event/confirm\' q=\"reset=1&participantId=`$participant.id`&cs=`$checksumValue`\" a=true h=0 fe=1}{/capture}\nClick this link to go to a web page where you can confirm your registration online:\n{$confirmUrl}\n{/if}\n{if $event.allow_selfcancelxfer }\n{ts 1=$event.selfcancelxfer_time}You may transfer your registration to another participant or cancel your registration up to %1 hours before the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}\n   {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n{ts}Transfer or cancel your registration:{/ts} {$selfService}\n{/if}\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n{if $conference_sessions}\n\n\n{ts}Your schedule:{/ts}\n{assign var=\'group_by_day\' value=\'NA\'}\n{foreach from=$conference_sessions item=session}\n{if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n{assign var=\'group_by_day\' value=$session.start_date}\n\n{$group_by_day|date_format:\"%m/%d/%Y\"}\n\n\n{/if}\n{$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}\n{if $session.location}    {$session.location}{/if}\n{/foreach}\n{/if}\n\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}This is an invitation to complete your registration that was initially waitlisted.{/ts}</p>\n   </td>\n  </tr>\n  {if !$isAdditional and $participant.id}\n   <tr>\n    <th {$headerStyle}>\n     {ts}Confirm Your Registration{/ts}\n    </th>\n   </tr>\n   <tr>\n    <td colspan=\"2\" {$valueStyle}>\n     {capture assign=confirmUrl}{crmURL p=\'civicrm/event/confirm\' q=\"reset=1&participantId=`$participant.id`&cs=`$checksumValue`\" a=true h=0 fe=1}{/capture}\n     <a href=\"{$confirmUrl}\">{ts}Click here to confirm and complete your registration{/ts}</a>\n    </td>\n   </tr>\n  {/if}\n  {if $event.allow_selfcancelxfer }\n  {ts}This event allows for{/ts}\n  {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\" h=0 a=1 fe=1}{/capture}\n       <a href=\"{$selfService}\"> {ts}self service cancel or transfer{/ts}</a>\n  {/if}\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     {if $conference_sessions}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n  {ts}Your schedule:{/ts}\n       </td>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n  {assign var=\'group_by_day\' value=\'NA\'}\n  {foreach from=$conference_sessions item=session}\n   {if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n    {assign var=\'group_by_day\' value=$session.start_date}\n          <em>{$group_by_day|date_format:\"%m/%d/%Y\"}</em><br />\n   {/if}\n   {$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}<br />\n   {if $session.location}&nbsp;&nbsp;&nbsp;&nbsp;{$session.location}<br />{/if}\n  {/foreach}\n       </td>\n      </tr>\n     {/if}\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n  {if $event.allow_selfcancelxfer }\n   <tr>\n     <td colspan=\"2\" {$valueStyle}>\n       {ts 1=$event.selfcancelxfer_time}You may transfer your registration to another participant or cancel your registration up to %1 hours before the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}<br />\n         {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n       <a href=\"{$selfService}\">{ts}Click here to transfer or cancel your registration.{/ts}</a>\n     </td>\n   </tr>\n  {/if}\n  <tr>\n   <td colspan=\"2\" {$valueStyle}>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,838,'participant_confirm',0,1,0,NULL),(39,'Events - Pending Registration Expiration Notice','{ts 1=$event.event_title}Event registration has expired for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$event.event_title}Your pending event registration for %1 has expired\nbecause you did not confirm your registration.{/ts}\n\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor want to inquire about reinstating your registration for this event.{/ts}\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$event.event_title}Your pending event registration for %1 has expired\nbecause you did not confirm your registration.{/ts}</p>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor want to inquire about reinstating your registration for this event.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,839,'participant_expired',1,0,0,NULL),(40,'Events - Pending Registration Expiration Notice','{ts 1=$event.event_title}Event registration has expired for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$event.event_title}Your pending event registration for %1 has expired\nbecause you did not confirm your registration.{/ts}\n\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor want to inquire about reinstating your registration for this event.{/ts}\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$event.event_title}Your pending event registration for %1 has expired\nbecause you did not confirm your registration.{/ts}</p>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor want to inquire about reinstating your registration for this event.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,839,'participant_expired',0,1,0,NULL),(41,'Events - Registration Transferred Notice','{ts 1=$event.event_title}Event Registration Transferred for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$to_participant}Your Event Registration has been transferred to %1.{/ts}\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$to_participant}Your Event Registration has been Transferred to %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,840,'participant_transferred',1,0,0,NULL),(42,'Events - Registration Transferred Notice','{ts 1=$event.event_title}Event Registration Transferred for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$to_participant}Your Event Registration has been transferred to %1.{/ts}\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$to_participant}Your Event Registration has been Transferred to %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,840,'participant_transferred',0,1,0,NULL),(43,'Tell-a-Friend Email','{ts 1=$senderContactName 2=$title}%1 wants you to know about %2{/ts}\n','{$senderMessage}\n\n{if $generalLink}{ts}For more information, visit:{/ts}\n>> {$generalLink}\n\n{/if}\n{if $contribute}{ts}To make a contribution, go to:{/ts}\n>> {$pageURL}\n\n{/if}\n{if $event}{ts}To find out more about this event, go to:{/ts}\n>> {$pageURL}\n{/if}\n\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <p>{$senderMessage}</p>\n    {if $generalLink}\n     <p><a href=\"{$generalLink}\">{ts}More information{/ts}</a></p>\n    {/if}\n    {if $contribute}\n     <p><a href=\"{$pageURL}\">{ts}Make a contribution{/ts}</a></p>\n    {/if}\n    {if $event}\n     <p><a href=\"{$pageURL}\">{ts}Find out more about this event{/ts}</a></p>\n    {/if}\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,841,'friend',1,0,0,NULL),(44,'Tell-a-Friend Email','{ts 1=$senderContactName 2=$title}%1 wants you to know about %2{/ts}\n','{$senderMessage}\n\n{if $generalLink}{ts}For more information, visit:{/ts}\n>> {$generalLink}\n\n{/if}\n{if $contribute}{ts}To make a contribution, go to:{/ts}\n>> {$pageURL}\n\n{/if}\n{if $event}{ts}To find out more about this event, go to:{/ts}\n>> {$pageURL}\n{/if}\n\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <p>{$senderMessage}</p>\n    {if $generalLink}\n     <p><a href=\"{$generalLink}\">{ts}More information{/ts}</a></p>\n    {/if}\n    {if $contribute}\n     <p><a href=\"{$pageURL}\">{ts}Make a contribution{/ts}</a></p>\n    {/if}\n    {if $event}\n     <p><a href=\"{$pageURL}\">{ts}Find out more about this event{/ts}</a></p>\n    {/if}\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,841,'friend',0,1,0,NULL),(45,'Memberships - Signup and Renewal Receipts (off-line)','{if $receiptType EQ \'membership signup\'}\n{ts}Membership Confirmation and Receipt{/ts}\n{elseif $receiptType EQ \'membership renewal\'}\n{ts}Membership Renewal Confirmation and Receipt{/ts}\n{/if} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $formValues.receipt_text_signup}\n{$formValues.receipt_text_signup}\n{elseif $formValues.receipt_text_renewal}\n{$formValues.receipt_text_renewal}\n{else}{ts}Thank you for this contribution.{/ts}{/if}\n\n{if !$lineItem}\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Type{/ts}: {$membership_name}\n{/if}\n{if ! $cancelled}\n{if !$lineItem}\n{ts}Membership Start Date{/ts}: {$mem_start_date}\n{ts}Membership End Date{/ts}: {$mem_end_date}\n{/if}\n\n{if $formValues.total_amount OR $formValues.total_amount eq 0 }\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{if $formValues.contributionType_name}\n{ts}Financial Type{/ts}: {$formValues.contributionType_name}\n{/if}\n{if $lineItem}\n{foreach from=$lineItem item=value key=priceset}\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_total}{ts}Fee{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{/if}\n{capture assign=ts_start_date}{ts}Membership Start Date{/ts}{/capture}\n{capture assign=ts_end_date}{ts}Membership End Date{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_total|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"} {/if} {$ts_start_date|string_format:\"%20s\"} {$ts_end_date|string_format:\"%20s\"}\n--------------------------------------------------------------------------------------------------\n\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}  {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}  {else}                  {/if}   {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {/if} {$line.start_date|string_format:\"%20s\"} {$line.end_date|string_format:\"%20s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset}\n{$taxTerm} {$priceset|string_format:\"%.2f\"} %: {$value|crmMoney:$currency}\n{elseif  $priceset == 0}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n--------------------------------------------------------------------------------------------------\n{/if}\n\n{if isset($totalTaxAmount)}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Amount{/ts}: {$formValues.total_amount|crmMoney}\n{if $receive_date}\n{ts}Date Received{/ts}: {$receive_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $formValues.paidBy}\n{ts}Paid By{/ts}: {$formValues.paidBy}\n{if $formValues.check_number}\n{ts}Check Number{/ts}: {$formValues.check_number}\n{/if}\n{/if}\n{/if}\n{/if}\n\n{if $isPrimary }\n{if $billingName}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n\n{if $customValues}\n===========================================================\n{ts}Membership Options{/ts}\n\n===========================================================\n{foreach from=$customValues item=value key=customName}\n {$customName} : {$value}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $formValues.receipt_text_signup}\n     <p>{$formValues.receipt_text_signup|htmlize}</p>\n    {elseif $formValues.receipt_text_renewal}\n     <p>{$formValues.receipt_text_renewal|htmlize}</p>\n    {else}\n     <p>{ts}Thank you for this contribution.{/ts}</p>\n    {/if}\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     {if !$lineItem}\n     <tr>\n      <th {$headerStyle}>\n       {ts}Membership Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Membership Type{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$membership_name}\n      </td>\n     </tr>\n     {/if}\n     {if ! $cancelled}\n     {if !$lineItem}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Start Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$mem_start_date}\n       </td>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership End Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$mem_end_date}\n       </td>\n      </tr>\n      {/if}\n      {if $formValues.total_amount OR $formValues.total_amount eq 0 }\n       <tr>\n        <th {$headerStyle}>\n         {ts}Membership Fee{/ts}\n        </th>\n       </tr>\n       {if $formValues.contributionType_name}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.contributionType_name}\n         </td>\n        </tr>\n       {/if}\n\n       {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Fee{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n              <th>{ts}Total{/ts}</th>\n             {/if}\n       <th>{ts}Membership Start Date{/ts}</th>\n       <th>{ts}Membership End Date{/ts}</th>\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td>\n        {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td>\n               {$line.line_total|crmMoney}\n              </td>\n              {if $dataArray}\n               <td>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n               <td>\n                {$line.line_total+$line.tax_amount|crmMoney}\n               </td>\n              {/if}\n              <td>\n               {$line.start_date}\n              </td>\n        <td>\n               {$line.end_date}\n              </td>\n             </tr>\n            {/foreach}\n           </table>\n          </td>\n         </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.total_amount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n       {foreach from=$dataArray item=value key=priceset}\n        <tr>\n        {if $priceset}\n         <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n         <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {elseif  $priceset == 0}\n         <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n         <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {/if}\n        </tr>\n       {/foreach}\n      {/if}\n      {/if}\n      {if isset($totalTaxAmount)}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.total_amount|crmMoney}\n        </td>\n       </tr>\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Date Received{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|truncate:10:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n       {if $formValues.paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.paidBy}\n         </td>\n        </tr>\n        {if $formValues.check_number}\n         <tr>\n          <td {$labelStyle}>\n           {ts}Check Number{/ts}\n          </td>\n          <td {$valueStyle}>\n           {$formValues.check_number}\n          </td>\n         </tr>\n        {/if}\n       {/if}\n      {/if}\n     {/if}\n    </table>\n   </td>\n  </tr>\n\n  {if $isPrimary}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n\n      {if $billingName}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td {$labelStyle}>\n         {$billingName}<br />\n         {$address}\n        </td>\n       </tr>\n      {/if}\n\n      {if $credit_card_type}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Credit Card Information{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td {$valueStyle}>\n         {$credit_card_type}<br />\n         {$credit_card_number}\n        </td>\n       </tr>\n       <tr>\n        <td {$labelStyle}>\n         {ts}Expires{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n        </td>\n       </tr>\n      {/if}\n\n     </table>\n    </td>\n   </tr>\n  {/if}\n\n  {if $customValues}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Options{/ts}\n       </th>\n      </tr>\n      {foreach from=$customValues item=value key=customName}\n       <tr>\n        <td {$labelStyle}>\n         {$customName}\n        </td>\n        <td {$valueStyle}>\n         {$value}\n        </td>\n       </tr>\n      {/foreach}\n     </table>\n    </td>\n   </tr>\n  {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,842,'membership_offline_receipt',1,0,0,NULL),(46,'Memberships - Signup and Renewal Receipts (off-line)','{if $receiptType EQ \'membership signup\'}\n{ts}Membership Confirmation and Receipt{/ts}\n{elseif $receiptType EQ \'membership renewal\'}\n{ts}Membership Renewal Confirmation and Receipt{/ts}\n{/if} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $formValues.receipt_text_signup}\n{$formValues.receipt_text_signup}\n{elseif $formValues.receipt_text_renewal}\n{$formValues.receipt_text_renewal}\n{else}{ts}Thank you for this contribution.{/ts}{/if}\n\n{if !$lineItem}\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Type{/ts}: {$membership_name}\n{/if}\n{if ! $cancelled}\n{if !$lineItem}\n{ts}Membership Start Date{/ts}: {$mem_start_date}\n{ts}Membership End Date{/ts}: {$mem_end_date}\n{/if}\n\n{if $formValues.total_amount OR $formValues.total_amount eq 0 }\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{if $formValues.contributionType_name}\n{ts}Financial Type{/ts}: {$formValues.contributionType_name}\n{/if}\n{if $lineItem}\n{foreach from=$lineItem item=value key=priceset}\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_total}{ts}Fee{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{/if}\n{capture assign=ts_start_date}{ts}Membership Start Date{/ts}{/capture}\n{capture assign=ts_end_date}{ts}Membership End Date{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_total|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"} {/if} {$ts_start_date|string_format:\"%20s\"} {$ts_end_date|string_format:\"%20s\"}\n--------------------------------------------------------------------------------------------------\n\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}  {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}  {else}                  {/if}   {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {/if} {$line.start_date|string_format:\"%20s\"} {$line.end_date|string_format:\"%20s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset}\n{$taxTerm} {$priceset|string_format:\"%.2f\"} %: {$value|crmMoney:$currency}\n{elseif  $priceset == 0}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n--------------------------------------------------------------------------------------------------\n{/if}\n\n{if isset($totalTaxAmount)}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Amount{/ts}: {$formValues.total_amount|crmMoney}\n{if $receive_date}\n{ts}Date Received{/ts}: {$receive_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $formValues.paidBy}\n{ts}Paid By{/ts}: {$formValues.paidBy}\n{if $formValues.check_number}\n{ts}Check Number{/ts}: {$formValues.check_number}\n{/if}\n{/if}\n{/if}\n{/if}\n\n{if $isPrimary }\n{if $billingName}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n\n{if $customValues}\n===========================================================\n{ts}Membership Options{/ts}\n\n===========================================================\n{foreach from=$customValues item=value key=customName}\n {$customName} : {$value}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $formValues.receipt_text_signup}\n     <p>{$formValues.receipt_text_signup|htmlize}</p>\n    {elseif $formValues.receipt_text_renewal}\n     <p>{$formValues.receipt_text_renewal|htmlize}</p>\n    {else}\n     <p>{ts}Thank you for this contribution.{/ts}</p>\n    {/if}\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     {if !$lineItem}\n     <tr>\n      <th {$headerStyle}>\n       {ts}Membership Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Membership Type{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$membership_name}\n      </td>\n     </tr>\n     {/if}\n     {if ! $cancelled}\n     {if !$lineItem}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Start Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$mem_start_date}\n       </td>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership End Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$mem_end_date}\n       </td>\n      </tr>\n      {/if}\n      {if $formValues.total_amount OR $formValues.total_amount eq 0 }\n       <tr>\n        <th {$headerStyle}>\n         {ts}Membership Fee{/ts}\n        </th>\n       </tr>\n       {if $formValues.contributionType_name}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.contributionType_name}\n         </td>\n        </tr>\n       {/if}\n\n       {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Fee{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n              <th>{ts}Total{/ts}</th>\n             {/if}\n       <th>{ts}Membership Start Date{/ts}</th>\n       <th>{ts}Membership End Date{/ts}</th>\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td>\n        {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td>\n               {$line.line_total|crmMoney}\n              </td>\n              {if $dataArray}\n               <td>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n               <td>\n                {$line.line_total+$line.tax_amount|crmMoney}\n               </td>\n              {/if}\n              <td>\n               {$line.start_date}\n              </td>\n        <td>\n               {$line.end_date}\n              </td>\n             </tr>\n            {/foreach}\n           </table>\n          </td>\n         </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.total_amount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n       {foreach from=$dataArray item=value key=priceset}\n        <tr>\n        {if $priceset}\n         <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n         <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {elseif  $priceset == 0}\n         <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n         <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {/if}\n        </tr>\n       {/foreach}\n      {/if}\n      {/if}\n      {if isset($totalTaxAmount)}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.total_amount|crmMoney}\n        </td>\n       </tr>\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Date Received{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|truncate:10:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n       {if $formValues.paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.paidBy}\n         </td>\n        </tr>\n        {if $formValues.check_number}\n         <tr>\n          <td {$labelStyle}>\n           {ts}Check Number{/ts}\n          </td>\n          <td {$valueStyle}>\n           {$formValues.check_number}\n          </td>\n         </tr>\n        {/if}\n       {/if}\n      {/if}\n     {/if}\n    </table>\n   </td>\n  </tr>\n\n  {if $isPrimary}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n\n      {if $billingName}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td {$labelStyle}>\n         {$billingName}<br />\n         {$address}\n        </td>\n       </tr>\n      {/if}\n\n      {if $credit_card_type}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Credit Card Information{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td {$valueStyle}>\n         {$credit_card_type}<br />\n         {$credit_card_number}\n        </td>\n       </tr>\n       <tr>\n        <td {$labelStyle}>\n         {ts}Expires{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n        </td>\n       </tr>\n      {/if}\n\n     </table>\n    </td>\n   </tr>\n  {/if}\n\n  {if $customValues}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Options{/ts}\n       </th>\n      </tr>\n      {foreach from=$customValues item=value key=customName}\n       <tr>\n        <td {$labelStyle}>\n         {$customName}\n        </td>\n        <td {$valueStyle}>\n         {$value}\n        </td>\n       </tr>\n      {/foreach}\n     </table>\n    </td>\n   </tr>\n  {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,842,'membership_offline_receipt',0,1,0,NULL),(47,'Memberships - Receipt (on-line)','{if $is_pay_later}{ts}Invoice{/ts}{else}{ts}Receipt{/ts}{/if} - {$title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $receipt_text}\n{$receipt_text}\n{/if}\n{if $is_pay_later}\n\n===========================================================\n{$pay_later_receipt}\n===========================================================\n{/if}\n\n{if $membership_assign && !$useForMember}\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Type{/ts}: {$membership_name}\n{if $mem_start_date}{ts}Membership Start Date{/ts}: {$mem_start_date|crmDate}\n{/if}\n{if $mem_end_date}{ts}Membership End Date{/ts}: {$mem_end_date|crmDate}\n{/if}\n\n{/if}\n{if $amount}\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{if !$useForMember && $membership_amount && $is_quick_config}\n{ts 1=$membership_name}%1 Membership{/ts}: {$membership_amount|crmMoney}\n{if $amount && !$is_separate_payment }\n{ts}Contribution Amount{/ts}: {$amount|crmMoney}\n-------------------------------------------\n{ts}Total{/ts}: {$amount+$membership_amount|crmMoney}\n{/if}\n{elseif !$useForMember && $lineItem and $priceSetID & !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{$line.description|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney|string_format:\"%10s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n\n{ts}Total Amount{/ts}: {$amount|crmMoney}\n{else}\n{if $useForMember && $lineItem && !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_total}{ts}Fee{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{/if}\n{capture assign=ts_start_date}{ts}Membership Start Date{/ts}{/capture}\n{capture assign=ts_end_date}{ts}Membership End Date{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_total|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"} {/if} {$ts_start_date|string_format:\"%20s\"} {$ts_end_date|string_format:\"%20s\"}\n--------------------------------------------------------------------------------------------------\n\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}  {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}   {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {/if} {$line.start_date|string_format:\"%20s\"} {$line.end_date|string_format:\"%20s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n--------------------------------------------------------------------------------------------------\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Amount{/ts}: {$amount|crmMoney} {if $amount_level } - {$amount_level} {/if}\n{/if}\n{elseif $membership_amount}\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{ts 1=$membership_name}%1 Membership{/ts}: {$membership_amount|crmMoney}\n{/if}\n\n{if $receive_date}\n\n{ts}Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $is_monetary and $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n\n{/if}\n{if $membership_trx_id}\n{ts}Membership Transaction #{/ts}: {$membership_trx_id}\n\n{/if}\n{if $is_recur}\n{ts}This membership will be renewed automatically.{/ts}\n{if $cancelSubscriptionUrl}\n\n{ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by visiting this web page: %1.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n{/if}\n{/if}\n\n{if $honor_block_is_active }\n===========================================================\n{$soft_credit_type}\n===========================================================\n{foreach from=$honoreeProfile item=value key=label}\n{$label}: {$value}\n{/foreach}\n\n{/if}\n{if $pcpBlock}\n===========================================================\n{ts}Personal Campaign Page{/ts}\n\n===========================================================\n{ts}Display In Honor Roll{/ts}: {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n\n{if $pcp_roll_nickname}{ts}Nickname{/ts}: {$pcp_roll_nickname}{/if}\n\n{if $pcp_personal_note}{ts}Personal Note{/ts}: {$pcp_personal_note}{/if}\n\n{/if}\n{if $onBehalfProfile}\n===========================================================\n{ts}On Behalf Of{/ts}\n\n===========================================================\n{foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n{$onBehalfName}: {$onBehalfValue}\n{/foreach}\n{/if}\n\n{if $billingName}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n{elseif $email}\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$email}\n{/if} {* End billingName or email *}\n{if $credit_card_type}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n\n{if $selectPremium }\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$product_name}\n{if $option}\n{ts}Option{/ts}: {$option}\n{/if}\n{if $sku}\n{ts}SKU{/ts}: {$sku}\n{/if}\n{if $start_date}\n{ts}Start Date{/ts}: {$start_date|crmDate}\n{/if}\n{if $end_date}\n{ts}End Date{/ts}: {$end_date|crmDate}\n{/if}\n{if $contact_email OR $contact_phone}\n\n{ts}For information about this premium, contact:{/ts}\n\n{if $contact_email}\n  {$contact_email}\n{/if}\n{if $contact_phone}\n  {$contact_phone}\n{/if}\n{/if}\n{if $is_deductible AND $price}\n\n{ts 1=$price|crmMoney}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}{/if}\n{/if}\n\n{if $customPre}\n===========================================================\n{$customPre_grouptitle}\n\n===========================================================\n{foreach from=$customPre item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n\n\n{if $customPost}\n===========================================================\n{$customPost_grouptitle}\n\n===========================================================\n{foreach from=$customPost item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $receipt_text}\n     <p>{$receipt_text|htmlize}</p>\n    {/if}\n\n    {if $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  </table>\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n     {if $membership_assign && !$useForMember}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Type{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_name}\n       </td>\n      </tr>\n      {if $mem_start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$mem_start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $mem_end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$mem_end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n\n     {if $amount}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Fee{/ts}\n       </th>\n      </tr>\n\n      {if !$useForMember and $membership_amount and $is_quick_config}\n\n       <tr>\n        <td {$labelStyle}>\n         {ts 1=$membership_name}%1 Membership{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$membership_amount|crmMoney}\n        </td>\n       </tr>\n       {if $amount && !$is_separate_payment }\n         <tr>\n          <td {$labelStyle}>\n           {ts}Contribution Amount{/ts}\n          </td>\n          <td {$valueStyle}>\n           {$amount|crmMoney}\n          </td>\n         </tr>\n         <tr>\n           <td {$labelStyle}>\n           {ts}Total{/ts}\n            </td>\n            <td {$valueStyle}>\n            {$amount+$membership_amount|crmMoney}\n           </td>\n         </tr>\n       {/if}\n\n      {elseif !$useForMember && $lineItem and $priceSetID and !$is_quick_config}\n\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Qty{/ts}</th>\n            <th>{ts}Each{/ts}</th>\n            <th>{ts}Total{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n              {$line.description|truncate:30:\"...\"}\n             </td>\n             <td>\n              {$line.qty}\n             </td>\n             <td>\n              {$line.unit_price|crmMoney}\n             </td>\n             <td>\n              {$line.line_total|crmMoney}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney}\n        </td>\n       </tr>\n\n      {else}\n       {if $useForMember && $lineItem and !$is_quick_config}\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Fee{/ts}</th>\n            {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n              <th>{ts}Total{/ts}</th>\n            {/if}\n      <th>{ts}Membership Start Date{/ts}</th>\n      <th>{ts}Membership End Date{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n             {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n             </td>\n             <td>\n              {$line.line_total|crmMoney}\n             </td>\n             {if $dataArray}\n              <td>\n               {$line.unit_price*$line.qty|crmMoney}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n               <td>\n                {$line.tax_rate|string_format:\"%.2f\"}%\n               </td>\n               <td>\n                {$line.tax_amount|crmMoney}\n               </td>\n              {else}\n               <td></td>\n               <td></td>\n              {/if}\n              <td>\n               {$line.line_total+$line.tax_amount|crmMoney}\n              </td>\n             {/if}\n             <td>\n              {$line.start_date}\n             </td>\n       <td>\n              {$line.end_date}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$amount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n         {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n         {else}\n           <td>&nbsp;{ts}NO{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n         {/if}\n         </tr>\n        {/foreach}\n       {/if}\n       {/if}\n       {if $totalTaxAmount}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney} {if $amount_level} - {$amount_level}{/if}\n        </td>\n       </tr>\n\n      {/if}\n\n\n     {elseif $membership_amount}\n\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Fee{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts 1=$membership_name}%1 Membership{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_amount|crmMoney}\n       </td>\n      </tr>\n\n\n     {/if}\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $is_monetary and $trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n     {if $membership_trx_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_trx_id}\n       </td>\n      </tr>\n     {/if}\n     {if $is_recur}\n       <tr>\n        <td colspan=\"2\" {$labelStyle}>\n         {ts}This membership will be renewed automatically.{/ts}\n         {if $cancelSubscriptionUrl}\n           {ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n         {/if}\n        </td>\n       </tr>\n       {if $updateSubscriptionBillingUrl}\n         <tr>\n          <td colspan=\"2\" {$labelStyle}>\n           {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n         </tr>\n       {/if}\n     {/if}\n\n     {if $honor_block_is_active}\n      <tr>\n       <th {$headerStyle}>\n        {$soft_credit_type}\n       </th>\n      </tr>\n      {foreach from=$honoreeProfile item=value key=label}\n        <tr>\n         <td {$labelStyle}>\n          {$label}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $pcpBlock}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Personal Campaign Page{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Display In Honor Roll{/ts}\n       </td>\n       <td {$valueStyle}>\n        {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n       </td>\n      </tr>\n      {if $pcp_roll_nickname}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Nickname{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_roll_nickname}\n        </td>\n       </tr>\n      {/if}\n      {if $pcp_personal_note}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Personal Note{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_personal_note}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $onBehalfProfile}\n      <tr>\n       <th {$headerStyle}>\n        {$onBehalfProfile_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n        <tr>\n         <td {$labelStyle}>\n          {$onBehalfName}\n         </td>\n         <td {$valueStyle}>\n          {$onBehalfValue}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $billingName}\n       <tr>\n         <th {$headerStyle}>\n           {ts}Billing Name and Address{/ts}\n         </th>\n      </tr>\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}<br />\n          {$email}\n        </td>\n      </tr>\n    {elseif $email}\n      <tr>\n        <th {$headerStyle}>\n          {ts}Registered Email{/ts}\n        </th>\n      </tr>\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n          {$email}\n        </td>\n      </tr>\n    {/if}\n\n     {if $credit_card_type}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n     {/if}\n\n     {if $selectPremium}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$product_name}\n       </td>\n      </tr>\n      {if $option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$option}\n        </td>\n       </tr>\n      {/if}\n      {if $sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$sku}\n        </td>\n       </tr>\n      {/if}\n      {if $start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $contact_email OR $contact_phone}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}For information about this premium, contact:{/ts}</p>\n         {if $contact_email}\n          <p>{$contact_email}</p>\n         {/if}\n         {if $contact_phone}\n          <p>{$contact_phone}</p>\n         {/if}\n        </td>\n       </tr>\n      {/if}\n      {if $is_deductible AND $price}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <p>{ts 1=$price|crmMoney}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}</p>\n         </td>\n        </tr>\n      {/if}\n     {/if}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,843,'membership_online_receipt',1,0,0,NULL),(48,'Memberships - Receipt (on-line)','{if $is_pay_later}{ts}Invoice{/ts}{else}{ts}Receipt{/ts}{/if} - {$title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $receipt_text}\n{$receipt_text}\n{/if}\n{if $is_pay_later}\n\n===========================================================\n{$pay_later_receipt}\n===========================================================\n{/if}\n\n{if $membership_assign && !$useForMember}\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Type{/ts}: {$membership_name}\n{if $mem_start_date}{ts}Membership Start Date{/ts}: {$mem_start_date|crmDate}\n{/if}\n{if $mem_end_date}{ts}Membership End Date{/ts}: {$mem_end_date|crmDate}\n{/if}\n\n{/if}\n{if $amount}\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{if !$useForMember && $membership_amount && $is_quick_config}\n{ts 1=$membership_name}%1 Membership{/ts}: {$membership_amount|crmMoney}\n{if $amount && !$is_separate_payment }\n{ts}Contribution Amount{/ts}: {$amount|crmMoney}\n-------------------------------------------\n{ts}Total{/ts}: {$amount+$membership_amount|crmMoney}\n{/if}\n{elseif !$useForMember && $lineItem and $priceSetID & !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{$line.description|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney|string_format:\"%10s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n\n{ts}Total Amount{/ts}: {$amount|crmMoney}\n{else}\n{if $useForMember && $lineItem && !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_total}{ts}Fee{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{/if}\n{capture assign=ts_start_date}{ts}Membership Start Date{/ts}{/capture}\n{capture assign=ts_end_date}{ts}Membership End Date{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_total|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"} {/if} {$ts_start_date|string_format:\"%20s\"} {$ts_end_date|string_format:\"%20s\"}\n--------------------------------------------------------------------------------------------------\n\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}  {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}   {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {/if} {$line.start_date|string_format:\"%20s\"} {$line.end_date|string_format:\"%20s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n--------------------------------------------------------------------------------------------------\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Amount{/ts}: {$amount|crmMoney} {if $amount_level } - {$amount_level} {/if}\n{/if}\n{elseif $membership_amount}\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{ts 1=$membership_name}%1 Membership{/ts}: {$membership_amount|crmMoney}\n{/if}\n\n{if $receive_date}\n\n{ts}Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $is_monetary and $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n\n{/if}\n{if $membership_trx_id}\n{ts}Membership Transaction #{/ts}: {$membership_trx_id}\n\n{/if}\n{if $is_recur}\n{ts}This membership will be renewed automatically.{/ts}\n{if $cancelSubscriptionUrl}\n\n{ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by visiting this web page: %1.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n{/if}\n{/if}\n\n{if $honor_block_is_active }\n===========================================================\n{$soft_credit_type}\n===========================================================\n{foreach from=$honoreeProfile item=value key=label}\n{$label}: {$value}\n{/foreach}\n\n{/if}\n{if $pcpBlock}\n===========================================================\n{ts}Personal Campaign Page{/ts}\n\n===========================================================\n{ts}Display In Honor Roll{/ts}: {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n\n{if $pcp_roll_nickname}{ts}Nickname{/ts}: {$pcp_roll_nickname}{/if}\n\n{if $pcp_personal_note}{ts}Personal Note{/ts}: {$pcp_personal_note}{/if}\n\n{/if}\n{if $onBehalfProfile}\n===========================================================\n{ts}On Behalf Of{/ts}\n\n===========================================================\n{foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n{$onBehalfName}: {$onBehalfValue}\n{/foreach}\n{/if}\n\n{if $billingName}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n{elseif $email}\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$email}\n{/if} {* End billingName or email *}\n{if $credit_card_type}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n\n{if $selectPremium }\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$product_name}\n{if $option}\n{ts}Option{/ts}: {$option}\n{/if}\n{if $sku}\n{ts}SKU{/ts}: {$sku}\n{/if}\n{if $start_date}\n{ts}Start Date{/ts}: {$start_date|crmDate}\n{/if}\n{if $end_date}\n{ts}End Date{/ts}: {$end_date|crmDate}\n{/if}\n{if $contact_email OR $contact_phone}\n\n{ts}For information about this premium, contact:{/ts}\n\n{if $contact_email}\n  {$contact_email}\n{/if}\n{if $contact_phone}\n  {$contact_phone}\n{/if}\n{/if}\n{if $is_deductible AND $price}\n\n{ts 1=$price|crmMoney}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}{/if}\n{/if}\n\n{if $customPre}\n===========================================================\n{$customPre_grouptitle}\n\n===========================================================\n{foreach from=$customPre item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n\n\n{if $customPost}\n===========================================================\n{$customPost_grouptitle}\n\n===========================================================\n{foreach from=$customPost item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $receipt_text}\n     <p>{$receipt_text|htmlize}</p>\n    {/if}\n\n    {if $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  </table>\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n     {if $membership_assign && !$useForMember}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Type{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_name}\n       </td>\n      </tr>\n      {if $mem_start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$mem_start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $mem_end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$mem_end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n\n     {if $amount}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Fee{/ts}\n       </th>\n      </tr>\n\n      {if !$useForMember and $membership_amount and $is_quick_config}\n\n       <tr>\n        <td {$labelStyle}>\n         {ts 1=$membership_name}%1 Membership{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$membership_amount|crmMoney}\n        </td>\n       </tr>\n       {if $amount && !$is_separate_payment }\n         <tr>\n          <td {$labelStyle}>\n           {ts}Contribution Amount{/ts}\n          </td>\n          <td {$valueStyle}>\n           {$amount|crmMoney}\n          </td>\n         </tr>\n         <tr>\n           <td {$labelStyle}>\n           {ts}Total{/ts}\n            </td>\n            <td {$valueStyle}>\n            {$amount+$membership_amount|crmMoney}\n           </td>\n         </tr>\n       {/if}\n\n      {elseif !$useForMember && $lineItem and $priceSetID and !$is_quick_config}\n\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Qty{/ts}</th>\n            <th>{ts}Each{/ts}</th>\n            <th>{ts}Total{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n              {$line.description|truncate:30:\"...\"}\n             </td>\n             <td>\n              {$line.qty}\n             </td>\n             <td>\n              {$line.unit_price|crmMoney}\n             </td>\n             <td>\n              {$line.line_total|crmMoney}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney}\n        </td>\n       </tr>\n\n      {else}\n       {if $useForMember && $lineItem and !$is_quick_config}\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Fee{/ts}</th>\n            {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n              <th>{ts}Total{/ts}</th>\n            {/if}\n      <th>{ts}Membership Start Date{/ts}</th>\n      <th>{ts}Membership End Date{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n             {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n             </td>\n             <td>\n              {$line.line_total|crmMoney}\n             </td>\n             {if $dataArray}\n              <td>\n               {$line.unit_price*$line.qty|crmMoney}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n               <td>\n                {$line.tax_rate|string_format:\"%.2f\"}%\n               </td>\n               <td>\n                {$line.tax_amount|crmMoney}\n               </td>\n              {else}\n               <td></td>\n               <td></td>\n              {/if}\n              <td>\n               {$line.line_total+$line.tax_amount|crmMoney}\n              </td>\n             {/if}\n             <td>\n              {$line.start_date}\n             </td>\n       <td>\n              {$line.end_date}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$amount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n         {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n         {else}\n           <td>&nbsp;{ts}NO{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n         {/if}\n         </tr>\n        {/foreach}\n       {/if}\n       {/if}\n       {if $totalTaxAmount}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney} {if $amount_level} - {$amount_level}{/if}\n        </td>\n       </tr>\n\n      {/if}\n\n\n     {elseif $membership_amount}\n\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Fee{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts 1=$membership_name}%1 Membership{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_amount|crmMoney}\n       </td>\n      </tr>\n\n\n     {/if}\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $is_monetary and $trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n     {if $membership_trx_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_trx_id}\n       </td>\n      </tr>\n     {/if}\n     {if $is_recur}\n       <tr>\n        <td colspan=\"2\" {$labelStyle}>\n         {ts}This membership will be renewed automatically.{/ts}\n         {if $cancelSubscriptionUrl}\n           {ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n         {/if}\n        </td>\n       </tr>\n       {if $updateSubscriptionBillingUrl}\n         <tr>\n          <td colspan=\"2\" {$labelStyle}>\n           {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n         </tr>\n       {/if}\n     {/if}\n\n     {if $honor_block_is_active}\n      <tr>\n       <th {$headerStyle}>\n        {$soft_credit_type}\n       </th>\n      </tr>\n      {foreach from=$honoreeProfile item=value key=label}\n        <tr>\n         <td {$labelStyle}>\n          {$label}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $pcpBlock}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Personal Campaign Page{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Display In Honor Roll{/ts}\n       </td>\n       <td {$valueStyle}>\n        {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n       </td>\n      </tr>\n      {if $pcp_roll_nickname}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Nickname{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_roll_nickname}\n        </td>\n       </tr>\n      {/if}\n      {if $pcp_personal_note}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Personal Note{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_personal_note}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $onBehalfProfile}\n      <tr>\n       <th {$headerStyle}>\n        {$onBehalfProfile_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n        <tr>\n         <td {$labelStyle}>\n          {$onBehalfName}\n         </td>\n         <td {$valueStyle}>\n          {$onBehalfValue}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $billingName}\n       <tr>\n         <th {$headerStyle}>\n           {ts}Billing Name and Address{/ts}\n         </th>\n      </tr>\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}<br />\n          {$email}\n        </td>\n      </tr>\n    {elseif $email}\n      <tr>\n        <th {$headerStyle}>\n          {ts}Registered Email{/ts}\n        </th>\n      </tr>\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n          {$email}\n        </td>\n      </tr>\n    {/if}\n\n     {if $credit_card_type}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n     {/if}\n\n     {if $selectPremium}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$product_name}\n       </td>\n      </tr>\n      {if $option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$option}\n        </td>\n       </tr>\n      {/if}\n      {if $sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$sku}\n        </td>\n       </tr>\n      {/if}\n      {if $start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $contact_email OR $contact_phone}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}For information about this premium, contact:{/ts}</p>\n         {if $contact_email}\n          <p>{$contact_email}</p>\n         {/if}\n         {if $contact_phone}\n          <p>{$contact_phone}</p>\n         {/if}\n        </td>\n       </tr>\n      {/if}\n      {if $is_deductible AND $price}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <p>{ts 1=$price|crmMoney}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}</p>\n         </td>\n        </tr>\n      {/if}\n     {/if}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,843,'membership_online_receipt',0,1,0,NULL),(49,'Memberships - Auto-renew Cancellation Notification','{ts}Autorenew Membership Cancellation Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$membershipType}The automatic renewal of your %1 membership has been cancelled as requested. This does not affect the status of your membership - you will receive a separate notification when your membership is up for renewal.{/ts}\n\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Status{/ts}: {$membership_status}\n{if $mem_start_date}{ts}Membership Start Date{/ts}: {$mem_start_date|crmDate}\n{/if}\n{if $mem_end_date}{ts}Membership End Date{/ts}: {$mem_end_date|crmDate}\n{/if}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$membershipType}The automatic renewal of your %1 membership has been cancelled as requested. This does not affect the status of your membership - you will receive a separate notification when your membership is up for renewal.{/ts}</p>\n\n   </td>\n  </tr>\n </table>\n <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Status{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_status}\n       </td>\n      </tr>\n      {if $mem_start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$mem_start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $mem_end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$mem_end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,844,'membership_autorenew_cancelled',1,0,0,NULL),(50,'Memberships - Auto-renew Cancellation Notification','{ts}Autorenew Membership Cancellation Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$membershipType}The automatic renewal of your %1 membership has been cancelled as requested. This does not affect the status of your membership - you will receive a separate notification when your membership is up for renewal.{/ts}\n\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Status{/ts}: {$membership_status}\n{if $mem_start_date}{ts}Membership Start Date{/ts}: {$mem_start_date|crmDate}\n{/if}\n{if $mem_end_date}{ts}Membership End Date{/ts}: {$mem_end_date|crmDate}\n{/if}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$membershipType}The automatic renewal of your %1 membership has been cancelled as requested. This does not affect the status of your membership - you will receive a separate notification when your membership is up for renewal.{/ts}</p>\n\n   </td>\n  </tr>\n </table>\n <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Status{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_status}\n       </td>\n      </tr>\n      {if $mem_start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$mem_start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $mem_end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$mem_end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,844,'membership_autorenew_cancelled',0,1,0,NULL),(51,'Memberships - Auto-renew Billing Updates','{ts}Membership Autorenewal Billing Updates{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$membershipType}Billing details for your automatically renewed %1 membership have been updated.{/ts}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$membershipType}Billing details for your automatically renewed %1 membership have been updated.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n   <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n        <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n         {ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n        </td>\n      </tr>\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,845,'membership_autorenew_billing',1,0,0,NULL),(52,'Memberships - Auto-renew Billing Updates','{ts}Membership Autorenewal Billing Updates{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$membershipType}Billing details for your automatically renewed %1 membership have been updated.{/ts}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$membershipType}Billing details for your automatically renewed %1 membership have been updated.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n   <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n        <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n         {ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n        </td>\n      </tr>\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,845,'membership_autorenew_billing',0,1,0,NULL),(53,'Test-drive - Receipt Header','[TEST]\n','***********************************************************\n\n{ts}Test-drive Email / Receipt{/ts}\n\n{ts}This is a test-drive email. No live financial transaction has occurred.{/ts}\n\n***********************************************************\n','<center>\n <table id=\"crm-event_receipt_test\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n  <tr>\n   <td>\n    <p>{ts}Test-drive Email / Receipt{/ts}</p>\n    <p>{ts}This is a test-drive email. No live financial transaction has occurred.{/ts}</p>\n   </td>\n  </tr>\n </table>\n</center>\n',1,846,'test_preview',1,0,0,NULL),(54,'Test-drive - Receipt Header','[TEST]\n','***********************************************************\n\n{ts}Test-drive Email / Receipt{/ts}\n\n{ts}This is a test-drive email. No live financial transaction has occurred.{/ts}\n\n***********************************************************\n','<center>\n <table id=\"crm-event_receipt_test\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n  <tr>\n   <td>\n    <p>{ts}Test-drive Email / Receipt{/ts}</p>\n    <p>{ts}This is a test-drive email. No live financial transaction has occurred.{/ts}</p>\n   </td>\n  </tr>\n </table>\n</center>\n',1,846,'test_preview',0,1,0,NULL),(55,'Pledges - Acknowledgement','{ts}Thank you for your Pledge{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n{ts}Thank you for your generous pledge.{/ts}\n\n===========================================================\n{ts}Pledge Information{/ts}\n\n===========================================================\n{ts}Pledge Received{/ts}: {$create_date|truncate:10:\'\'|crmDate}\n{ts}Total Pledge Amount{/ts}: {$total_pledge_amount|crmMoney:$currency}\n\n===========================================================\n{ts}Payment Schedule{/ts}\n\n===========================================================\n{ts 1=$scheduled_amount|crmMoney:$currency 2=$frequency_interval 3=$frequency_unit 4=$installments}%1 every %2 %3 for %4 installments.{/ts}\n\n{if $frequency_day}\n\n{ts 1=$frequency_day 2=$frequency_unit}Payments are due on day %1 of the %2.{/ts}\n{/if}\n\n{if $payments}\n{assign var=\"count\" value=\"1\"}\n{foreach from=$payments item=payment}\n\n{ts 1=$count}Payment %1{/ts}: {$payment.amount|crmMoney:$currency} {if $payment.status eq 1}{ts}paid{/ts} {$payment.receive_date|truncate:10:\'\'|crmDate}{else}{ts}due{/ts} {$payment.due_date|truncate:10:\'\'|crmDate}{/if}\n{assign var=\"count\" value=`$count+1`}\n{/foreach}\n{/if}\n\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}\n\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n===========================================================\n{$customName}\n===========================================================\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Thank you for your generous pledge.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Pledge Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Pledge Received{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$create_date|truncate:10:\'\'|crmDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Pledge Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$total_pledge_amount|crmMoney:$currency}\n      </td>\n     </tr>\n     <tr>\n      <th {$headerStyle}>\n       {ts}Payment Schedule{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       <p>{ts 1=$scheduled_amount|crmMoney:$currency 2=$frequency_interval 3=$frequency_unit 4=$installments}%1 every %2 %3 for %4 installments.{/ts}</p>\n\n       {if $frequency_day}\n        <p>{ts 1=$frequency_day 2=$frequency_unit}Payments are due on day %1 of the %2.{/ts}</p>\n       {/if}\n      </td>\n     </tr>\n\n     {if $payments}\n      {assign var=\"count\" value=\"1\"}\n      {foreach from=$payments item=payment}\n       <tr>\n        <td {$labelStyle}>\n         {ts 1=$count}Payment %1{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$payment.amount|crmMoney:$currency} {if $payment.status eq 1}{ts}paid{/ts} {$payment.receive_date|truncate:10:\'\'|crmDate}{else}{ts}due{/ts} {$payment.due_date|truncate:10:\'\'|crmDate}{/if}\n        </td>\n       </tr>\n       {assign var=\"count\" value=`$count+1`}\n      {/foreach}\n     {/if}\n\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}</p>\n      </td>\n     </tr>\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,847,'pledge_acknowledge',1,0,0,NULL),(56,'Pledges - Acknowledgement','{ts}Thank you for your Pledge{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n{ts}Thank you for your generous pledge.{/ts}\n\n===========================================================\n{ts}Pledge Information{/ts}\n\n===========================================================\n{ts}Pledge Received{/ts}: {$create_date|truncate:10:\'\'|crmDate}\n{ts}Total Pledge Amount{/ts}: {$total_pledge_amount|crmMoney:$currency}\n\n===========================================================\n{ts}Payment Schedule{/ts}\n\n===========================================================\n{ts 1=$scheduled_amount|crmMoney:$currency 2=$frequency_interval 3=$frequency_unit 4=$installments}%1 every %2 %3 for %4 installments.{/ts}\n\n{if $frequency_day}\n\n{ts 1=$frequency_day 2=$frequency_unit}Payments are due on day %1 of the %2.{/ts}\n{/if}\n\n{if $payments}\n{assign var=\"count\" value=\"1\"}\n{foreach from=$payments item=payment}\n\n{ts 1=$count}Payment %1{/ts}: {$payment.amount|crmMoney:$currency} {if $payment.status eq 1}{ts}paid{/ts} {$payment.receive_date|truncate:10:\'\'|crmDate}{else}{ts}due{/ts} {$payment.due_date|truncate:10:\'\'|crmDate}{/if}\n{assign var=\"count\" value=`$count+1`}\n{/foreach}\n{/if}\n\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}\n\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n===========================================================\n{$customName}\n===========================================================\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Thank you for your generous pledge.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Pledge Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Pledge Received{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$create_date|truncate:10:\'\'|crmDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Pledge Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$total_pledge_amount|crmMoney:$currency}\n      </td>\n     </tr>\n     <tr>\n      <th {$headerStyle}>\n       {ts}Payment Schedule{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       <p>{ts 1=$scheduled_amount|crmMoney:$currency 2=$frequency_interval 3=$frequency_unit 4=$installments}%1 every %2 %3 for %4 installments.{/ts}</p>\n\n       {if $frequency_day}\n        <p>{ts 1=$frequency_day 2=$frequency_unit}Payments are due on day %1 of the %2.{/ts}</p>\n       {/if}\n      </td>\n     </tr>\n\n     {if $payments}\n      {assign var=\"count\" value=\"1\"}\n      {foreach from=$payments item=payment}\n       <tr>\n        <td {$labelStyle}>\n         {ts 1=$count}Payment %1{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$payment.amount|crmMoney:$currency} {if $payment.status eq 1}{ts}paid{/ts} {$payment.receive_date|truncate:10:\'\'|crmDate}{else}{ts}due{/ts} {$payment.due_date|truncate:10:\'\'|crmDate}{/if}\n        </td>\n       </tr>\n       {assign var=\"count\" value=`$count+1`}\n      {/foreach}\n     {/if}\n\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}</p>\n      </td>\n     </tr>\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,847,'pledge_acknowledge',0,1,0,NULL),(57,'Pledges - Payment Reminder','{ts}Pledge Payment Reminder{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$next_payment|truncate:10:\'\'|crmDate}This is a reminder that the next payment on your pledge is due on %1.{/ts}\n\n===========================================================\n{ts}Payment Due{/ts}\n\n===========================================================\n{ts}Amount Due{/ts}: {$amount_due|crmMoney:$currency}\n{ts}Due Date{/ts}: {$scheduled_payment_date|truncate:10:\'\'|crmDate}\n\n{if $contribution_page_id}\n{capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contribution_page_id`&cid=`$contact.contact_id`&pledgeId=`$pledge_id`&cs=`$checksumValue`\" a=true h=0}{/capture}\nClick this link to go to a web page where you can make your payment online:\n{$contributionUrl}\n{else}\n{ts}Please mail your payment to{/ts}:\n{$domain.address}\n{/if}\n\n===========================================================\n{ts}Pledge Information{/ts}\n\n===========================================================\n{ts}Pledge Received{/ts}: {$create_date|truncate:10:\'\'|crmDate}\n{ts}Total Pledge Amount{/ts}: {$amount|crmMoney:$currency}\n{ts}Total Paid{/ts}: {$amount_paid|crmMoney:$currency}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}\n\n\n{ts}Thank your for your generous support.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$next_payment|truncate:10:\'\'|crmDate}This is a reminder that the next payment on your pledge is due on %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Payment Due{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Amount Due{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount_due|crmMoney:$currency}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    {if $contribution_page_id}\n     {capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contribution_page_id`&cid=`$contact.contact_id`&pledgeId=`$pledge_id`&cs=`$checksumValue`\" a=true h=0}{/capture}\n     <p><a href=\"{$contributionUrl}\">{ts}Go to a web page where you can make your payment online{/ts}</a></p>\n    {else}\n     <p>{ts}Please mail your payment to{/ts}: {$domain.address}</p>\n    {/if}\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Pledge Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Pledge Received{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$create_date|truncate:10:\'\'|crmDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Pledge Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount|crmMoney:$currency}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Paid{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount_paid|crmMoney:$currency}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}</p>\n    <p>{ts}Thank your for your generous support.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,848,'pledge_reminder',1,0,0,NULL),(58,'Pledges - Payment Reminder','{ts}Pledge Payment Reminder{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$next_payment|truncate:10:\'\'|crmDate}This is a reminder that the next payment on your pledge is due on %1.{/ts}\n\n===========================================================\n{ts}Payment Due{/ts}\n\n===========================================================\n{ts}Amount Due{/ts}: {$amount_due|crmMoney:$currency}\n{ts}Due Date{/ts}: {$scheduled_payment_date|truncate:10:\'\'|crmDate}\n\n{if $contribution_page_id}\n{capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contribution_page_id`&cid=`$contact.contact_id`&pledgeId=`$pledge_id`&cs=`$checksumValue`\" a=true h=0}{/capture}\nClick this link to go to a web page where you can make your payment online:\n{$contributionUrl}\n{else}\n{ts}Please mail your payment to{/ts}:\n{$domain.address}\n{/if}\n\n===========================================================\n{ts}Pledge Information{/ts}\n\n===========================================================\n{ts}Pledge Received{/ts}: {$create_date|truncate:10:\'\'|crmDate}\n{ts}Total Pledge Amount{/ts}: {$amount|crmMoney:$currency}\n{ts}Total Paid{/ts}: {$amount_paid|crmMoney:$currency}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}\n\n\n{ts}Thank your for your generous support.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$next_payment|truncate:10:\'\'|crmDate}This is a reminder that the next payment on your pledge is due on %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Payment Due{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Amount Due{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount_due|crmMoney:$currency}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    {if $contribution_page_id}\n     {capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contribution_page_id`&cid=`$contact.contact_id`&pledgeId=`$pledge_id`&cs=`$checksumValue`\" a=true h=0}{/capture}\n     <p><a href=\"{$contributionUrl}\">{ts}Go to a web page where you can make your payment online{/ts}</a></p>\n    {else}\n     <p>{ts}Please mail your payment to{/ts}: {$domain.address}</p>\n    {/if}\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Pledge Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Pledge Received{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$create_date|truncate:10:\'\'|crmDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Pledge Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount|crmMoney:$currency}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Paid{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount_paid|crmMoney:$currency}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}</p>\n    <p>{ts}Thank your for your generous support.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,848,'pledge_reminder',0,1,0,NULL),(59,'Profiles - Admin Notification','{$grouptitle} {ts 1=$displayName}Submitted by %1{/ts} - {contact.display_name}\n','{ts}Submitted For:{/ts} {$displayName}\n{ts}Date:{/ts} {$currentDate}\n{ts}Contact Summary:{/ts} {$contactLink}\n\n===========================================================\n{$grouptitle}\n\n===========================================================\n{foreach from=$values item=value key=valueName}\n{$valueName}: {$value}\n{/foreach}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <td {$labelStyle}>\n       {ts}Submitted For{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$displayName}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Date{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$currentDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Contact Summary{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$contactLink}\n      </td>\n     </tr>\n\n     <tr>\n      <th {$headerStyle}>\n       {$grouptitle}\n      </th>\n     </tr>\n\n     {foreach from=$values item=value key=valueName}\n      <tr>\n       <td {$labelStyle}>\n        {$valueName}\n       </td>\n       <td {$valueStyle}>\n        {$value}\n       </td>\n      </tr>\n     {/foreach}\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,849,'uf_notify',1,0,0,NULL),(60,'Profiles - Admin Notification','{$grouptitle} {ts 1=$displayName}Submitted by %1{/ts} - {contact.display_name}\n','{ts}Submitted For:{/ts} {$displayName}\n{ts}Date:{/ts} {$currentDate}\n{ts}Contact Summary:{/ts} {$contactLink}\n\n===========================================================\n{$grouptitle}\n\n===========================================================\n{foreach from=$values item=value key=valueName}\n{$valueName}: {$value}\n{/foreach}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <td {$labelStyle}>\n       {ts}Submitted For{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$displayName}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Date{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$currentDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Contact Summary{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$contactLink}\n      </td>\n     </tr>\n\n     <tr>\n      <th {$headerStyle}>\n       {$grouptitle}\n      </th>\n     </tr>\n\n     {foreach from=$values item=value key=valueName}\n      <tr>\n       <td {$labelStyle}>\n        {$valueName}\n       </td>\n       <td {$valueStyle}>\n        {$value}\n       </td>\n      </tr>\n     {/foreach}\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,849,'uf_notify',0,1,0,NULL),(61,'Petition - signature added','Thank you for signing {$petition.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\nThank you for signing {$petition.title}.\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n<p>Thank you for signing {$petition.title}.</p>\n\n{include file=\"CRM/Campaign/Page/Petition/SocialNetwork.tpl\" petition_id=$survey_id noscript=true emailMode=true}\n',1,850,'petition_sign',1,0,0,NULL),(62,'Petition - signature added','Thank you for signing {$petition.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\nThank you for signing {$petition.title}.\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n<p>Thank you for signing {$petition.title}.</p>\n\n{include file=\"CRM/Campaign/Page/Petition/SocialNetwork.tpl\" petition_id=$survey_id noscript=true emailMode=true}\n',1,850,'petition_sign',0,1,0,NULL),(63,'Petition - need verification','Confirmation of signature needed for {$petition.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\nThank you for signing {$petition.title}.\n\nIn order to complete your signature, we must confirm your e-mail.\nPlease do so by visiting the following email confirmation web page:\n\n{$petition.confirmUrlPlainText}\n\nIf you did not sign this petition, please ignore this message.\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n<p>Thank you for signing {$petition.title}.</p>\n\n<p>In order to <b>complete your signature</b>, we must confirm your e-mail.\n<br />\nPlease do so by visiting the following web page by clicking\non the link below or pasting the link into your browser.\n<br /><br />\nEmail confirmation page: <a href=\"{$petition.confirmUrl} \">{$petition.confirmUrl}</a></p>\n\n<p>If you did not sign this petition, please ignore this message.</p>\n',1,851,'petition_confirmation_needed',1,0,0,NULL),(64,'Petition - need verification','Confirmation of signature needed for {$petition.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\nThank you for signing {$petition.title}.\n\nIn order to complete your signature, we must confirm your e-mail.\nPlease do so by visiting the following email confirmation web page:\n\n{$petition.confirmUrlPlainText}\n\nIf you did not sign this petition, please ignore this message.\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n<p>Thank you for signing {$petition.title}.</p>\n\n<p>In order to <b>complete your signature</b>, we must confirm your e-mail.\n<br />\nPlease do so by visiting the following web page by clicking\non the link below or pasting the link into your browser.\n<br /><br />\nEmail confirmation page: <a href=\"{$petition.confirmUrl} \">{$petition.confirmUrl}</a></p>\n\n<p>If you did not sign this petition, please ignore this message.</p>\n',1,851,'petition_confirmation_needed',0,1,0,NULL),(65,'Sample CiviMail Newsletter Template','Sample CiviMail Newsletter','','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n<table width=612 cellpadding=0 cellspacing=0 bgcolor=\"#ffffff\">\n  <tr>\n    <td colspan=\"2\" bgcolor=\"#ffffff\" valign=\"middle\" >\n      <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" >\n        <tr>\n          <td>\n          <a href=\"https://civicrm.org\"><img src=\"https://civicrm.org/sites/civicrm.org/files/top-logo_2.png\" border=0 alt=\"Replace this logo with the URL to your own\"></a>\n          </td>\n          <td>&nbsp; &nbsp;</td>\n          <td>\n          <a href=\"https://civicrm.org\" style=\"text-decoration: none;\"><font size=5 face=\"Arial, Verdana, sans-serif\" color=\"#8bc539\">Your Newsletter Title</font></a>\n          </td>\n        </tr>\n      </table>\n    </td>\n  </tr>\n  <tr>\n    <td valign=\"top\" width=\"70%\">\n      <!-- left column -->\n      <table cellpadding=\"10\" cellspacing=\"0\" border=\"0\">\n      <tr>\n        <td style=\"font-family: Arial, Verdana, sans-serif; font-size: 12px;\" >\n        <font face=\"Arial, Verdana, sans-serif\" size=\"2\" >\n        Greetings {contact.display_name},\n        <br /><br />\n        This is a sample template designed to help you get started creating and sending your own CiviMail messages. This template uses an HTML layout that is generally compatible with the wide variety of email clients that your recipients might be using (e.g. Gmail, Outlook, Yahoo, etc.).\n        <br /><br />You can select this \"Sample CiviMail Newsletter Template\" from the \"Use Template\" drop-down in Step 3 of creating a mailing, and customize it to your needs. Then check the \"Save as New Template\" box on the bottom the page to save your customized version for use in future mailings.\n        <br /><br />The logo you use must be uploaded to your server.  Copy and paste the URL path to the logo into the &lt;img src= tag in the HTML at the top.  Click \"Source\" or the Image button if you are using the text editor.\n        <br /><br />\n        Edit the color of the links and headers using the color button or by editing the HTML.\n        <br /><br />\n        Your newsletter message and donation appeal can go here.  Click the link button to <a href=\"#\">create links</a> - remember to use a fully qualified URL starting with http:// in all your links!\n        <br /><br />\n        To use CiviMail:\n        <ul>\n          <li><a href=\"http://book.civicrm.org/user/advanced-configuration/email-system-configuration/\">Configure your Email System</a>.</li>\n          <li>Make sure your web hosting provider allows outgoing bulk mail, and see if they have a restriction on quantity.  If they don\'t allow bulk mail, consider <a href=\"https://civicrm.org/providers/hosting\">finding a new host</a>.</li>\n        </ul>\n        Sincerely,\n        <br /><br />\n        Your Team\n        <br /><br />\n        </font>\n        </td>\n      </tr>\n      </table>\n    </td>\n\n    <td valign=\"top\" width=\"30%\" bgcolor=\"#ffffff\" style=\"border: 1px solid #056085;\">\n      <!-- right column -->\n      <table cellpadding=10 cellspacing=0 border=0>\n      <tr>\n        <td bgcolor=\"#056085\"><font face=\"Arial, Verdana, sans-serif\" size=\"4\" color=\"#ffffff\">News and Events</font></td>\n      </tr>\n      <tr>\n        <td style=\"color: #000; font-family: Arial, Verdana, sans-serif; font-size: 12px;\" >\n        <font face=\"Arial, Verdana, sans-serif\" size=\"2\" >\n        <font color=\"#056085\"><strong>Featured Events</strong> </font><br />\n        Fundraising Dinner<br />\n        Training Meeting<br />\n        Board of Directors Annual Meeting<br />\n\n        <br /><br />\n        <font color=\"#056085\"><strong>Community Events</strong></font><br />\n        Bake Sale<br />\n        Charity Auction<br />\n        Art Exhibit<br />\n\n        <br /><br />\n        <font color=\"#056085\"><strong>Important Dates</strong></font><br />\n        Tuesday August 27<br />\n        Wednesday September 8<br />\n        Thursday September 29<br />\n        Saturday October 1<br />\n        Sunday October 20<br />\n        </font>\n        </td>\n      </tr>\n      </table>\n    </td>\n  </tr>\n\n  <tr>\n    <td colspan=\"2\">\n      <table cellpadding=\"10\" cellspacing=\"0\" border=\"0\">\n      <tr>\n        <td>\n        <font face=\"Arial, Verdana, sans-serif\" size=\"2\" >\n        <font color=\"#7dc857\"><strong>Helpful Tips</strong></font>\n        <br /><br />\n        <font color=\"#3b5187\">Tokens</font><br />\n        Click \"Insert Tokens\" to dynamically insert names, addresses, and other contact data of your recipients.\n        <br /><br />\n        <font color=\"#3b5187\">Plain Text Version</font><br />\n        Some people refuse HTML emails altogether.  We recommend sending a plain-text version of your important communications to accommodate them.  Luckily, CiviCRM accommodates for this!  Just click \"Plain Text\" and copy and paste in some text.  Line breaks (carriage returns) and fully qualified URLs like http://www.example.com are all you get, no HTML here!\n        <br /><br />\n        <font color=\"#3b5187\">Play by the Rules</font><br />\n        The address of the sender is required by the Can Spam Act law.  This is an available token called domain.address.  An unsubscribe or opt-out link is also required.  There are several available tokens for this. <em>{action.optOutUrl}</em> creates a link for recipients to click if they want to opt out of receiving  emails from your organization. <em>{action.unsubscribeUrl}</em> creates a link to unsubscribe from the specific mailing list used to send this message. Click on \"Insert Tokens\" to find these and look for tokens named \"Domain\" or \"Unsubscribe\".  This sample template includes both required tokens at the bottom of the message. You can also configure a default Mailing Footer containing these tokens.\n        <br /><br />\n        <font color=\"#3b5187\">Composing Offline</font><br />\n        If you prefer to compose an HTML email offline in your own text editor, you can upload this HTML content into CiviMail or simply click \"Source\" and then copy and paste the HTML in.\n        <br /><br />\n        <font color=\"#3b5187\">Images</font><br />\n        Most email clients these days (Outlook, Gmail, etc) block image loading by default.  This is to protect their users from annoying or harmful email.  Not much we can do about this, so encourage recipients to add you to their contacts or \"whitelist\".  Also use images sparingly, do not rely on images to convey vital information, and always use HTML \"alt\" tags which describe the image content.\n        </td>\n      </tr>\n      </table>\n    </td>\n  </tr>\n  <tr>\n    <td colspan=\"2\" style=\"color: #000; font-family: Arial, Verdana, sans-serif; font-size: 10px;\">\n      <font face=\"Arial, Verdana, sans-serif\" size=\"2\" >\n      <hr />\n      <a href=\"{action.unsubscribeUrl}\" title=\"click to unsubscribe\">Click here</a> to unsubscribe from this mailing list.<br /><br />\n      Our mailing address is:<br />\n      {domain.address}\n    </td>\n  </tr>\n  </table>\n\n</body>\n</html>\n',1,NULL,NULL,1,0,0,NULL),(66,'Sample Responsive Design Newsletter - Single Column Template','Sample Responsive Design Newsletter - Single Column','','<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" />\n  <meta content=\"width=device-width, initial-scale=1.0\" name=\"viewport\" />\n  <title></title>\n\n  <style type=\"text/css\">\n    {literal}\n    /* Client-specific Styles */\n    #outlook a {padding:0;} /* Force Outlook to provide a \"view in browser\" menu link. */\n    body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}\n\n    /* Prevent Webkit and Windows Mobile platforms from changing default font sizes, while not breaking desktop design. */\n    .ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */\n    .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;} /* Force Hotmail to display normal line spacing. */\n    #backgroundTable {margin:0; padding:0; width:100% !important; line-height: 100% !important;}\n    img {outline:none; text-decoration:none;border:none; -ms-interpolation-mode: bicubic;}\n    a img {border:none;}\n    .image_fix {display:block;}\n    p {margin: 0px 0px !important;}\n    table td {border-collapse: collapse;}\n    table { border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt; }\n    a {text-decoration: none;text-decoration:none;}\n\n    /*STYLES*/\n    table[class=full] { width: 100%; clear: both; }\n\n    /*IPAD STYLES*/\n    @media only screen and (max-width: 640px) {\n    a[href^=\"tel\"], a[href^=\"sms\"] {text-decoration: none;color:#136388;pointer-events: none;cursor: default;}\n    .mobile_link a[href^=\"tel\"], .mobile_link a[href^=\"sms\"] {text-decoration: default;color:#136388;pointer-events: auto;cursor: default;}\n    table[class=devicewidth] {width: 440px!important;text-align:center!important;}\n    table[class=devicewidthmob] {width: 416px!important;text-align:center!important;}\n    table[class=devicewidthinner] {width: 416px!important;text-align:center!important;}\n    img[class=banner] {width: 440px!important;auto!important;}\n    img[class=col2img] {width: 440px!important;height:auto!important;}\n    table[class=\"cols3inner\"] {width: 100px!important;}\n    table[class=\"col3img\"] {width: 131px!important;}\n    img[class=\"col3img\"] {width: 131px!important;height: auto!important;}\n    table[class=\"removeMobile\"]{width:10px!important;}\n    img[class=\"blog\"] {width: 440px!important;height: auto!important;}\n    }\n\n    /*IPHONE STYLES*/\n    @media only screen and (max-width: 480px) {\n    a[href^=\"tel\"], a[href^=\"sms\"] {text-decoration: none;color: #136388;pointer-events: none;cursor: default;}\n    .mobile_link a[href^=\"tel\"], .mobile_link a[href^=\"sms\"] {text-decoration: none;color:#136388;pointer-events: auto;cursor: default;}\n\n    table[class=devicewidth] {width: 280px!important;text-align:center!important;}\n    table[class=devicewidthmob] {width: 260px!important;text-align:center!important;}\n    table[class=devicewidthinner] {width: 260px!important;text-align:center!important;}\n    img[class=banner] {width: 280px!important;height:100px!important;}\n    img[class=col2img] {width: 280px!important;height:auto!important;}\n    table[class=\"cols3inner\"] {width: 260px!important;}\n    img[class=\"col3img\"] {width: 280px!important;height: auto!important;}\n    table[class=\"col3img\"] {width: 280px!important;}\n    img[class=\"blog\"] {width: 280px!important;auto!important;}\n    td[class=\"padding-top-right15\"]{padding:15px 15px 0 0 !important;}\n    td[class=\"padding-right15\"]{padding-right:15px !important;}\n    }\n\n    @media only screen and (max-device-width: 800px)\n    {td[class=\"padding-top-right15\"]{padding:15px 15px 0 0 !important;}\n    td[class=\"padding-right15\"]{padding-right:15px !important;}}\n    @media only screen and (max-device-width: 769px) {\n    .devicewidthmob {font-size:16px;}\n    }\n\n    @media only screen and (max-width: 640px) {\n    .desktop-spacer {display:none !important;}\n }\n  {/literal}\n  </style>\n\n<body>\n  <!-- Start of preheader --><!-- Start of preheader -->\n  <table bgcolor=\"#89c66b\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td height=\"20\" width=\"100%\">&nbsp;</td>\n  								</tr>\n  								<!-- Spacing -->\n  								<tr>\n  									<td>\n  									<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"310\">\n  										<tbody>\n  											<tr>\n  												<td align=\"left\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; line-height:120%; color: #f8f8f8;padding-left:15px; padding-bottom:5px;\" valign=\"middle\">Organization or Program Name Here</td>\n  											</tr>\n  										</tbody>\n  									</table>\n\n  									<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"emhide\" width=\"310\">\n  										<tbody>\n  											<tr>\n                          <td align=\"right\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px;color: #f8f8f8;padding-right:15px; text-align:right;\" valign=\"middle\">Month and Year</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  								<!-- Spacing -->\n  								<tr>\n  									<td height=\"20\" width=\"100%\">&nbsp;</td>\n  								</tr>\n  								<!-- Spacing -->\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- End of main-banner-->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td height=\"20\" width=\"100%\">\n  									<table align=\"center\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\" width=\"93%\">\n  										<tbody>\n  											<tr>\n                          <td rowspan=\"2\" style=\"padding-top:10px; padding-bottom:10px;\" width=\"38%\"><img src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/civicrm-logo-transparent.png\" alt=\"Replace with your own logo\" width=\"220\" border=\"0\" /></td>\n  												<td align=\"right\" width=\"62%\">\n  												<h6 class=\"collapse\">&nbsp;</h6>\n  												</td>\n  											</tr>\n  											<tr>\n  												<td align=\"right\">\n  												<h5 style=\"font-family: Gill Sans, Gill Sans MT, Myriad Pro, DejaVu Sans Condensed, Helvetica, Arial, sans-serif; color:#136388;\">&nbsp;</h5>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  								<tr>\n  									<td>\n  									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  										<tbody>\n  											<tr>\n  												<td width=\"100%\">\n  												<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  													<tbody><!-- /Spacing -->\n  														<tr>\n  															<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 23px; color:#f8f8f8; text-align:left; line-height: 32px; padding:5px 15px; background-color:#136388;\">Headline Here</td>\n  														</tr>\n  														<!-- Spacing -->\n  														<tr>\n  															<td>\n  															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"650\">\n  																<tbody><!-- hero story -->\n  																	<tr>\n  																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n  																		<div class=\"imgpop\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"auto\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/650x396.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"650\" /></a></div>\n  																		</td>\n  																	</tr>\n  																	<!-- /hero image --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing -->\n  																	<tr>\n  																		<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;  text-align:left; line-height: 26px; padding:0 15px; color:#89c66b;\"><a href=\"#\" style=\"color:#89c66b;\">Your Heading Here</a></td>\n  																	</tr>\n  																	<!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing --><!-- content -->\n  																	<tr>\n  																		<td style=\"padding:0 15px;\">\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #7a6e67; text-align:left; line-height: 26px; padding-bottom:10px;\">{contact.email_greeting},																		</p>\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #7a6e67; text-align:left; line-height: 26px; padding-bottom:10px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Replace with your text and images, and remember to link the facebook and twitter links in the footer to your pages. Have fun!</span></p>\n  																		</td>\n  																	</tr>\n  																	<tr>\n  																		<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px; padding-left:15px;\"><a href=\"#\" style=\"color:#136388;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"read more\">Read More</a></td>\n  																	</tr>\n  																	<!-- /button --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n  																	</tr>\n  																	<!-- Spacing --><!-- end of content -->\n  																</tbody>\n  															</table>\n  															</td>\n  														</tr>\n  													</tbody>\n  												</table>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- end of hero image and story --><!-- story 1 -->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td>\n  									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  										<tbody>\n  											<tr>\n  												<td width=\"100%\">\n  												<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  													<tbody>\n  														<tr>\n  															<td>\n  															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"650\">\n  																<tbody><!-- image -->\n  																	<tr>\n  																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n  																		<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"250\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/banner-image-650-250.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"650\" /></a></div>\n  																		</td>\n  																	</tr>\n  																	<!-- /image --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing -->\n  																	<tr>\n  																		<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;  text-align:left; line-height: 26px; padding:0 15px;\"><a href=\"#\" style=\"color:#89c66b;\">Your Heading  Here</a></td>\n  																	</tr>\n  																	<!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing --><!-- content -->\n  																	<tr>\n  																		<td style=\"padding:0 15px;\">\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #7a6e67; text-align:left; line-height: 26px; padding-bottom:10px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna </p>\n  																		</td>\n  																	</tr>\n  																	<tr>\n  																		<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px; padding-left:15px;\"><a href=\"#\" style=\"color:#136388;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"read more\">Read More</a></td>\n  																	</tr>\n  																	<!-- /button --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n  																	</tr>\n  																	<!-- Spacing --><!-- end of content -->\n  																</tbody>\n  															</table>\n  															</td>\n  														</tr>\n  													</tbody>\n  												</table>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- /story 2--><!-- banner1 -->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td>\n  									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  										<tbody>\n  											<tr>\n  												<td width=\"100%\">\n  												<table align=\"center\" bgcolor=\"#89c66b\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  													<tbody>\n  														<tr>\n  															<td>\n  															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"650\">\n  																<tbody><!-- image -->\n  																	<tr>\n  																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n  																		<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"auto\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/banner-image-650-250.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"650\" /></a></div>\n  																		</td>\n  																	</tr>\n  																	<!-- /image --><!-- content --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing -->\n  																	<tr>\n  																		<td style=\"padding:15px;\">\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #f0f0f0; text-align:left; line-height: 26px; padding-bottom:10px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna </p>\n  																		</td>\n  																	</tr>\n  																	<!-- /button --><!-- white button -->\n  																	<!-- /button --><!-- Spacing --><!-- end of content -->\n  																</tbody>\n  															</table>\n  															</td>\n  														</tr>\n  													</tbody>\n  												</table>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- /banner 1--><!-- banner 2 -->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td>\n  									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  										<tbody>\n  											<tr>\n  												<td width=\"100%\">\n  												<table align=\"center\" bgcolor=\"#136388\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  													<tbody>\n  														<tr>\n  															<td>\n  															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"650\">\n  																<tbody><!-- image -->\n  																	<tr>\n  																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n  																		<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"auto\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/banner-image-650-250.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"650\" /></a></div>\n  																		</td>\n  																	</tr>\n  																	<!-- /image --><!-- content --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing -->\n  																	<tr>\n  																		<td style=\"padding: 15px;\">\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #f0f0f0; text-align:left; line-height: 26px; padding-bottom:10px;\">Remember to link the facebook and twitter links below to your pages!</p>\n  																		</td>\n  																	</tr>\n  																	<!-- /button --><!-- white button -->\n  																	<tr>\n  																		<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px; padding-bottom:10px; padding-left:15px;\"><a href=\"#\" style=\"color:#ffffff;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"read more\">Read More</a></td>\n  																	</tr>\n  																	<!-- /button --><!-- Spacing --><!-- end of content -->\n  																</tbody>\n  															</table>\n  															</td>\n  														</tr>\n  													</tbody>\n  												</table>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- /banner2 --><!-- footer -->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"footer\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#89c66b\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td height=\"10\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n  								</tr>\n  								<!-- Spacing -->\n  								<tr>\n  									<td><!-- logo -->\n  									<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"250\">\n  										<tbody>\n  											<tr>\n  												<td width=\"20\">&nbsp;</td>\n  												<td align=\"left\" height=\"40\" width=\"250\"><span style=\"font-family: Helvetica, arial, sans-serif; font-size: 13px; text-align:left; line-height: 26px; padding-bottom:10px;\"><a href=\"{action.unsubscribeUrl}\" style=\"color: #f0f0f0; \">Unsubscribe | </a><a href=\"{action.subscribeUrl}\"  style=\"color: #f0f0f0;\">Subscribe |</a> <a href=\"{action.optOutUrl}\" style=\"color: #f0f0f0;\">Opt out</a></span></td>\n  											</tr>\n  											<tr>\n  												<td width=\"20\">&nbsp;</td>\n  												<td align=\"left\" height=\"40\" width=\"250\"><span style=\"font-family: Helvetica, arial, sans-serif; font-size: 13px; text-align:left; line-height: 26px; padding-bottom:10px; color: #f0f0f0;\">{domain.address}</span></td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									<!-- end of logo --><!-- start of social icons -->\n\n  									<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" height=\"40\" vaalign=\"middle\" width=\"60\">\n  										<tbody>\n  											<tr>\n  												<td align=\"left\" height=\"22\" width=\"22\">\n  												<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" height=\"22\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/facebook.png\" style=\"display:block; border:none; outline:none; text-decoration:none;\" width=\"22\" /> </a></div>\n  												</td>\n  												<td align=\"left\" style=\"font-size:1px; line-height:1px;\" width=\"10\">&nbsp;</td>\n  												<td align=\"right\" height=\"22\" width=\"22\">\n  												<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" height=\"22\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/twitter.png\" style=\"display:block; border:none; outline:none; text-decoration:none;\" width=\"22\" /> </a></div>\n  												</td>\n  												<td align=\"left\" style=\"font-size:1px; line-height:1px;\" width=\"20\">&nbsp;</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									<!-- end of social icons --></td>\n  								</tr>\n  								<!-- Spacing -->\n  								<tr>\n  									<td height=\"10\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n  								</tr>\n  								<!-- Spacing -->\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n\n</body>\n</html>\n',1,NULL,NULL,1,0,0,NULL),(67,'Sample Responsive Design Newsletter - Two Column Template','Sample Responsive Design Newsletter - Two Column','','<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" />\n  <meta content=\"width=device-width, initial-scale=1.0\" name=\"viewport\" />\n  <title></title>\n  <style type=\"text/css\">\n     {literal}\n     img {height: auto !important;}\n     /* Client-specific Styles */\n     #outlook a {padding:0;} /* Force Outlook to provide a \"view in browser\" menu link. */\n     body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}\n\n     /* Prevent Webkit and Windows Mobile platforms from changing default font sizes, while not breaking desktop design. */\n     .ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */\n     .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;} /* Force Hotmail to display normal line spacing. */\n     #backgroundTable {margin:0; padding:0; width:100% !important; line-height: 100% !important;}\n     img {outline:none; text-decoration:none;border:none; -ms-interpolation-mode: bicubic;}\n     a img {border:none;}\n     .image_fix {display:block;}\n     p {margin: 0px 0px !important;}\n     table td {border-collapse: collapse;}\n     table { border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt; }\n     a {/*color: #33b9ff;*/text-decoration: none;text-decoration:none!important;}\n\n\n     /*STYLES*/\n     table[class=full] { width: 100%; clear: both; }\n\n     /*IPAD STYLES*/\n     @media only screen and (max-width: 640px) {\n     a[href^=\"tel\"], a[href^=\"sms\"] {text-decoration: none;color: #0a8cce;pointer-events: none;cursor: default;}\n     .mobile_link a[href^=\"tel\"], .mobile_link a[href^=\"sms\"] {text-decoration: default;color: #0a8cce !important;pointer-events: auto;cursor: default;}\n     table[class=devicewidth] {width: 440px!important;text-align:center!important;}\n     table[class=devicewidthmob] {width: 414px!important;text-align:center!important;}\n     table[class=devicewidthinner] {width: 414px!important;text-align:center!important;}\n     img[class=banner] {width: 440px!important;auto!important;}\n     img[class=col2img] {width: 440px!important;height:auto!important;}\n     table[class=\"cols3inner\"] {width: 100px!important;}\n     table[class=\"col3img\"] {width: 131px!important;}\n     img[class=\"col3img\"] {width: 131px!important;height: auto!important;}\n     table[class=\"removeMobile\"]{width:10px!important;}\n     img[class=\"blog\"] {width: 440px!important;height: auto!important;}\n     }\n\n     /*IPHONE STYLES*/\n     @media only screen and (max-width: 480px) {\n     a[href^=\"tel\"], a[href^=\"sms\"] {text-decoration: none;color: #0a8cce;pointer-events: none;cursor: default;}\n     .mobile_link a[href^=\"tel\"], .mobile_link a[href^=\"sms\"] {text-decoration: default;color: #0a8cce !important; pointer-events: auto;cursor: default;}\n     table[class=devicewidth] {width: 280px!important;text-align:center!important;}\n     table[class=devicewidthmob] {width: 260px!important;text-align:center!important;}\n     table[class=devicewidthinner] {width: 260px!important;text-align:center!important;}\n     img[class=banner] {width: 280px!important;height:100px!important;}\n     img[class=col2img] {width: 280px!important;height:auto!important;}\n     table[class=\"cols3inner\"] {width: 260px!important;}\n     img[class=\"col3img\"] {width: 280px!important;height: auto!important;}\n     table[class=\"col3img\"] {width: 280px!important;}\n     img[class=\"blog\"] {width: 280px!important;auto!important;}\n     td[class=\"padding-top-right15\"]{padding:15px 15px 0 0 !important;}\n     td[class=\"padding-right15\"]{padding-right:15px !important;}\n     }\n\n     @media only screen and (max-device-width: 800px)\n     {td[class=\"padding-top-right15\"]{padding:15px 15px 0 0 !important;}\n     td[class=\"padding-right15\"]{padding-right:15px !important;}}\n     @media only screen and (max-device-width: 769px) {.devicewidthmob {font-size:14px;}}\n\n     @media only screen and (max-width: 640px) {.desktop-spacer {display:none !important;}\n	   }\n     {/literal}\n  </style>\n  <body>\n    <!-- Start of preheader --><!-- Start of preheader -->\n    <table bgcolor=\"#0B4151\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" width=\"100%\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"360\">\n    										<tbody>\n    											<tr>\n    												<td align=\"left\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height:120%; color: #f8f8f8;padding-left:15px;\" valign=\"middle\">Organization or Program Name Here</td>\n    											</tr>\n    										</tbody>\n    									</table>\n\n    									<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"emhide\" width=\"320\">\n    										<tbody>\n    											<tr>\n    												<td align=\"right\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px;color: #f8f8f8;padding-right:15px;\" valign=\"middle\">Month Year</td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" width=\"100%\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- End of preheader --><!-- start of logo -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" width=\"100%\">\n    									<table align=\"center\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\" width=\"93%\">\n    										<tbody>\n    											<tr>\n                             <td rowspan=\"2\" width=\"330\"><a href=\"#\"> <div class=\"imgpop\"><img src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/civicrm-logo-transparent.png\" alt=\"Replace with your own logo\" width=\"220\" border=\"0\" style=\"display:block;\"/></div></a></td>\n                            <td align=\"right\" >\n    												<h6 class=\"collapse\">&nbsp;</h6>\n    												</td>\n    											</tr>\n    											<tr>\n    												<td align=\"right\">\n\n    												</td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- end of logo --> <!-- hero story 1 -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"101%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#f8f8f8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody>\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    										<tbody>\n    											<tr>\n    												<td width=\"100%\">\n    												<table align=\"center\" bgcolor=\"#f8f8f8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    													<tbody><!-- /Spacing -->\n    														<tr>\n    															<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 24px; color:#f8f8f8; text-align:left; line-height: 26px; padding:5px 15px; background-color: #80C457\">Hero Story Heading</td>\n    														</tr>\n    														<!-- Spacing -->\n    														<tr>\n    															<td>\n    															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"700\">\n    																<tbody><!-- image -->\n    																	<tr>\n    																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n    																		<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"396\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/700x396.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"700\" /></a></div>\n    																		</td>\n    																	</tr>\n    																	<!-- /image --><!-- Spacing -->\n    																	<tr>\n    																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    																	</tr>\n    																	<!-- /Spacing --><!-- hero story -->\n    																	<tr>\n    																		<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;  text-align:left; line-height: 26px; padding:0 15px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Subheading Here</a></td>\n    																	</tr>\n    																	<!-- Spacing -->\n    																	<tr>\n    																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    																	</tr><!-- /Spacing -->\n    																	<tr>\n    																		<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 26px; padding:0 15px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Replace with your text and images, and remember to link the facebook and twitter links in the footer to your pages. Have fun!</span></td>\n    																	</tr>\n\n    <!-- Spacing -->\n    																	<tr>\n    																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    																	</tr><!-- /Spacing -->\n\n              <!-- /Spacing --><!-- /hero story -->\n\n    																	<!-- Spacing -->                                                            <!-- Spacing -->\n\n\n\n    																	<!-- Spacing --><!-- end of content -->\n    																</tbody>\n    															</table>\n    															</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												</td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Section Heading -->\n    								<tr>\n    									<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 24px; color:#f8f8f8; text-align:left; line-height: 26px; padding:5px 15px; background-color: #80C457\">Section Heading Here</td>\n    								</tr>\n    								<!-- /Section Heading -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /hero story 1 --><!-- story one -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td class=\"desktop-spacer\" height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"660\">\n    										<tbody>\n    											<tr>\n    												<td><!-- Start of left column -->\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"330\">\n    													<tbody><!-- image -->\n    														<tr>\n    															<td align=\"center\" class=\"devicewidth\" height=\"150\" valign=\"top\" width=\"330\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"col2img\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/330x150.png\" style=\"display:block; border:none; outline:none; text-decoration:none; display:block;\" width=\"330\" /></a></td>\n    														</tr>\n    														<!-- /image -->\n    													</tbody>\n    												</table>\n    												<!-- end of left column --><!-- spacing for mobile devices-->\n\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"mobilespacing\">\n    													<tbody>\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												<!-- end of for mobile devices--><!-- start of right column -->\n\n    												<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"310\">\n    													<tbody>\n    														<tr>\n    															<td class=\"padding-top-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px; text-align:left; line-height: 24px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Heading Here</a><a href=\"#\" style=\"color:#076187; text-decoration:none;\" target=\"_blank\" title=\"CiviCRM helps keep the “City Beautiful” Movement”going strong\"></a></td>\n    														</tr>\n    														<!-- end of title --><!-- Spacing -->\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    														<!-- /Spacing --><!-- content -->\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                                                                tempor incididunt ut labore et dolore magna </span></td>\n    														</tr>\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px;\"><a href=\"#\" style=\"color:#80C457;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"CiviCRM helps keep the “City Beautiful” Movement”going strong\">Read More</a></td>\n    														</tr>\n    														<!-- /button --><!-- end of content -->\n    													</tbody>\n    												</table>\n    												<!-- end of right column --></td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /story one -->\n    <!-- story two -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td bgcolor=\"#076187\" height=\"0\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing --><!-- Spacing -->\n    								<tr>\n    									<td class=\"desktop-spacer\" height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"660\">\n    										<tbody>\n    											<tr>\n    												<td><!-- Start of left column -->\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"330\">\n    													<tbody><!-- image -->\n    														<tr>\n    															<td align=\"center\" class=\"devicewidth\" height=\"150\" valign=\"top\" width=\"330\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"col2img\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/330x150.png\" style=\"display:block; border:none; outline:none; text-decoration:none; display:block;\" width=\"330\" /></a></td>\n    														</tr>\n    														<!-- /image -->\n    													</tbody>\n    												</table>\n    												<!-- end of left column --><!-- spacing for mobile devices-->\n\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"mobilespacing\">\n    													<tbody>\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												<!-- end of for mobile devices--><!-- start of right column -->\n\n    												<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"310\">\n    													<tbody>\n    														<tr>\n    															<td class=\"padding-top-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px; text-align:left; line-height: 24px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Heading Here</a><a href=\"#\" style=\"color:#076187; text-decoration:none;\" target=\"_blank\" title=\"How CiviCRM will take Tribodar Eco Learning Center to another level\"></a></td>\n    														</tr>\n    														<!-- end of title --><!-- Spacing -->\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    														<!-- /Spacing --><!-- content -->\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                                                                tempor incididunt ut labore et dolore magna </span></td>\n    														</tr>\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px;\"><a href=\"#\" style=\"color:#80C457;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"How CiviCRM will take Tribodar Eco Learning Center to another level\">Read More</a></td>\n    														</tr>\n    														<!-- /button --><!-- end of content -->\n    													</tbody>\n    												</table>\n    												<!-- end of right column --></td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /story two --><!-- story three -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td bgcolor=\"#076187\" height=\"0\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing --><!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" class=\"desktop-spacer\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"660\">\n    										<tbody>\n    											<tr>\n    												<td><!-- Start of left column -->\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"330\">\n    													<tbody><!-- image -->\n    														<tr>\n    															<td align=\"center\" class=\"devicewidth\" height=\"150\" valign=\"top\" width=\"330\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"col2img\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/330x150.png\" style=\"display:block; border:none; outline:none; text-decoration:none; display:block;\" width=\"330\" /></a></td>\n    														</tr>\n    														<!-- /image -->\n    													</tbody>\n    												</table>\n    												<!-- end of left column --><!-- spacing for mobile devices-->\n\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"mobilespacing\">\n    													<tbody>\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												<!-- end of for mobile devices--><!-- start of right column -->\n\n    												<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"310\">\n    													<tbody>\n    														<tr>\n    															<td class=\"padding-top-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;  text-align:left; line-height: 24px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Heading Here</a><a href=\"#\" style=\"color:#076187; text-decoration:none;\" target=\"_blank\" title=\"CiviCRM provides a soup-to-nuts open-source solution for Friends of the San Pedro River\"></a></td>\n    														</tr>\n    														<!-- end of title --><!-- Spacing -->\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    														<!-- /Spacing --><!-- content -->\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                                                                tempor incididunt ut labore et dolore magna </span></td>\n    														</tr>\n    														<tr>\n    															<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px;\"><a href=\"#\" style=\"color:#80C457;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"CiviCRM provides a soup-to-nuts open-source solution for Friends of the San Pedro River\">Read More</a></td>\n    														</tr>\n    														<!-- /button --><!-- end of content -->\n    													</tbody>\n    												</table>\n    												<!-- end of right column --></td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /story three -->\n\n\n\n\n\n    <!-- story four -->\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody>\n                                <!-- Spacing -->\n    								<tr>\n    									<td bgcolor=\"#076187\" height=\"0\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n                                <!-- Spacing -->\n    								<tr>\n    									<td class=\"desktop-spacer\" height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"660\">\n    										<tbody>\n    											<tr>\n    												<td><!-- Start of left column -->\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"330\">\n    													<tbody><!-- image -->\n    														<tr>\n    															<td align=\"center\" class=\"devicewidth\" height=\"150\" valign=\"top\" width=\"330\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"col2img\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/330x150.png\" style=\"display:block; border:none; outline:none; text-decoration:none; display:block;\" width=\"330\" /></a></td>\n    														</tr>\n    														<!-- /image -->\n    													</tbody>\n    												</table>\n    												<!-- end of left column --><!-- spacing for mobile devices-->\n\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"mobilespacing\">\n    													<tbody>\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												<!-- end of for mobile devices--><!-- start of right column -->\n\n    												<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"310\">\n    													<tbody>\n    														<tr>\n    															<td class=\"padding-top-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;text-align:left; line-height: 24px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Heading Here</a><a href=\"#\" style=\"color:#076187; text-decoration:none;\" target=\"_blank\" title=\"Google Summer of Code\"></a></td>\n    														</tr>\n    														<!-- end of title --><!-- Spacing -->\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    														<!-- /Spacing --><!-- content -->\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                                                                tempor incididunt ut labore et dolore magna </span></td>\n    														</tr>\n    														<tr>\n    															<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px;\"><a href=\"#\" style=\"color:#80C457;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"Google Summer of Code\">Read More</a></td>\n    														</tr>\n    														<!-- /button --><!-- end of content -->\n    													</tbody>\n    												</table>\n    												<!-- end of right column --></td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n                       <td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n                    </tr>\n                    <!-- /Spacing -->\n                    <tr>\n                      <td style=\"padding: 15px;\">\n                      <p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color:#076187; text-align:left; line-height: 26px; padding-bottom:10px;\">Remember to link the facebook and twitter links below to your pages!</p>\n                      </td>\n    								</tr>\n    								<!-- Spacing -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /story four -->\n\n    <!-- footer -->\n\n    <!-- End of footer --><!-- Start of postfooter -->\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"footer\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n            <tbody>\n              <tr>\n                <td width=\"100%\">\n                  <table align=\"center\" bgcolor=\"#89c66b\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				        <tbody><!-- Spacing -->\n    					        <tr>\n                        <td height=\"10\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    					        </tr>\n    					        <!-- Spacing -->\n    					        <tr>\n                        <td><!-- logo -->\n                        <table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"250\">\n            							<tbody>\n            								<tr>\n                               <td width=\"20\">&nbsp;</td>\n                              <td align=\"left\" height=\"40\" width=\"250\"><span style=\"font-family: Helvetica, arial, sans-serif; font-size: 13px; text-align:left; line-height: 26px; padding-bottom:10px;\"><a href=\"{action.unsubscribeUrl}\" style=\"color: #f0f0f0;\">Unsubscribe | </a><a href=\"{action.subscribeUrl}\" style=\"color: #f0f0f0;\">Subscribe |</a> <a href=\"{action.optOutUrl}\" style=\"color: #f0f0f0;\">Opt out</a></span></td>\n                            </tr>\n      											<tr>\n      												<td width=\"20\">&nbsp;</td>\n      												<td align=\"left\" height=\"40\" width=\"250\"><span style=\"font-family: Helvetica, arial, sans-serif; font-size: 13px; text-align:left; line-height: 26px; padding-bottom:10px; color: #f0f0f0;\">{domain.address}</span></td>\n      											</tr>\n                          </tbody>\n                        </table>\n                        <!-- end of logo --><!-- start of social icons -->\n      									<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" height=\"40\" vaalign=\"middle\" width=\"60\">\n      										<tbody>\n      											<tr>\n      												<td align=\"left\" height=\"22\" width=\"22\">\n                                <div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" height=\"22\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/facebook.png\" style=\"display:block; border:none; outline:none; text-decoration:none;\" width=\"22\" /> </a></div>      											  </td>\n      												<td align=\"left\" style=\"font-size:1px; line-height:1px;\" width=\"10\">&nbsp;</td>\n      												<td align=\"right\" height=\"22\" width=\"22\">\n      												<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" height=\"22\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/twitter.png\" style=\"display:block; border:none; outline:none; text-decoration:none;\" width=\"22\" /> </a></div>\n      												</td>\n      												<td align=\"left\" style=\"font-size:1px; line-height:1px;\" width=\"20\">&nbsp;</td>\n      											</tr>\n      										</tbody>\n      									</table>\n    									<!-- end of social icons --></td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"10\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td bgcolor=\"#80C457\" height=\"10\" width=\"100%\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- End of footer -->\n  </body>\n</html>\n',1,NULL,NULL,1,0,0,NULL);
+INSERT INTO `civicrm_msg_template` (`id`, `msg_title`, `msg_subject`, `msg_text`, `msg_html`, `is_active`, `workflow_id`, `workflow_name`, `is_default`, `is_reserved`, `is_sms`, `pdf_format_id`) VALUES (1,'Cases - Send Copy of an Activity','{if $idHash}[case #{$idHash}]{/if} {$activitySubject}\n','===========================================================\n{ts}Activity Summary{/ts} - {$activityTypeName}\n===========================================================\n{if $isCaseActivity}\n{ts}Your Case Role(s){/ts} : {$contact.role}\n{if $manageCaseURL}\n{ts}Manage Case{/ts} : {$manageCaseURL}\n{/if}\n{/if}\n\n{if $editActURL}\n{ts}Edit activity{/ts} : {$editActURL}\n{/if}\n{if $viewActURL}\n{ts}View activity{/ts} : {$viewActURL}\n{/if}\n\n{foreach from=$activity.fields item=field}\n{if $field.type eq \'Date\'}\n{$field.label}{if $field.category}({$field.category}){/if} : {$field.value|crmDate:$config->dateformatDatetime}\n{else}\n{$field.label}{if $field.category}({$field.category}){/if} : {$field.value}\n{/if}\n{/foreach}\n\n{foreach from=$activity.customGroups key=customGroupName item=customGroup}\n==========================================================\n{$customGroupName}\n==========================================================\n{foreach from=$customGroup item=field}\n{if $field.type eq \'Date\'}\n{$field.label} : {$field.value|crmDate:$config->dateformatDatetime}\n{else}\n{$field.label} : {$field.value}\n{/if}\n{/foreach}\n\n{/foreach}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Activity Summary{/ts} - {$activityTypeName}\n      </th>\n     </tr>\n     {if $isCaseActivity}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Your Case Role(s){/ts}\n       </td>\n       <td {$valueStyle}>\n        {$contact.role}\n       </td>\n      </tr>\n      {if $manageCaseURL}\n       <tr>\n       <td colspan=\"2\" {$valueStyle}>\n     <a href=\"{$manageCaseURL}\" title=\"{ts}Manage Case{/ts}\">{ts}Manage Case{/ts}</a>\n       </td>\n       </tr>\n      {/if}\n     {/if}\n     {if $editActURL}\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n   <a href=\"{$editActURL}\" title=\"{ts}Edit activity{/ts}\">{ts}Edit activity{/ts}</a>\n       </td>\n     </tr>\n     {/if}\n     {if $viewActURL}\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n   <a href=\"{$viewActURL}\" title=\"{ts}View activity{/ts}\">{ts}View activity{/ts}</a>\n       </td>\n     </tr>\n     {/if}\n     {foreach from=$activity.fields item=field}\n      <tr>\n       <td {$labelStyle}>\n        {$field.label}{if $field.category}({$field.category}){/if}\n       </td>\n       <td {$valueStyle}>\n        {if $field.type eq \'Date\'}\n         {$field.value|crmDate:$config->dateformatDatetime}\n        {else}\n         {$field.value}\n        {/if}\n       </td>\n      </tr>\n     {/foreach}\n\n     {foreach from=$activity.customGroups key=customGroupName item=customGroup}\n      <tr>\n       <th {$headerStyle}>\n        {$customGroupName}\n       </th>\n      </tr>\n      {foreach from=$customGroup item=field}\n       <tr>\n        <td {$labelStyle}>\n         {$field.label}\n        </td>\n        <td {$valueStyle}>\n         {if $field.type eq \'Date\'}\n          {$field.value|crmDate:$config->dateformatDatetime}\n         {else}\n          {$field.value}\n         {/if}\n        </td>\n       </tr>\n      {/foreach}\n     {/foreach}\n    </table>\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,820,'case_activity',1,0,0,NULL),(2,'Cases - Send Copy of an Activity','{if $idHash}[case #{$idHash}]{/if} {$activitySubject}\n','===========================================================\n{ts}Activity Summary{/ts} - {$activityTypeName}\n===========================================================\n{if $isCaseActivity}\n{ts}Your Case Role(s){/ts} : {$contact.role}\n{if $manageCaseURL}\n{ts}Manage Case{/ts} : {$manageCaseURL}\n{/if}\n{/if}\n\n{if $editActURL}\n{ts}Edit activity{/ts} : {$editActURL}\n{/if}\n{if $viewActURL}\n{ts}View activity{/ts} : {$viewActURL}\n{/if}\n\n{foreach from=$activity.fields item=field}\n{if $field.type eq \'Date\'}\n{$field.label}{if $field.category}({$field.category}){/if} : {$field.value|crmDate:$config->dateformatDatetime}\n{else}\n{$field.label}{if $field.category}({$field.category}){/if} : {$field.value}\n{/if}\n{/foreach}\n\n{foreach from=$activity.customGroups key=customGroupName item=customGroup}\n==========================================================\n{$customGroupName}\n==========================================================\n{foreach from=$customGroup item=field}\n{if $field.type eq \'Date\'}\n{$field.label} : {$field.value|crmDate:$config->dateformatDatetime}\n{else}\n{$field.label} : {$field.value}\n{/if}\n{/foreach}\n\n{/foreach}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Activity Summary{/ts} - {$activityTypeName}\n      </th>\n     </tr>\n     {if $isCaseActivity}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Your Case Role(s){/ts}\n       </td>\n       <td {$valueStyle}>\n        {$contact.role}\n       </td>\n      </tr>\n      {if $manageCaseURL}\n       <tr>\n       <td colspan=\"2\" {$valueStyle}>\n     <a href=\"{$manageCaseURL}\" title=\"{ts}Manage Case{/ts}\">{ts}Manage Case{/ts}</a>\n       </td>\n       </tr>\n      {/if}\n     {/if}\n     {if $editActURL}\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n   <a href=\"{$editActURL}\" title=\"{ts}Edit activity{/ts}\">{ts}Edit activity{/ts}</a>\n       </td>\n     </tr>\n     {/if}\n     {if $viewActURL}\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n   <a href=\"{$viewActURL}\" title=\"{ts}View activity{/ts}\">{ts}View activity{/ts}</a>\n       </td>\n     </tr>\n     {/if}\n     {foreach from=$activity.fields item=field}\n      <tr>\n       <td {$labelStyle}>\n        {$field.label}{if $field.category}({$field.category}){/if}\n       </td>\n       <td {$valueStyle}>\n        {if $field.type eq \'Date\'}\n         {$field.value|crmDate:$config->dateformatDatetime}\n        {else}\n         {$field.value}\n        {/if}\n       </td>\n      </tr>\n     {/foreach}\n\n     {foreach from=$activity.customGroups key=customGroupName item=customGroup}\n      <tr>\n       <th {$headerStyle}>\n        {$customGroupName}\n       </th>\n      </tr>\n      {foreach from=$customGroup item=field}\n       <tr>\n        <td {$labelStyle}>\n         {$field.label}\n        </td>\n        <td {$valueStyle}>\n         {if $field.type eq \'Date\'}\n          {$field.value|crmDate:$config->dateformatDatetime}\n         {else}\n          {$field.value}\n         {/if}\n        </td>\n       </tr>\n      {/foreach}\n     {/foreach}\n    </table>\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,820,'case_activity',0,1,0,NULL),(3,'Contributions - Duplicate Organization Alert','{ts}CiviContribute Alert: Possible Duplicate Contact Record{/ts} - {contact.display_name}\n','{ts}A contribution / membership signup was made on behalf of the organization listed below.{/ts}\n{ts}The information provided matched multiple existing database records based on the configured Duplicate Matching Rules for your site.{/ts}\n\n{ts}Organization Name{/ts}: {$onBehalfName}\n{ts}Organization Email{/ts}: {$onBehalfEmail}\n{ts}Organization Contact ID{/ts}: {$onBehalfID}\n\n{ts}If you think this may be a duplicate contact which should be merged with an existing record - Go to \"Contacts >> Find and Merge Duplicate Contacts\". Use the strict rule for Organizations to find the potential duplicates and merge them if appropriate.{/ts}\n\n{if $receiptMessage}\n###########################################################\n{ts}Copy of Contribution Receipt{/ts}\n\n###########################################################\n{$receiptMessage}\n\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <p>{ts}A contribution / membership signup was made on behalf of the organization listed below.{/ts}</p>\n    <p>{ts}The information provided matched multiple existing database records based on the configured Duplicate Matching Rules for your site.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Name{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfName}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Email{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfEmail}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Contact ID{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfID}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <p>{ts}If you think this may be a duplicate contact which should be merged with an existing record - Go to \"Contacts >> Find and Merge Duplicate Contacts\". Use the strict rule for Organizations to find the potential duplicates and merge them if appropriate.{/ts}</p>\n   </td>\n  </tr>\n  {if $receiptMessage}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts}Copy of Contribution Receipt{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {* FIXME: the below is most probably not HTML-ised *}\n        {$receiptMessage}\n       </td>\n      </tr>\n     </table>\n    </td>\n   </tr>\n  {/if}\n </table>\n</center>\n\n</body>\n</html>\n',1,821,'contribution_dupalert',1,0,0,NULL),(4,'Contributions - Duplicate Organization Alert','{ts}CiviContribute Alert: Possible Duplicate Contact Record{/ts} - {contact.display_name}\n','{ts}A contribution / membership signup was made on behalf of the organization listed below.{/ts}\n{ts}The information provided matched multiple existing database records based on the configured Duplicate Matching Rules for your site.{/ts}\n\n{ts}Organization Name{/ts}: {$onBehalfName}\n{ts}Organization Email{/ts}: {$onBehalfEmail}\n{ts}Organization Contact ID{/ts}: {$onBehalfID}\n\n{ts}If you think this may be a duplicate contact which should be merged with an existing record - Go to \"Contacts >> Find and Merge Duplicate Contacts\". Use the strict rule for Organizations to find the potential duplicates and merge them if appropriate.{/ts}\n\n{if $receiptMessage}\n###########################################################\n{ts}Copy of Contribution Receipt{/ts}\n\n###########################################################\n{$receiptMessage}\n\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <p>{ts}A contribution / membership signup was made on behalf of the organization listed below.{/ts}</p>\n    <p>{ts}The information provided matched multiple existing database records based on the configured Duplicate Matching Rules for your site.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Name{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfName}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Email{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfEmail}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Organization Contact ID{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$onBehalfID}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <p>{ts}If you think this may be a duplicate contact which should be merged with an existing record - Go to \"Contacts >> Find and Merge Duplicate Contacts\". Use the strict rule for Organizations to find the potential duplicates and merge them if appropriate.{/ts}</p>\n   </td>\n  </tr>\n  {if $receiptMessage}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts}Copy of Contribution Receipt{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {* FIXME: the below is most probably not HTML-ised *}\n        {$receiptMessage}\n       </td>\n      </tr>\n     </table>\n    </td>\n   </tr>\n  {/if}\n </table>\n</center>\n\n</body>\n</html>\n',1,821,'contribution_dupalert',0,1,0,NULL),(5,'Contributions - Receipt (off-line)','{ts}Contribution Receipt{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $formValues.receipt_text}\n{$formValues.receipt_text}\n{else}{ts}Below you will find a receipt for this contribution.{/ts}{/if}\n\n===========================================================\n{ts}Contribution Information{/ts}\n\n===========================================================\n{ts}Contributor{/ts}: {contact.display_name}\n{ts}Financial Type{/ts}: {$formValues.contributionType_name}\n{if $lineItem}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $getTaxDetails}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $getTaxDetails} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $getTaxDetails}{$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"} {$line.tax_rate|string_format:\"%.2f\"} %   {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if} {/if}   {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $getTaxDetails && $dataArray}\n{ts}Amount before Tax{/ts} : {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset ||  $priceset == 0 || $value != \'\'}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}% : {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm} : {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n\n{if isset($totalTaxAmount) && $totalTaxAmount !== \'null\'}\n{ts}Total Tax Amount{/ts} : {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{ts}Total Amount{/ts} : {$formValues.total_amount|crmMoney:$currency}\n{if $receive_date}\n{ts}Date Received{/ts}: {$receive_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $receipt_date}\n{ts}Receipt Date{/ts}: {$receipt_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $formValues.paidBy and !$formValues.hidden_CreditCard}\n{ts}Paid By{/ts}: {$formValues.paidBy}\n{if $formValues.check_number}\n{ts}Check Number{/ts}: {$formValues.check_number}\n{/if}\n{/if}\n{if $formValues.trxn_id}\n{ts}Transaction ID{/ts}: {$formValues.trxn_id}\n{/if}\n\n{if $ccContribution}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n===========================================================\n{$customName}\n===========================================================\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $softCreditTypes and $softCredits}\n{foreach from=$softCreditTypes item=softCreditType key=n}\n===========================================================\n{$softCreditType}\n===========================================================\n{foreach from=$softCredits.$n item=value key=label}\n{$label}: {$value}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $formValues.product_name}\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$formValues.product_name}\n{if $formValues.product_option}\n{ts}Option{/ts}: {$formValues.product_option}\n{/if}\n{if $formValues.product_sku}\n{ts}SKU{/ts}: {$formValues.product_sku}\n{/if}\n{if $fulfilled_date}\n{ts}Sent{/ts}: {$fulfilled_date|crmDate}\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $formValues.receipt_text}\n     <p>{$formValues.receipt_text|htmlize}</p>\n    {else}\n     <p>{ts}Below you will find a receipt for this contribution.{/ts}</p>\n    {/if}\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Contribution Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Contributor Name{/ts}\n      </td>\n      <td {$valueStyle}>\n       {contact.display_name}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Financial Type{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$formValues.contributionType_name}\n      </td>\n     </tr>\n\n     {if $lineItem and !$is_quick_config}\n      {foreach from=$lineItem item=value key=priceset}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n          <tr>\n           <th>{ts}Item{/ts}</th>\n           <th>{ts}Qty{/ts}</th>\n           <th>{ts}Each{/ts}</th>\n           {if $getTaxDetails}\n             <th>{ts}Subtotal{/ts}</th>\n             <th>{ts}Tax Rate{/ts}</th>\n             <th>{ts}Tax Amount{/ts}</th>\n           {/if}\n           <th>{ts}Total{/ts}</th>\n          </tr>\n          {foreach from=$value item=line}\n           <tr>\n            <td>\n            {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n            </td>\n            <td>\n             {$line.qty}\n            </td>\n            <td>\n             {$line.unit_price|crmMoney:$currency}\n            </td>\n            {if $getTaxDetails}\n              <td>\n                {$line.unit_price*$line.qty|crmMoney:$currency}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                  {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                  {$line.tax_amount|crmMoney:$currency}\n                </td>\n              {else}\n                <td></td>\n                <td></td>\n              {/if}\n            {/if}\n            <td>\n             {$line.line_total+$line.tax_amount|crmMoney:$currency}\n            </td>\n           </tr>\n          {/foreach}\n         </table>\n        </td>\n       </tr>\n      {/foreach}\n     {/if}\n     {if $getTaxDetails && $dataArray}\n       <tr>\n         <td {$labelStyle}>\n           {ts} Amount before Tax : {/ts}\n         </td>\n         <td {$valueStyle}>\n           {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n         </td>\n       </tr>\n\n      {foreach from=$dataArray item=value key=priceset}\n        <tr>\n        {if $priceset ||  $priceset == 0 || $value != \'\'}\n          <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n          <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {else}\n          <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n          <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {/if}\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if isset($totalTaxAmount) && $totalTaxAmount !== \'null\'}\n      <tr>\n        <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n        </td>\n      </tr>\n     {/if}\n\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$formValues.total_amount|crmMoney:$currency}\n      </td>\n     </tr>\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date Received{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|truncate:10:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n      {if $receipt_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Receipt Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receipt_date|truncate:10:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $formValues.paidBy and !$formValues.hidden_CreditCard}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Paid By{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$formValues.paidBy}\n       </td>\n      </tr>\n      {if $formValues.check_number}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Check Number{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.check_number}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $formValues.trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction ID{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$formValues.trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n     {if $ccContribution}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Billing Name and Address{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$billingName}<br />\n        {$address|nl2br}\n       </td>\n      </tr>\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $softCreditTypes and $softCredits}\n      {foreach from=$softCreditTypes item=softCreditType key=n}\n       <tr>\n        <th {$headerStyle}>\n         {$softCreditType}\n        </th>\n       </tr>\n       {foreach from=$softCredits.$n item=value key=label}\n         <tr>\n          <td {$labelStyle}>\n           {$label}\n          </td>\n          <td {$valueStyle}>\n           {$value}\n          </td>\n         </tr>\n        {/foreach}\n       {/foreach}\n     {/if}\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n     {if $formValues.product_name}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$formValues.product_name}\n       </td>\n      </tr>\n      {if $formValues.product_option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.product_option}\n        </td>\n       </tr>\n      {/if}\n      {if $formValues.product_sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.product_sku}\n        </td>\n       </tr>\n      {/if}\n      {if $fulfilled_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Sent{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$fulfilled_date|truncate:10:\'\'|crmDate}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,822,'contribution_offline_receipt',1,0,0,NULL),(6,'Contributions - Receipt (off-line)','{ts}Contribution Receipt{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $formValues.receipt_text}\n{$formValues.receipt_text}\n{else}{ts}Below you will find a receipt for this contribution.{/ts}{/if}\n\n===========================================================\n{ts}Contribution Information{/ts}\n\n===========================================================\n{ts}Contributor{/ts}: {contact.display_name}\n{ts}Financial Type{/ts}: {$formValues.contributionType_name}\n{if $lineItem}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $getTaxDetails}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $getTaxDetails} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $getTaxDetails}{$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"} {$line.tax_rate|string_format:\"%.2f\"} %   {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if} {/if}   {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $getTaxDetails && $dataArray}\n{ts}Amount before Tax{/ts} : {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset ||  $priceset == 0 || $value != \'\'}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}% : {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm} : {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n\n{if isset($totalTaxAmount) && $totalTaxAmount !== \'null\'}\n{ts}Total Tax Amount{/ts} : {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{ts}Total Amount{/ts} : {$formValues.total_amount|crmMoney:$currency}\n{if $receive_date}\n{ts}Date Received{/ts}: {$receive_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $receipt_date}\n{ts}Receipt Date{/ts}: {$receipt_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $formValues.paidBy and !$formValues.hidden_CreditCard}\n{ts}Paid By{/ts}: {$formValues.paidBy}\n{if $formValues.check_number}\n{ts}Check Number{/ts}: {$formValues.check_number}\n{/if}\n{/if}\n{if $formValues.trxn_id}\n{ts}Transaction ID{/ts}: {$formValues.trxn_id}\n{/if}\n\n{if $ccContribution}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n===========================================================\n{$customName}\n===========================================================\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $softCreditTypes and $softCredits}\n{foreach from=$softCreditTypes item=softCreditType key=n}\n===========================================================\n{$softCreditType}\n===========================================================\n{foreach from=$softCredits.$n item=value key=label}\n{$label}: {$value}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $formValues.product_name}\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$formValues.product_name}\n{if $formValues.product_option}\n{ts}Option{/ts}: {$formValues.product_option}\n{/if}\n{if $formValues.product_sku}\n{ts}SKU{/ts}: {$formValues.product_sku}\n{/if}\n{if $fulfilled_date}\n{ts}Sent{/ts}: {$fulfilled_date|crmDate}\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $formValues.receipt_text}\n     <p>{$formValues.receipt_text|htmlize}</p>\n    {else}\n     <p>{ts}Below you will find a receipt for this contribution.{/ts}</p>\n    {/if}\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Contribution Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Contributor Name{/ts}\n      </td>\n      <td {$valueStyle}>\n       {contact.display_name}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Financial Type{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$formValues.contributionType_name}\n      </td>\n     </tr>\n\n     {if $lineItem and !$is_quick_config}\n      {foreach from=$lineItem item=value key=priceset}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n          <tr>\n           <th>{ts}Item{/ts}</th>\n           <th>{ts}Qty{/ts}</th>\n           <th>{ts}Each{/ts}</th>\n           {if $getTaxDetails}\n             <th>{ts}Subtotal{/ts}</th>\n             <th>{ts}Tax Rate{/ts}</th>\n             <th>{ts}Tax Amount{/ts}</th>\n           {/if}\n           <th>{ts}Total{/ts}</th>\n          </tr>\n          {foreach from=$value item=line}\n           <tr>\n            <td>\n            {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n            </td>\n            <td>\n             {$line.qty}\n            </td>\n            <td>\n             {$line.unit_price|crmMoney:$currency}\n            </td>\n            {if $getTaxDetails}\n              <td>\n                {$line.unit_price*$line.qty|crmMoney:$currency}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                  {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                  {$line.tax_amount|crmMoney:$currency}\n                </td>\n              {else}\n                <td></td>\n                <td></td>\n              {/if}\n            {/if}\n            <td>\n             {$line.line_total+$line.tax_amount|crmMoney:$currency}\n            </td>\n           </tr>\n          {/foreach}\n         </table>\n        </td>\n       </tr>\n      {/foreach}\n     {/if}\n     {if $getTaxDetails && $dataArray}\n       <tr>\n         <td {$labelStyle}>\n           {ts} Amount before Tax : {/ts}\n         </td>\n         <td {$valueStyle}>\n           {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n         </td>\n       </tr>\n\n      {foreach from=$dataArray item=value key=priceset}\n        <tr>\n        {if $priceset ||  $priceset == 0 || $value != \'\'}\n          <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n          <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {else}\n          <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n          <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {/if}\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if isset($totalTaxAmount) && $totalTaxAmount !== \'null\'}\n      <tr>\n        <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n        </td>\n      </tr>\n     {/if}\n\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$formValues.total_amount|crmMoney:$currency}\n      </td>\n     </tr>\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date Received{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|truncate:10:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n      {if $receipt_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Receipt Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receipt_date|truncate:10:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $formValues.paidBy and !$formValues.hidden_CreditCard}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Paid By{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$formValues.paidBy}\n       </td>\n      </tr>\n      {if $formValues.check_number}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Check Number{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.check_number}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $formValues.trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction ID{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$formValues.trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n     {if $ccContribution}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Billing Name and Address{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$billingName}<br />\n        {$address|nl2br}\n       </td>\n      </tr>\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $softCreditTypes and $softCredits}\n      {foreach from=$softCreditTypes item=softCreditType key=n}\n       <tr>\n        <th {$headerStyle}>\n         {$softCreditType}\n        </th>\n       </tr>\n       {foreach from=$softCredits.$n item=value key=label}\n         <tr>\n          <td {$labelStyle}>\n           {$label}\n          </td>\n          <td {$valueStyle}>\n           {$value}\n          </td>\n         </tr>\n        {/foreach}\n       {/foreach}\n     {/if}\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n     {if $formValues.product_name}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$formValues.product_name}\n       </td>\n      </tr>\n      {if $formValues.product_option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.product_option}\n        </td>\n       </tr>\n      {/if}\n      {if $formValues.product_sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.product_sku}\n        </td>\n       </tr>\n      {/if}\n      {if $fulfilled_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Sent{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$fulfilled_date|truncate:10:\'\'|crmDate}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,822,'contribution_offline_receipt',0,1,0,NULL),(7,'Contributions - Receipt (on-line)','{if $is_pay_later}{ts}Invoice{/ts}{else}{ts}Receipt{/ts}{/if} - {$title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $receipt_text}\n{$receipt_text}\n{/if}\n{if $is_pay_later}\n\n===========================================================\n{$pay_later_receipt}\n===========================================================\n{/if}\n\n{if $amount}\n===========================================================\n{ts}Contribution Information{/ts}\n\n===========================================================\n{if $lineItem and $priceSetID and !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $dataArray}{$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if} {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Total Amount{/ts}: {$amount|crmMoney:$currency}\n{else}\n{ts}Amount{/ts}: {$amount|crmMoney:$currency} {if $amount_level } - {$amount_level} {/if}\n{/if}\n{/if}\n{if $receive_date}\n\n{ts}Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $is_monetary and $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n\n{if $is_recur}\n{ts}This is a recurring contribution.{/ts}\n\n{if $cancelSubscriptionUrl}\n{ts}You can cancel future contributions at:{/ts}\n\n{$cancelSubscriptionUrl}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts}You can update billing details for this recurring contribution at:{/ts}\n\n{$updateSubscriptionBillingUrl}\n\n{/if}\n\n{if $updateSubscriptionUrl}\n{ts}You can update recurring contribution amount or change the number of installments for this recurring contribution at:{/ts}\n\n{$updateSubscriptionUrl}\n\n{/if}\n{/if}\n\n{if $honor_block_is_active}\n===========================================================\n{$soft_credit_type}\n===========================================================\n{foreach from=$honoreeProfile item=value key=label}\n{$label}: {$value}\n{/foreach}\n{elseif $softCreditTypes and $softCredits}\n{foreach from=$softCreditTypes item=softCreditType key=n}\n===========================================================\n{$softCreditType}\n===========================================================\n{foreach from=$softCredits.$n item=value key=label}\n{$label}: {$value}\n{/foreach}\n{/foreach}\n{/if}\n{if $pcpBlock}\n===========================================================\n{ts}Personal Campaign Page{/ts}\n\n===========================================================\n{ts}Display In Honor Roll{/ts}: {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n\n{if $pcp_roll_nickname}{ts}Nickname{/ts}: {$pcp_roll_nickname}{/if}\n\n{if $pcp_personal_note}{ts}Personal Note{/ts}: {$pcp_personal_note}{/if}\n\n{/if}\n{if $onBehalfProfile}\n===========================================================\n{ts}On Behalf Of{/ts}\n\n===========================================================\n{foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n{$onBehalfName}: {$onBehalfValue}\n{/foreach}\n{/if}\n\n{if $billingName}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n{elseif $email}\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$email}\n{/if} {* End billingName or Email*}\n{if $credit_card_type}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n\n{if $selectPremium }\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$product_name}\n{if $option}\n{ts}Option{/ts}: {$option}\n{/if}\n{if $sku}\n{ts}SKU{/ts}: {$sku}\n{/if}\n{if $start_date}\n{ts}Start Date{/ts}: {$start_date|crmDate}\n{/if}\n{if $end_date}\n{ts}End Date{/ts}: {$end_date|crmDate}\n{/if}\n{if $contact_email OR $contact_phone}\n\n{ts}For information about this premium, contact:{/ts}\n\n{if $contact_email}\n  {$contact_email}\n{/if}\n{if $contact_phone}\n  {$contact_phone}\n{/if}\n{/if}\n{if $is_deductible AND $price}\n\n{ts 1=$price|crmMoney:$currency}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}{/if}\n{/if}\n\n{if $customPre}\n===========================================================\n{$customPre_grouptitle}\n\n===========================================================\n{foreach from=$customPre item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n\n\n{if $customPost}\n===========================================================\n{$customPost_grouptitle}\n\n===========================================================\n{foreach from=$customPost item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $receipt_text}\n     <p>{$receipt_text|htmlize}</p>\n    {/if}\n\n    {if $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  </table>\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n     {if $amount}\n\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Contribution Information{/ts}\n       </th>\n      </tr>\n\n      {if $lineItem and $priceSetID and !$is_quick_config}\n\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Qty{/ts}</th>\n            <th>{ts}Each{/ts}</th>\n            {if $dataArray}\n             <th>{ts}Subtotal{/ts}</th>\n             <th>{ts}Tax Rate{/ts}</th>\n             <th>{ts}Tax Amount{/ts}</th>\n            {/if}\n            <th>{ts}Total{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n             {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n             </td>\n             <td>\n              {$line.qty}\n             </td>\n             <td>\n              {$line.unit_price|crmMoney:$currency}\n             </td>\n             {if $getTaxDetails}\n              <td>\n               {$line.unit_price*$line.qty|crmMoney:$currency}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n               <td>\n                {$line.tax_rate|string_format:\"%.2f\"}%\n               </td>\n               <td>\n                {$line.tax_amount|crmMoney:$currency}\n               </td>\n              {else}\n               <td></td>\n               <td></td>\n              {/if}\n             {/if}\n             <td>\n              {$line.line_total+$line.tax_amount|crmMoney:$currency}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts} Amount before Tax : {/ts}\n         </td>\n         <td {$valueStyle}>\n          {$amount-$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n          {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {else}\n           <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {/if}\n         </tr>\n        {/foreach}\n\n       {/if}\n       {if $totalTaxAmount}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney:$currency}\n        </td>\n       </tr>\n\n      {else}\n\n      {if $totalTaxAmount}\n         <tr>\n           <td {$labelStyle}>\n             {ts}Total Tax Amount{/ts}\n           </td>\n           <td {$valueStyle}>\n             {$totalTaxAmount|crmMoney:$currency}\n           </td>\n         </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney:$currency} {if $amount_level} - {$amount_level}{/if}\n        </td>\n       </tr>\n\n      {/if}\n\n     {/if}\n\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $is_monetary and $trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n    {if $is_recur}\n      <tr>\n        <td  colspan=\"2\" {$labelStyle}>\n          {ts}This is a recurring contribution.{/ts}\n          {if $cancelSubscriptionUrl}\n            {ts 1=$cancelSubscriptionUrl}You can cancel future contributions by <a href=\"%1\">visiting this web page</a>.{/ts}\n          {/if}\n        </td>\n      </tr>\n      {if $updateSubscriptionBillingUrl}\n        <tr>\n          <td colspan=\"2\" {$labelStyle}>\n            {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n      {if $updateSubscriptionUrl}\n        <tr>\n          <td colspan=\"2\" {$labelStyle}>\n            {ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n    {/if}\n\n     {if $honor_block_is_active}\n      <tr>\n       <th {$headerStyle}>\n        {$soft_credit_type}\n       </th>\n      </tr>\n      {foreach from=$honoreeProfile item=value key=label}\n        <tr>\n         <td {$labelStyle}>\n          {$label}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n      {/foreach}\n      {elseif $softCreditTypes and $softCredits}\n      {foreach from=$softCreditTypes item=softCreditType key=n}\n       <tr>\n        <th {$headerStyle}>\n         {$softCreditType}\n        </th>\n       </tr>\n       {foreach from=$softCredits.$n item=value key=label}\n         <tr>\n          <td {$labelStyle}>\n           {$label}\n          </td>\n          <td {$valueStyle}>\n           {$value}\n          </td>\n         </tr>\n        {/foreach}\n       {/foreach}\n     {/if}\n\n     {if $pcpBlock}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Personal Campaign Page{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Display In Honor Roll{/ts}\n       </td>\n       <td {$valueStyle}>\n        {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n       </td>\n      </tr>\n      {if $pcp_roll_nickname}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Nickname{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_roll_nickname}\n        </td>\n       </tr>\n      {/if}\n      {if $pcp_personal_note}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Personal Note{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_personal_note}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $onBehalfProfile}\n      <tr>\n       <th {$headerStyle}>\n        {$onBehalfProfile_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n        <tr>\n         <td {$labelStyle}>\n          {$onBehalfName}\n         </td>\n         <td {$valueStyle}>\n          {$onBehalfValue}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $isShare}\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n            {capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contributionPageId`\" a=true fe=1 h=1}{/capture}\n            {include file=\"CRM/common/SocialNetwork.tpl\" emailMode=true url=$contributionUrl title=$title pageURL=$contributionUrl}\n        </td>\n      </tr>\n     {/if}\n\n     {if $billingName}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n     {elseif $email}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Registered Email{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$email}\n        </td>\n       </tr>\n     {/if}\n\n     {if $credit_card_type}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n     {/if}\n\n     {if $selectPremium}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$product_name}\n       </td>\n      </tr>\n      {if $option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$option}\n        </td>\n       </tr>\n      {/if}\n      {if $sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$sku}\n        </td>\n       </tr>\n      {/if}\n      {if $start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $contact_email OR $contact_phone}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}For information about this premium, contact:{/ts}</p>\n         {if $contact_email}\n          <p>{$contact_email}</p>\n         {/if}\n         {if $contact_phone}\n          <p>{$contact_phone}</p>\n         {/if}\n        </td>\n       </tr>\n      {/if}\n      {if $is_deductible AND $price}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <p>{ts 1=$price|crmMoney:$currency}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}</p>\n         </td>\n        </tr>\n      {/if}\n     {/if}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,823,'contribution_online_receipt',1,0,0,NULL),(8,'Contributions - Receipt (on-line)','{if $is_pay_later}{ts}Invoice{/ts}{else}{ts}Receipt{/ts}{/if} - {$title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $receipt_text}\n{$receipt_text}\n{/if}\n{if $is_pay_later}\n\n===========================================================\n{$pay_later_receipt}\n===========================================================\n{/if}\n\n{if $amount}\n===========================================================\n{ts}Contribution Information{/ts}\n\n===========================================================\n{if $lineItem and $priceSetID and !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $dataArray}{$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if} {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Total Amount{/ts}: {$amount|crmMoney:$currency}\n{else}\n{ts}Amount{/ts}: {$amount|crmMoney:$currency} {if $amount_level } - {$amount_level} {/if}\n{/if}\n{/if}\n{if $receive_date}\n\n{ts}Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $is_monetary and $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n\n{if $is_recur}\n{ts}This is a recurring contribution.{/ts}\n\n{if $cancelSubscriptionUrl}\n{ts}You can cancel future contributions at:{/ts}\n\n{$cancelSubscriptionUrl}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts}You can update billing details for this recurring contribution at:{/ts}\n\n{$updateSubscriptionBillingUrl}\n\n{/if}\n\n{if $updateSubscriptionUrl}\n{ts}You can update recurring contribution amount or change the number of installments for this recurring contribution at:{/ts}\n\n{$updateSubscriptionUrl}\n\n{/if}\n{/if}\n\n{if $honor_block_is_active}\n===========================================================\n{$soft_credit_type}\n===========================================================\n{foreach from=$honoreeProfile item=value key=label}\n{$label}: {$value}\n{/foreach}\n{elseif $softCreditTypes and $softCredits}\n{foreach from=$softCreditTypes item=softCreditType key=n}\n===========================================================\n{$softCreditType}\n===========================================================\n{foreach from=$softCredits.$n item=value key=label}\n{$label}: {$value}\n{/foreach}\n{/foreach}\n{/if}\n{if $pcpBlock}\n===========================================================\n{ts}Personal Campaign Page{/ts}\n\n===========================================================\n{ts}Display In Honor Roll{/ts}: {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n\n{if $pcp_roll_nickname}{ts}Nickname{/ts}: {$pcp_roll_nickname}{/if}\n\n{if $pcp_personal_note}{ts}Personal Note{/ts}: {$pcp_personal_note}{/if}\n\n{/if}\n{if $onBehalfProfile}\n===========================================================\n{ts}On Behalf Of{/ts}\n\n===========================================================\n{foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n{$onBehalfName}: {$onBehalfValue}\n{/foreach}\n{/if}\n\n{if $billingName}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n{elseif $email}\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$email}\n{/if} {* End billingName or Email*}\n{if $credit_card_type}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n\n{if $selectPremium }\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$product_name}\n{if $option}\n{ts}Option{/ts}: {$option}\n{/if}\n{if $sku}\n{ts}SKU{/ts}: {$sku}\n{/if}\n{if $start_date}\n{ts}Start Date{/ts}: {$start_date|crmDate}\n{/if}\n{if $end_date}\n{ts}End Date{/ts}: {$end_date|crmDate}\n{/if}\n{if $contact_email OR $contact_phone}\n\n{ts}For information about this premium, contact:{/ts}\n\n{if $contact_email}\n  {$contact_email}\n{/if}\n{if $contact_phone}\n  {$contact_phone}\n{/if}\n{/if}\n{if $is_deductible AND $price}\n\n{ts 1=$price|crmMoney:$currency}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}{/if}\n{/if}\n\n{if $customPre}\n===========================================================\n{$customPre_grouptitle}\n\n===========================================================\n{foreach from=$customPre item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n\n\n{if $customPost}\n===========================================================\n{$customPost_grouptitle}\n\n===========================================================\n{foreach from=$customPost item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $receipt_text}\n     <p>{$receipt_text|htmlize}</p>\n    {/if}\n\n    {if $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  </table>\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n     {if $amount}\n\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Contribution Information{/ts}\n       </th>\n      </tr>\n\n      {if $lineItem and $priceSetID and !$is_quick_config}\n\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Qty{/ts}</th>\n            <th>{ts}Each{/ts}</th>\n            {if $dataArray}\n             <th>{ts}Subtotal{/ts}</th>\n             <th>{ts}Tax Rate{/ts}</th>\n             <th>{ts}Tax Amount{/ts}</th>\n            {/if}\n            <th>{ts}Total{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n             {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n             </td>\n             <td>\n              {$line.qty}\n             </td>\n             <td>\n              {$line.unit_price|crmMoney:$currency}\n             </td>\n             {if $getTaxDetails}\n              <td>\n               {$line.unit_price*$line.qty|crmMoney:$currency}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n               <td>\n                {$line.tax_rate|string_format:\"%.2f\"}%\n               </td>\n               <td>\n                {$line.tax_amount|crmMoney:$currency}\n               </td>\n              {else}\n               <td></td>\n               <td></td>\n              {/if}\n             {/if}\n             <td>\n              {$line.line_total+$line.tax_amount|crmMoney:$currency}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts} Amount before Tax : {/ts}\n         </td>\n         <td {$valueStyle}>\n          {$amount-$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n          {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {else}\n           <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {/if}\n         </tr>\n        {/foreach}\n\n       {/if}\n       {if $totalTaxAmount}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney:$currency}\n        </td>\n       </tr>\n\n      {else}\n\n      {if $totalTaxAmount}\n         <tr>\n           <td {$labelStyle}>\n             {ts}Total Tax Amount{/ts}\n           </td>\n           <td {$valueStyle}>\n             {$totalTaxAmount|crmMoney:$currency}\n           </td>\n         </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney:$currency} {if $amount_level} - {$amount_level}{/if}\n        </td>\n       </tr>\n\n      {/if}\n\n     {/if}\n\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $is_monetary and $trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n    {if $is_recur}\n      <tr>\n        <td  colspan=\"2\" {$labelStyle}>\n          {ts}This is a recurring contribution.{/ts}\n          {if $cancelSubscriptionUrl}\n            {ts 1=$cancelSubscriptionUrl}You can cancel future contributions by <a href=\"%1\">visiting this web page</a>.{/ts}\n          {/if}\n        </td>\n      </tr>\n      {if $updateSubscriptionBillingUrl}\n        <tr>\n          <td colspan=\"2\" {$labelStyle}>\n            {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n      {if $updateSubscriptionUrl}\n        <tr>\n          <td colspan=\"2\" {$labelStyle}>\n            {ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n    {/if}\n\n     {if $honor_block_is_active}\n      <tr>\n       <th {$headerStyle}>\n        {$soft_credit_type}\n       </th>\n      </tr>\n      {foreach from=$honoreeProfile item=value key=label}\n        <tr>\n         <td {$labelStyle}>\n          {$label}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n      {/foreach}\n      {elseif $softCreditTypes and $softCredits}\n      {foreach from=$softCreditTypes item=softCreditType key=n}\n       <tr>\n        <th {$headerStyle}>\n         {$softCreditType}\n        </th>\n       </tr>\n       {foreach from=$softCredits.$n item=value key=label}\n         <tr>\n          <td {$labelStyle}>\n           {$label}\n          </td>\n          <td {$valueStyle}>\n           {$value}\n          </td>\n         </tr>\n        {/foreach}\n       {/foreach}\n     {/if}\n\n     {if $pcpBlock}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Personal Campaign Page{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Display In Honor Roll{/ts}\n       </td>\n       <td {$valueStyle}>\n        {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n       </td>\n      </tr>\n      {if $pcp_roll_nickname}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Nickname{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_roll_nickname}\n        </td>\n       </tr>\n      {/if}\n      {if $pcp_personal_note}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Personal Note{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_personal_note}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $onBehalfProfile}\n      <tr>\n       <th {$headerStyle}>\n        {$onBehalfProfile_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n        <tr>\n         <td {$labelStyle}>\n          {$onBehalfName}\n         </td>\n         <td {$valueStyle}>\n          {$onBehalfValue}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $isShare}\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n            {capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contributionPageId`\" a=true fe=1 h=1}{/capture}\n            {include file=\"CRM/common/SocialNetwork.tpl\" emailMode=true url=$contributionUrl title=$title pageURL=$contributionUrl}\n        </td>\n      </tr>\n     {/if}\n\n     {if $billingName}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n     {elseif $email}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Registered Email{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$email}\n        </td>\n       </tr>\n     {/if}\n\n     {if $credit_card_type}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n     {/if}\n\n     {if $selectPremium}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$product_name}\n       </td>\n      </tr>\n      {if $option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$option}\n        </td>\n       </tr>\n      {/if}\n      {if $sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$sku}\n        </td>\n       </tr>\n      {/if}\n      {if $start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $contact_email OR $contact_phone}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}For information about this premium, contact:{/ts}</p>\n         {if $contact_email}\n          <p>{$contact_email}</p>\n         {/if}\n         {if $contact_phone}\n          <p>{$contact_phone}</p>\n         {/if}\n        </td>\n       </tr>\n      {/if}\n      {if $is_deductible AND $price}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <p>{ts 1=$price|crmMoney:$currency}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}</p>\n         </td>\n        </tr>\n      {/if}\n     {/if}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,823,'contribution_online_receipt',0,1,0,NULL),(9,'Contributions - Invoice','{if $title}\n  {if $component}\n    {if $component == \'event\'}\n      {ts 1=$title}Event Registration Invoice: %1{/ts}\n    {else}\n      {ts 1=$title}Contribution Invoice: %1{/ts}\n    {/if}\n  {/if}\n{else}\n  {ts}Invoice{/ts}\n{/if}\n - {contact.display_name}\n','{ts}Contribution Invoice{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n      <title></title>\n  </head>\n  <body>\n  <div style=\"padding-top:100px;margin-right:50px;border-style: none;\">\n    {if $config->empoweredBy}\n      <table style=\"margin-top:5px;padding-bottom:50px;\" cellpadding=\"5\" cellspacing=\"0\">\n        <tr>\n          <td><img src=\"{$resourceBase}/i/civi99.png\" height=\"34px\" width=\"99px\"></td>\n        </tr>\n      </table>\n    {/if}\n      <table style=\"font-family: Arial, Verdana, sans-serif;\" width=\"100%\" height=\"100\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\n        <tr>\n          <td width=\"30%\"><b><font size=\"4\" align=\"center\">{ts}INVOICE{/ts}</font></b></td>\n          <td width=\"50%\" valign=\"bottom\"><b><font size=\"1\" align=\"center\">{ts}Invoice Date:{/ts}</font></b></td>\n          <td valign=\"bottom\" style=\"white-space: nowrap\"><b><font size=\"1\" align=\"right\">{$domain_organization}</font></b></td>\n        </tr>\n        <tr>\n          {if $organization_name}\n            <td><font size=\"1\" align=\"center\">{$display_name}  ({$organization_name})</font></td>\n          {else}\n            <td><font size=\"1\" align=\"center\">{$display_name}</font></td>\n          {/if}\n          <td><font size=\"1\" align=\"right\">{$invoice_date}</font></td>\n          <td style=\"white-space: nowrap\">\n            <font size=\"1\" align=\"right\">\n              {if $domain_street_address }{$domain_street_address}{/if}\n              {if $domain_supplemental_address_1 }{$domain_supplemental_address_1}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"center\">{$street_address} {$supplemental_address_1}</font></td>\n          <td><b><font size=\"1\" align=\"right\">{ts}Invoice Number:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_supplemental_address_2 }{$domain_supplemental_address_2}{/if}\n              {if $domain_state }{$domain_state}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"center\">{$supplemental_address_2} {$stateProvinceAbbreviation}</font></td>\n          <td><font size=\"1\" align=\"right\">{$invoice_number}</font></td>\n          <td style=\"white-space: nowrap\">\n            <font size=\"1\" align=\"right\">\n              {if $domain_city}{$domain_city}{/if}\n              {if $domain_postal_code }{$domain_postal_code}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"right\">{$city}  {$postal_code}</font></td>\n          <td height=\"10\"><b><font size=\"1\" align=\"right\">{ts}Reference:{/ts}</font></b></td>\n          <td><font size=\"1\" align=\"right\">{if $domain_country}{$domain_country}{/if}</font></td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"right\"> {$country}</font></td>\n          <td><font size=\"1\" align=\"right\">{$source}</font></td>\n          <td valign=\"top\" style=\"white-space: nowrap\"><font size=\"1\" align=\"right\">{if $domain_email}{$domain_email}{/if}</font> </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td></td>\n          <td valign=\"top\"><font size=\"1\" align=\"right\">{if $domain_phone}{$domain_phone}{/if}</font> </td>\n        </tr>\n      </table>\n\n             <table style=\"padding-top:75px;font-family: Arial, Verdana, sans-serif;\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\n              <tr>\n                <th style=\"text-align:left;font-weight:bold;width:100%\"><font size=\"1\">{ts}Description{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts}Quantity{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts}Unit Price{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{$taxTerm}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts 1=$defaultCurrency}Amount %1{/ts}</font></th>\n              </tr>\n              {foreach from=$lineItem item=value key=priceset name=taxpricevalue}\n                {if $smarty.foreach.taxpricevalue.index eq 0}\n                {else}\n                {/if}\n                <tr>\n                  <td style=\"text-align:left;nowrap\"><font size=\"1\">\n                    {if $value.html_type eq \'Text\'}\n                      {$value.label}\n                    {else}\n                      {$value.field_title} - {$value.label}\n                    {/if}\n                    {if $value.description}\n                      <div>{$value.description|truncate:30:\"...\"}</div>\n                    {/if}\n                   </font>\n                  </td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.qty}</font></td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.unit_price|crmMoney:$currency}</font></td>\n                  {if $value.tax_amount != \'\'}\n                    <td style=\"text-align:right;\"><font size=\"1\">{$value.tax_rate}%</font></td>\n                  {else}\n                    <td style=\"text-align:right;\"><font size=\"1\">{ts 1=$taxTerm}-{/ts}</font></td>\n                  {/if}\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.subTotal|crmMoney:$currency}</font></td>\n                </tr>\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{ts}Sub Total{/ts}</font></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$subTotal|crmMoney:$currency}</font></td>\n              </tr>\n              {foreach from=$dataArray item=value key=priceset}\n                <tr>\n                  <td colspan=\"3\"></td>\n                    {if $priceset}\n                      <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">{ts 1=$taxTerm 2=$priceset}TOTAL %1 %2%{/ts}</font></td>\n                      <td style=\"text-align:right\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                    {elseif $priceset == 0}\n                      <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">{ts 1=$taxTerm}TOTAL %1{/ts}</font></td>\n                      <td style=\"text-align:right\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                </tr>\n              {/if}\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;white-space: nowrap\"><b><font size=\"1\">{ts 1=$defaultCurrency}TOTAL %1{/ts}</font></b></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">\n                  {if $contribution_status_id == $refundedStatusId}\n                    {ts}Amount Credited{/ts}\n                  {else}\n                    {ts}Amount Paid{/ts}\n                  {/if}\n                 </font>\n                </td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$amountPaid|crmMoney:$currency}</font></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td colspan=\"2\"><hr></hr></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;white-space: nowrap\" ><b><font size=\"1\">{ts}AMOUNT DUE:{/ts}</font></b></td>\n                <td style=\"text-align:right;\"><b><font size=\"1\">{$amountDue|crmMoney:$currency}</font></b></td>\n              </tr>\n\n              <br/><br/><br/>\n              <tr>\n                <td colspan=\"5\"></td>\n              </tr>\n              {if $contribution_status_id == $pendingStatusId && $is_pay_later == 1}\n                <tr>\n                  <td colspan=\"3\"><b><font size=\"1\" align=\"center\">{ts 1=$dueDate}DUE DATE: %1{/ts}</font></b></td>\n                  <td colspan=\"2\"></td>\n                </tr>\n              {/if}\n            </table>\n          </td>\n        </tr>\n      </table>\n\n      {if $contribution_status_id == $pendingStatusId && $is_pay_later == 1}\n        <table style=\"margin-top:5px;\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n          <tr>\n            <td><img src=\"{$resourceBase}/i/contribute/cut_line.png\" height=\"15\"></td>\n          </tr>\n        </table>\n\n        <table style=\"margin-top:5px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\" id=\"desc\">\n          <tr>\n            <td width=\"60%\"><b><font size=\"4\" align=\"right\">{ts}PAYMENT ADVICE{/ts}</font></b><br/><br/><font size=\"1\" align=\"left\"><b>{ts}To:{/ts}</b><div style=\"width:24em;word-wrap:break-word;\">\n              {$domain_organization}<br />\n              {$domain_street_address} {$domain_supplemental_address_1}<br />\n              {$domain_supplemental_address_2} {$domain_state}<br />\n              {$domain_city} {$domain_postal_code}<br />\n              {$domain_country}<br />\n              {$domain_email}</div>\n              {$domain_phone}<br />\n             </font><br/><br/><font size=\"1\" align=\"left\">{$notes}</font>\n            </td>\n            <td width=\"40%\">\n              <table cellpadding=\"5\" cellspacing=\"0\"  width=\"100%\" border=\"0\">\n                <tr>\n                  <td width=\"100%\"><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Customer:{/ts}</font></td>\n                  <td style=\"white-space: nowrap\"><font size=\"1\" align=\"right\">{$display_name}</font></td>\n                </tr>\n                <tr>\n                  <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Invoice Number:{/ts}</font></td>\n                  <td><font size=\"1\" align=\"right\">{$invoice_number}</font></td>\n                </tr>\n                <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></td></tr>\n                {if $is_pay_later == 1}\n                  <tr>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Amount Due:{/ts}</font></td>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amount|crmMoney:$currency}</font></td>\n                  </tr>\n                {else}\n                  <tr>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Amount Due:{/ts}</font></td>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amountDue|crmMoney:$currency}</font></td>\n                  </tr>\n                {/if}\n                <tr>\n                  <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Due Date:{/ts}</font></td>\n                  <td><font size=\"1\" align=\"right\">{$dueDate}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></td>\n                </tr>\n              </table>\n      {/if}\n\n      {if $contribution_status_id == $refundedStatusId || $contribution_status_id == $cancelledStatusId}\n      {if $config->empoweredBy}\n        <table style=\"margin-top:2px;padding-left:7px;page-break-before: always;\">\n          <tr>\n            <td><img src=\"{$resourceBase}/i/civi99.png\" height=\"34px\" width=\"99px\"></td>\n          </tr>\n        </table>\n      {/if}\n\n    <center>\n      <table style=\"font-family: Arial, Verdana, sans-serif\" width=\"100%\" height=\"100\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\">\n        <tr>\n          <td style=\"padding-left:15px;\"><b><font size=\"4\" align=\"center\">{ts}CREDIT NOTE{/ts}</font></b></td>\n          <td style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Date:{/ts}</font></b></td>\n          <td><font size=\"1\" align=\"right\">{$domain_organization}</font></td>\n        </tr>\n        <tr>\n          {if $organization_name}\n            <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$display_name}  ({$organization_name})</font></td>\n          {else}\n            <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$display_name}</font></td>\n          {/if}\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$invoice_date}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_street_address }{$domain_street_address}{/if}\n              {if $domain_supplemental_address_1 }{$domain_supplemental_address_1}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$street_address}   {$supplemental_address_1}</font></td>\n          <td style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Credit Note Number:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_supplemental_address_2 }{$domain_supplemental_address_2}{/if}\n              {if $domain_state }{$domain_state}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$supplemental_address_2}  {$stateProvinceAbbreviation}</font></td>\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$creditnote_id}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_city}{$domain_city}{/if}\n              {if $domain_postal_code }{$domain_postal_code}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"right\">{$city}  {$postal_code}</font></td>\n          <td height=\"10\" style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Reference:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_country}{$domain_country}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$source}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_email}{$domain_email}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_phone}{$domain_phone}{/if}\n           </font>\n          </td>\n        </tr>\n      </table>\n\n      <table style=\"margin-top:75px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\" id=\"desc\">\n        <tr>\n          <td colspan=\"2\" {$valueStyle}>\n            <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n              <tr>\n                <th style=\"padding-right:28px;text-align:left;font-weight:bold;width:200px;\"><font size=\"1\">{ts}Description{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts}Quantity{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts}Unit Price{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{$taxTerm}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts 1=$defaultCurrency}Amount %1{/ts}</font></th>\n              </tr>\n              {foreach from=$lineItem item=value key=priceset name=pricevalue}\n                {if $smarty.foreach.pricevalue.index eq 0}\n                  <tr><td colspan=\"5\"><hr size=\"3\" style=\"color:#000;\"></hr></td></tr>\n                {else}\n                  <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n                {/if}\n                <tr>\n                  <td style =\"text-align:left;\"  >\n                    <font size=\"1\">\n                      {if $value.html_type eq \'Text\'}\n                        {$value.label}\n                      {else}\n                        {$value.field_title} - {$value.label}\n                      {/if}\n                      {if $value.description}\n                        <div>{$value.description|truncate:30:\"...\"}</div>\n                      {/if}\n                   </font>\n                  </td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.qty}</font></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.unit_price|crmMoney:$currency}</font></td>\n                  {if $value.tax_amount != \'\'}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.tax_rate}%</font></td>\n                  {else}\n                    <td style=\"padding-left:28px;text-align:right\"><font size=\"1\">{ts 1=$taxTerm}No %1{/ts}</font></td>\n                  {/if}\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.subTotal|crmMoney:$currency}</font></td>\n                </tr>\n              {/foreach}\n              <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts}Sub Total{/ts}</font></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$subTotal|crmMoney:$currency}</font></td>\n              </tr>\n              {foreach from=$dataArray item=value key=priceset}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  {if $priceset}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts 1=$taxTerm 2=$priceset}TOTAL %1 %2%{/ts}</font></td>\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                  {elseif $priceset == 0}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts 1=$taxTerm}TOTAL NO %1{/ts}</font></td>\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                </tr>\n                {/if}\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td colspan=\"2\"><hr></hr></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{ts 1=$defaultCurrency}TOTAL %1{/ts}</font></b></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n              {if $is_pay_later == 0}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts}LESS Credit to invoice(s){/ts}</font></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td colspan=\"2\"><hr></hr></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{ts}REMAINING CREDIT{/ts}</font></b></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{$amountDue|crmMoney:$currency}</font></b></td>\n                  <td style=\"padding-left:28px;\"><font size=\"1\" align=\"right\"></font></td>\n                </tr>\n              {/if}\n              <br/><br/><br/>\n              <tr>\n                <td colspan=\"3\"></td>\n              </tr>\n              <tr>\n                <td></td>\n                <td colspan=\"3\"></td>\n              </tr>\n            </table>\n          </td>\n        </tr>\n      </table>\n\n      <table width=\"100%\" style=\"margin-top:5px;padding-right:45px;\">\n        <tr>\n          <td><img src=\"{$resourceBase}/i/contribute/cut_line.png\" height=\"15\" width=\"100%\"></td>\n        </tr>\n      </table>\n\n      <table style=\"margin-top:6px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\" id=\"desc\">\n        <tr>\n          <td width=\"60%\"><font size=\"4\" align=\"right\"><b>{ts}CREDIT ADVICE{/ts}</b><br/><br /><div style=\"font-size:10px;max-width:300px;\">{ts}Please do not pay on this advice. Deduct the amount of this Credit Note from your next payment to us{/ts}</div><br/></font></td>\n          <td width=\"40%\">\n            <table align=\"right\">\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Customer:{/ts}</font></td>\n                <td><font size=\"1\" align=\"right\">{$display_name}</font></td>\n              </tr>\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Credit Note#:{/ts}</font></td>\n                <td><font size=\"1\" align=\"right\">{$creditnote_id}</font></td>\n              </tr>\n              <tr><td colspan=\"5\"style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Credit Amount:{/ts}</font></td>\n                <td width=\'50px\'><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n            </table>\n          </td>\n        </tr>\n      </table>\n    {/if}\n    </center>\n\n  </div>\n  </body>\n</html>\n',1,824,'contribution_invoice_receipt',1,0,0,NULL),(10,'Contributions - Invoice','{if $title}\n  {if $component}\n    {if $component == \'event\'}\n      {ts 1=$title}Event Registration Invoice: %1{/ts}\n    {else}\n      {ts 1=$title}Contribution Invoice: %1{/ts}\n    {/if}\n  {/if}\n{else}\n  {ts}Invoice{/ts}\n{/if}\n - {contact.display_name}\n','{ts}Contribution Invoice{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n      <title></title>\n  </head>\n  <body>\n  <div style=\"padding-top:100px;margin-right:50px;border-style: none;\">\n    {if $config->empoweredBy}\n      <table style=\"margin-top:5px;padding-bottom:50px;\" cellpadding=\"5\" cellspacing=\"0\">\n        <tr>\n          <td><img src=\"{$resourceBase}/i/civi99.png\" height=\"34px\" width=\"99px\"></td>\n        </tr>\n      </table>\n    {/if}\n      <table style=\"font-family: Arial, Verdana, sans-serif;\" width=\"100%\" height=\"100\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\n        <tr>\n          <td width=\"30%\"><b><font size=\"4\" align=\"center\">{ts}INVOICE{/ts}</font></b></td>\n          <td width=\"50%\" valign=\"bottom\"><b><font size=\"1\" align=\"center\">{ts}Invoice Date:{/ts}</font></b></td>\n          <td valign=\"bottom\" style=\"white-space: nowrap\"><b><font size=\"1\" align=\"right\">{$domain_organization}</font></b></td>\n        </tr>\n        <tr>\n          {if $organization_name}\n            <td><font size=\"1\" align=\"center\">{$display_name}  ({$organization_name})</font></td>\n          {else}\n            <td><font size=\"1\" align=\"center\">{$display_name}</font></td>\n          {/if}\n          <td><font size=\"1\" align=\"right\">{$invoice_date}</font></td>\n          <td style=\"white-space: nowrap\">\n            <font size=\"1\" align=\"right\">\n              {if $domain_street_address }{$domain_street_address}{/if}\n              {if $domain_supplemental_address_1 }{$domain_supplemental_address_1}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"center\">{$street_address} {$supplemental_address_1}</font></td>\n          <td><b><font size=\"1\" align=\"right\">{ts}Invoice Number:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_supplemental_address_2 }{$domain_supplemental_address_2}{/if}\n              {if $domain_state }{$domain_state}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"center\">{$supplemental_address_2} {$stateProvinceAbbreviation}</font></td>\n          <td><font size=\"1\" align=\"right\">{$invoice_number}</font></td>\n          <td style=\"white-space: nowrap\">\n            <font size=\"1\" align=\"right\">\n              {if $domain_city}{$domain_city}{/if}\n              {if $domain_postal_code }{$domain_postal_code}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"right\">{$city}  {$postal_code}</font></td>\n          <td height=\"10\"><b><font size=\"1\" align=\"right\">{ts}Reference:{/ts}</font></b></td>\n          <td><font size=\"1\" align=\"right\">{if $domain_country}{$domain_country}{/if}</font></td>\n        </tr>\n        <tr>\n          <td><font size=\"1\" align=\"right\"> {$country}</font></td>\n          <td><font size=\"1\" align=\"right\">{$source}</font></td>\n          <td valign=\"top\" style=\"white-space: nowrap\"><font size=\"1\" align=\"right\">{if $domain_email}{$domain_email}{/if}</font> </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td></td>\n          <td valign=\"top\"><font size=\"1\" align=\"right\">{if $domain_phone}{$domain_phone}{/if}</font> </td>\n        </tr>\n      </table>\n\n             <table style=\"padding-top:75px;font-family: Arial, Verdana, sans-serif;\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\">\n              <tr>\n                <th style=\"text-align:left;font-weight:bold;width:100%\"><font size=\"1\">{ts}Description{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts}Quantity{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts}Unit Price{/ts}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{$taxTerm}</font></th>\n                <th style=\"text-align:right;font-weight:bold;white-space: nowrap\"><font size=\"1\">{ts 1=$defaultCurrency}Amount %1{/ts}</font></th>\n              </tr>\n              {foreach from=$lineItem item=value key=priceset name=taxpricevalue}\n                {if $smarty.foreach.taxpricevalue.index eq 0}\n                {else}\n                {/if}\n                <tr>\n                  <td style=\"text-align:left;nowrap\"><font size=\"1\">\n                    {if $value.html_type eq \'Text\'}\n                      {$value.label}\n                    {else}\n                      {$value.field_title} - {$value.label}\n                    {/if}\n                    {if $value.description}\n                      <div>{$value.description|truncate:30:\"...\"}</div>\n                    {/if}\n                   </font>\n                  </td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.qty}</font></td>\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.unit_price|crmMoney:$currency}</font></td>\n                  {if $value.tax_amount != \'\'}\n                    <td style=\"text-align:right;\"><font size=\"1\">{$value.tax_rate}%</font></td>\n                  {else}\n                    <td style=\"text-align:right;\"><font size=\"1\">{ts 1=$taxTerm}-{/ts}</font></td>\n                  {/if}\n                  <td style=\"text-align:right;\"><font size=\"1\">{$value.subTotal|crmMoney:$currency}</font></td>\n                </tr>\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{ts}Sub Total{/ts}</font></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$subTotal|crmMoney:$currency}</font></td>\n              </tr>\n              {foreach from=$dataArray item=value key=priceset}\n                <tr>\n                  <td colspan=\"3\"></td>\n                    {if $priceset}\n                      <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">{ts 1=$taxTerm 2=$priceset}TOTAL %1 %2%{/ts}</font></td>\n                      <td style=\"text-align:right\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                    {elseif $priceset == 0}\n                      <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">{ts 1=$taxTerm}TOTAL %1{/ts}</font></td>\n                      <td style=\"text-align:right\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                </tr>\n              {/if}\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;white-space: nowrap\"><b><font size=\"1\">{ts 1=$defaultCurrency}TOTAL %1{/ts}</font></b></td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;white-space: nowrap\"><font size=\"1\">\n                  {if $contribution_status_id == $refundedStatusId}\n                    {ts}Amount Credited{/ts}\n                  {else}\n                    {ts}Amount Paid{/ts}\n                  {/if}\n                 </font>\n                </td>\n                <td style=\"text-align:right;\"><font size=\"1\">{$amountPaid|crmMoney:$currency}</font></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td colspan=\"2\"><hr></hr></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"text-align:right;white-space: nowrap\" ><b><font size=\"1\">{ts}AMOUNT DUE:{/ts}</font></b></td>\n                <td style=\"text-align:right;\"><b><font size=\"1\">{$amountDue|crmMoney:$currency}</font></b></td>\n              </tr>\n\n              <br/><br/><br/>\n              <tr>\n                <td colspan=\"5\"></td>\n              </tr>\n              {if $contribution_status_id == $pendingStatusId && $is_pay_later == 1}\n                <tr>\n                  <td colspan=\"3\"><b><font size=\"1\" align=\"center\">{ts 1=$dueDate}DUE DATE: %1{/ts}</font></b></td>\n                  <td colspan=\"2\"></td>\n                </tr>\n              {/if}\n            </table>\n          </td>\n        </tr>\n      </table>\n\n      {if $contribution_status_id == $pendingStatusId && $is_pay_later == 1}\n        <table style=\"margin-top:5px;\" width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">\n          <tr>\n            <td><img src=\"{$resourceBase}/i/contribute/cut_line.png\" height=\"15\"></td>\n          </tr>\n        </table>\n\n        <table style=\"margin-top:5px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"0\" id=\"desc\">\n          <tr>\n            <td width=\"60%\"><b><font size=\"4\" align=\"right\">{ts}PAYMENT ADVICE{/ts}</font></b><br/><br/><font size=\"1\" align=\"left\"><b>{ts}To:{/ts}</b><div style=\"width:24em;word-wrap:break-word;\">\n              {$domain_organization}<br />\n              {$domain_street_address} {$domain_supplemental_address_1}<br />\n              {$domain_supplemental_address_2} {$domain_state}<br />\n              {$domain_city} {$domain_postal_code}<br />\n              {$domain_country}<br />\n              {$domain_email}</div>\n              {$domain_phone}<br />\n             </font><br/><br/><font size=\"1\" align=\"left\">{$notes}</font>\n            </td>\n            <td width=\"40%\">\n              <table cellpadding=\"5\" cellspacing=\"0\"  width=\"100%\" border=\"0\">\n                <tr>\n                  <td width=\"100%\"><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Customer:{/ts}</font></td>\n                  <td style=\"white-space: nowrap\"><font size=\"1\" align=\"right\">{$display_name}</font></td>\n                </tr>\n                <tr>\n                  <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Invoice Number:{/ts}</font></td>\n                  <td><font size=\"1\" align=\"right\">{$invoice_number}</font></td>\n                </tr>\n                <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></td></tr>\n                {if $is_pay_later == 1}\n                  <tr>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Amount Due:{/ts}</font></td>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amount|crmMoney:$currency}</font></td>\n                  </tr>\n                {else}\n                  <tr>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Amount Due:{/ts}</font></td>\n                    <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amountDue|crmMoney:$currency}</font></td>\n                  </tr>\n                {/if}\n                <tr>\n                  <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Due Date:{/ts}</font></td>\n                  <td><font size=\"1\" align=\"right\">{$dueDate}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></td>\n                </tr>\n              </table>\n      {/if}\n\n      {if $contribution_status_id == $refundedStatusId || $contribution_status_id == $cancelledStatusId}\n      {if $config->empoweredBy}\n        <table style=\"margin-top:2px;padding-left:7px;page-break-before: always;\">\n          <tr>\n            <td><img src=\"{$resourceBase}/i/civi99.png\" height=\"34px\" width=\"99px\"></td>\n          </tr>\n        </table>\n      {/if}\n\n    <center>\n      <table style=\"font-family: Arial, Verdana, sans-serif\" width=\"100%\" height=\"100\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\">\n        <tr>\n          <td style=\"padding-left:15px;\"><b><font size=\"4\" align=\"center\">{ts}CREDIT NOTE{/ts}</font></b></td>\n          <td style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Date:{/ts}</font></b></td>\n          <td><font size=\"1\" align=\"right\">{$domain_organization}</font></td>\n        </tr>\n        <tr>\n          {if $organization_name}\n            <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$display_name}  ({$organization_name})</font></td>\n          {else}\n            <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$display_name}</font></td>\n          {/if}\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$invoice_date}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_street_address }{$domain_street_address}{/if}\n              {if $domain_supplemental_address_1 }{$domain_supplemental_address_1}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$street_address}   {$supplemental_address_1}</font></td>\n          <td style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Credit Note Number:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_supplemental_address_2 }{$domain_supplemental_address_2}{/if}\n              {if $domain_state }{$domain_state}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"center\">{$supplemental_address_2}  {$stateProvinceAbbreviation}</font></td>\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$creditnote_id}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_city}{$domain_city}{/if}\n              {if $domain_postal_code }{$domain_postal_code}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td style=\"padding-left:17px;\"><font size=\"1\" align=\"right\">{$city}  {$postal_code}</font></td>\n          <td height=\"10\" style=\"padding-left:30px;\"><b><font size=\"1\" align=\"right\">{ts}Reference:{/ts}</font></b></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_country}{$domain_country}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td style=\"padding-left:30px;\"><font size=\"1\" align=\"right\">{$source}</font></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_email}{$domain_email}{/if}\n           </font>\n          </td>\n        </tr>\n        <tr>\n          <td></td>\n          <td></td>\n          <td>\n            <font size=\"1\" align=\"right\">\n              {if $domain_phone}{$domain_phone}{/if}\n           </font>\n          </td>\n        </tr>\n      </table>\n\n      <table style=\"margin-top:75px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\" id=\"desc\">\n        <tr>\n          <td colspan=\"2\" {$valueStyle}>\n            <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n              <tr>\n                <th style=\"padding-right:28px;text-align:left;font-weight:bold;width:200px;\"><font size=\"1\">{ts}Description{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts}Quantity{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts}Unit Price{/ts}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{$taxTerm}</font></th>\n                <th style=\"padding-left:28px;text-align:right;font-weight:bold;\"><font size=\"1\">{ts 1=$defaultCurrency}Amount %1{/ts}</font></th>\n              </tr>\n              {foreach from=$lineItem item=value key=priceset name=pricevalue}\n                {if $smarty.foreach.pricevalue.index eq 0}\n                  <tr><td colspan=\"5\"><hr size=\"3\" style=\"color:#000;\"></hr></td></tr>\n                {else}\n                  <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n                {/if}\n                <tr>\n                  <td style =\"text-align:left;\"  >\n                    <font size=\"1\">\n                      {if $value.html_type eq \'Text\'}\n                        {$value.label}\n                      {else}\n                        {$value.field_title} - {$value.label}\n                      {/if}\n                      {if $value.description}\n                        <div>{$value.description|truncate:30:\"...\"}</div>\n                      {/if}\n                   </font>\n                  </td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.qty}</font></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.unit_price|crmMoney:$currency}</font></td>\n                  {if $value.tax_amount != \'\'}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.tax_rate}%</font></td>\n                  {else}\n                    <td style=\"padding-left:28px;text-align:right\"><font size=\"1\">{ts 1=$taxTerm}No %1{/ts}</font></td>\n                  {/if}\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$value.subTotal|crmMoney:$currency}</font></td>\n                </tr>\n              {/foreach}\n              <tr><td colspan=\"5\" style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts}Sub Total{/ts}</font></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$subTotal|crmMoney:$currency}</font></td>\n              </tr>\n              {foreach from=$dataArray item=value key=priceset}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  {if $priceset}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts 1=$taxTerm 2=$priceset}TOTAL %1 %2%{/ts}</font></td>\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                  {elseif $priceset == 0}\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts 1=$taxTerm}TOTAL NO %1{/ts}</font></td>\n                    <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\" align=\"right\">{$value|crmMoney:$currency}</font> </td>\n                </tr>\n                {/if}\n              {/foreach}\n              <tr>\n                <td colspan=\"3\"></td>\n                <td colspan=\"2\"><hr></hr></td>\n              </tr>\n              <tr>\n                <td colspan=\"3\"></td>\n                <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{ts 1=$defaultCurrency}TOTAL %1{/ts}</font></b></td>\n                <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n              {if $is_pay_later == 0}\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{ts}LESS Credit to invoice(s){/ts}</font></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><font size=\"1\">{$amount|crmMoney:$currency}</font></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td colspan=\"2\"><hr></hr></td>\n                </tr>\n                <tr>\n                  <td colspan=\"3\"></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{ts}REMAINING CREDIT{/ts}</font></b></td>\n                  <td style=\"padding-left:28px;text-align:right;\"><b><font size=\"1\">{$amountDue|crmMoney:$currency}</font></b></td>\n                  <td style=\"padding-left:28px;\"><font size=\"1\" align=\"right\"></font></td>\n                </tr>\n              {/if}\n              <br/><br/><br/>\n              <tr>\n                <td colspan=\"3\"></td>\n              </tr>\n              <tr>\n                <td></td>\n                <td colspan=\"3\"></td>\n              </tr>\n            </table>\n          </td>\n        </tr>\n      </table>\n\n      <table width=\"100%\" style=\"margin-top:5px;padding-right:45px;\">\n        <tr>\n          <td><img src=\"{$resourceBase}/i/contribute/cut_line.png\" height=\"15\" width=\"100%\"></td>\n        </tr>\n      </table>\n\n      <table style=\"margin-top:6px;font-family: Arial, Verdana, sans-serif\" width=\"100%\" border=\"0\" cellpadding=\"5\" cellspacing=\"5\" id=\"desc\">\n        <tr>\n          <td width=\"60%\"><font size=\"4\" align=\"right\"><b>{ts}CREDIT ADVICE{/ts}</b><br/><br /><div style=\"font-size:10px;max-width:300px;\">{ts}Please do not pay on this advice. Deduct the amount of this Credit Note from your next payment to us{/ts}</div><br/></font></td>\n          <td width=\"40%\">\n            <table align=\"right\">\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Customer:{/ts}</font></td>\n                <td><font size=\"1\" align=\"right\">{$display_name}</font></td>\n              </tr>\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Credit Note#:{/ts}</font></td>\n                <td><font size=\"1\" align=\"right\">{$creditnote_id}</font></td>\n              </tr>\n              <tr><td colspan=\"5\"style=\"color:#F5F5F5;\"><hr></hr></td></tr>\n              <tr>\n                <td colspan=\"2\"></td>\n                <td><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{ts}Credit Amount:{/ts}</font></td>\n                <td width=\'50px\'><font size=\"1\" align=\"right\" style=\"font-weight:bold;\">{$amount|crmMoney:$currency}</font></td>\n              </tr>\n            </table>\n          </td>\n        </tr>\n      </table>\n    {/if}\n    </center>\n\n  </div>\n  </body>\n</html>\n',1,824,'contribution_invoice_receipt',0,1,0,NULL),(11,'Contributions - Recurring Start and End Notification','{ts}Recurring Contribution Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $recur_txnType eq \'START\'}\n{if $auto_renew_membership}\n{ts}Thanks for your auto renew membership sign-up.{/ts}\n\n\n{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This membership will be automatically renewed every %1 %2(s).{/ts}\n\n{if $cancelSubscriptionUrl}\n{ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n{else}\n{ts}Thanks for your recurring contribution sign-up.{/ts}\n\n\n{ts 1=$recur_frequency_interval 2=$recur_frequency_unit 3=$recur_installments}This recurring contribution will be automatically processed every %1 %2(s){/ts}{if $recur_installments } {ts 1=$recur_installments} for a total of %1 installment(s){/ts}{/if}.\n\n{ts}Start Date{/ts}:  {$recur_start_date|crmDate}\n\n{if $cancelSubscriptionUrl}\n{ts 1=$cancelSubscriptionUrl}You can cancel the recurring contribution option by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionUrl}\n{ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n{/if}\n\n{elseif $recur_txnType eq \'END\'}\n{if $auto_renew_membership}\n{ts}Your auto renew membership sign-up has ended and your membership will not be automatically renewed.{/ts}\n\n\n{else}\n{ts}Your recurring contribution term has ended.{/ts}\n\n\n{ts 1=$recur_installments}You have successfully completed %1 recurring contributions. Thank you.{/ts}\n\n\n==================================================\n{ts 1=$recur_installments}Interval of Subscription for %1 installment(s){/ts}\n\n==================================================\n{ts}Start Date{/ts}: {$recur_start_date|crmDate}\n\n{ts}End Date{/ts}: {$recur_end_date|crmDate}\n\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n   </td>\n  </tr>\n\n  <tr>\n   <td>&nbsp;</td>\n  </tr>\n\n    {if $recur_txnType eq \'START\'}\n     {if $auto_renew_membership}\n       <tr>\n        <td>\n         <p>{ts}Thanks for your auto renew membership sign-up.{/ts}</p>\n         <p>{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This membership will be automatically renewed every %1 %2(s). {/ts}</p>\n        </td>\n       </tr>\n       {if $cancelSubscriptionUrl}\n       <tr>\n         <td {$labelStyle}>\n           {ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n         </td>\n       </tr>\n       {/if}\n       {if $updateSubscriptionBillingUrl}\n         <tr>\n          <td {$labelStyle}>\n           {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n         </tr>\n       {/if}\n     {else}\n      <tr>\n       <td>\n        <p>{ts}Thanks for your recurring contribution sign-up.{/ts}</p>\n        <p>{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This recurring contribution will be automatically processed every %1 %2(s){/ts}{if $recur_installments }{ts 1=$recur_installments} for a total of %1 installment(s){/ts}{/if}.</p>\n        <p>{ts}Start Date{/ts}: {$recur_start_date|crmDate}</p>\n       </td>\n      </tr>\n      {if $cancelSubscriptionUrl}\n      <tr>\n        <td {$labelStyle}>\n          {ts 1=$cancelSubscriptionUrl} You can cancel the recurring contribution option by <a href=\"%1\">visiting this web page</a>.{/ts}\n        </td>\n      </tr>\n      {/if}\n      {if $updateSubscriptionBillingUrl}\n        <tr>\n          <td {$labelStyle}>\n            {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n      {if $updateSubscriptionUrl}\n      <tr>\n        <td {$labelStyle}>\n          {ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n        </td>\n      </tr>\n      {/if}\n     {/if}\n\n    {elseif $recur_txnType eq \'END\'}\n\n     {if $auto_renew_membership}\n      <tr>\n       <td>\n        <p>{ts}Your auto renew membership sign-up has ended and your membership will not be automatically renewed.{/ts}</p>\n       </td>\n      </tr>\n     {else}\n      <tr>\n       <td>\n        <p>{ts}Your recurring contribution term has ended.{/ts}</p>\n        <p>{ts 1=$recur_installments}You have successfully completed %1 recurring contributions. Thank you.{/ts}</p>\n       </td>\n      </tr>\n      <tr>\n       <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts 1=$recur_installments}Interval of Subscription for %1 installment(s){/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Start Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$recur_start_date|crmDate}\n       </td>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}End Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$recur_end_date|crmDate}\n       </td>\n      </tr>\n     </table>\n       </td>\n      </tr>\n\n     {/if}\n    {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,825,'contribution_recurring_notify',1,0,0,NULL),(12,'Contributions - Recurring Start and End Notification','{ts}Recurring Contribution Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $recur_txnType eq \'START\'}\n{if $auto_renew_membership}\n{ts}Thanks for your auto renew membership sign-up.{/ts}\n\n\n{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This membership will be automatically renewed every %1 %2(s).{/ts}\n\n{if $cancelSubscriptionUrl}\n{ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n{else}\n{ts}Thanks for your recurring contribution sign-up.{/ts}\n\n\n{ts 1=$recur_frequency_interval 2=$recur_frequency_unit 3=$recur_installments}This recurring contribution will be automatically processed every %1 %2(s){/ts}{if $recur_installments } {ts 1=$recur_installments} for a total of %1 installment(s){/ts}{/if}.\n\n{ts}Start Date{/ts}:  {$recur_start_date|crmDate}\n\n{if $cancelSubscriptionUrl}\n{ts 1=$cancelSubscriptionUrl}You can cancel the recurring contribution option by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n\n{if $updateSubscriptionUrl}\n{ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n\n{/if}\n{/if}\n\n{elseif $recur_txnType eq \'END\'}\n{if $auto_renew_membership}\n{ts}Your auto renew membership sign-up has ended and your membership will not be automatically renewed.{/ts}\n\n\n{else}\n{ts}Your recurring contribution term has ended.{/ts}\n\n\n{ts 1=$recur_installments}You have successfully completed %1 recurring contributions. Thank you.{/ts}\n\n\n==================================================\n{ts 1=$recur_installments}Interval of Subscription for %1 installment(s){/ts}\n\n==================================================\n{ts}Start Date{/ts}: {$recur_start_date|crmDate}\n\n{ts}End Date{/ts}: {$recur_end_date|crmDate}\n\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n   </td>\n  </tr>\n\n  <tr>\n   <td>&nbsp;</td>\n  </tr>\n\n    {if $recur_txnType eq \'START\'}\n     {if $auto_renew_membership}\n       <tr>\n        <td>\n         <p>{ts}Thanks for your auto renew membership sign-up.{/ts}</p>\n         <p>{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This membership will be automatically renewed every %1 %2(s). {/ts}</p>\n        </td>\n       </tr>\n       {if $cancelSubscriptionUrl}\n       <tr>\n         <td {$labelStyle}>\n           {ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n         </td>\n       </tr>\n       {/if}\n       {if $updateSubscriptionBillingUrl}\n         <tr>\n          <td {$labelStyle}>\n           {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n         </tr>\n       {/if}\n     {else}\n      <tr>\n       <td>\n        <p>{ts}Thanks for your recurring contribution sign-up.{/ts}</p>\n        <p>{ts 1=$recur_frequency_interval 2=$recur_frequency_unit}This recurring contribution will be automatically processed every %1 %2(s){/ts}{if $recur_installments }{ts 1=$recur_installments} for a total of %1 installment(s){/ts}{/if}.</p>\n        <p>{ts}Start Date{/ts}: {$recur_start_date|crmDate}</p>\n       </td>\n      </tr>\n      {if $cancelSubscriptionUrl}\n      <tr>\n        <td {$labelStyle}>\n          {ts 1=$cancelSubscriptionUrl} You can cancel the recurring contribution option by <a href=\"%1\">visiting this web page</a>.{/ts}\n        </td>\n      </tr>\n      {/if}\n      {if $updateSubscriptionBillingUrl}\n        <tr>\n          <td {$labelStyle}>\n            {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n        </tr>\n      {/if}\n      {if $updateSubscriptionUrl}\n      <tr>\n        <td {$labelStyle}>\n          {ts 1=$updateSubscriptionUrl}You can update recurring contribution amount or change the number of installments details for this recurring contribution by <a href=\"%1\">visiting this web page</a>.{/ts}\n        </td>\n      </tr>\n      {/if}\n     {/if}\n\n    {elseif $recur_txnType eq \'END\'}\n\n     {if $auto_renew_membership}\n      <tr>\n       <td>\n        <p>{ts}Your auto renew membership sign-up has ended and your membership will not be automatically renewed.{/ts}</p>\n       </td>\n      </tr>\n     {else}\n      <tr>\n       <td>\n        <p>{ts}Your recurring contribution term has ended.{/ts}</p>\n        <p>{ts 1=$recur_installments}You have successfully completed %1 recurring contributions. Thank you.{/ts}</p>\n       </td>\n      </tr>\n      <tr>\n       <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts 1=$recur_installments}Interval of Subscription for %1 installment(s){/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Start Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$recur_start_date|crmDate}\n       </td>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}End Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$recur_end_date|crmDate}\n       </td>\n      </tr>\n     </table>\n       </td>\n      </tr>\n\n     {/if}\n    {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,825,'contribution_recurring_notify',0,1,0,NULL),(13,'Contributions - Recurring Cancellation Notification','{ts}Recurring Contribution Cancellation Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Your recurring contribution of %1, every %2 %3 has been cancelled as requested.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Your recurring contribution of %1, every %2 %3 has been cancelled as requested.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,826,'contribution_recurring_cancelled',1,0,0,NULL),(14,'Contributions - Recurring Cancellation Notification','{ts}Recurring Contribution Cancellation Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Your recurring contribution of %1, every %2 %3 has been cancelled as requested.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Your recurring contribution of %1, every %2 %3 has been cancelled as requested.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,826,'contribution_recurring_cancelled',0,1,0,NULL),(15,'Contributions - Recurring Billing Updates','{ts}Recurring Contribution Billing Updates{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Billing details for your recurring contribution of %1, every %2 %3 have been updated.{/ts}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Billing details for your recurring contribution of %1, every %2 %3 have been updated.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n    <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n        <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n            {ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n        </td>\n       </tr>\n  </table>\n</center>\n\n</body>\n</html>\n',1,827,'contribution_recurring_billing',1,0,0,NULL),(16,'Contributions - Recurring Billing Updates','{ts}Recurring Contribution Billing Updates{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Billing details for your recurring contribution of %1, every %2 %3 have been updated.{/ts}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Billing details for your recurring contribution of %1, every %2 %3 have been updated.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n    <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n        <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n            {ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n        </td>\n       </tr>\n  </table>\n</center>\n\n</body>\n</html>\n',1,827,'contribution_recurring_billing',0,1,0,NULL),(17,'Contributions - Recurring Updates','{ts}Recurring Contribution Update Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}Your recurring contribution has been updated as requested:{/ts}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Recurring contribution is for %1, every %2 %3(s){/ts}\n{if $installments}{ts 1=$installments} for %1 installments.{/ts}{/if}\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Your recurring contribution has been updated as requested:{/ts}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Recurring contribution is for %1, every %2 %3(s){/ts}{if $installments}{ts 1=$installments} for %1 installments{/ts}{/if}.</p>\n\n    <p>{ts 1=$receipt_from_email}If you have questions please contact us at %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,828,'contribution_recurring_edit',1,0,0,NULL),(18,'Contributions - Recurring Updates','{ts}Recurring Contribution Update Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}Your recurring contribution has been updated as requested:{/ts}\n\n{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Recurring contribution is for %1, every %2 %3(s){/ts}\n{if $installments}{ts 1=$installments} for %1 installments.{/ts}{/if}\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Your recurring contribution has been updated as requested:{/ts}\n    <p>{ts 1=$amount 2=$recur_frequency_interval 3=$recur_frequency_unit}Recurring contribution is for %1, every %2 %3(s){/ts}{if $installments}{ts 1=$installments} for %1 installments{/ts}{/if}.</p>\n\n    <p>{ts 1=$receipt_from_email}If you have questions please contact us at %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,828,'contribution_recurring_edit',0,1,0,NULL),(19,'Personal Campaign Pages - Admin Notification','{ts}Personal Campaign Page Notification{/ts} - {contact.display_name}\n','===========================================================\n{ts}Personal Campaign Page Notification{/ts}\n\n===========================================================\n{ts}Action{/ts}: {if $mode EQ \'Update\'}{ts}Updated personal campaign page{/ts}{else}{ts}New personal campaign page{/ts}{/if}\n{ts}Personal Campaign Page Title{/ts}: {$pcpTitle}\n{ts}Current Status{/ts}: {$pcpStatus}\n{capture assign=pcpURL}{crmURL p=\"civicrm/pcp/info\" q=\"reset=1&id=`$pcpId`\" h=0 a=1}{/capture}\n{ts}View Page{/ts}:\n>> {$pcpURL}\n\n{ts}Supporter{/ts}: {$supporterName}\n>> {$supporterUrl}\n\n{ts}Linked to Contribution Page{/ts}: {$contribPageTitle}\n>> {$contribPageUrl}\n\n{ts}Manage Personal Campaign Pages{/ts}:\n>> {$managePCPUrl}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=pcpURL     }{crmURL p=\"civicrm/pcp/info\" q=\"reset=1&id=`$pcpId`\" h=0 a=1}{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Personal Campaign Page Notification{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Action{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {if $mode EQ \'Update\'}\n        {ts}Updated personal campaign page{/ts}\n       {else}\n        {ts}New personal campaign page{/ts}\n       {/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Personal Campaign Page Title{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$pcpTitle}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Current Status{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$pcpStatus}\n      </td>\n     </tr>\n\n     <tr>\n      <td {$labelStyle}>\n       <a href=\"{$pcpURL}\">{ts}View Page{/ts}</a>\n      </td>\n      <td></td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Supporter{/ts}\n      </td>\n      <td {$valueStyle}>\n       <a href=\"{$supporterUrl}\">{$supporterName}</a>\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Linked to Contribution Page{/ts}\n      </td>\n      <td {$valueStyle}>\n       <a href=\"{$contribPageUrl}\">{$contribPageTitle}</a>\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       <a href=\"{$managePCPUrl}\">{ts}Manage Personal Campaign Pages{/ts}</a>\n      </td>\n      <td></td>\n     </tr>\n\n    </table>\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,829,'pcp_notify',1,0,0,NULL),(20,'Personal Campaign Pages - Admin Notification','{ts}Personal Campaign Page Notification{/ts} - {contact.display_name}\n','===========================================================\n{ts}Personal Campaign Page Notification{/ts}\n\n===========================================================\n{ts}Action{/ts}: {if $mode EQ \'Update\'}{ts}Updated personal campaign page{/ts}{else}{ts}New personal campaign page{/ts}{/if}\n{ts}Personal Campaign Page Title{/ts}: {$pcpTitle}\n{ts}Current Status{/ts}: {$pcpStatus}\n{capture assign=pcpURL}{crmURL p=\"civicrm/pcp/info\" q=\"reset=1&id=`$pcpId`\" h=0 a=1}{/capture}\n{ts}View Page{/ts}:\n>> {$pcpURL}\n\n{ts}Supporter{/ts}: {$supporterName}\n>> {$supporterUrl}\n\n{ts}Linked to Contribution Page{/ts}: {$contribPageTitle}\n>> {$contribPageUrl}\n\n{ts}Manage Personal Campaign Pages{/ts}:\n>> {$managePCPUrl}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=pcpURL     }{crmURL p=\"civicrm/pcp/info\" q=\"reset=1&id=`$pcpId`\" h=0 a=1}{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Personal Campaign Page Notification{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Action{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {if $mode EQ \'Update\'}\n        {ts}Updated personal campaign page{/ts}\n       {else}\n        {ts}New personal campaign page{/ts}\n       {/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Personal Campaign Page Title{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$pcpTitle}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Current Status{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$pcpStatus}\n      </td>\n     </tr>\n\n     <tr>\n      <td {$labelStyle}>\n       <a href=\"{$pcpURL}\">{ts}View Page{/ts}</a>\n      </td>\n      <td></td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Supporter{/ts}\n      </td>\n      <td {$valueStyle}>\n       <a href=\"{$supporterUrl}\">{$supporterName}</a>\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Linked to Contribution Page{/ts}\n      </td>\n      <td {$valueStyle}>\n       <a href=\"{$contribPageUrl}\">{$contribPageTitle}</a>\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       <a href=\"{$managePCPUrl}\">{ts}Manage Personal Campaign Pages{/ts}</a>\n      </td>\n      <td></td>\n     </tr>\n\n    </table>\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,829,'pcp_notify',0,1,0,NULL),(21,'Personal Campaign Pages - Supporter Status Change Notification','{ts 1=$contribPageTitle}Your Personal Campaign Page for %1{/ts} - {contact.display_name}\n','{if $pcpStatus eq \'Approved\'}\n============================\n{ts}Your Personal Campaign Page{/ts}\n\n============================\n\n{ts}Your personal campaign page has been approved and is now live.{/ts}\n\n{ts}Whenever you want to preview, update or promote your page{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser to go to your page{/ts}:\n{$pcpInfoURL}\n\n{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}\n\n{if $isTellFriendEnabled}\n\n{ts}After logging in, you can use this form to promote your fundraising page{/ts}:\n{$pcpTellFriendURL}\n\n{/if}\n\n{if $pcpNotifyEmailAddress}\n{ts}Questions? Send email to{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n\n{* Rejected message *}\n{elseif $pcpStatus eq \'Not Approved\'}\n============================\n{ts}Your Personal Campaign Page{/ts}\n\n============================\n\n{ts}Your personal campaign page has been reviewed. There were some issues with the content which prevented us from approving the page. We are sorry for any inconvenience.{/ts}\n\n{if $pcpNotifyEmailAddress}\n\n{ts}Please contact our site administrator for more information{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n\n    <h1>{ts}Your Personal Campaign Page{/ts}</h1>\n\n    {if $pcpStatus eq \'Approved\'}\n\n     <p>{ts}Your personal campaign page has been approved and is now live.{/ts}</p>\n     <p>{ts}Whenever you want to preview, update or promote your page{/ts}:</p>\n     <ol>\n      <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n      <li><a href=\"{$pcpInfoURL}\">{ts}Go to your page{/ts}</a></li>\n     </ol>\n     <p>{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}</p>\n\n     {if $isTellFriendEnabled}\n      <p><a href=\"{$pcpTellFriendURL}\">{ts}After logging in, you can use this form to promote your fundraising page{/ts}</a></p>\n     {/if}\n\n     {if $pcpNotifyEmailAddress}\n      <p>{ts}Questions? Send email to{/ts}: {$pcpNotifyEmailAddress}</p>\n     {/if}\n\n    {elseif $pcpStatus eq \'Not Approved\'}\n\n     <p>{ts}Your personal campaign page has been reviewed. There were some issues with the content which prevented us from approving the page. We are sorry for any inconvenience.{/ts}</p>\n     {if $pcpNotifyEmailAddress}\n      <p>{ts}Please contact our site administrator for more information{/ts}: {$pcpNotifyEmailAddress}</p>\n     {/if}\n\n    {/if}\n\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,830,'pcp_status_change',1,0,0,NULL),(22,'Personal Campaign Pages - Supporter Status Change Notification','{ts 1=$contribPageTitle}Your Personal Campaign Page for %1{/ts} - {contact.display_name}\n','{if $pcpStatus eq \'Approved\'}\n============================\n{ts}Your Personal Campaign Page{/ts}\n\n============================\n\n{ts}Your personal campaign page has been approved and is now live.{/ts}\n\n{ts}Whenever you want to preview, update or promote your page{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser to go to your page{/ts}:\n{$pcpInfoURL}\n\n{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}\n\n{if $isTellFriendEnabled}\n\n{ts}After logging in, you can use this form to promote your fundraising page{/ts}:\n{$pcpTellFriendURL}\n\n{/if}\n\n{if $pcpNotifyEmailAddress}\n{ts}Questions? Send email to{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n\n{* Rejected message *}\n{elseif $pcpStatus eq \'Not Approved\'}\n============================\n{ts}Your Personal Campaign Page{/ts}\n\n============================\n\n{ts}Your personal campaign page has been reviewed. There were some issues with the content which prevented us from approving the page. We are sorry for any inconvenience.{/ts}\n\n{if $pcpNotifyEmailAddress}\n\n{ts}Please contact our site administrator for more information{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n\n    <h1>{ts}Your Personal Campaign Page{/ts}</h1>\n\n    {if $pcpStatus eq \'Approved\'}\n\n     <p>{ts}Your personal campaign page has been approved and is now live.{/ts}</p>\n     <p>{ts}Whenever you want to preview, update or promote your page{/ts}:</p>\n     <ol>\n      <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n      <li><a href=\"{$pcpInfoURL}\">{ts}Go to your page{/ts}</a></li>\n     </ol>\n     <p>{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}</p>\n\n     {if $isTellFriendEnabled}\n      <p><a href=\"{$pcpTellFriendURL}\">{ts}After logging in, you can use this form to promote your fundraising page{/ts}</a></p>\n     {/if}\n\n     {if $pcpNotifyEmailAddress}\n      <p>{ts}Questions? Send email to{/ts}: {$pcpNotifyEmailAddress}</p>\n     {/if}\n\n    {elseif $pcpStatus eq \'Not Approved\'}\n\n     <p>{ts}Your personal campaign page has been reviewed. There were some issues with the content which prevented us from approving the page. We are sorry for any inconvenience.{/ts}</p>\n     {if $pcpNotifyEmailAddress}\n      <p>{ts}Please contact our site administrator for more information{/ts}: {$pcpNotifyEmailAddress}</p>\n     {/if}\n\n    {/if}\n\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,830,'pcp_status_change',0,1,0,NULL),(23,'Personal Campaign Pages - Supporter Welcome','{ts 1=$contribPageTitle}Your Personal Campaign Page for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=\"$contribPageTitle\"}Thanks for creating a personal campaign page in support of %1.{/ts}\n\n{if $pcpStatus eq \'Approved\'}\n====================\n{ts}Promoting Your Page{/ts}\n\n====================\n{if $isTellFriendEnabled}\n\n{ts}You can begin your fundraising efforts using our \"Tell a Friend\" form{/ts}:\n\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser and follow the prompts{/ts}:\n{$pcpTellFriendURL}\n{else}\n\n{ts}Send email to family, friends and colleagues with a personal message about this campaign.{/ts}\n{ts}Include this link to your fundraising page in your emails{/ts}:\n{$pcpInfoURL}\n{/if}\n\n===================\n{ts}Managing Your Page{/ts}\n\n===================\n{ts}Whenever you want to preview, update or promote your page{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser to go to your page{/ts}:\n{$pcpInfoURL}\n\n{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}\n\n\n{elseif $pcpStatus EQ \'Waiting Review\'}\n{ts}Your page requires administrator review before you can begin your fundraising efforts.{/ts}\n\n\n{ts}A notification email has been sent to the site administrator, and you will receive another notification from them as soon as the review process is complete.{/ts}\n\n\n{ts}You can still preview your page prior to approval{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser{/ts}:\n{$pcpInfoURL}\n\n{/if}\n{if $pcpNotifyEmailAddress}\n{ts}Questions? Send email to{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=\"$contribPageTitle\"}Thanks for creating a personal campaign page in support of %1.{/ts}</p>\n   </td>\n  </tr>\n\n  {if $pcpStatus eq \'Approved\'}\n\n    <tr>\n     <td>\n      <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n       <tr>\n        <th {$headerStyle}>\n         {ts}Promoting Your Page{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {if $isTellFriendEnabled}\n          <p>{ts}You can begin your fundraising efforts using our \"Tell a Friend\" form{/ts}:</p>\n          <ol>\n           <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n           <li><a href=\"{$pcpTellFriendURL}\">{ts}Click this link and follow the prompts{/ts}</a></li>\n          </ol>\n         {else}\n          <p>{ts}Send email to family, friends and colleagues with a personal message about this campaign.{/ts} {ts}Include this link to your fundraising page in your emails{/ts}: {$pcpInfoURL}</p>\n         {/if}\n        </td>\n       </tr>\n       <tr>\n        <th {$headerStyle}>\n         {ts}Managing Your Page{/ts}\n        </th>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}Whenever you want to preview, update or promote your page{/ts}:</p>\n         <ol>\n          <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n          <li><a href=\"{$pcpInfoURL}\">{ts}Go to your page{/ts}</a></li>\n         </ol>\n         <p>{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}</p>\n        </td>\n       </tr>\n       </tr>\n      </table>\n     </td>\n    </tr>\n\n   {elseif $pcpStatus EQ \'Waiting Review\'}\n\n    <tr>\n     <td>\n      <p>{ts}Your page requires administrator review before you can begin your fundraising efforts.{/ts}</p>\n      <p>{ts}A notification email has been sent to the site administrator, and you will receive another notification from them as soon as the review process is complete.{/ts}</p>\n      <p>{ts}You can still preview your page prior to approval{/ts}:</p>\n      <ol>\n       <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n       <li><a href=\"{$pcpInfoURL}\">{ts}Click this link{/ts}</a></li>\n      </ol>\n     </td>\n    </tr>\n\n   {/if}\n\n   {if $pcpNotifyEmailAddress}\n    <tr>\n     <td>\n      <p>{ts}Questions? Send email to{/ts}: {$pcpNotifyEmailAddress}</p>\n     </td>\n    </tr>\n   {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,831,'pcp_supporter_notify',1,0,0,NULL),(24,'Personal Campaign Pages - Supporter Welcome','{ts 1=$contribPageTitle}Your Personal Campaign Page for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=\"$contribPageTitle\"}Thanks for creating a personal campaign page in support of %1.{/ts}\n\n{if $pcpStatus eq \'Approved\'}\n====================\n{ts}Promoting Your Page{/ts}\n\n====================\n{if $isTellFriendEnabled}\n\n{ts}You can begin your fundraising efforts using our \"Tell a Friend\" form{/ts}:\n\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser and follow the prompts{/ts}:\n{$pcpTellFriendURL}\n{else}\n\n{ts}Send email to family, friends and colleagues with a personal message about this campaign.{/ts}\n{ts}Include this link to your fundraising page in your emails{/ts}:\n{$pcpInfoURL}\n{/if}\n\n===================\n{ts}Managing Your Page{/ts}\n\n===================\n{ts}Whenever you want to preview, update or promote your page{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser to go to your page{/ts}:\n{$pcpInfoURL}\n\n{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}\n\n\n{elseif $pcpStatus EQ \'Waiting Review\'}\n{ts}Your page requires administrator review before you can begin your fundraising efforts.{/ts}\n\n\n{ts}A notification email has been sent to the site administrator, and you will receive another notification from them as soon as the review process is complete.{/ts}\n\n\n{ts}You can still preview your page prior to approval{/ts}:\n1. {ts}Login to your account at{/ts}:\n{$loginUrl}\n\n2. {ts}Click or paste this link into your browser{/ts}:\n{$pcpInfoURL}\n\n{/if}\n{if $pcpNotifyEmailAddress}\n{ts}Questions? Send email to{/ts}:\n{$pcpNotifyEmailAddress}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=\"$contribPageTitle\"}Thanks for creating a personal campaign page in support of %1.{/ts}</p>\n   </td>\n  </tr>\n\n  {if $pcpStatus eq \'Approved\'}\n\n    <tr>\n     <td>\n      <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n       <tr>\n        <th {$headerStyle}>\n         {ts}Promoting Your Page{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {if $isTellFriendEnabled}\n          <p>{ts}You can begin your fundraising efforts using our \"Tell a Friend\" form{/ts}:</p>\n          <ol>\n           <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n           <li><a href=\"{$pcpTellFriendURL}\">{ts}Click this link and follow the prompts{/ts}</a></li>\n          </ol>\n         {else}\n          <p>{ts}Send email to family, friends and colleagues with a personal message about this campaign.{/ts} {ts}Include this link to your fundraising page in your emails{/ts}: {$pcpInfoURL}</p>\n         {/if}\n        </td>\n       </tr>\n       <tr>\n        <th {$headerStyle}>\n         {ts}Managing Your Page{/ts}\n        </th>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}Whenever you want to preview, update or promote your page{/ts}:</p>\n         <ol>\n          <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n          <li><a href=\"{$pcpInfoURL}\">{ts}Go to your page{/ts}</a></li>\n         </ol>\n         <p>{ts}When you view your campaign page WHILE LOGGED IN, the page includes links to edit your page, tell friends, and update your contact info.{/ts}</p>\n        </td>\n       </tr>\n       </tr>\n      </table>\n     </td>\n    </tr>\n\n   {elseif $pcpStatus EQ \'Waiting Review\'}\n\n    <tr>\n     <td>\n      <p>{ts}Your page requires administrator review before you can begin your fundraising efforts.{/ts}</p>\n      <p>{ts}A notification email has been sent to the site administrator, and you will receive another notification from them as soon as the review process is complete.{/ts}</p>\n      <p>{ts}You can still preview your page prior to approval{/ts}:</p>\n      <ol>\n       <li><a href=\"{$loginUrl}\">{ts}Login to your account{/ts}</a></li>\n       <li><a href=\"{$pcpInfoURL}\">{ts}Click this link{/ts}</a></li>\n      </ol>\n     </td>\n    </tr>\n\n   {/if}\n\n   {if $pcpNotifyEmailAddress}\n    <tr>\n     <td>\n      <p>{ts}Questions? Send email to{/ts}: {$pcpNotifyEmailAddress}</p>\n     </td>\n    </tr>\n   {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,831,'pcp_supporter_notify',0,1,0,NULL),(25,'Personal Campaign Pages - Owner Notification','{ts}Someone has just donated to your personal campaign page{/ts} - {contact.display_name}\n','===========================================================\n{ts}Personal Campaign Page Owner Notification{/ts}\n\n===========================================================\n{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}You have received a donation at your personal page{/ts}: {$page_title}\n>> {$pcpInfoURL}\n\n{ts}Your fundraising total has been updated.{/ts}\n{ts}The donor\'s information is listed below.  You can choose to contact them and convey your thanks if you wish.{/ts}\n{if $is_honor_roll_enabled}\n    {ts}The donor\'s name has been added to your honor roll unless they asked not to be included.{/ts}\n{/if}\n\n{ts}Received{/ts}: {$receive_date|crmDate}\n\n{ts}Amount{/ts}: {$total_amount|crmMoney:$currency}\n\n{ts}Name{/ts}: {$donors_display_name}\n\n{ts}Email{/ts}: {$donors_email}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n  {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n  <p>{ts}You have received a donation at your personal page{/ts}: <a href=\"{$pcpInfoURL}\">{$page_title}</a></p>\n  <p>{ts}Your fundraising total has been updated.{/ts}<br/>\n    {ts}The donor\'s information is listed below.  You can choose to contact them and convey your thanks if you wish.{/ts} <br/>\n    {if $is_honor_roll_enabled}\n      {ts}The donor\'s name has been added to your honor roll unless they asked not to be included.{/ts}<br/>\n    {/if}\n  </p>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n    <tr><td>{ts}Received{/ts}:</td><td> {$receive_date|crmDate}</td></tr>\n    <tr><td>{ts}Amount{/ts}:</td><td> {$total_amount|crmMoney:$currency}</td></tr>\n    <tr><td>{ts}Name{/ts}:</td><td> {$donors_display_name}</td></tr>\n    <tr><td>{ts}Email{/ts}:</td><td> {$donors_email}</td></tr>\n  </table>\n</body>\n</html>\n',1,832,'pcp_owner_notify',1,0,0,NULL),(26,'Personal Campaign Pages - Owner Notification','{ts}Someone has just donated to your personal campaign page{/ts} - {contact.display_name}\n','===========================================================\n{ts}Personal Campaign Page Owner Notification{/ts}\n\n===========================================================\n{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}You have received a donation at your personal page{/ts}: {$page_title}\n>> {$pcpInfoURL}\n\n{ts}Your fundraising total has been updated.{/ts}\n{ts}The donor\'s information is listed below.  You can choose to contact them and convey your thanks if you wish.{/ts}\n{if $is_honor_roll_enabled}\n    {ts}The donor\'s name has been added to your honor roll unless they asked not to be included.{/ts}\n{/if}\n\n{ts}Received{/ts}: {$receive_date|crmDate}\n\n{ts}Amount{/ts}: {$total_amount|crmMoney:$currency}\n\n{ts}Name{/ts}: {$donors_display_name}\n\n{ts}Email{/ts}: {$donors_email}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n  {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n  <p>{ts}You have received a donation at your personal page{/ts}: <a href=\"{$pcpInfoURL}\">{$page_title}</a></p>\n  <p>{ts}Your fundraising total has been updated.{/ts}<br/>\n    {ts}The donor\'s information is listed below.  You can choose to contact them and convey your thanks if you wish.{/ts} <br/>\n    {if $is_honor_roll_enabled}\n      {ts}The donor\'s name has been added to your honor roll unless they asked not to be included.{/ts}<br/>\n    {/if}\n  </p>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n    <tr><td>{ts}Received{/ts}:</td><td> {$receive_date|crmDate}</td></tr>\n    <tr><td>{ts}Amount{/ts}:</td><td> {$total_amount|crmMoney:$currency}</td></tr>\n    <tr><td>{ts}Name{/ts}:</td><td> {$donors_display_name}</td></tr>\n    <tr><td>{ts}Email{/ts}:</td><td> {$donors_email}</td></tr>\n  </table>\n</body>\n</html>\n',1,832,'pcp_owner_notify',0,1,0,NULL),(27,'Additional Payment Receipt or Refund Notification','{if $isRefund}{ts}Refund Notification{/ts}{else}{ts}Payment Receipt{/ts}{/if}{if $component eq \'event\'} - {$event.title}{/if} - {contact.display_name}\n','{if $emailGreeting}{$emailGreeting},\n{/if}\n\n{if $isRefund}\n{ts}A refund has been issued based on changes in your registration selections.{/ts}\n{else}\n{ts}Below you will find a receipt for this payment.{/ts}\n{/if}\n{if $paymentsComplete}\n{ts}Thank you for completing this payment.{/ts}\n{/if}\n\n{if $isRefund}\n===============================================================================\n\n{ts}Refund Details{/ts}\n\n===============================================================================\n{ts}This Refund Amount{/ts}: {$refundAmount|crmMoney}\n------------------------------------------------------------------------------------\n\n{else}\n===============================================================================\n\n{ts}Payment Details{/ts}\n\n===============================================================================\n{ts}This Payment Amount{/ts}: {$paymentAmount|crmMoney}\n------------------------------------------------------------------------------------\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n\n===============================================================================\n\n{ts}Contribution Details{/ts}\n\n===============================================================================\n{ts}Total Fee{/ts}: {$totalAmount|crmMoney}\n{ts}Total Paid{/ts}: {$totalPaid|crmMoney}\n{ts}Balance Owed{/ts}: {$amountOwed|crmMoney} {* This will be zero after final payment. *}\n\n\n{if $billingName || $address}\n\n===============================================================================\n\n{ts}Billing Name and Address{/ts}\n\n===============================================================================\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_number}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===============================================================================\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{if $component eq \'event\'}\n===============================================================================\n\n{ts}Event Information and Location{/ts}\n\n===============================================================================\n\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{if $event.participant_role}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=emptyBlockStyle }style=\"padding: 10px; border-bottom: 1px solid #999;background-color: #f7f7f7;\"{/capture}\n{capture assign=emptyBlockValueStyle }style=\"padding: 10px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n  <tr>\n    <td>\n      {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n      {if $isRefund}\n        <p>{ts}A refund has been issued based on changes in your registration selections.{/ts}</p>\n      {else}\n        <p>{ts}Below you will find a receipt for this payment.{/ts}</p>\n        {if $paymentsComplete}\n          <p>{ts}Thank you for completing this contribution.{/ts}</p>\n        {/if}\n      {/if}\n    </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n    {if $isRefund}\n      <tr>\n        <th {$headerStyle}>{ts}Refund Details{/ts}</th>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n        {ts}This Refund Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$refundAmount|crmMoney}\n        </td>\n      </tr>\n    {else}\n      <tr>\n        <th {$headerStyle}>{ts}Payment Details{/ts}</th>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n        {ts}This Payment Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$paymentAmount|crmMoney}\n        </td>\n      </tr>\n    {/if}\n    {if $receive_date}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Transaction Date{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$receive_date|crmDate}\n        </td>\n      </tr>\n    {/if}\n    {if $trxn_id}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$trxn_id}\n        </td>\n      </tr>\n    {/if}\n    {if $paidBy}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Paid By{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$paidBy}\n        </td>\n      </tr>\n    {/if}\n    {if $checkNumber}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Check Number{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$checkNumber}\n        </td>\n      </tr>\n    {/if}\n\n  <tr>\n    <th {$headerStyle}>{ts}Contribution Details{/ts}</th>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Total Fee{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$totalAmount|crmMoney}\n    </td>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Total Paid{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$totalPaid|crmMoney}\n    </td>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Balance Owed{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$amountOwed|crmMoney}\n    </td> {* This will be zero after final payment. *}\n  </tr>\n  </table>\n\n  </td>\n  </tr>\n    <tr>\n      <td>\n  <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n    {if $billingName || $address}\n          <tr>\n            <th {$headerStyle}>\n        {ts}Billing Name and Address{/ts}\n            </th>\n          </tr>\n          <tr>\n            <td colspan=\"2\" {$valueStyle}>\n        {$billingName}<br />\n        {$address|nl2br}\n            </td>\n          </tr>\n    {/if}\n    {if $credit_card_number}\n          <tr>\n            <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n            </th>\n          </tr>\n          <tr>\n            <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires:{/ts} {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n            </td>\n          </tr>\n    {/if}\n    {if $component eq \'event\'}\n    <tr>\n      <th {$headerStyle}>\n        {ts}Event Information and Location{/ts}\n      </th>\n    </tr>\n    <tr>\n      <td colspan=\"2\" {$valueStyle}>\n         {$event.event_title}<br />\n        {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n    </tr>\n\n    {if $event.participant_role}\n    <tr>\n      <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n      </td>\n      <td {$valueStyle}>\n        {$event.participant_role}\n      </td>\n    </tr>\n    {/if}\n\n    {if $isShowLocation}\n    <tr>\n      <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n      </td>\n    </tr>\n    {/if}\n\n    {if $location.phone.1.phone || $location.email.1.email}\n    <tr>\n      <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n      </td>\n    </tr>\n    {foreach from=$location.phone item=phone}\n    {if $phone.phone}\n          <tr>\n            <td {$labelStyle}>\n        {if $phone.phone_type}\n        {$phone.phone_type_display}\n        {else}\n        {ts}Phone{/ts}\n        {/if}\n            </td>\n            <td {$valueStyle}>\n        {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n            </td>\n          </tr>\n    {/if}\n    {/foreach}\n    {foreach from=$location.email item=eventEmail}\n    {if $eventEmail.email}\n          <tr>\n            <td {$labelStyle}>\n        {ts}Email{/ts}\n            </td>\n            <td {$valueStyle}>\n        {$eventEmail.email}\n            </td>\n          </tr>\n    {/if}\n    {/foreach}\n    {/if} {*phone block close*}\n    {/if}\n  </table>\n      </td>\n    </tr>\n\n    </table>\n  </center>\n\n </body>\n</html>\n',1,833,'payment_or_refund_notification',1,0,0,NULL),(28,'Additional Payment Receipt or Refund Notification','{if $isRefund}{ts}Refund Notification{/ts}{else}{ts}Payment Receipt{/ts}{/if}{if $component eq \'event\'} - {$event.title}{/if} - {contact.display_name}\n','{if $emailGreeting}{$emailGreeting},\n{/if}\n\n{if $isRefund}\n{ts}A refund has been issued based on changes in your registration selections.{/ts}\n{else}\n{ts}Below you will find a receipt for this payment.{/ts}\n{/if}\n{if $paymentsComplete}\n{ts}Thank you for completing this payment.{/ts}\n{/if}\n\n{if $isRefund}\n===============================================================================\n\n{ts}Refund Details{/ts}\n\n===============================================================================\n{ts}This Refund Amount{/ts}: {$refundAmount|crmMoney}\n------------------------------------------------------------------------------------\n\n{else}\n===============================================================================\n\n{ts}Payment Details{/ts}\n\n===============================================================================\n{ts}This Payment Amount{/ts}: {$paymentAmount|crmMoney}\n------------------------------------------------------------------------------------\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n\n===============================================================================\n\n{ts}Contribution Details{/ts}\n\n===============================================================================\n{ts}Total Fee{/ts}: {$totalAmount|crmMoney}\n{ts}Total Paid{/ts}: {$totalPaid|crmMoney}\n{ts}Balance Owed{/ts}: {$amountOwed|crmMoney} {* This will be zero after final payment. *}\n\n\n{if $billingName || $address}\n\n===============================================================================\n\n{ts}Billing Name and Address{/ts}\n\n===============================================================================\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_number}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===============================================================================\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{if $component eq \'event\'}\n===============================================================================\n\n{ts}Event Information and Location{/ts}\n\n===============================================================================\n\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{if $event.participant_role}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=emptyBlockStyle }style=\"padding: 10px; border-bottom: 1px solid #999;background-color: #f7f7f7;\"{/capture}\n{capture assign=emptyBlockValueStyle }style=\"padding: 10px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n  <tr>\n    <td>\n      {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n      {if $isRefund}\n        <p>{ts}A refund has been issued based on changes in your registration selections.{/ts}</p>\n      {else}\n        <p>{ts}Below you will find a receipt for this payment.{/ts}</p>\n        {if $paymentsComplete}\n          <p>{ts}Thank you for completing this contribution.{/ts}</p>\n        {/if}\n      {/if}\n    </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n    {if $isRefund}\n      <tr>\n        <th {$headerStyle}>{ts}Refund Details{/ts}</th>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n        {ts}This Refund Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$refundAmount|crmMoney}\n        </td>\n      </tr>\n    {else}\n      <tr>\n        <th {$headerStyle}>{ts}Payment Details{/ts}</th>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n        {ts}This Payment Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$paymentAmount|crmMoney}\n        </td>\n      </tr>\n    {/if}\n    {if $receive_date}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Transaction Date{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$receive_date|crmDate}\n        </td>\n      </tr>\n    {/if}\n    {if $trxn_id}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$trxn_id}\n        </td>\n      </tr>\n    {/if}\n    {if $paidBy}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Paid By{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$paidBy}\n        </td>\n      </tr>\n    {/if}\n    {if $checkNumber}\n      <tr>\n        <td {$labelStyle}>\n        {ts}Check Number{/ts}\n        </td>\n        <td {$valueStyle}>\n        {$checkNumber}\n        </td>\n      </tr>\n    {/if}\n\n  <tr>\n    <th {$headerStyle}>{ts}Contribution Details{/ts}</th>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Total Fee{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$totalAmount|crmMoney}\n    </td>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Total Paid{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$totalPaid|crmMoney}\n    </td>\n  </tr>\n  <tr>\n    <td {$labelStyle}>\n      {ts}Balance Owed{/ts}\n    </td>\n    <td {$valueStyle}>\n      {$amountOwed|crmMoney}\n    </td> {* This will be zero after final payment. *}\n  </tr>\n  </table>\n\n  </td>\n  </tr>\n    <tr>\n      <td>\n  <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n    {if $billingName || $address}\n          <tr>\n            <th {$headerStyle}>\n        {ts}Billing Name and Address{/ts}\n            </th>\n          </tr>\n          <tr>\n            <td colspan=\"2\" {$valueStyle}>\n        {$billingName}<br />\n        {$address|nl2br}\n            </td>\n          </tr>\n    {/if}\n    {if $credit_card_number}\n          <tr>\n            <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n            </th>\n          </tr>\n          <tr>\n            <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires:{/ts} {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n            </td>\n          </tr>\n    {/if}\n    {if $component eq \'event\'}\n    <tr>\n      <th {$headerStyle}>\n        {ts}Event Information and Location{/ts}\n      </th>\n    </tr>\n    <tr>\n      <td colspan=\"2\" {$valueStyle}>\n         {$event.event_title}<br />\n        {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n    </tr>\n\n    {if $event.participant_role}\n    <tr>\n      <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n      </td>\n      <td {$valueStyle}>\n        {$event.participant_role}\n      </td>\n    </tr>\n    {/if}\n\n    {if $isShowLocation}\n    <tr>\n      <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n      </td>\n    </tr>\n    {/if}\n\n    {if $location.phone.1.phone || $location.email.1.email}\n    <tr>\n      <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n      </td>\n    </tr>\n    {foreach from=$location.phone item=phone}\n    {if $phone.phone}\n          <tr>\n            <td {$labelStyle}>\n        {if $phone.phone_type}\n        {$phone.phone_type_display}\n        {else}\n        {ts}Phone{/ts}\n        {/if}\n            </td>\n            <td {$valueStyle}>\n        {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n            </td>\n          </tr>\n    {/if}\n    {/foreach}\n    {foreach from=$location.email item=eventEmail}\n    {if $eventEmail.email}\n          <tr>\n            <td {$labelStyle}>\n        {ts}Email{/ts}\n            </td>\n            <td {$valueStyle}>\n        {$eventEmail.email}\n            </td>\n          </tr>\n    {/if}\n    {/foreach}\n    {/if} {*phone block close*}\n    {/if}\n  </table>\n      </td>\n    </tr>\n\n    </table>\n  </center>\n\n </body>\n</html>\n',1,833,'payment_or_refund_notification',0,1,0,NULL),(29,'Events - Registration Confirmation and Receipt (off-line)','{ts}Event Confirmation{/ts} - {$event.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n{$event.confirm_email_text}\n{/if}\n\n{if $isOnWaitlist}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}You have been added to the WAIT LIST for this event.{/ts}\n\n{if $isPrimary}\n{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $isRequireApproval}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Your registration has been submitted.{/ts}\n\n{if $isPrimary}\n{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $is_pay_later}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Event Information and Location{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{if $event.participant_role neq \'Attendee\' and $defaultRole}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $email}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Registered Email{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$email}\n{/if}\n{if $event.is_monetary} {* This section for Paid events only.*}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.fee_label}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{if $lineItem}{foreach from=$lineItem item=value key=priceset}\n\n{if $value neq \'skip\'}\n{if $isPrimary}\n{if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n{ts 1=$priceset+1}Participant %1{/ts}\n{/if}\n{/if}\n---------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{capture assign=ts_participant_total}{if $pricesetFieldsCount }{ts}Total Participants{/ts}{/if}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"} {$ts_participant_total|string_format:\"%10s\"}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{foreach from=$value item=line}\n{if $pricesetFieldsCount }{capture assign=ts_participant_count}{$line.participant_count}{/capture}{/if}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney|string_format:\"%10s\"} {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if}  {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {$ts_participant_count|string_format:\"%10s\"}\n{/foreach}\n{/if}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$totalAmount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n{/if}\n\n{if $amount && !$lineItem}\n{foreach from=$amount item=amnt key=level}{$amnt.amount|crmMoney} {$amnt.label}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{if $isPrimary}\n\n{if $balanceAmount}{ts}Total Paid{/ts}{else}{ts}Total Amount{/ts}{/if}: {$totalAmount|crmMoney} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n\n{if $balanceAmount}\n{ts}Balance{/ts}: {$balanceAmount|crmMoney}\n{/if}\n\n{if $pricesetFieldsCount }\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n        {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n        {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n\n{ts}Total Participants{/ts}: {$count}\n{/if}\n\n{if $is_pay_later }\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$register_date|crmDate}\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $financialTypeName}\n{ts}Financial Type{/ts}: {$financialTypeName}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n{if $billingName}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Billing Name and Address{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n{/if} {* End of conditional section for Paid events *}\n\n{if $customPre}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPre_grouptitle}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPre item=value key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n{$customName}: {$value}\n{/if}\n{/foreach}\n{/if}\n\n{if $customPost}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPost_grouptitle}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPost item=value key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n{$customName}: {$value}\n{/if}\n{/foreach}\n{/if}\n{if $customProfile}\n\n{foreach from=$customProfile item=value key=customName}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts 1=$customName+1}Participant Information - Participant %1{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=val key=field}\n{if $field eq \'additionalCustomPre\' or $field eq \'additionalCustomPost\' }\n{if $field eq \'additionalCustomPre\' }\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$additionalCustomPre_grouptitle}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{else}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$additionalCustomPost_grouptitle}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{/if}\n{foreach from=$val item=v key=f}\n{$f}: {$v}\n{/foreach}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n    {if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n     <p>{$event.confirm_email_text|htmlize}</p>\n    {/if}\n\n    {if $isOnWaitlist}\n     <p>{ts}You have been added to the WAIT LIST for this event.{/ts}</p>\n     {if $isPrimary}\n       <p>{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}</p>\n     {/if}\n    {elseif $isRequireApproval}\n     <p>{ts}Your registration has been submitted.{/ts}</p>\n     {if $isPrimary}\n      <p>{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}</p>\n     {/if}\n    {elseif $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n\n     {if $event.participant_role neq \'Attendee\' and $defaultRole}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$event.participant_role}\n       </td>\n      </tr>\n     {/if}\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $location.phone.1.phone || $location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}\n           {$phone.phone_type_display}\n          {else}\n           {ts}Phone{/ts}\n          {/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n     {if $email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$email}\n       </td>\n      </tr>\n     {/if}\n\n\n     {if $event.is_monetary}\n\n      <tr>\n       <th {$headerStyle}>\n        {$event.fee_label}\n       </th>\n      </tr>\n\n      {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n        {if $value neq \'skip\'}\n         {if $isPrimary}\n          {if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n           <tr>\n            <td colspan=\"2\" {$labelStyle}>\n             {ts 1=$priceset+1}Participant %1{/ts}\n            </td>\n           </tr>\n          {/if}\n         {/if}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Qty{/ts}</th>\n             <th>{ts}Each{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n             {/if}\n             <th>{ts}Total{/ts}</th>\n       {if $pricesetFieldsCount }<th>{ts}Total Participants{/ts}</th>{/if}\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td>\n        {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td>\n               {$line.qty}\n              </td>\n              <td>\n               {$line.unit_price|crmMoney}\n              </td>\n              {if $dataArray}\n               <td>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n              {/if}\n              <td>\n               {$line.line_total+$line.tax_amount|crmMoney}\n              </td>\n        {if  $pricesetFieldsCount }\n        <td>\n    {$line.participant_count}\n              </td>\n        {/if}\n             </tr>\n            {/foreach}\n           </table>\n          </td>\n         </tr>\n        {/if}\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalAmount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n          <tr>\n           {if $priceset || $priceset == 0}\n            <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n            <td>&nbsp;{$value|crmMoney:$currency}</td>\n           {else}\n            <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n            <td>&nbsp;{$value|crmMoney:$currency}</td>\n           {/if}\n          </tr>\n        {/foreach}\n       {/if}\n      {/if}\n\n      {if $amount && !$lineItem}\n       {foreach from=$amount item=amnt key=level}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$amnt.amount|crmMoney} {$amnt.label}\n         </td>\n        </tr>\n       {/foreach}\n      {/if}\n      {if $totalTaxAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalTaxAmount|crmMoney:$currency}\n        </td>\n       </tr>\n      {/if}\n      {if $isPrimary}\n       <tr>\n        <td {$labelStyle}>\n        {if $balanceAmount}\n           {ts}Total Paid{/ts}\n        {else}\n           {ts}Total Amount{/ts}\n         {/if}\n        </td>\n        <td {$valueStyle}>\n         {$totalAmount|crmMoney} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n        </td>\n       </tr>\n      {if $balanceAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Balance{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$balanceAmount|crmMoney}\n        </td>\n       </tr>\n      {/if}\n       {if $pricesetFieldsCount }\n     <tr>\n       <td {$labelStyle}>\n   {ts}Total Participants{/ts}</td>\n       <td {$valueStyle}>\n   {assign var=\"count\" value= 0}\n         {foreach from=$lineItem item=pcount}\n         {assign var=\"lineItemCount\" value=0}\n         {if $pcount neq \'skip\'}\n           {foreach from=$pcount item=p_count}\n           {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n           {/foreach}\n           {if $lineItemCount < 1 }\n           assign var=\"lineItemCount\" value=1}\n           {/if}\n           {assign var=\"count\" value=$count+$lineItemCount}\n         {/if}\n         {/foreach}\n   {$count}\n       </td>\n     </tr>\n     {/if}\n       {if $is_pay_later}\n        <tr>\n         <td colspan=\"2\" {$labelStyle}>\n          {$pay_later_receipt}\n         </td>\n        </tr>\n       {/if}\n\n       {if $register_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Registration Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$register_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $financialTypeName}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$financialTypeName}\n         </td>\n        </tr>\n       {/if}\n\n       {if $trxn_id}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction #{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$trxn_id}\n         </td>\n        </tr>\n       {/if}\n\n       {if $paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n         {$paidBy}\n         </td>\n        </tr>\n       {/if}\n\n       {if $checkNumber}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Check Number{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$checkNumber}\n         </td>\n        </tr>\n       {/if}\n\n       {if $billingName}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Billing Name and Address{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}\n         </td>\n        </tr>\n       {/if}\n\n       {if $credit_card_type}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Credit Card Information{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$credit_card_type}<br />\n          {$credit_card_number}<br />\n          {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n      {/if}\n\n     {/if} {* End of conditional section for Paid events *}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=value key=customName}\n       {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=value key=customName}\n       {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customProfile}\n      {foreach from=$customProfile item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {ts 1=$customName+1}Participant Information - Participant %1{/ts}\n        </th>\n       </tr>\n       {foreach from=$value item=val key=field}\n        {if $field eq \'additionalCustomPre\' or $field eq \'additionalCustomPost\'}\n         <tr>\n          <td colspan=\"2\" {$labelStyle}>\n           {if $field eq \'additionalCustomPre\'}\n            {$additionalCustomPre_grouptitle}\n           {else}\n            {$additionalCustomPost_grouptitle}\n           {/if}\n          </td>\n         </tr>\n         {foreach from=$val item=v key=f}\n          <tr>\n           <td {$labelStyle}>\n            {$f}\n           </td>\n           <td {$valueStyle}>\n            {$v}\n           </td>\n          </tr>\n         {/foreach}\n        {/if}\n       {/foreach}\n      {/foreach}\n     {/if}\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,834,'event_offline_receipt',1,0,0,NULL),(30,'Events - Registration Confirmation and Receipt (off-line)','{ts}Event Confirmation{/ts} - {$event.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n{$event.confirm_email_text}\n{/if}\n\n{if $isOnWaitlist}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}You have been added to the WAIT LIST for this event.{/ts}\n\n{if $isPrimary}\n{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $isRequireApproval}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Your registration has been submitted.{/ts}\n\n{if $isPrimary}\n{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $is_pay_later}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Event Information and Location{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{if $event.participant_role neq \'Attendee\' and $defaultRole}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $email}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Registered Email{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$email}\n{/if}\n{if $event.is_monetary} {* This section for Paid events only.*}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.fee_label}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{if $lineItem}{foreach from=$lineItem item=value key=priceset}\n\n{if $value neq \'skip\'}\n{if $isPrimary}\n{if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n{ts 1=$priceset+1}Participant %1{/ts}\n{/if}\n{/if}\n---------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{capture assign=ts_participant_total}{if $pricesetFieldsCount }{ts}Total Participants{/ts}{/if}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"} {$ts_participant_total|string_format:\"%10s\"}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{foreach from=$value item=line}\n{if $pricesetFieldsCount }{capture assign=ts_participant_count}{$line.participant_count}{/capture}{/if}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney|string_format:\"%10s\"} {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if}  {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {$ts_participant_count|string_format:\"%10s\"}\n{/foreach}\n{/if}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$totalAmount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n{/if}\n\n{if $amount && !$lineItem}\n{foreach from=$amount item=amnt key=level}{$amnt.amount|crmMoney} {$amnt.label}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{if $isPrimary}\n\n{if $balanceAmount}{ts}Total Paid{/ts}{else}{ts}Total Amount{/ts}{/if}: {$totalAmount|crmMoney} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n\n{if $balanceAmount}\n{ts}Balance{/ts}: {$balanceAmount|crmMoney}\n{/if}\n\n{if $pricesetFieldsCount }\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n        {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n        {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n\n{ts}Total Participants{/ts}: {$count}\n{/if}\n\n{if $is_pay_later }\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$register_date|crmDate}\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $financialTypeName}\n{ts}Financial Type{/ts}: {$financialTypeName}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n{if $billingName}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Billing Name and Address{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n{/if} {* End of conditional section for Paid events *}\n\n{if $customPre}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPre_grouptitle}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPre item=value key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n{$customName}: {$value}\n{/if}\n{/foreach}\n{/if}\n\n{if $customPost}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPost_grouptitle}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPost item=value key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n{$customName}: {$value}\n{/if}\n{/foreach}\n{/if}\n{if $customProfile}\n\n{foreach from=$customProfile item=value key=customName}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts 1=$customName+1}Participant Information - Participant %1{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=val key=field}\n{if $field eq \'additionalCustomPre\' or $field eq \'additionalCustomPost\' }\n{if $field eq \'additionalCustomPre\' }\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$additionalCustomPre_grouptitle}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{else}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$additionalCustomPost_grouptitle}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{/if}\n{foreach from=$val item=v key=f}\n{$f}: {$v}\n{/foreach}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n    {if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n     <p>{$event.confirm_email_text|htmlize}</p>\n    {/if}\n\n    {if $isOnWaitlist}\n     <p>{ts}You have been added to the WAIT LIST for this event.{/ts}</p>\n     {if $isPrimary}\n       <p>{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}</p>\n     {/if}\n    {elseif $isRequireApproval}\n     <p>{ts}Your registration has been submitted.{/ts}</p>\n     {if $isPrimary}\n      <p>{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}</p>\n     {/if}\n    {elseif $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n\n     {if $event.participant_role neq \'Attendee\' and $defaultRole}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$event.participant_role}\n       </td>\n      </tr>\n     {/if}\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $location.phone.1.phone || $location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}\n           {$phone.phone_type_display}\n          {else}\n           {ts}Phone{/ts}\n          {/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n     {if $email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$email}\n       </td>\n      </tr>\n     {/if}\n\n\n     {if $event.is_monetary}\n\n      <tr>\n       <th {$headerStyle}>\n        {$event.fee_label}\n       </th>\n      </tr>\n\n      {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n        {if $value neq \'skip\'}\n         {if $isPrimary}\n          {if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n           <tr>\n            <td colspan=\"2\" {$labelStyle}>\n             {ts 1=$priceset+1}Participant %1{/ts}\n            </td>\n           </tr>\n          {/if}\n         {/if}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Qty{/ts}</th>\n             <th>{ts}Each{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n             {/if}\n             <th>{ts}Total{/ts}</th>\n       {if $pricesetFieldsCount }<th>{ts}Total Participants{/ts}</th>{/if}\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td>\n        {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td>\n               {$line.qty}\n              </td>\n              <td>\n               {$line.unit_price|crmMoney}\n              </td>\n              {if $dataArray}\n               <td>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n              {/if}\n              <td>\n               {$line.line_total+$line.tax_amount|crmMoney}\n              </td>\n        {if  $pricesetFieldsCount }\n        <td>\n    {$line.participant_count}\n              </td>\n        {/if}\n             </tr>\n            {/foreach}\n           </table>\n          </td>\n         </tr>\n        {/if}\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalAmount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n          <tr>\n           {if $priceset || $priceset == 0}\n            <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n            <td>&nbsp;{$value|crmMoney:$currency}</td>\n           {else}\n            <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n            <td>&nbsp;{$value|crmMoney:$currency}</td>\n           {/if}\n          </tr>\n        {/foreach}\n       {/if}\n      {/if}\n\n      {if $amount && !$lineItem}\n       {foreach from=$amount item=amnt key=level}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$amnt.amount|crmMoney} {$amnt.label}\n         </td>\n        </tr>\n       {/foreach}\n      {/if}\n      {if $totalTaxAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalTaxAmount|crmMoney:$currency}\n        </td>\n       </tr>\n      {/if}\n      {if $isPrimary}\n       <tr>\n        <td {$labelStyle}>\n        {if $balanceAmount}\n           {ts}Total Paid{/ts}\n        {else}\n           {ts}Total Amount{/ts}\n         {/if}\n        </td>\n        <td {$valueStyle}>\n         {$totalAmount|crmMoney} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n        </td>\n       </tr>\n      {if $balanceAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Balance{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$balanceAmount|crmMoney}\n        </td>\n       </tr>\n      {/if}\n       {if $pricesetFieldsCount }\n     <tr>\n       <td {$labelStyle}>\n   {ts}Total Participants{/ts}</td>\n       <td {$valueStyle}>\n   {assign var=\"count\" value= 0}\n         {foreach from=$lineItem item=pcount}\n         {assign var=\"lineItemCount\" value=0}\n         {if $pcount neq \'skip\'}\n           {foreach from=$pcount item=p_count}\n           {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n           {/foreach}\n           {if $lineItemCount < 1 }\n           assign var=\"lineItemCount\" value=1}\n           {/if}\n           {assign var=\"count\" value=$count+$lineItemCount}\n         {/if}\n         {/foreach}\n   {$count}\n       </td>\n     </tr>\n     {/if}\n       {if $is_pay_later}\n        <tr>\n         <td colspan=\"2\" {$labelStyle}>\n          {$pay_later_receipt}\n         </td>\n        </tr>\n       {/if}\n\n       {if $register_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Registration Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$register_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $financialTypeName}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$financialTypeName}\n         </td>\n        </tr>\n       {/if}\n\n       {if $trxn_id}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction #{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$trxn_id}\n         </td>\n        </tr>\n       {/if}\n\n       {if $paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n         {$paidBy}\n         </td>\n        </tr>\n       {/if}\n\n       {if $checkNumber}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Check Number{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$checkNumber}\n         </td>\n        </tr>\n       {/if}\n\n       {if $billingName}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Billing Name and Address{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}\n         </td>\n        </tr>\n       {/if}\n\n       {if $credit_card_type}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Credit Card Information{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$credit_card_type}<br />\n          {$credit_card_number}<br />\n          {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n      {/if}\n\n     {/if} {* End of conditional section for Paid events *}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=value key=customName}\n       {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=value key=customName}\n       {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customProfile}\n      {foreach from=$customProfile item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {ts 1=$customName+1}Participant Information - Participant %1{/ts}\n        </th>\n       </tr>\n       {foreach from=$value item=val key=field}\n        {if $field eq \'additionalCustomPre\' or $field eq \'additionalCustomPost\'}\n         <tr>\n          <td colspan=\"2\" {$labelStyle}>\n           {if $field eq \'additionalCustomPre\'}\n            {$additionalCustomPre_grouptitle}\n           {else}\n            {$additionalCustomPost_grouptitle}\n           {/if}\n          </td>\n         </tr>\n         {foreach from=$val item=v key=f}\n          <tr>\n           <td {$labelStyle}>\n            {$f}\n           </td>\n           <td {$valueStyle}>\n            {$v}\n           </td>\n          </tr>\n         {/foreach}\n        {/if}\n       {/foreach}\n      {/foreach}\n     {/if}\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,834,'event_offline_receipt',0,1,0,NULL),(31,'Events - Registration Confirmation and Receipt (on-line)','{if $isOnWaitlist}{ts}Wait List Confirmation{/ts}{elseif $isRequireApproval}{ts}Registration Request Confirmation{/ts}{else}{ts}Registration Confirmation{/ts}{/if} - {$event.event_title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n{$event.confirm_email_text}\n\n{else}\n  {ts}Thank you for your registration.{/ts}\n  {if $participant_status}{ts 1=$participant_status}This is a confirmation that your registration has been received and your status has been updated to %1.{/ts}\n  {else}{if $isOnWaitlist}{ts}This is a confirmation that your registration has been received and your status has been updated to waitlisted.{/ts}{else}{ts}This is a confirmation that your registration has been received and your status has been updated to registered.{/ts}{/if}\n  {/if}\n{/if}\n\n{if $isOnWaitlist}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}You have been added to the WAIT LIST for this event.{/ts}\n\n{if $isPrimary}\n{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $isRequireApproval}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Your registration has been submitted.{/ts}\n\n{if $isPrimary}\n{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $is_pay_later && !$isAmountzero && !$isAdditionalParticipant}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Event Information and Location{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.event_title}\n{$event.event_start_date|date_format:\"%A\"} {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|date_format:\"%A\"} {$event.event_end_date|crmDate}{/if}{/if}\n{if $conference_sessions}\n\n\n{ts}Your schedule:{/ts}\n{assign var=\'group_by_day\' value=\'NA\'}\n{foreach from=$conference_sessions item=session}\n{if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n{assign var=\'group_by_day\' value=$session.start_date}\n\n{$group_by_day|date_format:\"%m/%d/%Y\"}\n\n\n{/if}\n{$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}\n{if $session.location}    {$session.location}{/if}\n{/foreach}\n{/if}\n\n{if $event.participant_role neq \'Attendee\' and $defaultRole}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $payer.name}\nYou were registered by: {$payer.name}\n{/if}\n{if $event.is_monetary and not $isRequireApproval} {* This section for Paid events only.*}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.fee_label}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{if $lineItem}{foreach from=$lineItem item=value key=priceset}\n\n{if $value neq \'skip\'}\n{if $isPrimary}\n{if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n{ts 1=$priceset+1}Participant %1{/ts} {$part.$priceset.info}\n\n{/if}\n{/if}\n-----------------------------------------------------------{if $pricesetFieldsCount }-----------------------------------------------------{/if}\n\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{if $pricesetFieldsCount }{capture assign=ts_participant_total}{ts}Total Participants{/ts}{/capture}{/if}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"} {$ts_participant_total|string_format:\"%10s\"}\n-----------------------------------------------------------{if $pricesetFieldsCount }-----------------------------------------------------{/if}\n\n{foreach from=$value item=line}\n{if $pricesetFieldsCount }{capture assign=ts_participant_count}{$line.participant_count}{/capture}{/if}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if} {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}{$ts_participant_count|string_format:\"%10s\"}\n{/foreach}\n----------------------------------------------------------------------------------------------------------------\n{if $individual}{ts}Participant Total{/ts} {$individual.$priceset.totalAmtWithTax-$individual.$priceset.totalTaxAmt|crmMoney:$currency|string_format:\"%29s\"} {$individual.$priceset.totalTaxAmt|crmMoney:$currency|string_format:\"%33s\"} {$individual.$priceset.totalAmtWithTax|crmMoney:$currency|string_format:\"%12s\"}{/if}\n{/if}\n{\"\"|string_format:\"%120s\"}\n{/foreach}\n{\"\"|string_format:\"%120s\"}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$totalAmount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n{/if}\n\n{if $amounts && !$lineItem}\n{foreach from=$amounts item=amnt key=level}{$amnt.amount|crmMoney:$currency} {$amnt.label}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{if $isPrimary }\n\n{ts}Total Amount{/ts}: {$totalAmount|crmMoney:$currency} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n\n{if $pricesetFieldsCount }\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n      {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n      {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n\n{ts}Total Participants{/ts}: {$count}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$register_date|crmDate}\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $financialTypeName}\n{ts}Financial Type{/ts}: {$financialTypeName}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n{if $billingName}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Billing Name and Address{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Credit Card Information{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n{/if} {* End of conditional section for Paid events *}\n\n{if $customPre}\n{foreach from=$customPre item=customPr key=i}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPre_grouptitle.$i}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPr item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $customPost}\n{foreach from=$customPost item=customPos key=j}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPost_grouptitle.$j}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPos item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n{if $customProfile}\n\n{foreach from=$customProfile.profile item=eachParticipant key=participantID}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts 1=$participantID+2}Participant Information - Participant %1{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$eachParticipant item=eachProfile key=pid}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$customProfile.title.$pid}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{foreach from=$eachProfile item=val key=field}\n{foreach from=$val item=v key=f}\n{$field}: {$v}\n{/foreach}\n{/foreach}\n{/foreach}\n{/foreach}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $event.allow_selfcancelxfer }\n{ts 1=$selfcancelxfer_time 2=$selfservice_preposition}You may transfer your registration to another participant or cancel your registration up to %1 hours %2 the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}\n   {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n{ts}Transfer or cancel your registration:{/ts} {$selfService}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=tdfirstStyle}style=\"width: 180px; padding-bottom: 15px;\"{/capture}\n{capture assign=tdStyle}style=\"width: 100px;\"{/capture}\n{capture assign=participantTotal}style=\"margin: 0.5em 0 0.5em;padding: 0.5em;background-color: #999999;font-weight: bold;color: #FAFAFA;border-radius: 2px;\"{/capture}\n\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n    {if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n     <p>{$event.confirm_email_text|htmlize}</p>\n\n    {else}\n     <p>{ts}Thank you for your registration.{/ts}\n     {if $participant_status}{ts 1=$participant_status}This is a confirmation that your registration has been received and your status has been updated to <strong> %1</strong>.{/ts}\n     {else}{if $isOnWaitlist}{ts}This is a confirmation that your registration has been received and your status has been updated to <strong>waitlisted</strong>.{/ts}{else}{ts}This is a confirmation that your registration has been received and your status has been updated to <strong>registered<strong>.{/ts}{/if}{/if}</p>\n\n    {/if}\n\n    <p>\n    {if $isOnWaitlist}\n     <p>{ts}You have been added to the WAIT LIST for this event.{/ts}</p>\n     {if $isPrimary}\n       <p>{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}</p>\n     {/if}\n    {elseif $isRequireApproval}\n     <p>{ts}Your registration has been submitted.{/ts}</p>\n     {if $isPrimary}\n      <p>{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}</p>\n     {/if}\n    {elseif $is_pay_later && !$isAmountzero && !$isAdditionalParticipant}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"width:100%; max-width:700px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|date_format:\"%A\"} {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|date_format:\"%A\"} {$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n\n\n     {if $conference_sessions}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n  {ts}Your schedule:{/ts}\n       </td>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n  {assign var=\'group_by_day\' value=\'NA\'}\n  {foreach from=$conference_sessions item=session}\n   {if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n    {assign var=\'group_by_day\' value=$session.start_date}\n          <em>{$group_by_day|date_format:\"%m/%d/%Y\"}</em><br />\n   {/if}\n   {$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}<br />\n   {if $session.location}&nbsp;&nbsp;&nbsp;&nbsp;{$session.location}<br />{/if}\n  {/foreach}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.participant_role neq \'Attendee\' and $defaultRole}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$event.participant_role}\n       </td>\n      </tr>\n     {/if}\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $location.phone.1.phone || $location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}\n           {$phone.phone_type_display}\n          {else}\n           {ts}Phone{/ts}\n          {/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n    {if $event.is_share}\n        <tr>\n            <td colspan=\"2\" {$valueStyle}>\n                {capture assign=eventUrl}{crmURL p=\'civicrm/event/info\' q=\"id=`$event.id`&reset=1\" a=true fe=1 h=1}{/capture}\n                {include file=\"CRM/common/SocialNetwork.tpl\" emailMode=true url=$eventUrl title=$event.title pageURL=$eventUrl}\n            </td>\n        </tr>\n    {/if}\n    {if $payer.name}\n     <tr>\n       <th {$headerStyle}>\n         {ts}You were registered by:{/ts}\n       </th>\n     </tr>\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$payer.name}\n       </td>\n     </tr>\n    {/if}\n    {if $event.is_monetary and not $isRequireApproval}\n\n      <tr>\n       <th {$headerStyle}>\n        {$event.fee_label}\n       </th>\n      </tr>\n\n      {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n        {if $value neq \'skip\'}\n         {if $isPrimary}\n          {if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n           <tr>\n            <td colspan=\"2\" {$labelStyle}>\n             {ts 1=$priceset+1}Participant %1{/ts} {$part.$priceset.info}\n            </td>\n           </tr>\n          {/if}\n         {/if}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Qty{/ts}</th>\n             <th>{ts}Each{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n             {/if}\n             <th>{ts}Total{/ts}</th>\n       {if  $pricesetFieldsCount }<th>{ts}Total Participants{/ts}</th>{/if}\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td {$tdfirstStyle}>\n              {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td {$tdStyle} align=\"middle\">\n               {$line.qty}\n              </td>\n              <td {$tdStyle}>\n               {$line.unit_price|crmMoney:$currency}\n              </td>\n              {if $dataArray}\n               <td {$tdStyle}>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td {$tdStyle}>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td {$tdStyle}>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n              {/if}\n              <td {$tdStyle}>\n               {$line.line_total+$line.tax_amount|crmMoney:$currency}\n              </td>\n        {if $pricesetFieldsCount }<td {$tdStyle}>{$line.participant_count}</td> {/if}\n             </tr>\n            {/foreach}\n            {if $individual}\n              <tr {$participantTotal}>\n                <td colspan=3>{ts}Participant Total{/ts}</td>\n                <td colspan=2>{$individual.$priceset.totalAmtWithTax-$individual.$priceset.totalTaxAmt|crmMoney}</td>\n                <td colspan=1>{$individual.$priceset.totalTaxAmt|crmMoney}</td>\n                <td colspan=2>{$individual.$priceset.totalAmtWithTax|crmMoney}</td>\n              </tr>\n            {/if}\n           </table>\n          </td>\n         </tr>\n        {/if}\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts} Amount Before Tax: {/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalAmount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n          {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {else}\n           <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {/if}\n         </tr>\n        {/foreach}\n       {/if}\n      {/if}\n\n      {if $amounts && !$lineItem}\n       {foreach from=$amounts item=amnt key=level}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$amnt.amount|crmMoney:$currency} {$amnt.label}\n         </td>\n        </tr>\n       {/foreach}\n      {/if}\n\n    {if $totalTaxAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalTaxAmount|crmMoney:$currency}\n        </td>\n       </tr>\n      {/if}\n      {if $isPrimary}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalAmount|crmMoney:$currency} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n        </td>\n       </tr>\n       {if $pricesetFieldsCount }\n     <tr>\n       <td {$labelStyle}>\n      {ts}Total Participants{/ts}</td>\n      <td {$valueStyle}>\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n      {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n      {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n     {$count}\n     </td> </tr>\n      {/if}\n\n       {if $register_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Registration Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$register_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $financialTypeName}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$financialTypeName}\n         </td>\n        </tr>\n       {/if}\n\n       {if $trxn_id}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction #{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$trxn_id}\n         </td>\n        </tr>\n       {/if}\n\n       {if $paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n         {$paidBy}\n         </td>\n        </tr>\n       {/if}\n\n       {if $checkNumber}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Check Number{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$checkNumber}\n         </td>\n        </tr>\n       {/if}\n\n       {if $billingName}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Billing Name and Address{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}\n         </td>\n        </tr>\n       {/if}\n\n       {if $credit_card_type}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Credit Card Information{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$credit_card_type}<br />\n          {$credit_card_number}<br />\n          {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n      {/if}\n\n     {/if} {* End of conditional section for Paid events *}\n\n\n{if $customPre}\n{foreach from=$customPre item=customPr key=i}\n   <tr> <th {$headerStyle}>{$customPre_grouptitle.$i}</th></tr>\n   {foreach from=$customPr item=customValue key=customName}\n   {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n     <tr>\n         <td {$labelStyle}>{$customName}</td>\n         <td {$valueStyle}>{$customValue}</td>\n     </tr>\n   {/if}\n   {/foreach}\n{/foreach}\n{/if}\n\n{if $customPost}\n{foreach from=$customPost item=customPos key=j}\n   <tr> <th {$headerStyle}>{$customPost_grouptitle.$j}</th></tr>\n   {foreach from=$customPos item=customValue key=customName}\n   {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n     <tr>\n         <td {$labelStyle}>{$customName}</td>\n         <td {$valueStyle}>{$customValue}</td>\n     </tr>\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $customProfile}\n{foreach from=$customProfile.profile item=eachParticipant key=participantID}\n     <tr><th {$headerStyle}>{ts 1=$participantID+2}Participant %1{/ts} </th></tr>\n     {foreach from=$eachParticipant item=eachProfile key=pid}\n     <tr><th {$headerStyle}>{$customProfile.title.$pid}</th></tr>\n     {foreach from=$eachProfile item=val key=field}\n     <tr>{foreach from=$val item=v key=f}\n         <td {$labelStyle}>{$field}</td>\n         <td {$valueStyle}>{$v}</td>\n         {/foreach}\n     </tr>\n     {/foreach}\n{/foreach}\n{/foreach}\n{/if}\n\n    {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n    </table>\n    {if $event.allow_selfcancelxfer }\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n        {ts 1=$selfcancelxfer_time 2=$selfservice_preposition}You may transfer your registration to another participant or cancel your registration up to %1 hours %2 the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}<br />\n        {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n        <a href=\"{$selfService}\">{ts}Click here to transfer or cancel your registration.{/ts}</a>\n      </td>\n     </tr>\n    {/if}\n </table>\n</center>\n\n</body>\n</html>\n',1,835,'event_online_receipt',1,0,0,NULL),(32,'Events - Registration Confirmation and Receipt (on-line)','{if $isOnWaitlist}{ts}Wait List Confirmation{/ts}{elseif $isRequireApproval}{ts}Registration Request Confirmation{/ts}{else}{ts}Registration Confirmation{/ts}{/if} - {$event.event_title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n{$event.confirm_email_text}\n\n{else}\n  {ts}Thank you for your registration.{/ts}\n  {if $participant_status}{ts 1=$participant_status}This is a confirmation that your registration has been received and your status has been updated to %1.{/ts}\n  {else}{if $isOnWaitlist}{ts}This is a confirmation that your registration has been received and your status has been updated to waitlisted.{/ts}{else}{ts}This is a confirmation that your registration has been received and your status has been updated to registered.{/ts}{/if}\n  {/if}\n{/if}\n\n{if $isOnWaitlist}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}You have been added to the WAIT LIST for this event.{/ts}\n\n{if $isPrimary}\n{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $isRequireApproval}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Your registration has been submitted.{/ts}\n\n{if $isPrimary}\n{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}\n\n{/if}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{elseif $is_pay_later && !$isAmountzero && !$isAdditionalParticipant}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$pay_later_receipt}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{/if}\n\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Event Information and Location{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.event_title}\n{$event.event_start_date|date_format:\"%A\"} {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|date_format:\"%A\"} {$event.event_end_date|crmDate}{/if}{/if}\n{if $conference_sessions}\n\n\n{ts}Your schedule:{/ts}\n{assign var=\'group_by_day\' value=\'NA\'}\n{foreach from=$conference_sessions item=session}\n{if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n{assign var=\'group_by_day\' value=$session.start_date}\n\n{$group_by_day|date_format:\"%m/%d/%Y\"}\n\n\n{/if}\n{$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}\n{if $session.location}    {$session.location}{/if}\n{/foreach}\n{/if}\n\n{if $event.participant_role neq \'Attendee\' and $defaultRole}\n{ts}Participant Role{/ts}: {$event.participant_role}\n{/if}\n\n{if $isShowLocation}\n{$location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $location.phone.1.phone || $location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if} {if $phone.phone_ext} {ts}ext.{/ts} {$phone.phone_ext}{/if}\n{/foreach}\n{foreach from=$location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $payer.name}\nYou were registered by: {$payer.name}\n{/if}\n{if $event.is_monetary and not $isRequireApproval} {* This section for Paid events only.*}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$event.fee_label}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{if $lineItem}{foreach from=$lineItem item=value key=priceset}\n\n{if $value neq \'skip\'}\n{if $isPrimary}\n{if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n{ts 1=$priceset+1}Participant %1{/ts} {$part.$priceset.info}\n\n{/if}\n{/if}\n-----------------------------------------------------------{if $pricesetFieldsCount }-----------------------------------------------------{/if}\n\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{/if}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{if $pricesetFieldsCount }{capture assign=ts_participant_total}{ts}Total Participants{/ts}{/capture}{/if}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {/if} {$ts_total|string_format:\"%10s\"} {$ts_participant_total|string_format:\"%10s\"}\n-----------------------------------------------------------{if $pricesetFieldsCount }-----------------------------------------------------{/if}\n\n{foreach from=$value item=line}\n{if $pricesetFieldsCount }{capture assign=ts_participant_count}{$line.participant_count}{/capture}{/if}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney:$currency|string_format:\"%10s\"} {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}  {/if} {$line.line_total+$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}{$ts_participant_count|string_format:\"%10s\"}\n{/foreach}\n----------------------------------------------------------------------------------------------------------------\n{if $individual}{ts}Participant Total{/ts} {$individual.$priceset.totalAmtWithTax-$individual.$priceset.totalTaxAmt|crmMoney:$currency|string_format:\"%29s\"} {$individual.$priceset.totalTaxAmt|crmMoney:$currency|string_format:\"%33s\"} {$individual.$priceset.totalAmtWithTax|crmMoney:$currency|string_format:\"%12s\"}{/if}\n{/if}\n{\"\"|string_format:\"%120s\"}\n{/foreach}\n{\"\"|string_format:\"%120s\"}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$totalAmount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n{/if}\n\n{if $amounts && !$lineItem}\n{foreach from=$amounts item=amnt key=level}{$amnt.amount|crmMoney:$currency} {$amnt.label}\n{/foreach}\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n{if $isPrimary }\n\n{ts}Total Amount{/ts}: {$totalAmount|crmMoney:$currency} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n\n{if $pricesetFieldsCount }\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n      {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n      {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n\n{ts}Total Participants{/ts}: {$count}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$register_date|crmDate}\n{/if}\n{if $receive_date}\n{ts}Transaction Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $financialTypeName}\n{ts}Financial Type{/ts}: {$financialTypeName}\n{/if}\n{if $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n{/if}\n{if $paidBy}\n{ts}Paid By{/ts}: {$paidBy}\n{/if}\n{if $checkNumber}\n{ts}Check Number{/ts}: {$checkNumber}\n{/if}\n{if $billingName}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Billing Name and Address{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts}Credit Card Information{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n{/if} {* End of conditional section for Paid events *}\n\n{if $customPre}\n{foreach from=$customPre item=customPr key=i}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPre_grouptitle.$i}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPr item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $customPost}\n{foreach from=$customPost item=customPos key=j}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customPost_grouptitle.$j}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$customPos item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n{if $customProfile}\n\n{foreach from=$customProfile.profile item=eachParticipant key=participantID}\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{ts 1=$participantID+2}Participant Information - Participant %1{/ts}\n\n==========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$eachParticipant item=eachProfile key=pid}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{$customProfile.title.$pid}\n----------------------------------------------------------{if $pricesetFieldsCount }--------------------{/if}\n\n{foreach from=$eachProfile item=val key=field}\n{foreach from=$val item=v key=f}\n{$field}: {$v}\n{/foreach}\n{/foreach}\n{/foreach}\n{/foreach}\n{/if}\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{$customName}\n=========================================================={if $pricesetFieldsCount }===================={/if}\n\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $event.allow_selfcancelxfer }\n{ts 1=$selfcancelxfer_time 2=$selfservice_preposition}You may transfer your registration to another participant or cancel your registration up to %1 hours %2 the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}\n   {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n{ts}Transfer or cancel your registration:{/ts} {$selfService}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n{capture assign=tdfirstStyle}style=\"width: 180px; padding-bottom: 15px;\"{/capture}\n{capture assign=tdStyle}style=\"width: 100px;\"{/capture}\n{capture assign=participantTotal}style=\"margin: 0.5em 0 0.5em;padding: 0.5em;background-color: #999999;font-weight: bold;color: #FAFAFA;border-radius: 2px;\"{/capture}\n\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n    {if $event.confirm_email_text AND (not $isOnWaitlist AND not $isRequireApproval)}\n     <p>{$event.confirm_email_text|htmlize}</p>\n\n    {else}\n     <p>{ts}Thank you for your registration.{/ts}\n     {if $participant_status}{ts 1=$participant_status}This is a confirmation that your registration has been received and your status has been updated to <strong> %1</strong>.{/ts}\n     {else}{if $isOnWaitlist}{ts}This is a confirmation that your registration has been received and your status has been updated to <strong>waitlisted</strong>.{/ts}{else}{ts}This is a confirmation that your registration has been received and your status has been updated to <strong>registered<strong>.{/ts}{/if}{/if}</p>\n\n    {/if}\n\n    <p>\n    {if $isOnWaitlist}\n     <p>{ts}You have been added to the WAIT LIST for this event.{/ts}</p>\n     {if $isPrimary}\n       <p>{ts}If space becomes available you will receive an email with a link to a web page where you can complete your registration.{/ts}</p>\n     {/if}\n    {elseif $isRequireApproval}\n     <p>{ts}Your registration has been submitted.{/ts}</p>\n     {if $isPrimary}\n      <p>{ts}Once your registration has been reviewed, you will receive an email with a link to a web page where you can complete the registration process.{/ts}</p>\n     {/if}\n    {elseif $is_pay_later && !$isAmountzero && !$isAdditionalParticipant}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"width:100%; max-width:700px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|date_format:\"%A\"} {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|date_format:\"%A\"} {$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n\n\n     {if $conference_sessions}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n  {ts}Your schedule:{/ts}\n       </td>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n  {assign var=\'group_by_day\' value=\'NA\'}\n  {foreach from=$conference_sessions item=session}\n   {if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n    {assign var=\'group_by_day\' value=$session.start_date}\n          <em>{$group_by_day|date_format:\"%m/%d/%Y\"}</em><br />\n   {/if}\n   {$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}<br />\n   {if $session.location}&nbsp;&nbsp;&nbsp;&nbsp;{$session.location}<br />{/if}\n  {/foreach}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.participant_role neq \'Attendee\' and $defaultRole}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Participant Role{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$event.participant_role}\n       </td>\n      </tr>\n     {/if}\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $location.phone.1.phone || $location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}\n           {$phone.phone_type_display}\n          {else}\n           {ts}Phone{/ts}\n          {/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone} {if $phone.phone_ext}&nbsp;{ts}ext.{/ts} {$phone.phone_ext}{/if}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n    {if $event.is_share}\n        <tr>\n            <td colspan=\"2\" {$valueStyle}>\n                {capture assign=eventUrl}{crmURL p=\'civicrm/event/info\' q=\"id=`$event.id`&reset=1\" a=true fe=1 h=1}{/capture}\n                {include file=\"CRM/common/SocialNetwork.tpl\" emailMode=true url=$eventUrl title=$event.title pageURL=$eventUrl}\n            </td>\n        </tr>\n    {/if}\n    {if $payer.name}\n     <tr>\n       <th {$headerStyle}>\n         {ts}You were registered by:{/ts}\n       </th>\n     </tr>\n     <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$payer.name}\n       </td>\n     </tr>\n    {/if}\n    {if $event.is_monetary and not $isRequireApproval}\n\n      <tr>\n       <th {$headerStyle}>\n        {$event.fee_label}\n       </th>\n      </tr>\n\n      {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n        {if $value neq \'skip\'}\n         {if $isPrimary}\n          {if $lineItem|@count GT 1} {* Header for multi participant registration cases. *}\n           <tr>\n            <td colspan=\"2\" {$labelStyle}>\n             {ts 1=$priceset+1}Participant %1{/ts} {$part.$priceset.info}\n            </td>\n           </tr>\n          {/if}\n         {/if}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Qty{/ts}</th>\n             <th>{ts}Each{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n             {/if}\n             <th>{ts}Total{/ts}</th>\n       {if  $pricesetFieldsCount }<th>{ts}Total Participants{/ts}</th>{/if}\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td {$tdfirstStyle}>\n              {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td {$tdStyle} align=\"middle\">\n               {$line.qty}\n              </td>\n              <td {$tdStyle}>\n               {$line.unit_price|crmMoney:$currency}\n              </td>\n              {if $dataArray}\n               <td {$tdStyle}>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td {$tdStyle}>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td {$tdStyle}>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n              {/if}\n              <td {$tdStyle}>\n               {$line.line_total+$line.tax_amount|crmMoney:$currency}\n              </td>\n        {if $pricesetFieldsCount }<td {$tdStyle}>{$line.participant_count}</td> {/if}\n             </tr>\n            {/foreach}\n            {if $individual}\n              <tr {$participantTotal}>\n                <td colspan=3>{ts}Participant Total{/ts}</td>\n                <td colspan=2>{$individual.$priceset.totalAmtWithTax-$individual.$priceset.totalTaxAmt|crmMoney}</td>\n                <td colspan=1>{$individual.$priceset.totalTaxAmt|crmMoney}</td>\n                <td colspan=2>{$individual.$priceset.totalAmtWithTax|crmMoney}</td>\n              </tr>\n            {/if}\n           </table>\n          </td>\n         </tr>\n        {/if}\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts} Amount Before Tax: {/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalAmount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n          {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {else}\n           <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n          {/if}\n         </tr>\n        {/foreach}\n       {/if}\n      {/if}\n\n      {if $amounts && !$lineItem}\n       {foreach from=$amounts item=amnt key=level}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$amnt.amount|crmMoney:$currency} {$amnt.label}\n         </td>\n        </tr>\n       {/foreach}\n      {/if}\n\n    {if $totalTaxAmount}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Tax Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalTaxAmount|crmMoney:$currency}\n        </td>\n       </tr>\n      {/if}\n      {if $isPrimary}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$totalAmount|crmMoney:$currency} {if $hookDiscount.message}({$hookDiscount.message}){/if}\n        </td>\n       </tr>\n       {if $pricesetFieldsCount }\n     <tr>\n       <td {$labelStyle}>\n      {ts}Total Participants{/ts}</td>\n      <td {$valueStyle}>\n      {assign var=\"count\" value= 0}\n      {foreach from=$lineItem item=pcount}\n      {assign var=\"lineItemCount\" value=0}\n      {if $pcount neq \'skip\'}\n        {foreach from=$pcount item=p_count}\n        {assign var=\"lineItemCount\" value=$lineItemCount+$p_count.participant_count}\n        {/foreach}\n      {if $lineItemCount < 1 }\n        {assign var=\"lineItemCount\" value=1}\n      {/if}\n      {assign var=\"count\" value=$count+$lineItemCount}\n      {/if}\n      {/foreach}\n     {$count}\n     </td> </tr>\n      {/if}\n\n       {if $register_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Registration Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$register_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction Date{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n       {if $financialTypeName}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$financialTypeName}\n         </td>\n        </tr>\n       {/if}\n\n       {if $trxn_id}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Transaction #{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$trxn_id}\n         </td>\n        </tr>\n       {/if}\n\n       {if $paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n         {$paidBy}\n         </td>\n        </tr>\n       {/if}\n\n       {if $checkNumber}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Check Number{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$checkNumber}\n         </td>\n        </tr>\n       {/if}\n\n       {if $billingName}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Billing Name and Address{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}\n         </td>\n        </tr>\n       {/if}\n\n       {if $credit_card_type}\n        <tr>\n         <th {$headerStyle}>\n          {ts}Credit Card Information{/ts}\n         </th>\n        </tr>\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          {$credit_card_type}<br />\n          {$credit_card_number}<br />\n          {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n\n      {/if}\n\n     {/if} {* End of conditional section for Paid events *}\n\n\n{if $customPre}\n{foreach from=$customPre item=customPr key=i}\n   <tr> <th {$headerStyle}>{$customPre_grouptitle.$i}</th></tr>\n   {foreach from=$customPr item=customValue key=customName}\n   {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n     <tr>\n         <td {$labelStyle}>{$customName}</td>\n         <td {$valueStyle}>{$customValue}</td>\n     </tr>\n   {/if}\n   {/foreach}\n{/foreach}\n{/if}\n\n{if $customPost}\n{foreach from=$customPost item=customPos key=j}\n   <tr> <th {$headerStyle}>{$customPost_grouptitle.$j}</th></tr>\n   {foreach from=$customPos item=customValue key=customName}\n   {if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n     <tr>\n         <td {$labelStyle}>{$customName}</td>\n         <td {$valueStyle}>{$customValue}</td>\n     </tr>\n{/if}\n{/foreach}\n{/foreach}\n{/if}\n\n{if $customProfile}\n{foreach from=$customProfile.profile item=eachParticipant key=participantID}\n     <tr><th {$headerStyle}>{ts 1=$participantID+2}Participant %1{/ts} </th></tr>\n     {foreach from=$eachParticipant item=eachProfile key=pid}\n     <tr><th {$headerStyle}>{$customProfile.title.$pid}</th></tr>\n     {foreach from=$eachProfile item=val key=field}\n     <tr>{foreach from=$val item=v key=f}\n         <td {$labelStyle}>{$field}</td>\n         <td {$valueStyle}>{$v}</td>\n         {/foreach}\n     </tr>\n     {/foreach}\n{/foreach}\n{/foreach}\n{/if}\n\n    {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n    </table>\n    {if $event.allow_selfcancelxfer }\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n        {ts 1=$selfcancelxfer_time 2=$selfservice_preposition}You may transfer your registration to another participant or cancel your registration up to %1 hours %2 the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}<br />\n        {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n        <a href=\"{$selfService}\">{ts}Click here to transfer or cancel your registration.{/ts}</a>\n      </td>\n     </tr>\n    {/if}\n </table>\n</center>\n\n</body>\n</html>\n',1,835,'event_online_receipt',0,1,0,NULL),(33,'Events - Receipt only','Receipt for {if $events_in_cart} Event Registration{/if} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $is_pay_later}\n  This is being sent to you as an acknowledgement that you have registered one or more members for the following workshop, event or purchase. Please note, however, that the status of your payment is pending, and the registration for this event will not be completed until your payment is received.\n{else}\n  This is being sent to you as a {if $is_refund}confirmation of refund{else}receipt of payment made{/if} for the following workshop, event registration or purchase.\n{/if}\n\n{if $is_pay_later}\n  {$pay_later_receipt}\n{/if}\n\n  Your order number is #{$transaction_id}. {if $line_items && !$is_refund} Information about the workshops will be sent separately to each participant.{/if}\n Here\'s a summary of your transaction placed on {$transaction_date|date_format:\"%D %I:%M %p %Z\"}:\n\n{if $billing_name}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billing_name}\n\n{$billing_street_address}\n\n{$billing_city}, {$billing_state} {$billing_postal_code}\n\n{$email}\n{/if}\n\n{if $source}\n{$source}\n{/if}\n\n\n{foreach from=$line_items item=line_item}\n{$line_item.event->title} ({$line_item.event->start_date|date_format:\"%D\"})\n{if $line_item.event->is_show_location}\n  {$line_item.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n{$line_item.event->start_date|date_format:\"%D %I:%M %p\"} - {$line_item.event->end_date|date_format:\"%I:%M %p\"}\n\n  Quantity: {$line_item.num_participants}\n\n{if $line_item.num_participants > 0}\n  {foreach from=$line_item.participants item=participant}\n    {$participant.display_name}\n  {/foreach}\n{/if}\n{if $line_item.num_waiting_participants > 0}\n  Waitlisted:\n    {foreach from=$line_item.waiting_participants item=participant}\n      {$participant.display_name}\n    {/foreach}\n{/if}\nCost: {$line_item.cost|crmMoney:$currency|string_format:\"%10s\"}\nTotal For This Event: {$line_item.amount|crmMoney:$currency|string_format:\"%10s\"}\n\n{/foreach}\n\n{if $discounts}\nSubtotal: {$sub_total|crmMoney:$currency|string_format:\"%10s\"}\n--------------------------------------\nDiscounts\n{foreach from=$discounts key=myId item=i}\n  {$i.title}: -{$i.amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/if}\n======================================\nTotal: {$total|crmMoney:$currency|string_format:\"%10s\"}\n\n{if $credit_card_type}\n===========================================================\n{ts}Payment Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date.M}/{$credit_card_exp_date.Y}\n{/if}\n\n  If you have questions about the status of your registration or purchase please feel free to contact us.\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n    <title></title>\n  </head>\n  <body>\n    {capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n    {capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n    {capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $is_pay_later}\n      <p>\n        This is being sent to you as an acknowledgement that you have registered one or more members for the following workshop, event or purchase. Please note, however, that the status of your payment is pending, and the registration for this event will not be completed until your payment is received.\n      </p>\n    {else}\n      <p>\n        This is being sent to you as a {if $is_refund}confirmation of refund{else}receipt of payment made{/if} for the following workshop, event registration or purchase.\n      </p>\n    {/if}\n\n    {if $is_pay_later}\n      <p>{$pay_later_receipt}</p>\n    {/if}\n\n    <p>Your order number is #{$transaction_id}. {if $line_items && !$is_refund} Information about the workshops will be sent separately to each participant.{/if}\n  Here\'s a summary of your transaction placed on {$transaction_date|date_format:\"%D %I:%M %p %Z\"}:</p>\n\n{if $billing_name}\n  <table class=\"billing-info\">\n      <tr>\n    <th style=\"text-align: left;\">\n      {ts}Billing Name and Address{/ts}\n    </th>\n      </tr>\n      <tr>\n    <td>\n      {$billing_name}<br />\n      {$billing_street_address}<br />\n      {$billing_city}, {$billing_state} {$billing_postal_code}<br/>\n      <br/>\n      {$email}\n    </td>\n    </tr>\n    </table>\n{/if}\n{if $credit_card_type}\n  <p>&nbsp;</p>\n  <table class=\"billing-info\">\n      <tr>\n    <th style=\"text-align: left;\">\n      {ts}Credit Card Information{/ts}\n    </th>\n      </tr>\n      <tr>\n    <td>\n      {$credit_card_type}<br />\n      {$credit_card_number}<br />\n      {ts}Expires{/ts}: {$credit_card_exp_date.M}/{$credit_card_exp_date.Y}\n    </td>\n    </tr>\n    </table>\n{/if}\n{if $source}\n    <p>&nbsp;</p>\n    {$source}\n{/if}\n    <p>&nbsp;</p>\n    <table width=\"700\">\n      <thead>\n    <tr>\n{if $line_items}\n      <th style=\"text-align: left;\">\n      Event\n      </th>\n      <th style=\"text-align: left;\">\n      Participants\n      </th>\n{/if}\n      <th style=\"text-align: left;\">\n      Price\n      </th>\n      <th style=\"text-align: left;\">\n      Total\n      </th>\n    </tr>\n    </thead>\n      <tbody>\n  {foreach from=$line_items item=line_item}\n  <tr>\n    <td style=\"width: 220px\">\n      {$line_item.event->title} ({$line_item.event->start_date|date_format:\"%D\"})<br />\n      {if $line_item.event->is_show_location}\n        {$line_item.location.address.1.display|nl2br}\n      {/if}{*End of isShowLocation condition*}<br /><br />\n      {$line_item.event->start_date|date_format:\"%D %I:%M %p\"} - {$line_item.event->end_date|date_format:\"%I:%M %p\"}\n    </td>\n    <td style=\"width: 180px\">\n    {$line_item.num_participants}\n      {if $line_item.num_participants > 0}\n      <div class=\"participants\" style=\"padding-left: 10px;\">\n        {foreach from=$line_item.participants item=participant}\n        {$participant.display_name}<br />\n        {/foreach}\n      </div>\n      {/if}\n      {if $line_item.num_waiting_participants > 0}\n      Waitlisted:<br/>\n      <div class=\"participants\" style=\"padding-left: 10px;\">\n        {foreach from=$line_item.waiting_participants item=participant}\n        {$participant.display_name}<br />\n        {/foreach}\n      </div>\n      {/if}\n    </td>\n    <td style=\"width: 100px\">\n      {$line_item.cost|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n    <td style=\"width: 100px\">\n      &nbsp;{$line_item.amount|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n  </tr>\n  {/foreach}\n      </tbody>\n      <tfoot>\n  {if $discounts}\n  <tr>\n    <td>\n    </td>\n    <td>\n    </td>\n    <td>\n      Subtotal:\n    </td>\n    <td>\n      &nbsp;{$sub_total|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n  </tr>\n  {foreach from=$discounts key=myId item=i}\n  <tr>\n    <td>\n      {$i.title}\n    </td>\n    <td>\n    </td>\n    <td>\n    </td>\n    <td>\n      -{$i.amount}\n    </td>\n  </tr>\n  {/foreach}\n  {/if}\n  <tr>\n{if $line_items}\n    <td>\n    </td>\n    <td>\n    </td>\n{/if}\n    <td>\n      <strong>Total:</strong>\n    </td>\n    <td>\n      <strong>&nbsp;{$total|crmMoney:$currency|string_format:\"%10s\"}</strong>\n    </td>\n  </tr>\n      </tfoot>\n    </table>\n\n    If you have questions about the status of your registration or purchase please feel free to contact us.\n  </body>\n</html>\n',1,836,'event_registration_receipt',1,0,0,NULL),(34,'Events - Receipt only','Receipt for {if $events_in_cart} Event Registration{/if} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $is_pay_later}\n  This is being sent to you as an acknowledgement that you have registered one or more members for the following workshop, event or purchase. Please note, however, that the status of your payment is pending, and the registration for this event will not be completed until your payment is received.\n{else}\n  This is being sent to you as a {if $is_refund}confirmation of refund{else}receipt of payment made{/if} for the following workshop, event registration or purchase.\n{/if}\n\n{if $is_pay_later}\n  {$pay_later_receipt}\n{/if}\n\n  Your order number is #{$transaction_id}. {if $line_items && !$is_refund} Information about the workshops will be sent separately to each participant.{/if}\n Here\'s a summary of your transaction placed on {$transaction_date|date_format:\"%D %I:%M %p %Z\"}:\n\n{if $billing_name}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billing_name}\n\n{$billing_street_address}\n\n{$billing_city}, {$billing_state} {$billing_postal_code}\n\n{$email}\n{/if}\n\n{if $source}\n{$source}\n{/if}\n\n\n{foreach from=$line_items item=line_item}\n{$line_item.event->title} ({$line_item.event->start_date|date_format:\"%D\"})\n{if $line_item.event->is_show_location}\n  {$line_item.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n{$line_item.event->start_date|date_format:\"%D %I:%M %p\"} - {$line_item.event->end_date|date_format:\"%I:%M %p\"}\n\n  Quantity: {$line_item.num_participants}\n\n{if $line_item.num_participants > 0}\n  {foreach from=$line_item.participants item=participant}\n    {$participant.display_name}\n  {/foreach}\n{/if}\n{if $line_item.num_waiting_participants > 0}\n  Waitlisted:\n    {foreach from=$line_item.waiting_participants item=participant}\n      {$participant.display_name}\n    {/foreach}\n{/if}\nCost: {$line_item.cost|crmMoney:$currency|string_format:\"%10s\"}\nTotal For This Event: {$line_item.amount|crmMoney:$currency|string_format:\"%10s\"}\n\n{/foreach}\n\n{if $discounts}\nSubtotal: {$sub_total|crmMoney:$currency|string_format:\"%10s\"}\n--------------------------------------\nDiscounts\n{foreach from=$discounts key=myId item=i}\n  {$i.title}: -{$i.amount|crmMoney:$currency|string_format:\"%10s\"}\n{/foreach}\n{/if}\n======================================\nTotal: {$total|crmMoney:$currency|string_format:\"%10s\"}\n\n{if $credit_card_type}\n===========================================================\n{ts}Payment Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date.M}/{$credit_card_exp_date.Y}\n{/if}\n\n  If you have questions about the status of your registration or purchase please feel free to contact us.\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <head>\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n    <title></title>\n  </head>\n  <body>\n    {capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n    {capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n    {capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $is_pay_later}\n      <p>\n        This is being sent to you as an acknowledgement that you have registered one or more members for the following workshop, event or purchase. Please note, however, that the status of your payment is pending, and the registration for this event will not be completed until your payment is received.\n      </p>\n    {else}\n      <p>\n        This is being sent to you as a {if $is_refund}confirmation of refund{else}receipt of payment made{/if} for the following workshop, event registration or purchase.\n      </p>\n    {/if}\n\n    {if $is_pay_later}\n      <p>{$pay_later_receipt}</p>\n    {/if}\n\n    <p>Your order number is #{$transaction_id}. {if $line_items && !$is_refund} Information about the workshops will be sent separately to each participant.{/if}\n  Here\'s a summary of your transaction placed on {$transaction_date|date_format:\"%D %I:%M %p %Z\"}:</p>\n\n{if $billing_name}\n  <table class=\"billing-info\">\n      <tr>\n    <th style=\"text-align: left;\">\n      {ts}Billing Name and Address{/ts}\n    </th>\n      </tr>\n      <tr>\n    <td>\n      {$billing_name}<br />\n      {$billing_street_address}<br />\n      {$billing_city}, {$billing_state} {$billing_postal_code}<br/>\n      <br/>\n      {$email}\n    </td>\n    </tr>\n    </table>\n{/if}\n{if $credit_card_type}\n  <p>&nbsp;</p>\n  <table class=\"billing-info\">\n      <tr>\n    <th style=\"text-align: left;\">\n      {ts}Credit Card Information{/ts}\n    </th>\n      </tr>\n      <tr>\n    <td>\n      {$credit_card_type}<br />\n      {$credit_card_number}<br />\n      {ts}Expires{/ts}: {$credit_card_exp_date.M}/{$credit_card_exp_date.Y}\n    </td>\n    </tr>\n    </table>\n{/if}\n{if $source}\n    <p>&nbsp;</p>\n    {$source}\n{/if}\n    <p>&nbsp;</p>\n    <table width=\"700\">\n      <thead>\n    <tr>\n{if $line_items}\n      <th style=\"text-align: left;\">\n      Event\n      </th>\n      <th style=\"text-align: left;\">\n      Participants\n      </th>\n{/if}\n      <th style=\"text-align: left;\">\n      Price\n      </th>\n      <th style=\"text-align: left;\">\n      Total\n      </th>\n    </tr>\n    </thead>\n      <tbody>\n  {foreach from=$line_items item=line_item}\n  <tr>\n    <td style=\"width: 220px\">\n      {$line_item.event->title} ({$line_item.event->start_date|date_format:\"%D\"})<br />\n      {if $line_item.event->is_show_location}\n        {$line_item.location.address.1.display|nl2br}\n      {/if}{*End of isShowLocation condition*}<br /><br />\n      {$line_item.event->start_date|date_format:\"%D %I:%M %p\"} - {$line_item.event->end_date|date_format:\"%I:%M %p\"}\n    </td>\n    <td style=\"width: 180px\">\n    {$line_item.num_participants}\n      {if $line_item.num_participants > 0}\n      <div class=\"participants\" style=\"padding-left: 10px;\">\n        {foreach from=$line_item.participants item=participant}\n        {$participant.display_name}<br />\n        {/foreach}\n      </div>\n      {/if}\n      {if $line_item.num_waiting_participants > 0}\n      Waitlisted:<br/>\n      <div class=\"participants\" style=\"padding-left: 10px;\">\n        {foreach from=$line_item.waiting_participants item=participant}\n        {$participant.display_name}<br />\n        {/foreach}\n      </div>\n      {/if}\n    </td>\n    <td style=\"width: 100px\">\n      {$line_item.cost|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n    <td style=\"width: 100px\">\n      &nbsp;{$line_item.amount|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n  </tr>\n  {/foreach}\n      </tbody>\n      <tfoot>\n  {if $discounts}\n  <tr>\n    <td>\n    </td>\n    <td>\n    </td>\n    <td>\n      Subtotal:\n    </td>\n    <td>\n      &nbsp;{$sub_total|crmMoney:$currency|string_format:\"%10s\"}\n    </td>\n  </tr>\n  {foreach from=$discounts key=myId item=i}\n  <tr>\n    <td>\n      {$i.title}\n    </td>\n    <td>\n    </td>\n    <td>\n    </td>\n    <td>\n      -{$i.amount}\n    </td>\n  </tr>\n  {/foreach}\n  {/if}\n  <tr>\n{if $line_items}\n    <td>\n    </td>\n    <td>\n    </td>\n{/if}\n    <td>\n      <strong>Total:</strong>\n    </td>\n    <td>\n      <strong>&nbsp;{$total|crmMoney:$currency|string_format:\"%10s\"}</strong>\n    </td>\n  </tr>\n      </tfoot>\n    </table>\n\n    If you have questions about the status of your registration or purchase please feel free to contact us.\n  </body>\n</html>\n',1,836,'event_registration_receipt',0,1,0,NULL),(35,'Events - Registration Cancellation Notice','{ts 1=$event.event_title}Event Registration Cancelled for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}Your Event Registration has been cancelled.{/ts}\n\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Your Event Registration has been cancelled.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,837,'participant_cancelled',1,0,0,NULL),(36,'Events - Registration Cancellation Notice','{ts 1=$event.event_title}Event Registration Cancelled for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}Your Event Registration has been cancelled.{/ts}\n\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Your Event Registration has been cancelled.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,837,'participant_cancelled',0,1,0,NULL),(37,'Events - Registration Confirmation Invite','{ts 1=$event.event_title}Confirm your registration for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}This is an invitation to complete your registration that was initially waitlisted.{/ts}\n\n{if !$isAdditional and $participant.id}\n\n===========================================================\n{ts}Confirm Your Registration{/ts}\n\n===========================================================\n{capture assign=confirmUrl}{crmURL p=\'civicrm/event/confirm\' q=\"reset=1&participantId=`$participant.id`&cs=`$checksumValue`\" a=true h=0 fe=1}{/capture}\nClick this link to go to a web page where you can confirm your registration online:\n{$confirmUrl}\n{/if}\n{if $event.allow_selfcancelxfer }\n{ts 1=$selfcancelxfer_time 2=$selfservice_preposition}You may transfer your registration to another participant or cancel your registration up to %1 hours %2 the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}\n   {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n{ts}Transfer or cancel your registration:{/ts} {$selfService}\n{/if}\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n{if $conference_sessions}\n\n\n{ts}Your schedule:{/ts}\n{assign var=\'group_by_day\' value=\'NA\'}\n{foreach from=$conference_sessions item=session}\n{if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n{assign var=\'group_by_day\' value=$session.start_date}\n\n{$group_by_day|date_format:\"%m/%d/%Y\"}\n\n\n{/if}\n{$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}\n{if $session.location}    {$session.location}{/if}\n{/foreach}\n{/if}\n\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}This is an invitation to complete your registration that was initially waitlisted.{/ts}</p>\n   </td>\n  </tr>\n  {if !$isAdditional and $participant.id}\n   <tr>\n    <th {$headerStyle}>\n     {ts}Confirm Your Registration{/ts}\n    </th>\n   </tr>\n   <tr>\n    <td colspan=\"2\" {$valueStyle}>\n     {capture assign=confirmUrl}{crmURL p=\'civicrm/event/confirm\' q=\"reset=1&participantId=`$participant.id`&cs=`$checksumValue`\" a=true h=0 fe=1}{/capture}\n     <a href=\"{$confirmUrl}\">{ts}Click here to confirm and complete your registration{/ts}</a>\n    </td>\n   </tr>\n  {/if}\n  {if $event.allow_selfcancelxfer }\n  {ts}This event allows for{/ts}\n  {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\" h=0 a=1 fe=1}{/capture}\n       <a href=\"{$selfService}\"> {ts}self service cancel or transfer{/ts}</a>\n  {/if}\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     {if $conference_sessions}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n  {ts}Your schedule:{/ts}\n       </td>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n  {assign var=\'group_by_day\' value=\'NA\'}\n  {foreach from=$conference_sessions item=session}\n   {if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n    {assign var=\'group_by_day\' value=$session.start_date}\n          <em>{$group_by_day|date_format:\"%m/%d/%Y\"}</em><br />\n   {/if}\n   {$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}<br />\n   {if $session.location}&nbsp;&nbsp;&nbsp;&nbsp;{$session.location}<br />{/if}\n  {/foreach}\n       </td>\n      </tr>\n     {/if}\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n  {if $event.allow_selfcancelxfer }\n   <tr>\n     <td colspan=\"2\" {$valueStyle}>\n       {ts 1=$selfcancelxfer_time 2=$selfservice_preposition}You may transfer your registration to another participant or cancel your registration up to %1 hours %2 the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}<br />\n         {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n       <a href=\"{$selfService}\">{ts}Click here to transfer or cancel your registration.{/ts}</a>\n     </td>\n   </tr>\n  {/if}\n  <tr>\n   <td colspan=\"2\" {$valueStyle}>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,838,'participant_confirm',1,0,0,NULL),(38,'Events - Registration Confirmation Invite','{ts 1=$event.event_title}Confirm your registration for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts}This is an invitation to complete your registration that was initially waitlisted.{/ts}\n\n{if !$isAdditional and $participant.id}\n\n===========================================================\n{ts}Confirm Your Registration{/ts}\n\n===========================================================\n{capture assign=confirmUrl}{crmURL p=\'civicrm/event/confirm\' q=\"reset=1&participantId=`$participant.id`&cs=`$checksumValue`\" a=true h=0 fe=1}{/capture}\nClick this link to go to a web page where you can confirm your registration online:\n{$confirmUrl}\n{/if}\n{if $event.allow_selfcancelxfer }\n{ts 1=$selfcancelxfer_time 2=$selfservice_preposition}You may transfer your registration to another participant or cancel your registration up to %1 hours %2 the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}\n   {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n{ts}Transfer or cancel your registration:{/ts} {$selfService}\n{/if}\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n{if $conference_sessions}\n\n\n{ts}Your schedule:{/ts}\n{assign var=\'group_by_day\' value=\'NA\'}\n{foreach from=$conference_sessions item=session}\n{if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n{assign var=\'group_by_day\' value=$session.start_date}\n\n{$group_by_day|date_format:\"%m/%d/%Y\"}\n\n\n{/if}\n{$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}\n{if $session.location}    {$session.location}{/if}\n{/foreach}\n{/if}\n\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $event.is_public}\n{capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n{ts}Download iCalendar File:{/ts} {$icalFeed}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}This is an invitation to complete your registration that was initially waitlisted.{/ts}</p>\n   </td>\n  </tr>\n  {if !$isAdditional and $participant.id}\n   <tr>\n    <th {$headerStyle}>\n     {ts}Confirm Your Registration{/ts}\n    </th>\n   </tr>\n   <tr>\n    <td colspan=\"2\" {$valueStyle}>\n     {capture assign=confirmUrl}{crmURL p=\'civicrm/event/confirm\' q=\"reset=1&participantId=`$participant.id`&cs=`$checksumValue`\" a=true h=0 fe=1}{/capture}\n     <a href=\"{$confirmUrl}\">{ts}Click here to confirm and complete your registration{/ts}</a>\n    </td>\n   </tr>\n  {/if}\n  {if $event.allow_selfcancelxfer }\n  {ts}This event allows for{/ts}\n  {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\" h=0 a=1 fe=1}{/capture}\n       <a href=\"{$selfService}\"> {ts}self service cancel or transfer{/ts}</a>\n  {/if}\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     {if $conference_sessions}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n  {ts}Your schedule:{/ts}\n       </td>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n  {assign var=\'group_by_day\' value=\'NA\'}\n  {foreach from=$conference_sessions item=session}\n   {if $session.start_date|date_format:\"%Y/%m/%d\" != $group_by_day|date_format:\"%Y/%m/%d\"}\n    {assign var=\'group_by_day\' value=$session.start_date}\n          <em>{$group_by_day|date_format:\"%m/%d/%Y\"}</em><br />\n   {/if}\n   {$session.start_date|crmDate:0:1}{if $session.end_date}-{$session.end_date|crmDate:0:1}{/if} {$session.title}<br />\n   {if $session.location}&nbsp;&nbsp;&nbsp;&nbsp;{$session.location}<br />{/if}\n  {/foreach}\n       </td>\n      </tr>\n     {/if}\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $event.is_public}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {capture assign=icalFeed}{crmURL p=\'civicrm/event/ical\' q=\"reset=1&id=`$event.id`\" h=0 a=1 fe=1}{/capture}\n        <a href=\"{$icalFeed}\">{ts}Download iCalendar File{/ts}</a>\n       </td>\n      </tr>\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n  {if $event.allow_selfcancelxfer }\n   <tr>\n     <td colspan=\"2\" {$valueStyle}>\n       {ts 1=$selfcancelxfer_time 2=$selfservice_preposition}You may transfer your registration to another participant or cancel your registration up to %1 hours %2 the event.{/ts} {if $totalAmount}{ts}Cancellations are not refundable.{/ts}{/if}<br />\n         {capture assign=selfService}{crmURL p=\'civicrm/event/selfsvcupdate\' q=\"reset=1&pid=`$participant.id`&{contact.checksum}\"  h=0 a=1 fe=1}{/capture}\n       <a href=\"{$selfService}\">{ts}Click here to transfer or cancel your registration.{/ts}</a>\n     </td>\n   </tr>\n  {/if}\n  <tr>\n   <td colspan=\"2\" {$valueStyle}>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,838,'participant_confirm',0,1,0,NULL),(39,'Events - Pending Registration Expiration Notice','{ts 1=$event.event_title}Event registration has expired for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$event.event_title}Your pending event registration for %1 has expired\nbecause you did not confirm your registration.{/ts}\n\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor want to inquire about reinstating your registration for this event.{/ts}\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$event.event_title}Your pending event registration for %1 has expired\nbecause you did not confirm your registration.{/ts}</p>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor want to inquire about reinstating your registration for this event.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,839,'participant_expired',1,0,0,NULL),(40,'Events - Pending Registration Expiration Notice','{ts 1=$event.event_title}Event registration has expired for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$event.event_title}Your pending event registration for %1 has expired\nbecause you did not confirm your registration.{/ts}\n\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor want to inquire about reinstating your registration for this event.{/ts}\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$event.event_title}Your pending event registration for %1 has expired\nbecause you did not confirm your registration.{/ts}</p>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor want to inquire about reinstating your registration for this event.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,839,'participant_expired',0,1,0,NULL),(41,'Events - Registration Transferred Notice','{ts 1=$event.event_title}Event Registration Transferred for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$to_participant}Your Event Registration has been transferred to %1.{/ts}\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$to_participant}Your Event Registration has been Transferred to %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,840,'participant_transferred',1,0,0,NULL),(42,'Events - Registration Transferred Notice','{ts 1=$event.event_title}Event Registration Transferred for %1{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$to_participant}Your Event Registration has been transferred to %1.{/ts}\n\n===========================================================\n{ts}Event Information and Location{/ts}\n\n===========================================================\n{$event.event_title}\n{$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n\n{ts}Participant Role{/ts}: {$participant.role}\n\n{if $isShowLocation}\n{$event.location.address.1.display|strip_tags:false}\n{/if}{*End of isShowLocation condition*}\n\n{if $event.location.phone.1.phone || $event.location.email.1.email}\n\n{ts}Event Contacts:{/ts}\n{foreach from=$event.location.phone item=phone}\n{if $phone.phone}\n\n{if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}: {$phone.phone}{/if}\n{/foreach}\n{foreach from=$event.location.email item=eventEmail}\n{if $eventEmail.email}\n\n{ts}Email{/ts}: {$eventEmail.email}{/if}{/foreach}\n{/if}\n\n{if $contact.email}\n\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$contact.email}\n{/if}\n\n{if $register_date}\n{ts}Registration Date{/ts}: {$participant.register_date|crmDate}\n{/if}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$to_participant}Your Event Registration has been Transferred to %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Event Information and Location{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       {$event.event_title}<br />\n       {$event.event_start_date|crmDate}{if $event.event_end_date}-{if $event.event_end_date|date_format:\"%Y%m%d\" == $event.event_start_date|date_format:\"%Y%m%d\"}{$event.event_end_date|crmDate:0:1}{else}{$event.event_end_date|crmDate}{/if}{/if}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Participant Role{/ts}:\n      </td>\n      <td {$valueStyle}>\n       {$participant.role}\n      </td>\n     </tr>\n\n     {if $isShowLocation}\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$event.location.address.1.display|nl2br}\n       </td>\n      </tr>\n     {/if}\n\n     {if $event.location.phone.1.phone || $event.location.email.1.email}\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {ts}Event Contacts:{/ts}\n       </td>\n      </tr>\n      {foreach from=$event.location.phone item=phone}\n       {if $phone.phone}\n        <tr>\n         <td {$labelStyle}>\n          {if $phone.phone_type}{$phone.phone_type_display}{else}{ts}Phone{/ts}{/if}\n         </td>\n         <td {$valueStyle}>\n          {$phone.phone}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n      {foreach from=$event.location.email item=eventEmail}\n       {if $eventEmail.email}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Email{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$eventEmail.email}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $contact.email}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Registered Email{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$contact.email}\n       </td>\n      </tr>\n     {/if}\n\n     {if $register_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Registration Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$participant.register_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,840,'participant_transferred',0,1,0,NULL),(43,'Tell-a-Friend Email','{ts 1=$senderContactName 2=$title}%1 wants you to know about %2{/ts}\n','{$senderMessage}\n\n{if $generalLink}{ts}For more information, visit:{/ts}\n>> {$generalLink}\n\n{/if}\n{if $contribute}{ts}To make a contribution, go to:{/ts}\n>> {$pageURL}\n\n{/if}\n{if $event}{ts}To find out more about this event, go to:{/ts}\n>> {$pageURL}\n{/if}\n\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <p>{$senderMessage}</p>\n    {if $generalLink}\n     <p><a href=\"{$generalLink}\">{ts}More information{/ts}</a></p>\n    {/if}\n    {if $contribute}\n     <p><a href=\"{$pageURL}\">{ts}Make a contribution{/ts}</a></p>\n    {/if}\n    {if $event}\n     <p><a href=\"{$pageURL}\">{ts}Find out more about this event{/ts}</a></p>\n    {/if}\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,841,'friend',1,0,0,NULL),(44,'Tell-a-Friend Email','{ts 1=$senderContactName 2=$title}%1 wants you to know about %2{/ts}\n','{$senderMessage}\n\n{if $generalLink}{ts}For more information, visit:{/ts}\n>> {$generalLink}\n\n{/if}\n{if $contribute}{ts}To make a contribution, go to:{/ts}\n>> {$pageURL}\n\n{/if}\n{if $event}{ts}To find out more about this event, go to:{/ts}\n>> {$pageURL}\n{/if}\n\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <p>{$senderMessage}</p>\n    {if $generalLink}\n     <p><a href=\"{$generalLink}\">{ts}More information{/ts}</a></p>\n    {/if}\n    {if $contribute}\n     <p><a href=\"{$pageURL}\">{ts}Make a contribution{/ts}</a></p>\n    {/if}\n    {if $event}\n     <p><a href=\"{$pageURL}\">{ts}Find out more about this event{/ts}</a></p>\n    {/if}\n   </td>\n  </tr>\n </table>\n</center>\n\n</body>\n</html>\n',1,841,'friend',0,1,0,NULL),(45,'Memberships - Signup and Renewal Receipts (off-line)','{if $receiptType EQ \'membership signup\'}\n{ts}Membership Confirmation and Receipt{/ts}\n{elseif $receiptType EQ \'membership renewal\'}\n{ts}Membership Renewal Confirmation and Receipt{/ts}\n{/if} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $formValues.receipt_text_signup}\n{$formValues.receipt_text_signup}\n{elseif $formValues.receipt_text_renewal}\n{$formValues.receipt_text_renewal}\n{else}{ts}Thank you for this contribution.{/ts}{/if}\n\n{if !$lineItem}\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Type{/ts}: {$membership_name}\n{/if}\n{if ! $cancelled}\n{if !$lineItem}\n{ts}Membership Start Date{/ts}: {$mem_start_date}\n{ts}Membership End Date{/ts}: {$mem_end_date}\n{/if}\n\n{if $formValues.total_amount OR $formValues.total_amount eq 0 }\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{if $formValues.contributionType_name}\n{ts}Financial Type{/ts}: {$formValues.contributionType_name}\n{/if}\n{if $lineItem}\n{foreach from=$lineItem item=value key=priceset}\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_total}{ts}Fee{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{/if}\n{capture assign=ts_start_date}{ts}Membership Start Date{/ts}{/capture}\n{capture assign=ts_end_date}{ts}Membership End Date{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_total|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"} {/if} {$ts_start_date|string_format:\"%20s\"} {$ts_end_date|string_format:\"%20s\"}\n--------------------------------------------------------------------------------------------------\n\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}  {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}  {else}                  {/if}   {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {/if} {$line.start_date|string_format:\"%20s\"} {$line.end_date|string_format:\"%20s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset}\n{$taxTerm} {$priceset|string_format:\"%.2f\"} %: {$value|crmMoney:$currency}\n{elseif  $priceset == 0}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n--------------------------------------------------------------------------------------------------\n{/if}\n\n{if isset($totalTaxAmount)}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Amount{/ts}: {$formValues.total_amount|crmMoney}\n{if $receive_date}\n{ts}Date Received{/ts}: {$receive_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $formValues.paidBy}\n{ts}Paid By{/ts}: {$formValues.paidBy}\n{if $formValues.check_number}\n{ts}Check Number{/ts}: {$formValues.check_number}\n{/if}\n{/if}\n{/if}\n{/if}\n\n{if $isPrimary }\n{if $billingName}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n\n{if $customValues}\n===========================================================\n{ts}Membership Options{/ts}\n\n===========================================================\n{foreach from=$customValues item=value key=customName}\n {$customName} : {$value}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $formValues.receipt_text_signup}\n     <p>{$formValues.receipt_text_signup|htmlize}</p>\n    {elseif $formValues.receipt_text_renewal}\n     <p>{$formValues.receipt_text_renewal|htmlize}</p>\n    {else}\n     <p>{ts}Thank you for this contribution.{/ts}</p>\n    {/if}\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     {if !$lineItem}\n     <tr>\n      <th {$headerStyle}>\n       {ts}Membership Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Membership Type{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$membership_name}\n      </td>\n     </tr>\n     {/if}\n     {if ! $cancelled}\n     {if !$lineItem}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Start Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$mem_start_date}\n       </td>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership End Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$mem_end_date}\n       </td>\n      </tr>\n      {/if}\n      {if $formValues.total_amount OR $formValues.total_amount eq 0 }\n       <tr>\n        <th {$headerStyle}>\n         {ts}Membership Fee{/ts}\n        </th>\n       </tr>\n       {if $formValues.contributionType_name}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.contributionType_name}\n         </td>\n        </tr>\n       {/if}\n\n       {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Fee{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n              <th>{ts}Total{/ts}</th>\n             {/if}\n       <th>{ts}Membership Start Date{/ts}</th>\n       <th>{ts}Membership End Date{/ts}</th>\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td>\n        {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td>\n               {$line.line_total|crmMoney}\n              </td>\n              {if $dataArray}\n               <td>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n               <td>\n                {$line.line_total+$line.tax_amount|crmMoney}\n               </td>\n              {/if}\n              <td>\n               {$line.start_date}\n              </td>\n        <td>\n               {$line.end_date}\n              </td>\n             </tr>\n            {/foreach}\n           </table>\n          </td>\n         </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.total_amount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n       {foreach from=$dataArray item=value key=priceset}\n        <tr>\n        {if $priceset}\n         <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n         <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {elseif  $priceset == 0}\n         <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n         <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {/if}\n        </tr>\n       {/foreach}\n      {/if}\n      {/if}\n      {if isset($totalTaxAmount)}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.total_amount|crmMoney}\n        </td>\n       </tr>\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Date Received{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|truncate:10:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n       {if $formValues.paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.paidBy}\n         </td>\n        </tr>\n        {if $formValues.check_number}\n         <tr>\n          <td {$labelStyle}>\n           {ts}Check Number{/ts}\n          </td>\n          <td {$valueStyle}>\n           {$formValues.check_number}\n          </td>\n         </tr>\n        {/if}\n       {/if}\n      {/if}\n     {/if}\n    </table>\n   </td>\n  </tr>\n\n  {if $isPrimary}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n\n      {if $billingName}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td {$labelStyle}>\n         {$billingName}<br />\n         {$address}\n        </td>\n       </tr>\n      {/if}\n\n      {if $credit_card_type}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Credit Card Information{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td {$valueStyle}>\n         {$credit_card_type}<br />\n         {$credit_card_number}\n        </td>\n       </tr>\n       <tr>\n        <td {$labelStyle}>\n         {ts}Expires{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n        </td>\n       </tr>\n      {/if}\n\n     </table>\n    </td>\n   </tr>\n  {/if}\n\n  {if $customValues}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Options{/ts}\n       </th>\n      </tr>\n      {foreach from=$customValues item=value key=customName}\n       <tr>\n        <td {$labelStyle}>\n         {$customName}\n        </td>\n        <td {$valueStyle}>\n         {$value}\n        </td>\n       </tr>\n      {/foreach}\n     </table>\n    </td>\n   </tr>\n  {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,842,'membership_offline_receipt',1,0,0,NULL),(46,'Memberships - Signup and Renewal Receipts (off-line)','{if $receiptType EQ \'membership signup\'}\n{ts}Membership Confirmation and Receipt{/ts}\n{elseif $receiptType EQ \'membership renewal\'}\n{ts}Membership Renewal Confirmation and Receipt{/ts}\n{/if} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{if $formValues.receipt_text_signup}\n{$formValues.receipt_text_signup}\n{elseif $formValues.receipt_text_renewal}\n{$formValues.receipt_text_renewal}\n{else}{ts}Thank you for this contribution.{/ts}{/if}\n\n{if !$lineItem}\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Type{/ts}: {$membership_name}\n{/if}\n{if ! $cancelled}\n{if !$lineItem}\n{ts}Membership Start Date{/ts}: {$mem_start_date}\n{ts}Membership End Date{/ts}: {$mem_end_date}\n{/if}\n\n{if $formValues.total_amount OR $formValues.total_amount eq 0 }\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{if $formValues.contributionType_name}\n{ts}Financial Type{/ts}: {$formValues.contributionType_name}\n{/if}\n{if $lineItem}\n{foreach from=$lineItem item=value key=priceset}\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_total}{ts}Fee{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{/if}\n{capture assign=ts_start_date}{ts}Membership Start Date{/ts}{/capture}\n{capture assign=ts_end_date}{ts}Membership End Date{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_total|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"} {/if} {$ts_start_date|string_format:\"%20s\"} {$ts_end_date|string_format:\"%20s\"}\n--------------------------------------------------------------------------------------------------\n\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}  {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"}  {else}                  {/if}   {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {/if} {$line.start_date|string_format:\"%20s\"} {$line.end_date|string_format:\"%20s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$formValues.total_amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset}\n{$taxTerm} {$priceset|string_format:\"%.2f\"} %: {$value|crmMoney:$currency}\n{elseif  $priceset == 0}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n--------------------------------------------------------------------------------------------------\n{/if}\n\n{if isset($totalTaxAmount)}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Amount{/ts}: {$formValues.total_amount|crmMoney}\n{if $receive_date}\n{ts}Date Received{/ts}: {$receive_date|truncate:10:\'\'|crmDate}\n{/if}\n{if $formValues.paidBy}\n{ts}Paid By{/ts}: {$formValues.paidBy}\n{if $formValues.check_number}\n{ts}Check Number{/ts}: {$formValues.check_number}\n{/if}\n{/if}\n{/if}\n{/if}\n\n{if $isPrimary }\n{if $billingName}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n{/if}\n\n{if $credit_card_type}\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n{/if}\n\n{if $customValues}\n===========================================================\n{ts}Membership Options{/ts}\n\n===========================================================\n{foreach from=$customValues item=value key=customName}\n {$customName} : {$value}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $formValues.receipt_text_signup}\n     <p>{$formValues.receipt_text_signup|htmlize}</p>\n    {elseif $formValues.receipt_text_renewal}\n     <p>{$formValues.receipt_text_renewal|htmlize}</p>\n    {else}\n     <p>{ts}Thank you for this contribution.{/ts}</p>\n    {/if}\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     {if !$lineItem}\n     <tr>\n      <th {$headerStyle}>\n       {ts}Membership Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Membership Type{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$membership_name}\n      </td>\n     </tr>\n     {/if}\n     {if ! $cancelled}\n     {if !$lineItem}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Start Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$mem_start_date}\n       </td>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership End Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$mem_end_date}\n       </td>\n      </tr>\n      {/if}\n      {if $formValues.total_amount OR $formValues.total_amount eq 0 }\n       <tr>\n        <th {$headerStyle}>\n         {ts}Membership Fee{/ts}\n        </th>\n       </tr>\n       {if $formValues.contributionType_name}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Financial Type{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.contributionType_name}\n         </td>\n        </tr>\n       {/if}\n\n       {if $lineItem}\n       {foreach from=$lineItem item=value key=priceset}\n         <tr>\n          <td colspan=\"2\" {$valueStyle}>\n           <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n            <tr>\n             <th>{ts}Item{/ts}</th>\n             <th>{ts}Fee{/ts}</th>\n             {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n              <th>{ts}Total{/ts}</th>\n             {/if}\n       <th>{ts}Membership Start Date{/ts}</th>\n       <th>{ts}Membership End Date{/ts}</th>\n            </tr>\n            {foreach from=$value item=line}\n             <tr>\n              <td>\n        {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n              </td>\n              <td>\n               {$line.line_total|crmMoney}\n              </td>\n              {if $dataArray}\n               <td>\n                {$line.unit_price*$line.qty|crmMoney}\n               </td>\n               {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n                <td>\n                 {$line.tax_rate|string_format:\"%.2f\"}%\n                </td>\n                <td>\n                 {$line.tax_amount|crmMoney}\n                </td>\n               {else}\n                <td></td>\n                <td></td>\n               {/if}\n               <td>\n                {$line.line_total+$line.tax_amount|crmMoney}\n               </td>\n              {/if}\n              <td>\n               {$line.start_date}\n              </td>\n        <td>\n               {$line.end_date}\n              </td>\n             </tr>\n            {/foreach}\n           </table>\n          </td>\n         </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.total_amount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n       {foreach from=$dataArray item=value key=priceset}\n        <tr>\n        {if $priceset}\n         <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n         <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {elseif  $priceset == 0}\n         <td>&nbsp;{ts}No{/ts} {$taxTerm}</td>\n         <td>&nbsp;{$value|crmMoney:$currency}</td>\n        {/if}\n        </tr>\n       {/foreach}\n      {/if}\n      {/if}\n      {if isset($totalTaxAmount)}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$formValues.total_amount|crmMoney}\n        </td>\n       </tr>\n       {if $receive_date}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Date Received{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$receive_date|truncate:10:\'\'|crmDate}\n         </td>\n        </tr>\n       {/if}\n       {if $formValues.paidBy}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Paid By{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$formValues.paidBy}\n         </td>\n        </tr>\n        {if $formValues.check_number}\n         <tr>\n          <td {$labelStyle}>\n           {ts}Check Number{/ts}\n          </td>\n          <td {$valueStyle}>\n           {$formValues.check_number}\n          </td>\n         </tr>\n        {/if}\n       {/if}\n      {/if}\n     {/if}\n    </table>\n   </td>\n  </tr>\n\n  {if $isPrimary}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n\n      {if $billingName}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td {$labelStyle}>\n         {$billingName}<br />\n         {$address}\n        </td>\n       </tr>\n      {/if}\n\n      {if $credit_card_type}\n       <tr>\n        <th {$headerStyle}>\n         {ts}Credit Card Information{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td {$valueStyle}>\n         {$credit_card_type}<br />\n         {$credit_card_number}\n        </td>\n       </tr>\n       <tr>\n        <td {$labelStyle}>\n         {ts}Expires{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n        </td>\n       </tr>\n      {/if}\n\n     </table>\n    </td>\n   </tr>\n  {/if}\n\n  {if $customValues}\n   <tr>\n    <td>\n     <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Options{/ts}\n       </th>\n      </tr>\n      {foreach from=$customValues item=value key=customName}\n       <tr>\n        <td {$labelStyle}>\n         {$customName}\n        </td>\n        <td {$valueStyle}>\n         {$value}\n        </td>\n       </tr>\n      {/foreach}\n     </table>\n    </td>\n   </tr>\n  {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,842,'membership_offline_receipt',0,1,0,NULL),(47,'Memberships - Receipt (on-line)','{if $is_pay_later}{ts}Invoice{/ts}{else}{ts}Receipt{/ts}{/if} - {$title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $receipt_text}\n{$receipt_text}\n{/if}\n{if $is_pay_later}\n\n===========================================================\n{$pay_later_receipt}\n===========================================================\n{/if}\n\n{if $membership_assign && !$useForMember}\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Type{/ts}: {$membership_name}\n{if $mem_start_date}{ts}Membership Start Date{/ts}: {$mem_start_date|crmDate}\n{/if}\n{if $mem_end_date}{ts}Membership End Date{/ts}: {$mem_end_date|crmDate}\n{/if}\n\n{/if}\n{if $amount}\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{if !$useForMember && $membership_amount && $is_quick_config}\n{ts 1=$membership_name}%1 Membership{/ts}: {$membership_amount|crmMoney}\n{if $amount && !$is_separate_payment }\n{ts}Contribution Amount{/ts}: {$amount|crmMoney}\n-------------------------------------------\n{ts}Total{/ts}: {$amount+$membership_amount|crmMoney}\n{/if}\n{elseif !$useForMember && $lineItem and $priceSetID & !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{$line.description|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney|string_format:\"%10s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n\n{ts}Total Amount{/ts}: {$amount|crmMoney}\n{else}\n{if $useForMember && $lineItem && !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_total}{ts}Fee{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{/if}\n{capture assign=ts_start_date}{ts}Membership Start Date{/ts}{/capture}\n{capture assign=ts_end_date}{ts}Membership End Date{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_total|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"} {/if} {$ts_start_date|string_format:\"%20s\"} {$ts_end_date|string_format:\"%20s\"}\n--------------------------------------------------------------------------------------------------\n\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}  {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}   {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {/if} {$line.start_date|string_format:\"%20s\"} {$line.end_date|string_format:\"%20s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n--------------------------------------------------------------------------------------------------\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Amount{/ts}: {$amount|crmMoney} {if $amount_level } - {$amount_level} {/if}\n{/if}\n{elseif $membership_amount}\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{ts 1=$membership_name}%1 Membership{/ts}: {$membership_amount|crmMoney}\n{/if}\n\n{if $receive_date}\n\n{ts}Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $is_monetary and $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n\n{/if}\n{if $membership_trx_id}\n{ts}Membership Transaction #{/ts}: {$membership_trx_id}\n\n{/if}\n{if $is_recur}\n{ts}This membership will be renewed automatically.{/ts}\n{if $cancelSubscriptionUrl}\n\n{ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by visiting this web page: %1.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n{/if}\n{/if}\n\n{if $honor_block_is_active }\n===========================================================\n{$soft_credit_type}\n===========================================================\n{foreach from=$honoreeProfile item=value key=label}\n{$label}: {$value}\n{/foreach}\n\n{/if}\n{if $pcpBlock}\n===========================================================\n{ts}Personal Campaign Page{/ts}\n\n===========================================================\n{ts}Display In Honor Roll{/ts}: {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n\n{if $pcp_roll_nickname}{ts}Nickname{/ts}: {$pcp_roll_nickname}{/if}\n\n{if $pcp_personal_note}{ts}Personal Note{/ts}: {$pcp_personal_note}{/if}\n\n{/if}\n{if $onBehalfProfile}\n===========================================================\n{ts}On Behalf Of{/ts}\n\n===========================================================\n{foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n{$onBehalfName}: {$onBehalfValue}\n{/foreach}\n{/if}\n\n{if $billingName}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n{elseif $email}\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$email}\n{/if} {* End billingName or email *}\n{if $credit_card_type}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n\n{if $selectPremium }\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$product_name}\n{if $option}\n{ts}Option{/ts}: {$option}\n{/if}\n{if $sku}\n{ts}SKU{/ts}: {$sku}\n{/if}\n{if $start_date}\n{ts}Start Date{/ts}: {$start_date|crmDate}\n{/if}\n{if $end_date}\n{ts}End Date{/ts}: {$end_date|crmDate}\n{/if}\n{if $contact_email OR $contact_phone}\n\n{ts}For information about this premium, contact:{/ts}\n\n{if $contact_email}\n  {$contact_email}\n{/if}\n{if $contact_phone}\n  {$contact_phone}\n{/if}\n{/if}\n{if $is_deductible AND $price}\n\n{ts 1=$price|crmMoney}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}{/if}\n{/if}\n\n{if $customPre}\n===========================================================\n{$customPre_grouptitle}\n\n===========================================================\n{foreach from=$customPre item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n\n\n{if $customPost}\n===========================================================\n{$customPost_grouptitle}\n\n===========================================================\n{foreach from=$customPost item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $receipt_text}\n     <p>{$receipt_text|htmlize}</p>\n    {/if}\n\n    {if $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  </table>\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n     {if $membership_assign && !$useForMember}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Type{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_name}\n       </td>\n      </tr>\n      {if $mem_start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$mem_start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $mem_end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$mem_end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n\n     {if $amount}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Fee{/ts}\n       </th>\n      </tr>\n\n      {if !$useForMember and $membership_amount and $is_quick_config}\n\n       <tr>\n        <td {$labelStyle}>\n         {ts 1=$membership_name}%1 Membership{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$membership_amount|crmMoney}\n        </td>\n       </tr>\n       {if $amount && !$is_separate_payment }\n         <tr>\n          <td {$labelStyle}>\n           {ts}Contribution Amount{/ts}\n          </td>\n          <td {$valueStyle}>\n           {$amount|crmMoney}\n          </td>\n         </tr>\n         <tr>\n           <td {$labelStyle}>\n           {ts}Total{/ts}\n            </td>\n            <td {$valueStyle}>\n            {$amount+$membership_amount|crmMoney}\n           </td>\n         </tr>\n       {/if}\n\n      {elseif !$useForMember && $lineItem and $priceSetID and !$is_quick_config}\n\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Qty{/ts}</th>\n            <th>{ts}Each{/ts}</th>\n            <th>{ts}Total{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n              {$line.description|truncate:30:\"...\"}\n             </td>\n             <td>\n              {$line.qty}\n             </td>\n             <td>\n              {$line.unit_price|crmMoney}\n             </td>\n             <td>\n              {$line.line_total|crmMoney}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney}\n        </td>\n       </tr>\n\n      {else}\n       {if $useForMember && $lineItem and !$is_quick_config}\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Fee{/ts}</th>\n            {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n              <th>{ts}Total{/ts}</th>\n            {/if}\n      <th>{ts}Membership Start Date{/ts}</th>\n      <th>{ts}Membership End Date{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n             {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n             </td>\n             <td>\n              {$line.line_total|crmMoney}\n             </td>\n             {if $dataArray}\n              <td>\n               {$line.unit_price*$line.qty|crmMoney}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n               <td>\n                {$line.tax_rate|string_format:\"%.2f\"}%\n               </td>\n               <td>\n                {$line.tax_amount|crmMoney}\n               </td>\n              {else}\n               <td></td>\n               <td></td>\n              {/if}\n              <td>\n               {$line.line_total+$line.tax_amount|crmMoney}\n              </td>\n             {/if}\n             <td>\n              {$line.start_date}\n             </td>\n       <td>\n              {$line.end_date}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$amount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n         {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n         {else}\n           <td>&nbsp;{ts}NO{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n         {/if}\n         </tr>\n        {/foreach}\n       {/if}\n       {/if}\n       {if $totalTaxAmount}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney} {if $amount_level} - {$amount_level}{/if}\n        </td>\n       </tr>\n\n      {/if}\n\n\n     {elseif $membership_amount}\n\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Fee{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts 1=$membership_name}%1 Membership{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_amount|crmMoney}\n       </td>\n      </tr>\n\n\n     {/if}\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $is_monetary and $trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n     {if $membership_trx_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_trx_id}\n       </td>\n      </tr>\n     {/if}\n     {if $is_recur}\n       <tr>\n        <td colspan=\"2\" {$labelStyle}>\n         {ts}This membership will be renewed automatically.{/ts}\n         {if $cancelSubscriptionUrl}\n           {ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n         {/if}\n        </td>\n       </tr>\n       {if $updateSubscriptionBillingUrl}\n         <tr>\n          <td colspan=\"2\" {$labelStyle}>\n           {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n         </tr>\n       {/if}\n     {/if}\n\n     {if $honor_block_is_active}\n      <tr>\n       <th {$headerStyle}>\n        {$soft_credit_type}\n       </th>\n      </tr>\n      {foreach from=$honoreeProfile item=value key=label}\n        <tr>\n         <td {$labelStyle}>\n          {$label}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $pcpBlock}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Personal Campaign Page{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Display In Honor Roll{/ts}\n       </td>\n       <td {$valueStyle}>\n        {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n       </td>\n      </tr>\n      {if $pcp_roll_nickname}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Nickname{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_roll_nickname}\n        </td>\n       </tr>\n      {/if}\n      {if $pcp_personal_note}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Personal Note{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_personal_note}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $onBehalfProfile}\n      <tr>\n       <th {$headerStyle}>\n        {$onBehalfProfile_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n        <tr>\n         <td {$labelStyle}>\n          {$onBehalfName}\n         </td>\n         <td {$valueStyle}>\n          {$onBehalfValue}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $billingName}\n       <tr>\n         <th {$headerStyle}>\n           {ts}Billing Name and Address{/ts}\n         </th>\n      </tr>\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}<br />\n          {$email}\n        </td>\n      </tr>\n    {elseif $email}\n      <tr>\n        <th {$headerStyle}>\n          {ts}Registered Email{/ts}\n        </th>\n      </tr>\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n          {$email}\n        </td>\n      </tr>\n    {/if}\n\n     {if $credit_card_type}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n     {/if}\n\n     {if $selectPremium}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$product_name}\n       </td>\n      </tr>\n      {if $option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$option}\n        </td>\n       </tr>\n      {/if}\n      {if $sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$sku}\n        </td>\n       </tr>\n      {/if}\n      {if $start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $contact_email OR $contact_phone}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}For information about this premium, contact:{/ts}</p>\n         {if $contact_email}\n          <p>{$contact_email}</p>\n         {/if}\n         {if $contact_phone}\n          <p>{$contact_phone}</p>\n         {/if}\n        </td>\n       </tr>\n      {/if}\n      {if $is_deductible AND $price}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <p>{ts 1=$price|crmMoney}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}</p>\n         </td>\n        </tr>\n      {/if}\n     {/if}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,843,'membership_online_receipt',1,0,0,NULL),(48,'Memberships - Receipt (on-line)','{if $is_pay_later}{ts}Invoice{/ts}{else}{ts}Receipt{/ts}{/if} - {$title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n{if $receipt_text}\n{$receipt_text}\n{/if}\n{if $is_pay_later}\n\n===========================================================\n{$pay_later_receipt}\n===========================================================\n{/if}\n\n{if $membership_assign && !$useForMember}\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Type{/ts}: {$membership_name}\n{if $mem_start_date}{ts}Membership Start Date{/ts}: {$mem_start_date|crmDate}\n{/if}\n{if $mem_end_date}{ts}Membership End Date{/ts}: {$mem_end_date|crmDate}\n{/if}\n\n{/if}\n{if $amount}\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{if !$useForMember && $membership_amount && $is_quick_config}\n{ts 1=$membership_name}%1 Membership{/ts}: {$membership_amount|crmMoney}\n{if $amount && !$is_separate_payment }\n{ts}Contribution Amount{/ts}: {$amount|crmMoney}\n-------------------------------------------\n{ts}Total{/ts}: {$amount+$membership_amount|crmMoney}\n{/if}\n{elseif !$useForMember && $lineItem and $priceSetID & !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n---------------------------------------------------------\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_qty}{ts}Qty{/ts}{/capture}\n{capture assign=ts_each}{ts}Each{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_qty|string_format:\"%5s\"} {$ts_each|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"}\n----------------------------------------------------------\n{foreach from=$value item=line}\n{$line.description|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.qty|string_format:\"%5s\"} {$line.unit_price|crmMoney|string_format:\"%10s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}\n{/foreach}\n{/foreach}\n\n{ts}Total Amount{/ts}: {$amount|crmMoney}\n{else}\n{if $useForMember && $lineItem && !$is_quick_config}\n{foreach from=$lineItem item=value key=priceset}\n{capture assign=ts_item}{ts}Item{/ts}{/capture}\n{capture assign=ts_total}{ts}Fee{/ts}{/capture}\n{if $dataArray}\n{capture assign=ts_subtotal}{ts}Subtotal{/ts}{/capture}\n{capture assign=ts_taxRate}{ts}Tax Rate{/ts}{/capture}\n{capture assign=ts_taxAmount}{ts}Tax Amount{/ts}{/capture}\n{capture assign=ts_total}{ts}Total{/ts}{/capture}\n{/if}\n{capture assign=ts_start_date}{ts}Membership Start Date{/ts}{/capture}\n{capture assign=ts_end_date}{ts}Membership End Date{/ts}{/capture}\n{$ts_item|string_format:\"%-30s\"} {$ts_total|string_format:\"%10s\"} {if $dataArray} {$ts_subtotal|string_format:\"%10s\"} {$ts_taxRate|string_format:\"%10s\"} {$ts_taxAmount|string_format:\"%10s\"} {$ts_total|string_format:\"%10s\"} {/if} {$ts_start_date|string_format:\"%20s\"} {$ts_end_date|string_format:\"%20s\"}\n--------------------------------------------------------------------------------------------------\n\n{foreach from=$value item=line}\n{capture assign=ts_item}{if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description} {$line.description}{/if}{/capture}{$ts_item|truncate:30:\"...\"|string_format:\"%-30s\"} {$line.line_total|crmMoney|string_format:\"%10s\"}  {if $dataArray} {$line.unit_price*$line.qty|crmMoney:$currency|string_format:\"%10s\"} {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}  {$line.tax_rate|string_format:\"%.2f\"} %  {$line.tax_amount|crmMoney:$currency|string_format:\"%10s\"} {else}                  {/if}   {$line.line_total+$line.tax_amount|crmMoney|string_format:\"%10s\"} {/if} {$line.start_date|string_format:\"%20s\"} {$line.end_date|string_format:\"%20s\"}\n{/foreach}\n{/foreach}\n\n{if $dataArray}\n{ts}Amount before Tax{/ts}: {$amount-$totalTaxAmount|crmMoney:$currency}\n\n{foreach from=$dataArray item=value key=priceset}\n{if $priceset || $priceset == 0}\n{$taxTerm} {$priceset|string_format:\"%.2f\"}%: {$value|crmMoney:$currency}\n{else}\n{ts}No{/ts} {$taxTerm}: {$value|crmMoney:$currency}\n{/if}\n{/foreach}\n{/if}\n--------------------------------------------------------------------------------------------------\n{/if}\n\n{if $totalTaxAmount}\n{ts}Total Tax Amount{/ts}: {$totalTaxAmount|crmMoney:$currency}\n{/if}\n\n{ts}Amount{/ts}: {$amount|crmMoney} {if $amount_level } - {$amount_level} {/if}\n{/if}\n{elseif $membership_amount}\n===========================================================\n{ts}Membership Fee{/ts}\n\n===========================================================\n{ts 1=$membership_name}%1 Membership{/ts}: {$membership_amount|crmMoney}\n{/if}\n\n{if $receive_date}\n\n{ts}Date{/ts}: {$receive_date|crmDate}\n{/if}\n{if $is_monetary and $trxn_id}\n{ts}Transaction #{/ts}: {$trxn_id}\n\n{/if}\n{if $membership_trx_id}\n{ts}Membership Transaction #{/ts}: {$membership_trx_id}\n\n{/if}\n{if $is_recur}\n{ts}This membership will be renewed automatically.{/ts}\n{if $cancelSubscriptionUrl}\n\n{ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by visiting this web page: %1.{/ts}\n\n{/if}\n\n{if $updateSubscriptionBillingUrl}\n\n{ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n{/if}\n{/if}\n\n{if $honor_block_is_active }\n===========================================================\n{$soft_credit_type}\n===========================================================\n{foreach from=$honoreeProfile item=value key=label}\n{$label}: {$value}\n{/foreach}\n\n{/if}\n{if $pcpBlock}\n===========================================================\n{ts}Personal Campaign Page{/ts}\n\n===========================================================\n{ts}Display In Honor Roll{/ts}: {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n\n{if $pcp_roll_nickname}{ts}Nickname{/ts}: {$pcp_roll_nickname}{/if}\n\n{if $pcp_personal_note}{ts}Personal Note{/ts}: {$pcp_personal_note}{/if}\n\n{/if}\n{if $onBehalfProfile}\n===========================================================\n{ts}On Behalf Of{/ts}\n\n===========================================================\n{foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n{$onBehalfName}: {$onBehalfValue}\n{/foreach}\n{/if}\n\n{if $billingName}\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n{elseif $email}\n===========================================================\n{ts}Registered Email{/ts}\n\n===========================================================\n{$email}\n{/if} {* End billingName or email *}\n{if $credit_card_type}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n{/if}\n\n{if $selectPremium }\n===========================================================\n{ts}Premium Information{/ts}\n\n===========================================================\n{$product_name}\n{if $option}\n{ts}Option{/ts}: {$option}\n{/if}\n{if $sku}\n{ts}SKU{/ts}: {$sku}\n{/if}\n{if $start_date}\n{ts}Start Date{/ts}: {$start_date|crmDate}\n{/if}\n{if $end_date}\n{ts}End Date{/ts}: {$end_date|crmDate}\n{/if}\n{if $contact_email OR $contact_phone}\n\n{ts}For information about this premium, contact:{/ts}\n\n{if $contact_email}\n  {$contact_email}\n{/if}\n{if $contact_phone}\n  {$contact_phone}\n{/if}\n{/if}\n{if $is_deductible AND $price}\n\n{ts 1=$price|crmMoney}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}{/if}\n{/if}\n\n{if $customPre}\n===========================================================\n{$customPre_grouptitle}\n\n===========================================================\n{foreach from=$customPre item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n\n\n{if $customPost}\n===========================================================\n{$customPost_grouptitle}\n\n===========================================================\n{foreach from=$customPost item=customValue key=customName}\n{if ( $trackingFields and ! in_array( $customName, $trackingFields ) ) or ! $trackingFields}\n {$customName}: {$customValue}\n{/if}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n     {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    {if $receipt_text}\n     <p>{$receipt_text|htmlize}</p>\n    {/if}\n\n    {if $is_pay_later}\n     <p>{$pay_later_receipt}</p> {* FIXME: this might be text rather than HTML *}\n    {/if}\n\n   </td>\n  </tr>\n  </table>\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n     {if $membership_assign && !$useForMember}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Type{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_name}\n       </td>\n      </tr>\n      {if $mem_start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$mem_start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $mem_end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$mem_end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n\n     {if $amount}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Fee{/ts}\n       </th>\n      </tr>\n\n      {if !$useForMember and $membership_amount and $is_quick_config}\n\n       <tr>\n        <td {$labelStyle}>\n         {ts 1=$membership_name}%1 Membership{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$membership_amount|crmMoney}\n        </td>\n       </tr>\n       {if $amount && !$is_separate_payment }\n         <tr>\n          <td {$labelStyle}>\n           {ts}Contribution Amount{/ts}\n          </td>\n          <td {$valueStyle}>\n           {$amount|crmMoney}\n          </td>\n         </tr>\n         <tr>\n           <td {$labelStyle}>\n           {ts}Total{/ts}\n            </td>\n            <td {$valueStyle}>\n            {$amount+$membership_amount|crmMoney}\n           </td>\n         </tr>\n       {/if}\n\n      {elseif !$useForMember && $lineItem and $priceSetID and !$is_quick_config}\n\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Qty{/ts}</th>\n            <th>{ts}Each{/ts}</th>\n            <th>{ts}Total{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n              {$line.description|truncate:30:\"...\"}\n             </td>\n             <td>\n              {$line.qty}\n             </td>\n             <td>\n              {$line.unit_price|crmMoney}\n             </td>\n             <td>\n              {$line.line_total|crmMoney}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Total Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney}\n        </td>\n       </tr>\n\n      {else}\n       {if $useForMember && $lineItem and !$is_quick_config}\n       {foreach from=$lineItem item=value key=priceset}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <table> {* FIXME: style this table so that it looks like the text version (justification, etc.) *}\n           <tr>\n            <th>{ts}Item{/ts}</th>\n            <th>{ts}Fee{/ts}</th>\n            {if $dataArray}\n              <th>{ts}SubTotal{/ts}</th>\n              <th>{ts}Tax Rate{/ts}</th>\n              <th>{ts}Tax Amount{/ts}</th>\n              <th>{ts}Total{/ts}</th>\n            {/if}\n      <th>{ts}Membership Start Date{/ts}</th>\n      <th>{ts}Membership End Date{/ts}</th>\n           </tr>\n           {foreach from=$value item=line}\n            <tr>\n             <td>\n             {if $line.html_type eq \'Text\'}{$line.label}{else}{$line.field_title} - {$line.label}{/if} {if $line.description}<div>{$line.description|truncate:30:\"...\"}</div>{/if}\n             </td>\n             <td>\n              {$line.line_total|crmMoney}\n             </td>\n             {if $dataArray}\n              <td>\n               {$line.unit_price*$line.qty|crmMoney}\n              </td>\n              {if $line.tax_rate != \"\" || $line.tax_amount != \"\"}\n               <td>\n                {$line.tax_rate|string_format:\"%.2f\"}%\n               </td>\n               <td>\n                {$line.tax_amount|crmMoney}\n               </td>\n              {else}\n               <td></td>\n               <td></td>\n              {/if}\n              <td>\n               {$line.line_total+$line.tax_amount|crmMoney}\n              </td>\n             {/if}\n             <td>\n              {$line.start_date}\n             </td>\n       <td>\n              {$line.end_date}\n             </td>\n            </tr>\n           {/foreach}\n          </table>\n         </td>\n        </tr>\n       {/foreach}\n       {if $dataArray}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Amount Before Tax:{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$amount-$totalTaxAmount|crmMoney}\n         </td>\n        </tr>\n        {foreach from=$dataArray item=value key=priceset}\n         <tr>\n         {if $priceset || $priceset == 0}\n           <td>&nbsp;{$taxTerm} {$priceset|string_format:\"%.2f\"}%</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n         {else}\n           <td>&nbsp;{ts}NO{/ts} {$taxTerm}</td>\n           <td>&nbsp;{$value|crmMoney:$currency}</td>\n         {/if}\n         </tr>\n        {/foreach}\n       {/if}\n       {/if}\n       {if $totalTaxAmount}\n        <tr>\n         <td {$labelStyle}>\n          {ts}Total Tax Amount{/ts}\n         </td>\n         <td {$valueStyle}>\n          {$totalTaxAmount|crmMoney:$currency}\n         </td>\n        </tr>\n       {/if}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Amount{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$amount|crmMoney} {if $amount_level} - {$amount_level}{/if}\n        </td>\n       </tr>\n\n      {/if}\n\n\n     {elseif $membership_amount}\n\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Fee{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts 1=$membership_name}%1 Membership{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_amount|crmMoney}\n       </td>\n      </tr>\n\n\n     {/if}\n\n     {if $receive_date}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Date{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$receive_date|crmDate}\n       </td>\n      </tr>\n     {/if}\n\n     {if $is_monetary and $trxn_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$trxn_id}\n       </td>\n      </tr>\n     {/if}\n\n     {if $membership_trx_id}\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Transaction #{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_trx_id}\n       </td>\n      </tr>\n     {/if}\n     {if $is_recur}\n       <tr>\n        <td colspan=\"2\" {$labelStyle}>\n         {ts}This membership will be renewed automatically.{/ts}\n         {if $cancelSubscriptionUrl}\n           {ts 1=$cancelSubscriptionUrl}You can cancel the auto-renewal option by <a href=\"%1\">visiting this web page</a>.{/ts}\n         {/if}\n        </td>\n       </tr>\n       {if $updateSubscriptionBillingUrl}\n         <tr>\n          <td colspan=\"2\" {$labelStyle}>\n           {ts 1=$updateSubscriptionBillingUrl}You can update billing details for this automatically renewed membership by <a href=\"%1\">visiting this web page</a>.{/ts}\n          </td>\n         </tr>\n       {/if}\n     {/if}\n\n     {if $honor_block_is_active}\n      <tr>\n       <th {$headerStyle}>\n        {$soft_credit_type}\n       </th>\n      </tr>\n      {foreach from=$honoreeProfile item=value key=label}\n        <tr>\n         <td {$labelStyle}>\n          {$label}\n         </td>\n         <td {$valueStyle}>\n          {$value}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $pcpBlock}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Personal Campaign Page{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Display In Honor Roll{/ts}\n       </td>\n       <td {$valueStyle}>\n        {if $pcp_display_in_roll}{ts}Yes{/ts}{else}{ts}No{/ts}{/if}\n       </td>\n      </tr>\n      {if $pcp_roll_nickname}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Nickname{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_roll_nickname}\n        </td>\n       </tr>\n      {/if}\n      {if $pcp_personal_note}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Personal Note{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$pcp_personal_note}\n        </td>\n       </tr>\n      {/if}\n     {/if}\n\n     {if $onBehalfProfile}\n      <tr>\n       <th {$headerStyle}>\n        {$onBehalfProfile_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$onBehalfProfile item=onBehalfValue key=onBehalfName}\n        <tr>\n         <td {$labelStyle}>\n          {$onBehalfName}\n         </td>\n         <td {$valueStyle}>\n          {$onBehalfValue}\n         </td>\n        </tr>\n      {/foreach}\n     {/if}\n\n     {if $billingName}\n       <tr>\n         <th {$headerStyle}>\n           {ts}Billing Name and Address{/ts}\n         </th>\n      </tr>\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n          {$billingName}<br />\n          {$address|nl2br}<br />\n          {$email}\n        </td>\n      </tr>\n    {elseif $email}\n      <tr>\n        <th {$headerStyle}>\n          {ts}Registered Email{/ts}\n        </th>\n      </tr>\n      <tr>\n        <td colspan=\"2\" {$valueStyle}>\n          {$email}\n        </td>\n      </tr>\n    {/if}\n\n     {if $credit_card_type}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n     {/if}\n\n     {if $selectPremium}\n      <tr>\n       <th {$headerStyle}>\n        {ts}Premium Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$labelStyle}>\n        {$product_name}\n       </td>\n      </tr>\n      {if $option}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Option{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$option}\n        </td>\n       </tr>\n      {/if}\n      {if $sku}\n       <tr>\n        <td {$labelStyle}>\n         {ts}SKU{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$sku}\n        </td>\n       </tr>\n      {/if}\n      {if $start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $contact_email OR $contact_phone}\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         <p>{ts}For information about this premium, contact:{/ts}</p>\n         {if $contact_email}\n          <p>{$contact_email}</p>\n         {/if}\n         {if $contact_phone}\n          <p>{$contact_phone}</p>\n         {/if}\n        </td>\n       </tr>\n      {/if}\n      {if $is_deductible AND $price}\n        <tr>\n         <td colspan=\"2\" {$valueStyle}>\n          <p>{ts 1=$price|crmMoney}The value of this premium is %1. This may affect the amount of the tax deduction you can claim. Consult your tax advisor for more information.{/ts}</p>\n         </td>\n        </tr>\n      {/if}\n     {/if}\n\n     {if $customPre}\n      <tr>\n       <th {$headerStyle}>\n        {$customPre_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPre item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n     {if $customPost}\n      <tr>\n       <th {$headerStyle}>\n        {$customPost_grouptitle}\n       </th>\n      </tr>\n      {foreach from=$customPost item=customValue key=customName}\n       {if ($trackingFields and ! in_array($customName, $trackingFields)) or ! $trackingFields}\n        <tr>\n         <td {$labelStyle}>\n          {$customName}\n         </td>\n         <td {$valueStyle}>\n          {$customValue}\n         </td>\n        </tr>\n       {/if}\n      {/foreach}\n     {/if}\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,843,'membership_online_receipt',0,1,0,NULL),(49,'Memberships - Auto-renew Cancellation Notification','{ts}Autorenew Membership Cancellation Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$membershipType}The automatic renewal of your %1 membership has been cancelled as requested. This does not affect the status of your membership - you will receive a separate notification when your membership is up for renewal.{/ts}\n\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Status{/ts}: {$membership_status}\n{if $mem_start_date}{ts}Membership Start Date{/ts}: {$mem_start_date|crmDate}\n{/if}\n{if $mem_end_date}{ts}Membership End Date{/ts}: {$mem_end_date|crmDate}\n{/if}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$membershipType}The automatic renewal of your %1 membership has been cancelled as requested. This does not affect the status of your membership - you will receive a separate notification when your membership is up for renewal.{/ts}</p>\n\n   </td>\n  </tr>\n </table>\n <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Status{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_status}\n       </td>\n      </tr>\n      {if $mem_start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$mem_start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $mem_end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$mem_end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,844,'membership_autorenew_cancelled',1,0,0,NULL),(50,'Memberships - Auto-renew Cancellation Notification','{ts}Autorenew Membership Cancellation Notification{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$membershipType}The automatic renewal of your %1 membership has been cancelled as requested. This does not affect the status of your membership - you will receive a separate notification when your membership is up for renewal.{/ts}\n\n===========================================================\n{ts}Membership Information{/ts}\n\n===========================================================\n{ts}Membership Status{/ts}: {$membership_status}\n{if $mem_start_date}{ts}Membership Start Date{/ts}: {$mem_start_date|crmDate}\n{/if}\n{if $mem_end_date}{ts}Membership End Date{/ts}: {$mem_end_date|crmDate}\n{/if}\n\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$membershipType}The automatic renewal of your %1 membership has been cancelled as requested. This does not affect the status of your membership - you will receive a separate notification when your membership is up for renewal.{/ts}</p>\n\n   </td>\n  </tr>\n </table>\n <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n\n      <tr>\n       <th {$headerStyle}>\n        {ts}Membership Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td {$labelStyle}>\n        {ts}Membership Status{/ts}\n       </td>\n       <td {$valueStyle}>\n        {$membership_status}\n       </td>\n      </tr>\n      {if $mem_start_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership Start Date{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$mem_start_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n      {if $mem_end_date}\n       <tr>\n        <td {$labelStyle}>\n         {ts}Membership End Date{/ts}\n        </td>\n        <td {$valueStyle}>\n          {$mem_end_date|crmDate}\n        </td>\n       </tr>\n      {/if}\n\n </table>\n</center>\n\n</body>\n</html>\n',1,844,'membership_autorenew_cancelled',0,1,0,NULL),(51,'Memberships - Auto-renew Billing Updates','{ts}Membership Autorenewal Billing Updates{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$membershipType}Billing details for your automatically renewed %1 membership have been updated.{/ts}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$membershipType}Billing details for your automatically renewed %1 membership have been updated.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n   <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n        <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n         {ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n        </td>\n      </tr>\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,845,'membership_autorenew_billing',1,0,0,NULL),(52,'Memberships - Auto-renew Billing Updates','{ts}Membership Autorenewal Billing Updates{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$membershipType}Billing details for your automatically renewed %1 membership have been updated.{/ts}\n\n===========================================================\n{ts}Billing Name and Address{/ts}\n\n===========================================================\n{$billingName}\n{$address}\n\n{$email}\n\n===========================================================\n{ts}Credit Card Information{/ts}\n\n===========================================================\n{$credit_card_type}\n{$credit_card_number}\n{ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}\n\n\n{ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$membershipType}Billing details for your automatically renewed %1 membership have been updated.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n </table>\n\n  <table style=\"width:100%; max-width:500px; border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse;\">\n   <tr>\n        <th {$headerStyle}>\n         {ts}Billing Name and Address{/ts}\n        </th>\n       </tr>\n       <tr>\n        <td colspan=\"2\" {$valueStyle}>\n         {$billingName}<br />\n         {$address|nl2br}<br />\n         {$email}\n        </td>\n       </tr>\n        <tr>\n       <th {$headerStyle}>\n        {ts}Credit Card Information{/ts}\n       </th>\n      </tr>\n      <tr>\n       <td colspan=\"2\" {$valueStyle}>\n        {$credit_card_type}<br />\n        {$credit_card_number}<br />\n        {ts}Expires{/ts}: {$credit_card_exp_date|truncate:7:\'\'|crmDate}<br />\n       </td>\n      </tr>\n      <tr>\n        <td {$labelStyle}>\n         {ts 1=$receipt_from_email}If you have questions please contact us at %1{/ts}\n        </td>\n      </tr>\n\n  </table>\n</center>\n\n</body>\n</html>\n',1,845,'membership_autorenew_billing',0,1,0,NULL),(53,'Test-drive - Receipt Header','[TEST]\n','***********************************************************\n\n{ts}Test-drive Email / Receipt{/ts}\n\n{ts}This is a test-drive email. No live financial transaction has occurred.{/ts}\n\n***********************************************************\n','<center>\n <table id=\"crm-event_receipt_test\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n  <tr>\n   <td>\n    <p>{ts}Test-drive Email / Receipt{/ts}</p>\n    <p>{ts}This is a test-drive email. No live financial transaction has occurred.{/ts}</p>\n   </td>\n  </tr>\n </table>\n</center>\n',1,846,'test_preview',1,0,0,NULL),(54,'Test-drive - Receipt Header','[TEST]\n','***********************************************************\n\n{ts}Test-drive Email / Receipt{/ts}\n\n{ts}This is a test-drive email. No live financial transaction has occurred.{/ts}\n\n***********************************************************\n','<center>\n <table id=\"crm-event_receipt_test\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n  <tr>\n   <td>\n    <p>{ts}Test-drive Email / Receipt{/ts}</p>\n    <p>{ts}This is a test-drive email. No live financial transaction has occurred.{/ts}</p>\n   </td>\n  </tr>\n </table>\n</center>\n',1,846,'test_preview',0,1,0,NULL),(55,'Pledges - Acknowledgement','{ts}Thank you for your Pledge{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n{ts}Thank you for your generous pledge.{/ts}\n\n===========================================================\n{ts}Pledge Information{/ts}\n\n===========================================================\n{ts}Pledge Received{/ts}: {$create_date|truncate:10:\'\'|crmDate}\n{ts}Total Pledge Amount{/ts}: {$total_pledge_amount|crmMoney:$currency}\n\n===========================================================\n{ts}Payment Schedule{/ts}\n\n===========================================================\n{ts 1=$scheduled_amount|crmMoney:$currency 2=$frequency_interval 3=$frequency_unit 4=$installments}%1 every %2 %3 for %4 installments.{/ts}\n\n{if $frequency_day}\n\n{ts 1=$frequency_day 2=$frequency_unit}Payments are due on day %1 of the %2.{/ts}\n{/if}\n\n{if $payments}\n{assign var=\"count\" value=\"1\"}\n{foreach from=$payments item=payment}\n\n{ts 1=$count}Payment %1{/ts}: {$payment.amount|crmMoney:$currency} {if $payment.status eq 1}{ts}paid{/ts} {$payment.receive_date|truncate:10:\'\'|crmDate}{else}{ts}due{/ts} {$payment.due_date|truncate:10:\'\'|crmDate}{/if}\n{assign var=\"count\" value=`$count+1`}\n{/foreach}\n{/if}\n\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}\n\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n===========================================================\n{$customName}\n===========================================================\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Thank you for your generous pledge.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Pledge Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Pledge Received{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$create_date|truncate:10:\'\'|crmDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Pledge Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$total_pledge_amount|crmMoney:$currency}\n      </td>\n     </tr>\n     <tr>\n      <th {$headerStyle}>\n       {ts}Payment Schedule{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       <p>{ts 1=$scheduled_amount|crmMoney:$currency 2=$frequency_interval 3=$frequency_unit 4=$installments}%1 every %2 %3 for %4 installments.{/ts}</p>\n\n       {if $frequency_day}\n        <p>{ts 1=$frequency_day 2=$frequency_unit}Payments are due on day %1 of the %2.{/ts}</p>\n       {/if}\n      </td>\n     </tr>\n\n     {if $payments}\n      {assign var=\"count\" value=\"1\"}\n      {foreach from=$payments item=payment}\n       <tr>\n        <td {$labelStyle}>\n         {ts 1=$count}Payment %1{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$payment.amount|crmMoney:$currency} {if $payment.status eq 1}{ts}paid{/ts} {$payment.receive_date|truncate:10:\'\'|crmDate}{else}{ts}due{/ts} {$payment.due_date|truncate:10:\'\'|crmDate}{/if}\n        </td>\n       </tr>\n       {assign var=\"count\" value=`$count+1`}\n      {/foreach}\n     {/if}\n\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}</p>\n      </td>\n     </tr>\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,847,'pledge_acknowledge',1,0,0,NULL),(56,'Pledges - Acknowledgement','{ts}Thank you for your Pledge{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n{ts}Thank you for your generous pledge.{/ts}\n\n===========================================================\n{ts}Pledge Information{/ts}\n\n===========================================================\n{ts}Pledge Received{/ts}: {$create_date|truncate:10:\'\'|crmDate}\n{ts}Total Pledge Amount{/ts}: {$total_pledge_amount|crmMoney:$currency}\n\n===========================================================\n{ts}Payment Schedule{/ts}\n\n===========================================================\n{ts 1=$scheduled_amount|crmMoney:$currency 2=$frequency_interval 3=$frequency_unit 4=$installments}%1 every %2 %3 for %4 installments.{/ts}\n\n{if $frequency_day}\n\n{ts 1=$frequency_day 2=$frequency_unit}Payments are due on day %1 of the %2.{/ts}\n{/if}\n\n{if $payments}\n{assign var=\"count\" value=\"1\"}\n{foreach from=$payments item=payment}\n\n{ts 1=$count}Payment %1{/ts}: {$payment.amount|crmMoney:$currency} {if $payment.status eq 1}{ts}paid{/ts} {$payment.receive_date|truncate:10:\'\'|crmDate}{else}{ts}due{/ts} {$payment.due_date|truncate:10:\'\'|crmDate}{/if}\n{assign var=\"count\" value=`$count+1`}\n{/foreach}\n{/if}\n\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}\n\n{if $customGroup}\n{foreach from=$customGroup item=value key=customName}\n===========================================================\n{$customName}\n===========================================================\n{foreach from=$value item=v key=n}\n{$n}: {$v}\n{/foreach}\n{/foreach}\n{/if}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts}Thank you for your generous pledge.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Pledge Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Pledge Received{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$create_date|truncate:10:\'\'|crmDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Pledge Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$total_pledge_amount|crmMoney:$currency}\n      </td>\n     </tr>\n     <tr>\n      <th {$headerStyle}>\n       {ts}Payment Schedule{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       <p>{ts 1=$scheduled_amount|crmMoney:$currency 2=$frequency_interval 3=$frequency_unit 4=$installments}%1 every %2 %3 for %4 installments.{/ts}</p>\n\n       {if $frequency_day}\n        <p>{ts 1=$frequency_day 2=$frequency_unit}Payments are due on day %1 of the %2.{/ts}</p>\n       {/if}\n      </td>\n     </tr>\n\n     {if $payments}\n      {assign var=\"count\" value=\"1\"}\n      {foreach from=$payments item=payment}\n       <tr>\n        <td {$labelStyle}>\n         {ts 1=$count}Payment %1{/ts}\n        </td>\n        <td {$valueStyle}>\n         {$payment.amount|crmMoney:$currency} {if $payment.status eq 1}{ts}paid{/ts} {$payment.receive_date|truncate:10:\'\'|crmDate}{else}{ts}due{/ts} {$payment.due_date|truncate:10:\'\'|crmDate}{/if}\n        </td>\n       </tr>\n       {assign var=\"count\" value=`$count+1`}\n      {/foreach}\n     {/if}\n\n     <tr>\n      <td colspan=\"2\" {$valueStyle}>\n       <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}</p>\n      </td>\n     </tr>\n\n     {if $customGroup}\n      {foreach from=$customGroup item=value key=customName}\n       <tr>\n        <th {$headerStyle}>\n         {$customName}\n        </th>\n       </tr>\n       {foreach from=$value item=v key=n}\n        <tr>\n         <td {$labelStyle}>\n          {$n}\n         </td>\n         <td {$valueStyle}>\n          {$v}\n         </td>\n        </tr>\n       {/foreach}\n      {/foreach}\n     {/if}\n\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,847,'pledge_acknowledge',0,1,0,NULL),(57,'Pledges - Payment Reminder','{ts}Pledge Payment Reminder{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$next_payment|truncate:10:\'\'|crmDate}This is a reminder that the next payment on your pledge is due on %1.{/ts}\n\n===========================================================\n{ts}Payment Due{/ts}\n\n===========================================================\n{ts}Amount Due{/ts}: {$amount_due|crmMoney:$currency}\n{ts}Due Date{/ts}: {$scheduled_payment_date|truncate:10:\'\'|crmDate}\n\n{if $contribution_page_id}\n{capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contribution_page_id`&cid=`$contact.contact_id`&pledgeId=`$pledge_id`&cs=`$checksumValue`\" a=true h=0}{/capture}\nClick this link to go to a web page where you can make your payment online:\n{$contributionUrl}\n{else}\n{ts}Please mail your payment to{/ts}:\n{$domain.address}\n{/if}\n\n===========================================================\n{ts}Pledge Information{/ts}\n\n===========================================================\n{ts}Pledge Received{/ts}: {$create_date|truncate:10:\'\'|crmDate}\n{ts}Total Pledge Amount{/ts}: {$amount|crmMoney:$currency}\n{ts}Total Paid{/ts}: {$amount_paid|crmMoney:$currency}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}\n\n\n{ts}Thank your for your generous support.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$next_payment|truncate:10:\'\'|crmDate}This is a reminder that the next payment on your pledge is due on %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Payment Due{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Amount Due{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount_due|crmMoney:$currency}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    {if $contribution_page_id}\n     {capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contribution_page_id`&cid=`$contact.contact_id`&pledgeId=`$pledge_id`&cs=`$checksumValue`\" a=true h=0}{/capture}\n     <p><a href=\"{$contributionUrl}\">{ts}Go to a web page where you can make your payment online{/ts}</a></p>\n    {else}\n     <p>{ts}Please mail your payment to{/ts}: {$domain.address}</p>\n    {/if}\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Pledge Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Pledge Received{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$create_date|truncate:10:\'\'|crmDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Pledge Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount|crmMoney:$currency}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Paid{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount_paid|crmMoney:$currency}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}</p>\n    <p>{ts}Thank your for your generous support.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,848,'pledge_reminder',1,0,0,NULL),(58,'Pledges - Payment Reminder','{ts}Pledge Payment Reminder{/ts} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\n{ts 1=$next_payment|truncate:10:\'\'|crmDate}This is a reminder that the next payment on your pledge is due on %1.{/ts}\n\n===========================================================\n{ts}Payment Due{/ts}\n\n===========================================================\n{ts}Amount Due{/ts}: {$amount_due|crmMoney:$currency}\n{ts}Due Date{/ts}: {$scheduled_payment_date|truncate:10:\'\'|crmDate}\n\n{if $contribution_page_id}\n{capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contribution_page_id`&cid=`$contact.contact_id`&pledgeId=`$pledge_id`&cs=`$checksumValue`\" a=true h=0}{/capture}\nClick this link to go to a web page where you can make your payment online:\n{$contributionUrl}\n{else}\n{ts}Please mail your payment to{/ts}:\n{$domain.address}\n{/if}\n\n===========================================================\n{ts}Pledge Information{/ts}\n\n===========================================================\n{ts}Pledge Received{/ts}: {$create_date|truncate:10:\'\'|crmDate}\n{ts}Total Pledge Amount{/ts}: {$amount|crmMoney:$currency}\n{ts}Total Paid{/ts}: {$amount_paid|crmMoney:$currency}\n\n{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}\n\n\n{ts}Thank your for your generous support.{/ts}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    {assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n    <p>{ts 1=$next_payment|truncate:10:\'\'|crmDate}This is a reminder that the next payment on your pledge is due on %1.{/ts}</p>\n   </td>\n  </tr>\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Payment Due{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Amount Due{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount_due|crmMoney:$currency}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    {if $contribution_page_id}\n     {capture assign=contributionUrl}{crmURL p=\'civicrm/contribute/transact\' q=\"reset=1&id=`$contribution_page_id`&cid=`$contact.contact_id`&pledgeId=`$pledge_id`&cs=`$checksumValue`\" a=true h=0}{/capture}\n     <p><a href=\"{$contributionUrl}\">{ts}Go to a web page where you can make your payment online{/ts}</a></p>\n    {else}\n     <p>{ts}Please mail your payment to{/ts}: {$domain.address}</p>\n    {/if}\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <th {$headerStyle}>\n       {ts}Pledge Information{/ts}\n      </th>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Pledge Received{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$create_date|truncate:10:\'\'|crmDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Pledge Amount{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount|crmMoney:$currency}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Total Paid{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$amount_paid|crmMoney:$currency}\n      </td>\n     </tr>\n    </table>\n   </td>\n  </tr>\n\n  <tr>\n   <td>\n    <p>{ts 1=$domain.phone 2=$domain.email}Please contact us at %1 or send email to %2 if you have questions\nor need to modify your payment schedule.{/ts}</p>\n    <p>{ts}Thank your for your generous support.{/ts}</p>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,848,'pledge_reminder',0,1,0,NULL),(59,'Profiles - Admin Notification','{$grouptitle} {ts 1=$displayName}Submitted by %1{/ts} - {contact.display_name}\n','{ts}Submitted For:{/ts} {$displayName}\n{ts}Date:{/ts} {$currentDate}\n{ts}Contact Summary:{/ts} {$contactLink}\n\n===========================================================\n{$grouptitle}\n\n===========================================================\n{foreach from=$values item=value key=valueName}\n{$valueName}: {$value}\n{/foreach}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <td {$labelStyle}>\n       {ts}Submitted For{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$displayName}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Date{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$currentDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Contact Summary{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$contactLink}\n      </td>\n     </tr>\n\n     <tr>\n      <th {$headerStyle}>\n       {$grouptitle}\n      </th>\n     </tr>\n\n     {foreach from=$values item=value key=valueName}\n      <tr>\n       <td {$labelStyle}>\n        {$valueName}\n       </td>\n       <td {$valueStyle}>\n        {$value}\n       </td>\n      </tr>\n     {/foreach}\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,849,'uf_notify',1,0,0,NULL),(60,'Profiles - Admin Notification','{$grouptitle} {ts 1=$displayName}Submitted by %1{/ts} - {contact.display_name}\n','{ts}Submitted For:{/ts} {$displayName}\n{ts}Date:{/ts} {$currentDate}\n{ts}Contact Summary:{/ts} {$contactLink}\n\n===========================================================\n{$grouptitle}\n\n===========================================================\n{foreach from=$values item=value key=valueName}\n{$valueName}: {$value}\n{/foreach}\n','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n{capture assign=headerStyle}colspan=\"2\" style=\"text-align: left; padding: 4px; border-bottom: 1px solid #999; background-color: #eee;\"{/capture}\n{capture assign=labelStyle }style=\"padding: 4px; border-bottom: 1px solid #999; background-color: #f7f7f7;\"{/capture}\n{capture assign=valueStyle }style=\"padding: 4px; border-bottom: 1px solid #999;\"{/capture}\n\n<center>\n  <table id=\"crm-event_receipt\" style=\"font-family: Arial, Verdana, sans-serif; text-align: left; width:100%; max-width:700px; padding:0; margin:0; border:0px;\">\n\n  <!-- BEGIN HEADER -->\n  <!-- You can add table row(s) here with logo or other header elements -->\n  <!-- END HEADER -->\n\n  <!-- BEGIN CONTENT -->\n\n  <tr>\n   <td>\n    <table style=\"border: 1px solid #999; margin: 1em 0em 1em; border-collapse: collapse; width:100%;\">\n     <tr>\n      <td {$labelStyle}>\n       {ts}Submitted For{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$displayName}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Date{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$currentDate}\n      </td>\n     </tr>\n     <tr>\n      <td {$labelStyle}>\n       {ts}Contact Summary{/ts}\n      </td>\n      <td {$valueStyle}>\n       {$contactLink}\n      </td>\n     </tr>\n\n     <tr>\n      <th {$headerStyle}>\n       {$grouptitle}\n      </th>\n     </tr>\n\n     {foreach from=$values item=value key=valueName}\n      <tr>\n       <td {$labelStyle}>\n        {$valueName}\n       </td>\n       <td {$valueStyle}>\n        {$value}\n       </td>\n      </tr>\n     {/foreach}\n    </table>\n   </td>\n  </tr>\n\n </table>\n</center>\n\n</body>\n</html>\n',1,849,'uf_notify',0,1,0,NULL),(61,'Petition - signature added','Thank you for signing {$petition.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\nThank you for signing {$petition.title}.\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n<p>Thank you for signing {$petition.title}.</p>\n\n{include file=\"CRM/Campaign/Page/Petition/SocialNetwork.tpl\" petition_id=$survey_id noscript=true emailMode=true}\n',1,850,'petition_sign',1,0,0,NULL),(62,'Petition - signature added','Thank you for signing {$petition.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\nThank you for signing {$petition.title}.\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n<p>Thank you for signing {$petition.title}.</p>\n\n{include file=\"CRM/Campaign/Page/Petition/SocialNetwork.tpl\" petition_id=$survey_id noscript=true emailMode=true}\n',1,850,'petition_sign',0,1,0,NULL),(63,'Petition - need verification','Confirmation of signature needed for {$petition.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\nThank you for signing {$petition.title}.\n\nIn order to complete your signature, we must confirm your e-mail.\nPlease do so by visiting the following email confirmation web page:\n\n{$petition.confirmUrlPlainText}\n\nIf you did not sign this petition, please ignore this message.\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n<p>Thank you for signing {$petition.title}.</p>\n\n<p>In order to <b>complete your signature</b>, we must confirm your e-mail.\n<br />\nPlease do so by visiting the following web page by clicking\non the link below or pasting the link into your browser.\n<br /><br />\nEmail confirmation page: <a href=\"{$petition.confirmUrl} \">{$petition.confirmUrl}</a></p>\n\n<p>If you did not sign this petition, please ignore this message.</p>\n',1,851,'petition_confirmation_needed',1,0,0,NULL),(64,'Petition - need verification','Confirmation of signature needed for {$petition.title} - {contact.display_name}\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}{$greeting},{/if}\n\nThank you for signing {$petition.title}.\n\nIn order to complete your signature, we must confirm your e-mail.\nPlease do so by visiting the following email confirmation web page:\n\n{$petition.confirmUrlPlainText}\n\nIf you did not sign this petition, please ignore this message.\n','{assign var=\"greeting\" value=\"{contact.email_greeting}\"}{if $greeting}<p>{$greeting},</p>{/if}\n\n<p>Thank you for signing {$petition.title}.</p>\n\n<p>In order to <b>complete your signature</b>, we must confirm your e-mail.\n<br />\nPlease do so by visiting the following web page by clicking\non the link below or pasting the link into your browser.\n<br /><br />\nEmail confirmation page: <a href=\"{$petition.confirmUrl} \">{$petition.confirmUrl}</a></p>\n\n<p>If you did not sign this petition, please ignore this message.</p>\n',1,851,'petition_confirmation_needed',0,1,0,NULL),(65,'Sample CiviMail Newsletter Template','Sample CiviMail Newsletter','','<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n <title></title>\n</head>\n<body>\n\n<table width=612 cellpadding=0 cellspacing=0 bgcolor=\"#ffffff\">\n  <tr>\n    <td colspan=\"2\" bgcolor=\"#ffffff\" valign=\"middle\" >\n      <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" >\n        <tr>\n          <td>\n          <a href=\"https://civicrm.org\"><img src=\"https://civicrm.org/sites/civicrm.org/files/top-logo_2.png\" border=0 alt=\"Replace this logo with the URL to your own\"></a>\n          </td>\n          <td>&nbsp; &nbsp;</td>\n          <td>\n          <a href=\"https://civicrm.org\" style=\"text-decoration: none;\"><font size=5 face=\"Arial, Verdana, sans-serif\" color=\"#8bc539\">Your Newsletter Title</font></a>\n          </td>\n        </tr>\n      </table>\n    </td>\n  </tr>\n  <tr>\n    <td valign=\"top\" width=\"70%\">\n      <!-- left column -->\n      <table cellpadding=\"10\" cellspacing=\"0\" border=\"0\">\n      <tr>\n        <td style=\"font-family: Arial, Verdana, sans-serif; font-size: 12px;\" >\n        <font face=\"Arial, Verdana, sans-serif\" size=\"2\" >\n        Greetings {contact.display_name},\n        <br /><br />\n        This is a sample template designed to help you get started creating and sending your own CiviMail messages. This template uses an HTML layout that is generally compatible with the wide variety of email clients that your recipients might be using (e.g. Gmail, Outlook, Yahoo, etc.).\n        <br /><br />You can select this \"Sample CiviMail Newsletter Template\" from the \"Use Template\" drop-down in Step 3 of creating a mailing, and customize it to your needs. Then check the \"Save as New Template\" box on the bottom the page to save your customized version for use in future mailings.\n        <br /><br />The logo you use must be uploaded to your server.  Copy and paste the URL path to the logo into the &lt;img src= tag in the HTML at the top.  Click \"Source\" or the Image button if you are using the text editor.\n        <br /><br />\n        Edit the color of the links and headers using the color button or by editing the HTML.\n        <br /><br />\n        Your newsletter message and donation appeal can go here.  Click the link button to <a href=\"#\">create links</a> - remember to use a fully qualified URL starting with http:// in all your links!\n        <br /><br />\n        To use CiviMail:\n        <ul>\n          <li><a href=\"http://book.civicrm.org/user/advanced-configuration/email-system-configuration/\">Configure your Email System</a>.</li>\n          <li>Make sure your web hosting provider allows outgoing bulk mail, and see if they have a restriction on quantity.  If they don\'t allow bulk mail, consider <a href=\"https://civicrm.org/providers/hosting\">finding a new host</a>.</li>\n        </ul>\n        Sincerely,\n        <br /><br />\n        Your Team\n        <br /><br />\n        </font>\n        </td>\n      </tr>\n      </table>\n    </td>\n\n    <td valign=\"top\" width=\"30%\" bgcolor=\"#ffffff\" style=\"border: 1px solid #056085;\">\n      <!-- right column -->\n      <table cellpadding=10 cellspacing=0 border=0>\n      <tr>\n        <td bgcolor=\"#056085\"><font face=\"Arial, Verdana, sans-serif\" size=\"4\" color=\"#ffffff\">News and Events</font></td>\n      </tr>\n      <tr>\n        <td style=\"color: #000; font-family: Arial, Verdana, sans-serif; font-size: 12px;\" >\n        <font face=\"Arial, Verdana, sans-serif\" size=\"2\" >\n        <font color=\"#056085\"><strong>Featured Events</strong> </font><br />\n        Fundraising Dinner<br />\n        Training Meeting<br />\n        Board of Directors Annual Meeting<br />\n\n        <br /><br />\n        <font color=\"#056085\"><strong>Community Events</strong></font><br />\n        Bake Sale<br />\n        Charity Auction<br />\n        Art Exhibit<br />\n\n        <br /><br />\n        <font color=\"#056085\"><strong>Important Dates</strong></font><br />\n        Tuesday August 27<br />\n        Wednesday September 8<br />\n        Thursday September 29<br />\n        Saturday October 1<br />\n        Sunday October 20<br />\n        </font>\n        </td>\n      </tr>\n      </table>\n    </td>\n  </tr>\n\n  <tr>\n    <td colspan=\"2\">\n      <table cellpadding=\"10\" cellspacing=\"0\" border=\"0\">\n      <tr>\n        <td>\n        <font face=\"Arial, Verdana, sans-serif\" size=\"2\" >\n        <font color=\"#7dc857\"><strong>Helpful Tips</strong></font>\n        <br /><br />\n        <font color=\"#3b5187\">Tokens</font><br />\n        Click \"Insert Tokens\" to dynamically insert names, addresses, and other contact data of your recipients.\n        <br /><br />\n        <font color=\"#3b5187\">Plain Text Version</font><br />\n        Some people refuse HTML emails altogether.  We recommend sending a plain-text version of your important communications to accommodate them.  Luckily, CiviCRM accommodates for this!  Just click \"Plain Text\" and copy and paste in some text.  Line breaks (carriage returns) and fully qualified URLs like http://www.example.com are all you get, no HTML here!\n        <br /><br />\n        <font color=\"#3b5187\">Play by the Rules</font><br />\n        The address of the sender is required by the Can Spam Act law.  This is an available token called domain.address.  An unsubscribe or opt-out link is also required.  There are several available tokens for this. <em>{action.optOutUrl}</em> creates a link for recipients to click if they want to opt out of receiving  emails from your organization. <em>{action.unsubscribeUrl}</em> creates a link to unsubscribe from the specific mailing list used to send this message. Click on \"Insert Tokens\" to find these and look for tokens named \"Domain\" or \"Unsubscribe\".  This sample template includes both required tokens at the bottom of the message. You can also configure a default Mailing Footer containing these tokens.\n        <br /><br />\n        <font color=\"#3b5187\">Composing Offline</font><br />\n        If you prefer to compose an HTML email offline in your own text editor, you can upload this HTML content into CiviMail or simply click \"Source\" and then copy and paste the HTML in.\n        <br /><br />\n        <font color=\"#3b5187\">Images</font><br />\n        Most email clients these days (Outlook, Gmail, etc) block image loading by default.  This is to protect their users from annoying or harmful email.  Not much we can do about this, so encourage recipients to add you to their contacts or \"whitelist\".  Also use images sparingly, do not rely on images to convey vital information, and always use HTML \"alt\" tags which describe the image content.\n        </td>\n      </tr>\n      </table>\n    </td>\n  </tr>\n  <tr>\n    <td colspan=\"2\" style=\"color: #000; font-family: Arial, Verdana, sans-serif; font-size: 10px;\">\n      <font face=\"Arial, Verdana, sans-serif\" size=\"2\" >\n      <hr />\n      <a href=\"{action.unsubscribeUrl}\" title=\"click to unsubscribe\">Click here</a> to unsubscribe from this mailing list.<br /><br />\n      Our mailing address is:<br />\n      {domain.address}\n    </td>\n  </tr>\n  </table>\n\n</body>\n</html>\n',1,NULL,NULL,1,0,0,NULL),(66,'Sample Responsive Design Newsletter - Single Column Template','Sample Responsive Design Newsletter - Single Column','','<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" />\n  <meta content=\"width=device-width, initial-scale=1.0\" name=\"viewport\" />\n  <title></title>\n\n  <style type=\"text/css\">\n    {literal}\n    /* Client-specific Styles */\n    #outlook a {padding:0;} /* Force Outlook to provide a \"view in browser\" menu link. */\n    body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}\n\n    /* Prevent Webkit and Windows Mobile platforms from changing default font sizes, while not breaking desktop design. */\n    .ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */\n    .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;} /* Force Hotmail to display normal line spacing. */\n    #backgroundTable {margin:0; padding:0; width:100% !important; line-height: 100% !important;}\n    img {outline:none; text-decoration:none;border:none; -ms-interpolation-mode: bicubic;}\n    a img {border:none;}\n    .image_fix {display:block;}\n    p {margin: 0px 0px !important;}\n    table td {border-collapse: collapse;}\n    table { border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt; }\n    a {text-decoration: none;text-decoration:none;}\n\n    /*STYLES*/\n    table[class=full] { width: 100%; clear: both; }\n\n    /*IPAD STYLES*/\n    @media only screen and (max-width: 640px) {\n    a[href^=\"tel\"], a[href^=\"sms\"] {text-decoration: none;color:#136388;pointer-events: none;cursor: default;}\n    .mobile_link a[href^=\"tel\"], .mobile_link a[href^=\"sms\"] {text-decoration: default;color:#136388;pointer-events: auto;cursor: default;}\n    table[class=devicewidth] {width: 440px!important;text-align:center!important;}\n    table[class=devicewidthmob] {width: 416px!important;text-align:center!important;}\n    table[class=devicewidthinner] {width: 416px!important;text-align:center!important;}\n    img[class=banner] {width: 440px!important;auto!important;}\n    img[class=col2img] {width: 440px!important;height:auto!important;}\n    table[class=\"cols3inner\"] {width: 100px!important;}\n    table[class=\"col3img\"] {width: 131px!important;}\n    img[class=\"col3img\"] {width: 131px!important;height: auto!important;}\n    table[class=\"removeMobile\"]{width:10px!important;}\n    img[class=\"blog\"] {width: 440px!important;height: auto!important;}\n    }\n\n    /*IPHONE STYLES*/\n    @media only screen and (max-width: 480px) {\n    a[href^=\"tel\"], a[href^=\"sms\"] {text-decoration: none;color: #136388;pointer-events: none;cursor: default;}\n    .mobile_link a[href^=\"tel\"], .mobile_link a[href^=\"sms\"] {text-decoration: none;color:#136388;pointer-events: auto;cursor: default;}\n\n    table[class=devicewidth] {width: 280px!important;text-align:center!important;}\n    table[class=devicewidthmob] {width: 260px!important;text-align:center!important;}\n    table[class=devicewidthinner] {width: 260px!important;text-align:center!important;}\n    img[class=banner] {width: 280px!important;height:100px!important;}\n    img[class=col2img] {width: 280px!important;height:auto!important;}\n    table[class=\"cols3inner\"] {width: 260px!important;}\n    img[class=\"col3img\"] {width: 280px!important;height: auto!important;}\n    table[class=\"col3img\"] {width: 280px!important;}\n    img[class=\"blog\"] {width: 280px!important;auto!important;}\n    td[class=\"padding-top-right15\"]{padding:15px 15px 0 0 !important;}\n    td[class=\"padding-right15\"]{padding-right:15px !important;}\n    }\n\n    @media only screen and (max-device-width: 800px)\n    {td[class=\"padding-top-right15\"]{padding:15px 15px 0 0 !important;}\n    td[class=\"padding-right15\"]{padding-right:15px !important;}}\n    @media only screen and (max-device-width: 769px) {\n    .devicewidthmob {font-size:16px;}\n    }\n\n    @media only screen and (max-width: 640px) {\n    .desktop-spacer {display:none !important;}\n }\n  {/literal}\n  </style>\n\n<body>\n  <!-- Start of preheader --><!-- Start of preheader -->\n  <table bgcolor=\"#89c66b\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td height=\"20\" width=\"100%\">&nbsp;</td>\n  								</tr>\n  								<!-- Spacing -->\n  								<tr>\n  									<td>\n  									<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"310\">\n  										<tbody>\n  											<tr>\n  												<td align=\"left\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; line-height:120%; color: #f8f8f8;padding-left:15px; padding-bottom:5px;\" valign=\"middle\">Organization or Program Name Here</td>\n  											</tr>\n  										</tbody>\n  									</table>\n\n  									<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"emhide\" width=\"310\">\n  										<tbody>\n  											<tr>\n                          <td align=\"right\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px;color: #f8f8f8;padding-right:15px; text-align:right;\" valign=\"middle\">Month and Year</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  								<!-- Spacing -->\n  								<tr>\n  									<td height=\"20\" width=\"100%\">&nbsp;</td>\n  								</tr>\n  								<!-- Spacing -->\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- End of main-banner-->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td height=\"20\" width=\"100%\">\n  									<table align=\"center\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\" width=\"93%\">\n  										<tbody>\n  											<tr>\n                          <td rowspan=\"2\" style=\"padding-top:10px; padding-bottom:10px;\" width=\"38%\"><img src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/civicrm-logo-transparent.png\" alt=\"Replace with your own logo\" width=\"220\" border=\"0\" /></td>\n  												<td align=\"right\" width=\"62%\">\n  												<h6 class=\"collapse\">&nbsp;</h6>\n  												</td>\n  											</tr>\n  											<tr>\n  												<td align=\"right\">\n  												<h5 style=\"font-family: Gill Sans, Gill Sans MT, Myriad Pro, DejaVu Sans Condensed, Helvetica, Arial, sans-serif; color:#136388;\">&nbsp;</h5>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  								<tr>\n  									<td>\n  									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  										<tbody>\n  											<tr>\n  												<td width=\"100%\">\n  												<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  													<tbody><!-- /Spacing -->\n  														<tr>\n  															<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 23px; color:#f8f8f8; text-align:left; line-height: 32px; padding:5px 15px; background-color:#136388;\">Headline Here</td>\n  														</tr>\n  														<!-- Spacing -->\n  														<tr>\n  															<td>\n  															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"650\">\n  																<tbody><!-- hero story -->\n  																	<tr>\n  																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n  																		<div class=\"imgpop\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"auto\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/650x396.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"650\" /></a></div>\n  																		</td>\n  																	</tr>\n  																	<!-- /hero image --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing -->\n  																	<tr>\n  																		<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;  text-align:left; line-height: 26px; padding:0 15px; color:#89c66b;\"><a href=\"#\" style=\"color:#89c66b;\">Your Heading Here</a></td>\n  																	</tr>\n  																	<!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing --><!-- content -->\n  																	<tr>\n  																		<td style=\"padding:0 15px;\">\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #7a6e67; text-align:left; line-height: 26px; padding-bottom:10px;\">{contact.email_greeting},																		</p>\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #7a6e67; text-align:left; line-height: 26px; padding-bottom:10px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Replace with your text and images, and remember to link the facebook and twitter links in the footer to your pages. Have fun!</span></p>\n  																		</td>\n  																	</tr>\n  																	<tr>\n  																		<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px; padding-left:15px;\"><a href=\"#\" style=\"color:#136388;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"read more\">Read More</a></td>\n  																	</tr>\n  																	<!-- /button --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n  																	</tr>\n  																	<!-- Spacing --><!-- end of content -->\n  																</tbody>\n  															</table>\n  															</td>\n  														</tr>\n  													</tbody>\n  												</table>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- end of hero image and story --><!-- story 1 -->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td>\n  									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  										<tbody>\n  											<tr>\n  												<td width=\"100%\">\n  												<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  													<tbody>\n  														<tr>\n  															<td>\n  															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"650\">\n  																<tbody><!-- image -->\n  																	<tr>\n  																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n  																		<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"250\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/banner-image-650-250.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"650\" /></a></div>\n  																		</td>\n  																	</tr>\n  																	<!-- /image --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing -->\n  																	<tr>\n  																		<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;  text-align:left; line-height: 26px; padding:0 15px;\"><a href=\"#\" style=\"color:#89c66b;\">Your Heading  Here</a></td>\n  																	</tr>\n  																	<!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing --><!-- content -->\n  																	<tr>\n  																		<td style=\"padding:0 15px;\">\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #7a6e67; text-align:left; line-height: 26px; padding-bottom:10px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna </p>\n  																		</td>\n  																	</tr>\n  																	<tr>\n  																		<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px; padding-left:15px;\"><a href=\"#\" style=\"color:#136388;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"read more\">Read More</a></td>\n  																	</tr>\n  																	<!-- /button --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n  																	</tr>\n  																	<!-- Spacing --><!-- end of content -->\n  																</tbody>\n  															</table>\n  															</td>\n  														</tr>\n  													</tbody>\n  												</table>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- /story 2--><!-- banner1 -->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td>\n  									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  										<tbody>\n  											<tr>\n  												<td width=\"100%\">\n  												<table align=\"center\" bgcolor=\"#89c66b\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  													<tbody>\n  														<tr>\n  															<td>\n  															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"650\">\n  																<tbody><!-- image -->\n  																	<tr>\n  																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n  																		<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"auto\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/banner-image-650-250.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"650\" /></a></div>\n  																		</td>\n  																	</tr>\n  																	<!-- /image --><!-- content --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing -->\n  																	<tr>\n  																		<td style=\"padding:15px;\">\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #f0f0f0; text-align:left; line-height: 26px; padding-bottom:10px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna </p>\n  																		</td>\n  																	</tr>\n  																	<!-- /button --><!-- white button -->\n  																	<!-- /button --><!-- Spacing --><!-- end of content -->\n  																</tbody>\n  															</table>\n  															</td>\n  														</tr>\n  													</tbody>\n  												</table>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- /banner 1--><!-- banner 2 -->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td>\n  									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  										<tbody>\n  											<tr>\n  												<td width=\"100%\">\n  												<table align=\"center\" bgcolor=\"#136388\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  													<tbody>\n  														<tr>\n  															<td>\n  															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"650\">\n  																<tbody><!-- image -->\n  																	<tr>\n  																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n  																		<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"auto\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/banner-image-650-250.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"650\" /></a></div>\n  																		</td>\n  																	</tr>\n  																	<!-- /image --><!-- content --><!-- Spacing -->\n  																	<tr>\n  																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n  																	</tr>\n  																	<!-- /Spacing -->\n  																	<tr>\n  																		<td style=\"padding: 15px;\">\n  																		<p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color: #f0f0f0; text-align:left; line-height: 26px; padding-bottom:10px;\">Remember to link the facebook and twitter links below to your pages!</p>\n  																		</td>\n  																	</tr>\n  																	<!-- /button --><!-- white button -->\n  																	<tr>\n  																		<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px; padding-bottom:10px; padding-left:15px;\"><a href=\"#\" style=\"color:#ffffff;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"read more\">Read More</a></td>\n  																	</tr>\n  																	<!-- /button --><!-- Spacing --><!-- end of content -->\n  																</tbody>\n  															</table>\n  															</td>\n  														</tr>\n  													</tbody>\n  												</table>\n  												</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									</td>\n  								</tr>\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n  <!-- /banner2 --><!-- footer -->\n\n  <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"footer\" width=\"100%\">\n  	<tbody>\n  		<tr>\n  			<td>\n  			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  				<tbody>\n  					<tr>\n  						<td width=\"100%\">\n  						<table align=\"center\" bgcolor=\"#89c66b\"  border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"650\">\n  							<tbody><!-- Spacing -->\n  								<tr>\n  									<td height=\"10\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n  								</tr>\n  								<!-- Spacing -->\n  								<tr>\n  									<td><!-- logo -->\n  									<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"250\">\n  										<tbody>\n  											<tr>\n  												<td width=\"20\">&nbsp;</td>\n  												<td align=\"left\" height=\"40\" width=\"250\"><span style=\"font-family: Helvetica, arial, sans-serif; font-size: 13px; text-align:left; line-height: 26px; padding-bottom:10px;\"><a href=\"{action.unsubscribeUrl}\" style=\"color: #f0f0f0; \">Unsubscribe | </a><a href=\"{action.subscribeUrl}\"  style=\"color: #f0f0f0;\">Subscribe |</a> <a href=\"{action.optOutUrl}\" style=\"color: #f0f0f0;\">Opt out</a></span></td>\n  											</tr>\n  											<tr>\n  												<td width=\"20\">&nbsp;</td>\n  												<td align=\"left\" height=\"40\" width=\"250\"><span style=\"font-family: Helvetica, arial, sans-serif; font-size: 13px; text-align:left; line-height: 26px; padding-bottom:10px; color: #f0f0f0;\">{domain.address}</span></td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									<!-- end of logo --><!-- start of social icons -->\n\n  									<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" height=\"40\" vaalign=\"middle\" width=\"60\">\n  										<tbody>\n  											<tr>\n  												<td align=\"left\" height=\"22\" width=\"22\">\n  												<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" height=\"22\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/facebook.png\" style=\"display:block; border:none; outline:none; text-decoration:none;\" width=\"22\" /> </a></div>\n  												</td>\n  												<td align=\"left\" style=\"font-size:1px; line-height:1px;\" width=\"10\">&nbsp;</td>\n  												<td align=\"right\" height=\"22\" width=\"22\">\n  												<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" height=\"22\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/twitter.png\" style=\"display:block; border:none; outline:none; text-decoration:none;\" width=\"22\" /> </a></div>\n  												</td>\n  												<td align=\"left\" style=\"font-size:1px; line-height:1px;\" width=\"20\">&nbsp;</td>\n  											</tr>\n  										</tbody>\n  									</table>\n  									<!-- end of social icons --></td>\n  								</tr>\n  								<!-- Spacing -->\n  								<tr>\n  									<td height=\"10\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n  								</tr>\n  								<!-- Spacing -->\n  							</tbody>\n  						</table>\n  						</td>\n  					</tr>\n  				</tbody>\n  			</table>\n  			</td>\n  		</tr>\n  	</tbody>\n  </table>\n\n</body>\n</html>\n',1,NULL,NULL,1,0,0,NULL),(67,'Sample Responsive Design Newsletter - Two Column Template','Sample Responsive Design Newsletter - Two Column','','<html xmlns=\"http://www.w3.org/1999/xhtml\">\n  <meta content=\"text/html; charset=utf-8\" http-equiv=\"Content-Type\" />\n  <meta content=\"width=device-width, initial-scale=1.0\" name=\"viewport\" />\n  <title></title>\n  <style type=\"text/css\">\n     {literal}\n     img {height: auto !important;}\n     /* Client-specific Styles */\n     #outlook a {padding:0;} /* Force Outlook to provide a \"view in browser\" menu link. */\n     body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}\n\n     /* Prevent Webkit and Windows Mobile platforms from changing default font sizes, while not breaking desktop design. */\n     .ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */\n     .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;} /* Force Hotmail to display normal line spacing. */\n     #backgroundTable {margin:0; padding:0; width:100% !important; line-height: 100% !important;}\n     img {outline:none; text-decoration:none;border:none; -ms-interpolation-mode: bicubic;}\n     a img {border:none;}\n     .image_fix {display:block;}\n     p {margin: 0px 0px !important;}\n     table td {border-collapse: collapse;}\n     table { border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt; }\n     a {/*color: #33b9ff;*/text-decoration: none;text-decoration:none!important;}\n\n\n     /*STYLES*/\n     table[class=full] { width: 100%; clear: both; }\n\n     /*IPAD STYLES*/\n     @media only screen and (max-width: 640px) {\n     a[href^=\"tel\"], a[href^=\"sms\"] {text-decoration: none;color: #0a8cce;pointer-events: none;cursor: default;}\n     .mobile_link a[href^=\"tel\"], .mobile_link a[href^=\"sms\"] {text-decoration: default;color: #0a8cce !important;pointer-events: auto;cursor: default;}\n     table[class=devicewidth] {width: 440px!important;text-align:center!important;}\n     table[class=devicewidthmob] {width: 414px!important;text-align:center!important;}\n     table[class=devicewidthinner] {width: 414px!important;text-align:center!important;}\n     img[class=banner] {width: 440px!important;auto!important;}\n     img[class=col2img] {width: 440px!important;height:auto!important;}\n     table[class=\"cols3inner\"] {width: 100px!important;}\n     table[class=\"col3img\"] {width: 131px!important;}\n     img[class=\"col3img\"] {width: 131px!important;height: auto!important;}\n     table[class=\"removeMobile\"]{width:10px!important;}\n     img[class=\"blog\"] {width: 440px!important;height: auto!important;}\n     }\n\n     /*IPHONE STYLES*/\n     @media only screen and (max-width: 480px) {\n     a[href^=\"tel\"], a[href^=\"sms\"] {text-decoration: none;color: #0a8cce;pointer-events: none;cursor: default;}\n     .mobile_link a[href^=\"tel\"], .mobile_link a[href^=\"sms\"] {text-decoration: default;color: #0a8cce !important; pointer-events: auto;cursor: default;}\n     table[class=devicewidth] {width: 280px!important;text-align:center!important;}\n     table[class=devicewidthmob] {width: 260px!important;text-align:center!important;}\n     table[class=devicewidthinner] {width: 260px!important;text-align:center!important;}\n     img[class=banner] {width: 280px!important;height:100px!important;}\n     img[class=col2img] {width: 280px!important;height:auto!important;}\n     table[class=\"cols3inner\"] {width: 260px!important;}\n     img[class=\"col3img\"] {width: 280px!important;height: auto!important;}\n     table[class=\"col3img\"] {width: 280px!important;}\n     img[class=\"blog\"] {width: 280px!important;auto!important;}\n     td[class=\"padding-top-right15\"]{padding:15px 15px 0 0 !important;}\n     td[class=\"padding-right15\"]{padding-right:15px !important;}\n     }\n\n     @media only screen and (max-device-width: 800px)\n     {td[class=\"padding-top-right15\"]{padding:15px 15px 0 0 !important;}\n     td[class=\"padding-right15\"]{padding-right:15px !important;}}\n     @media only screen and (max-device-width: 769px) {.devicewidthmob {font-size:14px;}}\n\n     @media only screen and (max-width: 640px) {.desktop-spacer {display:none !important;}\n	   }\n     {/literal}\n  </style>\n  <body>\n    <!-- Start of preheader --><!-- Start of preheader -->\n    <table bgcolor=\"#0B4151\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" width=\"100%\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"360\">\n    										<tbody>\n    											<tr>\n    												<td align=\"left\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height:120%; color: #f8f8f8;padding-left:15px;\" valign=\"middle\">Organization or Program Name Here</td>\n    											</tr>\n    										</tbody>\n    									</table>\n\n    									<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"emhide\" width=\"320\">\n    										<tbody>\n    											<tr>\n    												<td align=\"right\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px;color: #f8f8f8;padding-right:15px;\" valign=\"middle\">Month Year</td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" width=\"100%\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- End of preheader --><!-- start of logo -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" width=\"100%\">\n    									<table align=\"center\" border=\"0\" cellpadding=\"2\" cellspacing=\"0\" width=\"93%\">\n    										<tbody>\n    											<tr>\n                             <td rowspan=\"2\" width=\"330\"><a href=\"#\"> <div class=\"imgpop\"><img src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/civicrm-logo-transparent.png\" alt=\"Replace with your own logo\" width=\"220\" border=\"0\" style=\"display:block;\"/></div></a></td>\n                            <td align=\"right\" >\n    												<h6 class=\"collapse\">&nbsp;</h6>\n    												</td>\n    											</tr>\n    											<tr>\n    												<td align=\"right\">\n\n    												</td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- end of logo --> <!-- hero story 1 -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"101%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#f8f8f8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody>\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    										<tbody>\n    											<tr>\n    												<td width=\"100%\">\n    												<table align=\"center\" bgcolor=\"#f8f8f8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    													<tbody><!-- /Spacing -->\n    														<tr>\n    															<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 24px; color:#f8f8f8; text-align:left; line-height: 26px; padding:5px 15px; background-color: #80C457\">Hero Story Heading</td>\n    														</tr>\n    														<!-- Spacing -->\n    														<tr>\n    															<td>\n    															<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthinner\" width=\"700\">\n    																<tbody><!-- image -->\n    																	<tr>\n    																		<td align=\"center\" class=\"devicewidthinner\" width=\"100%\">\n    																		<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" class=\"blog\" height=\"396\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/700x396.png\" style=\"display:block; border:none; outline:none; text-decoration:none; padding:0; line-height:0;\" width=\"700\" /></a></div>\n    																		</td>\n    																	</tr>\n    																	<!-- /image --><!-- Spacing -->\n    																	<tr>\n    																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    																	</tr>\n    																	<!-- /Spacing --><!-- hero story -->\n    																	<tr>\n    																		<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;  text-align:left; line-height: 26px; padding:0 15px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Subheading Here</a></td>\n    																	</tr>\n    																	<!-- Spacing -->\n    																	<tr>\n    																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    																	</tr><!-- /Spacing -->\n    																	<tr>\n    																		<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 26px; padding:0 15px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Replace with your text and images, and remember to link the facebook and twitter links in the footer to your pages. Have fun!</span></td>\n    																	</tr>\n\n    <!-- Spacing -->\n    																	<tr>\n    																		<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    																	</tr><!-- /Spacing -->\n\n              <!-- /Spacing --><!-- /hero story -->\n\n    																	<!-- Spacing -->                                                            <!-- Spacing -->\n\n\n\n    																	<!-- Spacing --><!-- end of content -->\n    																</tbody>\n    															</table>\n    															</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												</td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Section Heading -->\n    								<tr>\n    									<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 24px; color:#f8f8f8; text-align:left; line-height: 26px; padding:5px 15px; background-color: #80C457\">Section Heading Here</td>\n    								</tr>\n    								<!-- /Section Heading -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /hero story 1 --><!-- story one -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td class=\"desktop-spacer\" height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"660\">\n    										<tbody>\n    											<tr>\n    												<td><!-- Start of left column -->\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"330\">\n    													<tbody><!-- image -->\n    														<tr>\n    															<td align=\"center\" class=\"devicewidth\" height=\"150\" valign=\"top\" width=\"330\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"col2img\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/330x150.png\" style=\"display:block; border:none; outline:none; text-decoration:none; display:block;\" width=\"330\" /></a></td>\n    														</tr>\n    														<!-- /image -->\n    													</tbody>\n    												</table>\n    												<!-- end of left column --><!-- spacing for mobile devices-->\n\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"mobilespacing\">\n    													<tbody>\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												<!-- end of for mobile devices--><!-- start of right column -->\n\n    												<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"310\">\n    													<tbody>\n    														<tr>\n    															<td class=\"padding-top-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px; text-align:left; line-height: 24px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Heading Here</a><a href=\"#\" style=\"color:#076187; text-decoration:none;\" target=\"_blank\" title=\"CiviCRM helps keep the “City Beautiful” Movement”going strong\"></a></td>\n    														</tr>\n    														<!-- end of title --><!-- Spacing -->\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    														<!-- /Spacing --><!-- content -->\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                                                                tempor incididunt ut labore et dolore magna </span></td>\n    														</tr>\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px;\"><a href=\"#\" style=\"color:#80C457;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"CiviCRM helps keep the “City Beautiful” Movement”going strong\">Read More</a></td>\n    														</tr>\n    														<!-- /button --><!-- end of content -->\n    													</tbody>\n    												</table>\n    												<!-- end of right column --></td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /story one -->\n    <!-- story two -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td bgcolor=\"#076187\" height=\"0\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing --><!-- Spacing -->\n    								<tr>\n    									<td class=\"desktop-spacer\" height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"660\">\n    										<tbody>\n    											<tr>\n    												<td><!-- Start of left column -->\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"330\">\n    													<tbody><!-- image -->\n    														<tr>\n    															<td align=\"center\" class=\"devicewidth\" height=\"150\" valign=\"top\" width=\"330\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"col2img\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/330x150.png\" style=\"display:block; border:none; outline:none; text-decoration:none; display:block;\" width=\"330\" /></a></td>\n    														</tr>\n    														<!-- /image -->\n    													</tbody>\n    												</table>\n    												<!-- end of left column --><!-- spacing for mobile devices-->\n\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"mobilespacing\">\n    													<tbody>\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												<!-- end of for mobile devices--><!-- start of right column -->\n\n    												<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"310\">\n    													<tbody>\n    														<tr>\n    															<td class=\"padding-top-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px; text-align:left; line-height: 24px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Heading Here</a><a href=\"#\" style=\"color:#076187; text-decoration:none;\" target=\"_blank\" title=\"How CiviCRM will take Tribodar Eco Learning Center to another level\"></a></td>\n    														</tr>\n    														<!-- end of title --><!-- Spacing -->\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    														<!-- /Spacing --><!-- content -->\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                                                                tempor incididunt ut labore et dolore magna </span></td>\n    														</tr>\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px;\"><a href=\"#\" style=\"color:#80C457;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"How CiviCRM will take Tribodar Eco Learning Center to another level\">Read More</a></td>\n    														</tr>\n    														<!-- /button --><!-- end of content -->\n    													</tbody>\n    												</table>\n    												<!-- end of right column --></td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /story two --><!-- story three -->\n\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody><!-- Spacing -->\n    								<tr>\n    									<td bgcolor=\"#076187\" height=\"0\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing --><!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" class=\"desktop-spacer\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"660\">\n    										<tbody>\n    											<tr>\n    												<td><!-- Start of left column -->\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"330\">\n    													<tbody><!-- image -->\n    														<tr>\n    															<td align=\"center\" class=\"devicewidth\" height=\"150\" valign=\"top\" width=\"330\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"col2img\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/330x150.png\" style=\"display:block; border:none; outline:none; text-decoration:none; display:block;\" width=\"330\" /></a></td>\n    														</tr>\n    														<!-- /image -->\n    													</tbody>\n    												</table>\n    												<!-- end of left column --><!-- spacing for mobile devices-->\n\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"mobilespacing\">\n    													<tbody>\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												<!-- end of for mobile devices--><!-- start of right column -->\n\n    												<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"310\">\n    													<tbody>\n    														<tr>\n    															<td class=\"padding-top-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;  text-align:left; line-height: 24px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Heading Here</a><a href=\"#\" style=\"color:#076187; text-decoration:none;\" target=\"_blank\" title=\"CiviCRM provides a soup-to-nuts open-source solution for Friends of the San Pedro River\"></a></td>\n    														</tr>\n    														<!-- end of title --><!-- Spacing -->\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    														<!-- /Spacing --><!-- content -->\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                                                                tempor incididunt ut labore et dolore magna </span></td>\n    														</tr>\n    														<tr>\n    															<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px;\"><a href=\"#\" style=\"color:#80C457;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"CiviCRM provides a soup-to-nuts open-source solution for Friends of the San Pedro River\">Read More</a></td>\n    														</tr>\n    														<!-- /button --><!-- end of content -->\n    													</tbody>\n    												</table>\n    												<!-- end of right column --></td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /story three -->\n\n\n\n\n\n    <!-- story four -->\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"left-image\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				<tbody>\n    					<tr>\n    						<td width=\"100%\">\n    						<table align=\"center\" bgcolor=\"#ffffff\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    							<tbody>\n                                <!-- Spacing -->\n    								<tr>\n    									<td bgcolor=\"#076187\" height=\"0\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n                                <!-- Spacing -->\n    								<tr>\n    									<td class=\"desktop-spacer\" height=\"20\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td>\n    									<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"660\">\n    										<tbody>\n    											<tr>\n    												<td><!-- Start of left column -->\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"330\">\n    													<tbody><!-- image -->\n    														<tr>\n    															<td align=\"center\" class=\"devicewidth\" height=\"150\" valign=\"top\" width=\"330\"><a href=\"#\"><img alt=\"\" border=\"0\" class=\"col2img\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/330x150.png\" style=\"display:block; border:none; outline:none; text-decoration:none; display:block;\" width=\"330\" /></a></td>\n    														</tr>\n    														<!-- /image -->\n    													</tbody>\n    												</table>\n    												<!-- end of left column --><!-- spacing for mobile devices-->\n\n    												<table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"mobilespacing\">\n    													<tbody>\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    													</tbody>\n    												</table>\n    												<!-- end of for mobile devices--><!-- start of right column -->\n\n    												<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidthmob\" width=\"310\">\n    													<tbody>\n    														<tr>\n    															<td class=\"padding-top-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 18px;text-align:left; line-height: 24px;\"><a href=\"#\" style=\"color:#076187; text-decoration:none; \" target=\"_blank\">Heading Here</a><a href=\"#\" style=\"color:#076187; text-decoration:none;\" target=\"_blank\" title=\"Google Summer of Code\"></a></td>\n    														</tr>\n    														<!-- end of title --><!-- Spacing -->\n    														<tr>\n    															<td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n    														</tr>\n    														<!-- /Spacing --><!-- content -->\n    														<tr>\n    															<td class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\"><span class=\"padding-right15\" style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; color: #7a6e67; text-align:left; line-height: 24px;\">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                                                                tempor incididunt ut labore et dolore magna </span></td>\n    														</tr>\n    														<tr>\n    															<td style=\"font-family: Helvetica, arial, sans-serif; font-size: 14px; font-weight:bold; color: #333333; text-align:left;line-height: 24px; padding-top:10px;\"><a href=\"#\" style=\"color:#80C457;text-decoration:none;font-weight:bold;\" target=\"_blank\" title=\"Google Summer of Code\">Read More</a></td>\n    														</tr>\n    														<!-- /button --><!-- end of content -->\n    													</tbody>\n    												</table>\n    												<!-- end of right column --></td>\n    											</tr>\n    										</tbody>\n    									</table>\n    									</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n                       <td height=\"15\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\" width=\"100%\">&nbsp;</td>\n                    </tr>\n                    <!-- /Spacing -->\n                    <tr>\n                      <td style=\"padding: 15px;\">\n                      <p style=\"font-family: Helvetica, arial, sans-serif; font-size: 16px; color:#076187; text-align:left; line-height: 26px; padding-bottom:10px;\">Remember to link the facebook and twitter links below to your pages!</p>\n                      </td>\n    								</tr>\n    								<!-- Spacing -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- /story four -->\n\n    <!-- footer -->\n\n    <!-- End of footer --><!-- Start of postfooter -->\n    <table bgcolor=\"#d8d8d8\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" id=\"backgroundTable\" st-sortable=\"footer\" width=\"100%\">\n    	<tbody>\n    		<tr>\n    			<td>\n    			<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n            <tbody>\n              <tr>\n                <td width=\"100%\">\n                  <table align=\"center\" bgcolor=\"#89c66b\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" class=\"devicewidth\" width=\"700\">\n    				        <tbody><!-- Spacing -->\n    					        <tr>\n                        <td height=\"10\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    					        </tr>\n    					        <!-- Spacing -->\n    					        <tr>\n                        <td><!-- logo -->\n                        <table align=\"left\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"250\">\n            							<tbody>\n            								<tr>\n                               <td width=\"20\">&nbsp;</td>\n                              <td align=\"left\" height=\"40\" width=\"250\"><span style=\"font-family: Helvetica, arial, sans-serif; font-size: 13px; text-align:left; line-height: 26px; padding-bottom:10px;\"><a href=\"{action.unsubscribeUrl}\" style=\"color: #f0f0f0;\">Unsubscribe | </a><a href=\"{action.subscribeUrl}\" style=\"color: #f0f0f0;\">Subscribe |</a> <a href=\"{action.optOutUrl}\" style=\"color: #f0f0f0;\">Opt out</a></span></td>\n                            </tr>\n      											<tr>\n      												<td width=\"20\">&nbsp;</td>\n      												<td align=\"left\" height=\"40\" width=\"250\"><span style=\"font-family: Helvetica, arial, sans-serif; font-size: 13px; text-align:left; line-height: 26px; padding-bottom:10px; color: #f0f0f0;\">{domain.address}</span></td>\n      											</tr>\n                          </tbody>\n                        </table>\n                        <!-- end of logo --><!-- start of social icons -->\n      									<table align=\"right\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" height=\"40\" vaalign=\"middle\" width=\"60\">\n      										<tbody>\n      											<tr>\n      												<td align=\"left\" height=\"22\" width=\"22\">\n                                <div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" height=\"22\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/facebook.png\" style=\"display:block; border:none; outline:none; text-decoration:none;\" width=\"22\" /> </a></div>      											  </td>\n      												<td align=\"left\" style=\"font-size:1px; line-height:1px;\" width=\"10\">&nbsp;</td>\n      												<td align=\"right\" height=\"22\" width=\"22\">\n      												<div class=\"imgpop\"><a href=\"#\" target=\"_blank\"><img alt=\"\" border=\"0\" height=\"22\" src=\"https://civicrm.org/sites/default/files/civicrm/custom/images/twitter.png\" style=\"display:block; border:none; outline:none; text-decoration:none;\" width=\"22\" /> </a></div>\n      												</td>\n      												<td align=\"left\" style=\"font-size:1px; line-height:1px;\" width=\"20\">&nbsp;</td>\n      											</tr>\n      										</tbody>\n      									</table>\n    									<!-- end of social icons --></td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td height=\"10\" style=\"font-size:1px; line-height:1px; mso-line-height-rule: exactly;\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    								<tr>\n    									<td bgcolor=\"#80C457\" height=\"10\" width=\"100%\">&nbsp;</td>\n    								</tr>\n    								<!-- Spacing -->\n    							</tbody>\n    						</table>\n    						</td>\n    					</tr>\n    				</tbody>\n    			</table>\n    			</td>\n    		</tr>\n    	</tbody>\n    </table>\n    <!-- End of footer -->\n  </body>\n</html>\n',1,NULL,NULL,1,0,0,NULL);
 /*!40000 ALTER TABLE `civicrm_msg_template` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -987,7 +987,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_note` WRITE;
 /*!40000 ALTER TABLE `civicrm_note` DISABLE KEYS */;
-INSERT INTO `civicrm_note` (`id`, `entity_table`, `entity_id`, `note`, `contact_id`, `modified_date`, `subject`, `privacy`) VALUES (1,'civicrm_contact',28,'Send newsletter for April 2005',1,'2019-09-02 00:41:40',NULL,'0'),(2,'civicrm_contact',107,'Arrange collection of funds from members',1,'2019-09-09 01:52:24',NULL,'0'),(3,'civicrm_contact',55,'Arrange for cricket match with Sunil Gavaskar',1,'2020-03-17 05:55:57',NULL,'0'),(4,'civicrm_contact',127,'Arrange for cricket match with Sunil Gavaskar',1,'2020-01-06 16:42:05',NULL,'0'),(5,'civicrm_contact',11,'Get the registration done for NGO status',1,'2020-03-14 21:36:20',NULL,'0'),(6,'civicrm_contact',31,'Arrange for cricket match with Sunil Gavaskar',1,'2020-01-15 12:34:59',NULL,'0'),(7,'civicrm_contact',9,'Get the registration done for NGO status',1,'2020-04-04 16:34:03',NULL,'0'),(8,'civicrm_contact',156,'Organize the Terry Fox run',1,'2020-06-11 17:14:32',NULL,'0'),(9,'civicrm_contact',184,'Organize the Terry Fox run',1,'2019-08-28 14:26:46',NULL,'0'),(10,'civicrm_contact',145,'Connect for presentation',1,'2020-04-11 06:37:49',NULL,'0'),(11,'civicrm_contact',142,'Get the registration done for NGO status',1,'2019-12-25 10:02:53',NULL,'0'),(12,'civicrm_contact',171,'Send reminder for annual dinner',1,'2020-01-31 09:23:45',NULL,'0'),(13,'civicrm_contact',134,'Connect for presentation',1,'2019-08-12 07:42:08',NULL,'0'),(14,'civicrm_contact',111,'Arrange collection of funds from members',1,'2020-06-17 02:20:44',NULL,'0'),(15,'civicrm_contact',50,'Arrange for cricket match with Sunil Gavaskar',1,'2020-06-25 17:58:48',NULL,'0'),(16,'civicrm_contact',122,'Contact the Commissioner of Charities',1,'2020-02-03 07:57:20',NULL,'0'),(17,'civicrm_contact',118,'Contact the Commissioner of Charities',1,'2020-07-15 08:44:29',NULL,'0'),(18,'civicrm_contact',71,'Get the registration done for NGO status',1,'2019-12-13 18:51:30',NULL,'0'),(19,'civicrm_contact',131,'Chart out route map for next 10k run',1,'2020-02-17 08:34:21',NULL,'0'),(20,'civicrm_contact',71,'Send newsletter for April 2005',1,'2019-08-13 01:44:38',NULL,'0');
+INSERT INTO `civicrm_note` (`id`, `entity_table`, `entity_id`, `note`, `contact_id`, `modified_date`, `subject`, `privacy`) VALUES (1,'civicrm_contact',103,'Reminder screening of \"Black\" on next Friday',1,'2020-05-12 08:19:43',NULL,'0'),(2,'civicrm_contact',147,'Connect for presentation',1,'2020-09-08 18:56:11',NULL,'0'),(3,'civicrm_contact',142,'Contact the Commissioner of Charities',1,'2020-02-20 18:25:14',NULL,'0'),(4,'civicrm_contact',30,'Organize the Terry Fox run',1,'2020-01-04 09:27:32',NULL,'0'),(5,'civicrm_contact',45,'Connect for presentation',1,'2020-04-22 01:12:38',NULL,'0'),(6,'civicrm_contact',28,'Send reminder for annual dinner',1,'2019-11-28 23:38:00',NULL,'0'),(7,'civicrm_contact',168,'Arrange collection of funds from members',1,'2020-05-13 09:36:53',NULL,'0'),(8,'civicrm_contact',143,'Chart out route map for next 10k run',1,'2019-10-16 15:21:30',NULL,'0'),(9,'civicrm_contact',103,'Arrange collection of funds from members',1,'2019-10-23 19:31:47',NULL,'0'),(10,'civicrm_contact',80,'Connect for presentation',1,'2019-10-17 10:49:44',NULL,'0'),(11,'civicrm_contact',68,'Invite members for the Steve Prefontaine 10k dream run',1,'2019-10-09 13:47:15',NULL,'0'),(12,'civicrm_contact',4,'Get the registration done for NGO status',1,'2020-04-17 14:41:12',NULL,'0'),(13,'civicrm_contact',163,'Send newsletter for April 2005',1,'2019-12-28 08:58:24',NULL,'0'),(14,'civicrm_contact',157,'Organize the Terry Fox run',1,'2020-09-12 23:13:45',NULL,'0'),(15,'civicrm_contact',147,'Invite members for the Steve Prefontaine 10k dream run',1,'2020-08-10 04:17:50',NULL,'0'),(16,'civicrm_contact',61,'Chart out route map for next 10k run',1,'2020-09-15 14:13:40',NULL,'0'),(17,'civicrm_contact',120,'Arrange for cricket match with Sunil Gavaskar',1,'2020-02-24 14:31:31',NULL,'0'),(18,'civicrm_contact',102,'Reminder screening of \"Black\" on next Friday',1,'2020-07-19 21:38:49',NULL,'0'),(19,'civicrm_contact',53,'Get the registration done for NGO status',1,'2020-02-14 22:18:17',NULL,'0'),(20,'civicrm_contact',37,'Arrange for cricket match with Sunil Gavaskar',1,'2020-06-05 20:05:08',NULL,'0');
 /*!40000 ALTER TABLE `civicrm_note` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1026,7 +1026,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_participant` WRITE;
 /*!40000 ALTER TABLE `civicrm_participant` DISABLE KEYS */;
-INSERT INTO `civicrm_participant` (`id`, `contact_id`, `event_id`, `status_id`, `role_id`, `register_date`, `source`, `fee_level`, `is_test`, `is_pay_later`, `fee_amount`, `registered_by_id`, `discount_id`, `fee_currency`, `campaign_id`, `discount_amount`, `cart_id`, `must_wait`, `transferred_to_contact_id`) VALUES (1,140,1,1,'1','2009-01-21 00:00:00','Check','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(2,167,2,2,'2','2008-05-07 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(3,95,3,3,'3','2008-05-05 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(4,103,1,4,'4','2008-10-21 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(5,73,2,1,'1','2008-01-10 00:00:00','Check','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(6,155,3,2,'2','2008-03-05 00:00:00','Direct Transfer','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(7,170,1,3,'3','2009-07-21 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(8,56,2,4,'4','2009-03-07 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(9,68,3,1,'1','2008-02-05 00:00:00','Direct Transfer','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(10,172,1,2,'2','2008-02-01 00:00:00','Check','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(11,133,2,3,'3','2009-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(12,31,3,4,'4','2009-03-06 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(13,57,1,1,'2','2008-06-04 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(14,111,2,2,'3','2008-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(15,8,3,4,'1','2008-07-04 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(16,109,1,4,'2','2009-01-21 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(17,195,2,2,'3','2008-01-10 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(18,162,3,3,'1','2009-03-05 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(19,5,1,2,'1','2008-10-21 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(20,94,2,4,'1','2009-01-10 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(21,41,3,1,'4','2008-03-25 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(22,54,1,2,'3','2009-10-21 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(23,102,2,4,'1','2008-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(24,24,3,3,'1','2008-03-11 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(25,180,3,2,'2','2008-04-05 00:00:00','Direct Transfer','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(26,21,1,1,'1','2009-01-21 00:00:00','Check','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(27,19,2,2,'2','2008-05-07 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(28,175,3,3,'3','2009-12-12 00:00:00','Direct Transfer','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(29,30,1,4,'4','2009-12-13 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(30,114,2,1,'1','2009-12-14 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(31,6,3,2,'2','2009-12-15 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(32,44,1,3,'3','2009-07-21 00:00:00','Check','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(33,129,2,4,'4','2009-03-07 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(34,60,3,1,'1','2009-12-15 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(35,165,1,2,'2','2009-12-13 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(36,120,2,3,'3','2009-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(37,49,3,4,'4','2009-03-06 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(38,23,1,1,'2','2009-12-13 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(39,18,2,2,'3','2008-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(40,200,3,4,'1','2009-12-14 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(41,99,1,4,'2','2009-01-21 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(42,196,2,2,'3','2009-12-15 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(43,130,3,3,'1','2009-03-05 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(44,90,1,2,'1','2009-12-13 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(45,98,2,4,'1','2009-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(46,70,3,1,'4','2009-12-13 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(47,194,1,2,'3','2009-10-21 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(48,105,2,4,'1','2009-12-10 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(49,110,3,3,'1','2009-03-11 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(50,106,3,2,'2','2009-04-05 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL);
+INSERT INTO `civicrm_participant` (`id`, `contact_id`, `event_id`, `status_id`, `role_id`, `register_date`, `source`, `fee_level`, `is_test`, `is_pay_later`, `fee_amount`, `registered_by_id`, `discount_id`, `fee_currency`, `campaign_id`, `discount_amount`, `cart_id`, `must_wait`, `transferred_to_contact_id`) VALUES (1,76,1,1,'1','2009-01-21 00:00:00','Check','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(2,36,2,2,'2','2008-05-07 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(3,136,3,3,'3','2008-05-05 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(4,114,1,4,'4','2008-10-21 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(5,148,2,1,'1','2008-01-10 00:00:00','Check','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(6,17,3,2,'2','2008-03-05 00:00:00','Direct Transfer','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(7,152,1,3,'3','2009-07-21 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(8,166,2,4,'4','2009-03-07 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(9,9,3,1,'1','2008-02-05 00:00:00','Direct Transfer','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(10,98,1,2,'2','2008-02-01 00:00:00','Check','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(11,196,2,3,'3','2009-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(12,127,3,4,'4','2009-03-06 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(13,158,1,1,'2','2008-06-04 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(14,151,2,2,'3','2008-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(15,79,3,4,'1','2008-07-04 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(16,19,1,4,'2','2009-01-21 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(17,30,2,2,'3','2008-01-10 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(18,118,3,3,'1','2009-03-05 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(19,27,1,2,'1','2008-10-21 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(20,87,2,4,'1','2009-01-10 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(21,47,3,1,'4','2008-03-25 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(22,38,1,2,'3','2009-10-21 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(23,199,2,4,'1','2008-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(24,91,3,3,'1','2008-03-11 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(25,22,3,2,'2','2008-04-05 00:00:00','Direct Transfer','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(26,73,1,1,'1','2009-01-21 00:00:00','Check','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(27,39,2,2,'2','2008-05-07 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(28,125,3,3,'3','2009-12-12 00:00:00','Direct Transfer','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(29,116,1,4,'4','2009-12-13 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(30,146,2,1,'1','2009-12-14 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(31,108,3,2,'2','2009-12-15 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(32,57,1,3,'3','2009-07-21 00:00:00','Check','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(33,105,2,4,'4','2009-03-07 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(34,161,3,1,'1','2009-12-15 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(35,181,1,2,'2','2009-12-13 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(36,129,2,3,'3','2009-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(37,65,3,4,'4','2009-03-06 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(38,104,1,1,'2','2009-12-13 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(39,93,2,2,'3','2008-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(40,159,3,4,'1','2009-12-14 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(41,178,1,4,'2','2009-01-21 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(42,77,2,2,'3','2009-12-15 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(43,64,3,3,'1','2009-03-05 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(44,128,1,2,'1','2009-12-13 00:00:00','Direct Transfer','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(45,135,2,4,'1','2009-01-10 00:00:00','Direct Transfer','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(46,4,3,1,'4','2009-12-13 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(47,147,1,2,'3','2009-10-21 00:00:00','Credit Card','Single',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(48,171,2,4,'1','2009-12-10 00:00:00','Credit Card','Soprano',0,0,50.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(49,51,3,3,'1','2009-03-11 00:00:00','Credit Card','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL),(50,150,3,2,'2','2009-04-05 00:00:00','Check','Tiny-tots (ages 5-8)',0,0,800.00,NULL,NULL,'USD',NULL,NULL,NULL,NULL,NULL);
 /*!40000 ALTER TABLE `civicrm_participant` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1036,7 +1036,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_participant_payment` WRITE;
 /*!40000 ALTER TABLE `civicrm_participant_payment` DISABLE KEYS */;
-INSERT INTO `civicrm_participant_payment` (`id`, `participant_id`, `contribution_id`) VALUES (1,19,45),(2,31,46),(3,15,47),(4,39,48),(5,27,49),(6,26,50),(7,38,51),(8,24,52),(9,29,53),(10,12,54),(11,21,55),(12,32,56),(13,37,57),(14,22,58),(15,8,59),(16,13,60),(17,34,61),(18,9,62),(19,46,63),(20,5,64),(21,44,65),(22,20,66),(23,3,67),(24,45,68),(25,41,69),(26,23,70),(27,4,71),(28,48,72),(29,50,73),(30,16,74),(31,49,75),(32,14,76),(33,30,77),(34,36,78),(35,33,79),(36,43,80),(37,11,81),(38,1,82),(39,6,83),(40,18,84),(41,35,85),(42,2,86),(43,7,87),(44,10,88),(45,28,89),(46,25,90),(47,47,91),(48,17,92),(49,42,93),(50,40,94);
+INSERT INTO `civicrm_participant_payment` (`id`, `participant_id`, `contribution_id`) VALUES (1,46,45),(2,9,46),(3,6,47),(4,16,48),(5,25,49),(6,19,50),(7,17,51),(8,2,52),(9,22,53),(10,27,54),(11,21,55),(12,49,56),(13,32,57),(14,43,58),(15,37,59),(16,26,60),(17,1,61),(18,42,62),(19,15,63),(20,20,64),(21,24,65),(22,39,66),(23,10,67),(24,38,68),(25,33,69),(26,31,70),(27,4,71),(28,29,72),(29,18,73),(30,28,74),(31,12,75),(32,44,76),(33,36,77),(34,45,78),(35,3,79),(36,30,80),(37,47,81),(38,5,82),(39,50,83),(40,14,84),(41,7,85),(42,13,86),(43,40,87),(44,34,88),(45,8,89),(46,48,90),(47,41,91),(48,35,92),(49,11,93),(50,23,94);
 /*!40000 ALTER TABLE `civicrm_participant_payment` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1065,7 +1065,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_payment_processor_type` WRITE;
 /*!40000 ALTER TABLE `civicrm_payment_processor_type` DISABLE KEYS */;
-INSERT INTO `civicrm_payment_processor_type` (`id`, `name`, `title`, `description`, `is_active`, `is_default`, `user_name_label`, `password_label`, `signature_label`, `subject_label`, `class_name`, `url_site_default`, `url_api_default`, `url_recur_default`, `url_button_default`, `url_site_test_default`, `url_api_test_default`, `url_recur_test_default`, `url_button_test_default`, `billing_mode`, `is_recur`, `payment_type`, `payment_instrument_id`) VALUES (1,'PayPal_Standard','PayPal - Website Payments Standard',NULL,1,0,'Merchant Account Email',NULL,NULL,NULL,'Payment_PayPalImpl','https://www.paypal.com/',NULL,'https://www.paypal.com/',NULL,'https://www.sandbox.paypal.com/',NULL,'https://www.sandbox.paypal.com/',NULL,4,1,1,1),(2,'PayPal','PayPal - Website Payments Pro',NULL,1,0,'User Name','Password','Signature',NULL,'Payment_PayPalImpl','https://www.paypal.com/','https://api-3t.paypal.com/','https://www.paypal.com/','https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif','https://www.sandbox.paypal.com/','https://api-3t.sandbox.paypal.com/','https://www.sandbox.paypal.com/','https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif',3,1,1,1),(3,'PayPal_Express','PayPal - Express',NULL,1,0,'User Name','Password','Signature',NULL,'Payment_PayPalImpl','https://www.paypal.com/','https://api-3t.paypal.com/',NULL,'https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif','https://www.sandbox.paypal.com/','https://api-3t.sandbox.paypal.com/',NULL,'https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif',2,1,1,1),(4,'AuthNet','Authorize.Net',NULL,1,0,'API Login','Payment Key','MD5 Hash',NULL,'Payment_AuthorizeNet','https://secure2.authorize.net/gateway/transact.dll',NULL,'https://api2.authorize.net/xml/v1/request.api',NULL,'https://test.authorize.net/gateway/transact.dll',NULL,'https://apitest.authorize.net/xml/v1/request.api',NULL,1,1,1,1),(5,'PayJunction','PayJunction',NULL,0,0,'User Name','Password',NULL,NULL,'Payment_PayJunction','https://payjunction.com/quick_link',NULL,NULL,NULL,'https://www.payjunctionlabs.com/quick_link',NULL,NULL,NULL,1,1,1,1),(6,'eWAY','eWAY (Single Currency)',NULL,0,0,'Customer ID',NULL,NULL,NULL,'Payment_eWAY','https://www.eway.com.au/gateway_cvn/xmlpayment.asp',NULL,NULL,NULL,'https://www.eway.com.au/gateway_cvn/xmltest/testpage.asp',NULL,NULL,NULL,1,0,1,1),(7,'Dummy','Dummy Payment Processor',NULL,1,1,'User Name',NULL,NULL,NULL,'Payment_Dummy',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,1),(8,'Elavon','Elavon Payment Processor','Elavon / Nova Virtual Merchant',0,0,'SSL Merchant ID ','SSL User ID','SSL PIN',NULL,'Payment_Elavon','https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do',NULL,NULL,NULL,'https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do',NULL,NULL,NULL,1,0,1,1),(9,'Realex','Realex Payment',NULL,0,0,'Merchant ID','Password',NULL,'Account','Payment_Realex','https://epage.payandshop.com/epage.cgi',NULL,NULL,NULL,'https://epage.payandshop.com/epage-remote.cgi',NULL,NULL,NULL,1,0,1,1),(10,'PayflowPro','PayflowPro',NULL,0,0,'Vendor ID','Password','Partner (merchant)','User','Payment_PayflowPro','https://Payflowpro.paypal.com',NULL,NULL,NULL,'https://pilot-Payflowpro.paypal.com',NULL,NULL,NULL,1,0,1,1),(11,'FirstData','FirstData (aka linkpoint)','FirstData (aka linkpoint)',0,0,'Store name','certificate path',NULL,NULL,'Payment_FirstData','https://secure.linkpt.net',NULL,NULL,NULL,'https://staging.linkpt.net',NULL,NULL,NULL,1,NULL,1,1);
+INSERT INTO `civicrm_payment_processor_type` (`id`, `name`, `title`, `description`, `is_active`, `is_default`, `user_name_label`, `password_label`, `signature_label`, `subject_label`, `class_name`, `url_site_default`, `url_api_default`, `url_recur_default`, `url_button_default`, `url_site_test_default`, `url_api_test_default`, `url_recur_test_default`, `url_button_test_default`, `billing_mode`, `is_recur`, `payment_type`, `payment_instrument_id`) VALUES (1,'PayPal_Standard','PayPal - Website Payments Standard',NULL,1,0,'Merchant Account Email',NULL,NULL,NULL,'Payment_PayPalImpl','https://www.paypal.com/',NULL,'https://www.paypal.com/',NULL,'https://www.sandbox.paypal.com/',NULL,'https://www.sandbox.paypal.com/',NULL,4,1,1,1),(2,'PayPal','PayPal - Website Payments Pro',NULL,1,0,'User Name','Password','Signature',NULL,'Payment_PayPalImpl','https://www.paypal.com/','https://api-3t.paypal.com/','https://www.paypal.com/','https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif','https://www.sandbox.paypal.com/','https://api-3t.sandbox.paypal.com/','https://www.sandbox.paypal.com/','https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif',3,1,1,1),(3,'PayPal_Express','PayPal - Express',NULL,1,0,'User Name','Password','Signature',NULL,'Payment_PayPalImpl','https://www.paypal.com/','https://api-3t.paypal.com/',NULL,'https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif','https://www.sandbox.paypal.com/','https://api-3t.sandbox.paypal.com/',NULL,'https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif',2,1,1,1),(4,'AuthNet','Authorize.Net',NULL,1,0,'API Login','Payment Key','MD5 Hash',NULL,'Payment_AuthorizeNet','https://secure2.authorize.net/gateway/transact.dll',NULL,'https://api2.authorize.net/xml/v1/request.api',NULL,'https://test.authorize.net/gateway/transact.dll',NULL,'https://apitest.authorize.net/xml/v1/request.api',NULL,1,1,1,1),(5,'PayJunction','PayJunction',NULL,0,0,'User Name','Password',NULL,NULL,'Payment_PayJunction','https://payjunction.com/quick_link',NULL,NULL,NULL,'https://www.payjunctionlabs.com/quick_link',NULL,NULL,NULL,1,1,1,1),(6,'Dummy','Dummy Payment Processor',NULL,1,1,'User Name',NULL,NULL,NULL,'Payment_Dummy',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1,1,1),(7,'Elavon','Elavon Payment Processor','Elavon / Nova Virtual Merchant',0,0,'SSL Merchant ID ','SSL User ID','SSL PIN',NULL,'Payment_Elavon','https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do',NULL,NULL,NULL,'https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do',NULL,NULL,NULL,1,0,1,1),(8,'Realex','Realex Payment',NULL,0,0,'Merchant ID','Password',NULL,'Account','Payment_Realex','https://epage.payandshop.com/epage.cgi',NULL,NULL,NULL,'https://epage.payandshop.com/epage-remote.cgi',NULL,NULL,NULL,1,0,1,1),(9,'PayflowPro','PayflowPro',NULL,0,0,'Vendor ID','Password','Partner (merchant)','User','Payment_PayflowPro','https://Payflowpro.paypal.com',NULL,NULL,NULL,'https://pilot-Payflowpro.paypal.com',NULL,NULL,NULL,1,0,1,1),(10,'FirstData','FirstData (aka linkpoint)','FirstData (aka linkpoint)',0,0,'Store name','certificate path',NULL,NULL,'Payment_FirstData','https://secure.linkpt.net',NULL,NULL,NULL,'https://staging.linkpt.net',NULL,NULL,NULL,1,NULL,1,1);
 /*!40000 ALTER TABLE `civicrm_payment_processor_type` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1084,7 +1084,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_pcp` WRITE;
 /*!40000 ALTER TABLE `civicrm_pcp` DISABLE KEYS */;
-INSERT INTO `civicrm_pcp` (`id`, `contact_id`, `status_id`, `title`, `intro_text`, `page_text`, `donate_link_text`, `page_id`, `page_type`, `pcp_block_id`, `is_thermometer`, `is_honor_roll`, `goal_amount`, `currency`, `is_active`, `is_notify`) VALUES (1,57,2,'My Personal Civi Fundraiser','I\'m on a mission to get all my friends and family to help support my favorite open-source civic sector CRM.','<p>Friends and family - please help build much needed infrastructure for the civic sector by supporting my personal campaign!</p>\r\n<p><a href=\"https://civicrm.org\">You can learn more about CiviCRM here</a>.</p>\r\n<p>Then click the <strong>Contribute Now</strong> button to go to our easy-to-use online contribution form.</p>','Contribute Now',1,'contribute',1,1,1,5000.00,'USD',1,1);
+INSERT INTO `civicrm_pcp` (`id`, `contact_id`, `status_id`, `title`, `intro_text`, `page_text`, `donate_link_text`, `page_id`, `page_type`, `pcp_block_id`, `is_thermometer`, `is_honor_roll`, `goal_amount`, `currency`, `is_active`, `is_notify`) VALUES (1,159,2,'My Personal Civi Fundraiser','I\'m on a mission to get all my friends and family to help support my favorite open-source civic sector CRM.','<p>Friends and family - please help build much needed infrastructure for the civic sector by supporting my personal campaign!</p>\r\n<p><a href=\"https://civicrm.org\">You can learn more about CiviCRM here</a>.</p>\r\n<p>Then click the <strong>Contribute Now</strong> button to go to our easy-to-use online contribution form.</p>','Contribute Now',1,'contribute',1,1,1,5000.00,'USD',1,1);
 /*!40000 ALTER TABLE `civicrm_pcp` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1104,7 +1104,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_phone` WRITE;
 /*!40000 ALTER TABLE `civicrm_phone` DISABLE KEYS */;
-INSERT INTO `civicrm_phone` (`id`, `contact_id`, `location_type_id`, `is_primary`, `is_billing`, `mobile_provider_id`, `phone`, `phone_ext`, `phone_numeric`, `phone_type_id`) VALUES (1,24,1,1,0,NULL,'274-9635',NULL,'2749635',2),(2,17,1,1,0,NULL,'(229) 879-2778',NULL,'2298792778',1),(3,17,1,0,0,NULL,'799-7889',NULL,'7997889',2),(4,182,1,1,0,NULL,'(244) 685-2219',NULL,'2446852219',1),(5,182,1,0,0,NULL,'(865) 344-9781',NULL,'8653449781',2),(6,138,1,1,0,NULL,'402-4943',NULL,'4024943',2),(7,53,1,1,0,NULL,'204-2790',NULL,'2042790',2),(8,53,1,0,0,NULL,'766-4872',NULL,'7664872',2),(9,15,1,1,0,NULL,'(668) 853-1518',NULL,'6688531518',2),(10,83,1,1,0,NULL,'241-1379',NULL,'2411379',1),(11,120,1,1,0,NULL,'397-9037',NULL,'3979037',1),(12,120,1,0,0,NULL,'730-9455',NULL,'7309455',1),(13,193,1,1,0,NULL,'(676) 251-4852',NULL,'6762514852',2),(14,162,1,1,0,NULL,'521-3006',NULL,'5213006',2),(15,66,1,1,0,NULL,'530-6693',NULL,'5306693',2),(16,66,1,0,0,NULL,'731-4325',NULL,'7314325',1),(17,92,1,1,0,NULL,'(220) 590-9485',NULL,'2205909485',1),(18,92,1,0,0,NULL,'(203) 368-1646',NULL,'2033681646',1),(19,167,1,1,0,NULL,'(750) 209-2869',NULL,'7502092869',2),(20,167,1,0,0,NULL,'890-9055',NULL,'8909055',2),(21,190,1,1,0,NULL,'(652) 629-9114',NULL,'6526299114',1),(22,190,1,0,0,NULL,'(293) 584-8018',NULL,'2935848018',1),(23,184,1,1,0,NULL,'437-1558',NULL,'4371558',2),(24,67,1,1,0,NULL,'(424) 686-1017',NULL,'4246861017',1),(25,67,1,0,0,NULL,'716-5913',NULL,'7165913',1),(26,183,1,1,0,NULL,'(423) 421-9523',NULL,'4234219523',2),(27,175,1,1,0,NULL,'880-2156',NULL,'8802156',2),(28,129,1,1,0,NULL,'(488) 267-9425',NULL,'4882679425',1),(29,129,1,0,0,NULL,'859-5831',NULL,'8595831',2),(30,197,1,1,0,NULL,'(454) 513-8343',NULL,'4545138343',2),(31,197,1,0,0,NULL,'(553) 619-5071',NULL,'5536195071',2),(32,122,1,1,0,NULL,'718-4550',NULL,'7184550',1),(33,122,1,0,0,NULL,'289-9260',NULL,'2899260',1),(34,7,1,1,0,NULL,'(206) 479-5991',NULL,'2064795991',2),(35,7,1,0,0,NULL,'285-4636',NULL,'2854636',1),(36,154,1,1,0,NULL,'430-8301',NULL,'4308301',1),(37,154,1,0,0,NULL,'(435) 851-5287',NULL,'4358515287',2),(38,51,1,1,0,NULL,'304-7100',NULL,'3047100',2),(39,51,1,0,0,NULL,'238-5124',NULL,'2385124',2),(40,97,1,1,0,NULL,'(814) 212-3197',NULL,'8142123197',1),(41,111,1,1,0,NULL,'756-3086',NULL,'7563086',2),(42,111,1,0,0,NULL,'365-2538',NULL,'3652538',2),(43,143,1,1,0,NULL,'816-4755',NULL,'8164755',2),(44,77,1,1,0,NULL,'(235) 641-2496',NULL,'2356412496',1),(45,77,1,0,0,NULL,'713-4703',NULL,'7134703',1),(46,186,1,1,0,NULL,'474-5007',NULL,'4745007',2),(47,12,1,1,0,NULL,'617-7751',NULL,'6177751',1),(48,8,1,1,0,NULL,'(537) 372-7316',NULL,'5373727316',2),(49,84,1,1,0,NULL,'792-7270',NULL,'7927270',2),(50,84,1,0,0,NULL,'(801) 234-1538',NULL,'8012341538',2),(51,71,1,1,0,NULL,'392-6885',NULL,'3926885',2),(52,71,1,0,0,NULL,'288-3964',NULL,'2883964',2),(53,119,1,1,0,NULL,'446-4383',NULL,'4464383',2),(54,119,1,0,0,NULL,'(596) 657-2384',NULL,'5966572384',2),(55,161,1,1,0,NULL,'635-8492',NULL,'6358492',2),(56,60,1,1,0,NULL,'(691) 530-1922',NULL,'6915301922',1),(57,31,1,1,0,NULL,'(283) 732-1513',NULL,'2837321513',2),(58,55,1,1,0,NULL,'657-5967',NULL,'6575967',1),(59,55,1,0,0,NULL,'272-6026',NULL,'2726026',1),(60,64,1,1,0,NULL,'673-2317',NULL,'6732317',2),(61,64,1,0,0,NULL,'534-1878',NULL,'5341878',2),(62,41,1,1,0,NULL,'460-9430',NULL,'4609430',2),(63,30,1,1,0,NULL,'306-2031',NULL,'3062031',2),(64,2,1,1,0,NULL,'612-2909',NULL,'6122909',1),(65,2,1,0,0,NULL,'(737) 473-7543',NULL,'7374737543',2),(66,118,1,1,0,NULL,'755-9391',NULL,'7559391',1),(67,87,1,1,0,NULL,'(463) 596-6006',NULL,'4635966006',2),(68,87,1,0,0,NULL,'560-2341',NULL,'5602341',1),(69,23,1,1,0,NULL,'(408) 243-9215',NULL,'4082439215',1),(70,5,1,1,0,NULL,'(467) 735-2801',NULL,'4677352801',1),(71,5,1,0,0,NULL,'(585) 618-1985',NULL,'5856181985',2),(72,93,1,1,0,NULL,'774-6122',NULL,'7746122',2),(73,18,1,1,0,NULL,'(859) 599-7380',NULL,'8595997380',1),(74,176,1,1,0,NULL,'(352) 842-5208',NULL,'3528425208',2),(75,80,1,1,0,NULL,'(664) 231-4436',NULL,'6642314436',1),(76,80,1,0,0,NULL,'(274) 257-4985',NULL,'2742574985',1),(77,44,1,1,0,NULL,'881-5788',NULL,'8815788',2),(78,44,1,0,0,NULL,'(866) 667-8364',NULL,'8666678364',1),(79,52,1,1,0,NULL,'(611) 572-3049',NULL,'6115723049',2),(80,165,1,1,0,NULL,'228-4756',NULL,'2284756',1),(81,127,1,1,0,NULL,'555-6328',NULL,'5556328',1),(82,127,1,0,0,NULL,'(327) 478-4987',NULL,'3274784987',1),(83,172,1,1,0,NULL,'(487) 597-4192',NULL,'4875974192',2),(84,172,1,0,0,NULL,'372-7179',NULL,'3727179',1),(85,125,1,1,0,NULL,'216-1481',NULL,'2161481',1),(86,74,1,1,0,NULL,'(492) 296-6332',NULL,'4922966332',1),(87,74,1,0,0,NULL,'287-8009',NULL,'2878009',2),(88,47,1,1,0,NULL,'(425) 785-7087',NULL,'4257857087',2),(89,159,1,1,0,NULL,'(368) 300-4630',NULL,'3683004630',1),(90,102,1,1,0,NULL,'(443) 534-9192',NULL,'4435349192',1),(91,149,1,1,0,NULL,'(802) 411-1496',NULL,'8024111496',1),(92,192,1,1,0,NULL,'(297) 209-2106',NULL,'2972092106',2),(93,192,1,0,0,NULL,'(705) 606-6556',NULL,'7056066556',1),(94,134,1,1,0,NULL,'(632) 400-9500',NULL,'6324009500',1),(95,134,1,0,0,NULL,'(328) 557-6995',NULL,'3285576995',2),(96,100,1,1,0,NULL,'(629) 623-5518',NULL,'6296235518',2),(97,100,1,0,0,NULL,'(787) 824-4620',NULL,'7878244620',2),(98,34,1,1,0,NULL,'(576) 532-4124',NULL,'5765324124',1),(99,113,1,1,0,NULL,'208-4699',NULL,'2084699',1),(100,110,1,1,0,NULL,'(766) 397-6252',NULL,'7663976252',2),(101,110,1,0,0,NULL,'663-2594',NULL,'6632594',2),(102,191,1,1,0,NULL,'(711) 752-3110',NULL,'7117523110',2),(103,191,1,0,0,NULL,'455-8038',NULL,'4558038',2),(104,151,1,1,0,NULL,'496-3771',NULL,'4963771',1),(105,82,1,1,0,NULL,'(281) 214-6022',NULL,'2812146022',1),(106,82,1,0,0,NULL,'(652) 390-7860',NULL,'6523907860',2),(107,196,1,1,0,NULL,'533-5816',NULL,'5335816',1),(108,94,1,1,0,NULL,'(749) 574-5597',NULL,'7495745597',2),(109,188,1,1,0,NULL,'529-8632',NULL,'5298632',2),(110,195,1,1,0,NULL,'(395) 227-9037',NULL,'3952279037',1),(111,28,1,1,0,NULL,'718-8866',NULL,'7188866',2),(112,28,1,0,0,NULL,'814-1318',NULL,'8141318',2),(113,141,1,1,0,NULL,'(783) 818-5891',NULL,'7838185891',2),(114,141,1,0,0,NULL,'898-2730',NULL,'8982730',1),(115,112,1,1,0,NULL,'(558) 458-8429',NULL,'5584588429',2),(116,112,1,0,0,NULL,'(308) 797-1765',NULL,'3087971765',1),(117,152,1,1,0,NULL,'(373) 427-1144',NULL,'3734271144',2),(118,61,1,1,0,NULL,'374-7266',NULL,'3747266',2),(119,108,1,1,0,NULL,'661-5380',NULL,'6615380',1),(120,108,1,0,0,NULL,'(647) 666-4232',NULL,'6476664232',1),(121,54,1,1,0,NULL,'445-1977',NULL,'4451977',2),(122,54,1,0,0,NULL,'405-2942',NULL,'4052942',1),(123,155,1,1,0,NULL,'784-9465',NULL,'7849465',1),(124,103,1,1,0,NULL,'265-9328',NULL,'2659328',2),(125,63,1,1,0,NULL,'(735) 686-1024',NULL,'7356861024',1),(126,63,1,0,0,NULL,'(679) 205-2507',NULL,'6792052507',2),(127,68,1,1,0,NULL,'(214) 665-4847',NULL,'2146654847',1),(128,68,1,0,0,NULL,'256-3774',NULL,'2563774',1),(129,70,1,1,0,NULL,'429-1869',NULL,'4291869',1),(130,70,1,0,0,NULL,'219-2851',NULL,'2192851',1),(131,10,1,1,0,NULL,'716-2365',NULL,'7162365',1),(132,130,1,1,0,NULL,'600-7888',NULL,'6007888',2),(133,140,1,1,0,NULL,'267-9456',NULL,'2679456',1),(134,58,1,1,0,NULL,'(255) 537-6804',NULL,'2555376804',2),(135,58,1,0,0,NULL,'785-9517',NULL,'7859517',2),(136,48,1,1,0,NULL,'(369) 720-9933',NULL,'3697209933',1),(137,135,1,1,0,NULL,'577-3243',NULL,'5773243',2),(138,43,1,1,0,NULL,'(561) 878-3542',NULL,'5618783542',2),(139,20,1,1,0,NULL,'(240) 599-5126',NULL,'2405995126',2),(140,13,1,1,0,NULL,'(896) 730-2208',NULL,'8967302208',2),(141,13,1,0,0,NULL,'891-6610',NULL,'8916610',1),(142,194,1,1,0,NULL,'(582) 263-1870',NULL,'5822631870',2),(143,131,1,1,0,NULL,'209-4992',NULL,'2094992',2),(144,131,1,0,0,NULL,'(357) 393-9592',NULL,'3573939592',2),(145,75,1,1,0,NULL,'297-3631',NULL,'2973631',1),(146,75,1,0,0,NULL,'(735) 516-9375',NULL,'7355169375',1),(147,104,1,1,0,NULL,'(202) 624-1843',NULL,'2026241843',2),(148,153,1,1,0,NULL,'577-2814',NULL,'5772814',2),(149,153,1,0,0,NULL,'(672) 816-3429',NULL,'6728163429',2),(150,39,1,1,0,NULL,'(413) 541-3220',NULL,'4135413220',1),(151,189,1,1,0,NULL,'(562) 845-6038',NULL,'5628456038',2),(152,36,1,1,0,NULL,'359-6033',NULL,'3596033',1),(153,36,1,0,0,NULL,'(574) 836-8694',NULL,'5748368694',1),(154,171,1,1,0,NULL,'(631) 326-9216',NULL,'6313269216',2),(155,25,1,1,0,NULL,'(632) 417-4898',NULL,'6324174898',1),(156,180,1,1,0,NULL,'699-9692',NULL,'6999692',2),(157,158,1,1,0,NULL,'258-5034',NULL,'2585034',1),(158,NULL,1,0,0,NULL,'204 222-1000',NULL,'2042221000',1),(159,NULL,1,0,0,NULL,'204 223-1000',NULL,'2042231000',1),(160,NULL,1,0,0,NULL,'303 323-1000',NULL,'3033231000',1);
+INSERT INTO `civicrm_phone` (`id`, `contact_id`, `location_type_id`, `is_primary`, `is_billing`, `mobile_provider_id`, `phone`, `phone_ext`, `phone_numeric`, `phone_type_id`) VALUES (1,200,1,1,0,NULL,'483-7533',NULL,'4837533',1),(2,44,1,1,0,NULL,'761-3768',NULL,'7613768',1),(3,44,1,0,0,NULL,'894-5717',NULL,'8945717',1),(4,193,1,1,0,NULL,'(636) 204-1458',NULL,'6362041458',2),(5,193,1,0,0,NULL,'774-4243',NULL,'7744243',2),(6,131,1,1,0,NULL,'(646) 404-1928',NULL,'6464041928',1),(7,131,1,0,0,NULL,'318-9664',NULL,'3189664',2),(8,153,1,1,0,NULL,'864-3313',NULL,'8643313',1),(9,163,1,1,0,NULL,'(684) 880-4373',NULL,'6848804373',2),(10,163,1,0,0,NULL,'722-2648',NULL,'7222648',2),(11,95,1,1,0,NULL,'(637) 587-8141',NULL,'6375878141',2),(12,185,1,1,0,NULL,'654-2330',NULL,'6542330',2),(13,185,1,0,0,NULL,'(419) 305-4040',NULL,'4193054040',1),(14,173,1,1,0,NULL,'238-5571',NULL,'2385571',2),(15,27,1,1,0,NULL,'(842) 454-3849',NULL,'8424543849',2),(16,27,1,0,0,NULL,'(319) 408-9328',NULL,'3194089328',1),(17,133,1,1,0,NULL,'541-9016',NULL,'5419016',1),(18,182,1,1,0,NULL,'851-3664',NULL,'8513664',2),(19,182,1,0,0,NULL,'(679) 403-5151',NULL,'6794035151',2),(20,33,1,1,0,NULL,'836-5459',NULL,'8365459',1),(21,33,1,0,0,NULL,'347-9373',NULL,'3479373',1),(22,171,1,1,0,NULL,'(774) 695-8186',NULL,'7746958186',1),(23,125,1,1,0,NULL,'409-1802',NULL,'4091802',2),(24,101,1,1,0,NULL,'(779) 452-3341',NULL,'7794523341',2),(25,134,1,1,0,NULL,'(835) 282-9201',NULL,'8352829201',2),(26,134,1,0,0,NULL,'793-8402',NULL,'7938402',1),(27,16,1,1,0,NULL,'(519) 365-4327',NULL,'5193654327',1),(28,147,1,1,0,NULL,'455-9428',NULL,'4559428',2),(29,147,1,0,0,NULL,'(249) 736-2442',NULL,'2497362442',2),(30,175,1,1,0,NULL,'402-8473',NULL,'4028473',2),(31,195,1,1,0,NULL,'(337) 767-6942',NULL,'3377676942',1),(32,183,1,1,0,NULL,'495-5263',NULL,'4955263',1),(33,108,1,1,0,NULL,'(491) 332-2104',NULL,'4913322104',1),(34,108,1,0,0,NULL,'832-9247',NULL,'8329247',2),(35,109,1,1,0,NULL,'(498) 753-1918',NULL,'4987531918',1),(36,90,1,1,0,NULL,'(773) 844-8620',NULL,'7738448620',2),(37,135,1,1,0,NULL,'(883) 810-6696',NULL,'8838106696',1),(38,47,1,1,0,NULL,'(599) 253-3966',NULL,'5992533966',2),(39,26,1,1,0,NULL,'592-5394',NULL,'5925394',1),(40,20,1,1,0,NULL,'(374) 545-4742',NULL,'3745454742',1),(41,20,1,0,0,NULL,'(426) 294-3956',NULL,'4262943956',1),(42,25,1,1,0,NULL,'603-9946',NULL,'6039946',2),(43,166,1,1,0,NULL,'324-6086',NULL,'3246086',2),(44,140,1,1,0,NULL,'(338) 555-8271',NULL,'3385558271',1),(45,67,1,1,0,NULL,'(347) 800-3217',NULL,'3478003217',1),(46,30,1,1,0,NULL,'765-3983',NULL,'7653983',1),(47,22,1,1,0,NULL,'(772) 649-2067',NULL,'7726492067',1),(48,143,1,1,0,NULL,'802-3379',NULL,'8023379',2),(49,143,1,0,0,NULL,'845-7902',NULL,'8457902',1),(50,84,1,1,0,NULL,'(366) 583-1798',NULL,'3665831798',1),(51,84,1,0,0,NULL,'215-1253',NULL,'2151253',2),(52,169,1,1,0,NULL,'(810) 728-9405',NULL,'8107289405',1),(53,169,1,0,0,NULL,'697-4328',NULL,'6974328',2),(54,184,1,1,0,NULL,'(300) 784-7883',NULL,'3007847883',1),(55,184,1,0,0,NULL,'(719) 523-4887',NULL,'7195234887',1),(56,141,1,1,0,NULL,'(525) 440-4664',NULL,'5254404664',2),(57,58,1,1,0,NULL,'857-3920',NULL,'8573920',1),(58,58,1,0,0,NULL,'(826) 266-7707',NULL,'8262667707',2),(59,17,1,1,0,NULL,'847-3949',NULL,'8473949',1),(60,176,1,1,0,NULL,'303-2779',NULL,'3032779',2),(61,40,1,1,0,NULL,'(483) 289-2679',NULL,'4832892679',1),(62,40,1,0,0,NULL,'(255) 592-2604',NULL,'2555922604',2),(63,99,1,1,0,NULL,'600-9575',NULL,'6009575',1),(64,32,1,1,0,NULL,'(708) 810-7071',NULL,'7088107071',2),(65,14,1,1,0,NULL,'(670) 350-3450',NULL,'6703503450',1),(66,31,1,1,0,NULL,'695-6243',NULL,'6956243',2),(67,117,1,1,0,NULL,'(584) 782-5550',NULL,'5847825550',2),(68,64,1,1,0,NULL,'(232) 555-4162',NULL,'2325554162',1),(69,64,1,0,0,NULL,'(517) 635-6722',NULL,'5176356722',2),(70,56,1,1,0,NULL,'(595) 560-6842',NULL,'5955606842',2),(71,87,1,1,0,NULL,'(307) 378-7291',NULL,'3073787291',1),(72,70,1,1,0,NULL,'(864) 557-1383',NULL,'8645571383',2),(73,70,1,0,0,NULL,'(264) 813-6597',NULL,'2648136597',2),(74,192,1,1,0,NULL,'892-2042',NULL,'8922042',2),(75,192,1,0,0,NULL,'(732) 540-2919',NULL,'7325402919',2),(76,197,1,1,0,NULL,'(672) 895-2354',NULL,'6728952354',2),(77,197,1,0,0,NULL,'544-7294',NULL,'5447294',2),(78,21,1,1,0,NULL,'734-3804',NULL,'7343804',1),(79,105,1,1,0,NULL,'(540) 238-8277',NULL,'5402388277',1),(80,148,1,1,0,NULL,'(601) 727-8359',NULL,'6017278359',1),(81,132,1,1,0,NULL,'(751) 897-4716',NULL,'7518974716',1),(82,132,1,0,0,NULL,'210-1461',NULL,'2101461',1),(83,49,1,1,0,NULL,'(296) 506-6974',NULL,'2965066974',1),(84,154,1,1,0,NULL,'(526) 869-8624',NULL,'5268698624',1),(85,154,1,0,0,NULL,'610-5905',NULL,'6105905',2),(86,77,1,1,0,NULL,'279-6327',NULL,'2796327',2),(87,79,1,1,0,NULL,'(675) 280-4171',NULL,'6752804171',2),(88,79,1,0,0,NULL,'443-4296',NULL,'4434296',2),(89,29,1,1,0,NULL,'(220) 885-2807',NULL,'2208852807',1),(90,29,1,0,0,NULL,'(440) 839-6970',NULL,'4408396970',2),(91,63,1,1,0,NULL,'(703) 560-5069',NULL,'7035605069',1),(92,63,1,0,0,NULL,'773-1686',NULL,'7731686',1),(93,86,1,1,0,NULL,'413-8764',NULL,'4138764',2),(94,86,1,0,0,NULL,'488-5938',NULL,'4885938',2),(95,96,1,1,0,NULL,'316-9253',NULL,'3169253',1),(96,96,1,0,0,NULL,'(576) 797-9387',NULL,'5767979387',1),(97,201,1,1,0,NULL,'396-6773',NULL,'3966773',2),(98,201,1,0,0,NULL,'822-2415',NULL,'8222415',2),(99,116,1,1,0,NULL,'(368) 894-3244',NULL,'3688943244',1),(100,116,1,0,0,NULL,'418-3872',NULL,'4183872',2),(101,43,1,1,0,NULL,'(815) 539-2543',NULL,'8155392543',2),(102,7,1,1,0,NULL,'412-6551',NULL,'4126551',2),(103,7,1,0,0,NULL,'(436) 520-2710',NULL,'4365202710',2),(104,155,1,1,0,NULL,'706-4737',NULL,'7064737',2),(105,155,1,0,0,NULL,'436-7264',NULL,'4367264',1),(106,48,1,1,0,NULL,'283-4988',NULL,'2834988',1),(107,128,1,1,0,NULL,'(763) 608-7563',NULL,'7636087563',1),(108,118,1,1,0,NULL,'285-7469',NULL,'2857469',1),(109,118,1,0,0,NULL,'(447) 304-7110',NULL,'4473047110',1),(110,41,1,1,0,NULL,'(236) 666-9822',NULL,'2366669822',2),(111,41,1,0,0,NULL,'714-6701',NULL,'7146701',1),(112,36,1,1,0,NULL,'779-4248',NULL,'7794248',2),(113,36,1,0,0,NULL,'812-1112',NULL,'8121112',2),(114,68,1,1,0,NULL,'667-7995',NULL,'6677995',2),(115,68,1,0,0,NULL,'(408) 345-3471',NULL,'4083453471',2),(116,157,1,1,0,NULL,'881-6830',NULL,'8816830',1),(117,114,1,1,0,NULL,'(223) 885-5382',NULL,'2238855382',2),(118,114,1,0,0,NULL,'(647) 782-5397',NULL,'6477825397',1),(119,126,1,1,0,NULL,'(610) 406-7457',NULL,'6104067457',2),(120,13,1,1,0,NULL,'860-2601',NULL,'8602601',1),(121,174,1,1,0,NULL,'(700) 716-1831',NULL,'7007161831',2),(122,110,1,1,0,NULL,'(204) 487-1844',NULL,'2044871844',1),(123,110,1,0,0,NULL,'796-2742',NULL,'7962742',2),(124,54,1,1,0,NULL,'(367) 619-7045',NULL,'3676197045',1),(125,54,1,0,0,NULL,'(409) 658-2190',NULL,'4096582190',1),(126,119,1,1,0,NULL,'(694) 207-5679',NULL,'6942075679',2),(127,42,1,1,0,NULL,'626-4087',NULL,'6264087',2),(128,103,1,1,0,NULL,'238-4223',NULL,'2384223',2),(129,103,1,0,0,NULL,'688-5736',NULL,'6885736',1),(130,172,1,1,0,NULL,'(230) 300-4702',NULL,'2303004702',2),(131,172,1,0,0,NULL,'(611) 542-2709',NULL,'6115422709',2),(132,15,1,1,0,NULL,'572-4443',NULL,'5724443',2),(133,165,1,1,0,NULL,'(455) 528-3469',NULL,'4555283469',2),(134,194,1,1,0,NULL,'(322) 827-6340',NULL,'3228276340',2),(135,194,1,0,0,NULL,'316-3899',NULL,'3163899',2),(136,149,1,1,0,NULL,'(397) 201-8827',NULL,'3972018827',1),(137,149,1,0,0,NULL,'(716) 609-9956',NULL,'7166099956',2),(138,71,1,1,0,NULL,'800-8348',NULL,'8008348',2),(139,59,1,1,0,NULL,'(370) 515-8514',NULL,'3705158514',2),(140,178,1,1,0,NULL,'(510) 308-9038',NULL,'5103089038',2),(141,124,1,1,0,NULL,'742-5807',NULL,'7425807',2),(142,124,1,0,0,NULL,'840-3231',NULL,'8403231',2),(143,82,1,1,0,NULL,'674-3953',NULL,'6743953',1),(144,82,1,0,0,NULL,'(596) 439-7470',NULL,'5964397470',2),(145,81,1,1,0,NULL,'247-9059',NULL,'2479059',1),(146,81,1,0,0,NULL,'244-2536',NULL,'2442536',1),(147,144,1,1,0,NULL,'559-9107',NULL,'5599107',1),(148,144,1,0,0,NULL,'(747) 432-8735',NULL,'7474328735',2),(149,146,1,1,0,NULL,'721-3889',NULL,'7213889',1),(150,9,1,1,0,NULL,'606-9575',NULL,'6069575',1),(151,9,1,0,0,NULL,'883-5452',NULL,'8835452',1),(152,164,1,1,0,NULL,'(563) 428-5330',NULL,'5634285330',1),(153,45,1,1,0,NULL,'501-3057',NULL,'5013057',2),(154,NULL,1,0,0,NULL,'204 222-1000',NULL,'2042221000',1),(155,NULL,1,0,0,NULL,'204 223-1000',NULL,'2042231000',1),(156,NULL,1,0,0,NULL,'303 323-1000',NULL,'3033231000',1);
 /*!40000 ALTER TABLE `civicrm_phone` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1203,7 +1203,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_price_set` WRITE;
 /*!40000 ALTER TABLE `civicrm_price_set` DISABLE KEYS */;
-INSERT INTO `civicrm_price_set` (`id`, `domain_id`, `name`, `title`, `is_active`, `help_pre`, `help_post`, `javascript`, `extends`, `financial_type_id`, `is_quick_config`, `is_reserved`, `min_amount`) VALUES (1,NULL,'default_contribution_amount','Contribution Amount',1,NULL,NULL,NULL,'2',NULL,1,1,0),(2,NULL,'default_membership_type_amount','Membership Amount',1,NULL,NULL,NULL,'3',2,1,1,0),(3,NULL,'help_support_civicrm_amount','Help Support CiviCRM!',1,NULL,NULL,NULL,'2',NULL,1,0,0),(4,NULL,'member_signup_and_renewal','Member Signup and Renewal',1,NULL,NULL,NULL,'3',2,1,0,0),(5,NULL,'pledge_for_civicrm','Pledge for CiviCRM!',1,NULL,NULL,NULL,'2',NULL,1,0,0),(6,NULL,'rain_forest_cup_youth_soccer_tournament','Rain-forest Cup Youth Soccer Tournament',1,NULL,NULL,NULL,'1',NULL,1,0,0),(7,NULL,'fall_fundraiser_dinner','Fall Fundraiser Dinner',1,NULL,NULL,NULL,'1',NULL,1,0,0),(8,NULL,'summer_solstice_festival_day_concert','Summer Solstice Festival Day Concert',1,NULL,NULL,NULL,'1',NULL,1,0,0);
+INSERT INTO `civicrm_price_set` (`id`, `domain_id`, `name`, `title`, `is_active`, `help_pre`, `help_post`, `javascript`, `extends`, `financial_type_id`, `is_quick_config`, `is_reserved`, `min_amount`) VALUES (1,NULL,'default_contribution_amount','Contribution Amount',1,NULL,NULL,NULL,'2',NULL,1,1,0.00),(2,NULL,'default_membership_type_amount','Membership Amount',1,NULL,NULL,NULL,'3',2,1,1,0.00),(3,NULL,'help_support_civicrm_amount','Help Support CiviCRM!',1,NULL,NULL,NULL,'2',NULL,1,0,0.00),(4,NULL,'member_signup_and_renewal','Member Signup and Renewal',1,NULL,NULL,NULL,'3',2,1,0,0.00),(5,NULL,'pledge_for_civicrm','Pledge for CiviCRM!',1,NULL,NULL,NULL,'2',NULL,1,0,0.00),(6,NULL,'rain_forest_cup_youth_soccer_tournament','Rain-forest Cup Youth Soccer Tournament',1,NULL,NULL,NULL,'1',NULL,1,0,0.00),(7,NULL,'fall_fundraiser_dinner','Fall Fundraiser Dinner',1,NULL,NULL,NULL,'1',NULL,1,0,0.00),(8,NULL,'summer_solstice_festival_day_concert','Summer Solstice Festival Day Concert',1,NULL,NULL,NULL,'1',NULL,1,0,0.00);
 /*!40000 ALTER TABLE `civicrm_price_set` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1261,7 +1261,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_relationship` WRITE;
 /*!40000 ALTER TABLE `civicrm_relationship` DISABLE KEYS */;
-INSERT INTO `civicrm_relationship` (`id`, `contact_id_a`, `contact_id_b`, `relationship_type_id`, `start_date`, `end_date`, `is_active`, `description`, `is_permission_a_b`, `is_permission_b_a`, `case_id`) VALUES (1,74,172,1,NULL,NULL,1,NULL,0,0,NULL),(2,47,172,1,NULL,NULL,1,NULL,0,0,NULL),(3,74,125,1,NULL,NULL,1,NULL,0,0,NULL),(4,47,125,1,NULL,NULL,1,NULL,0,0,NULL),(5,47,74,4,NULL,NULL,1,NULL,0,0,NULL),(6,125,11,8,NULL,NULL,1,NULL,0,0,NULL),(7,74,11,8,NULL,NULL,1,NULL,0,0,NULL),(8,47,11,8,NULL,NULL,1,NULL,0,0,NULL),(9,172,11,7,NULL,NULL,0,NULL,0,0,NULL),(10,125,172,2,NULL,NULL,0,NULL,0,0,NULL),(11,126,159,1,NULL,NULL,1,NULL,0,0,NULL),(12,9,159,1,NULL,NULL,1,NULL,0,0,NULL),(13,126,102,1,NULL,NULL,1,NULL,0,0,NULL),(14,9,102,1,NULL,NULL,1,NULL,0,0,NULL),(15,9,126,4,NULL,NULL,1,NULL,0,0,NULL),(16,102,128,8,NULL,NULL,1,NULL,0,0,NULL),(17,126,128,8,NULL,NULL,1,NULL,0,0,NULL),(18,9,128,8,NULL,NULL,1,NULL,0,0,NULL),(19,159,128,7,NULL,NULL,0,NULL,0,0,NULL),(20,102,159,2,NULL,NULL,0,NULL,0,0,NULL),(21,40,198,1,NULL,NULL,1,NULL,0,0,NULL),(22,85,198,1,NULL,NULL,1,NULL,0,0,NULL),(23,40,149,1,NULL,NULL,1,NULL,0,0,NULL),(24,85,149,1,NULL,NULL,1,NULL,0,0,NULL),(25,85,40,4,NULL,NULL,1,NULL,0,0,NULL),(26,149,38,8,NULL,NULL,1,NULL,0,0,NULL),(27,40,38,8,NULL,NULL,1,NULL,0,0,NULL),(28,85,38,8,NULL,NULL,1,NULL,0,0,NULL),(29,198,38,7,NULL,NULL,1,NULL,0,0,NULL),(30,149,198,2,NULL,NULL,1,NULL,0,0,NULL),(31,134,192,1,NULL,NULL,1,NULL,0,0,NULL),(32,100,192,1,NULL,NULL,1,NULL,0,0,NULL),(33,134,170,1,NULL,NULL,1,NULL,0,0,NULL),(34,100,170,1,NULL,NULL,1,NULL,0,0,NULL),(35,100,134,4,NULL,NULL,1,NULL,0,0,NULL),(36,170,136,8,NULL,NULL,1,NULL,0,0,NULL),(37,134,136,8,NULL,NULL,1,NULL,0,0,NULL),(38,100,136,8,NULL,NULL,1,NULL,0,0,NULL),(39,192,136,7,NULL,NULL,0,NULL,0,0,NULL),(40,170,192,2,NULL,NULL,0,NULL,0,0,NULL),(41,59,34,1,NULL,NULL,1,NULL,0,0,NULL),(42,110,34,1,NULL,NULL,1,NULL,0,0,NULL),(43,59,113,1,NULL,NULL,1,NULL,0,0,NULL),(44,110,113,1,NULL,NULL,1,NULL,0,0,NULL),(45,110,59,4,NULL,NULL,1,NULL,0,0,NULL),(46,113,32,8,NULL,NULL,1,NULL,0,0,NULL),(47,59,32,8,NULL,NULL,1,NULL,0,0,NULL),(48,110,32,8,NULL,NULL,1,NULL,0,0,NULL),(49,34,32,7,NULL,NULL,1,NULL,0,0,NULL),(50,113,34,2,NULL,NULL,1,NULL,0,0,NULL),(51,147,191,1,NULL,NULL,1,NULL,0,0,NULL),(52,151,191,1,NULL,NULL,1,NULL,0,0,NULL),(53,147,160,1,NULL,NULL,1,NULL,0,0,NULL),(54,151,160,1,NULL,NULL,1,NULL,0,0,NULL),(55,151,147,4,NULL,NULL,1,NULL,0,0,NULL),(56,160,27,8,NULL,NULL,1,NULL,0,0,NULL),(57,147,27,8,NULL,NULL,1,NULL,0,0,NULL),(58,151,27,8,NULL,NULL,1,NULL,0,0,NULL),(59,191,27,7,NULL,NULL,1,NULL,0,0,NULL),(60,160,191,2,NULL,NULL,1,NULL,0,0,NULL),(61,94,82,1,NULL,NULL,1,NULL,0,0,NULL),(62,188,82,1,NULL,NULL,1,NULL,0,0,NULL),(63,94,196,1,NULL,NULL,1,NULL,0,0,NULL),(64,188,196,1,NULL,NULL,1,NULL,0,0,NULL),(65,188,94,4,NULL,NULL,1,NULL,0,0,NULL),(66,196,116,8,NULL,NULL,1,NULL,0,0,NULL),(67,94,116,8,NULL,NULL,1,NULL,0,0,NULL),(68,188,116,8,NULL,NULL,1,NULL,0,0,NULL),(69,82,116,7,NULL,NULL,0,NULL,0,0,NULL),(70,196,82,2,NULL,NULL,0,NULL,0,0,NULL),(71,28,195,1,NULL,NULL,1,NULL,0,0,NULL),(72,133,195,1,NULL,NULL,1,NULL,0,0,NULL),(73,28,173,1,NULL,NULL,1,NULL,0,0,NULL),(74,133,173,1,NULL,NULL,1,NULL,0,0,NULL),(75,133,28,4,NULL,NULL,1,NULL,0,0,NULL),(76,173,106,8,NULL,NULL,1,NULL,0,0,NULL),(77,28,106,8,NULL,NULL,1,NULL,0,0,NULL),(78,133,106,8,NULL,NULL,1,NULL,0,0,NULL),(79,195,106,7,NULL,NULL,0,NULL,0,0,NULL),(80,173,195,2,NULL,NULL,0,NULL,0,0,NULL),(81,152,141,1,NULL,NULL,1,NULL,0,0,NULL),(82,61,141,1,NULL,NULL,1,NULL,0,0,NULL),(83,152,112,1,NULL,NULL,1,NULL,0,0,NULL),(84,61,112,1,NULL,NULL,1,NULL,0,0,NULL),(85,61,152,4,NULL,NULL,1,NULL,0,0,NULL),(86,112,22,8,NULL,NULL,1,NULL,0,0,NULL),(87,152,22,8,NULL,NULL,1,NULL,0,0,NULL),(88,61,22,8,NULL,NULL,1,NULL,0,0,NULL),(89,141,22,7,NULL,NULL,1,NULL,0,0,NULL),(90,112,141,2,NULL,NULL,1,NULL,0,0,NULL),(91,155,108,1,NULL,NULL,1,NULL,0,0,NULL),(92,29,108,1,NULL,NULL,1,NULL,0,0,NULL),(93,155,54,1,NULL,NULL,1,NULL,0,0,NULL),(94,29,54,1,NULL,NULL,1,NULL,0,0,NULL),(95,29,155,4,NULL,NULL,1,NULL,0,0,NULL),(96,54,115,8,NULL,NULL,1,NULL,0,0,NULL),(97,155,115,8,NULL,NULL,1,NULL,0,0,NULL),(98,29,115,8,NULL,NULL,1,NULL,0,0,NULL),(99,108,115,7,NULL,NULL,1,NULL,0,0,NULL),(100,54,108,2,NULL,NULL,1,NULL,0,0,NULL),(101,63,103,1,NULL,NULL,1,NULL,0,0,NULL),(102,95,103,1,NULL,NULL,1,NULL,0,0,NULL),(103,63,201,1,NULL,NULL,1,NULL,0,0,NULL),(104,95,201,1,NULL,NULL,1,NULL,0,0,NULL),(105,95,63,4,NULL,NULL,1,NULL,0,0,NULL),(106,201,35,8,NULL,NULL,1,NULL,0,0,NULL),(107,63,35,8,NULL,NULL,1,NULL,0,0,NULL),(108,95,35,8,NULL,NULL,1,NULL,0,0,NULL),(109,103,35,7,NULL,NULL,1,NULL,0,0,NULL),(110,201,103,2,NULL,NULL,1,NULL,0,0,NULL),(111,114,107,1,NULL,NULL,1,NULL,0,0,NULL),(112,70,107,1,NULL,NULL,1,NULL,0,0,NULL),(113,114,68,1,NULL,NULL,1,NULL,0,0,NULL),(114,70,68,1,NULL,NULL,1,NULL,0,0,NULL),(115,70,114,4,NULL,NULL,1,NULL,0,0,NULL),(116,68,177,8,NULL,NULL,1,NULL,0,0,NULL),(117,114,177,8,NULL,NULL,1,NULL,0,0,NULL),(118,70,177,8,NULL,NULL,1,NULL,0,0,NULL),(119,107,177,7,NULL,NULL,1,NULL,0,0,NULL),(120,68,107,2,NULL,NULL,1,NULL,0,0,NULL),(121,140,10,1,NULL,NULL,1,NULL,0,0,NULL),(122,58,10,1,NULL,NULL,1,NULL,0,0,NULL),(123,140,130,1,NULL,NULL,1,NULL,0,0,NULL),(124,58,130,1,NULL,NULL,1,NULL,0,0,NULL),(125,58,140,4,NULL,NULL,1,NULL,0,0,NULL),(126,130,150,8,NULL,NULL,1,NULL,0,0,NULL),(127,140,150,8,NULL,NULL,1,NULL,0,0,NULL),(128,58,150,8,NULL,NULL,1,NULL,0,0,NULL),(129,10,150,7,NULL,NULL,1,NULL,0,0,NULL),(130,130,10,2,NULL,NULL,1,NULL,0,0,NULL),(131,78,187,1,NULL,NULL,1,NULL,0,0,NULL),(132,181,187,1,NULL,NULL,1,NULL,0,0,NULL),(133,78,48,1,NULL,NULL,1,NULL,0,0,NULL),(134,181,48,1,NULL,NULL,1,NULL,0,0,NULL),(135,181,78,4,NULL,NULL,1,NULL,0,0,NULL),(136,48,72,8,NULL,NULL,1,NULL,0,0,NULL),(137,78,72,8,NULL,NULL,1,NULL,0,0,NULL),(138,181,72,8,NULL,NULL,1,NULL,0,0,NULL),(139,187,72,7,NULL,NULL,0,NULL,0,0,NULL),(140,48,187,2,NULL,NULL,0,NULL,0,0,NULL),(141,20,135,1,NULL,NULL,1,NULL,0,0,NULL),(142,13,135,1,NULL,NULL,1,NULL,0,0,NULL),(143,20,43,1,NULL,NULL,1,NULL,0,0,NULL),(144,13,43,1,NULL,NULL,1,NULL,0,0,NULL),(145,13,20,4,NULL,NULL,1,NULL,0,0,NULL),(146,43,21,8,NULL,NULL,1,NULL,0,0,NULL),(147,20,21,8,NULL,NULL,1,NULL,0,0,NULL),(148,13,21,8,NULL,NULL,1,NULL,0,0,NULL),(149,135,21,7,NULL,NULL,0,NULL,0,0,NULL),(150,43,135,2,NULL,NULL,0,NULL,0,0,NULL),(151,89,194,1,NULL,NULL,1,NULL,0,0,NULL),(152,75,194,1,NULL,NULL,1,NULL,0,0,NULL),(153,89,131,1,NULL,NULL,1,NULL,0,0,NULL),(154,75,131,1,NULL,NULL,1,NULL,0,0,NULL),(155,75,89,4,NULL,NULL,1,NULL,0,0,NULL),(156,131,19,8,NULL,NULL,1,NULL,0,0,NULL),(157,89,19,8,NULL,NULL,1,NULL,0,0,NULL),(158,75,19,8,NULL,NULL,1,NULL,0,0,NULL),(159,194,19,7,NULL,NULL,0,NULL,0,0,NULL),(160,131,194,2,NULL,NULL,0,NULL,0,0,NULL),(161,121,104,1,NULL,NULL,1,NULL,0,0,NULL),(162,39,104,1,NULL,NULL,1,NULL,0,0,NULL),(163,121,153,1,NULL,NULL,1,NULL,0,0,NULL),(164,39,153,1,NULL,NULL,1,NULL,0,0,NULL),(165,39,121,4,NULL,NULL,1,NULL,0,0,NULL),(166,153,168,8,NULL,NULL,1,NULL,0,0,NULL),(167,121,168,8,NULL,NULL,1,NULL,0,0,NULL),(168,39,168,8,NULL,NULL,1,NULL,0,0,NULL),(169,104,168,7,NULL,NULL,1,NULL,0,0,NULL),(170,153,104,2,NULL,NULL,1,NULL,0,0,NULL),(171,36,42,1,NULL,NULL,1,NULL,0,0,NULL),(172,26,42,1,NULL,NULL,1,NULL,0,0,NULL),(173,36,189,1,NULL,NULL,1,NULL,0,0,NULL),(174,26,189,1,NULL,NULL,1,NULL,0,0,NULL),(175,26,36,4,NULL,NULL,1,NULL,0,0,NULL),(176,189,101,8,NULL,NULL,1,NULL,0,0,NULL),(177,36,101,8,NULL,NULL,1,NULL,0,0,NULL),(178,26,101,8,NULL,NULL,1,NULL,0,0,NULL),(179,42,101,7,NULL,NULL,1,NULL,0,0,NULL),(180,189,42,2,NULL,NULL,1,NULL,0,0,NULL),(181,69,171,1,NULL,NULL,1,NULL,0,0,NULL),(182,109,171,1,NULL,NULL,1,NULL,0,0,NULL),(183,69,200,1,NULL,NULL,1,NULL,0,0,NULL),(184,109,200,1,NULL,NULL,1,NULL,0,0,NULL),(185,109,69,4,NULL,NULL,1,NULL,0,0,NULL),(186,200,98,8,NULL,NULL,1,NULL,0,0,NULL),(187,69,98,8,NULL,NULL,1,NULL,0,0,NULL),(188,109,98,8,NULL,NULL,1,NULL,0,0,NULL),(189,171,98,7,NULL,NULL,1,NULL,0,0,NULL),(190,200,171,2,NULL,NULL,1,NULL,0,0,NULL),(191,158,25,1,NULL,NULL,1,NULL,0,0,NULL),(192,4,25,1,NULL,NULL,1,NULL,0,0,NULL),(193,158,180,1,NULL,NULL,1,NULL,0,0,NULL),(194,4,180,1,NULL,NULL,1,NULL,0,0,NULL),(195,4,158,4,NULL,NULL,1,NULL,0,0,NULL),(196,180,163,8,NULL,NULL,1,NULL,0,0,NULL),(197,158,163,8,NULL,NULL,1,NULL,0,0,NULL),(198,4,163,8,NULL,NULL,1,NULL,0,0,NULL),(199,25,163,7,NULL,NULL,0,NULL,0,0,NULL),(200,180,25,2,NULL,NULL,0,NULL,0,0,NULL),(201,26,14,5,NULL,NULL,1,NULL,0,0,NULL),(202,36,37,5,NULL,NULL,1,NULL,0,0,NULL),(203,20,46,5,NULL,NULL,1,NULL,0,0,NULL),(204,89,50,5,NULL,NULL,1,NULL,0,0,NULL),(205,189,56,5,NULL,NULL,1,NULL,0,0,NULL),(206,29,62,5,NULL,NULL,1,NULL,0,0,NULL),(207,75,73,5,NULL,NULL,1,NULL,0,0,NULL),(208,197,86,5,NULL,NULL,1,NULL,0,0,NULL),(209,120,91,5,NULL,NULL,1,NULL,0,0,NULL),(210,151,105,5,NULL,NULL,1,NULL,0,0,NULL),(211,85,117,5,NULL,NULL,1,NULL,0,0,NULL),(212,34,137,5,NULL,NULL,1,NULL,0,0,NULL),(213,170,142,5,NULL,NULL,1,NULL,0,0,NULL),(214,18,144,5,NULL,NULL,1,NULL,0,0,NULL),(215,104,148,5,NULL,NULL,1,NULL,0,0,NULL),(216,57,157,5,NULL,NULL,1,NULL,0,0,NULL),(217,185,174,5,NULL,NULL,1,NULL,0,0,NULL),(218,186,178,5,NULL,NULL,1,NULL,0,0,NULL);
+INSERT INTO `civicrm_relationship` (`id`, `contact_id_a`, `contact_id_b`, `relationship_type_id`, `start_date`, `end_date`, `is_active`, `description`, `is_permission_a_b`, `is_permission_b_a`, `case_id`) VALUES (1,148,105,1,NULL,NULL,1,NULL,0,0,NULL),(2,161,105,1,NULL,NULL,1,NULL,0,0,NULL),(3,148,2,1,NULL,NULL,1,NULL,0,0,NULL),(4,161,2,1,NULL,NULL,1,NULL,0,0,NULL),(5,161,148,4,NULL,NULL,1,NULL,0,0,NULL),(6,2,181,8,NULL,NULL,1,NULL,0,0,NULL),(7,148,181,8,NULL,NULL,1,NULL,0,0,NULL),(8,161,181,8,NULL,NULL,1,NULL,0,0,NULL),(9,105,181,7,NULL,NULL,0,NULL,0,0,NULL),(10,2,105,2,NULL,NULL,0,NULL,0,0,NULL),(11,121,132,1,NULL,NULL,1,NULL,0,0,NULL),(12,37,132,1,NULL,NULL,1,NULL,0,0,NULL),(13,121,145,1,NULL,NULL,1,NULL,0,0,NULL),(14,37,145,1,NULL,NULL,1,NULL,0,0,NULL),(15,37,121,4,NULL,NULL,1,NULL,0,0,NULL),(16,145,46,8,NULL,NULL,1,NULL,0,0,NULL),(17,121,46,8,NULL,NULL,1,NULL,0,0,NULL),(18,37,46,8,NULL,NULL,1,NULL,0,0,NULL),(19,132,46,7,NULL,NULL,1,NULL,0,0,NULL),(20,145,132,2,NULL,NULL,1,NULL,0,0,NULL),(21,190,49,1,NULL,NULL,1,NULL,0,0,NULL),(22,77,49,1,NULL,NULL,1,NULL,0,0,NULL),(23,190,154,1,NULL,NULL,1,NULL,0,0,NULL),(24,77,154,1,NULL,NULL,1,NULL,0,0,NULL),(25,77,190,4,NULL,NULL,1,NULL,0,0,NULL),(26,154,177,8,NULL,NULL,1,NULL,0,0,NULL),(27,190,177,8,NULL,NULL,1,NULL,0,0,NULL),(28,77,177,8,NULL,NULL,1,NULL,0,0,NULL),(29,49,177,7,NULL,NULL,0,NULL,0,0,NULL),(30,154,49,2,NULL,NULL,0,NULL,0,0,NULL),(31,29,198,1,NULL,NULL,1,NULL,0,0,NULL),(32,63,198,1,NULL,NULL,1,NULL,0,0,NULL),(33,29,79,1,NULL,NULL,1,NULL,0,0,NULL),(34,63,79,1,NULL,NULL,1,NULL,0,0,NULL),(35,63,29,4,NULL,NULL,1,NULL,0,0,NULL),(36,79,107,8,NULL,NULL,1,NULL,0,0,NULL),(37,29,107,8,NULL,NULL,1,NULL,0,0,NULL),(38,63,107,8,NULL,NULL,1,NULL,0,0,NULL),(39,198,107,7,NULL,NULL,1,NULL,0,0,NULL),(40,79,198,2,NULL,NULL,1,NULL,0,0,NULL),(41,86,127,1,NULL,NULL,1,NULL,0,0,NULL),(42,96,127,1,NULL,NULL,1,NULL,0,0,NULL),(43,86,92,1,NULL,NULL,1,NULL,0,0,NULL),(44,96,92,1,NULL,NULL,1,NULL,0,0,NULL),(45,96,86,4,NULL,NULL,1,NULL,0,0,NULL),(46,92,191,8,NULL,NULL,1,NULL,0,0,NULL),(47,86,191,8,NULL,NULL,1,NULL,0,0,NULL),(48,96,191,8,NULL,NULL,1,NULL,0,0,NULL),(49,127,191,7,NULL,NULL,0,NULL,0,0,NULL),(50,92,127,2,NULL,NULL,0,NULL,0,0,NULL),(51,116,201,1,NULL,NULL,1,NULL,0,0,NULL),(52,43,201,1,NULL,NULL,1,NULL,0,0,NULL),(53,116,150,1,NULL,NULL,1,NULL,0,0,NULL),(54,43,150,1,NULL,NULL,1,NULL,0,0,NULL),(55,43,116,4,NULL,NULL,1,NULL,0,0,NULL),(56,150,168,8,NULL,NULL,1,NULL,0,0,NULL),(57,116,168,8,NULL,NULL,1,NULL,0,0,NULL),(58,43,168,8,NULL,NULL,1,NULL,0,0,NULL),(59,201,168,7,NULL,NULL,1,NULL,0,0,NULL),(60,150,201,2,NULL,NULL,1,NULL,0,0,NULL),(61,155,55,1,NULL,NULL,1,NULL,0,0,NULL),(62,112,55,1,NULL,NULL,1,NULL,0,0,NULL),(63,155,7,1,NULL,NULL,1,NULL,0,0,NULL),(64,112,7,1,NULL,NULL,1,NULL,0,0,NULL),(65,112,155,4,NULL,NULL,1,NULL,0,0,NULL),(66,7,88,8,NULL,NULL,1,NULL,0,0,NULL),(67,155,88,8,NULL,NULL,1,NULL,0,0,NULL),(68,112,88,8,NULL,NULL,1,NULL,0,0,NULL),(69,55,88,7,NULL,NULL,0,NULL,0,0,NULL),(70,7,55,2,NULL,NULL,0,NULL,0,0,NULL),(71,65,48,1,NULL,NULL,1,NULL,0,0,NULL),(72,128,48,1,NULL,NULL,1,NULL,0,0,NULL),(73,65,75,1,NULL,NULL,1,NULL,0,0,NULL),(74,128,75,1,NULL,NULL,1,NULL,0,0,NULL),(75,128,65,4,NULL,NULL,1,NULL,0,0,NULL),(76,75,129,8,NULL,NULL,1,NULL,0,0,NULL),(77,65,129,8,NULL,NULL,1,NULL,0,0,NULL),(78,128,129,8,NULL,NULL,1,NULL,0,0,NULL),(79,48,129,7,NULL,NULL,1,NULL,0,0,NULL),(80,75,48,2,NULL,NULL,1,NULL,0,0,NULL),(81,41,118,1,NULL,NULL,1,NULL,0,0,NULL),(82,36,118,1,NULL,NULL,1,NULL,0,0,NULL),(83,41,115,1,NULL,NULL,1,NULL,0,0,NULL),(84,36,115,1,NULL,NULL,1,NULL,0,0,NULL),(85,36,41,4,NULL,NULL,1,NULL,0,0,NULL),(86,115,83,8,NULL,NULL,1,NULL,0,0,NULL),(87,41,83,8,NULL,NULL,1,NULL,0,0,NULL),(88,36,83,8,NULL,NULL,1,NULL,0,0,NULL),(89,118,83,7,NULL,NULL,1,NULL,0,0,NULL),(90,115,118,2,NULL,NULL,1,NULL,0,0,NULL),(91,68,93,1,NULL,NULL,1,NULL,0,0,NULL),(92,157,93,1,NULL,NULL,1,NULL,0,0,NULL),(93,68,11,1,NULL,NULL,1,NULL,0,0,NULL),(94,157,11,1,NULL,NULL,1,NULL,0,0,NULL),(95,157,68,4,NULL,NULL,1,NULL,0,0,NULL),(96,11,52,8,NULL,NULL,1,NULL,0,0,NULL),(97,68,52,8,NULL,NULL,1,NULL,0,0,NULL),(98,157,52,8,NULL,NULL,1,NULL,0,0,NULL),(99,93,52,7,NULL,NULL,1,NULL,0,0,NULL),(100,11,93,2,NULL,NULL,1,NULL,0,0,NULL),(101,126,167,1,NULL,NULL,1,NULL,0,0,NULL),(102,53,167,1,NULL,NULL,1,NULL,0,0,NULL),(103,126,114,1,NULL,NULL,1,NULL,0,0,NULL),(104,53,114,1,NULL,NULL,1,NULL,0,0,NULL),(105,53,126,4,NULL,NULL,1,NULL,0,0,NULL),(106,114,160,8,NULL,NULL,1,NULL,0,0,NULL),(107,126,160,8,NULL,NULL,1,NULL,0,0,NULL),(108,53,160,8,NULL,NULL,1,NULL,0,0,NULL),(109,167,160,7,NULL,NULL,1,NULL,0,0,NULL),(110,114,167,2,NULL,NULL,1,NULL,0,0,NULL),(111,110,13,1,NULL,NULL,1,NULL,0,0,NULL),(112,54,13,1,NULL,NULL,1,NULL,0,0,NULL),(113,110,174,1,NULL,NULL,1,NULL,0,0,NULL),(114,54,174,1,NULL,NULL,1,NULL,0,0,NULL),(115,54,110,4,NULL,NULL,1,NULL,0,0,NULL),(116,174,170,8,NULL,NULL,1,NULL,0,0,NULL),(117,110,170,8,NULL,NULL,1,NULL,0,0,NULL),(118,54,170,8,NULL,NULL,1,NULL,0,0,NULL),(119,13,170,7,NULL,NULL,0,NULL,0,0,NULL),(120,174,13,2,NULL,NULL,0,NULL,0,0,NULL),(121,186,119,1,NULL,NULL,1,NULL,0,0,NULL),(122,103,119,1,NULL,NULL,1,NULL,0,0,NULL),(123,186,42,1,NULL,NULL,1,NULL,0,0,NULL),(124,103,42,1,NULL,NULL,1,NULL,0,0,NULL),(125,103,186,4,NULL,NULL,1,NULL,0,0,NULL),(126,42,5,8,NULL,NULL,1,NULL,0,0,NULL),(127,186,5,8,NULL,NULL,1,NULL,0,0,NULL),(128,103,5,8,NULL,NULL,1,NULL,0,0,NULL),(129,119,5,7,NULL,NULL,1,NULL,0,0,NULL),(130,42,119,2,NULL,NULL,1,NULL,0,0,NULL),(131,156,172,1,NULL,NULL,1,NULL,0,0,NULL),(132,165,172,1,NULL,NULL,1,NULL,0,0,NULL),(133,156,15,1,NULL,NULL,1,NULL,0,0,NULL),(134,165,15,1,NULL,NULL,1,NULL,0,0,NULL),(135,165,156,4,NULL,NULL,1,NULL,0,0,NULL),(136,15,51,8,NULL,NULL,1,NULL,0,0,NULL),(137,156,51,8,NULL,NULL,1,NULL,0,0,NULL),(138,165,51,8,NULL,NULL,1,NULL,0,0,NULL),(139,172,51,7,NULL,NULL,1,NULL,0,0,NULL),(140,15,172,2,NULL,NULL,1,NULL,0,0,NULL),(141,194,24,1,NULL,NULL,1,NULL,0,0,NULL),(142,149,24,1,NULL,NULL,1,NULL,0,0,NULL),(143,194,89,1,NULL,NULL,1,NULL,0,0,NULL),(144,149,89,1,NULL,NULL,1,NULL,0,0,NULL),(145,149,194,4,NULL,NULL,1,NULL,0,0,NULL),(146,89,139,8,NULL,NULL,1,NULL,0,0,NULL),(147,194,139,8,NULL,NULL,1,NULL,0,0,NULL),(148,149,139,8,NULL,NULL,1,NULL,0,0,NULL),(149,24,139,7,NULL,NULL,1,NULL,0,0,NULL),(150,89,24,2,NULL,NULL,1,NULL,0,0,NULL),(151,10,71,1,NULL,NULL,1,NULL,0,0,NULL),(152,178,71,1,NULL,NULL,1,NULL,0,0,NULL),(153,10,59,1,NULL,NULL,1,NULL,0,0,NULL),(154,178,59,1,NULL,NULL,1,NULL,0,0,NULL),(155,178,10,4,NULL,NULL,1,NULL,0,0,NULL),(156,59,199,8,NULL,NULL,1,NULL,0,0,NULL),(157,10,199,8,NULL,NULL,1,NULL,0,0,NULL),(158,178,199,8,NULL,NULL,1,NULL,0,0,NULL),(159,71,199,7,NULL,NULL,0,NULL,0,0,NULL),(160,59,71,2,NULL,NULL,0,NULL,0,0,NULL),(161,82,50,1,NULL,NULL,1,NULL,0,0,NULL),(162,81,50,1,NULL,NULL,1,NULL,0,0,NULL),(163,82,124,1,NULL,NULL,1,NULL,0,0,NULL),(164,81,124,1,NULL,NULL,1,NULL,0,0,NULL),(165,81,82,4,NULL,NULL,1,NULL,0,0,NULL),(166,124,8,8,NULL,NULL,1,NULL,0,0,NULL),(167,82,8,8,NULL,NULL,1,NULL,0,0,NULL),(168,81,8,8,NULL,NULL,1,NULL,0,0,NULL),(169,50,8,7,NULL,NULL,1,NULL,0,0,NULL),(170,124,50,2,NULL,NULL,1,NULL,0,0,NULL),(171,6,144,1,NULL,NULL,1,NULL,0,0,NULL),(172,146,144,1,NULL,NULL,1,NULL,0,0,NULL),(173,6,123,1,NULL,NULL,1,NULL,0,0,NULL),(174,146,123,1,NULL,NULL,1,NULL,0,0,NULL),(175,146,6,4,NULL,NULL,1,NULL,0,0,NULL),(176,123,72,8,NULL,NULL,1,NULL,0,0,NULL),(177,6,72,8,NULL,NULL,1,NULL,0,0,NULL),(178,146,72,8,NULL,NULL,1,NULL,0,0,NULL),(179,144,72,7,NULL,NULL,1,NULL,0,0,NULL),(180,123,144,2,NULL,NULL,1,NULL,0,0,NULL),(181,12,9,1,NULL,NULL,1,NULL,0,0,NULL),(182,35,9,1,NULL,NULL,1,NULL,0,0,NULL),(183,12,138,1,NULL,NULL,1,NULL,0,0,NULL),(184,35,138,1,NULL,NULL,1,NULL,0,0,NULL),(185,35,12,4,NULL,NULL,1,NULL,0,0,NULL),(186,138,136,8,NULL,NULL,1,NULL,0,0,NULL),(187,12,136,8,NULL,NULL,1,NULL,0,0,NULL),(188,35,136,8,NULL,NULL,1,NULL,0,0,NULL),(189,9,136,7,NULL,NULL,1,NULL,0,0,NULL),(190,138,9,2,NULL,NULL,1,NULL,0,0,NULL),(191,62,120,1,NULL,NULL,1,NULL,0,0,NULL),(192,45,120,1,NULL,NULL,1,NULL,0,0,NULL),(193,62,164,1,NULL,NULL,1,NULL,0,0,NULL),(194,45,164,1,NULL,NULL,1,NULL,0,0,NULL),(195,45,62,4,NULL,NULL,1,NULL,0,0,NULL),(196,164,74,8,NULL,NULL,1,NULL,0,0,NULL),(197,62,74,8,NULL,NULL,1,NULL,0,0,NULL),(198,45,74,8,NULL,NULL,1,NULL,0,0,NULL),(199,120,74,7,NULL,NULL,0,NULL,0,0,NULL),(200,164,120,2,NULL,NULL,0,NULL,0,0,NULL),(201,192,3,5,NULL,NULL,1,NULL,0,0,NULL),(202,118,4,5,NULL,NULL,1,NULL,0,0,NULL),(203,45,38,5,NULL,NULL,1,NULL,0,0,NULL),(204,42,39,5,NULL,NULL,1,NULL,0,0,NULL),(205,13,61,5,NULL,NULL,1,NULL,0,0,NULL),(206,174,69,5,NULL,NULL,1,NULL,0,0,NULL),(207,172,78,5,NULL,NULL,1,NULL,0,0,NULL),(208,159,80,5,NULL,NULL,1,NULL,0,0,NULL),(209,106,100,5,NULL,NULL,1,NULL,0,0,NULL),(210,113,104,5,NULL,NULL,1,NULL,0,0,NULL),(211,148,122,5,NULL,NULL,1,NULL,0,0,NULL),(212,32,142,5,NULL,NULL,1,NULL,0,0,NULL),(213,110,152,5,NULL,NULL,1,NULL,0,0,NULL),(214,178,162,5,NULL,NULL,1,NULL,0,0,NULL),(215,154,179,5,NULL,NULL,1,NULL,0,0,NULL),(216,119,189,5,NULL,NULL,1,NULL,0,0,NULL),(217,71,196,5,NULL,NULL,1,NULL,0,0,NULL);
 /*!40000 ALTER TABLE `civicrm_relationship` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1271,7 +1271,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_relationship_cache` WRITE;
 /*!40000 ALTER TABLE `civicrm_relationship_cache` DISABLE KEYS */;
-INSERT INTO `civicrm_relationship_cache` (`id`, `relationship_id`, `relationship_type_id`, `orientation`, `near_contact_id`, `near_relation`, `far_contact_id`, `far_relation`, `is_active`, `start_date`, `end_date`) VALUES (1,1,1,'a_b',74,'Child of',172,'Parent of',1,NULL,NULL),(2,1,1,'b_a',172,'Parent of',74,'Child of',1,NULL,NULL),(3,2,1,'a_b',47,'Child of',172,'Parent of',1,NULL,NULL),(4,2,1,'b_a',172,'Parent of',47,'Child of',1,NULL,NULL),(5,3,1,'a_b',74,'Child of',125,'Parent of',1,NULL,NULL),(6,3,1,'b_a',125,'Parent of',74,'Child of',1,NULL,NULL),(7,4,1,'a_b',47,'Child of',125,'Parent of',1,NULL,NULL),(8,4,1,'b_a',125,'Parent of',47,'Child of',1,NULL,NULL),(9,5,4,'a_b',47,'Sibling of',74,'Sibling of',1,NULL,NULL),(10,5,4,'b_a',74,'Sibling of',47,'Sibling of',1,NULL,NULL),(11,6,8,'a_b',125,'Household Member of',11,'Household Member is',1,NULL,NULL),(12,6,8,'b_a',11,'Household Member is',125,'Household Member of',1,NULL,NULL),(13,7,8,'a_b',74,'Household Member of',11,'Household Member is',1,NULL,NULL),(14,7,8,'b_a',11,'Household Member is',74,'Household Member of',1,NULL,NULL),(15,8,8,'a_b',47,'Household Member of',11,'Household Member is',1,NULL,NULL),(16,8,8,'b_a',11,'Household Member is',47,'Household Member of',1,NULL,NULL),(17,9,7,'a_b',172,'Head of Household for',11,'Head of Household is',0,NULL,NULL),(18,9,7,'b_a',11,'Head of Household is',172,'Head of Household for',0,NULL,NULL),(19,10,2,'a_b',125,'Spouse of',172,'Spouse of',0,NULL,NULL),(20,10,2,'b_a',172,'Spouse of',125,'Spouse of',0,NULL,NULL),(21,11,1,'a_b',126,'Child of',159,'Parent of',1,NULL,NULL),(22,11,1,'b_a',159,'Parent of',126,'Child of',1,NULL,NULL),(23,12,1,'a_b',9,'Child of',159,'Parent of',1,NULL,NULL),(24,12,1,'b_a',159,'Parent of',9,'Child of',1,NULL,NULL),(25,13,1,'a_b',126,'Child of',102,'Parent of',1,NULL,NULL),(26,13,1,'b_a',102,'Parent of',126,'Child of',1,NULL,NULL),(27,14,1,'a_b',9,'Child of',102,'Parent of',1,NULL,NULL),(28,14,1,'b_a',102,'Parent of',9,'Child of',1,NULL,NULL),(29,15,4,'a_b',9,'Sibling of',126,'Sibling of',1,NULL,NULL),(30,15,4,'b_a',126,'Sibling of',9,'Sibling of',1,NULL,NULL),(31,16,8,'a_b',102,'Household Member of',128,'Household Member is',1,NULL,NULL),(32,16,8,'b_a',128,'Household Member is',102,'Household Member of',1,NULL,NULL),(33,17,8,'a_b',126,'Household Member of',128,'Household Member is',1,NULL,NULL),(34,17,8,'b_a',128,'Household Member is',126,'Household Member of',1,NULL,NULL),(35,18,8,'a_b',9,'Household Member of',128,'Household Member is',1,NULL,NULL),(36,18,8,'b_a',128,'Household Member is',9,'Household Member of',1,NULL,NULL),(37,19,7,'a_b',159,'Head of Household for',128,'Head of Household is',0,NULL,NULL),(38,19,7,'b_a',128,'Head of Household is',159,'Head of Household for',0,NULL,NULL),(39,20,2,'a_b',102,'Spouse of',159,'Spouse of',0,NULL,NULL),(40,20,2,'b_a',159,'Spouse of',102,'Spouse of',0,NULL,NULL),(41,21,1,'a_b',40,'Child of',198,'Parent of',1,NULL,NULL),(42,21,1,'b_a',198,'Parent of',40,'Child of',1,NULL,NULL),(43,22,1,'a_b',85,'Child of',198,'Parent of',1,NULL,NULL),(44,22,1,'b_a',198,'Parent of',85,'Child of',1,NULL,NULL),(45,23,1,'a_b',40,'Child of',149,'Parent of',1,NULL,NULL),(46,23,1,'b_a',149,'Parent of',40,'Child of',1,NULL,NULL),(47,24,1,'a_b',85,'Child of',149,'Parent of',1,NULL,NULL),(48,24,1,'b_a',149,'Parent of',85,'Child of',1,NULL,NULL),(49,25,4,'a_b',85,'Sibling of',40,'Sibling of',1,NULL,NULL),(50,25,4,'b_a',40,'Sibling of',85,'Sibling of',1,NULL,NULL),(51,26,8,'a_b',149,'Household Member of',38,'Household Member is',1,NULL,NULL),(52,26,8,'b_a',38,'Household Member is',149,'Household Member of',1,NULL,NULL),(53,27,8,'a_b',40,'Household Member of',38,'Household Member is',1,NULL,NULL),(54,27,8,'b_a',38,'Household Member is',40,'Household Member of',1,NULL,NULL),(55,28,8,'a_b',85,'Household Member of',38,'Household Member is',1,NULL,NULL),(56,28,8,'b_a',38,'Household Member is',85,'Household Member of',1,NULL,NULL),(57,29,7,'a_b',198,'Head of Household for',38,'Head of Household is',1,NULL,NULL),(58,29,7,'b_a',38,'Head of Household is',198,'Head of Household for',1,NULL,NULL),(59,30,2,'a_b',149,'Spouse of',198,'Spouse of',1,NULL,NULL),(60,30,2,'b_a',198,'Spouse of',149,'Spouse of',1,NULL,NULL),(61,31,1,'a_b',134,'Child of',192,'Parent of',1,NULL,NULL),(62,31,1,'b_a',192,'Parent of',134,'Child of',1,NULL,NULL),(63,32,1,'a_b',100,'Child of',192,'Parent of',1,NULL,NULL),(64,32,1,'b_a',192,'Parent of',100,'Child of',1,NULL,NULL),(65,33,1,'a_b',134,'Child of',170,'Parent of',1,NULL,NULL),(66,33,1,'b_a',170,'Parent of',134,'Child of',1,NULL,NULL),(67,34,1,'a_b',100,'Child of',170,'Parent of',1,NULL,NULL),(68,34,1,'b_a',170,'Parent of',100,'Child of',1,NULL,NULL),(69,35,4,'a_b',100,'Sibling of',134,'Sibling of',1,NULL,NULL),(70,35,4,'b_a',134,'Sibling of',100,'Sibling of',1,NULL,NULL),(71,36,8,'a_b',170,'Household Member of',136,'Household Member is',1,NULL,NULL),(72,36,8,'b_a',136,'Household Member is',170,'Household Member of',1,NULL,NULL),(73,37,8,'a_b',134,'Household Member of',136,'Household Member is',1,NULL,NULL),(74,37,8,'b_a',136,'Household Member is',134,'Household Member of',1,NULL,NULL),(75,38,8,'a_b',100,'Household Member of',136,'Household Member is',1,NULL,NULL),(76,38,8,'b_a',136,'Household Member is',100,'Household Member of',1,NULL,NULL),(77,39,7,'a_b',192,'Head of Household for',136,'Head of Household is',0,NULL,NULL),(78,39,7,'b_a',136,'Head of Household is',192,'Head of Household for',0,NULL,NULL),(79,40,2,'a_b',170,'Spouse of',192,'Spouse of',0,NULL,NULL),(80,40,2,'b_a',192,'Spouse of',170,'Spouse of',0,NULL,NULL),(81,41,1,'a_b',59,'Child of',34,'Parent of',1,NULL,NULL),(82,41,1,'b_a',34,'Parent of',59,'Child of',1,NULL,NULL),(83,42,1,'a_b',110,'Child of',34,'Parent of',1,NULL,NULL),(84,42,1,'b_a',34,'Parent of',110,'Child of',1,NULL,NULL),(85,43,1,'a_b',59,'Child of',113,'Parent of',1,NULL,NULL),(86,43,1,'b_a',113,'Parent of',59,'Child of',1,NULL,NULL),(87,44,1,'a_b',110,'Child of',113,'Parent of',1,NULL,NULL),(88,44,1,'b_a',113,'Parent of',110,'Child of',1,NULL,NULL),(89,45,4,'a_b',110,'Sibling of',59,'Sibling of',1,NULL,NULL),(90,45,4,'b_a',59,'Sibling of',110,'Sibling of',1,NULL,NULL),(91,46,8,'a_b',113,'Household Member of',32,'Household Member is',1,NULL,NULL),(92,46,8,'b_a',32,'Household Member is',113,'Household Member of',1,NULL,NULL),(93,47,8,'a_b',59,'Household Member of',32,'Household Member is',1,NULL,NULL),(94,47,8,'b_a',32,'Household Member is',59,'Household Member of',1,NULL,NULL),(95,48,8,'a_b',110,'Household Member of',32,'Household Member is',1,NULL,NULL),(96,48,8,'b_a',32,'Household Member is',110,'Household Member of',1,NULL,NULL),(97,49,7,'a_b',34,'Head of Household for',32,'Head of Household is',1,NULL,NULL),(98,49,7,'b_a',32,'Head of Household is',34,'Head of Household for',1,NULL,NULL),(99,50,2,'a_b',113,'Spouse of',34,'Spouse of',1,NULL,NULL),(100,50,2,'b_a',34,'Spouse of',113,'Spouse of',1,NULL,NULL),(101,51,1,'a_b',147,'Child of',191,'Parent of',1,NULL,NULL),(102,51,1,'b_a',191,'Parent of',147,'Child of',1,NULL,NULL),(103,52,1,'a_b',151,'Child of',191,'Parent of',1,NULL,NULL),(104,52,1,'b_a',191,'Parent of',151,'Child of',1,NULL,NULL),(105,53,1,'a_b',147,'Child of',160,'Parent of',1,NULL,NULL),(106,53,1,'b_a',160,'Parent of',147,'Child of',1,NULL,NULL),(107,54,1,'a_b',151,'Child of',160,'Parent of',1,NULL,NULL),(108,54,1,'b_a',160,'Parent of',151,'Child of',1,NULL,NULL),(109,55,4,'a_b',151,'Sibling of',147,'Sibling of',1,NULL,NULL),(110,55,4,'b_a',147,'Sibling of',151,'Sibling of',1,NULL,NULL),(111,56,8,'a_b',160,'Household Member of',27,'Household Member is',1,NULL,NULL),(112,56,8,'b_a',27,'Household Member is',160,'Household Member of',1,NULL,NULL),(113,57,8,'a_b',147,'Household Member of',27,'Household Member is',1,NULL,NULL),(114,57,8,'b_a',27,'Household Member is',147,'Household Member of',1,NULL,NULL),(115,58,8,'a_b',151,'Household Member of',27,'Household Member is',1,NULL,NULL),(116,58,8,'b_a',27,'Household Member is',151,'Household Member of',1,NULL,NULL),(117,59,7,'a_b',191,'Head of Household for',27,'Head of Household is',1,NULL,NULL),(118,59,7,'b_a',27,'Head of Household is',191,'Head of Household for',1,NULL,NULL),(119,60,2,'a_b',160,'Spouse of',191,'Spouse of',1,NULL,NULL),(120,60,2,'b_a',191,'Spouse of',160,'Spouse of',1,NULL,NULL),(121,61,1,'a_b',94,'Child of',82,'Parent of',1,NULL,NULL),(122,61,1,'b_a',82,'Parent of',94,'Child of',1,NULL,NULL),(123,62,1,'a_b',188,'Child of',82,'Parent of',1,NULL,NULL),(124,62,1,'b_a',82,'Parent of',188,'Child of',1,NULL,NULL),(125,63,1,'a_b',94,'Child of',196,'Parent of',1,NULL,NULL),(126,63,1,'b_a',196,'Parent of',94,'Child of',1,NULL,NULL),(127,64,1,'a_b',188,'Child of',196,'Parent of',1,NULL,NULL),(128,64,1,'b_a',196,'Parent of',188,'Child of',1,NULL,NULL),(129,65,4,'a_b',188,'Sibling of',94,'Sibling of',1,NULL,NULL),(130,65,4,'b_a',94,'Sibling of',188,'Sibling of',1,NULL,NULL),(131,66,8,'a_b',196,'Household Member of',116,'Household Member is',1,NULL,NULL),(132,66,8,'b_a',116,'Household Member is',196,'Household Member of',1,NULL,NULL),(133,67,8,'a_b',94,'Household Member of',116,'Household Member is',1,NULL,NULL),(134,67,8,'b_a',116,'Household Member is',94,'Household Member of',1,NULL,NULL),(135,68,8,'a_b',188,'Household Member of',116,'Household Member is',1,NULL,NULL),(136,68,8,'b_a',116,'Household Member is',188,'Household Member of',1,NULL,NULL),(137,69,7,'a_b',82,'Head of Household for',116,'Head of Household is',0,NULL,NULL),(138,69,7,'b_a',116,'Head of Household is',82,'Head of Household for',0,NULL,NULL),(139,70,2,'a_b',196,'Spouse of',82,'Spouse of',0,NULL,NULL),(140,70,2,'b_a',82,'Spouse of',196,'Spouse of',0,NULL,NULL),(141,71,1,'a_b',28,'Child of',195,'Parent of',1,NULL,NULL),(142,71,1,'b_a',195,'Parent of',28,'Child of',1,NULL,NULL),(143,72,1,'a_b',133,'Child of',195,'Parent of',1,NULL,NULL),(144,72,1,'b_a',195,'Parent of',133,'Child of',1,NULL,NULL),(145,73,1,'a_b',28,'Child of',173,'Parent of',1,NULL,NULL),(146,73,1,'b_a',173,'Parent of',28,'Child of',1,NULL,NULL),(147,74,1,'a_b',133,'Child of',173,'Parent of',1,NULL,NULL),(148,74,1,'b_a',173,'Parent of',133,'Child of',1,NULL,NULL),(149,75,4,'a_b',133,'Sibling of',28,'Sibling of',1,NULL,NULL),(150,75,4,'b_a',28,'Sibling of',133,'Sibling of',1,NULL,NULL),(151,76,8,'a_b',173,'Household Member of',106,'Household Member is',1,NULL,NULL),(152,76,8,'b_a',106,'Household Member is',173,'Household Member of',1,NULL,NULL),(153,77,8,'a_b',28,'Household Member of',106,'Household Member is',1,NULL,NULL),(154,77,8,'b_a',106,'Household Member is',28,'Household Member of',1,NULL,NULL),(155,78,8,'a_b',133,'Household Member of',106,'Household Member is',1,NULL,NULL),(156,78,8,'b_a',106,'Household Member is',133,'Household Member of',1,NULL,NULL),(157,79,7,'a_b',195,'Head of Household for',106,'Head of Household is',0,NULL,NULL),(158,79,7,'b_a',106,'Head of Household is',195,'Head of Household for',0,NULL,NULL),(159,80,2,'a_b',173,'Spouse of',195,'Spouse of',0,NULL,NULL),(160,80,2,'b_a',195,'Spouse of',173,'Spouse of',0,NULL,NULL),(161,81,1,'a_b',152,'Child of',141,'Parent of',1,NULL,NULL),(162,81,1,'b_a',141,'Parent of',152,'Child of',1,NULL,NULL),(163,82,1,'a_b',61,'Child of',141,'Parent of',1,NULL,NULL),(164,82,1,'b_a',141,'Parent of',61,'Child of',1,NULL,NULL),(165,83,1,'a_b',152,'Child of',112,'Parent of',1,NULL,NULL),(166,83,1,'b_a',112,'Parent of',152,'Child of',1,NULL,NULL),(167,84,1,'a_b',61,'Child of',112,'Parent of',1,NULL,NULL),(168,84,1,'b_a',112,'Parent of',61,'Child of',1,NULL,NULL),(169,85,4,'a_b',61,'Sibling of',152,'Sibling of',1,NULL,NULL),(170,85,4,'b_a',152,'Sibling of',61,'Sibling of',1,NULL,NULL),(171,86,8,'a_b',112,'Household Member of',22,'Household Member is',1,NULL,NULL),(172,86,8,'b_a',22,'Household Member is',112,'Household Member of',1,NULL,NULL),(173,87,8,'a_b',152,'Household Member of',22,'Household Member is',1,NULL,NULL),(174,87,8,'b_a',22,'Household Member is',152,'Household Member of',1,NULL,NULL),(175,88,8,'a_b',61,'Household Member of',22,'Household Member is',1,NULL,NULL),(176,88,8,'b_a',22,'Household Member is',61,'Household Member of',1,NULL,NULL),(177,89,7,'a_b',141,'Head of Household for',22,'Head of Household is',1,NULL,NULL),(178,89,7,'b_a',22,'Head of Household is',141,'Head of Household for',1,NULL,NULL),(179,90,2,'a_b',112,'Spouse of',141,'Spouse of',1,NULL,NULL),(180,90,2,'b_a',141,'Spouse of',112,'Spouse of',1,NULL,NULL),(181,91,1,'a_b',155,'Child of',108,'Parent of',1,NULL,NULL),(182,91,1,'b_a',108,'Parent of',155,'Child of',1,NULL,NULL),(183,92,1,'a_b',29,'Child of',108,'Parent of',1,NULL,NULL),(184,92,1,'b_a',108,'Parent of',29,'Child of',1,NULL,NULL),(185,93,1,'a_b',155,'Child of',54,'Parent of',1,NULL,NULL),(186,93,1,'b_a',54,'Parent of',155,'Child of',1,NULL,NULL),(187,94,1,'a_b',29,'Child of',54,'Parent of',1,NULL,NULL),(188,94,1,'b_a',54,'Parent of',29,'Child of',1,NULL,NULL),(189,95,4,'a_b',29,'Sibling of',155,'Sibling of',1,NULL,NULL),(190,95,4,'b_a',155,'Sibling of',29,'Sibling of',1,NULL,NULL),(191,96,8,'a_b',54,'Household Member of',115,'Household Member is',1,NULL,NULL),(192,96,8,'b_a',115,'Household Member is',54,'Household Member of',1,NULL,NULL),(193,97,8,'a_b',155,'Household Member of',115,'Household Member is',1,NULL,NULL),(194,97,8,'b_a',115,'Household Member is',155,'Household Member of',1,NULL,NULL),(195,98,8,'a_b',29,'Household Member of',115,'Household Member is',1,NULL,NULL),(196,98,8,'b_a',115,'Household Member is',29,'Household Member of',1,NULL,NULL),(197,99,7,'a_b',108,'Head of Household for',115,'Head of Household is',1,NULL,NULL),(198,99,7,'b_a',115,'Head of Household is',108,'Head of Household for',1,NULL,NULL),(199,100,2,'a_b',54,'Spouse of',108,'Spouse of',1,NULL,NULL),(200,100,2,'b_a',108,'Spouse of',54,'Spouse of',1,NULL,NULL),(201,101,1,'a_b',63,'Child of',103,'Parent of',1,NULL,NULL),(202,101,1,'b_a',103,'Parent of',63,'Child of',1,NULL,NULL),(203,102,1,'a_b',95,'Child of',103,'Parent of',1,NULL,NULL),(204,102,1,'b_a',103,'Parent of',95,'Child of',1,NULL,NULL),(205,103,1,'a_b',63,'Child of',201,'Parent of',1,NULL,NULL),(206,103,1,'b_a',201,'Parent of',63,'Child of',1,NULL,NULL),(207,104,1,'a_b',95,'Child of',201,'Parent of',1,NULL,NULL),(208,104,1,'b_a',201,'Parent of',95,'Child of',1,NULL,NULL),(209,105,4,'a_b',95,'Sibling of',63,'Sibling of',1,NULL,NULL),(210,105,4,'b_a',63,'Sibling of',95,'Sibling of',1,NULL,NULL),(211,106,8,'a_b',201,'Household Member of',35,'Household Member is',1,NULL,NULL),(212,106,8,'b_a',35,'Household Member is',201,'Household Member of',1,NULL,NULL),(213,107,8,'a_b',63,'Household Member of',35,'Household Member is',1,NULL,NULL),(214,107,8,'b_a',35,'Household Member is',63,'Household Member of',1,NULL,NULL),(215,108,8,'a_b',95,'Household Member of',35,'Household Member is',1,NULL,NULL),(216,108,8,'b_a',35,'Household Member is',95,'Household Member of',1,NULL,NULL),(217,109,7,'a_b',103,'Head of Household for',35,'Head of Household is',1,NULL,NULL),(218,109,7,'b_a',35,'Head of Household is',103,'Head of Household for',1,NULL,NULL),(219,110,2,'a_b',201,'Spouse of',103,'Spouse of',1,NULL,NULL),(220,110,2,'b_a',103,'Spouse of',201,'Spouse of',1,NULL,NULL),(221,111,1,'a_b',114,'Child of',107,'Parent of',1,NULL,NULL),(222,111,1,'b_a',107,'Parent of',114,'Child of',1,NULL,NULL),(223,112,1,'a_b',70,'Child of',107,'Parent of',1,NULL,NULL),(224,112,1,'b_a',107,'Parent of',70,'Child of',1,NULL,NULL),(225,113,1,'a_b',114,'Child of',68,'Parent of',1,NULL,NULL),(226,113,1,'b_a',68,'Parent of',114,'Child of',1,NULL,NULL),(227,114,1,'a_b',70,'Child of',68,'Parent of',1,NULL,NULL),(228,114,1,'b_a',68,'Parent of',70,'Child of',1,NULL,NULL),(229,115,4,'a_b',70,'Sibling of',114,'Sibling of',1,NULL,NULL),(230,115,4,'b_a',114,'Sibling of',70,'Sibling of',1,NULL,NULL),(231,116,8,'a_b',68,'Household Member of',177,'Household Member is',1,NULL,NULL),(232,116,8,'b_a',177,'Household Member is',68,'Household Member of',1,NULL,NULL),(233,117,8,'a_b',114,'Household Member of',177,'Household Member is',1,NULL,NULL),(234,117,8,'b_a',177,'Household Member is',114,'Household Member of',1,NULL,NULL),(235,118,8,'a_b',70,'Household Member of',177,'Household Member is',1,NULL,NULL),(236,118,8,'b_a',177,'Household Member is',70,'Household Member of',1,NULL,NULL),(237,119,7,'a_b',107,'Head of Household for',177,'Head of Household is',1,NULL,NULL),(238,119,7,'b_a',177,'Head of Household is',107,'Head of Household for',1,NULL,NULL),(239,120,2,'a_b',68,'Spouse of',107,'Spouse of',1,NULL,NULL),(240,120,2,'b_a',107,'Spouse of',68,'Spouse of',1,NULL,NULL),(241,121,1,'a_b',140,'Child of',10,'Parent of',1,NULL,NULL),(242,121,1,'b_a',10,'Parent of',140,'Child of',1,NULL,NULL),(243,122,1,'a_b',58,'Child of',10,'Parent of',1,NULL,NULL),(244,122,1,'b_a',10,'Parent of',58,'Child of',1,NULL,NULL),(245,123,1,'a_b',140,'Child of',130,'Parent of',1,NULL,NULL),(246,123,1,'b_a',130,'Parent of',140,'Child of',1,NULL,NULL),(247,124,1,'a_b',58,'Child of',130,'Parent of',1,NULL,NULL),(248,124,1,'b_a',130,'Parent of',58,'Child of',1,NULL,NULL),(249,125,4,'a_b',58,'Sibling of',140,'Sibling of',1,NULL,NULL),(250,125,4,'b_a',140,'Sibling of',58,'Sibling of',1,NULL,NULL),(251,126,8,'a_b',130,'Household Member of',150,'Household Member is',1,NULL,NULL),(252,126,8,'b_a',150,'Household Member is',130,'Household Member of',1,NULL,NULL),(253,127,8,'a_b',140,'Household Member of',150,'Household Member is',1,NULL,NULL),(254,127,8,'b_a',150,'Household Member is',140,'Household Member of',1,NULL,NULL),(255,128,8,'a_b',58,'Household Member of',150,'Household Member is',1,NULL,NULL),(256,128,8,'b_a',150,'Household Member is',58,'Household Member of',1,NULL,NULL),(257,129,7,'a_b',10,'Head of Household for',150,'Head of Household is',1,NULL,NULL),(258,129,7,'b_a',150,'Head of Household is',10,'Head of Household for',1,NULL,NULL),(259,130,2,'a_b',130,'Spouse of',10,'Spouse of',1,NULL,NULL),(260,130,2,'b_a',10,'Spouse of',130,'Spouse of',1,NULL,NULL),(261,131,1,'a_b',78,'Child of',187,'Parent of',1,NULL,NULL),(262,131,1,'b_a',187,'Parent of',78,'Child of',1,NULL,NULL),(263,132,1,'a_b',181,'Child of',187,'Parent of',1,NULL,NULL),(264,132,1,'b_a',187,'Parent of',181,'Child of',1,NULL,NULL),(265,133,1,'a_b',78,'Child of',48,'Parent of',1,NULL,NULL),(266,133,1,'b_a',48,'Parent of',78,'Child of',1,NULL,NULL),(267,134,1,'a_b',181,'Child of',48,'Parent of',1,NULL,NULL),(268,134,1,'b_a',48,'Parent of',181,'Child of',1,NULL,NULL),(269,135,4,'a_b',181,'Sibling of',78,'Sibling of',1,NULL,NULL),(270,135,4,'b_a',78,'Sibling of',181,'Sibling of',1,NULL,NULL),(271,136,8,'a_b',48,'Household Member of',72,'Household Member is',1,NULL,NULL),(272,136,8,'b_a',72,'Household Member is',48,'Household Member of',1,NULL,NULL),(273,137,8,'a_b',78,'Household Member of',72,'Household Member is',1,NULL,NULL),(274,137,8,'b_a',72,'Household Member is',78,'Household Member of',1,NULL,NULL),(275,138,8,'a_b',181,'Household Member of',72,'Household Member is',1,NULL,NULL),(276,138,8,'b_a',72,'Household Member is',181,'Household Member of',1,NULL,NULL),(277,139,7,'a_b',187,'Head of Household for',72,'Head of Household is',0,NULL,NULL),(278,139,7,'b_a',72,'Head of Household is',187,'Head of Household for',0,NULL,NULL),(279,140,2,'a_b',48,'Spouse of',187,'Spouse of',0,NULL,NULL),(280,140,2,'b_a',187,'Spouse of',48,'Spouse of',0,NULL,NULL),(281,141,1,'a_b',20,'Child of',135,'Parent of',1,NULL,NULL),(282,141,1,'b_a',135,'Parent of',20,'Child of',1,NULL,NULL),(283,142,1,'a_b',13,'Child of',135,'Parent of',1,NULL,NULL),(284,142,1,'b_a',135,'Parent of',13,'Child of',1,NULL,NULL),(285,143,1,'a_b',20,'Child of',43,'Parent of',1,NULL,NULL),(286,143,1,'b_a',43,'Parent of',20,'Child of',1,NULL,NULL),(287,144,1,'a_b',13,'Child of',43,'Parent of',1,NULL,NULL),(288,144,1,'b_a',43,'Parent of',13,'Child of',1,NULL,NULL),(289,145,4,'a_b',13,'Sibling of',20,'Sibling of',1,NULL,NULL),(290,145,4,'b_a',20,'Sibling of',13,'Sibling of',1,NULL,NULL),(291,146,8,'a_b',43,'Household Member of',21,'Household Member is',1,NULL,NULL),(292,146,8,'b_a',21,'Household Member is',43,'Household Member of',1,NULL,NULL),(293,147,8,'a_b',20,'Household Member of',21,'Household Member is',1,NULL,NULL),(294,147,8,'b_a',21,'Household Member is',20,'Household Member of',1,NULL,NULL),(295,148,8,'a_b',13,'Household Member of',21,'Household Member is',1,NULL,NULL),(296,148,8,'b_a',21,'Household Member is',13,'Household Member of',1,NULL,NULL),(297,149,7,'a_b',135,'Head of Household for',21,'Head of Household is',0,NULL,NULL),(298,149,7,'b_a',21,'Head of Household is',135,'Head of Household for',0,NULL,NULL),(299,150,2,'a_b',43,'Spouse of',135,'Spouse of',0,NULL,NULL),(300,150,2,'b_a',135,'Spouse of',43,'Spouse of',0,NULL,NULL),(301,151,1,'a_b',89,'Child of',194,'Parent of',1,NULL,NULL),(302,151,1,'b_a',194,'Parent of',89,'Child of',1,NULL,NULL),(303,152,1,'a_b',75,'Child of',194,'Parent of',1,NULL,NULL),(304,152,1,'b_a',194,'Parent of',75,'Child of',1,NULL,NULL),(305,153,1,'a_b',89,'Child of',131,'Parent of',1,NULL,NULL),(306,153,1,'b_a',131,'Parent of',89,'Child of',1,NULL,NULL),(307,154,1,'a_b',75,'Child of',131,'Parent of',1,NULL,NULL),(308,154,1,'b_a',131,'Parent of',75,'Child of',1,NULL,NULL),(309,155,4,'a_b',75,'Sibling of',89,'Sibling of',1,NULL,NULL),(310,155,4,'b_a',89,'Sibling of',75,'Sibling of',1,NULL,NULL),(311,156,8,'a_b',131,'Household Member of',19,'Household Member is',1,NULL,NULL),(312,156,8,'b_a',19,'Household Member is',131,'Household Member of',1,NULL,NULL),(313,157,8,'a_b',89,'Household Member of',19,'Household Member is',1,NULL,NULL),(314,157,8,'b_a',19,'Household Member is',89,'Household Member of',1,NULL,NULL),(315,158,8,'a_b',75,'Household Member of',19,'Household Member is',1,NULL,NULL),(316,158,8,'b_a',19,'Household Member is',75,'Household Member of',1,NULL,NULL),(317,159,7,'a_b',194,'Head of Household for',19,'Head of Household is',0,NULL,NULL),(318,159,7,'b_a',19,'Head of Household is',194,'Head of Household for',0,NULL,NULL),(319,160,2,'a_b',131,'Spouse of',194,'Spouse of',0,NULL,NULL),(320,160,2,'b_a',194,'Spouse of',131,'Spouse of',0,NULL,NULL),(321,161,1,'a_b',121,'Child of',104,'Parent of',1,NULL,NULL),(322,161,1,'b_a',104,'Parent of',121,'Child of',1,NULL,NULL),(323,162,1,'a_b',39,'Child of',104,'Parent of',1,NULL,NULL),(324,162,1,'b_a',104,'Parent of',39,'Child of',1,NULL,NULL),(325,163,1,'a_b',121,'Child of',153,'Parent of',1,NULL,NULL),(326,163,1,'b_a',153,'Parent of',121,'Child of',1,NULL,NULL),(327,164,1,'a_b',39,'Child of',153,'Parent of',1,NULL,NULL),(328,164,1,'b_a',153,'Parent of',39,'Child of',1,NULL,NULL),(329,165,4,'a_b',39,'Sibling of',121,'Sibling of',1,NULL,NULL),(330,165,4,'b_a',121,'Sibling of',39,'Sibling of',1,NULL,NULL),(331,166,8,'a_b',153,'Household Member of',168,'Household Member is',1,NULL,NULL),(332,166,8,'b_a',168,'Household Member is',153,'Household Member of',1,NULL,NULL),(333,167,8,'a_b',121,'Household Member of',168,'Household Member is',1,NULL,NULL),(334,167,8,'b_a',168,'Household Member is',121,'Household Member of',1,NULL,NULL),(335,168,8,'a_b',39,'Household Member of',168,'Household Member is',1,NULL,NULL),(336,168,8,'b_a',168,'Household Member is',39,'Household Member of',1,NULL,NULL),(337,169,7,'a_b',104,'Head of Household for',168,'Head of Household is',1,NULL,NULL),(338,169,7,'b_a',168,'Head of Household is',104,'Head of Household for',1,NULL,NULL),(339,170,2,'a_b',153,'Spouse of',104,'Spouse of',1,NULL,NULL),(340,170,2,'b_a',104,'Spouse of',153,'Spouse of',1,NULL,NULL),(341,171,1,'a_b',36,'Child of',42,'Parent of',1,NULL,NULL),(342,171,1,'b_a',42,'Parent of',36,'Child of',1,NULL,NULL),(343,172,1,'a_b',26,'Child of',42,'Parent of',1,NULL,NULL),(344,172,1,'b_a',42,'Parent of',26,'Child of',1,NULL,NULL),(345,173,1,'a_b',36,'Child of',189,'Parent of',1,NULL,NULL),(346,173,1,'b_a',189,'Parent of',36,'Child of',1,NULL,NULL),(347,174,1,'a_b',26,'Child of',189,'Parent of',1,NULL,NULL),(348,174,1,'b_a',189,'Parent of',26,'Child of',1,NULL,NULL),(349,175,4,'a_b',26,'Sibling of',36,'Sibling of',1,NULL,NULL),(350,175,4,'b_a',36,'Sibling of',26,'Sibling of',1,NULL,NULL),(351,176,8,'a_b',189,'Household Member of',101,'Household Member is',1,NULL,NULL),(352,176,8,'b_a',101,'Household Member is',189,'Household Member of',1,NULL,NULL),(353,177,8,'a_b',36,'Household Member of',101,'Household Member is',1,NULL,NULL),(354,177,8,'b_a',101,'Household Member is',36,'Household Member of',1,NULL,NULL),(355,178,8,'a_b',26,'Household Member of',101,'Household Member is',1,NULL,NULL),(356,178,8,'b_a',101,'Household Member is',26,'Household Member of',1,NULL,NULL),(357,179,7,'a_b',42,'Head of Household for',101,'Head of Household is',1,NULL,NULL),(358,179,7,'b_a',101,'Head of Household is',42,'Head of Household for',1,NULL,NULL),(359,180,2,'a_b',189,'Spouse of',42,'Spouse of',1,NULL,NULL),(360,180,2,'b_a',42,'Spouse of',189,'Spouse of',1,NULL,NULL),(361,181,1,'a_b',69,'Child of',171,'Parent of',1,NULL,NULL),(362,181,1,'b_a',171,'Parent of',69,'Child of',1,NULL,NULL),(363,182,1,'a_b',109,'Child of',171,'Parent of',1,NULL,NULL),(364,182,1,'b_a',171,'Parent of',109,'Child of',1,NULL,NULL),(365,183,1,'a_b',69,'Child of',200,'Parent of',1,NULL,NULL),(366,183,1,'b_a',200,'Parent of',69,'Child of',1,NULL,NULL),(367,184,1,'a_b',109,'Child of',200,'Parent of',1,NULL,NULL),(368,184,1,'b_a',200,'Parent of',109,'Child of',1,NULL,NULL),(369,185,4,'a_b',109,'Sibling of',69,'Sibling of',1,NULL,NULL),(370,185,4,'b_a',69,'Sibling of',109,'Sibling of',1,NULL,NULL),(371,186,8,'a_b',200,'Household Member of',98,'Household Member is',1,NULL,NULL),(372,186,8,'b_a',98,'Household Member is',200,'Household Member of',1,NULL,NULL),(373,187,8,'a_b',69,'Household Member of',98,'Household Member is',1,NULL,NULL),(374,187,8,'b_a',98,'Household Member is',69,'Household Member of',1,NULL,NULL),(375,188,8,'a_b',109,'Household Member of',98,'Household Member is',1,NULL,NULL),(376,188,8,'b_a',98,'Household Member is',109,'Household Member of',1,NULL,NULL),(377,189,7,'a_b',171,'Head of Household for',98,'Head of Household is',1,NULL,NULL),(378,189,7,'b_a',98,'Head of Household is',171,'Head of Household for',1,NULL,NULL),(379,190,2,'a_b',200,'Spouse of',171,'Spouse of',1,NULL,NULL),(380,190,2,'b_a',171,'Spouse of',200,'Spouse of',1,NULL,NULL),(381,191,1,'a_b',158,'Child of',25,'Parent of',1,NULL,NULL),(382,191,1,'b_a',25,'Parent of',158,'Child of',1,NULL,NULL),(383,192,1,'a_b',4,'Child of',25,'Parent of',1,NULL,NULL),(384,192,1,'b_a',25,'Parent of',4,'Child of',1,NULL,NULL),(385,193,1,'a_b',158,'Child of',180,'Parent of',1,NULL,NULL),(386,193,1,'b_a',180,'Parent of',158,'Child of',1,NULL,NULL),(387,194,1,'a_b',4,'Child of',180,'Parent of',1,NULL,NULL),(388,194,1,'b_a',180,'Parent of',4,'Child of',1,NULL,NULL),(389,195,4,'a_b',4,'Sibling of',158,'Sibling of',1,NULL,NULL),(390,195,4,'b_a',158,'Sibling of',4,'Sibling of',1,NULL,NULL),(391,196,8,'a_b',180,'Household Member of',163,'Household Member is',1,NULL,NULL),(392,196,8,'b_a',163,'Household Member is',180,'Household Member of',1,NULL,NULL),(393,197,8,'a_b',158,'Household Member of',163,'Household Member is',1,NULL,NULL),(394,197,8,'b_a',163,'Household Member is',158,'Household Member of',1,NULL,NULL),(395,198,8,'a_b',4,'Household Member of',163,'Household Member is',1,NULL,NULL),(396,198,8,'b_a',163,'Household Member is',4,'Household Member of',1,NULL,NULL),(397,199,7,'a_b',25,'Head of Household for',163,'Head of Household is',0,NULL,NULL),(398,199,7,'b_a',163,'Head of Household is',25,'Head of Household for',0,NULL,NULL),(399,200,2,'a_b',180,'Spouse of',25,'Spouse of',0,NULL,NULL),(400,200,2,'b_a',25,'Spouse of',180,'Spouse of',0,NULL,NULL),(401,201,5,'a_b',26,'Employee of',14,'Employer of',1,NULL,NULL),(402,201,5,'b_a',14,'Employer of',26,'Employee of',1,NULL,NULL),(403,202,5,'a_b',36,'Employee of',37,'Employer of',1,NULL,NULL),(404,202,5,'b_a',37,'Employer of',36,'Employee of',1,NULL,NULL),(405,203,5,'a_b',20,'Employee of',46,'Employer of',1,NULL,NULL),(406,203,5,'b_a',46,'Employer of',20,'Employee of',1,NULL,NULL),(407,204,5,'a_b',89,'Employee of',50,'Employer of',1,NULL,NULL),(408,204,5,'b_a',50,'Employer of',89,'Employee of',1,NULL,NULL),(409,205,5,'a_b',189,'Employee of',56,'Employer of',1,NULL,NULL),(410,205,5,'b_a',56,'Employer of',189,'Employee of',1,NULL,NULL),(411,206,5,'a_b',29,'Employee of',62,'Employer of',1,NULL,NULL),(412,206,5,'b_a',62,'Employer of',29,'Employee of',1,NULL,NULL),(413,207,5,'a_b',75,'Employee of',73,'Employer of',1,NULL,NULL),(414,207,5,'b_a',73,'Employer of',75,'Employee of',1,NULL,NULL),(415,208,5,'a_b',197,'Employee of',86,'Employer of',1,NULL,NULL),(416,208,5,'b_a',86,'Employer of',197,'Employee of',1,NULL,NULL),(417,209,5,'a_b',120,'Employee of',91,'Employer of',1,NULL,NULL),(418,209,5,'b_a',91,'Employer of',120,'Employee of',1,NULL,NULL),(419,210,5,'a_b',151,'Employee of',105,'Employer of',1,NULL,NULL),(420,210,5,'b_a',105,'Employer of',151,'Employee of',1,NULL,NULL),(421,211,5,'a_b',85,'Employee of',117,'Employer of',1,NULL,NULL),(422,211,5,'b_a',117,'Employer of',85,'Employee of',1,NULL,NULL),(423,212,5,'a_b',34,'Employee of',137,'Employer of',1,NULL,NULL),(424,212,5,'b_a',137,'Employer of',34,'Employee of',1,NULL,NULL),(425,213,5,'a_b',170,'Employee of',142,'Employer of',1,NULL,NULL),(426,213,5,'b_a',142,'Employer of',170,'Employee of',1,NULL,NULL),(427,214,5,'a_b',18,'Employee of',144,'Employer of',1,NULL,NULL),(428,214,5,'b_a',144,'Employer of',18,'Employee of',1,NULL,NULL),(429,215,5,'a_b',104,'Employee of',148,'Employer of',1,NULL,NULL),(430,215,5,'b_a',148,'Employer of',104,'Employee of',1,NULL,NULL),(431,216,5,'a_b',57,'Employee of',157,'Employer of',1,NULL,NULL),(432,216,5,'b_a',157,'Employer of',57,'Employee of',1,NULL,NULL),(433,217,5,'a_b',185,'Employee of',174,'Employer of',1,NULL,NULL),(434,217,5,'b_a',174,'Employer of',185,'Employee of',1,NULL,NULL),(435,218,5,'a_b',186,'Employee of',178,'Employer of',1,NULL,NULL),(436,218,5,'b_a',178,'Employer of',186,'Employee of',1,NULL,NULL);
+INSERT INTO `civicrm_relationship_cache` (`id`, `relationship_id`, `relationship_type_id`, `orientation`, `near_contact_id`, `near_relation`, `far_contact_id`, `far_relation`, `is_active`, `start_date`, `end_date`) VALUES (1,1,1,'a_b',148,'Child of',105,'Parent of',1,NULL,NULL),(2,1,1,'b_a',105,'Parent of',148,'Child of',1,NULL,NULL),(3,2,1,'a_b',161,'Child of',105,'Parent of',1,NULL,NULL),(4,2,1,'b_a',105,'Parent of',161,'Child of',1,NULL,NULL),(5,3,1,'a_b',148,'Child of',2,'Parent of',1,NULL,NULL),(6,3,1,'b_a',2,'Parent of',148,'Child of',1,NULL,NULL),(7,4,1,'a_b',161,'Child of',2,'Parent of',1,NULL,NULL),(8,4,1,'b_a',2,'Parent of',161,'Child of',1,NULL,NULL),(9,5,4,'a_b',161,'Sibling of',148,'Sibling of',1,NULL,NULL),(10,5,4,'b_a',148,'Sibling of',161,'Sibling of',1,NULL,NULL),(11,6,8,'a_b',2,'Household Member of',181,'Household Member is',1,NULL,NULL),(12,6,8,'b_a',181,'Household Member is',2,'Household Member of',1,NULL,NULL),(13,7,8,'a_b',148,'Household Member of',181,'Household Member is',1,NULL,NULL),(14,7,8,'b_a',181,'Household Member is',148,'Household Member of',1,NULL,NULL),(15,8,8,'a_b',161,'Household Member of',181,'Household Member is',1,NULL,NULL),(16,8,8,'b_a',181,'Household Member is',161,'Household Member of',1,NULL,NULL),(17,9,7,'a_b',105,'Head of Household for',181,'Head of Household is',0,NULL,NULL),(18,9,7,'b_a',181,'Head of Household is',105,'Head of Household for',0,NULL,NULL),(19,10,2,'a_b',2,'Spouse of',105,'Spouse of',0,NULL,NULL),(20,10,2,'b_a',105,'Spouse of',2,'Spouse of',0,NULL,NULL),(21,11,1,'a_b',121,'Child of',132,'Parent of',1,NULL,NULL),(22,11,1,'b_a',132,'Parent of',121,'Child of',1,NULL,NULL),(23,12,1,'a_b',37,'Child of',132,'Parent of',1,NULL,NULL),(24,12,1,'b_a',132,'Parent of',37,'Child of',1,NULL,NULL),(25,13,1,'a_b',121,'Child of',145,'Parent of',1,NULL,NULL),(26,13,1,'b_a',145,'Parent of',121,'Child of',1,NULL,NULL),(27,14,1,'a_b',37,'Child of',145,'Parent of',1,NULL,NULL),(28,14,1,'b_a',145,'Parent of',37,'Child of',1,NULL,NULL),(29,15,4,'a_b',37,'Sibling of',121,'Sibling of',1,NULL,NULL),(30,15,4,'b_a',121,'Sibling of',37,'Sibling of',1,NULL,NULL),(31,16,8,'a_b',145,'Household Member of',46,'Household Member is',1,NULL,NULL),(32,16,8,'b_a',46,'Household Member is',145,'Household Member of',1,NULL,NULL),(33,17,8,'a_b',121,'Household Member of',46,'Household Member is',1,NULL,NULL),(34,17,8,'b_a',46,'Household Member is',121,'Household Member of',1,NULL,NULL),(35,18,8,'a_b',37,'Household Member of',46,'Household Member is',1,NULL,NULL),(36,18,8,'b_a',46,'Household Member is',37,'Household Member of',1,NULL,NULL),(37,19,7,'a_b',132,'Head of Household for',46,'Head of Household is',1,NULL,NULL),(38,19,7,'b_a',46,'Head of Household is',132,'Head of Household for',1,NULL,NULL),(39,20,2,'a_b',145,'Spouse of',132,'Spouse of',1,NULL,NULL),(40,20,2,'b_a',132,'Spouse of',145,'Spouse of',1,NULL,NULL),(41,21,1,'a_b',190,'Child of',49,'Parent of',1,NULL,NULL),(42,21,1,'b_a',49,'Parent of',190,'Child of',1,NULL,NULL),(43,22,1,'a_b',77,'Child of',49,'Parent of',1,NULL,NULL),(44,22,1,'b_a',49,'Parent of',77,'Child of',1,NULL,NULL),(45,23,1,'a_b',190,'Child of',154,'Parent of',1,NULL,NULL),(46,23,1,'b_a',154,'Parent of',190,'Child of',1,NULL,NULL),(47,24,1,'a_b',77,'Child of',154,'Parent of',1,NULL,NULL),(48,24,1,'b_a',154,'Parent of',77,'Child of',1,NULL,NULL),(49,25,4,'a_b',77,'Sibling of',190,'Sibling of',1,NULL,NULL),(50,25,4,'b_a',190,'Sibling of',77,'Sibling of',1,NULL,NULL),(51,26,8,'a_b',154,'Household Member of',177,'Household Member is',1,NULL,NULL),(52,26,8,'b_a',177,'Household Member is',154,'Household Member of',1,NULL,NULL),(53,27,8,'a_b',190,'Household Member of',177,'Household Member is',1,NULL,NULL),(54,27,8,'b_a',177,'Household Member is',190,'Household Member of',1,NULL,NULL),(55,28,8,'a_b',77,'Household Member of',177,'Household Member is',1,NULL,NULL),(56,28,8,'b_a',177,'Household Member is',77,'Household Member of',1,NULL,NULL),(57,29,7,'a_b',49,'Head of Household for',177,'Head of Household is',0,NULL,NULL),(58,29,7,'b_a',177,'Head of Household is',49,'Head of Household for',0,NULL,NULL),(59,30,2,'a_b',154,'Spouse of',49,'Spouse of',0,NULL,NULL),(60,30,2,'b_a',49,'Spouse of',154,'Spouse of',0,NULL,NULL),(61,31,1,'a_b',29,'Child of',198,'Parent of',1,NULL,NULL),(62,31,1,'b_a',198,'Parent of',29,'Child of',1,NULL,NULL),(63,32,1,'a_b',63,'Child of',198,'Parent of',1,NULL,NULL),(64,32,1,'b_a',198,'Parent of',63,'Child of',1,NULL,NULL),(65,33,1,'a_b',29,'Child of',79,'Parent of',1,NULL,NULL),(66,33,1,'b_a',79,'Parent of',29,'Child of',1,NULL,NULL),(67,34,1,'a_b',63,'Child of',79,'Parent of',1,NULL,NULL),(68,34,1,'b_a',79,'Parent of',63,'Child of',1,NULL,NULL),(69,35,4,'a_b',63,'Sibling of',29,'Sibling of',1,NULL,NULL),(70,35,4,'b_a',29,'Sibling of',63,'Sibling of',1,NULL,NULL),(71,36,8,'a_b',79,'Household Member of',107,'Household Member is',1,NULL,NULL),(72,36,8,'b_a',107,'Household Member is',79,'Household Member of',1,NULL,NULL),(73,37,8,'a_b',29,'Household Member of',107,'Household Member is',1,NULL,NULL),(74,37,8,'b_a',107,'Household Member is',29,'Household Member of',1,NULL,NULL),(75,38,8,'a_b',63,'Household Member of',107,'Household Member is',1,NULL,NULL),(76,38,8,'b_a',107,'Household Member is',63,'Household Member of',1,NULL,NULL),(77,39,7,'a_b',198,'Head of Household for',107,'Head of Household is',1,NULL,NULL),(78,39,7,'b_a',107,'Head of Household is',198,'Head of Household for',1,NULL,NULL),(79,40,2,'a_b',79,'Spouse of',198,'Spouse of',1,NULL,NULL),(80,40,2,'b_a',198,'Spouse of',79,'Spouse of',1,NULL,NULL),(81,41,1,'a_b',86,'Child of',127,'Parent of',1,NULL,NULL),(82,41,1,'b_a',127,'Parent of',86,'Child of',1,NULL,NULL),(83,42,1,'a_b',96,'Child of',127,'Parent of',1,NULL,NULL),(84,42,1,'b_a',127,'Parent of',96,'Child of',1,NULL,NULL),(85,43,1,'a_b',86,'Child of',92,'Parent of',1,NULL,NULL),(86,43,1,'b_a',92,'Parent of',86,'Child of',1,NULL,NULL),(87,44,1,'a_b',96,'Child of',92,'Parent of',1,NULL,NULL),(88,44,1,'b_a',92,'Parent of',96,'Child of',1,NULL,NULL),(89,45,4,'a_b',96,'Sibling of',86,'Sibling of',1,NULL,NULL),(90,45,4,'b_a',86,'Sibling of',96,'Sibling of',1,NULL,NULL),(91,46,8,'a_b',92,'Household Member of',191,'Household Member is',1,NULL,NULL),(92,46,8,'b_a',191,'Household Member is',92,'Household Member of',1,NULL,NULL),(93,47,8,'a_b',86,'Household Member of',191,'Household Member is',1,NULL,NULL),(94,47,8,'b_a',191,'Household Member is',86,'Household Member of',1,NULL,NULL),(95,48,8,'a_b',96,'Household Member of',191,'Household Member is',1,NULL,NULL),(96,48,8,'b_a',191,'Household Member is',96,'Household Member of',1,NULL,NULL),(97,49,7,'a_b',127,'Head of Household for',191,'Head of Household is',0,NULL,NULL),(98,49,7,'b_a',191,'Head of Household is',127,'Head of Household for',0,NULL,NULL),(99,50,2,'a_b',92,'Spouse of',127,'Spouse of',0,NULL,NULL),(100,50,2,'b_a',127,'Spouse of',92,'Spouse of',0,NULL,NULL),(101,51,1,'a_b',116,'Child of',201,'Parent of',1,NULL,NULL),(102,51,1,'b_a',201,'Parent of',116,'Child of',1,NULL,NULL),(103,52,1,'a_b',43,'Child of',201,'Parent of',1,NULL,NULL),(104,52,1,'b_a',201,'Parent of',43,'Child of',1,NULL,NULL),(105,53,1,'a_b',116,'Child of',150,'Parent of',1,NULL,NULL),(106,53,1,'b_a',150,'Parent of',116,'Child of',1,NULL,NULL),(107,54,1,'a_b',43,'Child of',150,'Parent of',1,NULL,NULL),(108,54,1,'b_a',150,'Parent of',43,'Child of',1,NULL,NULL),(109,55,4,'a_b',43,'Sibling of',116,'Sibling of',1,NULL,NULL),(110,55,4,'b_a',116,'Sibling of',43,'Sibling of',1,NULL,NULL),(111,56,8,'a_b',150,'Household Member of',168,'Household Member is',1,NULL,NULL),(112,56,8,'b_a',168,'Household Member is',150,'Household Member of',1,NULL,NULL),(113,57,8,'a_b',116,'Household Member of',168,'Household Member is',1,NULL,NULL),(114,57,8,'b_a',168,'Household Member is',116,'Household Member of',1,NULL,NULL),(115,58,8,'a_b',43,'Household Member of',168,'Household Member is',1,NULL,NULL),(116,58,8,'b_a',168,'Household Member is',43,'Household Member of',1,NULL,NULL),(117,59,7,'a_b',201,'Head of Household for',168,'Head of Household is',1,NULL,NULL),(118,59,7,'b_a',168,'Head of Household is',201,'Head of Household for',1,NULL,NULL),(119,60,2,'a_b',150,'Spouse of',201,'Spouse of',1,NULL,NULL),(120,60,2,'b_a',201,'Spouse of',150,'Spouse of',1,NULL,NULL),(121,61,1,'a_b',155,'Child of',55,'Parent of',1,NULL,NULL),(122,61,1,'b_a',55,'Parent of',155,'Child of',1,NULL,NULL),(123,62,1,'a_b',112,'Child of',55,'Parent of',1,NULL,NULL),(124,62,1,'b_a',55,'Parent of',112,'Child of',1,NULL,NULL),(125,63,1,'a_b',155,'Child of',7,'Parent of',1,NULL,NULL),(126,63,1,'b_a',7,'Parent of',155,'Child of',1,NULL,NULL),(127,64,1,'a_b',112,'Child of',7,'Parent of',1,NULL,NULL),(128,64,1,'b_a',7,'Parent of',112,'Child of',1,NULL,NULL),(129,65,4,'a_b',112,'Sibling of',155,'Sibling of',1,NULL,NULL),(130,65,4,'b_a',155,'Sibling of',112,'Sibling of',1,NULL,NULL),(131,66,8,'a_b',7,'Household Member of',88,'Household Member is',1,NULL,NULL),(132,66,8,'b_a',88,'Household Member is',7,'Household Member of',1,NULL,NULL),(133,67,8,'a_b',155,'Household Member of',88,'Household Member is',1,NULL,NULL),(134,67,8,'b_a',88,'Household Member is',155,'Household Member of',1,NULL,NULL),(135,68,8,'a_b',112,'Household Member of',88,'Household Member is',1,NULL,NULL),(136,68,8,'b_a',88,'Household Member is',112,'Household Member of',1,NULL,NULL),(137,69,7,'a_b',55,'Head of Household for',88,'Head of Household is',0,NULL,NULL),(138,69,7,'b_a',88,'Head of Household is',55,'Head of Household for',0,NULL,NULL),(139,70,2,'a_b',7,'Spouse of',55,'Spouse of',0,NULL,NULL),(140,70,2,'b_a',55,'Spouse of',7,'Spouse of',0,NULL,NULL),(141,71,1,'a_b',65,'Child of',48,'Parent of',1,NULL,NULL),(142,71,1,'b_a',48,'Parent of',65,'Child of',1,NULL,NULL),(143,72,1,'a_b',128,'Child of',48,'Parent of',1,NULL,NULL),(144,72,1,'b_a',48,'Parent of',128,'Child of',1,NULL,NULL),(145,73,1,'a_b',65,'Child of',75,'Parent of',1,NULL,NULL),(146,73,1,'b_a',75,'Parent of',65,'Child of',1,NULL,NULL),(147,74,1,'a_b',128,'Child of',75,'Parent of',1,NULL,NULL),(148,74,1,'b_a',75,'Parent of',128,'Child of',1,NULL,NULL),(149,75,4,'a_b',128,'Sibling of',65,'Sibling of',1,NULL,NULL),(150,75,4,'b_a',65,'Sibling of',128,'Sibling of',1,NULL,NULL),(151,76,8,'a_b',75,'Household Member of',129,'Household Member is',1,NULL,NULL),(152,76,8,'b_a',129,'Household Member is',75,'Household Member of',1,NULL,NULL),(153,77,8,'a_b',65,'Household Member of',129,'Household Member is',1,NULL,NULL),(154,77,8,'b_a',129,'Household Member is',65,'Household Member of',1,NULL,NULL),(155,78,8,'a_b',128,'Household Member of',129,'Household Member is',1,NULL,NULL),(156,78,8,'b_a',129,'Household Member is',128,'Household Member of',1,NULL,NULL),(157,79,7,'a_b',48,'Head of Household for',129,'Head of Household is',1,NULL,NULL),(158,79,7,'b_a',129,'Head of Household is',48,'Head of Household for',1,NULL,NULL),(159,80,2,'a_b',75,'Spouse of',48,'Spouse of',1,NULL,NULL),(160,80,2,'b_a',48,'Spouse of',75,'Spouse of',1,NULL,NULL),(161,81,1,'a_b',41,'Child of',118,'Parent of',1,NULL,NULL),(162,81,1,'b_a',118,'Parent of',41,'Child of',1,NULL,NULL),(163,82,1,'a_b',36,'Child of',118,'Parent of',1,NULL,NULL),(164,82,1,'b_a',118,'Parent of',36,'Child of',1,NULL,NULL),(165,83,1,'a_b',41,'Child of',115,'Parent of',1,NULL,NULL),(166,83,1,'b_a',115,'Parent of',41,'Child of',1,NULL,NULL),(167,84,1,'a_b',36,'Child of',115,'Parent of',1,NULL,NULL),(168,84,1,'b_a',115,'Parent of',36,'Child of',1,NULL,NULL),(169,85,4,'a_b',36,'Sibling of',41,'Sibling of',1,NULL,NULL),(170,85,4,'b_a',41,'Sibling of',36,'Sibling of',1,NULL,NULL),(171,86,8,'a_b',115,'Household Member of',83,'Household Member is',1,NULL,NULL),(172,86,8,'b_a',83,'Household Member is',115,'Household Member of',1,NULL,NULL),(173,87,8,'a_b',41,'Household Member of',83,'Household Member is',1,NULL,NULL),(174,87,8,'b_a',83,'Household Member is',41,'Household Member of',1,NULL,NULL),(175,88,8,'a_b',36,'Household Member of',83,'Household Member is',1,NULL,NULL),(176,88,8,'b_a',83,'Household Member is',36,'Household Member of',1,NULL,NULL),(177,89,7,'a_b',118,'Head of Household for',83,'Head of Household is',1,NULL,NULL),(178,89,7,'b_a',83,'Head of Household is',118,'Head of Household for',1,NULL,NULL),(179,90,2,'a_b',115,'Spouse of',118,'Spouse of',1,NULL,NULL),(180,90,2,'b_a',118,'Spouse of',115,'Spouse of',1,NULL,NULL),(181,91,1,'a_b',68,'Child of',93,'Parent of',1,NULL,NULL),(182,91,1,'b_a',93,'Parent of',68,'Child of',1,NULL,NULL),(183,92,1,'a_b',157,'Child of',93,'Parent of',1,NULL,NULL),(184,92,1,'b_a',93,'Parent of',157,'Child of',1,NULL,NULL),(185,93,1,'a_b',68,'Child of',11,'Parent of',1,NULL,NULL),(186,93,1,'b_a',11,'Parent of',68,'Child of',1,NULL,NULL),(187,94,1,'a_b',157,'Child of',11,'Parent of',1,NULL,NULL),(188,94,1,'b_a',11,'Parent of',157,'Child of',1,NULL,NULL),(189,95,4,'a_b',157,'Sibling of',68,'Sibling of',1,NULL,NULL),(190,95,4,'b_a',68,'Sibling of',157,'Sibling of',1,NULL,NULL),(191,96,8,'a_b',11,'Household Member of',52,'Household Member is',1,NULL,NULL),(192,96,8,'b_a',52,'Household Member is',11,'Household Member of',1,NULL,NULL),(193,97,8,'a_b',68,'Household Member of',52,'Household Member is',1,NULL,NULL),(194,97,8,'b_a',52,'Household Member is',68,'Household Member of',1,NULL,NULL),(195,98,8,'a_b',157,'Household Member of',52,'Household Member is',1,NULL,NULL),(196,98,8,'b_a',52,'Household Member is',157,'Household Member of',1,NULL,NULL),(197,99,7,'a_b',93,'Head of Household for',52,'Head of Household is',1,NULL,NULL),(198,99,7,'b_a',52,'Head of Household is',93,'Head of Household for',1,NULL,NULL),(199,100,2,'a_b',11,'Spouse of',93,'Spouse of',1,NULL,NULL),(200,100,2,'b_a',93,'Spouse of',11,'Spouse of',1,NULL,NULL),(201,101,1,'a_b',126,'Child of',167,'Parent of',1,NULL,NULL),(202,101,1,'b_a',167,'Parent of',126,'Child of',1,NULL,NULL),(203,102,1,'a_b',53,'Child of',167,'Parent of',1,NULL,NULL),(204,102,1,'b_a',167,'Parent of',53,'Child of',1,NULL,NULL),(205,103,1,'a_b',126,'Child of',114,'Parent of',1,NULL,NULL),(206,103,1,'b_a',114,'Parent of',126,'Child of',1,NULL,NULL),(207,104,1,'a_b',53,'Child of',114,'Parent of',1,NULL,NULL),(208,104,1,'b_a',114,'Parent of',53,'Child of',1,NULL,NULL),(209,105,4,'a_b',53,'Sibling of',126,'Sibling of',1,NULL,NULL),(210,105,4,'b_a',126,'Sibling of',53,'Sibling of',1,NULL,NULL),(211,106,8,'a_b',114,'Household Member of',160,'Household Member is',1,NULL,NULL),(212,106,8,'b_a',160,'Household Member is',114,'Household Member of',1,NULL,NULL),(213,107,8,'a_b',126,'Household Member of',160,'Household Member is',1,NULL,NULL),(214,107,8,'b_a',160,'Household Member is',126,'Household Member of',1,NULL,NULL),(215,108,8,'a_b',53,'Household Member of',160,'Household Member is',1,NULL,NULL),(216,108,8,'b_a',160,'Household Member is',53,'Household Member of',1,NULL,NULL),(217,109,7,'a_b',167,'Head of Household for',160,'Head of Household is',1,NULL,NULL),(218,109,7,'b_a',160,'Head of Household is',167,'Head of Household for',1,NULL,NULL),(219,110,2,'a_b',114,'Spouse of',167,'Spouse of',1,NULL,NULL),(220,110,2,'b_a',167,'Spouse of',114,'Spouse of',1,NULL,NULL),(221,111,1,'a_b',110,'Child of',13,'Parent of',1,NULL,NULL),(222,111,1,'b_a',13,'Parent of',110,'Child of',1,NULL,NULL),(223,112,1,'a_b',54,'Child of',13,'Parent of',1,NULL,NULL),(224,112,1,'b_a',13,'Parent of',54,'Child of',1,NULL,NULL),(225,113,1,'a_b',110,'Child of',174,'Parent of',1,NULL,NULL),(226,113,1,'b_a',174,'Parent of',110,'Child of',1,NULL,NULL),(227,114,1,'a_b',54,'Child of',174,'Parent of',1,NULL,NULL),(228,114,1,'b_a',174,'Parent of',54,'Child of',1,NULL,NULL),(229,115,4,'a_b',54,'Sibling of',110,'Sibling of',1,NULL,NULL),(230,115,4,'b_a',110,'Sibling of',54,'Sibling of',1,NULL,NULL),(231,116,8,'a_b',174,'Household Member of',170,'Household Member is',1,NULL,NULL),(232,116,8,'b_a',170,'Household Member is',174,'Household Member of',1,NULL,NULL),(233,117,8,'a_b',110,'Household Member of',170,'Household Member is',1,NULL,NULL),(234,117,8,'b_a',170,'Household Member is',110,'Household Member of',1,NULL,NULL),(235,118,8,'a_b',54,'Household Member of',170,'Household Member is',1,NULL,NULL),(236,118,8,'b_a',170,'Household Member is',54,'Household Member of',1,NULL,NULL),(237,119,7,'a_b',13,'Head of Household for',170,'Head of Household is',0,NULL,NULL),(238,119,7,'b_a',170,'Head of Household is',13,'Head of Household for',0,NULL,NULL),(239,120,2,'a_b',174,'Spouse of',13,'Spouse of',0,NULL,NULL),(240,120,2,'b_a',13,'Spouse of',174,'Spouse of',0,NULL,NULL),(241,121,1,'a_b',186,'Child of',119,'Parent of',1,NULL,NULL),(242,121,1,'b_a',119,'Parent of',186,'Child of',1,NULL,NULL),(243,122,1,'a_b',103,'Child of',119,'Parent of',1,NULL,NULL),(244,122,1,'b_a',119,'Parent of',103,'Child of',1,NULL,NULL),(245,123,1,'a_b',186,'Child of',42,'Parent of',1,NULL,NULL),(246,123,1,'b_a',42,'Parent of',186,'Child of',1,NULL,NULL),(247,124,1,'a_b',103,'Child of',42,'Parent of',1,NULL,NULL),(248,124,1,'b_a',42,'Parent of',103,'Child of',1,NULL,NULL),(249,125,4,'a_b',103,'Sibling of',186,'Sibling of',1,NULL,NULL),(250,125,4,'b_a',186,'Sibling of',103,'Sibling of',1,NULL,NULL),(251,126,8,'a_b',42,'Household Member of',5,'Household Member is',1,NULL,NULL),(252,126,8,'b_a',5,'Household Member is',42,'Household Member of',1,NULL,NULL),(253,127,8,'a_b',186,'Household Member of',5,'Household Member is',1,NULL,NULL),(254,127,8,'b_a',5,'Household Member is',186,'Household Member of',1,NULL,NULL),(255,128,8,'a_b',103,'Household Member of',5,'Household Member is',1,NULL,NULL),(256,128,8,'b_a',5,'Household Member is',103,'Household Member of',1,NULL,NULL),(257,129,7,'a_b',119,'Head of Household for',5,'Head of Household is',1,NULL,NULL),(258,129,7,'b_a',5,'Head of Household is',119,'Head of Household for',1,NULL,NULL),(259,130,2,'a_b',42,'Spouse of',119,'Spouse of',1,NULL,NULL),(260,130,2,'b_a',119,'Spouse of',42,'Spouse of',1,NULL,NULL),(261,131,1,'a_b',156,'Child of',172,'Parent of',1,NULL,NULL),(262,131,1,'b_a',172,'Parent of',156,'Child of',1,NULL,NULL),(263,132,1,'a_b',165,'Child of',172,'Parent of',1,NULL,NULL),(264,132,1,'b_a',172,'Parent of',165,'Child of',1,NULL,NULL),(265,133,1,'a_b',156,'Child of',15,'Parent of',1,NULL,NULL),(266,133,1,'b_a',15,'Parent of',156,'Child of',1,NULL,NULL),(267,134,1,'a_b',165,'Child of',15,'Parent of',1,NULL,NULL),(268,134,1,'b_a',15,'Parent of',165,'Child of',1,NULL,NULL),(269,135,4,'a_b',165,'Sibling of',156,'Sibling of',1,NULL,NULL),(270,135,4,'b_a',156,'Sibling of',165,'Sibling of',1,NULL,NULL),(271,136,8,'a_b',15,'Household Member of',51,'Household Member is',1,NULL,NULL),(272,136,8,'b_a',51,'Household Member is',15,'Household Member of',1,NULL,NULL),(273,137,8,'a_b',156,'Household Member of',51,'Household Member is',1,NULL,NULL),(274,137,8,'b_a',51,'Household Member is',156,'Household Member of',1,NULL,NULL),(275,138,8,'a_b',165,'Household Member of',51,'Household Member is',1,NULL,NULL),(276,138,8,'b_a',51,'Household Member is',165,'Household Member of',1,NULL,NULL),(277,139,7,'a_b',172,'Head of Household for',51,'Head of Household is',1,NULL,NULL),(278,139,7,'b_a',51,'Head of Household is',172,'Head of Household for',1,NULL,NULL),(279,140,2,'a_b',15,'Spouse of',172,'Spouse of',1,NULL,NULL),(280,140,2,'b_a',172,'Spouse of',15,'Spouse of',1,NULL,NULL),(281,141,1,'a_b',194,'Child of',24,'Parent of',1,NULL,NULL),(282,141,1,'b_a',24,'Parent of',194,'Child of',1,NULL,NULL),(283,142,1,'a_b',149,'Child of',24,'Parent of',1,NULL,NULL),(284,142,1,'b_a',24,'Parent of',149,'Child of',1,NULL,NULL),(285,143,1,'a_b',194,'Child of',89,'Parent of',1,NULL,NULL),(286,143,1,'b_a',89,'Parent of',194,'Child of',1,NULL,NULL),(287,144,1,'a_b',149,'Child of',89,'Parent of',1,NULL,NULL),(288,144,1,'b_a',89,'Parent of',149,'Child of',1,NULL,NULL),(289,145,4,'a_b',149,'Sibling of',194,'Sibling of',1,NULL,NULL),(290,145,4,'b_a',194,'Sibling of',149,'Sibling of',1,NULL,NULL),(291,146,8,'a_b',89,'Household Member of',139,'Household Member is',1,NULL,NULL),(292,146,8,'b_a',139,'Household Member is',89,'Household Member of',1,NULL,NULL),(293,147,8,'a_b',194,'Household Member of',139,'Household Member is',1,NULL,NULL),(294,147,8,'b_a',139,'Household Member is',194,'Household Member of',1,NULL,NULL),(295,148,8,'a_b',149,'Household Member of',139,'Household Member is',1,NULL,NULL),(296,148,8,'b_a',139,'Household Member is',149,'Household Member of',1,NULL,NULL),(297,149,7,'a_b',24,'Head of Household for',139,'Head of Household is',1,NULL,NULL),(298,149,7,'b_a',139,'Head of Household is',24,'Head of Household for',1,NULL,NULL),(299,150,2,'a_b',89,'Spouse of',24,'Spouse of',1,NULL,NULL),(300,150,2,'b_a',24,'Spouse of',89,'Spouse of',1,NULL,NULL),(301,151,1,'a_b',10,'Child of',71,'Parent of',1,NULL,NULL),(302,151,1,'b_a',71,'Parent of',10,'Child of',1,NULL,NULL),(303,152,1,'a_b',178,'Child of',71,'Parent of',1,NULL,NULL),(304,152,1,'b_a',71,'Parent of',178,'Child of',1,NULL,NULL),(305,153,1,'a_b',10,'Child of',59,'Parent of',1,NULL,NULL),(306,153,1,'b_a',59,'Parent of',10,'Child of',1,NULL,NULL),(307,154,1,'a_b',178,'Child of',59,'Parent of',1,NULL,NULL),(308,154,1,'b_a',59,'Parent of',178,'Child of',1,NULL,NULL),(309,155,4,'a_b',178,'Sibling of',10,'Sibling of',1,NULL,NULL),(310,155,4,'b_a',10,'Sibling of',178,'Sibling of',1,NULL,NULL),(311,156,8,'a_b',59,'Household Member of',199,'Household Member is',1,NULL,NULL),(312,156,8,'b_a',199,'Household Member is',59,'Household Member of',1,NULL,NULL),(313,157,8,'a_b',10,'Household Member of',199,'Household Member is',1,NULL,NULL),(314,157,8,'b_a',199,'Household Member is',10,'Household Member of',1,NULL,NULL),(315,158,8,'a_b',178,'Household Member of',199,'Household Member is',1,NULL,NULL),(316,158,8,'b_a',199,'Household Member is',178,'Household Member of',1,NULL,NULL),(317,159,7,'a_b',71,'Head of Household for',199,'Head of Household is',0,NULL,NULL),(318,159,7,'b_a',199,'Head of Household is',71,'Head of Household for',0,NULL,NULL),(319,160,2,'a_b',59,'Spouse of',71,'Spouse of',0,NULL,NULL),(320,160,2,'b_a',71,'Spouse of',59,'Spouse of',0,NULL,NULL),(321,161,1,'a_b',82,'Child of',50,'Parent of',1,NULL,NULL),(322,161,1,'b_a',50,'Parent of',82,'Child of',1,NULL,NULL),(323,162,1,'a_b',81,'Child of',50,'Parent of',1,NULL,NULL),(324,162,1,'b_a',50,'Parent of',81,'Child of',1,NULL,NULL),(325,163,1,'a_b',82,'Child of',124,'Parent of',1,NULL,NULL),(326,163,1,'b_a',124,'Parent of',82,'Child of',1,NULL,NULL),(327,164,1,'a_b',81,'Child of',124,'Parent of',1,NULL,NULL),(328,164,1,'b_a',124,'Parent of',81,'Child of',1,NULL,NULL),(329,165,4,'a_b',81,'Sibling of',82,'Sibling of',1,NULL,NULL),(330,165,4,'b_a',82,'Sibling of',81,'Sibling of',1,NULL,NULL),(331,166,8,'a_b',124,'Household Member of',8,'Household Member is',1,NULL,NULL),(332,166,8,'b_a',8,'Household Member is',124,'Household Member of',1,NULL,NULL),(333,167,8,'a_b',82,'Household Member of',8,'Household Member is',1,NULL,NULL),(334,167,8,'b_a',8,'Household Member is',82,'Household Member of',1,NULL,NULL),(335,168,8,'a_b',81,'Household Member of',8,'Household Member is',1,NULL,NULL),(336,168,8,'b_a',8,'Household Member is',81,'Household Member of',1,NULL,NULL),(337,169,7,'a_b',50,'Head of Household for',8,'Head of Household is',1,NULL,NULL),(338,169,7,'b_a',8,'Head of Household is',50,'Head of Household for',1,NULL,NULL),(339,170,2,'a_b',124,'Spouse of',50,'Spouse of',1,NULL,NULL),(340,170,2,'b_a',50,'Spouse of',124,'Spouse of',1,NULL,NULL),(341,171,1,'a_b',6,'Child of',144,'Parent of',1,NULL,NULL),(342,171,1,'b_a',144,'Parent of',6,'Child of',1,NULL,NULL),(343,172,1,'a_b',146,'Child of',144,'Parent of',1,NULL,NULL),(344,172,1,'b_a',144,'Parent of',146,'Child of',1,NULL,NULL),(345,173,1,'a_b',6,'Child of',123,'Parent of',1,NULL,NULL),(346,173,1,'b_a',123,'Parent of',6,'Child of',1,NULL,NULL),(347,174,1,'a_b',146,'Child of',123,'Parent of',1,NULL,NULL),(348,174,1,'b_a',123,'Parent of',146,'Child of',1,NULL,NULL),(349,175,4,'a_b',146,'Sibling of',6,'Sibling of',1,NULL,NULL),(350,175,4,'b_a',6,'Sibling of',146,'Sibling of',1,NULL,NULL),(351,176,8,'a_b',123,'Household Member of',72,'Household Member is',1,NULL,NULL),(352,176,8,'b_a',72,'Household Member is',123,'Household Member of',1,NULL,NULL),(353,177,8,'a_b',6,'Household Member of',72,'Household Member is',1,NULL,NULL),(354,177,8,'b_a',72,'Household Member is',6,'Household Member of',1,NULL,NULL),(355,178,8,'a_b',146,'Household Member of',72,'Household Member is',1,NULL,NULL),(356,178,8,'b_a',72,'Household Member is',146,'Household Member of',1,NULL,NULL),(357,179,7,'a_b',144,'Head of Household for',72,'Head of Household is',1,NULL,NULL),(358,179,7,'b_a',72,'Head of Household is',144,'Head of Household for',1,NULL,NULL),(359,180,2,'a_b',123,'Spouse of',144,'Spouse of',1,NULL,NULL),(360,180,2,'b_a',144,'Spouse of',123,'Spouse of',1,NULL,NULL),(361,181,1,'a_b',12,'Child of',9,'Parent of',1,NULL,NULL),(362,181,1,'b_a',9,'Parent of',12,'Child of',1,NULL,NULL),(363,182,1,'a_b',35,'Child of',9,'Parent of',1,NULL,NULL),(364,182,1,'b_a',9,'Parent of',35,'Child of',1,NULL,NULL),(365,183,1,'a_b',12,'Child of',138,'Parent of',1,NULL,NULL),(366,183,1,'b_a',138,'Parent of',12,'Child of',1,NULL,NULL),(367,184,1,'a_b',35,'Child of',138,'Parent of',1,NULL,NULL),(368,184,1,'b_a',138,'Parent of',35,'Child of',1,NULL,NULL),(369,185,4,'a_b',35,'Sibling of',12,'Sibling of',1,NULL,NULL),(370,185,4,'b_a',12,'Sibling of',35,'Sibling of',1,NULL,NULL),(371,186,8,'a_b',138,'Household Member of',136,'Household Member is',1,NULL,NULL),(372,186,8,'b_a',136,'Household Member is',138,'Household Member of',1,NULL,NULL),(373,187,8,'a_b',12,'Household Member of',136,'Household Member is',1,NULL,NULL),(374,187,8,'b_a',136,'Household Member is',12,'Household Member of',1,NULL,NULL),(375,188,8,'a_b',35,'Household Member of',136,'Household Member is',1,NULL,NULL),(376,188,8,'b_a',136,'Household Member is',35,'Household Member of',1,NULL,NULL),(377,189,7,'a_b',9,'Head of Household for',136,'Head of Household is',1,NULL,NULL),(378,189,7,'b_a',136,'Head of Household is',9,'Head of Household for',1,NULL,NULL),(379,190,2,'a_b',138,'Spouse of',9,'Spouse of',1,NULL,NULL),(380,190,2,'b_a',9,'Spouse of',138,'Spouse of',1,NULL,NULL),(381,191,1,'a_b',62,'Child of',120,'Parent of',1,NULL,NULL),(382,191,1,'b_a',120,'Parent of',62,'Child of',1,NULL,NULL),(383,192,1,'a_b',45,'Child of',120,'Parent of',1,NULL,NULL),(384,192,1,'b_a',120,'Parent of',45,'Child of',1,NULL,NULL),(385,193,1,'a_b',62,'Child of',164,'Parent of',1,NULL,NULL),(386,193,1,'b_a',164,'Parent of',62,'Child of',1,NULL,NULL),(387,194,1,'a_b',45,'Child of',164,'Parent of',1,NULL,NULL),(388,194,1,'b_a',164,'Parent of',45,'Child of',1,NULL,NULL),(389,195,4,'a_b',45,'Sibling of',62,'Sibling of',1,NULL,NULL),(390,195,4,'b_a',62,'Sibling of',45,'Sibling of',1,NULL,NULL),(391,196,8,'a_b',164,'Household Member of',74,'Household Member is',1,NULL,NULL),(392,196,8,'b_a',74,'Household Member is',164,'Household Member of',1,NULL,NULL),(393,197,8,'a_b',62,'Household Member of',74,'Household Member is',1,NULL,NULL),(394,197,8,'b_a',74,'Household Member is',62,'Household Member of',1,NULL,NULL),(395,198,8,'a_b',45,'Household Member of',74,'Household Member is',1,NULL,NULL),(396,198,8,'b_a',74,'Household Member is',45,'Household Member of',1,NULL,NULL),(397,199,7,'a_b',120,'Head of Household for',74,'Head of Household is',0,NULL,NULL),(398,199,7,'b_a',74,'Head of Household is',120,'Head of Household for',0,NULL,NULL),(399,200,2,'a_b',164,'Spouse of',120,'Spouse of',0,NULL,NULL),(400,200,2,'b_a',120,'Spouse of',164,'Spouse of',0,NULL,NULL),(401,201,5,'a_b',192,'Employee of',3,'Employer of',1,NULL,NULL),(402,201,5,'b_a',3,'Employer of',192,'Employee of',1,NULL,NULL),(403,202,5,'a_b',118,'Employee of',4,'Employer of',1,NULL,NULL),(404,202,5,'b_a',4,'Employer of',118,'Employee of',1,NULL,NULL),(405,203,5,'a_b',45,'Employee of',38,'Employer of',1,NULL,NULL),(406,203,5,'b_a',38,'Employer of',45,'Employee of',1,NULL,NULL),(407,204,5,'a_b',42,'Employee of',39,'Employer of',1,NULL,NULL),(408,204,5,'b_a',39,'Employer of',42,'Employee of',1,NULL,NULL),(409,205,5,'a_b',13,'Employee of',61,'Employer of',1,NULL,NULL),(410,205,5,'b_a',61,'Employer of',13,'Employee of',1,NULL,NULL),(411,206,5,'a_b',174,'Employee of',69,'Employer of',1,NULL,NULL),(412,206,5,'b_a',69,'Employer of',174,'Employee of',1,NULL,NULL),(413,207,5,'a_b',172,'Employee of',78,'Employer of',1,NULL,NULL),(414,207,5,'b_a',78,'Employer of',172,'Employee of',1,NULL,NULL),(415,208,5,'a_b',159,'Employee of',80,'Employer of',1,NULL,NULL),(416,208,5,'b_a',80,'Employer of',159,'Employee of',1,NULL,NULL),(417,209,5,'a_b',106,'Employee of',100,'Employer of',1,NULL,NULL),(418,209,5,'b_a',100,'Employer of',106,'Employee of',1,NULL,NULL),(419,210,5,'a_b',113,'Employee of',104,'Employer of',1,NULL,NULL),(420,210,5,'b_a',104,'Employer of',113,'Employee of',1,NULL,NULL),(421,211,5,'a_b',148,'Employee of',122,'Employer of',1,NULL,NULL),(422,211,5,'b_a',122,'Employer of',148,'Employee of',1,NULL,NULL),(423,212,5,'a_b',32,'Employee of',142,'Employer of',1,NULL,NULL),(424,212,5,'b_a',142,'Employer of',32,'Employee of',1,NULL,NULL),(425,213,5,'a_b',110,'Employee of',152,'Employer of',1,NULL,NULL),(426,213,5,'b_a',152,'Employer of',110,'Employee of',1,NULL,NULL),(427,214,5,'a_b',178,'Employee of',162,'Employer of',1,NULL,NULL),(428,214,5,'b_a',162,'Employer of',178,'Employee of',1,NULL,NULL),(429,215,5,'a_b',154,'Employee of',179,'Employer of',1,NULL,NULL),(430,215,5,'b_a',179,'Employer of',154,'Employee of',1,NULL,NULL),(431,216,5,'a_b',119,'Employee of',189,'Employer of',1,NULL,NULL),(432,216,5,'b_a',189,'Employer of',119,'Employee of',1,NULL,NULL),(433,217,5,'a_b',71,'Employee of',196,'Employer of',1,NULL,NULL),(434,217,5,'b_a',196,'Employer of',71,'Employee of',1,NULL,NULL);
 /*!40000 ALTER TABLE `civicrm_relationship_cache` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1328,7 +1328,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_state_province` WRITE;
 /*!40000 ALTER TABLE `civicrm_state_province` DISABLE KEYS */;
-INSERT INTO `civicrm_state_province` (`id`, `name`, `abbreviation`, `country_id`) VALUES (1000,'Alabama','AL',1228),(1001,'Alaska','AK',1228),(1002,'Arizona','AZ',1228),(1003,'Arkansas','AR',1228),(1004,'California','CA',1228),(1005,'Colorado','CO',1228),(1006,'Connecticut','CT',1228),(1007,'Delaware','DE',1228),(1008,'Florida','FL',1228),(1009,'Georgia','GA',1228),(1010,'Hawaii','HI',1228),(1011,'Idaho','ID',1228),(1012,'Illinois','IL',1228),(1013,'Indiana','IN',1228),(1014,'Iowa','IA',1228),(1015,'Kansas','KS',1228),(1016,'Kentucky','KY',1228),(1017,'Louisiana','LA',1228),(1018,'Maine','ME',1228),(1019,'Maryland','MD',1228),(1020,'Massachusetts','MA',1228),(1021,'Michigan','MI',1228),(1022,'Minnesota','MN',1228),(1023,'Mississippi','MS',1228),(1024,'Missouri','MO',1228),(1025,'Montana','MT',1228),(1026,'Nebraska','NE',1228),(1027,'Nevada','NV',1228),(1028,'New Hampshire','NH',1228),(1029,'New Jersey','NJ',1228),(1030,'New Mexico','NM',1228),(1031,'New York','NY',1228),(1032,'North Carolina','NC',1228),(1033,'North Dakota','ND',1228),(1034,'Ohio','OH',1228),(1035,'Oklahoma','OK',1228),(1036,'Oregon','OR',1228),(1037,'Pennsylvania','PA',1228),(1038,'Rhode Island','RI',1228),(1039,'South Carolina','SC',1228),(1040,'South Dakota','SD',1228),(1041,'Tennessee','TN',1228),(1042,'Texas','TX',1228),(1043,'Utah','UT',1228),(1044,'Vermont','VT',1228),(1045,'Virginia','VA',1228),(1046,'Washington','WA',1228),(1047,'West Virginia','WV',1228),(1048,'Wisconsin','WI',1228),(1049,'Wyoming','WY',1228),(1050,'District of Columbia','DC',1228),(1052,'American Samoa','AS',1228),(1053,'Guam','GU',1228),(1055,'Northern Mariana Islands','MP',1228),(1056,'Puerto Rico','PR',1228),(1057,'Virgin Islands','VI',1228),(1058,'United States Minor Outlying Islands','UM',1228),(1059,'Armed Forces Europe','AE',1228),(1060,'Armed Forces Americas','AA',1228),(1061,'Armed Forces Pacific','AP',1228),(1100,'Alberta','AB',1039),(1101,'British Columbia','BC',1039),(1102,'Manitoba','MB',1039),(1103,'New Brunswick','NB',1039),(1104,'Newfoundland and Labrador','NL',1039),(1105,'Northwest Territories','NT',1039),(1106,'Nova Scotia','NS',1039),(1107,'Nunavut','NU',1039),(1108,'Ontario','ON',1039),(1109,'Prince Edward Island','PE',1039),(1110,'Quebec','QC',1039),(1111,'Saskatchewan','SK',1039),(1112,'Yukon Territory','YT',1039),(1200,'Maharashtra','MM',1101),(1201,'Karnataka','KA',1101),(1202,'Andhra Pradesh','AP',1101),(1203,'Arunachal Pradesh','AR',1101),(1204,'Assam','AS',1101),(1205,'Bihar','BR',1101),(1206,'Chhattisgarh','CH',1101),(1207,'Goa','GA',1101),(1208,'Gujarat','GJ',1101),(1209,'Haryana','HR',1101),(1210,'Himachal Pradesh','HP',1101),(1211,'Jammu and Kashmir','JK',1101),(1212,'Jharkhand','JH',1101),(1213,'Kerala','KL',1101),(1214,'Madhya Pradesh','MP',1101),(1215,'Manipur','MN',1101),(1216,'Meghalaya','ML',1101),(1217,'Mizoram','MZ',1101),(1218,'Nagaland','NL',1101),(1219,'Orissa','OR',1101),(1220,'Punjab','PB',1101),(1221,'Rajasthan','RJ',1101),(1222,'Sikkim','SK',1101),(1223,'Tamil Nadu','TN',1101),(1224,'Tripura','TR',1101),(1225,'Uttarakhand','UT',1101),(1226,'Uttar Pradesh','UP',1101),(1227,'West Bengal','WB',1101),(1228,'Andaman and Nicobar Islands','AN',1101),(1229,'Dadra and Nagar Haveli','DN',1101),(1230,'Daman and Diu','DD',1101),(1231,'Delhi','DL',1101),(1232,'Lakshadweep','LD',1101),(1233,'Pondicherry','PY',1101),(1300,'mazowieckie','MZ',1172),(1301,'pomorskie','PM',1172),(1302,'dolnośląskie','DS',1172),(1303,'kujawsko-pomorskie','KP',1172),(1304,'lubelskie','LU',1172),(1305,'lubuskie','LB',1172),(1306,'łódzkie','LD',1172),(1307,'małopolskie','MA',1172),(1308,'opolskie','OP',1172),(1309,'podkarpackie','PK',1172),(1310,'podlaskie','PD',1172),(1311,'śląskie','SL',1172),(1312,'świętokrzyskie','SK',1172),(1313,'warmińsko-mazurskie','WN',1172),(1314,'wielkopolskie','WP',1172),(1315,'zachodniopomorskie','ZP',1172),(1500,'Abu Zaby','AZ',1225),(1501,'\'Ajman','AJ',1225),(1502,'Al Fujayrah','FU',1225),(1503,'Ash Shariqah','SH',1225),(1504,'Dubayy','DU',1225),(1505,'Ra\'s al Khaymah','RK',1225),(1506,'Dac Lac','33',1233),(1507,'Umm al Qaywayn','UQ',1225),(1508,'Badakhshan','BDS',1001),(1509,'Badghis','BDG',1001),(1510,'Baghlan','BGL',1001),(1511,'Balkh','BAL',1001),(1512,'Bamian','BAM',1001),(1513,'Farah','FRA',1001),(1514,'Faryab','FYB',1001),(1515,'Ghazni','GHA',1001),(1516,'Ghowr','GHO',1001),(1517,'Helmand','HEL',1001),(1518,'Herat','HER',1001),(1519,'Jowzjan','JOW',1001),(1520,'Kabul','KAB',1001),(1521,'Kandahar','KAN',1001),(1522,'Kapisa','KAP',1001),(1523,'Khowst','KHO',1001),(1524,'Konar','KNR',1001),(1525,'Kondoz','KDZ',1001),(1526,'Laghman','LAG',1001),(1527,'Lowgar','LOW',1001),(1528,'Nangrahar','NAN',1001),(1529,'Nimruz','NIM',1001),(1530,'Nurestan','NUR',1001),(1531,'Oruzgan','ORU',1001),(1532,'Paktia','PIA',1001),(1533,'Paktika','PKA',1001),(1534,'Parwan','PAR',1001),(1535,'Samangan','SAM',1001),(1536,'Sar-e Pol','SAR',1001),(1537,'Takhar','TAK',1001),(1538,'Wardak','WAR',1001),(1539,'Zabol','ZAB',1001),(1540,'Berat','BR',1002),(1541,'Bulqizë','BU',1002),(1542,'Delvinë','DL',1002),(1543,'Devoll','DV',1002),(1544,'Dibër','DI',1002),(1545,'Durrës','DR',1002),(1546,'Elbasan','EL',1002),(1547,'Fier','FR',1002),(1548,'Gramsh','GR',1002),(1549,'Gjirokastër','GJ',1002),(1550,'Has','HA',1002),(1551,'Kavajë','KA',1002),(1552,'Kolonjë','ER',1002),(1553,'Korçë','KO',1002),(1554,'Krujë','KR',1002),(1555,'Kuçovë','KC',1002),(1556,'Kukës','KU',1002),(1557,'Kurbin','KB',1002),(1558,'Lezhë','LE',1002),(1559,'Librazhd','LB',1002),(1560,'Lushnjë','LU',1002),(1561,'Malësi e Madhe','MM',1002),(1562,'Mallakastër','MK',1002),(1563,'Mat','MT',1002),(1564,'Mirditë','MR',1002),(1565,'Peqin','PQ',1002),(1566,'Përmet','PR',1002),(1567,'Pogradec','PG',1002),(1568,'Pukë','PU',1002),(1569,'Sarandë','SR',1002),(1570,'Skrapar','SK',1002),(1571,'Shkodër','SH',1002),(1572,'Tepelenë','TE',1002),(1573,'Tiranë','TR',1002),(1574,'Tropojë','TP',1002),(1575,'Vlorë','VL',1002),(1576,'Erevan','ER',1011),(1577,'Aragacotn','AG',1011),(1578,'Ararat','AR',1011),(1579,'Armavir','AV',1011),(1580,'Gegarkunik\'','GR',1011),(1581,'Kotayk\'','KT',1011),(1582,'Lory','LO',1011),(1583,'Sirak','SH',1011),(1584,'Syunik\'','SU',1011),(1585,'Tavus','TV',1011),(1586,'Vayoc Jor','VD',1011),(1587,'Bengo','BGO',1006),(1588,'Benguela','BGU',1006),(1589,'Bie','BIE',1006),(1590,'Cabinda','CAB',1006),(1591,'Cuando-Cubango','CCU',1006),(1592,'Cuanza Norte','CNO',1006),(1593,'Cuanza Sul','CUS',1006),(1594,'Cunene','CNN',1006),(1595,'Huambo','HUA',1006),(1596,'Huila','HUI',1006),(1597,'Luanda','LUA',1006),(1598,'Lunda Norte','LNO',1006),(1599,'Lunda Sul','LSU',1006),(1600,'Malange','MAL',1006),(1601,'Moxico','MOX',1006),(1602,'Namibe','NAM',1006),(1603,'Uige','UIG',1006),(1604,'Zaire','ZAI',1006),(1605,'Capital federal','C',1010),(1606,'Buenos Aires','B',1010),(1607,'Catamarca','K',1010),(1608,'Cordoba','X',1010),(1609,'Corrientes','W',1010),(1610,'Chaco','H',1010),(1611,'Chubut','U',1010),(1612,'Entre Rios','E',1010),(1613,'Formosa','P',1010),(1614,'Jujuy','Y',1010),(1615,'La Pampa','L',1010),(1616,'Mendoza','M',1010),(1617,'Misiones','N',1010),(1618,'Neuquen','Q',1010),(1619,'Rio Negro','R',1010),(1620,'Salta','A',1010),(1621,'San Juan','J',1010),(1622,'San Luis','D',1010),(1623,'Santa Cruz','Z',1010),(1624,'Santa Fe','S',1010),(1625,'Santiago del Estero','G',1010),(1626,'Tierra del Fuego','V',1010),(1627,'Tucuman','T',1010),(1628,'Burgenland','1',1014),(1629,'Kärnten','2',1014),(1630,'Niederösterreich','3',1014),(1631,'Oberösterreich','4',1014),(1632,'Salzburg','5',1014),(1633,'Steiermark','6',1014),(1634,'Tirol','7',1014),(1635,'Vorarlberg','8',1014),(1636,'Wien','9',1014),(1637,'Australian Antarctic Territory','AAT',1008),(1638,'Australian Capital Territory','ACT',1013),(1639,'Northern Territory','NT',1013),(1640,'New South Wales','NSW',1013),(1641,'Queensland','QLD',1013),(1642,'South Australia','SA',1013),(1643,'Tasmania','TAS',1013),(1644,'Victoria','VIC',1013),(1645,'Western Australia','WA',1013),(1646,'Naxcivan','NX',1015),(1647,'Ali Bayramli','AB',1015),(1648,'Baki','BA',1015),(1649,'Ganca','GA',1015),(1650,'Lankaran','LA',1015),(1651,'Mingacevir','MI',1015),(1652,'Naftalan','NA',1015),(1653,'Saki','SA',1015),(1654,'Sumqayit','SM',1015),(1655,'Susa','SS',1015),(1656,'Xankandi','XA',1015),(1657,'Yevlax','YE',1015),(1658,'Abseron','ABS',1015),(1659,'Agcabadi','AGC',1015),(1660,'Agdam','AGM',1015),(1661,'Agdas','AGS',1015),(1662,'Agstafa','AGA',1015),(1663,'Agsu','AGU',1015),(1664,'Astara','AST',1015),(1665,'Babak','BAB',1015),(1666,'Balakan','BAL',1015),(1667,'Barda','BAR',1015),(1668,'Beylagan','BEY',1015),(1669,'Bilasuvar','BIL',1015),(1670,'Cabrayll','CAB',1015),(1671,'Calilabad','CAL',1015),(1672,'Culfa','CUL',1015),(1673,'Daskasan','DAS',1015),(1674,'Davaci','DAV',1015),(1675,'Fuzuli','FUZ',1015),(1676,'Gadabay','GAD',1015),(1677,'Goranboy','GOR',1015),(1678,'Goycay','GOY',1015),(1679,'Haciqabul','HAC',1015),(1680,'Imisli','IMI',1015),(1681,'Ismayilli','ISM',1015),(1682,'Kalbacar','KAL',1015),(1683,'Kurdamir','KUR',1015),(1684,'Lacin','LAC',1015),(1685,'Lerik','LER',1015),(1686,'Masalli','MAS',1015),(1687,'Neftcala','NEF',1015),(1688,'Oguz','OGU',1015),(1689,'Ordubad','ORD',1015),(1690,'Qabala','QAB',1015),(1691,'Qax','QAX',1015),(1692,'Qazax','QAZ',1015),(1693,'Qobustan','QOB',1015),(1694,'Quba','QBA',1015),(1695,'Qubadli','QBI',1015),(1696,'Qusar','QUS',1015),(1697,'Saatli','SAT',1015),(1698,'Sabirabad','SAB',1015),(1699,'Sadarak','SAD',1015),(1700,'Sahbuz','SAH',1015),(1701,'Salyan','SAL',1015),(1702,'Samaxi','SMI',1015),(1703,'Samkir','SKR',1015),(1704,'Samux','SMX',1015),(1705,'Sarur','SAR',1015),(1706,'Siyazan','SIY',1015),(1707,'Tartar','TAR',1015),(1708,'Tovuz','TOV',1015),(1709,'Ucar','UCA',1015),(1710,'Xacmaz','XAC',1015),(1711,'Xanlar','XAN',1015),(1712,'Xizi','XIZ',1015),(1713,'Xocali','XCI',1015),(1714,'Xocavand','XVD',1015),(1715,'Yardimli','YAR',1015),(1716,'Zangilan','ZAN',1015),(1717,'Zaqatala','ZAQ',1015),(1718,'Zardab','ZAR',1015),(1719,'Federacija Bosna i Hercegovina','BIH',1026),(1720,'Republika Srpska','SRP',1026),(1721,'Bagerhat zila','05',1017),(1722,'Bandarban zila','01',1017),(1723,'Barguna zila','02',1017),(1724,'Barisal zila','06',1017),(1725,'Bhola zila','07',1017),(1726,'Bogra zila','03',1017),(1727,'Brahmanbaria zila','04',1017),(1728,'Chandpur zila','09',1017),(1729,'Chittagong zila','10',1017),(1730,'Chuadanga zila','12',1017),(1731,'Comilla zila','08',1017),(1732,'Cox\'s Bazar zila','11',1017),(1733,'Dhaka zila','13',1017),(1734,'Dinajpur zila','14',1017),(1735,'Faridpur zila','15',1017),(1736,'Feni zila','16',1017),(1737,'Gaibandha zila','19',1017),(1738,'Gazipur zila','18',1017),(1739,'Gopalganj zila','17',1017),(1740,'Habiganj zila','20',1017),(1741,'Jaipurhat zila','24',1017),(1742,'Jamalpur zila','21',1017),(1743,'Jessore zila','22',1017),(1744,'Jhalakati zila','25',1017),(1745,'Jhenaidah zila','23',1017),(1746,'Khagrachari zila','29',1017),(1747,'Khulna zila','27',1017),(1748,'Kishorganj zila','26',1017),(1749,'Kurigram zila','28',1017),(1750,'Kushtia zila','30',1017),(1751,'Lakshmipur zila','31',1017),(1752,'Lalmonirhat zila','32',1017),(1753,'Madaripur zila','36',1017),(1754,'Magura zila','37',1017),(1755,'Manikganj zila','33',1017),(1756,'Meherpur zila','39',1017),(1757,'Moulvibazar zila','38',1017),(1758,'Munshiganj zila','35',1017),(1759,'Mymensingh zila','34',1017),(1760,'Naogaon zila','48',1017),(1761,'Narail zila','43',1017),(1762,'Narayanganj zila','40',1017),(1763,'Narsingdi zila','42',1017),(1764,'Natore zila','44',1017),(1765,'Nawabganj zila','45',1017),(1766,'Netrakona zila','41',1017),(1767,'Nilphamari zila','46',1017),(1768,'Noakhali zila','47',1017),(1769,'Pabna zila','49',1017),(1770,'Panchagarh zila','52',1017),(1771,'Patuakhali zila','51',1017),(1772,'Pirojpur zila','50',1017),(1773,'Rajbari zila','53',1017),(1774,'Rajshahi zila','54',1017),(1775,'Rangamati zila','56',1017),(1776,'Rangpur zila','55',1017),(1777,'Satkhira zila','58',1017),(1778,'Shariatpur zila','62',1017),(1779,'Sherpur zila','57',1017),(1780,'Sirajganj zila','59',1017),(1781,'Sunamganj zila','61',1017),(1782,'Sylhet zila','60',1017),(1783,'Tangail zila','63',1017),(1784,'Thakurgaon zila','64',1017),(1785,'Antwerpen','VAN',1020),(1786,'Brabant Wallon','WBR',1020),(1787,'Hainaut','WHT',1020),(1788,'Liege','WLG',1020),(1789,'Limburg','VLI',1020),(1790,'Luxembourg','WLX',1020),(1791,'Namur','WNA',1020),(1792,'Oost-Vlaanderen','VOV',1020),(1793,'Vlaams-Brabant','VBR',1020),(1794,'West-Vlaanderen','VWV',1020),(1795,'Bale','BAL',1034),(1796,'Bam','BAM',1034),(1797,'Banwa','BAN',1034),(1798,'Bazega','BAZ',1034),(1799,'Bougouriba','BGR',1034),(1800,'Boulgou','BLG',1034),(1801,'Boulkiemde','BLK',1034),(1802,'Comoe','COM',1034),(1803,'Ganzourgou','GAN',1034),(1804,'Gnagna','GNA',1034),(1805,'Gourma','GOU',1034),(1806,'Houet','HOU',1034),(1807,'Ioba','IOB',1034),(1808,'Kadiogo','KAD',1034),(1809,'Kenedougou','KEN',1034),(1810,'Komondjari','KMD',1034),(1811,'Kompienga','KMP',1034),(1812,'Kossi','KOS',1034),(1813,'Koulpulogo','KOP',1034),(1814,'Kouritenga','KOT',1034),(1815,'Kourweogo','KOW',1034),(1816,'Leraba','LER',1034),(1817,'Loroum','LOR',1034),(1818,'Mouhoun','MOU',1034),(1819,'Nahouri','NAO',1034),(1820,'Namentenga','NAM',1034),(1821,'Nayala','NAY',1034),(1822,'Noumbiel','NOU',1034),(1823,'Oubritenga','OUB',1034),(1824,'Oudalan','OUD',1034),(1825,'Passore','PAS',1034),(1826,'Poni','PON',1034),(1827,'Sanguie','SNG',1034),(1828,'Sanmatenga','SMT',1034),(1829,'Seno','SEN',1034),(1830,'Siasili','SIS',1034),(1831,'Soum','SOM',1034),(1832,'Sourou','SOR',1034),(1833,'Tapoa','TAP',1034),(1834,'Tui','TUI',1034),(1835,'Yagha','YAG',1034),(1836,'Yatenga','YAT',1034),(1837,'Ziro','ZIR',1034),(1838,'Zondoma','ZON',1034),(1839,'Zoundweogo','ZOU',1034),(1840,'Blagoevgrad','01',1033),(1841,'Burgas','02',1033),(1842,'Dobrich','08',1033),(1843,'Gabrovo','07',1033),(1844,'Haskovo','26',1033),(1845,'Yambol','28',1033),(1846,'Kardzhali','09',1033),(1847,'Kyustendil','10',1033),(1848,'Lovech','11',1033),(1849,'Montana','12',1033),(1850,'Pazardzhik','13',1033),(1851,'Pernik','14',1033),(1852,'Pleven','15',1033),(1853,'Plovdiv','16',1033),(1854,'Razgrad','17',1033),(1855,'Ruse','18',1033),(1856,'Silistra','19',1033),(1857,'Sliven','20',1033),(1858,'Smolyan','21',1033),(1859,'Sofia','23',1033),(1860,'Stara Zagora','24',1033),(1861,'Shumen','27',1033),(1862,'Targovishte','25',1033),(1863,'Varna','03',1033),(1864,'Veliko Tarnovo','04',1033),(1865,'Vidin','05',1033),(1866,'Vratsa','06',1033),(1867,'Al Hadd','01',1016),(1868,'Al Manamah','03',1016),(1869,'Al Mintaqah al Gharbiyah','10',1016),(1870,'Al Mintagah al Wusta','07',1016),(1871,'Al Mintaqah ash Shamaliyah','05',1016),(1872,'Al Muharraq','02',1016),(1873,'Ar Rifa','09',1016),(1874,'Jidd Hafs','04',1016),(1875,'Madluat Jamad','12',1016),(1876,'Madluat Isa','08',1016),(1877,'Mintaqat Juzur tawar','11',1016),(1878,'Sitrah','06',1016),(1879,'Bubanza','BB',1036),(1880,'Bujumbura','BJ',1036),(1881,'Bururi','BR',1036),(1882,'Cankuzo','CA',1036),(1883,'Cibitoke','CI',1036),(1884,'Gitega','GI',1036),(1885,'Karuzi','KR',1036),(1886,'Kayanza','KY',1036),(1887,'Makamba','MA',1036),(1888,'Muramvya','MU',1036),(1889,'Mwaro','MW',1036),(1890,'Ngozi','NG',1036),(1891,'Rutana','RT',1036),(1892,'Ruyigi','RY',1036),(1893,'Alibori','AL',1022),(1894,'Atakora','AK',1022),(1895,'Atlantique','AQ',1022),(1896,'Borgou','BO',1022),(1897,'Collines','CO',1022),(1898,'Donga','DO',1022),(1899,'Kouffo','KO',1022),(1900,'Littoral','LI',1022),(1901,'Mono','MO',1022),(1902,'Oueme','OU',1022),(1903,'Plateau','PL',1022),(1904,'Zou','ZO',1022),(1905,'Belait','BE',1032),(1906,'Brunei-Muara','BM',1032),(1907,'Temburong','TE',1032),(1908,'Tutong','TU',1032),(1909,'Cochabamba','C',1025),(1910,'Chuquisaca','H',1025),(1911,'El Beni','B',1025),(1912,'La Paz','L',1025),(1913,'Oruro','O',1025),(1914,'Pando','N',1025),(1915,'Potosi','P',1025),(1916,'Tarija','T',1025),(1917,'Acre','AC',1029),(1918,'Alagoas','AL',1029),(1919,'Amazonas','AM',1029),(1920,'Amapa','AP',1029),(1921,'Bahia','BA',1029),(1922,'Ceara','CE',1029),(1923,'Distrito Federal','DF',1029),(1924,'Espirito Santo','ES',1029),(1926,'Goias','GO',1029),(1927,'Maranhao','MA',1029),(1928,'Minas Gerais','MG',1029),(1929,'Mato Grosso do Sul','MS',1029),(1930,'Mato Grosso','MT',1029),(1931,'Para','PA',1029),(1932,'Paraiba','PB',1029),(1933,'Pernambuco','PE',1029),(1934,'Piaui','PI',1029),(1935,'Parana','PR',1029),(1936,'Rio de Janeiro','RJ',1029),(1937,'Rio Grande do Norte','RN',1029),(1938,'Rondonia','RO',1029),(1939,'Roraima','RR',1029),(1940,'Rio Grande do Sul','RS',1029),(1941,'Santa Catarina','SC',1029),(1942,'Sergipe','SE',1029),(1943,'Sao Paulo','SP',1029),(1944,'Tocantins','TO',1029),(1945,'Acklins and Crooked Islands','AC',1212),(1946,'Bimini','BI',1212),(1947,'Cat Island','CI',1212),(1948,'Exuma','EX',1212),(1955,'Inagua','IN',1212),(1957,'Long Island','LI',1212),(1959,'Mayaguana','MG',1212),(1960,'New Providence','NP',1212),(1962,'Ragged Island','RI',1212),(1966,'Bumthang','33',1024),(1967,'Chhukha','12',1024),(1968,'Dagana','22',1024),(1969,'Gasa','GA',1024),(1970,'Ha','13',1024),(1971,'Lhuentse','44',1024),(1972,'Monggar','42',1024),(1973,'Paro','11',1024),(1974,'Pemagatshel','43',1024),(1975,'Punakha','23',1024),(1976,'Samdrup Jongkha','45',1024),(1977,'Samtee','14',1024),(1978,'Sarpang','31',1024),(1979,'Thimphu','15',1024),(1980,'Trashigang','41',1024),(1981,'Trashi Yangtse','TY',1024),(1982,'Trongsa','32',1024),(1983,'Tsirang','21',1024),(1984,'Wangdue Phodrang','24',1024),(1985,'Zhemgang','34',1024),(1986,'Central','CE',1027),(1987,'Ghanzi','GH',1027),(1988,'Kgalagadi','KG',1027),(1989,'Kgatleng','KL',1027),(1990,'Kweneng','KW',1027),(1991,'Ngamiland','NG',1027),(1992,'North-East','NE',1027),(1993,'North-West','NW',1027),(1994,'South-East','SE',1027),(1995,'Southern','SO',1027),(1996,'Brèsckaja voblasc\'','BR',1019),(1997,'Homel\'skaja voblasc\'','HO',1019),(1998,'Hrodzenskaja voblasc\'','HR',1019),(1999,'Mahilëuskaja voblasc\'','MA',1019),(2000,'Minskaja voblasc\'','MI',1019),(2001,'Vicebskaja voblasc\'','VI',1019),(2002,'Belize','BZ',1021),(2003,'Cayo','CY',1021),(2004,'Corozal','CZL',1021),(2005,'Orange Walk','OW',1021),(2006,'Stann Creek','SC',1021),(2007,'Toledo','TOL',1021),(2008,'Kinshasa','KN',1050),(2011,'Equateur','EQ',1050),(2014,'Kasai-Oriental','KE',1050),(2016,'Maniema','MA',1050),(2017,'Nord-Kivu','NK',1050),(2019,'Sud-Kivu','SK',1050),(2020,'Bangui','BGF',1042),(2021,'Bamingui-Bangoran','BB',1042),(2022,'Basse-Kotto','BK',1042),(2023,'Haute-Kotto','HK',1042),(2024,'Haut-Mbomou','HM',1042),(2025,'Kemo','KG',1042),(2026,'Lobaye','LB',1042),(2027,'Mambere-Kadei','HS',1042),(2028,'Mbomou','MB',1042),(2029,'Nana-Grebizi','KB',1042),(2030,'Nana-Mambere','NM',1042),(2031,'Ombella-Mpoko','MP',1042),(2032,'Ouaka','UK',1042),(2033,'Ouham','AC',1042),(2034,'Ouham-Pende','OP',1042),(2035,'Sangha-Mbaere','SE',1042),(2036,'Vakaga','VR',1042),(2037,'Brazzaville','BZV',1051),(2038,'Bouenza','11',1051),(2039,'Cuvette','8',1051),(2040,'Cuvette-Ouest','15',1051),(2041,'Kouilou','5',1051),(2042,'Lekoumou','2',1051),(2043,'Likouala','7',1051),(2044,'Niari','9',1051),(2045,'Plateaux','14',1051),(2046,'Pool','12',1051),(2047,'Sangha','13',1051),(2048,'Aargau','AG',1205),(2049,'Appenzell Innerrhoden','AI',1205),(2050,'Appenzell Ausserrhoden','AR',1205),(2051,'Bern','BE',1205),(2052,'Basel-Landschaft','BL',1205),(2053,'Basel-Stadt','BS',1205),(2054,'Fribourg','FR',1205),(2055,'Geneva','GE',1205),(2056,'Glarus','GL',1205),(2057,'Graubunden','GR',1205),(2058,'Jura','JU',1205),(2059,'Luzern','LU',1205),(2060,'Neuchatel','NE',1205),(2061,'Nidwalden','NW',1205),(2062,'Obwalden','OW',1205),(2063,'Sankt Gallen','SG',1205),(2064,'Schaffhausen','SH',1205),(2065,'Solothurn','SO',1205),(2066,'Schwyz','SZ',1205),(2067,'Thurgau','TG',1205),(2068,'Ticino','TI',1205),(2069,'Uri','UR',1205),(2070,'Vaud','VD',1205),(2071,'Valais','VS',1205),(2072,'Zug','ZG',1205),(2073,'Zurich','ZH',1205),(2074,'18 Montagnes','06',1054),(2075,'Agnebi','16',1054),(2076,'Bas-Sassandra','09',1054),(2077,'Denguele','10',1054),(2078,'Haut-Sassandra','02',1054),(2079,'Lacs','07',1054),(2080,'Lagunes','01',1054),(2081,'Marahoue','12',1054),(2082,'Moyen-Comoe','05',1054),(2083,'Nzi-Comoe','11',1054),(2084,'Savanes','03',1054),(2085,'Sud-Bandama','15',1054),(2086,'Sud-Comoe','13',1054),(2087,'Vallee du Bandama','04',1054),(2088,'Worodouqou','14',1054),(2089,'Zanzan','08',1054),(2090,'Aisen del General Carlos Ibanez del Campo','AI',1044),(2091,'Antofagasta','AN',1044),(2092,'Araucania','AR',1044),(2093,'Atacama','AT',1044),(2094,'Bio-Bio','BI',1044),(2095,'Coquimbo','CO',1044),(2096,'Libertador General Bernardo O\'Higgins','LI',1044),(2097,'Los Lagos','LL',1044),(2098,'Magallanes','MA',1044),(2099,'Maule','ML',1044),(2100,'Santiago Metropolitan','SM',1044),(2101,'Tarapaca','TA',1044),(2102,'Valparaiso','VS',1044),(2103,'Adamaoua','AD',1038),(2104,'Centre','CE',1038),(2105,'East','ES',1038),(2106,'Far North','EN',1038),(2107,'North','NO',1038),(2108,'South','SW',1038),(2109,'South-West','SW',1038),(2110,'West','OU',1038),(2111,'Beijing','11',1045),(2112,'Chongqing','50',1045),(2113,'Shanghai','31',1045),(2114,'Tianjin','12',1045),(2115,'Anhui','34',1045),(2116,'Fujian','35',1045),(2117,'Gansu','62',1045),(2118,'Guangdong','44',1045),(2119,'Guizhou','52',1045),(2120,'Hainan','46',1045),(2121,'Hebei','13',1045),(2122,'Heilongjiang','23',1045),(2123,'Henan','41',1045),(2124,'Hubei','42',1045),(2125,'Hunan','43',1045),(2126,'Jiangsu','32',1045),(2127,'Jiangxi','36',1045),(2128,'Jilin','22',1045),(2129,'Liaoning','21',1045),(2130,'Qinghai','63',1045),(2131,'Shaanxi','61',1045),(2132,'Shandong','37',1045),(2133,'Shanxi','14',1045),(2134,'Sichuan','51',1045),(2135,'Taiwan','71',1045),(2136,'Yunnan','53',1045),(2137,'Zhejiang','33',1045),(2138,'Guangxi','45',1045),(2139,'Neia Mongol (mn)','15',1045),(2140,'Xinjiang','65',1045),(2141,'Xizang','54',1045),(2142,'Hong Kong','91',1045),(2143,'Macau','92',1045),(2144,'Distrito Capital de Bogotá','DC',1048),(2145,'Amazonea','AMA',1048),(2146,'Antioquia','ANT',1048),(2147,'Arauca','ARA',1048),(2148,'Atlántico','ATL',1048),(2149,'Bolívar','BOL',1048),(2150,'Boyacá','BOY',1048),(2151,'Caldea','CAL',1048),(2152,'Caquetá','CAQ',1048),(2153,'Casanare','CAS',1048),(2154,'Cauca','CAU',1048),(2155,'Cesar','CES',1048),(2156,'Córdoba','COR',1048),(2157,'Cundinamarca','CUN',1048),(2158,'Chocó','CHO',1048),(2159,'Guainía','GUA',1048),(2160,'Guaviare','GUV',1048),(2161,'La Guajira','LAG',1048),(2162,'Magdalena','MAG',1048),(2163,'Meta','MET',1048),(2164,'Nariño','NAR',1048),(2165,'Norte de Santander','NSA',1048),(2166,'Putumayo','PUT',1048),(2167,'Quindio','QUI',1048),(2168,'Risaralda','RIS',1048),(2169,'San Andrés, Providencia y Santa Catalina','SAP',1048),(2170,'Santander','SAN',1048),(2171,'Sucre','SUC',1048),(2172,'Tolima','TOL',1048),(2173,'Valle del Cauca','VAC',1048),(2174,'Vaupés','VAU',1048),(2175,'Vichada','VID',1048),(2176,'Alajuela','A',1053),(2177,'Cartago','C',1053),(2178,'Guanacaste','G',1053),(2179,'Heredia','H',1053),(2180,'Limon','L',1053),(2181,'Puntarenas','P',1053),(2182,'San Jose','SJ',1053),(2183,'Camagey','09',1056),(2184,'Ciego de `vila','08',1056),(2185,'Cienfuegos','06',1056),(2186,'Ciudad de La Habana','03',1056),(2187,'Granma','12',1056),(2188,'Guantanamo','14',1056),(2189,'Holquin','11',1056),(2190,'La Habana','02',1056),(2191,'Las Tunas','10',1056),(2192,'Matanzas','04',1056),(2193,'Pinar del Rio','01',1056),(2194,'Sancti Spiritus','07',1056),(2195,'Santiago de Cuba','13',1056),(2196,'Villa Clara','05',1056),(2197,'Isla de la Juventud','99',1056),(2198,'Pinar del Roo','PR',1056),(2199,'Ciego de Avila','CA',1056),(2200,'Camagoey','CG',1056),(2201,'Holgun','HO',1056),(2202,'Sancti Spritus','SS',1056),(2203,'Municipio Especial Isla de la Juventud','IJ',1056),(2204,'Boa Vista','BV',1040),(2205,'Brava','BR',1040),(2206,'Calheta de Sao Miguel','CS',1040),(2207,'Fogo','FO',1040),(2208,'Maio','MA',1040),(2209,'Mosteiros','MO',1040),(2210,'Paul','PA',1040),(2211,'Porto Novo','PN',1040),(2212,'Praia','PR',1040),(2213,'Ribeira Grande','RG',1040),(2214,'Sal','SL',1040),(2215,'Sao Domingos','SD',1040),(2216,'Sao Filipe','SF',1040),(2217,'Sao Nicolau','SN',1040),(2218,'Sao Vicente','SV',1040),(2219,'Tarrafal','TA',1040),(2220,'Ammochostos Magusa','04',1057),(2221,'Keryneia','06',1057),(2222,'Larnaka','03',1057),(2223,'Lefkosia','01',1057),(2224,'Lemesos','02',1057),(2225,'Pafos','05',1057),(2226,'Jihočeský kraj','JC',1058),(2227,'Jihomoravský kraj','JM',1058),(2228,'Karlovarský kraj','KA',1058),(2229,'Královéhradecký kraj','KR',1058),(2230,'Liberecký kraj','LI',1058),(2231,'Moravskoslezský kraj','MO',1058),(2232,'Olomoucký kraj','OL',1058),(2233,'Pardubický kraj','PA',1058),(2234,'Plzeňský kraj','PL',1058),(2235,'Praha, hlavní město','PR',1058),(2236,'Středočeský kraj','ST',1058),(2237,'Ústecký kraj','US',1058),(2238,'Vysočina','VY',1058),(2239,'Zlínský kraj','ZL',1058),(2240,'Baden-Württemberg','BW',1082),(2241,'Bayern','BY',1082),(2242,'Bremen','HB',1082),(2243,'Hamburg','HH',1082),(2244,'Hessen','HE',1082),(2245,'Niedersachsen','NI',1082),(2246,'Nordrhein-Westfalen','NW',1082),(2247,'Rheinland-Pfalz','RP',1082),(2248,'Saarland','SL',1082),(2249,'Schleswig-Holstein','SH',1082),(2250,'Berlin','BE',1082),(2251,'Brandenburg','BB',1082),(2252,'Mecklenburg-Vorpommern','MV',1082),(2253,'Sachsen','SN',1082),(2254,'Sachsen-Anhalt','ST',1082),(2255,'Thüringen','TH',1082),(2256,'Ali Sabiah','AS',1060),(2257,'Dikhil','DI',1060),(2258,'Djibouti','DJ',1060),(2259,'Obock','OB',1060),(2260,'Tadjoura','TA',1060),(2261,'Frederiksberg','147',1059),(2262,'Copenhagen City','101',1059),(2263,'Copenhagen','015',1059),(2264,'Frederiksborg','020',1059),(2265,'Roskilde','025',1059),(2266,'Vestsjælland','030',1059),(2267,'Storstrøm','035',1059),(2268,'Bornholm','040',1059),(2269,'Fyn','042',1059),(2270,'South Jutland','050',1059),(2271,'Ribe','055',1059),(2272,'Vejle','060',1059),(2273,'Ringkjøbing','065',1059),(2274,'Århus','070',1059),(2275,'Viborg','076',1059),(2276,'North Jutland','080',1059),(2277,'Distrito Nacional (Santo Domingo)','01',1062),(2278,'Azua','02',1062),(2279,'Bahoruco','03',1062),(2280,'Barahona','04',1062),(2281,'Dajabón','05',1062),(2282,'Duarte','06',1062),(2283,'El Seybo [El Seibo]','08',1062),(2284,'Espaillat','09',1062),(2285,'Hato Mayor','30',1062),(2286,'Independencia','10',1062),(2287,'La Altagracia','11',1062),(2288,'La Estrelleta [Elias Pina]','07',1062),(2289,'La Romana','12',1062),(2290,'La Vega','13',1062),(2291,'Maroia Trinidad Sánchez','14',1062),(2292,'Monseñor Nouel','28',1062),(2293,'Monte Cristi','15',1062),(2294,'Monte Plata','29',1062),(2295,'Pedernales','16',1062),(2296,'Peravia','17',1062),(2297,'Puerto Plata','18',1062),(2298,'Salcedo','19',1062),(2299,'Samaná','20',1062),(2300,'San Cristóbal','21',1062),(2301,'San Pedro de Macorís','23',1062),(2302,'Sánchez Ramírez','24',1062),(2303,'Santiago','25',1062),(2304,'Santiago Rodríguez','26',1062),(2305,'Valverde','27',1062),(2306,'Adrar','01',1003),(2307,'Ain Defla','44',1003),(2308,'Ain Tmouchent','46',1003),(2309,'Alger','16',1003),(2310,'Annaba','23',1003),(2311,'Batna','05',1003),(2312,'Bechar','08',1003),(2313,'Bejaia','06',1003),(2314,'Biskra','07',1003),(2315,'Blida','09',1003),(2316,'Bordj Bou Arreridj','34',1003),(2317,'Bouira','10',1003),(2318,'Boumerdes','35',1003),(2319,'Chlef','02',1003),(2320,'Constantine','25',1003),(2321,'Djelfa','17',1003),(2322,'El Bayadh','32',1003),(2323,'El Oued','39',1003),(2324,'El Tarf','36',1003),(2325,'Ghardaia','47',1003),(2326,'Guelma','24',1003),(2327,'Illizi','33',1003),(2328,'Jijel','18',1003),(2329,'Khenchela','40',1003),(2330,'Laghouat','03',1003),(2331,'Mascara','29',1003),(2332,'Medea','26',1003),(2333,'Mila','43',1003),(2334,'Mostaganem','27',1003),(2335,'Msila','28',1003),(2336,'Naama','45',1003),(2337,'Oran','31',1003),(2338,'Ouargla','30',1003),(2339,'Oum el Bouaghi','04',1003),(2340,'Relizane','48',1003),(2341,'Saida','20',1003),(2342,'Setif','19',1003),(2343,'Sidi Bel Abbes','22',1003),(2344,'Skikda','21',1003),(2345,'Souk Ahras','41',1003),(2346,'Tamanghasset','11',1003),(2347,'Tebessa','12',1003),(2348,'Tiaret','14',1003),(2349,'Tindouf','37',1003),(2350,'Tipaza','42',1003),(2351,'Tissemsilt','38',1003),(2352,'Tizi Ouzou','15',1003),(2353,'Tlemcen','13',1003),(2354,'Azuay','A',1064),(2355,'Bolivar','B',1064),(2356,'Canar','F',1064),(2357,'Carchi','C',1064),(2358,'Cotopaxi','X',1064),(2359,'Chimborazo','H',1064),(2360,'El Oro','O',1064),(2361,'Esmeraldas','E',1064),(2362,'Galapagos','W',1064),(2363,'Guayas','G',1064),(2364,'Imbabura','I',1064),(2365,'Loja','L',1064),(2366,'Los Rios','R',1064),(2367,'Manabi','M',1064),(2368,'Morona-Santiago','S',1064),(2369,'Napo','N',1064),(2370,'Orellana','D',1064),(2371,'Pastaza','Y',1064),(2372,'Pichincha','P',1064),(2373,'Sucumbios','U',1064),(2374,'Tungurahua','T',1064),(2375,'Zamora-Chinchipe','Z',1064),(2376,'Harjumaa','37',1069),(2377,'Hiiumaa','39',1069),(2378,'Ida-Virumaa','44',1069),(2379,'Jõgevamaa','49',1069),(2380,'Järvamaa','51',1069),(2381,'Läänemaa','57',1069),(2382,'Lääne-Virumaa','59',1069),(2383,'Põlvamaa','65',1069),(2384,'Pärnumaa','67',1069),(2385,'Raplamaa','70',1069),(2386,'Saaremaa','74',1069),(2387,'Tartumaa','7B',1069),(2388,'Valgamaa','82',1069),(2389,'Viljandimaa','84',1069),(2390,'Võrumaa','86',1069),(2391,'Ad Daqahllyah','DK',1065),(2392,'Al Bahr al Ahmar','BA',1065),(2393,'Al Buhayrah','BH',1065),(2394,'Al Fayym','FYM',1065),(2395,'Al Gharbiyah','GH',1065),(2396,'Al Iskandarlyah','ALX',1065),(2397,'Al Isma illyah','IS',1065),(2398,'Al Jizah','GZ',1065),(2399,'Al Minuflyah','MNF',1065),(2400,'Al Minya','MN',1065),(2401,'Al Qahirah','C',1065),(2402,'Al Qalyublyah','KB',1065),(2403,'Al Wadi al Jadid','WAD',1065),(2404,'Ash Sharqiyah','SHR',1065),(2405,'As Suways','SUZ',1065),(2406,'Aswan','ASN',1065),(2407,'Asyut','AST',1065),(2408,'Bani Suwayf','BNS',1065),(2409,'Bur Sa\'id','PTS',1065),(2410,'Dumyat','DT',1065),(2411,'Janub Sina\'','JS',1065),(2412,'Kafr ash Shaykh','KFS',1065),(2413,'Matruh','MT',1065),(2414,'Qina','KN',1065),(2415,'Shamal Sina\'','SIN',1065),(2416,'Suhaj','SHG',1065),(2417,'Anseba','AN',1068),(2418,'Debub','DU',1068),(2419,'Debubawi Keyih Bahri [Debub-Keih-Bahri]','DK',1068),(2420,'Gash-Barka','GB',1068),(2421,'Maakel [Maekel]','MA',1068),(2422,'Semenawi Keyih Bahri [Semien-Keih-Bahri]','SK',1068),(2423,'Álava','VI',1198),(2424,'Albacete','AB',1198),(2425,'Alicante','A',1198),(2426,'Almería','AL',1198),(2427,'Asturias','O',1198),(2428,'Ávila','AV',1198),(2429,'Badajoz','BA',1198),(2430,'Baleares','PM',1198),(2431,'Barcelona','B',1198),(2432,'Burgos','BU',1198),(2433,'Cáceres','CC',1198),(2434,'Cádiz','CA',1198),(2435,'Cantabria','S',1198),(2436,'Castellón','CS',1198),(2437,'Ciudad Real','CR',1198),(2438,'Cuenca','CU',1198),(2439,'Girona [Gerona]','GE',1198),(2440,'Granada','GR',1198),(2441,'Guadalajara','GU',1198),(2442,'Guipúzcoa','SS',1198),(2443,'Huelva','H',1198),(2444,'Huesca','HU',1198),(2445,'Jaén','J',1198),(2446,'La Coruña','C',1198),(2447,'La Rioja','LO',1198),(2448,'Las Palmas','GC',1198),(2449,'León','LE',1198),(2450,'Lleida [Lérida]','L',1198),(2451,'Lugo','LU',1198),(2452,'Madrid','M',1198),(2453,'Málaga','MA',1198),(2454,'Murcia','MU',1198),(2455,'Navarra','NA',1198),(2456,'Ourense','OR',1198),(2457,'Palencia','P',1198),(2458,'Pontevedra','PO',1198),(2459,'Salamanca','SA',1198),(2460,'Santa Cruz de Tenerife','TF',1198),(2461,'Segovia','SG',1198),(2462,'Sevilla','SE',1198),(2463,'Soria','SO',1198),(2464,'Tarragona','T',1198),(2465,'Teruel','TE',1198),(2466,'Valencia','V',1198),(2467,'Valladolid','VA',1198),(2468,'Vizcaya','BI',1198),(2469,'Zamora','ZA',1198),(2470,'Zaragoza','Z',1198),(2471,'Ceuta','CE',1198),(2472,'Melilla','ML',1198),(2473,'Addis Ababa','AA',1070),(2474,'Dire Dawa','DD',1070),(2475,'Afar','AF',1070),(2476,'Amara','AM',1070),(2477,'Benshangul-Gumaz','BE',1070),(2478,'Gambela Peoples','GA',1070),(2479,'Harari People','HA',1070),(2480,'Oromia','OR',1070),(2481,'Somali','SO',1070),(2482,'Southern Nations, Nationalities and Peoples','SN',1070),(2483,'Tigrai','TI',1070),(2490,'Eastern','E',1074),(2491,'Northern','N',1074),(2492,'Western','W',1074),(2493,'Rotuma','R',1074),(2494,'Chuuk','TRK',1141),(2495,'Kosrae','KSA',1141),(2496,'Pohnpei','PNI',1141),(2497,'Yap','YAP',1141),(2498,'Ain','01',1076),(2499,'Aisne','02',1076),(2500,'Allier','03',1076),(2501,'Alpes-de-Haute-Provence','04',1076),(2502,'Alpes-Maritimes','06',1076),(2503,'Ardèche','07',1076),(2504,'Ardennes','08',1076),(2505,'Ariège','09',1076),(2506,'Aube','10',1076),(2507,'Aude','11',1076),(2508,'Aveyron','12',1076),(2509,'Bas-Rhin','67',1076),(2510,'Bouches-du-Rhône','13',1076),(2511,'Calvados','14',1076),(2512,'Cantal','15',1076),(2513,'Charente','16',1076),(2514,'Charente-Maritime','17',1076),(2515,'Cher','18',1076),(2516,'Corrèze','19',1076),(2517,'Corse-du-Sud','20A',1076),(2518,'Côte-d\'Or','21',1076),(2519,'Côtes-d\'Armor','22',1076),(2520,'Creuse','23',1076),(2521,'Deux-Sèvres','79',1076),(2522,'Dordogne','24',1076),(2523,'Doubs','25',1076),(2524,'Drôme','26',1076),(2525,'Essonne','91',1076),(2526,'Eure','27',1076),(2527,'Eure-et-Loir','28',1076),(2528,'Finistère','29',1076),(2529,'Gard','30',1076),(2530,'Gers','32',1076),(2531,'Gironde','33',1076),(2532,'Haut-Rhin','68',1076),(2533,'Haute-Corse','20B',1076),(2534,'Haute-Garonne','31',1076),(2535,'Haute-Loire','43',1076),(2536,'Haute-Saône','70',1076),(2537,'Haute-Savoie','74',1076),(2538,'Haute-Vienne','87',1076),(2539,'Hautes-Alpes','05',1076),(2540,'Hautes-Pyrénées','65',1076),(2541,'Hauts-de-Seine','92',1076),(2542,'Hérault','34',1076),(2543,'Indre','36',1076),(2544,'Ille-et-Vilaine','35',1076),(2545,'Indre-et-Loire','37',1076),(2546,'Isère','38',1076),(2547,'Landes','40',1076),(2548,'Loir-et-Cher','41',1076),(2549,'Loire','42',1076),(2550,'Loire-Atlantique','44',1076),(2551,'Loiret','45',1076),(2552,'Lot','46',1076),(2553,'Lot-et-Garonne','47',1076),(2554,'Lozère','48',1076),(2555,'Maine-et-Loire','49',1076),(2556,'Manche','50',1076),(2557,'Marne','51',1076),(2558,'Mayenne','53',1076),(2559,'Meurthe-et-Moselle','54',1076),(2560,'Meuse','55',1076),(2561,'Morbihan','56',1076),(2562,'Moselle','57',1076),(2563,'Nièvre','58',1076),(2564,'Nord','59',1076),(2565,'Oise','60',1076),(2566,'Orne','61',1076),(2567,'Paris','75',1076),(2568,'Pas-de-Calais','62',1076),(2569,'Puy-de-Dôme','63',1076),(2570,'Pyrénées-Atlantiques','64',1076),(2571,'Pyrénées-Orientales','66',1076),(2572,'Rhône','69',1076),(2573,'Saône-et-Loire','71',1076),(2574,'Sarthe','72',1076),(2575,'Savoie','73',1076),(2576,'Seine-et-Marne','77',1076),(2577,'Seine-Maritime','76',1076),(2578,'Seine-Saint-Denis','93',1076),(2579,'Somme','80',1076),(2580,'Tarn','81',1076),(2581,'Tarn-et-Garonne','82',1076),(2582,'Val d\'Oise','95',1076),(2583,'Territoire de Belfort','90',1076),(2584,'Val-de-Marne','94',1076),(2585,'Var','83',1076),(2586,'Vaucluse','84',1076),(2587,'Vendée','85',1076),(2588,'Vienne','86',1076),(2589,'Vosges','88',1076),(2590,'Yonne','89',1076),(2591,'Yvelines','78',1076),(2592,'Aberdeen City','ABE',1226),(2593,'Aberdeenshire','ABD',1226),(2594,'Angus','ANS',1226),(2595,'Co Antrim','ANT',1226),(2597,'Argyll and Bute','AGB',1226),(2598,'Co Armagh','ARM',1226),(2606,'Bedfordshire','BDF',1226),(2612,'Gwent','BGW',1226),(2620,'Bristol, City of','BST',1226),(2622,'Buckinghamshire','BKM',1226),(2626,'Cambridgeshire','CAM',1226),(2634,'Cheshire','CHS',1226),(2635,'Clackmannanshire','CLK',1226),(2639,'Cornwall','CON',1226),(2643,'Cumbria','CMA',1226),(2647,'Derbyshire','DBY',1226),(2648,'Co Londonderry','DRY',1226),(2649,'Devon','DEV',1226),(2651,'Dorset','DOR',1226),(2652,'Co Down','DOW',1226),(2654,'Dumfries and Galloway','DGY',1226),(2655,'Dundee City','DND',1226),(2657,'County Durham','DUR',1226),(2659,'East Ayrshire','EAY',1226),(2660,'East Dunbartonshire','EDU',1226),(2661,'East Lothian','ELN',1226),(2662,'East Renfrewshire','ERW',1226),(2663,'East Riding of Yorkshire','ERY',1226),(2664,'East Sussex','ESX',1226),(2665,'Edinburgh, City of','EDH',1226),(2666,'Na h-Eileanan Siar','ELS',1226),(2668,'Essex','ESS',1226),(2669,'Falkirk','FAL',1226),(2670,'Co Fermanagh','FER',1226),(2671,'Fife','FIF',1226),(2674,'Glasgow City','GLG',1226),(2675,'Gloucestershire','GLS',1226),(2678,'Gwynedd','GWN',1226),(2682,'Hampshire','HAM',1226),(2687,'Herefordshire','HEF',1226),(2688,'Hertfordshire','HRT',1226),(2689,'Highland','HED',1226),(2692,'Inverclyde','IVC',1226),(2694,'Isle of Wight','IOW',1226),(2699,'Kent','KEN',1226),(2705,'Lancashire','LAN',1226),(2709,'Leicestershire','LEC',1226),(2712,'Lincolnshire','LIN',1226),(2723,'Midlothian','MLN',1226),(2726,'Moray','MRY',1226),(2734,'Norfolk','NFK',1226),(2735,'North Ayrshire','NAY',1226),(2738,'North Lanarkshire','NLK',1226),(2742,'North Yorkshire','NYK',1226),(2743,'Northamptonshire','NTH',1226),(2744,'Northumberland','NBL',1226),(2746,'Nottinghamshire','NTT',1226),(2747,'Oldham','OLD',1226),(2748,'Omagh','OMH',1226),(2749,'Orkney Islands','ORR',1226),(2750,'Oxfordshire','OXF',1226),(2752,'Perth and Kinross','PKN',1226),(2757,'Powys','POW',1226),(2761,'Renfrewshire','RFW',1226),(2766,'Rutland','RUT',1226),(2770,'Scottish Borders','SCB',1226),(2773,'Shetland Islands','ZET',1226),(2774,'Shropshire','SHR',1226),(2777,'Somerset','SOM',1226),(2778,'South Ayrshire','SAY',1226),(2779,'South Gloucestershire','SGC',1226),(2780,'South Lanarkshire','SLK',1226),(2785,'Staffordshire','STS',1226),(2786,'Stirling','STG',1226),(2791,'Suffolk','SFK',1226),(2793,'Surrey','SRY',1226),(2804,'Mid Glamorgan','VGL',1226),(2811,'Warwickshire','WAR',1226),(2813,'West Dunbartonshire','WDU',1226),(2814,'West Lothian','WLN',1226),(2815,'West Sussex','WSX',1226),(2818,'Wiltshire','WIL',1226),(2823,'Worcestershire','WOR',1226),(2826,'Ashanti','AH',1083),(2827,'Brong-Ahafo','BA',1083),(2828,'Greater Accra','AA',1083),(2829,'Upper East','UE',1083),(2830,'Upper West','UW',1083),(2831,'Volta','TV',1083),(2832,'Banjul','B',1213),(2833,'Lower River','L',1213),(2834,'MacCarthy Island','M',1213),(2835,'North Bank','N',1213),(2836,'Upper River','U',1213),(2837,'Beyla','BE',1091),(2838,'Boffa','BF',1091),(2839,'Boke','BK',1091),(2840,'Coyah','CO',1091),(2841,'Dabola','DB',1091),(2842,'Dalaba','DL',1091),(2843,'Dinguiraye','DI',1091),(2844,'Dubreka','DU',1091),(2845,'Faranah','FA',1091),(2846,'Forecariah','FO',1091),(2847,'Fria','FR',1091),(2848,'Gaoual','GA',1091),(2849,'Guekedou','GU',1091),(2850,'Kankan','KA',1091),(2851,'Kerouane','KE',1091),(2852,'Kindia','KD',1091),(2853,'Kissidougou','KS',1091),(2854,'Koubia','KB',1091),(2855,'Koundara','KN',1091),(2856,'Kouroussa','KO',1091),(2857,'Labe','LA',1091),(2858,'Lelouma','LE',1091),(2859,'Lola','LO',1091),(2860,'Macenta','MC',1091),(2861,'Mali','ML',1091),(2862,'Mamou','MM',1091),(2863,'Mandiana','MD',1091),(2864,'Nzerekore','NZ',1091),(2865,'Pita','PI',1091),(2866,'Siguiri','SI',1091),(2867,'Telimele','TE',1091),(2868,'Tougue','TO',1091),(2869,'Yomou','YO',1091),(2870,'Region Continental','C',1067),(2871,'Region Insular','I',1067),(2872,'Annobon','AN',1067),(2873,'Bioko Norte','BN',1067),(2874,'Bioko Sur','BS',1067),(2875,'Centro Sur','CS',1067),(2876,'Kie-Ntem','KN',1067),(2877,'Litoral','LI',1067),(2878,'Wele-Nzas','WN',1067),(2879,'Achaïa','13',1085),(2880,'Aitolia-Akarnania','01',1085),(2881,'Argolis','11',1085),(2882,'Arkadia','12',1085),(2883,'Arta','31',1085),(2884,'Attiki','A1',1085),(2885,'Chalkidiki','64',1085),(2886,'Chania','94',1085),(2887,'Chios','85',1085),(2888,'Dodekanisos','81',1085),(2889,'Drama','52',1085),(2890,'Evros','71',1085),(2891,'Evrytania','05',1085),(2892,'Evvoia','04',1085),(2893,'Florina','63',1085),(2894,'Fokis','07',1085),(2895,'Fthiotis','06',1085),(2896,'Grevena','51',1085),(2897,'Ileia','14',1085),(2898,'Imathia','53',1085),(2899,'Ioannina','33',1085),(2900,'Irakleion','91',1085),(2901,'Karditsa','41',1085),(2902,'Kastoria','56',1085),(2903,'Kavalla','55',1085),(2904,'Kefallinia','23',1085),(2905,'Kerkyra','22',1085),(2906,'Kilkis','57',1085),(2907,'Korinthia','15',1085),(2908,'Kozani','58',1085),(2909,'Kyklades','82',1085),(2910,'Lakonia','16',1085),(2911,'Larisa','42',1085),(2912,'Lasithion','92',1085),(2913,'Lefkas','24',1085),(2914,'Lesvos','83',1085),(2915,'Magnisia','43',1085),(2916,'Messinia','17',1085),(2917,'Pella','59',1085),(2918,'Preveza','34',1085),(2919,'Rethymnon','93',1085),(2920,'Rodopi','73',1085),(2921,'Samos','84',1085),(2922,'Serrai','62',1085),(2923,'Thesprotia','32',1085),(2924,'Thessaloniki','54',1085),(2925,'Trikala','44',1085),(2926,'Voiotia','03',1085),(2927,'Xanthi','72',1085),(2928,'Zakynthos','21',1085),(2929,'Agio Oros','69',1085),(2930,'Alta Verapaz','AV',1090),(2931,'Baja Verapaz','BV',1090),(2932,'Chimaltenango','CM',1090),(2933,'Chiquimula','CQ',1090),(2934,'El Progreso','PR',1090),(2935,'Escuintla','ES',1090),(2936,'Guatemala','GU',1090),(2937,'Huehuetenango','HU',1090),(2938,'Izabal','IZ',1090),(2939,'Jalapa','JA',1090),(2940,'Jutiapa','JU',1090),(2941,'Peten','PE',1090),(2942,'Quetzaltenango','QZ',1090),(2943,'Quiche','QC',1090),(2944,'Retalhuleu','RE',1090),(2945,'Sacatepequez','SA',1090),(2946,'San Marcos','SM',1090),(2947,'Santa Rosa','SR',1090),(2948,'Sololá','SO',1090),(2949,'Suchitepequez','SU',1090),(2950,'Totonicapan','TO',1090),(2951,'Zacapa','ZA',1090),(2952,'Bissau','BS',1092),(2953,'Bafata','BA',1092),(2954,'Biombo','BM',1092),(2955,'Bolama','BL',1092),(2956,'Cacheu','CA',1092),(2957,'Gabu','GA',1092),(2958,'Oio','OI',1092),(2959,'Quloara','QU',1092),(2960,'Tombali S','TO',1092),(2961,'Barima-Waini','BA',1093),(2962,'Cuyuni-Mazaruni','CU',1093),(2963,'Demerara-Mahaica','DE',1093),(2964,'East Berbice-Corentyne','EB',1093),(2965,'Essequibo Islands-West Demerara','ES',1093),(2966,'Mahaica-Berbice','MA',1093),(2967,'Pomeroon-Supenaam','PM',1093),(2968,'Potaro-Siparuni','PT',1093),(2969,'Upper Demerara-Berbice','UD',1093),(2970,'Upper Takutu-Upper Essequibo','UT',1093),(2971,'Atlantida','AT',1097),(2972,'Colon','CL',1097),(2973,'Comayagua','CM',1097),(2974,'Copan','CP',1097),(2975,'Cortes','CR',1097),(2976,'Choluteca','CH',1097),(2977,'El Paraiso','EP',1097),(2978,'Francisco Morazan','FM',1097),(2979,'Gracias a Dios','GD',1097),(2980,'Intibuca','IN',1097),(2981,'Islas de la Bahia','IB',1097),(2982,'Lempira','LE',1097),(2983,'Ocotepeque','OC',1097),(2984,'Olancho','OL',1097),(2985,'Santa Barbara','SB',1097),(2986,'Valle','VA',1097),(2987,'Yoro','YO',1097),(2988,'Bjelovarsko-bilogorska zupanija','07',1055),(2989,'Brodsko-posavska zupanija','12',1055),(2990,'Dubrovacko-neretvanska zupanija','19',1055),(2991,'Istarska zupanija','18',1055),(2992,'Karlovacka zupanija','04',1055),(2993,'Koprivnickco-krizevacka zupanija','06',1055),(2994,'Krapinako-zagorska zupanija','02',1055),(2995,'Licko-senjska zupanija','09',1055),(2996,'Medimurska zupanija','20',1055),(2997,'Osjecko-baranjska zupanija','14',1055),(2998,'Pozesko-slavonska zupanija','11',1055),(2999,'Primorsko-goranska zupanija','08',1055),(3000,'Sisacko-moelavacka Iupanija','03',1055),(3001,'Splitako-dalmatinska zupanija','17',1055),(3002,'Sibenako-kninska zupanija','15',1055),(3003,'Varaidinska zupanija','05',1055),(3004,'VirovitiEko-podravska zupanija','10',1055),(3005,'VuRovarako-srijemska zupanija','16',1055),(3006,'Zadaraka','13',1055),(3007,'Zagrebacka zupanija','01',1055),(3008,'Grande-Anse','GA',1094),(3009,'Nord-Est','NE',1094),(3010,'Nord-Ouest','NO',1094),(3011,'Ouest','OU',1094),(3012,'Sud','SD',1094),(3013,'Sud-Est','SE',1094),(3014,'Budapest','BU',1099),(3015,'Bács-Kiskun','BK',1099),(3016,'Baranya','BA',1099),(3017,'Békés','BE',1099),(3018,'Borsod-Abaúj-Zemplén','BZ',1099),(3019,'Csongrád','CS',1099),(3020,'Fejér','FE',1099),(3021,'Győr-Moson-Sopron','GS',1099),(3022,'Hajdu-Bihar','HB',1099),(3023,'Heves','HE',1099),(3024,'Jász-Nagykun-Szolnok','JN',1099),(3025,'Komárom-Esztergom','KE',1099),(3026,'Nográd','NO',1099),(3027,'Pest','PE',1099),(3028,'Somogy','SO',1099),(3029,'Szabolcs-Szatmár-Bereg','SZ',1099),(3030,'Tolna','TO',1099),(3031,'Vas','VA',1099),(3032,'Veszprém','VE',1099),(3033,'Zala','ZA',1099),(3034,'Békéscsaba','BC',1099),(3035,'Debrecen','DE',1099),(3036,'Dunaújváros','DU',1099),(3037,'Eger','EG',1099),(3038,'Győr','GY',1099),(3039,'Hódmezővásárhely','HV',1099),(3040,'Kaposvár','KV',1099),(3041,'Kecskemét','KM',1099),(3042,'Miskolc','MI',1099),(3043,'Nagykanizsa','NK',1099),(3044,'Nyiregyháza','NY',1099),(3045,'Pécs','PS',1099),(3046,'Salgótarján','ST',1099),(3047,'Sopron','SN',1099),(3048,'Szeged','SD',1099),(3049,'Székesfehérvár','SF',1099),(3050,'Szekszárd','SS',1099),(3051,'Szolnok','SK',1099),(3052,'Szombathely','SH',1099),(3053,'Tatabánya','TB',1099),(3054,'Zalaegerszeg','ZE',1099),(3055,'Bali','BA',1102),(3056,'Kepulauan Bangka Belitung','BB',1102),(3057,'Banten','BT',1102),(3058,'Bengkulu','BE',1102),(3059,'Gorontalo','GO',1102),(3060,'Papua Barat','PB',1102),(3061,'Jambi','JA',1102),(3062,'Jawa Barat','JB',1102),(3063,'Jawa Tengah','JT',1102),(3064,'Jawa Timur','JI',1102),(3065,'Kalimantan Barat','KB',1102),(3066,'Kalimantan Timur','KI',1102),(3067,'Kalimantan Selatan','KS',1102),(3068,'Kepulauan Riau','KR',1102),(3069,'Lampung','LA',1102),(3070,'Maluku','MA',1102),(3071,'Maluku Utara','MU',1102),(3072,'Nusa Tenggara Barat','NB',1102),(3073,'Nusa Tenggara Timur','NT',1102),(3074,'Papua','PA',1102),(3075,'Riau','RI',1102),(3076,'Sulawesi Selatan','SN',1102),(3077,'Sulawesi Tengah','ST',1102),(3078,'Sulawesi Tenggara','SG',1102),(3079,'Sulawesi Utara','SA',1102),(3080,'Sumatra Barat','SB',1102),(3081,'Sumatra Selatan','SS',1102),(3082,'Sumatera Utara','SU',1102),(3083,'DKI Jakarta','JK',1102),(3084,'Aceh','AC',1102),(3085,'DI Yogyakarta','YO',1102),(3086,'Cork','C',1105),(3087,'Clare','CE',1105),(3088,'Cavan','CN',1105),(3089,'Carlow','CW',1105),(3090,'Dublin','D',1105),(3091,'Donegal','DL',1105),(3092,'Galway','G',1105),(3093,'Kildare','KE',1105),(3094,'Kilkenny','KK',1105),(3095,'Kerry','KY',1105),(3096,'Longford','LD',1105),(3097,'Louth','LH',1105),(3098,'Limerick','LK',1105),(3099,'Leitrim','LM',1105),(3100,'Laois','LS',1105),(3101,'Meath','MH',1105),(3102,'Monaghan','MN',1105),(3103,'Mayo','MO',1105),(3104,'Offaly','OY',1105),(3105,'Roscommon','RN',1105),(3106,'Sligo','SO',1105),(3107,'Tipperary','TA',1105),(3108,'Waterford','WD',1105),(3109,'Westmeath','WH',1105),(3110,'Wicklow','WW',1105),(3111,'Wexford','WX',1105),(3112,'HaDarom','D',1106),(3113,'HaMerkaz','M',1106),(3114,'HaZafon','Z',1106),(3115,'Haifa','HA',1106),(3116,'Tel-Aviv','TA',1106),(3117,'Jerusalem','JM',1106),(3118,'Al Anbar','AN',1104),(3119,'Al Ba,rah','BA',1104),(3120,'Al Muthanna','MU',1104),(3121,'Al Qadisiyah','QA',1104),(3122,'An Najef','NA',1104),(3123,'Arbil','AR',1104),(3124,'As Sulaymaniyah','SW',1104),(3125,'At Ta\'mim','TS',1104),(3126,'Babil','BB',1104),(3127,'Baghdad','BG',1104),(3128,'Dahuk','DA',1104),(3129,'Dhi Qar','DQ',1104),(3130,'Diyala','DI',1104),(3131,'Karbala\'','KA',1104),(3132,'Maysan','MA',1104),(3133,'Ninawa','NI',1104),(3134,'Salah ad Din','SD',1104),(3135,'Wasit','WA',1104),(3136,'Ardabil','03',1103),(3137,'Azarbayjan-e Gharbi','02',1103),(3138,'Azarbayjan-e Sharqi','01',1103),(3139,'Bushehr','06',1103),(3140,'Chahar Mahall va Bakhtiari','08',1103),(3141,'Esfahan','04',1103),(3142,'Fars','14',1103),(3143,'Gilan','19',1103),(3144,'Golestan','27',1103),(3145,'Hamadan','24',1103),(3146,'Hormozgan','23',1103),(3147,'Iiam','05',1103),(3148,'Kerman','15',1103),(3149,'Kermanshah','17',1103),(3150,'Khorasan','09',1103),(3151,'Khuzestan','10',1103),(3152,'Kohjiluyeh va Buyer Ahmad','18',1103),(3153,'Kordestan','16',1103),(3154,'Lorestan','20',1103),(3155,'Markazi','22',1103),(3156,'Mazandaran','21',1103),(3157,'Qazvin','28',1103),(3158,'Qom','26',1103),(3159,'Semnan','12',1103),(3160,'Sistan va Baluchestan','13',1103),(3161,'Tehran','07',1103),(3162,'Yazd','25',1103),(3163,'Zanjan','11',1103),(3164,'Austurland','7',1100),(3165,'Hofuoborgarsvaeoi utan Reykjavikur','1',1100),(3166,'Norourland eystra','6',1100),(3167,'Norourland vestra','5',1100),(3168,'Reykjavik','0',1100),(3169,'Suourland','8',1100),(3170,'Suournes','2',1100),(3171,'Vestfirolr','4',1100),(3172,'Vesturland','3',1100),(3173,'Agrigento','AG',1107),(3174,'Alessandria','AL',1107),(3175,'Ancona','AN',1107),(3176,'Aosta','AO',1107),(3177,'Arezzo','AR',1107),(3178,'Ascoli Piceno','AP',1107),(3179,'Asti','AT',1107),(3180,'Avellino','AV',1107),(3181,'Bari','BA',1107),(3182,'Belluno','BL',1107),(3183,'Benevento','BN',1107),(3184,'Bergamo','BG',1107),(3185,'Biella','BI',1107),(3186,'Bologna','BO',1107),(3187,'Bolzano','BZ',1107),(3188,'Brescia','BS',1107),(3189,'Brindisi','BR',1107),(3190,'Cagliari','CA',1107),(3191,'Caltanissetta','CL',1107),(3192,'Campobasso','CB',1107),(3193,'Caserta','CE',1107),(3194,'Catania','CT',1107),(3195,'Catanzaro','CZ',1107),(3196,'Chieti','CH',1107),(3197,'Como','CO',1107),(3198,'Cosenza','CS',1107),(3199,'Cremona','CR',1107),(3200,'Crotone','KR',1107),(3201,'Cuneo','CN',1107),(3202,'Enna','EN',1107),(3203,'Ferrara','FE',1107),(3204,'Firenze','FI',1107),(3205,'Foggia','FG',1107),(3206,'Forlì-Cesena','FC',1107),(3207,'Frosinone','FR',1107),(3208,'Genova','GE',1107),(3209,'Gorizia','GO',1107),(3210,'Grosseto','GR',1107),(3211,'Imperia','IM',1107),(3212,'Isernia','IS',1107),(3213,'L\'Aquila','AQ',1107),(3214,'La Spezia','SP',1107),(3215,'Latina','LT',1107),(3216,'Lecce','LE',1107),(3217,'Lecco','LC',1107),(3218,'Livorno','LI',1107),(3219,'Lodi','LO',1107),(3220,'Lucca','LU',1107),(3221,'Macerata','MC',1107),(3222,'Mantova','MN',1107),(3223,'Massa-Carrara','MS',1107),(3224,'Matera','MT',1107),(3225,'Messina','ME',1107),(3226,'Milano','MI',1107),(3227,'Modena','MO',1107),(3228,'Napoli','NA',1107),(3229,'Novara','NO',1107),(3230,'Nuoro','NU',1107),(3231,'Oristano','OR',1107),(3232,'Padova','PD',1107),(3233,'Palermo','PA',1107),(3234,'Parma','PR',1107),(3235,'Pavia','PV',1107),(3236,'Perugia','PG',1107),(3237,'Pesaro e Urbino','PU',1107),(3238,'Pescara','PE',1107),(3239,'Piacenza','PC',1107),(3240,'Pisa','PI',1107),(3241,'Pistoia','PT',1107),(3242,'Pordenone','PN',1107),(3243,'Potenza','PZ',1107),(3244,'Prato','PO',1107),(3245,'Ragusa','RG',1107),(3246,'Ravenna','RA',1107),(3247,'Reggio Calabria','RC',1107),(3248,'Reggio Emilia','RE',1107),(3249,'Rieti','RI',1107),(3250,'Rimini','RN',1107),(3251,'Roma','RM',1107),(3252,'Rovigo','RO',1107),(3253,'Salerno','SA',1107),(3254,'Sassari','SS',1107),(3255,'Savona','SV',1107),(3256,'Siena','SI',1107),(3257,'Siracusa','SR',1107),(3258,'Sondrio','SO',1107),(3259,'Taranto','TA',1107),(3260,'Teramo','TE',1107),(3261,'Terni','TR',1107),(3262,'Torino','TO',1107),(3263,'Trapani','TP',1107),(3264,'Trento','TN',1107),(3265,'Treviso','TV',1107),(3266,'Trieste','TS',1107),(3267,'Udine','UD',1107),(3268,'Varese','VA',1107),(3269,'Venezia','VE',1107),(3270,'Verbano-Cusio-Ossola','VB',1107),(3271,'Vercelli','VC',1107),(3272,'Verona','VR',1107),(3273,'Vibo Valentia','VV',1107),(3274,'Vicenza','VI',1107),(3275,'Viterbo','VT',1107),(3276,'Aichi','23',1109),(3277,'Akita','05',1109),(3278,'Aomori','02',1109),(3279,'Chiba','12',1109),(3280,'Ehime','38',1109),(3281,'Fukui','18',1109),(3282,'Fukuoka','40',1109),(3283,'Fukusima','07',1109),(3284,'Gifu','21',1109),(3285,'Gunma','10',1109),(3286,'Hiroshima','34',1109),(3287,'Hokkaido','01',1109),(3288,'Hyogo','28',1109),(3289,'Ibaraki','08',1109),(3290,'Ishikawa','17',1109),(3291,'Iwate','03',1109),(3292,'Kagawa','37',1109),(3293,'Kagoshima','46',1109),(3294,'Kanagawa','14',1109),(3295,'Kochi','39',1109),(3296,'Kumamoto','43',1109),(3297,'Kyoto','26',1109),(3298,'Mie','24',1109),(3299,'Miyagi','04',1109),(3300,'Miyazaki','45',1109),(3301,'Nagano','20',1109),(3302,'Nagasaki','42',1109),(3303,'Nara','29',1109),(3304,'Niigata','15',1109),(3305,'Oita','44',1109),(3306,'Okayama','33',1109),(3307,'Okinawa','47',1109),(3308,'Osaka','27',1109),(3309,'Saga','41',1109),(3310,'Saitama','11',1109),(3311,'Shiga','25',1109),(3312,'Shimane','32',1109),(3313,'Shizuoka','22',1109),(3314,'Tochigi','09',1109),(3315,'Tokushima','36',1109),(3316,'Tokyo','13',1109),(3317,'Tottori','31',1109),(3318,'Toyama','16',1109),(3319,'Wakayama','30',1109),(3320,'Yamagata','06',1109),(3321,'Yamaguchi','35',1109),(3322,'Yamanashi','19',1109),(3323,'Clarendon','CN',1108),(3324,'Hanover','HR',1108),(3325,'Kingston','KN',1108),(3326,'Portland','PD',1108),(3327,'Saint Andrew','AW',1108),(3328,'Saint Ann','AN',1108),(3329,'Saint Catherine','CE',1108),(3330,'Saint Elizabeth','EH',1108),(3331,'Saint James','JS',1108),(3332,'Saint Mary','MY',1108),(3333,'Saint Thomas','TS',1108),(3334,'Trelawny','TY',1108),(3335,'Westmoreland','WD',1108),(3336,'Ajln','AJ',1110),(3337,'Al \'Aqaba','AQ',1110),(3338,'Al Balqa\'','BA',1110),(3339,'Al Karak','KA',1110),(3340,'Al Mafraq','MA',1110),(3341,'Amman','AM',1110),(3342,'At Tafilah','AT',1110),(3343,'Az Zarga','AZ',1110),(3344,'Irbid','JR',1110),(3345,'Jarash','JA',1110),(3346,'Ma\'an','MN',1110),(3347,'Madaba','MD',1110),(3353,'Bishkek','GB',1117),(3354,'Batken','B',1117),(3355,'Chu','C',1117),(3356,'Jalal-Abad','J',1117),(3357,'Naryn','N',1117),(3358,'Osh','O',1117),(3359,'Talas','T',1117),(3360,'Ysyk-Kol','Y',1117),(3361,'Krong Kaeb','23',1037),(3362,'Krong Pailin','24',1037),(3363,'Xrong Preah Sihanouk','18',1037),(3364,'Phnom Penh','12',1037),(3365,'Baat Dambang','2',1037),(3366,'Banteay Mean Chey','1',1037),(3367,'Rampong Chaam','3',1037),(3368,'Kampong Chhnang','4',1037),(3369,'Kampong Spueu','5',1037),(3370,'Kampong Thum','6',1037),(3371,'Kampot','7',1037),(3372,'Kandaal','8',1037),(3373,'Kach Kong','9',1037),(3374,'Krachoh','10',1037),(3375,'Mondol Kiri','11',1037),(3376,'Otdar Mean Chey','22',1037),(3377,'Pousaat','15',1037),(3378,'Preah Vihear','13',1037),(3379,'Prey Veaeng','14',1037),(3380,'Rotanak Kiri','16',1037),(3381,'Siem Reab','17',1037),(3382,'Stueng Traeng','19',1037),(3383,'Svaay Rieng','20',1037),(3384,'Taakaev','21',1037),(3385,'Gilbert Islands','G',1113),(3386,'Line Islands','L',1113),(3387,'Phoenix Islands','P',1113),(3388,'Anjouan Ndzouani','A',1049),(3389,'Grande Comore Ngazidja','G',1049),(3390,'Moheli Moili','M',1049),(3391,'Kaesong-si','KAE',1114),(3392,'Nampo-si','NAM',1114),(3393,'Pyongyang-ai','PYO',1114),(3394,'Chagang-do','CHA',1114),(3395,'Hamgyongbuk-do','HAB',1114),(3396,'Hamgyongnam-do','HAN',1114),(3397,'Hwanghaebuk-do','HWB',1114),(3398,'Hwanghaenam-do','HWN',1114),(3399,'Kangwon-do','KAN',1114),(3400,'Pyonganbuk-do','PYB',1114),(3401,'Pyongannam-do','PYN',1114),(3402,'Yanggang-do','YAN',1114),(3403,'Najin Sonbong-si','NAJ',1114),(3404,'Seoul Teugbyeolsi','11',1115),(3405,'Busan Gwang\'yeogsi','26',1115),(3406,'Daegu Gwang\'yeogsi','27',1115),(3407,'Daejeon Gwang\'yeogsi','30',1115),(3408,'Gwangju Gwang\'yeogsi','29',1115),(3409,'Incheon Gwang\'yeogsi','28',1115),(3410,'Ulsan Gwang\'yeogsi','31',1115),(3411,'Chungcheongbugdo','43',1115),(3412,'Chungcheongnamdo','44',1115),(3413,'Gang\'weondo','42',1115),(3414,'Gyeonggido','41',1115),(3415,'Gyeongsangbugdo','47',1115),(3416,'Gyeongsangnamdo','48',1115),(3417,'Jejudo','49',1115),(3418,'Jeonrabugdo','45',1115),(3419,'Jeonranamdo','46',1115),(3420,'Al Ahmadi','AH',1116),(3421,'Al Farwanlyah','FA',1116),(3422,'Al Jahrah','JA',1116),(3423,'Al Kuwayt','KU',1116),(3424,'Hawalli','HA',1116),(3425,'Almaty','ALA',1111),(3426,'Astana','AST',1111),(3427,'Almaty oblysy','ALM',1111),(3428,'Aqmola oblysy','AKM',1111),(3429,'Aqtobe oblysy','AKT',1111),(3430,'Atyrau oblyfiy','ATY',1111),(3431,'Batys Quzaqstan oblysy','ZAP',1111),(3432,'Mangghystau oblysy','MAN',1111),(3433,'Ongtustik Quzaqstan oblysy','YUZ',1111),(3434,'Pavlodar oblysy','PAV',1111),(3435,'Qaraghandy oblysy','KAR',1111),(3436,'Qostanay oblysy','KUS',1111),(3437,'Qyzylorda oblysy','KZY',1111),(3438,'Shyghys Quzaqstan oblysy','VOS',1111),(3439,'Soltustik Quzaqstan oblysy','SEV',1111),(3440,'Zhambyl oblysy Zhambylskaya oblast\'','ZHA',1111),(3441,'Vientiane','VT',1118),(3442,'Attapu','AT',1118),(3443,'Bokeo','BK',1118),(3444,'Bolikhamxai','BL',1118),(3445,'Champasak','CH',1118),(3446,'Houaphan','HO',1118),(3447,'Khammouan','KH',1118),(3448,'Louang Namtha','LM',1118),(3449,'Louangphabang','LP',1118),(3450,'Oudomxai','OU',1118),(3451,'Phongsali','PH',1118),(3452,'Salavan','SL',1118),(3453,'Savannakhet','SV',1118),(3454,'Xaignabouli','XA',1118),(3455,'Xiasomboun','XN',1118),(3456,'Xekong','XE',1118),(3457,'Xiangkhoang','XI',1118),(3458,'Beirut','BA',1120),(3459,'Beqaa','BI',1120),(3460,'Mount Lebanon','JL',1120),(3461,'North Lebanon','AS',1120),(3462,'South Lebanon','JA',1120),(3463,'Nabatieh','NA',1120),(3464,'Ampara','52',1199),(3465,'Anuradhapura','71',1199),(3466,'Badulla','81',1199),(3467,'Batticaloa','51',1199),(3468,'Colombo','11',1199),(3469,'Galle','31',1199),(3470,'Gampaha','12',1199),(3471,'Hambantota','33',1199),(3472,'Jaffna','41',1199),(3473,'Kalutara','13',1199),(3474,'Kandy','21',1199),(3475,'Kegalla','92',1199),(3476,'Kilinochchi','42',1199),(3477,'Kurunegala','61',1199),(3478,'Mannar','43',1199),(3479,'Matale','22',1199),(3480,'Matara','32',1199),(3481,'Monaragala','82',1199),(3482,'Mullaittivu','45',1199),(3483,'Nuwara Eliya','23',1199),(3484,'Polonnaruwa','72',1199),(3485,'Puttalum','62',1199),(3486,'Ratnapura','91',1199),(3487,'Trincomalee','53',1199),(3488,'VavunLya','44',1199),(3489,'Bomi','BM',1122),(3490,'Bong','BG',1122),(3491,'Grand Basaa','GB',1122),(3492,'Grand Cape Mount','CM',1122),(3493,'Grand Gedeh','GG',1122),(3494,'Grand Kru','GK',1122),(3495,'Lofa','LO',1122),(3496,'Margibi','MG',1122),(3497,'Maryland','MY',1122),(3498,'Montserrado','MO',1122),(3499,'Nimba','NI',1122),(3500,'Rivercess','RI',1122),(3501,'Sinoe','SI',1122),(3502,'Berea','D',1121),(3503,'Butha-Buthe','B',1121),(3504,'Leribe','C',1121),(3505,'Mafeteng','E',1121),(3506,'Maseru','A',1121),(3507,'Mohale\'s Hoek','F',1121),(3508,'Mokhotlong','J',1121),(3509,'Qacha\'s Nek','H',1121),(3510,'Quthing','G',1121),(3511,'Thaba-Tseka','K',1121),(3512,'Alytaus Apskritis','AL',1125),(3513,'Kauno Apskritis','KU',1125),(3514,'Klaipėdos Apskritis','KL',1125),(3515,'Marijampolės Apskritis','MR',1125),(3516,'Panevėžio Apskritis','PN',1125),(3517,'Šiaulių Apskritis','SA',1125),(3518,'Tauragės Apskritis','TA',1125),(3519,'Telšių Apskritis','TE',1125),(3520,'Utenos Apskritis','UT',1125),(3521,'Vilniaus Apskritis','VL',1125),(3522,'Diekirch','D',1126),(3523,'GreveNmacher','G',1126),(3550,'Daugavpils','DGV',1119),(3551,'Jelgava','JEL',1119),(3552,'Jūrmala','JUR',1119),(3553,'Liepāja','LPX',1119),(3554,'Rēzekne','REZ',1119),(3555,'Rīga','RIX',1119),(3556,'Ventspils','VEN',1119),(3557,'Ajdābiyā','AJ',1123),(3558,'Al Buţnān','BU',1123),(3559,'Al Hizām al Akhdar','HZ',1123),(3560,'Al Jabal al Akhdar','JA',1123),(3561,'Al Jifārah','JI',1123),(3562,'Al Jufrah','JU',1123),(3563,'Al Kufrah','KF',1123),(3564,'Al Marj','MJ',1123),(3565,'Al Marqab','MB',1123),(3566,'Al Qaţrūn','QT',1123),(3567,'Al Qubbah','QB',1123),(3568,'Al Wāhah','WA',1123),(3569,'An Nuqaţ al Khams','NQ',1123),(3570,'Ash Shāţi\'','SH',1123),(3571,'Az Zāwiyah','ZA',1123),(3572,'Banghāzī','BA',1123),(3573,'Banī Walīd','BW',1123),(3574,'Darnah','DR',1123),(3575,'Ghadāmis','GD',1123),(3576,'Gharyān','GR',1123),(3577,'Ghāt','GT',1123),(3578,'Jaghbūb','JB',1123),(3579,'Mişrātah','MI',1123),(3580,'Mizdah','MZ',1123),(3581,'Murzuq','MQ',1123),(3582,'Nālūt','NL',1123),(3583,'Sabhā','SB',1123),(3584,'Şabrātah Şurmān','SS',1123),(3585,'Surt','SR',1123),(3586,'Tājūrā\' wa an Nawāhī al Arbāh','TN',1123),(3587,'Ţarābulus','TB',1123),(3588,'Tarhūnah-Masallātah','TM',1123),(3589,'Wādī al hayāt','WD',1123),(3590,'Yafran-Jādū','YJ',1123),(3591,'Agadir','AGD',1146),(3592,'Aït Baha','BAH',1146),(3593,'Aït Melloul','MEL',1146),(3594,'Al Haouz','HAO',1146),(3595,'Al Hoceïma','HOC',1146),(3596,'Assa-Zag','ASZ',1146),(3597,'Azilal','AZI',1146),(3598,'Beni Mellal','BEM',1146),(3599,'Ben Sllmane','BES',1146),(3600,'Berkane','BER',1146),(3601,'Boujdour','BOD',1146),(3602,'Boulemane','BOM',1146),(3603,'Casablanca  [Dar el Beïda]','CAS',1146),(3604,'Chefchaouene','CHE',1146),(3605,'Chichaoua','CHI',1146),(3606,'El Hajeb','HAJ',1146),(3607,'El Jadida','JDI',1146),(3608,'Errachidia','ERR',1146),(3609,'Essaouira','ESI',1146),(3610,'Es Smara','ESM',1146),(3611,'Fès','FES',1146),(3612,'Figuig','FIG',1146),(3613,'Guelmim','GUE',1146),(3614,'Ifrane','IFR',1146),(3615,'Jerada','JRA',1146),(3616,'Kelaat Sraghna','KES',1146),(3617,'Kénitra','KEN',1146),(3618,'Khemisaet','KHE',1146),(3619,'Khenifra','KHN',1146),(3620,'Khouribga','KHO',1146),(3621,'Laâyoune (EH)','LAA',1146),(3622,'Larache','LAP',1146),(3623,'Marrakech','MAR',1146),(3624,'Meknsès','MEK',1146),(3625,'Nador','NAD',1146),(3626,'Ouarzazate','OUA',1146),(3627,'Oued ed Dahab (EH)','OUD',1146),(3628,'Oujda','OUJ',1146),(3629,'Rabat-Salé','RBA',1146),(3630,'Safi','SAF',1146),(3631,'Sefrou','SEF',1146),(3632,'Settat','SET',1146),(3633,'Sidl Kacem','SIK',1146),(3634,'Tanger','TNG',1146),(3635,'Tan-Tan','TNT',1146),(3636,'Taounate','TAO',1146),(3637,'Taroudannt','TAR',1146),(3638,'Tata','TAT',1146),(3639,'Taza','TAZ',1146),(3640,'Tétouan','TET',1146),(3641,'Tiznit','TIZ',1146),(3642,'Gagauzia, Unitate Teritoriala Autonoma','GA',1142),(3643,'Chisinau','CU',1142),(3644,'Stinga Nistrului, unitatea teritoriala din','SN',1142),(3645,'Balti','BA',1142),(3646,'Cahul','CA',1142),(3647,'Edinet','ED',1142),(3648,'Lapusna','LA',1142),(3649,'Orhei','OR',1142),(3650,'Soroca','SO',1142),(3651,'Taraclia','TA',1142),(3652,'Tighina [Bender]','TI',1142),(3653,'Ungheni','UN',1142),(3654,'Antananarivo','T',1129),(3655,'Antsiranana','D',1129),(3656,'Fianarantsoa','F',1129),(3657,'Mahajanga','M',1129),(3658,'Toamasina','A',1129),(3659,'Toliara','U',1129),(3660,'Ailinglapalap','ALL',1135),(3661,'Ailuk','ALK',1135),(3662,'Arno','ARN',1135),(3663,'Aur','AUR',1135),(3664,'Ebon','EBO',1135),(3665,'Eniwetok','ENI',1135),(3666,'Jaluit','JAL',1135),(3667,'Kili','KIL',1135),(3668,'Kwajalein','KWA',1135),(3669,'Lae','LAE',1135),(3670,'Lib','LIB',1135),(3671,'Likiep','LIK',1135),(3672,'Majuro','MAJ',1135),(3673,'Maloelap','MAL',1135),(3674,'Mejit','MEJ',1135),(3675,'Mili','MIL',1135),(3676,'Namorik','NMK',1135),(3677,'Namu','NMU',1135),(3678,'Rongelap','RON',1135),(3679,'Ujae','UJA',1135),(3680,'Ujelang','UJL',1135),(3681,'Utirik','UTI',1135),(3682,'Wotho','WTN',1135),(3683,'Wotje','WTJ',1135),(3684,'Bamako','BK0',1133),(3685,'Gao','7',1133),(3686,'Kayes','1',1133),(3687,'Kidal','8',1133),(3688,'Xoulikoro','2',1133),(3689,'Mopti','5',1133),(3690,'S69ou','4',1133),(3691,'Sikasso','3',1133),(3692,'Tombouctou','6',1133),(3693,'Ayeyarwady','07',1035),(3694,'Bago','02',1035),(3695,'Magway','03',1035),(3696,'Mandalay','04',1035),(3697,'Sagaing','01',1035),(3698,'Tanintharyi','05',1035),(3699,'Yangon','06',1035),(3700,'Chin','14',1035),(3701,'Kachin','11',1035),(3702,'Kayah','12',1035),(3703,'Kayin','13',1035),(3704,'Mon','15',1035),(3705,'Rakhine','16',1035),(3706,'Shan','17',1035),(3707,'Ulaanbaatar','1',1144),(3708,'Arhangay','073',1144),(3709,'Bayanhongor','069',1144),(3710,'Bayan-Olgiy','071',1144),(3711,'Bulgan','067',1144),(3712,'Darhan uul','037',1144),(3713,'Dornod','061',1144),(3714,'Dornogov,','063',1144),(3715,'DundgovL','059',1144),(3716,'Dzavhan','057',1144),(3717,'Govi-Altay','065',1144),(3718,'Govi-Smber','064',1144),(3719,'Hentiy','039',1144),(3720,'Hovd','043',1144),(3721,'Hovsgol','041',1144),(3722,'Omnogovi','053',1144),(3723,'Orhon','035',1144),(3724,'Ovorhangay','055',1144),(3725,'Selenge','049',1144),(3726,'Shbaatar','051',1144),(3727,'Tov','047',1144),(3728,'Uvs','046',1144),(3729,'Nouakchott','NKC',1137),(3730,'Assaba','03',1137),(3731,'Brakna','05',1137),(3732,'Dakhlet Nouadhibou','08',1137),(3733,'Gorgol','04',1137),(3734,'Guidimaka','10',1137),(3735,'Hodh ech Chargui','01',1137),(3736,'Hodh el Charbi','02',1137),(3737,'Inchiri','12',1137),(3738,'Tagant','09',1137),(3739,'Tiris Zemmour','11',1137),(3740,'Trarza','06',1137),(3741,'Beau Bassin-Rose Hill','BR',1138),(3742,'Curepipe','CU',1138),(3743,'Port Louis','PU',1138),(3744,'Quatre Bornes','QB',1138),(3745,'Vacosa-Phoenix','VP',1138),(3746,'Black River','BL',1138),(3747,'Flacq','FL',1138),(3748,'Grand Port','GP',1138),(3749,'Moka','MO',1138),(3750,'Pamplemousses','PA',1138),(3751,'Plaines Wilhems','PW',1138),(3752,'Riviere du Rempart','RP',1138),(3753,'Savanne','SA',1138),(3754,'Agalega Islands','AG',1138),(3755,'Cargados Carajos Shoals','CC',1138),(3756,'Rodrigues Island','RO',1138),(3757,'Male','MLE',1132),(3758,'Alif','02',1132),(3759,'Baa','20',1132),(3760,'Dhaalu','17',1132),(3761,'Faafu','14',1132),(3762,'Gaaf Alif','27',1132),(3763,'Gaefu Dhaalu','28',1132),(3764,'Gnaviyani','29',1132),(3765,'Haa Alif','07',1132),(3766,'Haa Dhaalu','23',1132),(3767,'Kaafu','26',1132),(3768,'Laamu','05',1132),(3769,'Lhaviyani','03',1132),(3770,'Meemu','12',1132),(3771,'Noonu','25',1132),(3772,'Raa','13',1132),(3773,'Seenu','01',1132),(3774,'Shaviyani','24',1132),(3775,'Thaa','08',1132),(3776,'Vaavu','04',1132),(3777,'Balaka','BA',1130),(3778,'Blantyre','BL',1130),(3779,'Chikwawa','CK',1130),(3780,'Chiradzulu','CR',1130),(3781,'Chitipa','CT',1130),(3782,'Dedza','DE',1130),(3783,'Dowa','DO',1130),(3784,'Karonga','KR',1130),(3785,'Kasungu','KS',1130),(3786,'Likoma Island','LK',1130),(3787,'Lilongwe','LI',1130),(3788,'Machinga','MH',1130),(3789,'Mangochi','MG',1130),(3790,'Mchinji','MC',1130),(3791,'Mulanje','MU',1130),(3792,'Mwanza','MW',1130),(3793,'Mzimba','MZ',1130),(3794,'Nkhata Bay','NB',1130),(3795,'Nkhotakota','NK',1130),(3796,'Nsanje','NS',1130),(3797,'Ntcheu','NU',1130),(3798,'Ntchisi','NI',1130),(3799,'Phalomba','PH',1130),(3800,'Rumphi','RU',1130),(3801,'Salima','SA',1130),(3802,'Thyolo','TH',1130),(3803,'Zomba','ZO',1130),(3804,'Aguascalientes','AGU',1140),(3805,'Baja California','BCN',1140),(3806,'Baja California Sur','BCS',1140),(3807,'Campeche','CAM',1140),(3808,'Coahuila','COA',1140),(3809,'Colima','COL',1140),(3810,'Chiapas','CHP',1140),(3811,'Chihuahua','CHH',1140),(3812,'Durango','DUR',1140),(3813,'Guanajuato','GUA',1140),(3814,'Guerrero','GRO',1140),(3815,'Hidalgo','HID',1140),(3816,'Jalisco','JAL',1140),(3817,'Mexico','MEX',1140),(3818,'Michoacin','MIC',1140),(3819,'Morelos','MOR',1140),(3820,'Nayarit','NAY',1140),(3821,'Nuevo Leon','NLE',1140),(3822,'Oaxaca','OAX',1140),(3823,'Puebla','PUE',1140),(3824,'Queretaro','QUE',1140),(3825,'Quintana Roo','ROO',1140),(3826,'San Luis Potosi','SLP',1140),(3827,'Sinaloa','SIN',1140),(3828,'Sonora','SON',1140),(3829,'Tabasco','TAB',1140),(3830,'Tamaulipas','TAM',1140),(3831,'Tlaxcala','TLA',1140),(3832,'Veracruz','VER',1140),(3833,'Yucatan','YUC',1140),(3834,'Zacatecas','ZAC',1140),(3835,'Wilayah Persekutuan Kuala Lumpur','14',1131),(3836,'Wilayah Persekutuan Labuan','15',1131),(3837,'Wilayah Persekutuan Putrajaya','16',1131),(3838,'Johor','01',1131),(3839,'Kedah','02',1131),(3840,'Kelantan','03',1131),(3841,'Melaka','04',1131),(3842,'Negeri Sembilan','05',1131),(3843,'Pahang','06',1131),(3844,'Perak','08',1131),(3845,'Perlis','09',1131),(3846,'Pulau Pinang','07',1131),(3847,'Sabah','12',1131),(3848,'Sarawak','13',1131),(3849,'Selangor','10',1131),(3850,'Terengganu','11',1131),(3851,'Maputo','MPM',1147),(3852,'Cabo Delgado','P',1147),(3853,'Gaza','G',1147),(3854,'Inhambane','I',1147),(3855,'Manica','B',1147),(3856,'Numpula','N',1147),(3857,'Niaaea','A',1147),(3858,'Sofala','S',1147),(3859,'Tete','T',1147),(3860,'Zambezia','Q',1147),(3861,'Caprivi','CA',1148),(3862,'Erongo','ER',1148),(3863,'Hardap','HA',1148),(3864,'Karas','KA',1148),(3865,'Khomas','KH',1148),(3866,'Kunene','KU',1148),(3867,'Ohangwena','OW',1148),(3868,'Okavango','OK',1148),(3869,'Omaheke','OH',1148),(3870,'Omusati','OS',1148),(3871,'Oshana','ON',1148),(3872,'Oshikoto','OT',1148),(3873,'Otjozondjupa','OD',1148),(3874,'Niamey','8',1156),(3875,'Agadez','1',1156),(3876,'Diffa','2',1156),(3877,'Dosso','3',1156),(3878,'Maradi','4',1156),(3879,'Tahoua','S',1156),(3880,'Tillaberi','6',1156),(3881,'Zinder','7',1156),(3882,'Abuja Federal Capital Territory','FC',1157),(3883,'Abia','AB',1157),(3884,'Adamawa','AD',1157),(3885,'Akwa Ibom','AK',1157),(3886,'Anambra','AN',1157),(3887,'Bauchi','BA',1157),(3888,'Bayelsa','BY',1157),(3889,'Benue','BE',1157),(3890,'Borno','BO',1157),(3891,'Cross River','CR',1157),(3892,'Delta','DE',1157),(3893,'Ebonyi','EB',1157),(3894,'Edo','ED',1157),(3895,'Ekiti','EK',1157),(3896,'Enugu','EN',1157),(3897,'Gombe','GO',1157),(3898,'Imo','IM',1157),(3899,'Jigawa','JI',1157),(3900,'Kaduna','KD',1157),(3901,'Kano','KN',1157),(3902,'Katsina','KT',1157),(3903,'Kebbi','KE',1157),(3904,'Kogi','KO',1157),(3905,'Kwara','KW',1157),(3906,'Lagos','LA',1157),(3907,'Nassarawa','NA',1157),(3908,'Niger','NI',1157),(3909,'Ogun','OG',1157),(3910,'Ondo','ON',1157),(3911,'Osun','OS',1157),(3912,'Oyo','OY',1157),(3913,'Rivers','RI',1157),(3914,'Sokoto','SO',1157),(3915,'Taraba','TA',1157),(3916,'Yobe','YO',1157),(3917,'Zamfara','ZA',1157),(3918,'Boaco','BO',1155),(3919,'Carazo','CA',1155),(3920,'Chinandega','CI',1155),(3921,'Chontales','CO',1155),(3922,'Esteli','ES',1155),(3923,'Jinotega','JI',1155),(3924,'Leon','LE',1155),(3925,'Madriz','MD',1155),(3926,'Managua','MN',1155),(3927,'Masaya','MS',1155),(3928,'Matagalpa','MT',1155),(3929,'Nueva Segovia','NS',1155),(3930,'Rio San Juan','SJ',1155),(3931,'Rivas','RI',1155),(3932,'Atlantico Norte','AN',1155),(3933,'Atlantico Sur','AS',1155),(3934,'Drente','DR',1152),(3935,'Flevoland','FL',1152),(3936,'Friesland','FR',1152),(3937,'Gelderland','GL',1152),(3938,'Groningen','GR',1152),(3939,'Noord-Brabant','NB',1152),(3940,'Noord-Holland','NH',1152),(3941,'Overijssel','OV',1152),(3942,'Utrecht','UT',1152),(3943,'Zuid-Holland','ZH',1152),(3944,'Zeeland','ZL',1152),(3945,'Akershus','02',1161),(3946,'Aust-Agder','09',1161),(3947,'Buskerud','06',1161),(3948,'Finnmark','20',1161),(3949,'Hedmark','04',1161),(3950,'Hordaland','12',1161),(3951,'Møre og Romsdal','15',1161),(3952,'Nordland','18',1161),(3953,'Nord-Trøndelag','17',1161),(3954,'Oppland','05',1161),(3955,'Oslo','03',1161),(3956,'Rogaland','11',1161),(3957,'Sogn og Fjordane','14',1161),(3958,'Sør-Trøndelag','16',1161),(3959,'Telemark','06',1161),(3960,'Troms','19',1161),(3961,'Vest-Agder','10',1161),(3962,'Vestfold','07',1161),(3963,'Østfold','01',1161),(3964,'Jan Mayen','22',1161),(3965,'Svalbard','21',1161),(3966,'Auckland','AUK',1154),(3967,'Bay of Plenty','BOP',1154),(3968,'Canterbury','CAN',1154),(3969,'Gisborne','GIS',1154),(3970,'Hawkes Bay','HKB',1154),(3971,'Manawatu-Wanganui','MWT',1154),(3972,'Marlborough','MBH',1154),(3973,'Nelson','NSN',1154),(3974,'Northland','NTL',1154),(3975,'Otago','OTA',1154),(3976,'Southland','STL',1154),(3977,'Taranaki','TKI',1154),(3978,'Tasman','TAS',1154),(3979,'Waikato','WKO',1154),(3980,'Wellington','WGN',1154),(3981,'West Coast','WTC',1154),(3982,'Ad Dakhillyah','DA',1162),(3983,'Al Batinah','BA',1162),(3984,'Al Janblyah','JA',1162),(3985,'Al Wusta','WU',1162),(3986,'Ash Sharqlyah','SH',1162),(3987,'Az Zahirah','ZA',1162),(3988,'Masqat','MA',1162),(3989,'Musandam','MU',1162),(3990,'Bocas del Toro','1',1166),(3991,'Cocle','2',1166),(3992,'Chiriqui','4',1166),(3993,'Darien','5',1166),(3994,'Herrera','6',1166),(3995,'Loa Santoa','7',1166),(3996,'Panama','8',1166),(3997,'Veraguas','9',1166),(3998,'Comarca de San Blas','Q',1166),(3999,'El Callao','CAL',1169),(4000,'Ancash','ANC',1169),(4001,'Apurimac','APU',1169),(4002,'Arequipa','ARE',1169),(4003,'Ayacucho','AYA',1169),(4004,'Cajamarca','CAJ',1169),(4005,'Cuzco','CUS',1169),(4006,'Huancavelica','HUV',1169),(4007,'Huanuco','HUC',1169),(4008,'Ica','ICA',1169),(4009,'Junin','JUN',1169),(4010,'La Libertad','LAL',1169),(4011,'Lambayeque','LAM',1169),(4012,'Lima','LIM',1169),(4013,'Loreto','LOR',1169),(4014,'Madre de Dios','MDD',1169),(4015,'Moquegua','MOQ',1169),(4016,'Pasco','PAS',1169),(4017,'Piura','PIU',1169),(4018,'Puno','PUN',1169),(4019,'San Martin','SAM',1169),(4020,'Tacna','TAC',1169),(4021,'Tumbes','TUM',1169),(4022,'Ucayali','UCA',1169),(4023,'National Capital District (Port Moresby)','NCD',1167),(4024,'Chimbu','CPK',1167),(4025,'Eastern Highlands','EHG',1167),(4026,'East New Britain','EBR',1167),(4027,'East Sepik','ESW',1167),(4028,'Enga','EPW',1167),(4029,'Gulf','GPK',1167),(4030,'Madang','MPM',1167),(4031,'Manus','MRL',1167),(4032,'Milne Bay','MBA',1167),(4033,'Morobe','MPL',1167),(4034,'New Ireland','NIK',1167),(4035,'North Solomons','NSA',1167),(4036,'Santaun','SAN',1167),(4037,'Southern Highlands','SHM',1167),(4038,'Western Highlands','WHM',1167),(4039,'West New Britain','WBK',1167),(4040,'Abra','ABR',1170),(4041,'Agusan del Norte','AGN',1170),(4042,'Agusan del Sur','AGS',1170),(4043,'Aklan','AKL',1170),(4044,'Albay','ALB',1170),(4045,'Antique','ANT',1170),(4046,'Apayao','APA',1170),(4047,'Aurora','AUR',1170),(4048,'Basilan','BAS',1170),(4049,'Bataan','BAN',1170),(4050,'Batanes','BTN',1170),(4051,'Batangas','BTG',1170),(4052,'Benguet','BEN',1170),(4053,'Biliran','BIL',1170),(4054,'Bohol','BOH',1170),(4055,'Bukidnon','BUK',1170),(4056,'Bulacan','BUL',1170),(4057,'Cagayan','CAG',1170),(4058,'Camarines Norte','CAN',1170),(4059,'Camarines Sur','CAS',1170),(4060,'Camiguin','CAM',1170),(4061,'Capiz','CAP',1170),(4062,'Catanduanes','CAT',1170),(4063,'Cavite','CAV',1170),(4064,'Cebu','CEB',1170),(4065,'Compostela Valley','COM',1170),(4066,'Davao','DAV',1170),(4067,'Davao del Sur','DAS',1170),(4068,'Davao Oriental','DAO',1170),(4069,'Eastern Samar','EAS',1170),(4070,'Guimaras','GUI',1170),(4071,'Ifugao','IFU',1170),(4072,'Ilocos Norte','ILN',1170),(4073,'Ilocos Sur','ILS',1170),(4074,'Iloilo','ILI',1170),(4075,'Isabela','ISA',1170),(4076,'Kalinga-Apayso','KAL',1170),(4077,'Laguna','LAG',1170),(4078,'Lanao del Norte','LAN',1170),(4079,'Lanao del Sur','LAS',1170),(4080,'La Union','LUN',1170),(4081,'Leyte','LEY',1170),(4082,'Maguindanao','MAG',1170),(4083,'Marinduque','MAD',1170),(4084,'Masbate','MAS',1170),(4085,'Mindoro Occidental','MDC',1170),(4086,'Mindoro Oriental','MDR',1170),(4087,'Misamis Occidental','MSC',1170),(4088,'Misamis Oriental','MSR',1170),(4089,'Mountain Province','MOU',1170),(4090,'Negroe Occidental','NEC',1170),(4091,'Negros Oriental','NER',1170),(4092,'North Cotabato','NCO',1170),(4093,'Northern Samar','NSA',1170),(4094,'Nueva Ecija','NUE',1170),(4095,'Nueva Vizcaya','NUV',1170),(4096,'Palawan','PLW',1170),(4097,'Pampanga','PAM',1170),(4098,'Pangasinan','PAN',1170),(4099,'Quezon','QUE',1170),(4100,'Quirino','QUI',1170),(4101,'Rizal','RIZ',1170),(4102,'Romblon','ROM',1170),(4103,'Sarangani','SAR',1170),(4104,'Siquijor','SIG',1170),(4105,'Sorsogon','SOR',1170),(4106,'South Cotabato','SCO',1170),(4107,'Southern Leyte','SLE',1170),(4108,'Sultan Kudarat','SUK',1170),(4109,'Sulu','SLU',1170),(4110,'Surigao del Norte','SUN',1170),(4111,'Surigao del Sur','SUR',1170),(4112,'Tarlac','TAR',1170),(4113,'Tawi-Tawi','TAW',1170),(4114,'Western Samar','WSA',1170),(4115,'Zambales','ZMB',1170),(4116,'Zamboanga del Norte','ZAN',1170),(4117,'Zamboanga del Sur','ZAS',1170),(4118,'Zamboanga Sibiguey','ZSI',1170),(4119,'Islamabad Federal Capital Area','IS',1163),(4120,'Baluchistan','BA',1163),(4121,'Khyber Pakhtun Khawa','NW',1163),(4122,'Sindh','SD',1163),(4123,'Federally Administered Tribal Areas','TA',1163),(4124,'Azad Kashmir','JK',1163),(4125,'Gilgit-Baltistan','NA',1163),(4126,'Aveiro','01',1173),(4127,'Beja','02',1173),(4128,'Braga','03',1173),(4129,'Bragança','04',1173),(4130,'Castelo Branco','05',1173),(4131,'Coimbra','06',1173),(4132,'Évora','07',1173),(4133,'Faro','08',1173),(4134,'Guarda','09',1173),(4135,'Leiria','10',1173),(4136,'Lisboa','11',1173),(4137,'Portalegre','12',1173),(4138,'Porto','13',1173),(4139,'Santarém','14',1173),(4140,'Setúbal','15',1173),(4141,'Viana do Castelo','16',1173),(4142,'Vila Real','17',1173),(4143,'Viseu','18',1173),(4144,'Região Autónoma dos Açores','20',1173),(4145,'Região Autónoma da Madeira','30',1173),(4146,'Asuncion','ASU',1168),(4147,'Alto Paraguay','16',1168),(4148,'Alto Parana','10',1168),(4149,'Amambay','13',1168),(4150,'Boqueron','19',1168),(4151,'Caeguazu','5',1168),(4152,'Caazapl','6',1168),(4153,'Canindeyu','14',1168),(4154,'Concepcion','1',1168),(4155,'Cordillera','3',1168),(4156,'Guaira','4',1168),(4157,'Itapua','7',1168),(4158,'Miaiones','8',1168),(4159,'Neembucu','12',1168),(4160,'Paraguari','9',1168),(4161,'Presidente Hayes','15',1168),(4162,'San Pedro','2',1168),(4163,'Ad Dawhah','DA',1175),(4164,'Al Ghuwayriyah','GH',1175),(4165,'Al Jumayliyah','JU',1175),(4166,'Al Khawr','KH',1175),(4167,'Al Wakrah','WA',1175),(4168,'Ar Rayyan','RA',1175),(4169,'Jariyan al Batnah','JB',1175),(4170,'Madinat ash Shamal','MS',1175),(4171,'Umm Salal','US',1175),(4172,'Bucuresti','B',1176),(4173,'Alba','AB',1176),(4174,'Arad','AR',1176),(4175,'Argeș','AG',1176),(4176,'Bacău','BC',1176),(4177,'Bihor','BH',1176),(4178,'Bistrița-Năsăud','BN',1176),(4179,'Botoșani','BT',1176),(4180,'Brașov','BV',1176),(4181,'Brăila','BR',1176),(4182,'Buzău','BZ',1176),(4183,'Caraș-Severin','CS',1176),(4184,'Călărași','CL',1176),(4185,'Cluj','CJ',1176),(4186,'Constanța','CT',1176),(4187,'Covasna','CV',1176),(4188,'Dâmbovița','DB',1176),(4189,'Dolj','DJ',1176),(4190,'Galați','GL',1176),(4191,'Giurgiu','GR',1176),(4192,'Gorj','GJ',1176),(4193,'Harghita','HR',1176),(4194,'Hunedoara','HD',1176),(4195,'Ialomița','IL',1176),(4196,'Iași','IS',1176),(4197,'Ilfov','IF',1176),(4198,'Maramureș','MM',1176),(4199,'Mehedinți','MH',1176),(4200,'Mureș','MS',1176),(4201,'Neamț','NT',1176),(4202,'Olt','OT',1176),(4203,'Prahova','PH',1176),(4204,'Satu Mare','SM',1176),(4205,'Sălaj','SJ',1176),(4206,'Sibiu','SB',1176),(4207,'Suceava','SV',1176),(4208,'Teleorman','TR',1176),(4209,'Timiș','TM',1176),(4210,'Tulcea','TL',1176),(4211,'Vaslui','VS',1176),(4212,'Vâlcea','VL',1176),(4213,'Vrancea','VN',1176),(4214,'Adygeya, Respublika','AD',1177),(4215,'Altay, Respublika','AL',1177),(4216,'Bashkortostan, Respublika','BA',1177),(4217,'Buryatiya, Respublika','BU',1177),(4218,'Chechenskaya Respublika','CE',1177),(4219,'Chuvashskaya Respublika','CU',1177),(4220,'Dagestan, Respublika','DA',1177),(4221,'Ingushskaya Respublika','IN',1177),(4222,'Kabardino-Balkarskaya','KB',1177),(4223,'Kalmykiya, Respublika','KL',1177),(4224,'Karachayevo-Cherkesskaya Respublika','KC',1177),(4225,'Kareliya, Respublika','KR',1177),(4226,'Khakasiya, Respublika','KK',1177),(4227,'Komi, Respublika','KO',1177),(4228,'Mariy El, Respublika','ME',1177),(4229,'Mordoviya, Respublika','MO',1177),(4230,'Sakha, Respublika [Yakutiya]','SA',1177),(4231,'Severnaya Osetiya, Respublika','SE',1177),(4232,'Tatarstan, Respublika','TA',1177),(4233,'Tyva, Respublika [Tuva]','TY',1177),(4234,'Udmurtskaya Respublika','UD',1177),(4235,'Altayskiy kray','ALT',1177),(4236,'Khabarovskiy kray','KHA',1177),(4237,'Krasnodarskiy kray','KDA',1177),(4238,'Krasnoyarskiy kray','KYA',1177),(4239,'Primorskiy kray','PRI',1177),(4240,'Stavropol\'skiy kray','STA',1177),(4241,'Amurskaya oblast\'','AMU',1177),(4242,'Arkhangel\'skaya oblast\'','ARK',1177),(4243,'Astrakhanskaya oblast\'','AST',1177),(4244,'Belgorodskaya oblast\'','BEL',1177),(4245,'Bryanskaya oblast\'','BRY',1177),(4246,'Chelyabinskaya oblast\'','CHE',1177),(4247,'Zabaykalsky Krai\'','ZSK',1177),(4248,'Irkutskaya oblast\'','IRK',1177),(4249,'Ivanovskaya oblast\'','IVA',1177),(4250,'Kaliningradskaya oblast\'','KGD',1177),(4251,'Kaluzhskaya oblast\'','KLU',1177),(4252,'Kamchatka Krai\'','KAM',1177),(4253,'Kemerovskaya oblast\'','KEM',1177),(4254,'Kirovskaya oblast\'','KIR',1177),(4255,'Kostromskaya oblast\'','KOS',1177),(4256,'Kurganskaya oblast\'','KGN',1177),(4257,'Kurskaya oblast\'','KRS',1177),(4258,'Leningradskaya oblast\'','LEN',1177),(4259,'Lipetskaya oblast\'','LIP',1177),(4260,'Magadanskaya oblast\'','MAG',1177),(4261,'Moskovskaya oblast\'','MOS',1177),(4262,'Murmanskaya oblast\'','MUR',1177),(4263,'Nizhegorodskaya oblast\'','NIZ',1177),(4264,'Novgorodskaya oblast\'','NGR',1177),(4265,'Novosibirskaya oblast\'','NVS',1177),(4266,'Omskaya oblast\'','OMS',1177),(4267,'Orenburgskaya oblast\'','ORE',1177),(4268,'Orlovskaya oblast\'','ORL',1177),(4269,'Penzenskaya oblast\'','PNZ',1177),(4270,'Perm krai\'','PEK',1177),(4271,'Pskovskaya oblast\'','PSK',1177),(4272,'Rostovskaya oblast\'','ROS',1177),(4273,'Ryazanskaya oblast\'','RYA',1177),(4274,'Sakhalinskaya oblast\'','SAK',1177),(4275,'Samarskaya oblast\'','SAM',1177),(4276,'Saratovskaya oblast\'','SAR',1177),(4277,'Smolenskaya oblast\'','SMO',1177),(4278,'Sverdlovskaya oblast\'','SVE',1177),(4279,'Tambovskaya oblast\'','TAM',1177),(4280,'Tomskaya oblast\'','TOM',1177),(4281,'Tul\'skaya oblast\'','TUL',1177),(4282,'Tverskaya oblast\'','TVE',1177),(4283,'Tyumenskaya oblast\'','TYU',1177),(4284,'Ul\'yanovskaya oblast\'','ULY',1177),(4285,'Vladimirskaya oblast\'','VLA',1177),(4286,'Volgogradskaya oblast\'','VGG',1177),(4287,'Vologodskaya oblast\'','VLG',1177),(4288,'Voronezhskaya oblast\'','VOR',1177),(4289,'Yaroslavskaya oblast\'','YAR',1177),(4290,'Moskva','MOW',1177),(4291,'Sankt-Peterburg','SPE',1177),(4292,'Yevreyskaya avtonomnaya oblast\'','YEV',1177),(4294,'Chukotskiy avtonomnyy okrug','CHU',1177),(4296,'Khanty-Mansiyskiy avtonomnyy okrug','KHM',1177),(4299,'Nenetskiy avtonomnyy okrug','NEN',1177),(4302,'Yamalo-Nenetskiy avtonomnyy okrug','YAN',1177),(4303,'Butare','C',1178),(4304,'Byumba','I',1178),(4305,'Cyangugu','E',1178),(4306,'Gikongoro','D',1178),(4307,'Gisenyi','G',1178),(4308,'Gitarama','B',1178),(4309,'Kibungo','J',1178),(4310,'Kibuye','F',1178),(4311,'Kigali-Rural Kigali y\' Icyaro','K',1178),(4312,'Kigali-Ville Kigali Ngari','L',1178),(4313,'Mutara','M',1178),(4314,'Ruhengeri','H',1178),(4315,'Al Bahah','11',1187),(4316,'Al Hudud Ash Shamaliyah','08',1187),(4317,'Al Jawf','12',1187),(4318,'Al Madinah','03',1187),(4319,'Al Qasim','05',1187),(4320,'Ar Riyad','01',1187),(4321,'Asir','14',1187),(4322,'Ha\'il','06',1187),(4323,'Jlzan','09',1187),(4324,'Makkah','02',1187),(4325,'Najran','10',1187),(4326,'Tabuk','07',1187),(4327,'Capital Territory (Honiara)','CT',1194),(4328,'Guadalcanal','GU',1194),(4329,'Isabel','IS',1194),(4330,'Makira','MK',1194),(4331,'Malaita','ML',1194),(4332,'Temotu','TE',1194),(4333,'A\'ali an Nil','23',1200),(4334,'Al Bah al Ahmar','26',1200),(4335,'Al Buhayrat','18',1200),(4336,'Al Jazirah','07',1200),(4337,'Al Khartum','03',1200),(4338,'Al Qadarif','06',1200),(4339,'Al Wahdah','22',1200),(4340,'An Nil','04',1200),(4341,'An Nil al Abyaq','08',1200),(4342,'An Nil al Azraq','24',1200),(4343,'Ash Shamallyah','01',1200),(4344,'Bahr al Jabal','17',1200),(4345,'Gharb al Istiwa\'iyah','16',1200),(4346,'Gharb Ba~r al Ghazal','14',1200),(4347,'Gharb Darfur','12',1200),(4348,'Gharb Kurdufan','10',1200),(4349,'Janub Darfur','11',1200),(4350,'Janub Rurdufan','13',1200),(4351,'Jnqall','20',1200),(4352,'Kassala','05',1200),(4353,'Shamal Batr al Ghazal','15',1200),(4354,'Shamal Darfur','02',1200),(4355,'Shamal Kurdufan','09',1200),(4356,'Sharq al Istiwa\'iyah','19',1200),(4357,'Sinnar','25',1200),(4358,'Warab','21',1200),(4359,'Blekinge län','K',1204),(4360,'Dalarnas län','W',1204),(4361,'Gotlands län','I',1204),(4362,'Gävleborgs län','X',1204),(4363,'Hallands län','N',1204),(4364,'Jämtlands län','Z',1204),(4365,'Jönkopings län','F',1204),(4366,'Kalmar län','H',1204),(4367,'Kronobergs län','G',1204),(4368,'Norrbottens län','BD',1204),(4369,'Skåne län','M',1204),(4370,'Stockholms län','AB',1204),(4371,'Södermanlands län','D',1204),(4372,'Uppsala län','C',1204),(4373,'Värmlands län','S',1204),(4374,'Västerbottens län','AC',1204),(4375,'Västernorrlands län','Y',1204),(4376,'Västmanlands län','U',1204),(4377,'Västra Götalands län','Q',1204),(4378,'Örebro län','T',1204),(4379,'Östergötlands län','E',1204),(4380,'Saint Helena','SH',1180),(4381,'Ascension','AC',1180),(4382,'Tristan da Cunha','TA',1180),(4383,'Ajdovščina','001',1193),(4384,'Beltinci','002',1193),(4385,'Benedikt','148',1193),(4386,'Bistrica ob Sotli','149',1193),(4387,'Bled','003',1193),(4388,'Bloke','150',1193),(4389,'Bohinj','004',1193),(4390,'Borovnica','005',1193),(4391,'Bovec','006',1193),(4392,'Braslovče','151',1193),(4393,'Brda','007',1193),(4394,'Brezovica','008',1193),(4395,'Brežice','009',1193),(4396,'Cankova','152',1193),(4397,'Celje','011',1193),(4398,'Cerklje na Gorenjskem','012',1193),(4399,'Cerknica','013',1193),(4400,'Cerkno','014',1193),(4401,'Cerkvenjak','153',1193),(4402,'Črenšovci','015',1193),(4403,'Črna na Koroškem','016',1193),(4404,'Črnomelj','017',1193),(4405,'Destrnik','018',1193),(4406,'Divača','019',1193),(4407,'Dobje','154',1193),(4408,'Dobrepolje','020',1193),(4409,'Dobrna','155',1193),(4410,'Dobrova-Polhov Gradec','021',1193),(4411,'Dobrovnik','156',1193),(4412,'Dol pri Ljubljani','022',1193),(4413,'Dolenjske Toplice','157',1193),(4414,'Domžale','023',1193),(4415,'Dornava','024',1193),(4416,'Dravograd','025',1193),(4417,'Duplek','026',1193),(4418,'Gorenja vas-Poljane','027',1193),(4419,'Gorišnica','028',1193),(4420,'Gornja Radgona','029',1193),(4421,'Gornji Grad','030',1193),(4422,'Gornji Petrovci','031',1193),(4423,'Grad','158',1193),(4424,'Grosuplje','032',1193),(4425,'Hajdina','159',1193),(4426,'Hoče-Slivnica','160',1193),(4427,'Hodoš','161',1193),(4428,'Horjul','162',1193),(4429,'Hrastnik','034',1193),(4430,'Hrpelje-Kozina','035',1193),(4431,'Idrija','036',1193),(4432,'Ig','037',1193),(4433,'Ilirska Bistrica','038',1193),(4434,'Ivančna Gorica','039',1193),(4435,'Izola','040',1193),(4436,'Jesenice','041',1193),(4437,'Jezersko','163',1193),(4438,'Juršinci','042',1193),(4439,'Kamnik','043',1193),(4440,'Kanal','044',1193),(4441,'Kidričevo','045',1193),(4442,'Kobarid','046',1193),(4443,'Kobilje','047',1193),(4444,'Kočevje','048',1193),(4445,'Komen','049',1193),(4446,'Komenda','164',1193),(4447,'Koper','050',1193),(4448,'Kostel','165',1193),(4449,'Kozje','051',1193),(4450,'Kranj','052',1193),(4451,'Kranjska Gora','053',1193),(4452,'Križevci','166',1193),(4453,'Krško','054',1193),(4454,'Kungota','055',1193),(4455,'Kuzma','056',1193),(4456,'Laško','057',1193),(4457,'Lenart','058',1193),(4458,'Lendava','059',1193),(4459,'Litija','060',1193),(4460,'Ljubljana','061',1193),(4461,'Ljubno','062',1193),(4462,'Ljutomer','063',1193),(4463,'Logatec','064',1193),(4464,'Loška dolina','065',1193),(4465,'Loški Potok','066',1193),(4466,'Lovrenc na Pohorju','167',1193),(4467,'Luče','067',1193),(4468,'Lukovica','068',1193),(4469,'Majšperk','069',1193),(4470,'Maribor','070',1193),(4471,'Markovci','168',1193),(4472,'Medvode','071',1193),(4473,'Mengeš','072',1193),(4474,'Metlika','073',1193),(4475,'Mežica','074',1193),(4476,'Miklavž na Dravskem polju','169',1193),(4477,'Miren-Kostanjevica','075',1193),(4478,'Mirna Peč','170',1193),(4479,'Mislinja','076',1193),(4480,'Moravče','077',1193),(4481,'Moravske Toplice','078',1193),(4482,'Mozirje','079',1193),(4483,'Murska Sobota','080',1193),(4484,'Muta','081',1193),(4485,'Naklo','082',1193),(4486,'Nazarje','083',1193),(4487,'Nova Gorica','084',1193),(4488,'Novo mesto','085',1193),(4489,'Sveta Ana','181',1193),(4490,'Sveti Andraž v Slovenskih goricah','182',1193),(4491,'Sveti Jurij','116',1193),(4492,'Šalovci','033',1193),(4493,'Šempeter-Vrtojba','183',1193),(4494,'Šenčur','117',1193),(4495,'Šentilj','118',1193),(4496,'Šentjernej','119',1193),(4497,'Šentjur','120',1193),(4498,'Škocjan','121',1193),(4499,'Škofja Loka','122',1193),(4500,'Škofljica','123',1193),(4501,'Šmarje pri Jelšah','124',1193),(4502,'Šmartno ob Paki','125',1193),(4503,'Šmartno pri Litiji','194',1193),(4504,'Šoštanj','126',1193),(4505,'Štore','127',1193),(4506,'Tabor','184',1193),(4507,'Tišina','010',1193),(4508,'Tolmin','128',1193),(4509,'Trbovlje','129',1193),(4510,'Trebnje','130',1193),(4511,'Trnovska vas','185',1193),(4512,'Tržič','131',1193),(4513,'Trzin','186',1193),(4514,'Turnišče','132',1193),(4515,'Velenje','133',1193),(4516,'Velika Polana','187',1193),(4517,'Velike Lašče','134',1193),(4518,'Veržej','188',1193),(4519,'Videm','135',1193),(4520,'Vipava','136',1193),(4521,'Vitanje','137',1193),(4522,'Vojnik','138',1193),(4523,'Vransko','189',1193),(4524,'Vrhnika','140',1193),(4525,'Vuzenica','141',1193),(4526,'Zagorje ob Savi','142',1193),(4527,'Zavrč','143',1193),(4528,'Zreče','144',1193),(4529,'Žalec','190',1193),(4530,'Železniki','146',1193),(4531,'Žetale','191',1193),(4532,'Žiri','147',1193),(4533,'Žirovnica','192',1193),(4534,'Žužemberk','193',1193),(4535,'Banskobystrický kraj','BC',1192),(4536,'Bratislavský kraj','BL',1192),(4537,'Košický kraj','KI',1192),(4538,'Nitriansky kraj','NJ',1192),(4539,'Prešovský kraj','PV',1192),(4540,'Trenčiansky kraj','TC',1192),(4541,'Trnavský kraj','TA',1192),(4542,'Žilinský kraj','ZI',1192),(4543,'Western Area (Freetown)','W',1190),(4544,'Dakar','DK',1188),(4545,'Diourbel','DB',1188),(4546,'Fatick','FK',1188),(4547,'Kaolack','KL',1188),(4548,'Kolda','KD',1188),(4549,'Louga','LG',1188),(4550,'Matam','MT',1188),(4551,'Saint-Louis','SL',1188),(4552,'Tambacounda','TC',1188),(4553,'Thies','TH',1188),(4554,'Ziguinchor','ZG',1188),(4555,'Awdal','AW',1195),(4556,'Bakool','BK',1195),(4557,'Banaadir','BN',1195),(4558,'Bay','BY',1195),(4559,'Galguduud','GA',1195),(4560,'Gedo','GE',1195),(4561,'Hiirsan','HI',1195),(4562,'Jubbada Dhexe','JD',1195),(4563,'Jubbada Hoose','JH',1195),(4564,'Mudug','MU',1195),(4565,'Nugaal','NU',1195),(4566,'Saneag','SA',1195),(4567,'Shabeellaha Dhexe','SD',1195),(4568,'Shabeellaha Hoose','SH',1195),(4569,'Sool','SO',1195),(4570,'Togdheer','TO',1195),(4571,'Woqooyi Galbeed','WO',1195),(4572,'Brokopondo','BR',1201),(4573,'Commewijne','CM',1201),(4574,'Coronie','CR',1201),(4575,'Marowijne','MA',1201),(4576,'Nickerie','NI',1201),(4577,'Paramaribo','PM',1201),(4578,'Saramacca','SA',1201),(4579,'Sipaliwini','SI',1201),(4580,'Wanica','WA',1201),(4581,'Principe','P',1207),(4582,'Sao Tome','S',1207),(4583,'Ahuachapan','AH',1066),(4584,'Cabanas','CA',1066),(4585,'Cuscatlan','CU',1066),(4586,'Chalatenango','CH',1066),(4587,'Morazan','MO',1066),(4588,'San Miguel','SM',1066),(4589,'San Salvador','SS',1066),(4590,'Santa Ana','SA',1066),(4591,'San Vicente','SV',1066),(4592,'Sonsonate','SO',1066),(4593,'Usulutan','US',1066),(4594,'Al Hasakah','HA',1206),(4595,'Al Ladhiqiyah','LA',1206),(4596,'Al Qunaytirah','QU',1206),(4597,'Ar Raqqah','RA',1206),(4598,'As Suwayda\'','SU',1206),(4599,'Dar\'a','DR',1206),(4600,'Dayr az Zawr','DY',1206),(4601,'Dimashq','DI',1206),(4602,'Halab','HL',1206),(4603,'Hamah','HM',1206),(4604,'Jim\'','HI',1206),(4605,'Idlib','ID',1206),(4606,'Rif Dimashq','RD',1206),(4607,'Tarts','TA',1206),(4608,'Hhohho','HH',1203),(4609,'Lubombo','LU',1203),(4610,'Manzini','MA',1203),(4611,'Shiselweni','SH',1203),(4612,'Batha','BA',1043),(4613,'Biltine','BI',1043),(4614,'Borkou-Ennedi-Tibesti','BET',1043),(4615,'Chari-Baguirmi','CB',1043),(4616,'Guera','GR',1043),(4617,'Kanem','KA',1043),(4618,'Lac','LC',1043),(4619,'Logone-Occidental','LO',1043),(4620,'Logone-Oriental','LR',1043),(4621,'Mayo-Kebbi','MK',1043),(4622,'Moyen-Chari','MC',1043),(4623,'Ouaddai','OD',1043),(4624,'Salamat','SA',1043),(4625,'Tandjile','TA',1043),(4626,'Kara','K',1214),(4627,'Maritime (Region)','M',1214),(4628,'Savannes','S',1214),(4629,'Krung Thep Maha Nakhon Bangkok','10',1211),(4630,'Phatthaya','S',1211),(4631,'Amnat Charoen','37',1211),(4632,'Ang Thong','15',1211),(4633,'Buri Ram','31',1211),(4634,'Chachoengsao','24',1211),(4635,'Chai Nat','18',1211),(4636,'Chaiyaphum','36',1211),(4637,'Chanthaburi','22',1211),(4638,'Chiang Mai','50',1211),(4639,'Chiang Rai','57',1211),(4640,'Chon Buri','20',1211),(4641,'Chumphon','86',1211),(4642,'Kalasin','46',1211),(4643,'Kamphasng Phet','62',1211),(4644,'Kanchanaburi','71',1211),(4645,'Khon Kaen','40',1211),(4646,'Krabi','81',1211),(4647,'Lampang','52',1211),(4648,'Lamphun','51',1211),(4649,'Loei','42',1211),(4650,'Lop Buri','16',1211),(4651,'Mae Hong Son','58',1211),(4652,'Maha Sarakham','44',1211),(4653,'Mukdahan','49',1211),(4654,'Nakhon Nayok','26',1211),(4655,'Nakhon Pathom','73',1211),(4656,'Nakhon Phanom','48',1211),(4657,'Nakhon Ratchasima','30',1211),(4658,'Nakhon Sawan','60',1211),(4659,'Nakhon Si Thammarat','80',1211),(4660,'Nan','55',1211),(4661,'Narathiwat','96',1211),(4662,'Nong Bua Lam Phu','39',1211),(4663,'Nong Khai','43',1211),(4664,'Nonthaburi','12',1211),(4665,'Pathum Thani','13',1211),(4666,'Pattani','94',1211),(4667,'Phangnga','82',1211),(4668,'Phatthalung','93',1211),(4669,'Phayao','56',1211),(4670,'Phetchabun','67',1211),(4671,'Phetchaburi','76',1211),(4672,'Phichit','66',1211),(4673,'Phitsanulok','65',1211),(4674,'Phrae','54',1211),(4675,'Phra Nakhon Si Ayutthaya','14',1211),(4676,'Phuket','83',1211),(4677,'Prachin Buri','25',1211),(4678,'Prachuap Khiri Khan','77',1211),(4679,'Ranong','85',1211),(4680,'Ratchaburi','70',1211),(4681,'Rayong','21',1211),(4682,'Roi Et','45',1211),(4683,'Sa Kaeo','27',1211),(4684,'Sakon Nakhon','47',1211),(4685,'Samut Prakan','11',1211),(4686,'Samut Sakhon','74',1211),(4687,'Samut Songkhram','75',1211),(4688,'Saraburi','19',1211),(4689,'Satun','91',1211),(4690,'Sing Buri','17',1211),(4691,'Si Sa Ket','33',1211),(4692,'Songkhla','90',1211),(4693,'Sukhothai','64',1211),(4694,'Suphan Buri','72',1211),(4695,'Surat Thani','84',1211),(4696,'Surin','32',1211),(4697,'Tak','63',1211),(4698,'Trang','92',1211),(4699,'Trat','23',1211),(4700,'Ubon Ratchathani','34',1211),(4701,'Udon Thani','41',1211),(4702,'Uthai Thani','61',1211),(4703,'Uttaradit','53',1211),(4704,'Yala','95',1211),(4705,'Yasothon','35',1211),(4706,'Sughd','SU',1209),(4707,'Khatlon','KT',1209),(4708,'Gorno-Badakhshan','GB',1209),(4709,'Ahal','A',1220),(4710,'Balkan','B',1220),(4711,'Dasoguz','D',1220),(4712,'Lebap','L',1220),(4713,'Mary','M',1220),(4714,'Béja','31',1218),(4715,'Ben Arous','13',1218),(4716,'Bizerte','23',1218),(4717,'Gabès','81',1218),(4718,'Gafsa','71',1218),(4719,'Jendouba','32',1218),(4720,'Kairouan','41',1218),(4721,'Rasserine','42',1218),(4722,'Kebili','73',1218),(4723,'L\'Ariana','12',1218),(4724,'Le Ref','33',1218),(4725,'Mahdia','53',1218),(4726,'La Manouba','14',1218),(4727,'Medenine','82',1218),(4728,'Moneatir','52',1218),(4729,'Naboul','21',1218),(4730,'Sfax','61',1218),(4731,'Sidi Bouxid','43',1218),(4732,'Siliana','34',1218),(4733,'Sousse','51',1218),(4734,'Tataouine','83',1218),(4735,'Tozeur','72',1218),(4736,'Tunis','11',1218),(4737,'Zaghouan','22',1218),(4738,'Adana','01',1219),(4739,'Ad yaman','02',1219),(4740,'Afyon','03',1219),(4741,'Ag r','04',1219),(4742,'Aksaray','68',1219),(4743,'Amasya','05',1219),(4744,'Ankara','06',1219),(4745,'Antalya','07',1219),(4746,'Ardahan','75',1219),(4747,'Artvin','08',1219),(4748,'Aydin','09',1219),(4749,'Bal kesir','10',1219),(4750,'Bartin','74',1219),(4751,'Batman','72',1219),(4752,'Bayburt','69',1219),(4753,'Bilecik','11',1219),(4754,'Bingol','12',1219),(4755,'Bitlis','13',1219),(4756,'Bolu','14',1219),(4757,'Burdur','15',1219),(4758,'Bursa','16',1219),(4759,'Canakkale','17',1219),(4760,'Cankir','18',1219),(4761,'Corum','19',1219),(4762,'Denizli','20',1219),(4763,'Diyarbakir','21',1219),(4764,'Duzce','81',1219),(4765,'Edirne','22',1219),(4766,'Elazig','23',1219),(4767,'Erzincan','24',1219),(4768,'Erzurum','25',1219),(4769,'Eskis\'ehir','26',1219),(4770,'Gaziantep','27',1219),(4771,'Giresun','28',1219),(4772,'Gms\'hane','29',1219),(4773,'Hakkari','30',1219),(4774,'Hatay','31',1219),(4775,'Igidir','76',1219),(4776,'Isparta','32',1219),(4777,'Icel','33',1219),(4778,'Istanbul','34',1219),(4779,'Izmir','35',1219),(4780,'Kahramanmaras','46',1219),(4781,'Karabk','78',1219),(4782,'Karaman','70',1219),(4783,'Kars','36',1219),(4784,'Kastamonu','37',1219),(4785,'Kayseri','38',1219),(4786,'Kirikkale','71',1219),(4787,'Kirklareli','39',1219),(4788,'Kirs\'ehir','40',1219),(4789,'Kilis','79',1219),(4790,'Kocaeli','41',1219),(4791,'Konya','42',1219),(4792,'Ktahya','43',1219),(4793,'Malatya','44',1219),(4794,'Manisa','45',1219),(4795,'Mardin','47',1219),(4796,'Mugila','48',1219),(4797,'Mus','49',1219),(4798,'Nevs\'ehir','50',1219),(4799,'Nigide','51',1219),(4800,'Ordu','52',1219),(4801,'Osmaniye','80',1219),(4802,'Rize','53',1219),(4803,'Sakarya','54',1219),(4804,'Samsun','55',1219),(4805,'Siirt','56',1219),(4806,'Sinop','57',1219),(4807,'Sivas','58',1219),(4808,'S\'anliurfa','63',1219),(4809,'S\'rnak','73',1219),(4810,'Tekirdag','59',1219),(4811,'Tokat','60',1219),(4812,'Trabzon','61',1219),(4813,'Tunceli','62',1219),(4814,'Us\'ak','64',1219),(4815,'Van','65',1219),(4816,'Yalova','77',1219),(4817,'Yozgat','66',1219),(4818,'Zonguldak','67',1219),(4819,'Couva-Tabaquite-Talparo','CTT',1217),(4820,'Diego Martin','DMN',1217),(4821,'Eastern Tobago','ETO',1217),(4822,'Penal-Debe','PED',1217),(4823,'Princes Town','PRT',1217),(4824,'Rio Claro-Mayaro','RCM',1217),(4825,'Sangre Grande','SGE',1217),(4826,'San Juan-Laventille','SJL',1217),(4827,'Siparia','SIP',1217),(4828,'Tunapuna-Piarco','TUP',1217),(4829,'Western Tobago','WTO',1217),(4830,'Arima','ARI',1217),(4831,'Chaguanas','CHA',1217),(4832,'Point Fortin','PTF',1217),(4833,'Port of Spain','POS',1217),(4834,'San Fernando','SFO',1217),(4835,'Aileu','AL',1063),(4836,'Ainaro','AN',1063),(4837,'Bacucau','BA',1063),(4838,'Bobonaro','BO',1063),(4839,'Cova Lima','CO',1063),(4840,'Dili','DI',1063),(4841,'Ermera','ER',1063),(4842,'Laulem','LA',1063),(4843,'Liquica','LI',1063),(4844,'Manatuto','MT',1063),(4845,'Manafahi','MF',1063),(4846,'Oecussi','OE',1063),(4847,'Viqueque','VI',1063),(4848,'Changhua County','CHA',1208),(4849,'Chiayi County','CYQ',1208),(4850,'Hsinchu County','HSQ',1208),(4851,'Hualien County','HUA',1208),(4852,'Ilan County','ILA',1208),(4853,'Kaohsiung County','KHQ',1208),(4854,'Miaoli County','MIA',1208),(4855,'Nantou County','NAN',1208),(4856,'Penghu County','PEN',1208),(4857,'Pingtung County','PIF',1208),(4858,'Taichung County','TXQ',1208),(4859,'Tainan County','TNQ',1208),(4860,'Taipei County','TPQ',1208),(4861,'Taitung County','TTT',1208),(4862,'Taoyuan County','TAO',1208),(4863,'Yunlin County','YUN',1208),(4864,'Keelung City','KEE',1208),(4865,'Arusha','01',1210),(4866,'Dar-es-Salaam','02',1210),(4867,'Dodoma','03',1210),(4868,'Iringa','04',1210),(4869,'Kagera','05',1210),(4870,'Kaskazini Pemba','06',1210),(4871,'Kaskazini Unguja','07',1210),(4872,'Xigoma','08',1210),(4873,'Kilimanjaro','09',1210),(4874,'Rusini Pemba','10',1210),(4875,'Kusini Unguja','11',1210),(4876,'Lindi','12',1210),(4877,'Manyara','26',1210),(4878,'Mara','13',1210),(4879,'Mbeya','14',1210),(4880,'Mjini Magharibi','15',1210),(4881,'Morogoro','16',1210),(4882,'Mtwara','17',1210),(4883,'Pwani','19',1210),(4884,'Rukwa','20',1210),(4885,'Ruvuma','21',1210),(4886,'Shinyanga','22',1210),(4887,'Singida','23',1210),(4888,'Tabora','24',1210),(4889,'Tanga','25',1210),(4890,'Cherkas\'ka Oblast\'','71',1224),(4891,'Chernihivs\'ka Oblast\'','74',1224),(4892,'Chernivets\'ka Oblast\'','77',1224),(4893,'Dnipropetrovs\'ka Oblast\'','12',1224),(4894,'Donets\'ka Oblast\'','14',1224),(4895,'Ivano-Frankivs\'ka Oblast\'','26',1224),(4896,'Kharkivs\'ka Oblast\'','63',1224),(4897,'Khersons\'ka Oblast\'','65',1224),(4898,'Khmel\'nyts\'ka Oblast\'','68',1224),(4899,'Kirovohrads\'ka Oblast\'','35',1224),(4900,'Kyivs\'ka Oblast\'','32',1224),(4901,'Luhans\'ka Oblast\'','09',1224),(4902,'L\'vivs\'ka Oblast\'','46',1224),(4903,'Mykolaivs\'ka Oblast\'','48',1224),(4904,'Odes \'ka Oblast\'','51',1224),(4905,'Poltavs\'ka Oblast\'','53',1224),(4906,'Rivnens\'ka Oblast\'','56',1224),(4907,'Sums \'ka Oblast\'','59',1224),(4908,'Ternopil\'s\'ka Oblast\'','61',1224),(4909,'Vinnyts\'ka Oblast\'','05',1224),(4910,'Volyos\'ka Oblast\'','07',1224),(4911,'Zakarpats\'ka Oblast\'','21',1224),(4912,'Zaporiz\'ka Oblast\'','23',1224),(4913,'Zhytomyrs\'ka Oblast\'','18',1224),(4914,'Respublika Krym','43',1224),(4915,'Kyiv','30',1224),(4916,'Sevastopol','40',1224),(4917,'Adjumani','301',1223),(4918,'Apac','302',1223),(4919,'Arua','303',1223),(4920,'Bugiri','201',1223),(4921,'Bundibugyo','401',1223),(4922,'Bushenyi','402',1223),(4923,'Busia','202',1223),(4924,'Gulu','304',1223),(4925,'Hoima','403',1223),(4926,'Iganga','203',1223),(4927,'Jinja','204',1223),(4928,'Kabale','404',1223),(4929,'Kabarole','405',1223),(4930,'Kaberamaido','213',1223),(4931,'Kalangala','101',1223),(4932,'Kampala','102',1223),(4933,'Kamuli','205',1223),(4934,'Kamwenge','413',1223),(4935,'Kanungu','414',1223),(4936,'Kapchorwa','206',1223),(4937,'Kasese','406',1223),(4938,'Katakwi','207',1223),(4939,'Kayunga','112',1223),(4940,'Kibaale','407',1223),(4941,'Kiboga','103',1223),(4942,'Kisoro','408',1223),(4943,'Kitgum','305',1223),(4944,'Kotido','306',1223),(4945,'Kumi','208',1223),(4946,'Kyenjojo','415',1223),(4947,'Lira','307',1223),(4948,'Luwero','104',1223),(4949,'Masaka','105',1223),(4950,'Masindi','409',1223),(4951,'Mayuge','214',1223),(4952,'Mbale','209',1223),(4953,'Mbarara','410',1223),(4954,'Moroto','308',1223),(4955,'Moyo','309',1223),(4956,'Mpigi','106',1223),(4957,'Mubende','107',1223),(4958,'Mukono','108',1223),(4959,'Nakapiripirit','311',1223),(4960,'Nakasongola','109',1223),(4961,'Nebbi','310',1223),(4962,'Ntungamo','411',1223),(4963,'Pader','312',1223),(4964,'Pallisa','210',1223),(4965,'Rakai','110',1223),(4966,'Rukungiri','412',1223),(4967,'Sembabule','111',1223),(4968,'Sironko','215',1223),(4969,'Soroti','211',1223),(4970,'Tororo','212',1223),(4971,'Wakiso','113',1223),(4972,'Yumbe','313',1223),(4973,'Baker Island','81',1227),(4974,'Howland Island','84',1227),(4975,'Jarvis Island','86',1227),(4976,'Johnston Atoll','67',1227),(4977,'Kingman Reef','89',1227),(4978,'Midway Islands','71',1227),(4979,'Navassa Island','76',1227),(4980,'Palmyra Atoll','95',1227),(4981,'Wake Island','79',1227),(4982,'Artigsa','AR',1229),(4983,'Canelones','CA',1229),(4984,'Cerro Largo','CL',1229),(4985,'Colonia','CO',1229),(4986,'Durazno','DU',1229),(4987,'Flores','FS',1229),(4988,'Lavalleja','LA',1229),(4989,'Maldonado','MA',1229),(4990,'Montevideo','MO',1229),(4991,'Paysandu','PA',1229),(4992,'Rivera','RV',1229),(4993,'Rocha','RO',1229),(4994,'Salto','SA',1229),(4995,'Soriano','SO',1229),(4996,'Tacuarembo','TA',1229),(4997,'Treinta y Tres','TT',1229),(4998,'Toshkent (city)','TK',1230),(4999,'Qoraqalpogiston Respublikasi','QR',1230),(5000,'Andijon','AN',1230),(5001,'Buxoro','BU',1230),(5002,'Farg\'ona','FA',1230),(5003,'Jizzax','JI',1230),(5004,'Khorazm','KH',1230),(5005,'Namangan','NG',1230),(5006,'Navoiy','NW',1230),(5007,'Qashqadaryo','QA',1230),(5008,'Samarqand','SA',1230),(5009,'Sirdaryo','SI',1230),(5010,'Surxondaryo','SU',1230),(5011,'Toshkent','TO',1230),(5012,'Xorazm','XO',1230),(5013,'Distrito Federal','A',1232),(5014,'Anzoategui','B',1232),(5015,'Apure','C',1232),(5016,'Aragua','D',1232),(5017,'Barinas','E',1232),(5018,'Carabobo','G',1232),(5019,'Cojedes','H',1232),(5020,'Falcon','I',1232),(5021,'Guarico','J',1232),(5022,'Lara','K',1232),(5023,'Merida','L',1232),(5024,'Miranda','M',1232),(5025,'Monagas','N',1232),(5026,'Nueva Esparta','O',1232),(5027,'Portuguesa','P',1232),(5028,'Tachira','S',1232),(5029,'Trujillo','T',1232),(5030,'Vargas','X',1232),(5031,'Yaracuy','U',1232),(5032,'Zulia','V',1232),(5033,'Delta Amacuro','Y',1232),(5034,'Dependencias Federales','W',1232),(5035,'An Giang','44',1233),(5036,'Ba Ria - Vung Tau','43',1233),(5037,'Bac Can','53',1233),(5038,'Bac Giang','54',1233),(5039,'Bac Lieu','55',1233),(5040,'Bac Ninh','56',1233),(5041,'Ben Tre','50',1233),(5042,'Binh Dinh','31',1233),(5043,'Binh Duong','57',1233),(5044,'Binh Phuoc','58',1233),(5045,'Binh Thuan','40',1233),(5046,'Ca Mau','59',1233),(5047,'Can Tho','48',1233),(5048,'Cao Bang','04',1233),(5049,'Da Nang, thanh pho','60',1233),(5050,'Dong Nai','39',1233),(5051,'Dong Thap','45',1233),(5052,'Gia Lai','30',1233),(5053,'Ha Giang','03',1233),(5054,'Ha Nam','63',1233),(5055,'Ha Noi, thu do','64',1233),(5056,'Ha Tay','15',1233),(5057,'Ha Tinh','23',1233),(5058,'Hai Duong','61',1233),(5059,'Hai Phong, thanh pho','62',1233),(5060,'Hoa Binh','14',1233),(5061,'Ho Chi Minh, thanh pho [Sai Gon]','65',1233),(5062,'Hung Yen','66',1233),(5063,'Khanh Hoa','34',1233),(5064,'Kien Giang','47',1233),(5065,'Kon Tum','28',1233),(5066,'Lai Chau','01',1233),(5067,'Lam Dong','35',1233),(5068,'Lang Son','09',1233),(5069,'Lao Cai','02',1233),(5070,'Long An','41',1233),(5071,'Nam Dinh','67',1233),(5072,'Nghe An','22',1233),(5073,'Ninh Binh','18',1233),(5074,'Ninh Thuan','36',1233),(5075,'Phu Tho','68',1233),(5076,'Phu Yen','32',1233),(5077,'Quang Binh','24',1233),(5078,'Quang Nam','27',1233),(5079,'Quang Ngai','29',1233),(5080,'Quang Ninh','13',1233),(5081,'Quang Tri','25',1233),(5082,'Soc Trang','52',1233),(5083,'Son La','05',1233),(5084,'Tay Ninh','37',1233),(5085,'Thai Binh','20',1233),(5086,'Thai Nguyen','69',1233),(5087,'Thanh Hoa','21',1233),(5088,'Thua Thien-Hue','26',1233),(5089,'Tien Giang','46',1233),(5090,'Tra Vinh','51',1233),(5091,'Tuyen Quang','07',1233),(5092,'Vinh Long','49',1233),(5093,'Vinh Phuc','70',1233),(5094,'Yen Bai','06',1233),(5095,'Malampa','MAP',1231),(5096,'Penama','PAM',1231),(5097,'Sanma','SAM',1231),(5098,'Shefa','SEE',1231),(5099,'Tafea','TAE',1231),(5100,'Torba','TOB',1231),(5101,'A\'ana','AA',1185),(5102,'Aiga-i-le-Tai','AL',1185),(5103,'Atua','AT',1185),(5104,'Fa\'aaaleleaga','FA',1185),(5105,'Gaga\'emauga','GE',1185),(5106,'Gagaifomauga','GI',1185),(5107,'Palauli','PA',1185),(5108,'Satupa\'itea','SA',1185),(5109,'Tuamasaga','TU',1185),(5110,'Va\'a-o-Fonoti','VF',1185),(5111,'Vaisigano','VS',1185),(5112,'Crna Gora','CG',1243),(5113,'Srbija','SR',1242),(5114,'Kosovo-Metohija','KM',1242),(5115,'Vojvodina','VO',1242),(5116,'Abyan','AB',1237),(5117,'Adan','AD',1237),(5118,'Ad Dali','DA',1237),(5119,'Al Bayda\'','BA',1237),(5120,'Al Hudaydah','MU',1237),(5121,'Al Mahrah','MR',1237),(5122,'Al Mahwit','MW',1237),(5123,'Amran','AM',1237),(5124,'Dhamar','DH',1237),(5125,'Hadramawt','HD',1237),(5126,'Hajjah','HJ',1237),(5127,'Ibb','IB',1237),(5128,'Lahij','LA',1237),(5129,'Ma\'rib','MA',1237),(5130,'Sa\'dah','SD',1237),(5131,'San\'a\'','SN',1237),(5132,'Shabwah','SH',1237),(5133,'Ta\'izz','TA',1237),(5134,'Eastern Cape','EC',1196),(5135,'Free State','FS',1196),(5136,'Gauteng','GT',1196),(5137,'Kwazulu-Natal','NL',1196),(5138,'Mpumalanga','MP',1196),(5139,'Northern Cape','NC',1196),(5140,'Limpopo','NP',1196),(5141,'Western Cape','WC',1196),(5142,'Copperbelt','08',1239),(5143,'Luapula','04',1239),(5144,'Lusaka','09',1239),(5145,'North-Western','06',1239),(5146,'Bulawayo','BU',1240),(5147,'Harare','HA',1240),(5148,'Manicaland','MA',1240),(5149,'Mashonaland Central','MC',1240),(5150,'Mashonaland East','ME',1240),(5151,'Mashonaland West','MW',1240),(5152,'Masvingo','MV',1240),(5153,'Matabeleland North','MN',1240),(5154,'Matabeleland South','MS',1240),(5155,'Midlands','MI',1240),(5156,'South Karelia','SK',1075),(5157,'South Ostrobothnia','SO',1075),(5158,'Etelä-Savo','ES',1075),(5159,'Häme','HH',1075),(5160,'Itä-Uusimaa','IU',1075),(5161,'Kainuu','KA',1075),(5162,'Central Ostrobothnia','CO',1075),(5163,'Central Finland','CF',1075),(5164,'Kymenlaakso','KY',1075),(5165,'Lapland','LA',1075),(5166,'Tampere Region','TR',1075),(5167,'Ostrobothnia','OB',1075),(5168,'North Karelia','NK',1075),(5169,'Northern Ostrobothnia','NO',1075),(5170,'Northern Savo','NS',1075),(5171,'Päijät-Häme','PH',1075),(5172,'Satakunta','SK',1075),(5173,'Uusimaa','UM',1075),(5174,'South-West Finland','SW',1075),(5175,'Åland','AL',1075),(5176,'Limburg','LI',1152),(5177,'Central and Western','CW',1098),(5178,'Eastern','EA',1098),(5179,'Southern','SO',1098),(5180,'Wan Chai','WC',1098),(5181,'Kowloon City','KC',1098),(5182,'Kwun Tong','KU',1098),(5183,'Sham Shui Po','SS',1098),(5184,'Wong Tai Sin','WT',1098),(5185,'Yau Tsim Mong','YT',1098),(5186,'Islands','IS',1098),(5187,'Kwai Tsing','KI',1098),(5188,'North','NO',1098),(5189,'Sai Kung','SK',1098),(5190,'Sha Tin','ST',1098),(5191,'Tai Po','TP',1098),(5192,'Tsuen Wan','TW',1098),(5193,'Tuen Mun','TM',1098),(5194,'Yuen Long','YL',1098),(5195,'Manchester','MR',1108),(5196,'Al Manāmah (Al ‘Āşimah)','13',1016),(5197,'Al Janūbīyah','14',1016),(5199,'Al Wusţá','16',1016),(5200,'Ash Shamālīyah','17',1016),(5201,'Jenin','_A',1165),(5202,'Tubas','_B',1165),(5203,'Tulkarm','_C',1165),(5204,'Nablus','_D',1165),(5205,'Qalqilya','_E',1165),(5206,'Salfit','_F',1165),(5207,'Ramallah and Al-Bireh','_G',1165),(5208,'Jericho','_H',1165),(5209,'Jerusalem','_I',1165),(5210,'Bethlehem','_J',1165),(5211,'Hebron','_K',1165),(5212,'North Gaza','_L',1165),(5213,'Gaza','_M',1165),(5214,'Deir el-Balah','_N',1165),(5215,'Khan Yunis','_O',1165),(5216,'Rafah','_P',1165),(5217,'Brussels','BRU',1020),(5218,'Distrito Federal','DIF',1140),(5219,'Taichung City','TXG',1208),(5220,'Kaohsiung City','KHH',1208),(5221,'Taipei City','TPE',1208),(5222,'Chiayi City','CYI',1208),(5223,'Hsinchu City','HSZ',1208),(5224,'Tainan City','TNN',1208),(9000,'North West','NW',1196),(9986,'Tyne and Wear','TWR',1226),(9988,'Greater Manchester','GTM',1226),(9989,'Co Tyrone','TYR',1226),(9990,'West Yorkshire','WYK',1226),(9991,'South Yorkshire','SYK',1226),(9992,'Merseyside','MSY',1226),(9993,'Berkshire','BRK',1226),(9994,'West Midlands','WMD',1226),(9998,'West Glamorgan','WGM',1226),(9999,'London','LON',1226),(10000,'Carbonia-Iglesias','CI',1107),(10001,'Olbia-Tempio','OT',1107),(10002,'Medio Campidano','VS',1107),(10003,'Ogliastra','OG',1107),(10009,'Jura','39',1076),(10010,'Barletta-Andria-Trani','Bar',1107),(10011,'Fermo','Fer',1107),(10012,'Monza e Brianza','Mon',1107),(10013,'Clwyd','CWD',1226),(10014,'Dyfed','DFD',1226),(10015,'South Glamorgan','SGM',1226),(10016,'Artibonite','AR',1094),(10017,'Centre','CE',1094),(10018,'Nippes','NI',1094),(10019,'Nord','ND',1094),(10020,'La Rioja','F',1010),(10021,'Andorra la Vella','07',1005),(10022,'Canillo','02',1005),(10023,'Encamp','03',1005),(10024,'Escaldes-Engordany','08',1005),(10025,'La Massana','04',1005),(10026,'Ordino','05',1005),(10027,'Sant Julia de Loria','06',1005),(10028,'Abaco Islands','AB',1212),(10029,'Andros Island','AN',1212),(10030,'Berry Islands','BR',1212),(10031,'Eleuthera','EL',1212),(10032,'Grand Bahama','GB',1212),(10033,'Rum Cay','RC',1212),(10034,'San Salvador Island','SS',1212),(10035,'Kongo central','01',1050),(10036,'Kwango','02',1050),(10037,'Kwilu','03',1050),(10038,'Mai-Ndombe','04',1050),(10039,'Kasai','05',1050),(10040,'Lulua','06',1050),(10041,'Lomami','07',1050),(10042,'Sankuru','08',1050),(10043,'Ituri','09',1050),(10044,'Haut-Uele','10',1050),(10045,'Tshopo','11',1050),(10046,'Bas-Uele','12',1050),(10047,'Nord-Ubangi','13',1050),(10048,'Mongala','14',1050),(10049,'Sud-Ubangi','15',1050),(10050,'Tshuapa','16',1050),(10051,'Haut-Lomami','17',1050),(10052,'Lualaba','18',1050),(10053,'Haut-Katanga','19',1050),(10054,'Tanganyika','20',1050),(10055,'Toledo','TO',1198),(10056,'Córdoba','CO',1198),(10057,'Metropolitan Manila','MNL',1170),(10058,'La Paz','LP',1097),(10059,'Yinchuan','YN',1045),(10060,'Shizuishan','SZ',1045),(10061,'Wuzhong','WZ',1045),(10062,'Guyuan','GY',1045),(10063,'Zhongwei','ZW',1045),(10064,'Luxembourg','L',1126),(10065,'Aizkraukles novads','002',1119),(10066,'Jaunjelgavas novads','038',1119),(10067,'Pļaviņu novads','072',1119),(10068,'Kokneses novads','046',1119),(10069,'Neretas novads','065',1119),(10070,'Skrīveru novads','092',1119),(10071,'Alūksnes novads','007',1119),(10072,'Apes novads','009',1119),(10073,'Balvu novads','015',1119),(10074,'Viļakas novads','108',1119),(10075,'Baltinavas novads','014',1119),(10076,'Rugāju novads','082',1119),(10077,'Bauskas novads','016',1119),(10078,'Iecavas novads','034',1119),(10079,'Rundāles novads','083',1119),(10080,'Vecumnieku novads','105',1119),(10081,'Cēsu novads','022',1119),(10082,'Līgatnes novads','055',1119),(10083,'Amatas novads','008',1119),(10084,'Jaunpiebalgas novads','039',1119),(10085,'Priekuļu novads','075',1119),(10086,'Pārgaujas novads','070',1119),(10087,'Raunas novads','076',1119),(10088,'Vecpiebalgas novads','104',1119),(10089,'Daugavpils novads','025',1119),(10090,'Ilūkstes novads','036',1119),(10091,'Dobeles novads','026',1119),(10092,'Auces novads','010',1119),(10093,'Tērvetes novads','098',1119),(10094,'Gulbenes novads','033',1119),(10095,'Jelgavas novads','041',1119),(10096,'Ozolnieku novads','069',1119),(10097,'Jēkabpils novads','042',1119),(10098,'Aknīstes novads','004',1119),(10099,'Viesītes novads','107',1119),(10100,'Krustpils novads','049',1119),(10101,'Salas novads','085',1119),(10102,'Krāslavas novads','047',1119),(10103,'Dagdas novads','024',1119),(10104,'Aglonas novads','001',1119),(10105,'Kuldīgas novads','050',1119),(10106,'Skrundas novads','093',1119),(10107,'Alsungas novads','006',1119),(10108,'Aizputes novads','003',1119),(10109,'Durbes novads','028',1119),(10110,'Grobiņas novads','032',1119),(10111,'Pāvilostas novads','071',1119),(10112,'Priekules novads','074',1119),(10113,'Nīcas novads','066',1119),(10114,'Rucavas novads','081',1119),(10115,'Vaiņodes novads','100',1119),(10116,'Limbažu novads','054',1119),(10117,'Alojas novads','005',1119),(10118,'Salacgrīvas novads','086',1119),(10119,'Ludzas novads','058',1119),(10120,'Kārsavas novads','044',1119),(10121,'Zilupes novads','110',1119),(10122,'Ciblas novads','023',1119),(10123,'Madonas novads','059',1119),(10124,'Cesvaines novads','021',1119),(10125,'Lubānas novads','057',1119),(10126,'Varakļānu novads','102',1119),(10127,'Ērgļu novads','030',1119),(10128,'Ogres novads','067',1119),(10129,'Ikšķiles novads','035',1119),(10130,'Ķeguma novads','051',1119),(10131,'Lielvārdes novads','053',1119),(10132,'Preiļu novads','073',1119),(10133,'Līvānu novads','056',1119),(10134,'Riebiņu novads','078',1119),(10135,'Vārkavas novads','103',1119),(10136,'Rēzeknes novads','077',1119),(10137,'Viļānu novads','109',1119),(10138,'Baldones novads','013',1119),(10139,'Ķekavas novads','052',1119),(10140,'Olaines novads','068',1119),(10141,'Salaspils novads','087',1119),(10142,'Saulkrastu novads','089',1119),(10143,'Siguldas novads','091',1119),(10144,'Inčukalna novads','037',1119),(10145,'Ādažu novads','011',1119),(10146,'Babītes novads','012',1119),(10147,'Carnikavas novads','020',1119),(10148,'Garkalnes novads','031',1119),(10149,'Krimuldas novads','048',1119),(10150,'Mālpils novads','061',1119),(10151,'Mārupes novads','062',1119),(10152,'Ropažu novads','080',1119),(10153,'Sējas novads','090',1119),(10154,'Stopiņu novads','095',1119),(10155,'Saldus novads','088',1119),(10156,'Brocēnu novads','018',1119),(10157,'Talsu novads','097',1119),(10158,'Dundagas novads','027',1119),(10159,'Mērsraga novads','063',1119),(10160,'Rojas novads','079',1119),(10161,'Tukuma novads','099',1119),(10162,'Kandavas novads','043',1119),(10163,'Engures novads','029',1119),(10164,'Jaunpils novads','040',1119),(10165,'Valkas novads','101',1119),(10166,'Smiltenes novads','094',1119),(10167,'Strenču novads','096',1119),(10168,'Kocēnu novads','045',1119),(10169,'Mazsalacas novads','060',1119),(10170,'Rūjienas novads','084',1119),(10171,'Beverīnas novads','017',1119),(10172,'Burtnieku novads','019',1119),(10173,'Naukšēnu novads','064',1119),(10174,'Ventspils novads','106',1119),(10175,'Jēkabpils','JKB',1119),(10176,'Valmiera','VMR',1119),(10177,'Florida','FL',1229),(10178,'Rio Negro','RN',1229),(10179,'San Jose','SJ',1229),(10180,'Plateau','PL',1157),(10181,'Pieria','61',1085),(10182,'Los Rios','LR',1044),(10183,'Arica y Parinacota','AP',1044),(10184,'Amazonas','AMA',1169),(10185,'Kalimantan Tengah','KT',1102),(10186,'Sulawesi Barat','SR',1102),(10187,'Kalimantan Utara','KU',1102),(10188,'Ankaran','86',1193),(10189,'Apače','87',1193),(10190,'Cirkulane','88',1193),(10191,'Gorje','89',1193),(10192,'Kostanjevica na Krki','90',1193),(10193,'Log-Dragomer','91',1193),(10194,'Makole','92',1193),(10195,'Mirna','93',1193),(10196,'Mokronog-Trebelno','94',1193),(10197,'Odranci','95',1193),(10198,'Oplotnica','96',1193),(10199,'Ormož','97',1193),(10200,'Osilnica','98',1193),(10201,'Pesnica','99',1193),(10202,'Piran','100',1193),(10203,'Pivka','101',1193),(10204,'Podčetrtek','102',1193),(10205,'Podlehnik','103',1193),(10206,'Podvelka','104',1193),(10207,'Poljčane','105',1193),(10208,'Polzela','106',1193),(10209,'Postojna','107',1193),(10210,'Prebold','108',1193),(10211,'Preddvor','109',1193),(10212,'Prevalje','110',1193),(10213,'Ptuj','111',1193),(10214,'Puconci','112',1193),(10215,'Rače-Fram','113',1193),(10216,'Radeče','114',1193),(10217,'Radenci','115',1193),(10218,'Radlje ob Dravi','139',1193),(10219,'Radovljica','145',1193),(10220,'Ravne na Koroškem','171',1193),(10221,'Razkrižje','172',1193),(10222,'Rečica ob Savinji','173',1193),(10223,'Renče-Vogrsko','174',1193),(10224,'Ribnica','175',1193),(10225,'Ribnica na Pohorju','176',1193),(10226,'Rogaška Slatina','177',1193),(10227,'Rogašovci','178',1193),(10228,'Rogatec','179',1193),(10229,'Ruše','180',1193),(10230,'Selnica ob Dravi','195',1193),(10231,'Semič','196',1193),(10232,'Šentrupert','197',1193),(10233,'Sevnica','198',1193),(10234,'Sežana','199',1193),(10235,'Slovenj Gradec','200',1193),(10236,'Slovenska Bistrica','201',1193),(10237,'Slovenske Konjice','202',1193),(10238,'Šmarješke Toplice','203',1193),(10239,'Sodražica','204',1193),(10240,'Solčava','205',1193),(10241,'Središče ob Dravi','206',1193),(10242,'Starše','207',1193),(10243,'Straža','208',1193),(10244,'Sveta Trojica v Slovenskih goricah','209',1193),(10245,'Sveti Jurij v Slovenskih goricah','210',1193),(10246,'Sveti Tomaž','211',1193),(10247,'Vodice','212',1193),(10248,'Abkhazia','AB',1081),(10249,'Adjara','AJ',1081),(10250,'Tbilisi','TB',1081),(10251,'Guria','GU',1081),(10252,'Imereti','IM',1081),(10253,'Kakheti','KA',1081),(10254,'Kvemo Kartli','KK',1081),(10255,'Mtskheta-Mtianeti','MM',1081),(10256,'Racha-Lechkhumi and Kvemo Svaneti','RL',1081),(10257,'Samegrelo-Zemo Svaneti','SZ',1081),(10258,'Samtskhe-Javakheti','SJ',1081),(10259,'Shida Kartli','SK',1081),(10260,'Central','C',1074),(10261,'Punjab','PB',1163),(10262,'La Libertad','LI',1066),(10263,'La Paz','PA',1066),(10264,'La Union','UN',1066),(10265,'Littoral','LT',1038),(10266,'Nord-Ouest','NW',1038),(10267,'Telangana','TG',1101),(10268,'Ash Sharqiyah','04',1187),(10269,'Guadeloupe','GP',1076),(10270,'Martinique','MQ',1076),(10271,'Guyane','GF',1076),(10272,'La Réunion','RE',1076),(10273,'Mayotte','YT',1076),(10274,'Baringo','01',1112),(10275,'Bomet','02',1112),(10276,'Bungoma','03',1112),(10277,'Busia','04',1112),(10278,'Elgeyo/Marakwet','05',1112),(10279,'Embu','06',1112),(10280,'Garissa','07',1112),(10281,'Homa Bay','08',1112),(10282,'Isiolo','09',1112),(10283,'Kajiado','10',1112),(10284,'Kakamega','11',1112),(10285,'Kericho','12',1112),(10286,'Kiambu','13',1112),(10287,'Kilifi','14',1112),(10288,'Kirinyaga','15',1112),(10289,'Kisii','16',1112),(10290,'Kisumu','17',1112),(10291,'Kitui','18',1112),(10292,'Kwale','19',1112),(10293,'Laikipia','20',1112),(10294,'Lamu','21',1112),(10295,'Machakos','22',1112),(10296,'Makueni','23',1112),(10297,'Mandera','24',1112),(10298,'Marsabit','25',1112),(10299,'Meru','26',1112),(10300,'Migori','27',1112),(10301,'Mombasa','28',1112),(10302,'Murang\'a','29',1112),(10303,'Nairobi City','30',1112),(10304,'Nakuru','31',1112),(10305,'Nandi','32',1112),(10306,'Narok','33',1112),(10307,'Nyamira','34',1112),(10308,'Nyandarua','35',1112),(10309,'Nyeri','36',1112),(10310,'Samburu','37',1112),(10311,'Siaya','38',1112),(10312,'Taita/Taveta','39',1112),(10313,'Tana River','40',1112),(10314,'Tharaka-Nithi','41',1112),(10315,'Trans Nzoia','42',1112),(10316,'Turkana','43',1112),(10317,'Uasin Gishu','44',1112),(10318,'Vihiga','45',1112),(10319,'Wajir','46',1112),(10320,'West Pokot','47',1112),(10321,'Chandigarh','CH',1101),(10322,'Central','CP',1083),(10323,'Eastern','EP',1083),(10324,'Northern','NP',1083),(10325,'Western','WP',1083),(10326,'Saint Kitts','K',1181),(10327,'Nevis','N',1181),(10328,'Eastern','E',1190),(10329,'Northern','N',1190),(10330,'Southern','S',1190),(10331,'Dushanbe','DU',1209),(10332,'Nohiyahoi Tobei Jumhurí','RA',1209),(10333,'Wallis-et-Futuna','WF',1076),(10334,'Nouvelle-Calédonie','NC',1076),(10335,'Haute-Marne','52',1076),(10336,'Saint George','03',1009),(10337,'Saint John','04',1009),(10338,'Saint Mary','05',1009),(10339,'Saint Paul','06',1009),(10340,'Saint Peter','07',1009),(10341,'Saint Philip','08',1009),(10342,'Barbuda','10',1009),(10343,'Redonda','11',1009),(10344,'Christ Church','01',1018),(10345,'Saint Andrew','02',1018),(10346,'Saint George','03',1018),(10347,'Saint James','04',1018),(10348,'Saint John','05',1018),(10349,'Saint Joseph','06',1018),(10350,'Saint Lucy','07',1018),(10351,'Saint Michael','08',1018),(10352,'Saint Peter','09',1018),(10353,'Saint Philip','10',1018),(10354,'Saint Thomas','11',1018),(10355,'Estuaire','01',1080),(10356,'Haut-Ogooué','02',1080),(10357,'Moyen-Ogooué','03',1080),(10358,'Ngounié','04',1080),(10359,'Nyanga','05',1080),(10360,'Ogooué-Ivindo','06',1080),(10361,'Ogooué-Lolo','07',1080),(10362,'Ogooué-Maritime','08',1080),(10363,'Woleu-Ntem','09',1080),(10364,'Monmouthshire','MON',1226);
+INSERT INTO `civicrm_state_province` (`id`, `name`, `abbreviation`, `country_id`) VALUES (1000,'Alabama','AL',1228),(1001,'Alaska','AK',1228),(1002,'Arizona','AZ',1228),(1003,'Arkansas','AR',1228),(1004,'California','CA',1228),(1005,'Colorado','CO',1228),(1006,'Connecticut','CT',1228),(1007,'Delaware','DE',1228),(1008,'Florida','FL',1228),(1009,'Georgia','GA',1228),(1010,'Hawaii','HI',1228),(1011,'Idaho','ID',1228),(1012,'Illinois','IL',1228),(1013,'Indiana','IN',1228),(1014,'Iowa','IA',1228),(1015,'Kansas','KS',1228),(1016,'Kentucky','KY',1228),(1017,'Louisiana','LA',1228),(1018,'Maine','ME',1228),(1019,'Maryland','MD',1228),(1020,'Massachusetts','MA',1228),(1021,'Michigan','MI',1228),(1022,'Minnesota','MN',1228),(1023,'Mississippi','MS',1228),(1024,'Missouri','MO',1228),(1025,'Montana','MT',1228),(1026,'Nebraska','NE',1228),(1027,'Nevada','NV',1228),(1028,'New Hampshire','NH',1228),(1029,'New Jersey','NJ',1228),(1030,'New Mexico','NM',1228),(1031,'New York','NY',1228),(1032,'North Carolina','NC',1228),(1033,'North Dakota','ND',1228),(1034,'Ohio','OH',1228),(1035,'Oklahoma','OK',1228),(1036,'Oregon','OR',1228),(1037,'Pennsylvania','PA',1228),(1038,'Rhode Island','RI',1228),(1039,'South Carolina','SC',1228),(1040,'South Dakota','SD',1228),(1041,'Tennessee','TN',1228),(1042,'Texas','TX',1228),(1043,'Utah','UT',1228),(1044,'Vermont','VT',1228),(1045,'Virginia','VA',1228),(1046,'Washington','WA',1228),(1047,'West Virginia','WV',1228),(1048,'Wisconsin','WI',1228),(1049,'Wyoming','WY',1228),(1050,'District of Columbia','DC',1228),(1052,'American Samoa','AS',1228),(1053,'Guam','GU',1228),(1055,'Northern Mariana Islands','MP',1228),(1056,'Puerto Rico','PR',1228),(1057,'Virgin Islands','VI',1228),(1058,'United States Minor Outlying Islands','UM',1228),(1059,'Armed Forces Europe','AE',1228),(1060,'Armed Forces Americas','AA',1228),(1061,'Armed Forces Pacific','AP',1228),(1100,'Alberta','AB',1039),(1101,'British Columbia','BC',1039),(1102,'Manitoba','MB',1039),(1103,'New Brunswick','NB',1039),(1104,'Newfoundland and Labrador','NL',1039),(1105,'Northwest Territories','NT',1039),(1106,'Nova Scotia','NS',1039),(1107,'Nunavut','NU',1039),(1108,'Ontario','ON',1039),(1109,'Prince Edward Island','PE',1039),(1110,'Quebec','QC',1039),(1111,'Saskatchewan','SK',1039),(1112,'Yukon Territory','YT',1039),(1200,'Maharashtra','MM',1101),(1201,'Karnataka','KA',1101),(1202,'Andhra Pradesh','AP',1101),(1203,'Arunachal Pradesh','AR',1101),(1204,'Assam','AS',1101),(1205,'Bihar','BR',1101),(1206,'Chhattisgarh','CH',1101),(1207,'Goa','GA',1101),(1208,'Gujarat','GJ',1101),(1209,'Haryana','HR',1101),(1210,'Himachal Pradesh','HP',1101),(1211,'Jammu and Kashmir','JK',1101),(1212,'Jharkhand','JH',1101),(1213,'Kerala','KL',1101),(1214,'Madhya Pradesh','MP',1101),(1215,'Manipur','MN',1101),(1216,'Meghalaya','ML',1101),(1217,'Mizoram','MZ',1101),(1218,'Nagaland','NL',1101),(1219,'Orissa','OR',1101),(1220,'Punjab','PB',1101),(1221,'Rajasthan','RJ',1101),(1222,'Sikkim','SK',1101),(1223,'Tamil Nadu','TN',1101),(1224,'Tripura','TR',1101),(1225,'Uttarakhand','UT',1101),(1226,'Uttar Pradesh','UP',1101),(1227,'West Bengal','WB',1101),(1228,'Andaman and Nicobar Islands','AN',1101),(1229,'Dadra and Nagar Haveli','DN',1101),(1230,'Daman and Diu','DD',1101),(1231,'Delhi','DL',1101),(1232,'Lakshadweep','LD',1101),(1233,'Pondicherry','PY',1101),(1300,'mazowieckie','MZ',1172),(1301,'pomorskie','PM',1172),(1302,'dolnośląskie','DS',1172),(1303,'kujawsko-pomorskie','KP',1172),(1304,'lubelskie','LU',1172),(1305,'lubuskie','LB',1172),(1306,'łódzkie','LD',1172),(1307,'małopolskie','MA',1172),(1308,'opolskie','OP',1172),(1309,'podkarpackie','PK',1172),(1310,'podlaskie','PD',1172),(1311,'śląskie','SL',1172),(1312,'świętokrzyskie','SK',1172),(1313,'warmińsko-mazurskie','WN',1172),(1314,'wielkopolskie','WP',1172),(1315,'zachodniopomorskie','ZP',1172),(1500,'Abu Zaby','AZ',1225),(1501,'\'Ajman','AJ',1225),(1502,'Al Fujayrah','FU',1225),(1503,'Ash Shariqah','SH',1225),(1504,'Dubayy','DU',1225),(1505,'Ra\'s al Khaymah','RK',1225),(1506,'Dac Lac','33',1233),(1507,'Umm al Qaywayn','UQ',1225),(1508,'Badakhshan','BDS',1001),(1509,'Badghis','BDG',1001),(1510,'Baghlan','BGL',1001),(1511,'Balkh','BAL',1001),(1512,'Bamian','BAM',1001),(1513,'Farah','FRA',1001),(1514,'Faryab','FYB',1001),(1515,'Ghazni','GHA',1001),(1516,'Ghowr','GHO',1001),(1517,'Helmand','HEL',1001),(1518,'Herat','HER',1001),(1519,'Jowzjan','JOW',1001),(1520,'Kabul','KAB',1001),(1521,'Kandahar','KAN',1001),(1522,'Kapisa','KAP',1001),(1523,'Khowst','KHO',1001),(1524,'Konar','KNR',1001),(1525,'Kondoz','KDZ',1001),(1526,'Laghman','LAG',1001),(1527,'Lowgar','LOW',1001),(1528,'Nangrahar','NAN',1001),(1529,'Nimruz','NIM',1001),(1530,'Nurestan','NUR',1001),(1531,'Oruzgan','ORU',1001),(1532,'Paktia','PIA',1001),(1533,'Paktika','PKA',1001),(1534,'Parwan','PAR',1001),(1535,'Samangan','SAM',1001),(1536,'Sar-e Pol','SAR',1001),(1537,'Takhar','TAK',1001),(1538,'Wardak','WAR',1001),(1539,'Zabol','ZAB',1001),(1540,'Berat','BR',1002),(1541,'Bulqizë','BU',1002),(1542,'Delvinë','DL',1002),(1543,'Devoll','DV',1002),(1544,'Dibër','DI',1002),(1545,'Durrës','DR',1002),(1546,'Elbasan','EL',1002),(1547,'Fier','FR',1002),(1548,'Gramsh','GR',1002),(1549,'Gjirokastër','GJ',1002),(1550,'Has','HA',1002),(1551,'Kavajë','KA',1002),(1552,'Kolonjë','ER',1002),(1553,'Korçë','KO',1002),(1554,'Krujë','KR',1002),(1555,'Kuçovë','KC',1002),(1556,'Kukës','KU',1002),(1557,'Kurbin','KB',1002),(1558,'Lezhë','LE',1002),(1559,'Librazhd','LB',1002),(1560,'Lushnjë','LU',1002),(1561,'Malësi e Madhe','MM',1002),(1562,'Mallakastër','MK',1002),(1563,'Mat','MT',1002),(1564,'Mirditë','MR',1002),(1565,'Peqin','PQ',1002),(1566,'Përmet','PR',1002),(1567,'Pogradec','PG',1002),(1568,'Pukë','PU',1002),(1569,'Sarandë','SR',1002),(1570,'Skrapar','SK',1002),(1571,'Shkodër','SH',1002),(1572,'Tepelenë','TE',1002),(1573,'Tiranë','TR',1002),(1574,'Tropojë','TP',1002),(1575,'Vlorë','VL',1002),(1576,'Erevan','ER',1011),(1577,'Aragacotn','AG',1011),(1578,'Ararat','AR',1011),(1579,'Armavir','AV',1011),(1580,'Gegarkunik\'','GR',1011),(1581,'Kotayk\'','KT',1011),(1582,'Lory','LO',1011),(1583,'Sirak','SH',1011),(1584,'Syunik\'','SU',1011),(1585,'Tavus','TV',1011),(1586,'Vayoc Jor','VD',1011),(1587,'Bengo','BGO',1006),(1588,'Benguela','BGU',1006),(1589,'Bie','BIE',1006),(1590,'Cabinda','CAB',1006),(1591,'Cuando-Cubango','CCU',1006),(1592,'Cuanza Norte','CNO',1006),(1593,'Cuanza Sul','CUS',1006),(1594,'Cunene','CNN',1006),(1595,'Huambo','HUA',1006),(1596,'Huila','HUI',1006),(1597,'Luanda','LUA',1006),(1598,'Lunda Norte','LNO',1006),(1599,'Lunda Sul','LSU',1006),(1600,'Malange','MAL',1006),(1601,'Moxico','MOX',1006),(1602,'Namibe','NAM',1006),(1603,'Uige','UIG',1006),(1604,'Zaire','ZAI',1006),(1605,'Capital federal','C',1010),(1606,'Buenos Aires','B',1010),(1607,'Catamarca','K',1010),(1608,'Cordoba','X',1010),(1609,'Corrientes','W',1010),(1610,'Chaco','H',1010),(1611,'Chubut','U',1010),(1612,'Entre Rios','E',1010),(1613,'Formosa','P',1010),(1614,'Jujuy','Y',1010),(1615,'La Pampa','L',1010),(1616,'Mendoza','M',1010),(1617,'Misiones','N',1010),(1618,'Neuquen','Q',1010),(1619,'Rio Negro','R',1010),(1620,'Salta','A',1010),(1621,'San Juan','J',1010),(1622,'San Luis','D',1010),(1623,'Santa Cruz','Z',1010),(1624,'Santa Fe','S',1010),(1625,'Santiago del Estero','G',1010),(1626,'Tierra del Fuego','V',1010),(1627,'Tucuman','T',1010),(1628,'Burgenland','1',1014),(1629,'Kärnten','2',1014),(1630,'Niederösterreich','3',1014),(1631,'Oberösterreich','4',1014),(1632,'Salzburg','5',1014),(1633,'Steiermark','6',1014),(1634,'Tirol','7',1014),(1635,'Vorarlberg','8',1014),(1636,'Wien','9',1014),(1637,'Australian Antarctic Territory','AAT',1008),(1638,'Australian Capital Territory','ACT',1013),(1639,'Northern Territory','NT',1013),(1640,'New South Wales','NSW',1013),(1641,'Queensland','QLD',1013),(1642,'South Australia','SA',1013),(1643,'Tasmania','TAS',1013),(1644,'Victoria','VIC',1013),(1645,'Western Australia','WA',1013),(1646,'Naxcivan','NX',1015),(1647,'Ali Bayramli','AB',1015),(1648,'Baki','BA',1015),(1649,'Ganca','GA',1015),(1650,'Lankaran','LA',1015),(1651,'Mingacevir','MI',1015),(1652,'Naftalan','NA',1015),(1653,'Saki','SA',1015),(1654,'Sumqayit','SM',1015),(1655,'Susa','SS',1015),(1656,'Xankandi','XA',1015),(1657,'Yevlax','YE',1015),(1658,'Abseron','ABS',1015),(1659,'Agcabadi','AGC',1015),(1660,'Agdam','AGM',1015),(1661,'Agdas','AGS',1015),(1662,'Agstafa','AGA',1015),(1663,'Agsu','AGU',1015),(1664,'Astara','AST',1015),(1665,'Babak','BAB',1015),(1666,'Balakan','BAL',1015),(1667,'Barda','BAR',1015),(1668,'Beylagan','BEY',1015),(1669,'Bilasuvar','BIL',1015),(1670,'Cabrayll','CAB',1015),(1671,'Calilabad','CAL',1015),(1672,'Culfa','CUL',1015),(1673,'Daskasan','DAS',1015),(1674,'Davaci','DAV',1015),(1675,'Fuzuli','FUZ',1015),(1676,'Gadabay','GAD',1015),(1677,'Goranboy','GOR',1015),(1678,'Goycay','GOY',1015),(1679,'Haciqabul','HAC',1015),(1680,'Imisli','IMI',1015),(1681,'Ismayilli','ISM',1015),(1682,'Kalbacar','KAL',1015),(1683,'Kurdamir','KUR',1015),(1684,'Lacin','LAC',1015),(1685,'Lerik','LER',1015),(1686,'Masalli','MAS',1015),(1687,'Neftcala','NEF',1015),(1688,'Oguz','OGU',1015),(1689,'Ordubad','ORD',1015),(1690,'Qabala','QAB',1015),(1691,'Qax','QAX',1015),(1692,'Qazax','QAZ',1015),(1693,'Qobustan','QOB',1015),(1694,'Quba','QBA',1015),(1695,'Qubadli','QBI',1015),(1696,'Qusar','QUS',1015),(1697,'Saatli','SAT',1015),(1698,'Sabirabad','SAB',1015),(1699,'Sadarak','SAD',1015),(1700,'Sahbuz','SAH',1015),(1701,'Salyan','SAL',1015),(1702,'Samaxi','SMI',1015),(1703,'Samkir','SKR',1015),(1704,'Samux','SMX',1015),(1705,'Sarur','SAR',1015),(1706,'Siyazan','SIY',1015),(1707,'Tartar','TAR',1015),(1708,'Tovuz','TOV',1015),(1709,'Ucar','UCA',1015),(1710,'Xacmaz','XAC',1015),(1711,'Xanlar','XAN',1015),(1712,'Xizi','XIZ',1015),(1713,'Xocali','XCI',1015),(1714,'Xocavand','XVD',1015),(1715,'Yardimli','YAR',1015),(1716,'Zangilan','ZAN',1015),(1717,'Zaqatala','ZAQ',1015),(1718,'Zardab','ZAR',1015),(1719,'Federacija Bosna i Hercegovina','BIH',1026),(1720,'Republika Srpska','SRP',1026),(1721,'Bagerhat zila','05',1017),(1722,'Bandarban zila','01',1017),(1723,'Barguna zila','02',1017),(1724,'Barisal zila','06',1017),(1725,'Bhola zila','07',1017),(1726,'Bogra zila','03',1017),(1727,'Brahmanbaria zila','04',1017),(1728,'Chandpur zila','09',1017),(1729,'Chittagong zila','10',1017),(1730,'Chuadanga zila','12',1017),(1731,'Comilla zila','08',1017),(1732,'Cox\'s Bazar zila','11',1017),(1733,'Dhaka zila','13',1017),(1734,'Dinajpur zila','14',1017),(1735,'Faridpur zila','15',1017),(1736,'Feni zila','16',1017),(1737,'Gaibandha zila','19',1017),(1738,'Gazipur zila','18',1017),(1739,'Gopalganj zila','17',1017),(1740,'Habiganj zila','20',1017),(1741,'Jaipurhat zila','24',1017),(1742,'Jamalpur zila','21',1017),(1743,'Jessore zila','22',1017),(1744,'Jhalakati zila','25',1017),(1745,'Jhenaidah zila','23',1017),(1746,'Khagrachari zila','29',1017),(1747,'Khulna zila','27',1017),(1748,'Kishorganj zila','26',1017),(1749,'Kurigram zila','28',1017),(1750,'Kushtia zila','30',1017),(1751,'Lakshmipur zila','31',1017),(1752,'Lalmonirhat zila','32',1017),(1753,'Madaripur zila','36',1017),(1754,'Magura zila','37',1017),(1755,'Manikganj zila','33',1017),(1756,'Meherpur zila','39',1017),(1757,'Moulvibazar zila','38',1017),(1758,'Munshiganj zila','35',1017),(1759,'Mymensingh zila','34',1017),(1760,'Naogaon zila','48',1017),(1761,'Narail zila','43',1017),(1762,'Narayanganj zila','40',1017),(1763,'Narsingdi zila','42',1017),(1764,'Natore zila','44',1017),(1765,'Nawabganj zila','45',1017),(1766,'Netrakona zila','41',1017),(1767,'Nilphamari zila','46',1017),(1768,'Noakhali zila','47',1017),(1769,'Pabna zila','49',1017),(1770,'Panchagarh zila','52',1017),(1771,'Patuakhali zila','51',1017),(1772,'Pirojpur zila','50',1017),(1773,'Rajbari zila','53',1017),(1774,'Rajshahi zila','54',1017),(1775,'Rangamati zila','56',1017),(1776,'Rangpur zila','55',1017),(1777,'Satkhira zila','58',1017),(1778,'Shariatpur zila','62',1017),(1779,'Sherpur zila','57',1017),(1780,'Sirajganj zila','59',1017),(1781,'Sunamganj zila','61',1017),(1782,'Sylhet zila','60',1017),(1783,'Tangail zila','63',1017),(1784,'Thakurgaon zila','64',1017),(1785,'Antwerpen','VAN',1020),(1786,'Brabant Wallon','WBR',1020),(1787,'Hainaut','WHT',1020),(1788,'Liege','WLG',1020),(1789,'Limburg','VLI',1020),(1790,'Luxembourg','WLX',1020),(1791,'Namur','WNA',1020),(1792,'Oost-Vlaanderen','VOV',1020),(1793,'Vlaams-Brabant','VBR',1020),(1794,'West-Vlaanderen','VWV',1020),(1795,'Bale','BAL',1034),(1796,'Bam','BAM',1034),(1797,'Banwa','BAN',1034),(1798,'Bazega','BAZ',1034),(1799,'Bougouriba','BGR',1034),(1800,'Boulgou','BLG',1034),(1801,'Boulkiemde','BLK',1034),(1802,'Comoe','COM',1034),(1803,'Ganzourgou','GAN',1034),(1804,'Gnagna','GNA',1034),(1805,'Gourma','GOU',1034),(1806,'Houet','HOU',1034),(1807,'Ioba','IOB',1034),(1808,'Kadiogo','KAD',1034),(1809,'Kenedougou','KEN',1034),(1810,'Komondjari','KMD',1034),(1811,'Kompienga','KMP',1034),(1812,'Kossi','KOS',1034),(1813,'Koulpulogo','KOP',1034),(1814,'Kouritenga','KOT',1034),(1815,'Kourweogo','KOW',1034),(1816,'Leraba','LER',1034),(1817,'Loroum','LOR',1034),(1818,'Mouhoun','MOU',1034),(1819,'Nahouri','NAO',1034),(1820,'Namentenga','NAM',1034),(1821,'Nayala','NAY',1034),(1822,'Noumbiel','NOU',1034),(1823,'Oubritenga','OUB',1034),(1824,'Oudalan','OUD',1034),(1825,'Passore','PAS',1034),(1826,'Poni','PON',1034),(1827,'Sanguie','SNG',1034),(1828,'Sanmatenga','SMT',1034),(1829,'Seno','SEN',1034),(1830,'Siasili','SIS',1034),(1831,'Soum','SOM',1034),(1832,'Sourou','SOR',1034),(1833,'Tapoa','TAP',1034),(1834,'Tui','TUI',1034),(1835,'Yagha','YAG',1034),(1836,'Yatenga','YAT',1034),(1837,'Ziro','ZIR',1034),(1838,'Zondoma','ZON',1034),(1839,'Zoundweogo','ZOU',1034),(1840,'Blagoevgrad','01',1033),(1841,'Burgas','02',1033),(1842,'Dobrich','08',1033),(1843,'Gabrovo','07',1033),(1844,'Haskovo','26',1033),(1845,'Yambol','28',1033),(1846,'Kardzhali','09',1033),(1847,'Kyustendil','10',1033),(1848,'Lovech','11',1033),(1849,'Montana','12',1033),(1850,'Pazardzhik','13',1033),(1851,'Pernik','14',1033),(1852,'Pleven','15',1033),(1853,'Plovdiv','16',1033),(1854,'Razgrad','17',1033),(1855,'Ruse','18',1033),(1856,'Silistra','19',1033),(1857,'Sliven','20',1033),(1858,'Smolyan','21',1033),(1859,'Sofia','23',1033),(1860,'Stara Zagora','24',1033),(1861,'Shumen','27',1033),(1862,'Targovishte','25',1033),(1863,'Varna','03',1033),(1864,'Veliko Tarnovo','04',1033),(1865,'Vidin','05',1033),(1866,'Vratsa','06',1033),(1867,'Al Hadd','01',1016),(1868,'Al Manamah','03',1016),(1869,'Al Mintaqah al Gharbiyah','10',1016),(1870,'Al Mintagah al Wusta','07',1016),(1871,'Al Mintaqah ash Shamaliyah','05',1016),(1872,'Al Muharraq','02',1016),(1873,'Ar Rifa','09',1016),(1874,'Jidd Hafs','04',1016),(1875,'Madluat Jamad','12',1016),(1876,'Madluat Isa','08',1016),(1877,'Mintaqat Juzur tawar','11',1016),(1878,'Sitrah','06',1016),(1879,'Bubanza','BB',1036),(1880,'Bujumbura','BJ',1036),(1881,'Bururi','BR',1036),(1882,'Cankuzo','CA',1036),(1883,'Cibitoke','CI',1036),(1884,'Gitega','GI',1036),(1885,'Karuzi','KR',1036),(1886,'Kayanza','KY',1036),(1887,'Makamba','MA',1036),(1888,'Muramvya','MU',1036),(1889,'Mwaro','MW',1036),(1890,'Ngozi','NG',1036),(1891,'Rutana','RT',1036),(1892,'Ruyigi','RY',1036),(1893,'Alibori','AL',1022),(1894,'Atakora','AK',1022),(1895,'Atlantique','AQ',1022),(1896,'Borgou','BO',1022),(1897,'Collines','CO',1022),(1898,'Donga','DO',1022),(1899,'Kouffo','KO',1022),(1900,'Littoral','LI',1022),(1901,'Mono','MO',1022),(1902,'Oueme','OU',1022),(1903,'Plateau','PL',1022),(1904,'Zou','ZO',1022),(1905,'Belait','BE',1032),(1906,'Brunei-Muara','BM',1032),(1907,'Temburong','TE',1032),(1908,'Tutong','TU',1032),(1909,'Cochabamba','C',1025),(1910,'Chuquisaca','H',1025),(1911,'El Beni','B',1025),(1912,'La Paz','L',1025),(1913,'Oruro','O',1025),(1914,'Pando','N',1025),(1915,'Potosi','P',1025),(1916,'Tarija','T',1025),(1917,'Acre','AC',1029),(1918,'Alagoas','AL',1029),(1919,'Amazonas','AM',1029),(1920,'Amapa','AP',1029),(1921,'Bahia','BA',1029),(1922,'Ceara','CE',1029),(1923,'Distrito Federal','DF',1029),(1924,'Espirito Santo','ES',1029),(1926,'Goias','GO',1029),(1927,'Maranhao','MA',1029),(1928,'Minas Gerais','MG',1029),(1929,'Mato Grosso do Sul','MS',1029),(1930,'Mato Grosso','MT',1029),(1931,'Para','PA',1029),(1932,'Paraiba','PB',1029),(1933,'Pernambuco','PE',1029),(1934,'Piaui','PI',1029),(1935,'Parana','PR',1029),(1936,'Rio de Janeiro','RJ',1029),(1937,'Rio Grande do Norte','RN',1029),(1938,'Rondonia','RO',1029),(1939,'Roraima','RR',1029),(1940,'Rio Grande do Sul','RS',1029),(1941,'Santa Catarina','SC',1029),(1942,'Sergipe','SE',1029),(1943,'Sao Paulo','SP',1029),(1944,'Tocantins','TO',1029),(1945,'Acklins and Crooked Islands','AC',1212),(1946,'Bimini','BI',1212),(1947,'Cat Island','CI',1212),(1948,'Exuma','EX',1212),(1955,'Inagua','IN',1212),(1957,'Long Island','LI',1212),(1959,'Mayaguana','MG',1212),(1960,'New Providence','NP',1212),(1962,'Ragged Island','RI',1212),(1966,'Bumthang','33',1024),(1967,'Chhukha','12',1024),(1968,'Dagana','22',1024),(1969,'Gasa','GA',1024),(1970,'Ha','13',1024),(1971,'Lhuentse','44',1024),(1972,'Monggar','42',1024),(1973,'Paro','11',1024),(1974,'Pemagatshel','43',1024),(1975,'Punakha','23',1024),(1976,'Samdrup Jongkha','45',1024),(1977,'Samtee','14',1024),(1978,'Sarpang','31',1024),(1979,'Thimphu','15',1024),(1980,'Trashigang','41',1024),(1981,'Trashi Yangtse','TY',1024),(1982,'Trongsa','32',1024),(1983,'Tsirang','21',1024),(1984,'Wangdue Phodrang','24',1024),(1985,'Zhemgang','34',1024),(1986,'Central','CE',1027),(1987,'Ghanzi','GH',1027),(1988,'Kgalagadi','KG',1027),(1989,'Kgatleng','KL',1027),(1990,'Kweneng','KW',1027),(1991,'Ngamiland','NG',1027),(1992,'North-East','NE',1027),(1993,'North-West','NW',1027),(1994,'South-East','SE',1027),(1995,'Southern','SO',1027),(1996,'Brèsckaja voblasc\'','BR',1019),(1997,'Homel\'skaja voblasc\'','HO',1019),(1998,'Hrodzenskaja voblasc\'','HR',1019),(1999,'Mahilëuskaja voblasc\'','MA',1019),(2000,'Minskaja voblasc\'','MI',1019),(2001,'Vicebskaja voblasc\'','VI',1019),(2002,'Belize','BZ',1021),(2003,'Cayo','CY',1021),(2004,'Corozal','CZL',1021),(2005,'Orange Walk','OW',1021),(2006,'Stann Creek','SC',1021),(2007,'Toledo','TOL',1021),(2008,'Kinshasa','KN',1050),(2011,'Equateur','EQ',1050),(2014,'Kasai-Oriental','KE',1050),(2016,'Maniema','MA',1050),(2017,'Nord-Kivu','NK',1050),(2019,'Sud-Kivu','SK',1050),(2020,'Bangui','BGF',1042),(2021,'Bamingui-Bangoran','BB',1042),(2022,'Basse-Kotto','BK',1042),(2023,'Haute-Kotto','HK',1042),(2024,'Haut-Mbomou','HM',1042),(2025,'Kemo','KG',1042),(2026,'Lobaye','LB',1042),(2027,'Mambere-Kadei','HS',1042),(2028,'Mbomou','MB',1042),(2029,'Nana-Grebizi','KB',1042),(2030,'Nana-Mambere','NM',1042),(2031,'Ombella-Mpoko','MP',1042),(2032,'Ouaka','UK',1042),(2033,'Ouham','AC',1042),(2034,'Ouham-Pende','OP',1042),(2035,'Sangha-Mbaere','SE',1042),(2036,'Vakaga','VR',1042),(2037,'Brazzaville','BZV',1051),(2038,'Bouenza','11',1051),(2039,'Cuvette','8',1051),(2040,'Cuvette-Ouest','15',1051),(2041,'Kouilou','5',1051),(2042,'Lekoumou','2',1051),(2043,'Likouala','7',1051),(2044,'Niari','9',1051),(2045,'Plateaux','14',1051),(2046,'Pool','12',1051),(2047,'Sangha','13',1051),(2048,'Aargau','AG',1205),(2049,'Appenzell Innerrhoden','AI',1205),(2050,'Appenzell Ausserrhoden','AR',1205),(2051,'Bern','BE',1205),(2052,'Basel-Landschaft','BL',1205),(2053,'Basel-Stadt','BS',1205),(2054,'Fribourg','FR',1205),(2055,'Geneva','GE',1205),(2056,'Glarus','GL',1205),(2057,'Graubunden','GR',1205),(2058,'Jura','JU',1205),(2059,'Luzern','LU',1205),(2060,'Neuchatel','NE',1205),(2061,'Nidwalden','NW',1205),(2062,'Obwalden','OW',1205),(2063,'Sankt Gallen','SG',1205),(2064,'Schaffhausen','SH',1205),(2065,'Solothurn','SO',1205),(2066,'Schwyz','SZ',1205),(2067,'Thurgau','TG',1205),(2068,'Ticino','TI',1205),(2069,'Uri','UR',1205),(2070,'Vaud','VD',1205),(2071,'Valais','VS',1205),(2072,'Zug','ZG',1205),(2073,'Zurich','ZH',1205),(2074,'18 Montagnes','06',1054),(2075,'Agnebi','16',1054),(2076,'Bas-Sassandra','09',1054),(2077,'Denguele','10',1054),(2078,'Haut-Sassandra','02',1054),(2079,'Lacs','07',1054),(2080,'Lagunes','01',1054),(2081,'Marahoue','12',1054),(2082,'Moyen-Comoe','05',1054),(2083,'Nzi-Comoe','11',1054),(2084,'Savanes','03',1054),(2085,'Sud-Bandama','15',1054),(2086,'Sud-Comoe','13',1054),(2087,'Vallee du Bandama','04',1054),(2088,'Worodouqou','14',1054),(2089,'Zanzan','08',1054),(2090,'Aisen del General Carlos Ibanez del Campo','AI',1044),(2091,'Antofagasta','AN',1044),(2092,'Araucania','AR',1044),(2093,'Atacama','AT',1044),(2094,'Bio-Bio','BI',1044),(2095,'Coquimbo','CO',1044),(2096,'Libertador General Bernardo O\'Higgins','LI',1044),(2097,'Los Lagos','LL',1044),(2098,'Magallanes','MA',1044),(2099,'Maule','ML',1044),(2100,'Santiago Metropolitan','SM',1044),(2101,'Tarapaca','TA',1044),(2102,'Valparaiso','VS',1044),(2103,'Adamaoua','AD',1038),(2104,'Centre','CE',1038),(2105,'East','ES',1038),(2106,'Far North','EN',1038),(2107,'North','NO',1038),(2108,'South','SW',1038),(2109,'South-West','SW',1038),(2110,'West','OU',1038),(2111,'Beijing','11',1045),(2112,'Chongqing','50',1045),(2113,'Shanghai','31',1045),(2114,'Tianjin','12',1045),(2115,'Anhui','34',1045),(2116,'Fujian','35',1045),(2117,'Gansu','62',1045),(2118,'Guangdong','44',1045),(2119,'Guizhou','52',1045),(2120,'Hainan','46',1045),(2121,'Hebei','13',1045),(2122,'Heilongjiang','23',1045),(2123,'Henan','41',1045),(2124,'Hubei','42',1045),(2125,'Hunan','43',1045),(2126,'Jiangsu','32',1045),(2127,'Jiangxi','36',1045),(2128,'Jilin','22',1045),(2129,'Liaoning','21',1045),(2130,'Qinghai','63',1045),(2131,'Shaanxi','61',1045),(2132,'Shandong','37',1045),(2133,'Shanxi','14',1045),(2134,'Sichuan','51',1045),(2135,'Taiwan','71',1045),(2136,'Yunnan','53',1045),(2137,'Zhejiang','33',1045),(2138,'Guangxi','45',1045),(2139,'Neia Mongol (mn)','15',1045),(2140,'Xinjiang','65',1045),(2141,'Xizang','54',1045),(2142,'Hong Kong','91',1045),(2143,'Macau','92',1045),(2144,'Distrito Capital de Bogotá','DC',1048),(2145,'Amazonea','AMA',1048),(2146,'Antioquia','ANT',1048),(2147,'Arauca','ARA',1048),(2148,'Atlántico','ATL',1048),(2149,'Bolívar','BOL',1048),(2150,'Boyacá','BOY',1048),(2151,'Caldea','CAL',1048),(2152,'Caquetá','CAQ',1048),(2153,'Casanare','CAS',1048),(2154,'Cauca','CAU',1048),(2155,'Cesar','CES',1048),(2156,'Córdoba','COR',1048),(2157,'Cundinamarca','CUN',1048),(2158,'Chocó','CHO',1048),(2159,'Guainía','GUA',1048),(2160,'Guaviare','GUV',1048),(2161,'La Guajira','LAG',1048),(2162,'Magdalena','MAG',1048),(2163,'Meta','MET',1048),(2164,'Nariño','NAR',1048),(2165,'Norte de Santander','NSA',1048),(2166,'Putumayo','PUT',1048),(2167,'Quindio','QUI',1048),(2168,'Risaralda','RIS',1048),(2169,'San Andrés, Providencia y Santa Catalina','SAP',1048),(2170,'Santander','SAN',1048),(2171,'Sucre','SUC',1048),(2172,'Tolima','TOL',1048),(2173,'Valle del Cauca','VAC',1048),(2174,'Vaupés','VAU',1048),(2175,'Vichada','VID',1048),(2176,'Alajuela','A',1053),(2177,'Cartago','C',1053),(2178,'Guanacaste','G',1053),(2179,'Heredia','H',1053),(2180,'Limon','L',1053),(2181,'Puntarenas','P',1053),(2182,'San Jose','SJ',1053),(2183,'Camagey','09',1056),(2184,'Ciego de `vila','08',1056),(2185,'Cienfuegos','06',1056),(2186,'Ciudad de La Habana','03',1056),(2187,'Granma','12',1056),(2188,'Guantanamo','14',1056),(2189,'Holquin','11',1056),(2190,'La Habana','02',1056),(2191,'Las Tunas','10',1056),(2192,'Matanzas','04',1056),(2193,'Pinar del Rio','01',1056),(2194,'Sancti Spiritus','07',1056),(2195,'Santiago de Cuba','13',1056),(2196,'Villa Clara','05',1056),(2197,'Isla de la Juventud','99',1056),(2198,'Pinar del Roo','PR',1056),(2199,'Ciego de Avila','CA',1056),(2200,'Camagoey','CG',1056),(2201,'Holgun','HO',1056),(2202,'Sancti Spritus','SS',1056),(2203,'Municipio Especial Isla de la Juventud','IJ',1056),(2204,'Boa Vista','BV',1040),(2205,'Brava','BR',1040),(2206,'Calheta de Sao Miguel','CS',1040),(2207,'Fogo','FO',1040),(2208,'Maio','MA',1040),(2209,'Mosteiros','MO',1040),(2210,'Paul','PA',1040),(2211,'Porto Novo','PN',1040),(2212,'Praia','PR',1040),(2213,'Ribeira Grande','RG',1040),(2214,'Sal','SL',1040),(2215,'Sao Domingos','SD',1040),(2216,'Sao Filipe','SF',1040),(2217,'Sao Nicolau','SN',1040),(2218,'Sao Vicente','SV',1040),(2219,'Tarrafal','TA',1040),(2220,'Ammochostos Magusa','04',1057),(2221,'Keryneia','06',1057),(2222,'Larnaka','03',1057),(2223,'Lefkosia','01',1057),(2224,'Lemesos','02',1057),(2225,'Pafos','05',1057),(2226,'Jihočeský kraj','JC',1058),(2227,'Jihomoravský kraj','JM',1058),(2228,'Karlovarský kraj','KA',1058),(2229,'Královéhradecký kraj','KR',1058),(2230,'Liberecký kraj','LI',1058),(2231,'Moravskoslezský kraj','MO',1058),(2232,'Olomoucký kraj','OL',1058),(2233,'Pardubický kraj','PA',1058),(2234,'Plzeňský kraj','PL',1058),(2235,'Praha, hlavní město','PR',1058),(2236,'Středočeský kraj','ST',1058),(2237,'Ústecký kraj','US',1058),(2238,'Vysočina','VY',1058),(2239,'Zlínský kraj','ZL',1058),(2240,'Baden-Württemberg','BW',1082),(2241,'Bayern','BY',1082),(2242,'Bremen','HB',1082),(2243,'Hamburg','HH',1082),(2244,'Hessen','HE',1082),(2245,'Niedersachsen','NI',1082),(2246,'Nordrhein-Westfalen','NW',1082),(2247,'Rheinland-Pfalz','RP',1082),(2248,'Saarland','SL',1082),(2249,'Schleswig-Holstein','SH',1082),(2250,'Berlin','BE',1082),(2251,'Brandenburg','BB',1082),(2252,'Mecklenburg-Vorpommern','MV',1082),(2253,'Sachsen','SN',1082),(2254,'Sachsen-Anhalt','ST',1082),(2255,'Thüringen','TH',1082),(2256,'Ali Sabiah','AS',1060),(2257,'Dikhil','DI',1060),(2258,'Djibouti','DJ',1060),(2259,'Obock','OB',1060),(2260,'Tadjoura','TA',1060),(2261,'Frederiksberg','147',1059),(2262,'Copenhagen City','101',1059),(2263,'Copenhagen','015',1059),(2264,'Frederiksborg','020',1059),(2265,'Roskilde','025',1059),(2266,'Vestsjælland','030',1059),(2267,'Storstrøm','035',1059),(2268,'Bornholm','040',1059),(2269,'Fyn','042',1059),(2270,'South Jutland','050',1059),(2271,'Ribe','055',1059),(2272,'Vejle','060',1059),(2273,'Ringkjøbing','065',1059),(2274,'Århus','070',1059),(2275,'Viborg','076',1059),(2276,'North Jutland','080',1059),(2277,'Distrito Nacional (Santo Domingo)','01',1062),(2278,'Azua','02',1062),(2279,'Bahoruco','03',1062),(2280,'Barahona','04',1062),(2281,'Dajabón','05',1062),(2282,'Duarte','06',1062),(2283,'El Seybo [El Seibo]','08',1062),(2284,'Espaillat','09',1062),(2285,'Hato Mayor','30',1062),(2286,'Independencia','10',1062),(2287,'La Altagracia','11',1062),(2288,'La Estrelleta [Elias Pina]','07',1062),(2289,'La Romana','12',1062),(2290,'La Vega','13',1062),(2291,'Maroia Trinidad Sánchez','14',1062),(2292,'Monseñor Nouel','28',1062),(2293,'Monte Cristi','15',1062),(2294,'Monte Plata','29',1062),(2295,'Pedernales','16',1062),(2296,'Peravia','17',1062),(2297,'Puerto Plata','18',1062),(2298,'Salcedo','19',1062),(2299,'Samaná','20',1062),(2300,'San Cristóbal','21',1062),(2301,'San Pedro de Macorís','23',1062),(2302,'Sánchez Ramírez','24',1062),(2303,'Santiago','25',1062),(2304,'Santiago Rodríguez','26',1062),(2305,'Valverde','27',1062),(2306,'Adrar','01',1003),(2307,'Ain Defla','44',1003),(2308,'Ain Tmouchent','46',1003),(2309,'Alger','16',1003),(2310,'Annaba','23',1003),(2311,'Batna','05',1003),(2312,'Bechar','08',1003),(2313,'Bejaia','06',1003),(2314,'Biskra','07',1003),(2315,'Blida','09',1003),(2316,'Bordj Bou Arreridj','34',1003),(2317,'Bouira','10',1003),(2318,'Boumerdes','35',1003),(2319,'Chlef','02',1003),(2320,'Constantine','25',1003),(2321,'Djelfa','17',1003),(2322,'El Bayadh','32',1003),(2323,'El Oued','39',1003),(2324,'El Tarf','36',1003),(2325,'Ghardaia','47',1003),(2326,'Guelma','24',1003),(2327,'Illizi','33',1003),(2328,'Jijel','18',1003),(2329,'Khenchela','40',1003),(2330,'Laghouat','03',1003),(2331,'Mascara','29',1003),(2332,'Medea','26',1003),(2333,'Mila','43',1003),(2334,'Mostaganem','27',1003),(2335,'Msila','28',1003),(2336,'Naama','45',1003),(2337,'Oran','31',1003),(2338,'Ouargla','30',1003),(2339,'Oum el Bouaghi','04',1003),(2340,'Relizane','48',1003),(2341,'Saida','20',1003),(2342,'Setif','19',1003),(2343,'Sidi Bel Abbes','22',1003),(2344,'Skikda','21',1003),(2345,'Souk Ahras','41',1003),(2346,'Tamanghasset','11',1003),(2347,'Tebessa','12',1003),(2348,'Tiaret','14',1003),(2349,'Tindouf','37',1003),(2350,'Tipaza','42',1003),(2351,'Tissemsilt','38',1003),(2352,'Tizi Ouzou','15',1003),(2353,'Tlemcen','13',1003),(2354,'Azuay','A',1064),(2355,'Bolivar','B',1064),(2356,'Canar','F',1064),(2357,'Carchi','C',1064),(2358,'Cotopaxi','X',1064),(2359,'Chimborazo','H',1064),(2360,'El Oro','O',1064),(2361,'Esmeraldas','E',1064),(2362,'Galapagos','W',1064),(2363,'Guayas','G',1064),(2364,'Imbabura','I',1064),(2365,'Loja','L',1064),(2366,'Los Rios','R',1064),(2367,'Manabi','M',1064),(2368,'Morona-Santiago','S',1064),(2369,'Napo','N',1064),(2370,'Orellana','D',1064),(2371,'Pastaza','Y',1064),(2372,'Pichincha','P',1064),(2373,'Sucumbios','U',1064),(2374,'Tungurahua','T',1064),(2375,'Zamora-Chinchipe','Z',1064),(2376,'Harjumaa','37',1069),(2377,'Hiiumaa','39',1069),(2378,'Ida-Virumaa','44',1069),(2379,'Jõgevamaa','49',1069),(2380,'Järvamaa','51',1069),(2381,'Läänemaa','57',1069),(2382,'Lääne-Virumaa','59',1069),(2383,'Põlvamaa','65',1069),(2384,'Pärnumaa','67',1069),(2385,'Raplamaa','70',1069),(2386,'Saaremaa','74',1069),(2387,'Tartumaa','7B',1069),(2388,'Valgamaa','82',1069),(2389,'Viljandimaa','84',1069),(2390,'Võrumaa','86',1069),(2391,'Ad Daqahllyah','DK',1065),(2392,'Al Bahr al Ahmar','BA',1065),(2393,'Al Buhayrah','BH',1065),(2394,'Al Fayym','FYM',1065),(2395,'Al Gharbiyah','GH',1065),(2396,'Al Iskandarlyah','ALX',1065),(2397,'Al Isma illyah','IS',1065),(2398,'Al Jizah','GZ',1065),(2399,'Al Minuflyah','MNF',1065),(2400,'Al Minya','MN',1065),(2401,'Al Qahirah','C',1065),(2402,'Al Qalyublyah','KB',1065),(2403,'Al Wadi al Jadid','WAD',1065),(2404,'Ash Sharqiyah','SHR',1065),(2405,'As Suways','SUZ',1065),(2406,'Aswan','ASN',1065),(2407,'Asyut','AST',1065),(2408,'Bani Suwayf','BNS',1065),(2409,'Bur Sa\'id','PTS',1065),(2410,'Dumyat','DT',1065),(2411,'Janub Sina\'','JS',1065),(2412,'Kafr ash Shaykh','KFS',1065),(2413,'Matruh','MT',1065),(2414,'Qina','KN',1065),(2415,'Shamal Sina\'','SIN',1065),(2416,'Suhaj','SHG',1065),(2417,'Anseba','AN',1068),(2418,'Debub','DU',1068),(2419,'Debubawi Keyih Bahri [Debub-Keih-Bahri]','DK',1068),(2420,'Gash-Barka','GB',1068),(2421,'Maakel [Maekel]','MA',1068),(2422,'Semenawi Keyih Bahri [Semien-Keih-Bahri]','SK',1068),(2423,'Álava','VI',1198),(2424,'Albacete','AB',1198),(2425,'Alicante','A',1198),(2426,'Almería','AL',1198),(2427,'Asturias','O',1198),(2428,'Ávila','AV',1198),(2429,'Badajoz','BA',1198),(2430,'Baleares','PM',1198),(2431,'Barcelona','B',1198),(2432,'Burgos','BU',1198),(2433,'Cáceres','CC',1198),(2434,'Cádiz','CA',1198),(2435,'Cantabria','S',1198),(2436,'Castellón','CS',1198),(2437,'Ciudad Real','CR',1198),(2438,'Cuenca','CU',1198),(2439,'Girona [Gerona]','GE',1198),(2440,'Granada','GR',1198),(2441,'Guadalajara','GU',1198),(2442,'Guipúzcoa','SS',1198),(2443,'Huelva','H',1198),(2444,'Huesca','HU',1198),(2445,'Jaén','J',1198),(2446,'La Coruña','C',1198),(2447,'La Rioja','LO',1198),(2448,'Las Palmas','GC',1198),(2449,'León','LE',1198),(2450,'Lleida [Lérida]','L',1198),(2451,'Lugo','LU',1198),(2452,'Madrid','M',1198),(2453,'Málaga','MA',1198),(2454,'Murcia','MU',1198),(2455,'Navarra','NA',1198),(2456,'Ourense','OR',1198),(2457,'Palencia','P',1198),(2458,'Pontevedra','PO',1198),(2459,'Salamanca','SA',1198),(2460,'Santa Cruz de Tenerife','TF',1198),(2461,'Segovia','SG',1198),(2462,'Sevilla','SE',1198),(2463,'Soria','SO',1198),(2464,'Tarragona','T',1198),(2465,'Teruel','TE',1198),(2466,'Valencia','V',1198),(2467,'Valladolid','VA',1198),(2468,'Vizcaya','BI',1198),(2469,'Zamora','ZA',1198),(2470,'Zaragoza','Z',1198),(2471,'Ceuta','CE',1198),(2472,'Melilla','ML',1198),(2473,'Addis Ababa','AA',1070),(2474,'Dire Dawa','DD',1070),(2475,'Afar','AF',1070),(2476,'Amara','AM',1070),(2477,'Benshangul-Gumaz','BE',1070),(2478,'Gambela Peoples','GA',1070),(2479,'Harari People','HA',1070),(2480,'Oromia','OR',1070),(2481,'Somali','SO',1070),(2482,'Southern Nations, Nationalities and Peoples','SN',1070),(2483,'Tigrai','TI',1070),(2490,'Eastern','E',1074),(2491,'Northern','N',1074),(2492,'Western','W',1074),(2493,'Rotuma','R',1074),(2494,'Chuuk','TRK',1141),(2495,'Kosrae','KSA',1141),(2496,'Pohnpei','PNI',1141),(2497,'Yap','YAP',1141),(2498,'Ain','01',1076),(2499,'Aisne','02',1076),(2500,'Allier','03',1076),(2501,'Alpes-de-Haute-Provence','04',1076),(2502,'Alpes-Maritimes','06',1076),(2503,'Ardèche','07',1076),(2504,'Ardennes','08',1076),(2505,'Ariège','09',1076),(2506,'Aube','10',1076),(2507,'Aude','11',1076),(2508,'Aveyron','12',1076),(2509,'Bas-Rhin','67',1076),(2510,'Bouches-du-Rhône','13',1076),(2511,'Calvados','14',1076),(2512,'Cantal','15',1076),(2513,'Charente','16',1076),(2514,'Charente-Maritime','17',1076),(2515,'Cher','18',1076),(2516,'Corrèze','19',1076),(2517,'Corse-du-Sud','20A',1076),(2518,'Côte-d\'Or','21',1076),(2519,'Côtes-d\'Armor','22',1076),(2520,'Creuse','23',1076),(2521,'Deux-Sèvres','79',1076),(2522,'Dordogne','24',1076),(2523,'Doubs','25',1076),(2524,'Drôme','26',1076),(2525,'Essonne','91',1076),(2526,'Eure','27',1076),(2527,'Eure-et-Loir','28',1076),(2528,'Finistère','29',1076),(2529,'Gard','30',1076),(2530,'Gers','32',1076),(2531,'Gironde','33',1076),(2532,'Haut-Rhin','68',1076),(2533,'Haute-Corse','20B',1076),(2534,'Haute-Garonne','31',1076),(2535,'Haute-Loire','43',1076),(2536,'Haute-Saône','70',1076),(2537,'Haute-Savoie','74',1076),(2538,'Haute-Vienne','87',1076),(2539,'Hautes-Alpes','05',1076),(2540,'Hautes-Pyrénées','65',1076),(2541,'Hauts-de-Seine','92',1076),(2542,'Hérault','34',1076),(2543,'Indre','36',1076),(2544,'Ille-et-Vilaine','35',1076),(2545,'Indre-et-Loire','37',1076),(2546,'Isère','38',1076),(2547,'Landes','40',1076),(2548,'Loir-et-Cher','41',1076),(2549,'Loire','42',1076),(2550,'Loire-Atlantique','44',1076),(2551,'Loiret','45',1076),(2552,'Lot','46',1076),(2553,'Lot-et-Garonne','47',1076),(2554,'Lozère','48',1076),(2555,'Maine-et-Loire','49',1076),(2556,'Manche','50',1076),(2557,'Marne','51',1076),(2558,'Mayenne','53',1076),(2559,'Meurthe-et-Moselle','54',1076),(2560,'Meuse','55',1076),(2561,'Morbihan','56',1076),(2562,'Moselle','57',1076),(2563,'Nièvre','58',1076),(2564,'Nord','59',1076),(2565,'Oise','60',1076),(2566,'Orne','61',1076),(2567,'Paris','75',1076),(2568,'Pas-de-Calais','62',1076),(2569,'Puy-de-Dôme','63',1076),(2570,'Pyrénées-Atlantiques','64',1076),(2571,'Pyrénées-Orientales','66',1076),(2572,'Rhône','69',1076),(2573,'Saône-et-Loire','71',1076),(2574,'Sarthe','72',1076),(2575,'Savoie','73',1076),(2576,'Seine-et-Marne','77',1076),(2577,'Seine-Maritime','76',1076),(2578,'Seine-Saint-Denis','93',1076),(2579,'Somme','80',1076),(2580,'Tarn','81',1076),(2581,'Tarn-et-Garonne','82',1076),(2582,'Val d\'Oise','95',1076),(2583,'Territoire de Belfort','90',1076),(2584,'Val-de-Marne','94',1076),(2585,'Var','83',1076),(2586,'Vaucluse','84',1076),(2587,'Vendée','85',1076),(2588,'Vienne','86',1076),(2589,'Vosges','88',1076),(2590,'Yonne','89',1076),(2591,'Yvelines','78',1076),(2592,'Aberdeen City','ABE',1226),(2593,'Aberdeenshire','ABD',1226),(2594,'Angus','ANS',1226),(2595,'Co Antrim','ANT',1226),(2597,'Argyll and Bute','AGB',1226),(2598,'Co Armagh','ARM',1226),(2606,'Bedfordshire','BDF',1226),(2612,'Blaenau Gwent','BGW',1226),(2620,'Bristol, City of','BST',1226),(2622,'Buckinghamshire','BKM',1226),(2626,'Cambridgeshire','CAM',1226),(2634,'Cheshire','CHS',1226),(2635,'Clackmannanshire','CLK',1226),(2639,'Cornwall','CON',1226),(2643,'Cumbria','CMA',1226),(2647,'Derbyshire','DBY',1226),(2648,'Co Londonderry','DRY',1226),(2649,'Devon','DEV',1226),(2651,'Dorset','DOR',1226),(2652,'Co Down','DOW',1226),(2654,'Dumfries and Galloway','DGY',1226),(2655,'Dundee City','DND',1226),(2657,'County Durham','DUR',1226),(2659,'East Ayrshire','EAY',1226),(2660,'East Dunbartonshire','EDU',1226),(2661,'East Lothian','ELN',1226),(2662,'East Renfrewshire','ERW',1226),(2663,'East Riding of Yorkshire','ERY',1226),(2664,'East Sussex','ESX',1226),(2665,'Edinburgh, City of','EDH',1226),(2666,'Na h-Eileanan Siar','ELS',1226),(2668,'Essex','ESS',1226),(2669,'Falkirk','FAL',1226),(2670,'Co Fermanagh','FER',1226),(2671,'Fife','FIF',1226),(2674,'Glasgow City','GLG',1226),(2675,'Gloucestershire','GLS',1226),(2678,'Gwynedd','GWN',1226),(2682,'Hampshire','HAM',1226),(2687,'Herefordshire','HEF',1226),(2688,'Hertfordshire','HRT',1226),(2689,'Highland','HED',1226),(2692,'Inverclyde','IVC',1226),(2694,'Isle of Wight','IOW',1226),(2699,'Kent','KEN',1226),(2705,'Lancashire','LAN',1226),(2709,'Leicestershire','LEC',1226),(2712,'Lincolnshire','LIN',1226),(2723,'Midlothian','MLN',1226),(2726,'Moray','MRY',1226),(2734,'Norfolk','NFK',1226),(2735,'North Ayrshire','NAY',1226),(2738,'North Lanarkshire','NLK',1226),(2742,'North Yorkshire','NYK',1226),(2743,'Northamptonshire','NTH',1226),(2744,'Northumberland','NBL',1226),(2746,'Nottinghamshire','NTT',1226),(2747,'Oldham','OLD',1226),(2748,'Omagh','OMH',1226),(2749,'Orkney Islands','ORR',1226),(2750,'Oxfordshire','OXF',1226),(2752,'Perth and Kinross','PKN',1226),(2757,'Powys','POW',1226),(2761,'Renfrewshire','RFW',1226),(2766,'Rutland','RUT',1226),(2770,'Scottish Borders','SCB',1226),(2773,'Shetland Islands','ZET',1226),(2774,'Shropshire','SHR',1226),(2777,'Somerset','SOM',1226),(2778,'South Ayrshire','SAY',1226),(2779,'South Gloucestershire','SGC',1226),(2780,'South Lanarkshire','SLK',1226),(2785,'Staffordshire','STS',1226),(2786,'Stirling','STG',1226),(2791,'Suffolk','SFK',1226),(2793,'Surrey','SRY',1226),(2804,'Vale of Glamorgan, The','VGL',1226),(2811,'Warwickshire','WAR',1226),(2813,'West Dunbartonshire','WDU',1226),(2814,'West Lothian','WLN',1226),(2815,'West Sussex','WSX',1226),(2818,'Wiltshire','WIL',1226),(2823,'Worcestershire','WOR',1226),(2826,'Ashanti','AH',1083),(2827,'Brong-Ahafo','BA',1083),(2828,'Greater Accra','AA',1083),(2829,'Upper East','UE',1083),(2830,'Upper West','UW',1083),(2831,'Volta','TV',1083),(2832,'Banjul','B',1213),(2833,'Lower River','L',1213),(2834,'MacCarthy Island','M',1213),(2835,'North Bank','N',1213),(2836,'Upper River','U',1213),(2837,'Beyla','BE',1091),(2838,'Boffa','BF',1091),(2839,'Boke','BK',1091),(2840,'Coyah','CO',1091),(2841,'Dabola','DB',1091),(2842,'Dalaba','DL',1091),(2843,'Dinguiraye','DI',1091),(2844,'Dubreka','DU',1091),(2845,'Faranah','FA',1091),(2846,'Forecariah','FO',1091),(2847,'Fria','FR',1091),(2848,'Gaoual','GA',1091),(2849,'Guekedou','GU',1091),(2850,'Kankan','KA',1091),(2851,'Kerouane','KE',1091),(2852,'Kindia','KD',1091),(2853,'Kissidougou','KS',1091),(2854,'Koubia','KB',1091),(2855,'Koundara','KN',1091),(2856,'Kouroussa','KO',1091),(2857,'Labe','LA',1091),(2858,'Lelouma','LE',1091),(2859,'Lola','LO',1091),(2860,'Macenta','MC',1091),(2861,'Mali','ML',1091),(2862,'Mamou','MM',1091),(2863,'Mandiana','MD',1091),(2864,'Nzerekore','NZ',1091),(2865,'Pita','PI',1091),(2866,'Siguiri','SI',1091),(2867,'Telimele','TE',1091),(2868,'Tougue','TO',1091),(2869,'Yomou','YO',1091),(2870,'Region Continental','C',1067),(2871,'Region Insular','I',1067),(2872,'Annobon','AN',1067),(2873,'Bioko Norte','BN',1067),(2874,'Bioko Sur','BS',1067),(2875,'Centro Sur','CS',1067),(2876,'Kie-Ntem','KN',1067),(2877,'Litoral','LI',1067),(2878,'Wele-Nzas','WN',1067),(2879,'Achaïa','13',1085),(2880,'Aitolia-Akarnania','01',1085),(2881,'Argolis','11',1085),(2882,'Arkadia','12',1085),(2883,'Arta','31',1085),(2884,'Attiki','A1',1085),(2885,'Chalkidiki','64',1085),(2886,'Chania','94',1085),(2887,'Chios','85',1085),(2888,'Dodekanisos','81',1085),(2889,'Drama','52',1085),(2890,'Evros','71',1085),(2891,'Evrytania','05',1085),(2892,'Evvoia','04',1085),(2893,'Florina','63',1085),(2894,'Fokis','07',1085),(2895,'Fthiotis','06',1085),(2896,'Grevena','51',1085),(2897,'Ileia','14',1085),(2898,'Imathia','53',1085),(2899,'Ioannina','33',1085),(2900,'Irakleion','91',1085),(2901,'Karditsa','41',1085),(2902,'Kastoria','56',1085),(2903,'Kavalla','55',1085),(2904,'Kefallinia','23',1085),(2905,'Kerkyra','22',1085),(2906,'Kilkis','57',1085),(2907,'Korinthia','15',1085),(2908,'Kozani','58',1085),(2909,'Kyklades','82',1085),(2910,'Lakonia','16',1085),(2911,'Larisa','42',1085),(2912,'Lasithion','92',1085),(2913,'Lefkas','24',1085),(2914,'Lesvos','83',1085),(2915,'Magnisia','43',1085),(2916,'Messinia','17',1085),(2917,'Pella','59',1085),(2918,'Preveza','34',1085),(2919,'Rethymnon','93',1085),(2920,'Rodopi','73',1085),(2921,'Samos','84',1085),(2922,'Serrai','62',1085),(2923,'Thesprotia','32',1085),(2924,'Thessaloniki','54',1085),(2925,'Trikala','44',1085),(2926,'Voiotia','03',1085),(2927,'Xanthi','72',1085),(2928,'Zakynthos','21',1085),(2929,'Agio Oros','69',1085),(2930,'Alta Verapaz','AV',1090),(2931,'Baja Verapaz','BV',1090),(2932,'Chimaltenango','CM',1090),(2933,'Chiquimula','CQ',1090),(2934,'El Progreso','PR',1090),(2935,'Escuintla','ES',1090),(2936,'Guatemala','GU',1090),(2937,'Huehuetenango','HU',1090),(2938,'Izabal','IZ',1090),(2939,'Jalapa','JA',1090),(2940,'Jutiapa','JU',1090),(2941,'Peten','PE',1090),(2942,'Quetzaltenango','QZ',1090),(2943,'Quiche','QC',1090),(2944,'Retalhuleu','RE',1090),(2945,'Sacatepequez','SA',1090),(2946,'San Marcos','SM',1090),(2947,'Santa Rosa','SR',1090),(2948,'Sololá','SO',1090),(2949,'Suchitepequez','SU',1090),(2950,'Totonicapan','TO',1090),(2951,'Zacapa','ZA',1090),(2952,'Bissau','BS',1092),(2953,'Bafata','BA',1092),(2954,'Biombo','BM',1092),(2955,'Bolama','BL',1092),(2956,'Cacheu','CA',1092),(2957,'Gabu','GA',1092),(2958,'Oio','OI',1092),(2959,'Quloara','QU',1092),(2960,'Tombali S','TO',1092),(2961,'Barima-Waini','BA',1093),(2962,'Cuyuni-Mazaruni','CU',1093),(2963,'Demerara-Mahaica','DE',1093),(2964,'East Berbice-Corentyne','EB',1093),(2965,'Essequibo Islands-West Demerara','ES',1093),(2966,'Mahaica-Berbice','MA',1093),(2967,'Pomeroon-Supenaam','PM',1093),(2968,'Potaro-Siparuni','PT',1093),(2969,'Upper Demerara-Berbice','UD',1093),(2970,'Upper Takutu-Upper Essequibo','UT',1093),(2971,'Atlantida','AT',1097),(2972,'Colon','CL',1097),(2973,'Comayagua','CM',1097),(2974,'Copan','CP',1097),(2975,'Cortes','CR',1097),(2976,'Choluteca','CH',1097),(2977,'El Paraiso','EP',1097),(2978,'Francisco Morazan','FM',1097),(2979,'Gracias a Dios','GD',1097),(2980,'Intibuca','IN',1097),(2981,'Islas de la Bahia','IB',1097),(2982,'Lempira','LE',1097),(2983,'Ocotepeque','OC',1097),(2984,'Olancho','OL',1097),(2985,'Santa Barbara','SB',1097),(2986,'Valle','VA',1097),(2987,'Yoro','YO',1097),(2988,'Bjelovarsko-bilogorska zupanija','07',1055),(2989,'Brodsko-posavska zupanija','12',1055),(2990,'Dubrovacko-neretvanska zupanija','19',1055),(2991,'Istarska zupanija','18',1055),(2992,'Karlovacka zupanija','04',1055),(2993,'Koprivnickco-krizevacka zupanija','06',1055),(2994,'Krapinako-zagorska zupanija','02',1055),(2995,'Licko-senjska zupanija','09',1055),(2996,'Medimurska zupanija','20',1055),(2997,'Osjecko-baranjska zupanija','14',1055),(2998,'Pozesko-slavonska zupanija','11',1055),(2999,'Primorsko-goranska zupanija','08',1055),(3000,'Sisacko-moelavacka Iupanija','03',1055),(3001,'Splitako-dalmatinska zupanija','17',1055),(3002,'Sibenako-kninska zupanija','15',1055),(3003,'Varaidinska zupanija','05',1055),(3004,'VirovitiEko-podravska zupanija','10',1055),(3005,'VuRovarako-srijemska zupanija','16',1055),(3006,'Zadaraka','13',1055),(3007,'Zagrebacka zupanija','01',1055),(3008,'Grande-Anse','GA',1094),(3009,'Nord-Est','NE',1094),(3010,'Nord-Ouest','NO',1094),(3011,'Ouest','OU',1094),(3012,'Sud','SD',1094),(3013,'Sud-Est','SE',1094),(3014,'Budapest','BU',1099),(3015,'Bács-Kiskun','BK',1099),(3016,'Baranya','BA',1099),(3017,'Békés','BE',1099),(3018,'Borsod-Abaúj-Zemplén','BZ',1099),(3019,'Csongrád','CS',1099),(3020,'Fejér','FE',1099),(3021,'Győr-Moson-Sopron','GS',1099),(3022,'Hajdu-Bihar','HB',1099),(3023,'Heves','HE',1099),(3024,'Jász-Nagykun-Szolnok','JN',1099),(3025,'Komárom-Esztergom','KE',1099),(3026,'Nográd','NO',1099),(3027,'Pest','PE',1099),(3028,'Somogy','SO',1099),(3029,'Szabolcs-Szatmár-Bereg','SZ',1099),(3030,'Tolna','TO',1099),(3031,'Vas','VA',1099),(3032,'Veszprém','VE',1099),(3033,'Zala','ZA',1099),(3034,'Békéscsaba','BC',1099),(3035,'Debrecen','DE',1099),(3036,'Dunaújváros','DU',1099),(3037,'Eger','EG',1099),(3038,'Győr','GY',1099),(3039,'Hódmezővásárhely','HV',1099),(3040,'Kaposvár','KV',1099),(3041,'Kecskemét','KM',1099),(3042,'Miskolc','MI',1099),(3043,'Nagykanizsa','NK',1099),(3044,'Nyiregyháza','NY',1099),(3045,'Pécs','PS',1099),(3046,'Salgótarján','ST',1099),(3047,'Sopron','SN',1099),(3048,'Szeged','SD',1099),(3049,'Székesfehérvár','SF',1099),(3050,'Szekszárd','SS',1099),(3051,'Szolnok','SK',1099),(3052,'Szombathely','SH',1099),(3053,'Tatabánya','TB',1099),(3054,'Zalaegerszeg','ZE',1099),(3055,'Bali','BA',1102),(3056,'Kepulauan Bangka Belitung','BB',1102),(3057,'Banten','BT',1102),(3058,'Bengkulu','BE',1102),(3059,'Gorontalo','GO',1102),(3060,'Papua Barat','PB',1102),(3061,'Jambi','JA',1102),(3062,'Jawa Barat','JB',1102),(3063,'Jawa Tengah','JT',1102),(3064,'Jawa Timur','JI',1102),(3065,'Kalimantan Barat','KB',1102),(3066,'Kalimantan Timur','KI',1102),(3067,'Kalimantan Selatan','KS',1102),(3068,'Kepulauan Riau','KR',1102),(3069,'Lampung','LA',1102),(3070,'Maluku','MA',1102),(3071,'Maluku Utara','MU',1102),(3072,'Nusa Tenggara Barat','NB',1102),(3073,'Nusa Tenggara Timur','NT',1102),(3074,'Papua','PA',1102),(3075,'Riau','RI',1102),(3076,'Sulawesi Selatan','SN',1102),(3077,'Sulawesi Tengah','ST',1102),(3078,'Sulawesi Tenggara','SG',1102),(3079,'Sulawesi Utara','SA',1102),(3080,'Sumatra Barat','SB',1102),(3081,'Sumatra Selatan','SS',1102),(3082,'Sumatera Utara','SU',1102),(3083,'DKI Jakarta','JK',1102),(3084,'Aceh','AC',1102),(3085,'DI Yogyakarta','YO',1102),(3086,'Cork','C',1105),(3087,'Clare','CE',1105),(3088,'Cavan','CN',1105),(3089,'Carlow','CW',1105),(3090,'Dublin','D',1105),(3091,'Donegal','DL',1105),(3092,'Galway','G',1105),(3093,'Kildare','KE',1105),(3094,'Kilkenny','KK',1105),(3095,'Kerry','KY',1105),(3096,'Longford','LD',1105),(3097,'Louth','LH',1105),(3098,'Limerick','LK',1105),(3099,'Leitrim','LM',1105),(3100,'Laois','LS',1105),(3101,'Meath','MH',1105),(3102,'Monaghan','MN',1105),(3103,'Mayo','MO',1105),(3104,'Offaly','OY',1105),(3105,'Roscommon','RN',1105),(3106,'Sligo','SO',1105),(3107,'Tipperary','TA',1105),(3108,'Waterford','WD',1105),(3109,'Westmeath','WH',1105),(3110,'Wicklow','WW',1105),(3111,'Wexford','WX',1105),(3112,'HaDarom','D',1106),(3113,'HaMerkaz','M',1106),(3114,'HaZafon','Z',1106),(3115,'Haifa','HA',1106),(3116,'Tel-Aviv','TA',1106),(3117,'Jerusalem','JM',1106),(3118,'Al Anbar','AN',1104),(3119,'Al Ba,rah','BA',1104),(3120,'Al Muthanna','MU',1104),(3121,'Al Qadisiyah','QA',1104),(3122,'An Najef','NA',1104),(3123,'Arbil','AR',1104),(3124,'As Sulaymaniyah','SW',1104),(3125,'At Ta\'mim','TS',1104),(3126,'Babil','BB',1104),(3127,'Baghdad','BG',1104),(3128,'Dahuk','DA',1104),(3129,'Dhi Qar','DQ',1104),(3130,'Diyala','DI',1104),(3131,'Karbala\'','KA',1104),(3132,'Maysan','MA',1104),(3133,'Ninawa','NI',1104),(3134,'Salah ad Din','SD',1104),(3135,'Wasit','WA',1104),(3136,'Ardabil','03',1103),(3137,'Azarbayjan-e Gharbi','02',1103),(3138,'Azarbayjan-e Sharqi','01',1103),(3139,'Bushehr','06',1103),(3140,'Chahar Mahall va Bakhtiari','08',1103),(3141,'Esfahan','04',1103),(3142,'Fars','14',1103),(3143,'Gilan','19',1103),(3144,'Golestan','27',1103),(3145,'Hamadan','24',1103),(3146,'Hormozgan','23',1103),(3147,'Iiam','05',1103),(3148,'Kerman','15',1103),(3149,'Kermanshah','17',1103),(3150,'Khorasan','09',1103),(3151,'Khuzestan','10',1103),(3152,'Kohjiluyeh va Buyer Ahmad','18',1103),(3153,'Kordestan','16',1103),(3154,'Lorestan','20',1103),(3155,'Markazi','22',1103),(3156,'Mazandaran','21',1103),(3157,'Qazvin','28',1103),(3158,'Qom','26',1103),(3159,'Semnan','12',1103),(3160,'Sistan va Baluchestan','13',1103),(3161,'Tehran','07',1103),(3162,'Yazd','25',1103),(3163,'Zanjan','11',1103),(3164,'Austurland','7',1100),(3165,'Hofuoborgarsvaeoi utan Reykjavikur','1',1100),(3166,'Norourland eystra','6',1100),(3167,'Norourland vestra','5',1100),(3168,'Reykjavik','0',1100),(3169,'Suourland','8',1100),(3170,'Suournes','2',1100),(3171,'Vestfirolr','4',1100),(3172,'Vesturland','3',1100),(3173,'Agrigento','AG',1107),(3174,'Alessandria','AL',1107),(3175,'Ancona','AN',1107),(3176,'Aosta','AO',1107),(3177,'Arezzo','AR',1107),(3178,'Ascoli Piceno','AP',1107),(3179,'Asti','AT',1107),(3180,'Avellino','AV',1107),(3181,'Bari','BA',1107),(3182,'Belluno','BL',1107),(3183,'Benevento','BN',1107),(3184,'Bergamo','BG',1107),(3185,'Biella','BI',1107),(3186,'Bologna','BO',1107),(3187,'Bolzano','BZ',1107),(3188,'Brescia','BS',1107),(3189,'Brindisi','BR',1107),(3190,'Cagliari','CA',1107),(3191,'Caltanissetta','CL',1107),(3192,'Campobasso','CB',1107),(3193,'Caserta','CE',1107),(3194,'Catania','CT',1107),(3195,'Catanzaro','CZ',1107),(3196,'Chieti','CH',1107),(3197,'Como','CO',1107),(3198,'Cosenza','CS',1107),(3199,'Cremona','CR',1107),(3200,'Crotone','KR',1107),(3201,'Cuneo','CN',1107),(3202,'Enna','EN',1107),(3203,'Ferrara','FE',1107),(3204,'Firenze','FI',1107),(3205,'Foggia','FG',1107),(3206,'Forlì-Cesena','FC',1107),(3207,'Frosinone','FR',1107),(3208,'Genova','GE',1107),(3209,'Gorizia','GO',1107),(3210,'Grosseto','GR',1107),(3211,'Imperia','IM',1107),(3212,'Isernia','IS',1107),(3213,'L\'Aquila','AQ',1107),(3214,'La Spezia','SP',1107),(3215,'Latina','LT',1107),(3216,'Lecce','LE',1107),(3217,'Lecco','LC',1107),(3218,'Livorno','LI',1107),(3219,'Lodi','LO',1107),(3220,'Lucca','LU',1107),(3221,'Macerata','MC',1107),(3222,'Mantova','MN',1107),(3223,'Massa-Carrara','MS',1107),(3224,'Matera','MT',1107),(3225,'Messina','ME',1107),(3226,'Milano','MI',1107),(3227,'Modena','MO',1107),(3228,'Napoli','NA',1107),(3229,'Novara','NO',1107),(3230,'Nuoro','NU',1107),(3231,'Oristano','OR',1107),(3232,'Padova','PD',1107),(3233,'Palermo','PA',1107),(3234,'Parma','PR',1107),(3235,'Pavia','PV',1107),(3236,'Perugia','PG',1107),(3237,'Pesaro e Urbino','PU',1107),(3238,'Pescara','PE',1107),(3239,'Piacenza','PC',1107),(3240,'Pisa','PI',1107),(3241,'Pistoia','PT',1107),(3242,'Pordenone','PN',1107),(3243,'Potenza','PZ',1107),(3244,'Prato','PO',1107),(3245,'Ragusa','RG',1107),(3246,'Ravenna','RA',1107),(3247,'Reggio Calabria','RC',1107),(3248,'Reggio Emilia','RE',1107),(3249,'Rieti','RI',1107),(3250,'Rimini','RN',1107),(3251,'Roma','RM',1107),(3252,'Rovigo','RO',1107),(3253,'Salerno','SA',1107),(3254,'Sassari','SS',1107),(3255,'Savona','SV',1107),(3256,'Siena','SI',1107),(3257,'Siracusa','SR',1107),(3258,'Sondrio','SO',1107),(3259,'Taranto','TA',1107),(3260,'Teramo','TE',1107),(3261,'Terni','TR',1107),(3262,'Torino','TO',1107),(3263,'Trapani','TP',1107),(3264,'Trento','TN',1107),(3265,'Treviso','TV',1107),(3266,'Trieste','TS',1107),(3267,'Udine','UD',1107),(3268,'Varese','VA',1107),(3269,'Venezia','VE',1107),(3270,'Verbano-Cusio-Ossola','VB',1107),(3271,'Vercelli','VC',1107),(3272,'Verona','VR',1107),(3273,'Vibo Valentia','VV',1107),(3274,'Vicenza','VI',1107),(3275,'Viterbo','VT',1107),(3276,'Aichi','23',1109),(3277,'Akita','05',1109),(3278,'Aomori','02',1109),(3279,'Chiba','12',1109),(3280,'Ehime','38',1109),(3281,'Fukui','18',1109),(3282,'Fukuoka','40',1109),(3283,'Fukusima','07',1109),(3284,'Gifu','21',1109),(3285,'Gunma','10',1109),(3286,'Hiroshima','34',1109),(3287,'Hokkaido','01',1109),(3288,'Hyogo','28',1109),(3289,'Ibaraki','08',1109),(3290,'Ishikawa','17',1109),(3291,'Iwate','03',1109),(3292,'Kagawa','37',1109),(3293,'Kagoshima','46',1109),(3294,'Kanagawa','14',1109),(3295,'Kochi','39',1109),(3296,'Kumamoto','43',1109),(3297,'Kyoto','26',1109),(3298,'Mie','24',1109),(3299,'Miyagi','04',1109),(3300,'Miyazaki','45',1109),(3301,'Nagano','20',1109),(3302,'Nagasaki','42',1109),(3303,'Nara','29',1109),(3304,'Niigata','15',1109),(3305,'Oita','44',1109),(3306,'Okayama','33',1109),(3307,'Okinawa','47',1109),(3308,'Osaka','27',1109),(3309,'Saga','41',1109),(3310,'Saitama','11',1109),(3311,'Shiga','25',1109),(3312,'Shimane','32',1109),(3313,'Shizuoka','22',1109),(3314,'Tochigi','09',1109),(3315,'Tokushima','36',1109),(3316,'Tokyo','13',1109),(3317,'Tottori','31',1109),(3318,'Toyama','16',1109),(3319,'Wakayama','30',1109),(3320,'Yamagata','06',1109),(3321,'Yamaguchi','35',1109),(3322,'Yamanashi','19',1109),(3323,'Clarendon','CN',1108),(3324,'Hanover','HR',1108),(3325,'Kingston','KN',1108),(3326,'Portland','PD',1108),(3327,'Saint Andrew','AW',1108),(3328,'Saint Ann','AN',1108),(3329,'Saint Catherine','CE',1108),(3330,'Saint Elizabeth','EH',1108),(3331,'Saint James','JS',1108),(3332,'Saint Mary','MY',1108),(3333,'Saint Thomas','TS',1108),(3334,'Trelawny','TY',1108),(3335,'Westmoreland','WD',1108),(3336,'Ajln','AJ',1110),(3337,'Al \'Aqaba','AQ',1110),(3338,'Al Balqa\'','BA',1110),(3339,'Al Karak','KA',1110),(3340,'Al Mafraq','MA',1110),(3341,'Amman','AM',1110),(3342,'At Tafilah','AT',1110),(3343,'Az Zarga','AZ',1110),(3344,'Irbid','JR',1110),(3345,'Jarash','JA',1110),(3346,'Ma\'an','MN',1110),(3347,'Madaba','MD',1110),(3353,'Bishkek','GB',1117),(3354,'Batken','B',1117),(3355,'Chu','C',1117),(3356,'Jalal-Abad','J',1117),(3357,'Naryn','N',1117),(3358,'Osh','O',1117),(3359,'Talas','T',1117),(3360,'Ysyk-Kol','Y',1117),(3361,'Krong Kaeb','23',1037),(3362,'Krong Pailin','24',1037),(3363,'Xrong Preah Sihanouk','18',1037),(3364,'Phnom Penh','12',1037),(3365,'Baat Dambang','2',1037),(3366,'Banteay Mean Chey','1',1037),(3367,'Rampong Chaam','3',1037),(3368,'Kampong Chhnang','4',1037),(3369,'Kampong Spueu','5',1037),(3370,'Kampong Thum','6',1037),(3371,'Kampot','7',1037),(3372,'Kandaal','8',1037),(3373,'Kach Kong','9',1037),(3374,'Krachoh','10',1037),(3375,'Mondol Kiri','11',1037),(3376,'Otdar Mean Chey','22',1037),(3377,'Pousaat','15',1037),(3378,'Preah Vihear','13',1037),(3379,'Prey Veaeng','14',1037),(3380,'Rotanak Kiri','16',1037),(3381,'Siem Reab','17',1037),(3382,'Stueng Traeng','19',1037),(3383,'Svaay Rieng','20',1037),(3384,'Taakaev','21',1037),(3385,'Gilbert Islands','G',1113),(3386,'Line Islands','L',1113),(3387,'Phoenix Islands','P',1113),(3388,'Anjouan Ndzouani','A',1049),(3389,'Grande Comore Ngazidja','G',1049),(3390,'Moheli Moili','M',1049),(3391,'Kaesong-si','KAE',1114),(3392,'Nampo-si','NAM',1114),(3393,'Pyongyang-ai','PYO',1114),(3394,'Chagang-do','CHA',1114),(3395,'Hamgyongbuk-do','HAB',1114),(3396,'Hamgyongnam-do','HAN',1114),(3397,'Hwanghaebuk-do','HWB',1114),(3398,'Hwanghaenam-do','HWN',1114),(3399,'Kangwon-do','KAN',1114),(3400,'Pyonganbuk-do','PYB',1114),(3401,'Pyongannam-do','PYN',1114),(3402,'Yanggang-do','YAN',1114),(3403,'Najin Sonbong-si','NAJ',1114),(3404,'Seoul Teugbyeolsi','11',1115),(3405,'Busan Gwang\'yeogsi','26',1115),(3406,'Daegu Gwang\'yeogsi','27',1115),(3407,'Daejeon Gwang\'yeogsi','30',1115),(3408,'Gwangju Gwang\'yeogsi','29',1115),(3409,'Incheon Gwang\'yeogsi','28',1115),(3410,'Ulsan Gwang\'yeogsi','31',1115),(3411,'Chungcheongbugdo','43',1115),(3412,'Chungcheongnamdo','44',1115),(3413,'Gang\'weondo','42',1115),(3414,'Gyeonggido','41',1115),(3415,'Gyeongsangbugdo','47',1115),(3416,'Gyeongsangnamdo','48',1115),(3417,'Jejudo','49',1115),(3418,'Jeonrabugdo','45',1115),(3419,'Jeonranamdo','46',1115),(3420,'Al Ahmadi','AH',1116),(3421,'Al Farwanlyah','FA',1116),(3422,'Al Jahrah','JA',1116),(3423,'Al Kuwayt','KU',1116),(3424,'Hawalli','HA',1116),(3425,'Almaty','ALA',1111),(3426,'Astana','AST',1111),(3427,'Almaty oblysy','ALM',1111),(3428,'Aqmola oblysy','AKM',1111),(3429,'Aqtobe oblysy','AKT',1111),(3430,'Atyrau oblyfiy','ATY',1111),(3431,'Batys Quzaqstan oblysy','ZAP',1111),(3432,'Mangghystau oblysy','MAN',1111),(3433,'Ongtustik Quzaqstan oblysy','YUZ',1111),(3434,'Pavlodar oblysy','PAV',1111),(3435,'Qaraghandy oblysy','KAR',1111),(3436,'Qostanay oblysy','KUS',1111),(3437,'Qyzylorda oblysy','KZY',1111),(3438,'Shyghys Quzaqstan oblysy','VOS',1111),(3439,'Soltustik Quzaqstan oblysy','SEV',1111),(3440,'Zhambyl oblysy Zhambylskaya oblast\'','ZHA',1111),(3441,'Vientiane','VT',1118),(3442,'Attapu','AT',1118),(3443,'Bokeo','BK',1118),(3444,'Bolikhamxai','BL',1118),(3445,'Champasak','CH',1118),(3446,'Houaphan','HO',1118),(3447,'Khammouan','KH',1118),(3448,'Louang Namtha','LM',1118),(3449,'Louangphabang','LP',1118),(3450,'Oudomxai','OU',1118),(3451,'Phongsali','PH',1118),(3452,'Salavan','SL',1118),(3453,'Savannakhet','SV',1118),(3454,'Xaignabouli','XA',1118),(3455,'Xiasomboun','XN',1118),(3456,'Xekong','XE',1118),(3457,'Xiangkhoang','XI',1118),(3458,'Beirut','BA',1120),(3459,'Beqaa','BI',1120),(3460,'Mount Lebanon','JL',1120),(3461,'North Lebanon','AS',1120),(3462,'South Lebanon','JA',1120),(3463,'Nabatieh','NA',1120),(3464,'Ampara','52',1199),(3465,'Anuradhapura','71',1199),(3466,'Badulla','81',1199),(3467,'Batticaloa','51',1199),(3468,'Colombo','11',1199),(3469,'Galle','31',1199),(3470,'Gampaha','12',1199),(3471,'Hambantota','33',1199),(3472,'Jaffna','41',1199),(3473,'Kalutara','13',1199),(3474,'Kandy','21',1199),(3475,'Kegalla','92',1199),(3476,'Kilinochchi','42',1199),(3477,'Kurunegala','61',1199),(3478,'Mannar','43',1199),(3479,'Matale','22',1199),(3480,'Matara','32',1199),(3481,'Monaragala','82',1199),(3482,'Mullaittivu','45',1199),(3483,'Nuwara Eliya','23',1199),(3484,'Polonnaruwa','72',1199),(3485,'Puttalum','62',1199),(3486,'Ratnapura','91',1199),(3487,'Trincomalee','53',1199),(3488,'VavunLya','44',1199),(3489,'Bomi','BM',1122),(3490,'Bong','BG',1122),(3491,'Grand Basaa','GB',1122),(3492,'Grand Cape Mount','CM',1122),(3493,'Grand Gedeh','GG',1122),(3494,'Grand Kru','GK',1122),(3495,'Lofa','LO',1122),(3496,'Margibi','MG',1122),(3497,'Maryland','MY',1122),(3498,'Montserrado','MO',1122),(3499,'Nimba','NI',1122),(3500,'Rivercess','RI',1122),(3501,'Sinoe','SI',1122),(3502,'Berea','D',1121),(3503,'Butha-Buthe','B',1121),(3504,'Leribe','C',1121),(3505,'Mafeteng','E',1121),(3506,'Maseru','A',1121),(3507,'Mohale\'s Hoek','F',1121),(3508,'Mokhotlong','J',1121),(3509,'Qacha\'s Nek','H',1121),(3510,'Quthing','G',1121),(3511,'Thaba-Tseka','K',1121),(3512,'Alytaus Apskritis','AL',1125),(3513,'Kauno Apskritis','KU',1125),(3514,'Klaipėdos Apskritis','KL',1125),(3515,'Marijampolės Apskritis','MR',1125),(3516,'Panevėžio Apskritis','PN',1125),(3517,'Šiaulių Apskritis','SA',1125),(3518,'Tauragės Apskritis','TA',1125),(3519,'Telšių Apskritis','TE',1125),(3520,'Utenos Apskritis','UT',1125),(3521,'Vilniaus Apskritis','VL',1125),(3522,'Diekirch','D',1126),(3523,'GreveNmacher','G',1126),(3550,'Daugavpils','DGV',1119),(3551,'Jelgava','JEL',1119),(3552,'Jūrmala','JUR',1119),(3553,'Liepāja','LPX',1119),(3554,'Rēzekne','REZ',1119),(3555,'Rīga','RIX',1119),(3556,'Ventspils','VEN',1119),(3557,'Ajdābiyā','AJ',1123),(3558,'Al Buţnān','BU',1123),(3559,'Al Hizām al Akhdar','HZ',1123),(3560,'Al Jabal al Akhdar','JA',1123),(3561,'Al Jifārah','JI',1123),(3562,'Al Jufrah','JU',1123),(3563,'Al Kufrah','KF',1123),(3564,'Al Marj','MJ',1123),(3565,'Al Marqab','MB',1123),(3566,'Al Qaţrūn','QT',1123),(3567,'Al Qubbah','QB',1123),(3568,'Al Wāhah','WA',1123),(3569,'An Nuqaţ al Khams','NQ',1123),(3570,'Ash Shāţi\'','SH',1123),(3571,'Az Zāwiyah','ZA',1123),(3572,'Banghāzī','BA',1123),(3573,'Banī Walīd','BW',1123),(3574,'Darnah','DR',1123),(3575,'Ghadāmis','GD',1123),(3576,'Gharyān','GR',1123),(3577,'Ghāt','GT',1123),(3578,'Jaghbūb','JB',1123),(3579,'Mişrātah','MI',1123),(3580,'Mizdah','MZ',1123),(3581,'Murzuq','MQ',1123),(3582,'Nālūt','NL',1123),(3583,'Sabhā','SB',1123),(3584,'Şabrātah Şurmān','SS',1123),(3585,'Surt','SR',1123),(3586,'Tājūrā\' wa an Nawāhī al Arbāh','TN',1123),(3587,'Ţarābulus','TB',1123),(3588,'Tarhūnah-Masallātah','TM',1123),(3589,'Wādī al hayāt','WD',1123),(3590,'Yafran-Jādū','YJ',1123),(3591,'Agadir','AGD',1146),(3592,'Aït Baha','BAH',1146),(3593,'Aït Melloul','MEL',1146),(3594,'Al Haouz','HAO',1146),(3595,'Al Hoceïma','HOC',1146),(3596,'Assa-Zag','ASZ',1146),(3597,'Azilal','AZI',1146),(3598,'Beni Mellal','BEM',1146),(3599,'Ben Sllmane','BES',1146),(3600,'Berkane','BER',1146),(3601,'Boujdour','BOD',1146),(3602,'Boulemane','BOM',1146),(3603,'Casablanca  [Dar el Beïda]','CAS',1146),(3604,'Chefchaouene','CHE',1146),(3605,'Chichaoua','CHI',1146),(3606,'El Hajeb','HAJ',1146),(3607,'El Jadida','JDI',1146),(3608,'Errachidia','ERR',1146),(3609,'Essaouira','ESI',1146),(3610,'Es Smara','ESM',1146),(3611,'Fès','FES',1146),(3612,'Figuig','FIG',1146),(3613,'Guelmim','GUE',1146),(3614,'Ifrane','IFR',1146),(3615,'Jerada','JRA',1146),(3616,'Kelaat Sraghna','KES',1146),(3617,'Kénitra','KEN',1146),(3618,'Khemisaet','KHE',1146),(3619,'Khenifra','KHN',1146),(3620,'Khouribga','KHO',1146),(3621,'Laâyoune (EH)','LAA',1146),(3622,'Larache','LAP',1146),(3623,'Marrakech','MAR',1146),(3624,'Meknsès','MEK',1146),(3625,'Nador','NAD',1146),(3626,'Ouarzazate','OUA',1146),(3627,'Oued ed Dahab (EH)','OUD',1146),(3628,'Oujda','OUJ',1146),(3629,'Rabat-Salé','RBA',1146),(3630,'Safi','SAF',1146),(3631,'Sefrou','SEF',1146),(3632,'Settat','SET',1146),(3633,'Sidl Kacem','SIK',1146),(3634,'Tanger','TNG',1146),(3635,'Tan-Tan','TNT',1146),(3636,'Taounate','TAO',1146),(3637,'Taroudannt','TAR',1146),(3638,'Tata','TAT',1146),(3639,'Taza','TAZ',1146),(3640,'Tétouan','TET',1146),(3641,'Tiznit','TIZ',1146),(3642,'Gagauzia, Unitate Teritoriala Autonoma','GA',1142),(3643,'Chisinau','CU',1142),(3644,'Stinga Nistrului, unitatea teritoriala din','SN',1142),(3645,'Balti','BA',1142),(3646,'Cahul','CA',1142),(3647,'Edinet','ED',1142),(3648,'Lapusna','LA',1142),(3649,'Orhei','OR',1142),(3650,'Soroca','SO',1142),(3651,'Taraclia','TA',1142),(3652,'Tighina [Bender]','TI',1142),(3653,'Ungheni','UN',1142),(3654,'Antananarivo','T',1129),(3655,'Antsiranana','D',1129),(3656,'Fianarantsoa','F',1129),(3657,'Mahajanga','M',1129),(3658,'Toamasina','A',1129),(3659,'Toliara','U',1129),(3660,'Ailinglapalap','ALL',1135),(3661,'Ailuk','ALK',1135),(3662,'Arno','ARN',1135),(3663,'Aur','AUR',1135),(3664,'Ebon','EBO',1135),(3665,'Eniwetok','ENI',1135),(3666,'Jaluit','JAL',1135),(3667,'Kili','KIL',1135),(3668,'Kwajalein','KWA',1135),(3669,'Lae','LAE',1135),(3670,'Lib','LIB',1135),(3671,'Likiep','LIK',1135),(3672,'Majuro','MAJ',1135),(3673,'Maloelap','MAL',1135),(3674,'Mejit','MEJ',1135),(3675,'Mili','MIL',1135),(3676,'Namorik','NMK',1135),(3677,'Namu','NMU',1135),(3678,'Rongelap','RON',1135),(3679,'Ujae','UJA',1135),(3680,'Ujelang','UJL',1135),(3681,'Utirik','UTI',1135),(3682,'Wotho','WTN',1135),(3683,'Wotje','WTJ',1135),(3684,'Bamako','BK0',1133),(3685,'Gao','7',1133),(3686,'Kayes','1',1133),(3687,'Kidal','8',1133),(3688,'Xoulikoro','2',1133),(3689,'Mopti','5',1133),(3690,'S69ou','4',1133),(3691,'Sikasso','3',1133),(3692,'Tombouctou','6',1133),(3693,'Ayeyarwady','07',1035),(3694,'Bago','02',1035),(3695,'Magway','03',1035),(3696,'Mandalay','04',1035),(3697,'Sagaing','01',1035),(3698,'Tanintharyi','05',1035),(3699,'Yangon','06',1035),(3700,'Chin','14',1035),(3701,'Kachin','11',1035),(3702,'Kayah','12',1035),(3703,'Kayin','13',1035),(3704,'Mon','15',1035),(3705,'Rakhine','16',1035),(3706,'Shan','17',1035),(3707,'Ulaanbaatar','1',1144),(3708,'Arhangay','073',1144),(3709,'Bayanhongor','069',1144),(3710,'Bayan-Olgiy','071',1144),(3711,'Bulgan','067',1144),(3712,'Darhan uul','037',1144),(3713,'Dornod','061',1144),(3714,'Dornogov,','063',1144),(3715,'DundgovL','059',1144),(3716,'Dzavhan','057',1144),(3717,'Govi-Altay','065',1144),(3718,'Govi-Smber','064',1144),(3719,'Hentiy','039',1144),(3720,'Hovd','043',1144),(3721,'Hovsgol','041',1144),(3722,'Omnogovi','053',1144),(3723,'Orhon','035',1144),(3724,'Ovorhangay','055',1144),(3725,'Selenge','049',1144),(3726,'Shbaatar','051',1144),(3727,'Tov','047',1144),(3728,'Uvs','046',1144),(3729,'Nouakchott','NKC',1137),(3730,'Assaba','03',1137),(3731,'Brakna','05',1137),(3732,'Dakhlet Nouadhibou','08',1137),(3733,'Gorgol','04',1137),(3734,'Guidimaka','10',1137),(3735,'Hodh ech Chargui','01',1137),(3736,'Hodh el Charbi','02',1137),(3737,'Inchiri','12',1137),(3738,'Tagant','09',1137),(3739,'Tiris Zemmour','11',1137),(3740,'Trarza','06',1137),(3741,'Beau Bassin-Rose Hill','BR',1138),(3742,'Curepipe','CU',1138),(3743,'Port Louis','PU',1138),(3744,'Quatre Bornes','QB',1138),(3745,'Vacosa-Phoenix','VP',1138),(3746,'Black River','BL',1138),(3747,'Flacq','FL',1138),(3748,'Grand Port','GP',1138),(3749,'Moka','MO',1138),(3750,'Pamplemousses','PA',1138),(3751,'Plaines Wilhems','PW',1138),(3752,'Riviere du Rempart','RP',1138),(3753,'Savanne','SA',1138),(3754,'Agalega Islands','AG',1138),(3755,'Cargados Carajos Shoals','CC',1138),(3756,'Rodrigues Island','RO',1138),(3757,'Male','MLE',1132),(3758,'Alif','02',1132),(3759,'Baa','20',1132),(3760,'Dhaalu','17',1132),(3761,'Faafu','14',1132),(3762,'Gaaf Alif','27',1132),(3763,'Gaefu Dhaalu','28',1132),(3764,'Gnaviyani','29',1132),(3765,'Haa Alif','07',1132),(3766,'Haa Dhaalu','23',1132),(3767,'Kaafu','26',1132),(3768,'Laamu','05',1132),(3769,'Lhaviyani','03',1132),(3770,'Meemu','12',1132),(3771,'Noonu','25',1132),(3772,'Raa','13',1132),(3773,'Seenu','01',1132),(3774,'Shaviyani','24',1132),(3775,'Thaa','08',1132),(3776,'Vaavu','04',1132),(3777,'Balaka','BA',1130),(3778,'Blantyre','BL',1130),(3779,'Chikwawa','CK',1130),(3780,'Chiradzulu','CR',1130),(3781,'Chitipa','CT',1130),(3782,'Dedza','DE',1130),(3783,'Dowa','DO',1130),(3784,'Karonga','KR',1130),(3785,'Kasungu','KS',1130),(3786,'Likoma Island','LK',1130),(3787,'Lilongwe','LI',1130),(3788,'Machinga','MH',1130),(3789,'Mangochi','MG',1130),(3790,'Mchinji','MC',1130),(3791,'Mulanje','MU',1130),(3792,'Mwanza','MW',1130),(3793,'Mzimba','MZ',1130),(3794,'Nkhata Bay','NB',1130),(3795,'Nkhotakota','NK',1130),(3796,'Nsanje','NS',1130),(3797,'Ntcheu','NU',1130),(3798,'Ntchisi','NI',1130),(3799,'Phalomba','PH',1130),(3800,'Rumphi','RU',1130),(3801,'Salima','SA',1130),(3802,'Thyolo','TH',1130),(3803,'Zomba','ZO',1130),(3804,'Aguascalientes','AGU',1140),(3805,'Baja California','BCN',1140),(3806,'Baja California Sur','BCS',1140),(3807,'Campeche','CAM',1140),(3808,'Coahuila','COA',1140),(3809,'Colima','COL',1140),(3810,'Chiapas','CHP',1140),(3811,'Chihuahua','CHH',1140),(3812,'Durango','DUR',1140),(3813,'Guanajuato','GUA',1140),(3814,'Guerrero','GRO',1140),(3815,'Hidalgo','HID',1140),(3816,'Jalisco','JAL',1140),(3817,'Mexico','MEX',1140),(3818,'Michoacin','MIC',1140),(3819,'Morelos','MOR',1140),(3820,'Nayarit','NAY',1140),(3821,'Nuevo Leon','NLE',1140),(3822,'Oaxaca','OAX',1140),(3823,'Puebla','PUE',1140),(3824,'Queretaro','QUE',1140),(3825,'Quintana Roo','ROO',1140),(3826,'San Luis Potosi','SLP',1140),(3827,'Sinaloa','SIN',1140),(3828,'Sonora','SON',1140),(3829,'Tabasco','TAB',1140),(3830,'Tamaulipas','TAM',1140),(3831,'Tlaxcala','TLA',1140),(3832,'Veracruz','VER',1140),(3833,'Yucatan','YUC',1140),(3834,'Zacatecas','ZAC',1140),(3835,'Wilayah Persekutuan Kuala Lumpur','14',1131),(3836,'Wilayah Persekutuan Labuan','15',1131),(3837,'Wilayah Persekutuan Putrajaya','16',1131),(3838,'Johor','01',1131),(3839,'Kedah','02',1131),(3840,'Kelantan','03',1131),(3841,'Melaka','04',1131),(3842,'Negeri Sembilan','05',1131),(3843,'Pahang','06',1131),(3844,'Perak','08',1131),(3845,'Perlis','09',1131),(3846,'Pulau Pinang','07',1131),(3847,'Sabah','12',1131),(3848,'Sarawak','13',1131),(3849,'Selangor','10',1131),(3850,'Terengganu','11',1131),(3851,'Maputo','MPM',1147),(3852,'Cabo Delgado','P',1147),(3853,'Gaza','G',1147),(3854,'Inhambane','I',1147),(3855,'Manica','B',1147),(3856,'Numpula','N',1147),(3857,'Niaaea','A',1147),(3858,'Sofala','S',1147),(3859,'Tete','T',1147),(3860,'Zambezia','Q',1147),(3861,'Caprivi','CA',1148),(3862,'Erongo','ER',1148),(3863,'Hardap','HA',1148),(3864,'Karas','KA',1148),(3865,'Khomas','KH',1148),(3866,'Kunene','KU',1148),(3867,'Ohangwena','OW',1148),(3868,'Okavango','OK',1148),(3869,'Omaheke','OH',1148),(3870,'Omusati','OS',1148),(3871,'Oshana','ON',1148),(3872,'Oshikoto','OT',1148),(3873,'Otjozondjupa','OD',1148),(3874,'Niamey','8',1156),(3875,'Agadez','1',1156),(3876,'Diffa','2',1156),(3877,'Dosso','3',1156),(3878,'Maradi','4',1156),(3879,'Tahoua','S',1156),(3880,'Tillaberi','6',1156),(3881,'Zinder','7',1156),(3882,'Abuja Federal Capital Territory','FC',1157),(3883,'Abia','AB',1157),(3884,'Adamawa','AD',1157),(3885,'Akwa Ibom','AK',1157),(3886,'Anambra','AN',1157),(3887,'Bauchi','BA',1157),(3888,'Bayelsa','BY',1157),(3889,'Benue','BE',1157),(3890,'Borno','BO',1157),(3891,'Cross River','CR',1157),(3892,'Delta','DE',1157),(3893,'Ebonyi','EB',1157),(3894,'Edo','ED',1157),(3895,'Ekiti','EK',1157),(3896,'Enugu','EN',1157),(3897,'Gombe','GO',1157),(3898,'Imo','IM',1157),(3899,'Jigawa','JI',1157),(3900,'Kaduna','KD',1157),(3901,'Kano','KN',1157),(3902,'Katsina','KT',1157),(3903,'Kebbi','KE',1157),(3904,'Kogi','KO',1157),(3905,'Kwara','KW',1157),(3906,'Lagos','LA',1157),(3907,'Nassarawa','NA',1157),(3908,'Niger','NI',1157),(3909,'Ogun','OG',1157),(3910,'Ondo','ON',1157),(3911,'Osun','OS',1157),(3912,'Oyo','OY',1157),(3913,'Rivers','RI',1157),(3914,'Sokoto','SO',1157),(3915,'Taraba','TA',1157),(3916,'Yobe','YO',1157),(3917,'Zamfara','ZA',1157),(3918,'Boaco','BO',1155),(3919,'Carazo','CA',1155),(3920,'Chinandega','CI',1155),(3921,'Chontales','CO',1155),(3922,'Esteli','ES',1155),(3923,'Jinotega','JI',1155),(3924,'Leon','LE',1155),(3925,'Madriz','MD',1155),(3926,'Managua','MN',1155),(3927,'Masaya','MS',1155),(3928,'Matagalpa','MT',1155),(3929,'Nueva Segovia','NS',1155),(3930,'Rio San Juan','SJ',1155),(3931,'Rivas','RI',1155),(3932,'Atlantico Norte','AN',1155),(3933,'Atlantico Sur','AS',1155),(3934,'Drente','DR',1152),(3935,'Flevoland','FL',1152),(3936,'Friesland','FR',1152),(3937,'Gelderland','GL',1152),(3938,'Groningen','GR',1152),(3939,'Noord-Brabant','NB',1152),(3940,'Noord-Holland','NH',1152),(3941,'Overijssel','OV',1152),(3942,'Utrecht','UT',1152),(3943,'Zuid-Holland','ZH',1152),(3944,'Zeeland','ZL',1152),(3945,'Akershus','02',1161),(3946,'Aust-Agder','09',1161),(3947,'Buskerud','06',1161),(3948,'Finnmark','20',1161),(3949,'Hedmark','04',1161),(3950,'Hordaland','12',1161),(3951,'Møre og Romsdal','15',1161),(3952,'Nordland','18',1161),(3953,'Nord-Trøndelag','17',1161),(3954,'Oppland','05',1161),(3955,'Oslo','03',1161),(3956,'Rogaland','11',1161),(3957,'Sogn og Fjordane','14',1161),(3958,'Sør-Trøndelag','16',1161),(3959,'Telemark','06',1161),(3960,'Troms','19',1161),(3961,'Vest-Agder','10',1161),(3962,'Vestfold','07',1161),(3963,'Østfold','01',1161),(3964,'Jan Mayen','22',1161),(3965,'Svalbard','21',1161),(3966,'Auckland','AUK',1154),(3967,'Bay of Plenty','BOP',1154),(3968,'Canterbury','CAN',1154),(3969,'Gisborne','GIS',1154),(3970,'Hawkes Bay','HKB',1154),(3971,'Manawatu-Wanganui','MWT',1154),(3972,'Marlborough','MBH',1154),(3973,'Nelson','NSN',1154),(3974,'Northland','NTL',1154),(3975,'Otago','OTA',1154),(3976,'Southland','STL',1154),(3977,'Taranaki','TKI',1154),(3978,'Tasman','TAS',1154),(3979,'Waikato','WKO',1154),(3980,'Wellington','WGN',1154),(3981,'West Coast','WTC',1154),(3982,'Ad Dakhillyah','DA',1162),(3983,'Al Batinah','BA',1162),(3984,'Al Janblyah','JA',1162),(3985,'Al Wusta','WU',1162),(3986,'Ash Sharqlyah','SH',1162),(3987,'Az Zahirah','ZA',1162),(3988,'Masqat','MA',1162),(3989,'Musandam','MU',1162),(3990,'Bocas del Toro','1',1166),(3991,'Cocle','2',1166),(3992,'Chiriqui','4',1166),(3993,'Darien','5',1166),(3994,'Herrera','6',1166),(3995,'Loa Santoa','7',1166),(3996,'Panama','8',1166),(3997,'Veraguas','9',1166),(3998,'Comarca de San Blas','Q',1166),(3999,'El Callao','CAL',1169),(4000,'Ancash','ANC',1169),(4001,'Apurimac','APU',1169),(4002,'Arequipa','ARE',1169),(4003,'Ayacucho','AYA',1169),(4004,'Cajamarca','CAJ',1169),(4005,'Cuzco','CUS',1169),(4006,'Huancavelica','HUV',1169),(4007,'Huanuco','HUC',1169),(4008,'Ica','ICA',1169),(4009,'Junin','JUN',1169),(4010,'La Libertad','LAL',1169),(4011,'Lambayeque','LAM',1169),(4012,'Lima','LIM',1169),(4013,'Loreto','LOR',1169),(4014,'Madre de Dios','MDD',1169),(4015,'Moquegua','MOQ',1169),(4016,'Pasco','PAS',1169),(4017,'Piura','PIU',1169),(4018,'Puno','PUN',1169),(4019,'San Martin','SAM',1169),(4020,'Tacna','TAC',1169),(4021,'Tumbes','TUM',1169),(4022,'Ucayali','UCA',1169),(4023,'National Capital District (Port Moresby)','NCD',1167),(4024,'Chimbu','CPK',1167),(4025,'Eastern Highlands','EHG',1167),(4026,'East New Britain','EBR',1167),(4027,'East Sepik','ESW',1167),(4028,'Enga','EPW',1167),(4029,'Gulf','GPK',1167),(4030,'Madang','MPM',1167),(4031,'Manus','MRL',1167),(4032,'Milne Bay','MBA',1167),(4033,'Morobe','MPL',1167),(4034,'New Ireland','NIK',1167),(4035,'North Solomons','NSA',1167),(4036,'Santaun','SAN',1167),(4037,'Southern Highlands','SHM',1167),(4038,'Western Highlands','WHM',1167),(4039,'West New Britain','WBK',1167),(4040,'Abra','ABR',1170),(4041,'Agusan del Norte','AGN',1170),(4042,'Agusan del Sur','AGS',1170),(4043,'Aklan','AKL',1170),(4044,'Albay','ALB',1170),(4045,'Antique','ANT',1170),(4046,'Apayao','APA',1170),(4047,'Aurora','AUR',1170),(4048,'Basilan','BAS',1170),(4049,'Bataan','BAN',1170),(4050,'Batanes','BTN',1170),(4051,'Batangas','BTG',1170),(4052,'Benguet','BEN',1170),(4053,'Biliran','BIL',1170),(4054,'Bohol','BOH',1170),(4055,'Bukidnon','BUK',1170),(4056,'Bulacan','BUL',1170),(4057,'Cagayan','CAG',1170),(4058,'Camarines Norte','CAN',1170),(4059,'Camarines Sur','CAS',1170),(4060,'Camiguin','CAM',1170),(4061,'Capiz','CAP',1170),(4062,'Catanduanes','CAT',1170),(4063,'Cavite','CAV',1170),(4064,'Cebu','CEB',1170),(4065,'Compostela Valley','COM',1170),(4066,'Davao','DAV',1170),(4067,'Davao del Sur','DAS',1170),(4068,'Davao Oriental','DAO',1170),(4069,'Eastern Samar','EAS',1170),(4070,'Guimaras','GUI',1170),(4071,'Ifugao','IFU',1170),(4072,'Ilocos Norte','ILN',1170),(4073,'Ilocos Sur','ILS',1170),(4074,'Iloilo','ILI',1170),(4075,'Isabela','ISA',1170),(4076,'Kalinga-Apayso','KAL',1170),(4077,'Laguna','LAG',1170),(4078,'Lanao del Norte','LAN',1170),(4079,'Lanao del Sur','LAS',1170),(4080,'La Union','LUN',1170),(4081,'Leyte','LEY',1170),(4082,'Maguindanao','MAG',1170),(4083,'Marinduque','MAD',1170),(4084,'Masbate','MAS',1170),(4085,'Mindoro Occidental','MDC',1170),(4086,'Mindoro Oriental','MDR',1170),(4087,'Misamis Occidental','MSC',1170),(4088,'Misamis Oriental','MSR',1170),(4089,'Mountain Province','MOU',1170),(4090,'Negroe Occidental','NEC',1170),(4091,'Negros Oriental','NER',1170),(4092,'North Cotabato','NCO',1170),(4093,'Northern Samar','NSA',1170),(4094,'Nueva Ecija','NUE',1170),(4095,'Nueva Vizcaya','NUV',1170),(4096,'Palawan','PLW',1170),(4097,'Pampanga','PAM',1170),(4098,'Pangasinan','PAN',1170),(4099,'Quezon','QUE',1170),(4100,'Quirino','QUI',1170),(4101,'Rizal','RIZ',1170),(4102,'Romblon','ROM',1170),(4103,'Sarangani','SAR',1170),(4104,'Siquijor','SIG',1170),(4105,'Sorsogon','SOR',1170),(4106,'South Cotabato','SCO',1170),(4107,'Southern Leyte','SLE',1170),(4108,'Sultan Kudarat','SUK',1170),(4109,'Sulu','SLU',1170),(4110,'Surigao del Norte','SUN',1170),(4111,'Surigao del Sur','SUR',1170),(4112,'Tarlac','TAR',1170),(4113,'Tawi-Tawi','TAW',1170),(4114,'Western Samar','WSA',1170),(4115,'Zambales','ZMB',1170),(4116,'Zamboanga del Norte','ZAN',1170),(4117,'Zamboanga del Sur','ZAS',1170),(4118,'Zamboanga Sibiguey','ZSI',1170),(4119,'Islamabad Federal Capital Area','IS',1163),(4120,'Baluchistan','BA',1163),(4121,'Khyber Pakhtun Khawa','NW',1163),(4122,'Sindh','SD',1163),(4123,'Federally Administered Tribal Areas','TA',1163),(4124,'Azad Kashmir','JK',1163),(4125,'Gilgit-Baltistan','NA',1163),(4126,'Aveiro','01',1173),(4127,'Beja','02',1173),(4128,'Braga','03',1173),(4129,'Bragança','04',1173),(4130,'Castelo Branco','05',1173),(4131,'Coimbra','06',1173),(4132,'Évora','07',1173),(4133,'Faro','08',1173),(4134,'Guarda','09',1173),(4135,'Leiria','10',1173),(4136,'Lisboa','11',1173),(4137,'Portalegre','12',1173),(4138,'Porto','13',1173),(4139,'Santarém','14',1173),(4140,'Setúbal','15',1173),(4141,'Viana do Castelo','16',1173),(4142,'Vila Real','17',1173),(4143,'Viseu','18',1173),(4144,'Região Autónoma dos Açores','20',1173),(4145,'Região Autónoma da Madeira','30',1173),(4146,'Asuncion','ASU',1168),(4147,'Alto Paraguay','16',1168),(4148,'Alto Parana','10',1168),(4149,'Amambay','13',1168),(4150,'Boqueron','19',1168),(4151,'Caeguazu','5',1168),(4152,'Caazapl','6',1168),(4153,'Canindeyu','14',1168),(4154,'Concepcion','1',1168),(4155,'Cordillera','3',1168),(4156,'Guaira','4',1168),(4157,'Itapua','7',1168),(4158,'Miaiones','8',1168),(4159,'Neembucu','12',1168),(4160,'Paraguari','9',1168),(4161,'Presidente Hayes','15',1168),(4162,'San Pedro','2',1168),(4163,'Ad Dawhah','DA',1175),(4164,'Al Ghuwayriyah','GH',1175),(4165,'Al Jumayliyah','JU',1175),(4166,'Al Khawr','KH',1175),(4167,'Al Wakrah','WA',1175),(4168,'Ar Rayyan','RA',1175),(4169,'Jariyan al Batnah','JB',1175),(4170,'Madinat ash Shamal','MS',1175),(4171,'Umm Salal','US',1175),(4172,'Bucuresti','B',1176),(4173,'Alba','AB',1176),(4174,'Arad','AR',1176),(4175,'Argeș','AG',1176),(4176,'Bacău','BC',1176),(4177,'Bihor','BH',1176),(4178,'Bistrița-Năsăud','BN',1176),(4179,'Botoșani','BT',1176),(4180,'Brașov','BV',1176),(4181,'Brăila','BR',1176),(4182,'Buzău','BZ',1176),(4183,'Caraș-Severin','CS',1176),(4184,'Călărași','CL',1176),(4185,'Cluj','CJ',1176),(4186,'Constanța','CT',1176),(4187,'Covasna','CV',1176),(4188,'Dâmbovița','DB',1176),(4189,'Dolj','DJ',1176),(4190,'Galați','GL',1176),(4191,'Giurgiu','GR',1176),(4192,'Gorj','GJ',1176),(4193,'Harghita','HR',1176),(4194,'Hunedoara','HD',1176),(4195,'Ialomița','IL',1176),(4196,'Iași','IS',1176),(4197,'Ilfov','IF',1176),(4198,'Maramureș','MM',1176),(4199,'Mehedinți','MH',1176),(4200,'Mureș','MS',1176),(4201,'Neamț','NT',1176),(4202,'Olt','OT',1176),(4203,'Prahova','PH',1176),(4204,'Satu Mare','SM',1176),(4205,'Sălaj','SJ',1176),(4206,'Sibiu','SB',1176),(4207,'Suceava','SV',1176),(4208,'Teleorman','TR',1176),(4209,'Timiș','TM',1176),(4210,'Tulcea','TL',1176),(4211,'Vaslui','VS',1176),(4212,'Vâlcea','VL',1176),(4213,'Vrancea','VN',1176),(4214,'Adygeya, Respublika','AD',1177),(4215,'Altay, Respublika','AL',1177),(4216,'Bashkortostan, Respublika','BA',1177),(4217,'Buryatiya, Respublika','BU',1177),(4218,'Chechenskaya Respublika','CE',1177),(4219,'Chuvashskaya Respublika','CU',1177),(4220,'Dagestan, Respublika','DA',1177),(4221,'Ingushskaya Respublika','IN',1177),(4222,'Kabardino-Balkarskaya','KB',1177),(4223,'Kalmykiya, Respublika','KL',1177),(4224,'Karachayevo-Cherkesskaya Respublika','KC',1177),(4225,'Kareliya, Respublika','KR',1177),(4226,'Khakasiya, Respublika','KK',1177),(4227,'Komi, Respublika','KO',1177),(4228,'Mariy El, Respublika','ME',1177),(4229,'Mordoviya, Respublika','MO',1177),(4230,'Sakha, Respublika [Yakutiya]','SA',1177),(4231,'Severnaya Osetiya, Respublika','SE',1177),(4232,'Tatarstan, Respublika','TA',1177),(4233,'Tyva, Respublika [Tuva]','TY',1177),(4234,'Udmurtskaya Respublika','UD',1177),(4235,'Altayskiy kray','ALT',1177),(4236,'Khabarovskiy kray','KHA',1177),(4237,'Krasnodarskiy kray','KDA',1177),(4238,'Krasnoyarskiy kray','KYA',1177),(4239,'Primorskiy kray','PRI',1177),(4240,'Stavropol\'skiy kray','STA',1177),(4241,'Amurskaya oblast\'','AMU',1177),(4242,'Arkhangel\'skaya oblast\'','ARK',1177),(4243,'Astrakhanskaya oblast\'','AST',1177),(4244,'Belgorodskaya oblast\'','BEL',1177),(4245,'Bryanskaya oblast\'','BRY',1177),(4246,'Chelyabinskaya oblast\'','CHE',1177),(4247,'Zabaykalsky Krai\'','ZSK',1177),(4248,'Irkutskaya oblast\'','IRK',1177),(4249,'Ivanovskaya oblast\'','IVA',1177),(4250,'Kaliningradskaya oblast\'','KGD',1177),(4251,'Kaluzhskaya oblast\'','KLU',1177),(4252,'Kamchatka Krai\'','KAM',1177),(4253,'Kemerovskaya oblast\'','KEM',1177),(4254,'Kirovskaya oblast\'','KIR',1177),(4255,'Kostromskaya oblast\'','KOS',1177),(4256,'Kurganskaya oblast\'','KGN',1177),(4257,'Kurskaya oblast\'','KRS',1177),(4258,'Leningradskaya oblast\'','LEN',1177),(4259,'Lipetskaya oblast\'','LIP',1177),(4260,'Magadanskaya oblast\'','MAG',1177),(4261,'Moskovskaya oblast\'','MOS',1177),(4262,'Murmanskaya oblast\'','MUR',1177),(4263,'Nizhegorodskaya oblast\'','NIZ',1177),(4264,'Novgorodskaya oblast\'','NGR',1177),(4265,'Novosibirskaya oblast\'','NVS',1177),(4266,'Omskaya oblast\'','OMS',1177),(4267,'Orenburgskaya oblast\'','ORE',1177),(4268,'Orlovskaya oblast\'','ORL',1177),(4269,'Penzenskaya oblast\'','PNZ',1177),(4270,'Perm krai\'','PEK',1177),(4271,'Pskovskaya oblast\'','PSK',1177),(4272,'Rostovskaya oblast\'','ROS',1177),(4273,'Ryazanskaya oblast\'','RYA',1177),(4274,'Sakhalinskaya oblast\'','SAK',1177),(4275,'Samarskaya oblast\'','SAM',1177),(4276,'Saratovskaya oblast\'','SAR',1177),(4277,'Smolenskaya oblast\'','SMO',1177),(4278,'Sverdlovskaya oblast\'','SVE',1177),(4279,'Tambovskaya oblast\'','TAM',1177),(4280,'Tomskaya oblast\'','TOM',1177),(4281,'Tul\'skaya oblast\'','TUL',1177),(4282,'Tverskaya oblast\'','TVE',1177),(4283,'Tyumenskaya oblast\'','TYU',1177),(4284,'Ul\'yanovskaya oblast\'','ULY',1177),(4285,'Vladimirskaya oblast\'','VLA',1177),(4286,'Volgogradskaya oblast\'','VGG',1177),(4287,'Vologodskaya oblast\'','VLG',1177),(4288,'Voronezhskaya oblast\'','VOR',1177),(4289,'Yaroslavskaya oblast\'','YAR',1177),(4290,'Moskva','MOW',1177),(4291,'Sankt-Peterburg','SPE',1177),(4292,'Yevreyskaya avtonomnaya oblast\'','YEV',1177),(4294,'Chukotskiy avtonomnyy okrug','CHU',1177),(4296,'Khanty-Mansiyskiy avtonomnyy okrug','KHM',1177),(4299,'Nenetskiy avtonomnyy okrug','NEN',1177),(4302,'Yamalo-Nenetskiy avtonomnyy okrug','YAN',1177),(4303,'Butare','C',1178),(4304,'Byumba','I',1178),(4305,'Cyangugu','E',1178),(4306,'Gikongoro','D',1178),(4307,'Gisenyi','G',1178),(4308,'Gitarama','B',1178),(4309,'Kibungo','J',1178),(4310,'Kibuye','F',1178),(4311,'Kigali-Rural Kigali y\' Icyaro','K',1178),(4312,'Kigali-Ville Kigali Ngari','L',1178),(4313,'Mutara','M',1178),(4314,'Ruhengeri','H',1178),(4315,'Al Bahah','11',1187),(4316,'Al Hudud Ash Shamaliyah','08',1187),(4317,'Al Jawf','12',1187),(4318,'Al Madinah','03',1187),(4319,'Al Qasim','05',1187),(4320,'Ar Riyad','01',1187),(4321,'Asir','14',1187),(4322,'Ha\'il','06',1187),(4323,'Jlzan','09',1187),(4324,'Makkah','02',1187),(4325,'Najran','10',1187),(4326,'Tabuk','07',1187),(4327,'Capital Territory (Honiara)','CT',1194),(4328,'Guadalcanal','GU',1194),(4329,'Isabel','IS',1194),(4330,'Makira','MK',1194),(4331,'Malaita','ML',1194),(4332,'Temotu','TE',1194),(4333,'A\'ali an Nil','23',1200),(4334,'Al Bah al Ahmar','26',1200),(4335,'Al Buhayrat','18',1200),(4336,'Al Jazirah','07',1200),(4337,'Al Khartum','03',1200),(4338,'Al Qadarif','06',1200),(4339,'Al Wahdah','22',1200),(4340,'An Nil','04',1200),(4341,'An Nil al Abyaq','08',1200),(4342,'An Nil al Azraq','24',1200),(4343,'Ash Shamallyah','01',1200),(4344,'Bahr al Jabal','17',1200),(4345,'Gharb al Istiwa\'iyah','16',1200),(4346,'Gharb Ba~r al Ghazal','14',1200),(4347,'Gharb Darfur','12',1200),(4348,'Gharb Kurdufan','10',1200),(4349,'Janub Darfur','11',1200),(4350,'Janub Rurdufan','13',1200),(4351,'Jnqall','20',1200),(4352,'Kassala','05',1200),(4353,'Shamal Batr al Ghazal','15',1200),(4354,'Shamal Darfur','02',1200),(4355,'Shamal Kurdufan','09',1200),(4356,'Sharq al Istiwa\'iyah','19',1200),(4357,'Sinnar','25',1200),(4358,'Warab','21',1200),(4359,'Blekinge län','K',1204),(4360,'Dalarnas län','W',1204),(4361,'Gotlands län','I',1204),(4362,'Gävleborgs län','X',1204),(4363,'Hallands län','N',1204),(4364,'Jämtlands län','Z',1204),(4365,'Jönkopings län','F',1204),(4366,'Kalmar län','H',1204),(4367,'Kronobergs län','G',1204),(4368,'Norrbottens län','BD',1204),(4369,'Skåne län','M',1204),(4370,'Stockholms län','AB',1204),(4371,'Södermanlands län','D',1204),(4372,'Uppsala län','C',1204),(4373,'Värmlands län','S',1204),(4374,'Västerbottens län','AC',1204),(4375,'Västernorrlands län','Y',1204),(4376,'Västmanlands län','U',1204),(4377,'Västra Götalands län','Q',1204),(4378,'Örebro län','T',1204),(4379,'Östergötlands län','E',1204),(4380,'Saint Helena','SH',1180),(4381,'Ascension','AC',1180),(4382,'Tristan da Cunha','TA',1180),(4383,'Ajdovščina','001',1193),(4384,'Beltinci','002',1193),(4385,'Benedikt','148',1193),(4386,'Bistrica ob Sotli','149',1193),(4387,'Bled','003',1193),(4388,'Bloke','150',1193),(4389,'Bohinj','004',1193),(4390,'Borovnica','005',1193),(4391,'Bovec','006',1193),(4392,'Braslovče','151',1193),(4393,'Brda','007',1193),(4394,'Brezovica','008',1193),(4395,'Brežice','009',1193),(4396,'Cankova','152',1193),(4397,'Celje','011',1193),(4398,'Cerklje na Gorenjskem','012',1193),(4399,'Cerknica','013',1193),(4400,'Cerkno','014',1193),(4401,'Cerkvenjak','153',1193),(4402,'Črenšovci','015',1193),(4403,'Črna na Koroškem','016',1193),(4404,'Črnomelj','017',1193),(4405,'Destrnik','018',1193),(4406,'Divača','019',1193),(4407,'Dobje','154',1193),(4408,'Dobrepolje','020',1193),(4409,'Dobrna','155',1193),(4410,'Dobrova-Polhov Gradec','021',1193),(4411,'Dobrovnik','156',1193),(4412,'Dol pri Ljubljani','022',1193),(4413,'Dolenjske Toplice','157',1193),(4414,'Domžale','023',1193),(4415,'Dornava','024',1193),(4416,'Dravograd','025',1193),(4417,'Duplek','026',1193),(4418,'Gorenja vas-Poljane','027',1193),(4419,'Gorišnica','028',1193),(4420,'Gornja Radgona','029',1193),(4421,'Gornji Grad','030',1193),(4422,'Gornji Petrovci','031',1193),(4423,'Grad','158',1193),(4424,'Grosuplje','032',1193),(4425,'Hajdina','159',1193),(4426,'Hoče-Slivnica','160',1193),(4427,'Hodoš','161',1193),(4428,'Horjul','162',1193),(4429,'Hrastnik','034',1193),(4430,'Hrpelje-Kozina','035',1193),(4431,'Idrija','036',1193),(4432,'Ig','037',1193),(4433,'Ilirska Bistrica','038',1193),(4434,'Ivančna Gorica','039',1193),(4435,'Izola','040',1193),(4436,'Jesenice','041',1193),(4437,'Jezersko','163',1193),(4438,'Juršinci','042',1193),(4439,'Kamnik','043',1193),(4440,'Kanal','044',1193),(4441,'Kidričevo','045',1193),(4442,'Kobarid','046',1193),(4443,'Kobilje','047',1193),(4444,'Kočevje','048',1193),(4445,'Komen','049',1193),(4446,'Komenda','164',1193),(4447,'Koper','050',1193),(4448,'Kostel','165',1193),(4449,'Kozje','051',1193),(4450,'Kranj','052',1193),(4451,'Kranjska Gora','053',1193),(4452,'Križevci','166',1193),(4453,'Krško','054',1193),(4454,'Kungota','055',1193),(4455,'Kuzma','056',1193),(4456,'Laško','057',1193),(4457,'Lenart','058',1193),(4458,'Lendava','059',1193),(4459,'Litija','060',1193),(4460,'Ljubljana','061',1193),(4461,'Ljubno','062',1193),(4462,'Ljutomer','063',1193),(4463,'Logatec','064',1193),(4464,'Loška dolina','065',1193),(4465,'Loški Potok','066',1193),(4466,'Lovrenc na Pohorju','167',1193),(4467,'Luče','067',1193),(4468,'Lukovica','068',1193),(4469,'Majšperk','069',1193),(4470,'Maribor','070',1193),(4471,'Markovci','168',1193),(4472,'Medvode','071',1193),(4473,'Mengeš','072',1193),(4474,'Metlika','073',1193),(4475,'Mežica','074',1193),(4476,'Miklavž na Dravskem polju','169',1193),(4477,'Miren-Kostanjevica','075',1193),(4478,'Mirna Peč','170',1193),(4479,'Mislinja','076',1193),(4480,'Moravče','077',1193),(4481,'Moravske Toplice','078',1193),(4482,'Mozirje','079',1193),(4483,'Murska Sobota','080',1193),(4484,'Muta','081',1193),(4485,'Naklo','082',1193),(4486,'Nazarje','083',1193),(4487,'Nova Gorica','084',1193),(4488,'Novo mesto','085',1193),(4489,'Sveta Ana','181',1193),(4490,'Sveti Andraž v Slovenskih goricah','182',1193),(4491,'Sveti Jurij','116',1193),(4492,'Šalovci','033',1193),(4493,'Šempeter-Vrtojba','183',1193),(4494,'Šenčur','117',1193),(4495,'Šentilj','118',1193),(4496,'Šentjernej','119',1193),(4497,'Šentjur','120',1193),(4498,'Škocjan','121',1193),(4499,'Škofja Loka','122',1193),(4500,'Škofljica','123',1193),(4501,'Šmarje pri Jelšah','124',1193),(4502,'Šmartno ob Paki','125',1193),(4503,'Šmartno pri Litiji','194',1193),(4504,'Šoštanj','126',1193),(4505,'Štore','127',1193),(4506,'Tabor','184',1193),(4507,'Tišina','010',1193),(4508,'Tolmin','128',1193),(4509,'Trbovlje','129',1193),(4510,'Trebnje','130',1193),(4511,'Trnovska vas','185',1193),(4512,'Tržič','131',1193),(4513,'Trzin','186',1193),(4514,'Turnišče','132',1193),(4515,'Velenje','133',1193),(4516,'Velika Polana','187',1193),(4517,'Velike Lašče','134',1193),(4518,'Veržej','188',1193),(4519,'Videm','135',1193),(4520,'Vipava','136',1193),(4521,'Vitanje','137',1193),(4522,'Vojnik','138',1193),(4523,'Vransko','189',1193),(4524,'Vrhnika','140',1193),(4525,'Vuzenica','141',1193),(4526,'Zagorje ob Savi','142',1193),(4527,'Zavrč','143',1193),(4528,'Zreče','144',1193),(4529,'Žalec','190',1193),(4530,'Železniki','146',1193),(4531,'Žetale','191',1193),(4532,'Žiri','147',1193),(4533,'Žirovnica','192',1193),(4534,'Žužemberk','193',1193),(4535,'Banskobystrický kraj','BC',1192),(4536,'Bratislavský kraj','BL',1192),(4537,'Košický kraj','KI',1192),(4538,'Nitriansky kraj','NJ',1192),(4539,'Prešovský kraj','PV',1192),(4540,'Trenčiansky kraj','TC',1192),(4541,'Trnavský kraj','TA',1192),(4542,'Žilinský kraj','ZI',1192),(4543,'Western Area (Freetown)','W',1190),(4544,'Dakar','DK',1188),(4545,'Diourbel','DB',1188),(4546,'Fatick','FK',1188),(4547,'Kaolack','KL',1188),(4548,'Kolda','KD',1188),(4549,'Louga','LG',1188),(4550,'Matam','MT',1188),(4551,'Saint-Louis','SL',1188),(4552,'Tambacounda','TC',1188),(4553,'Thies','TH',1188),(4554,'Ziguinchor','ZG',1188),(4555,'Awdal','AW',1195),(4556,'Bakool','BK',1195),(4557,'Banaadir','BN',1195),(4558,'Bay','BY',1195),(4559,'Galguduud','GA',1195),(4560,'Gedo','GE',1195),(4561,'Hiirsan','HI',1195),(4562,'Jubbada Dhexe','JD',1195),(4563,'Jubbada Hoose','JH',1195),(4564,'Mudug','MU',1195),(4565,'Nugaal','NU',1195),(4566,'Saneag','SA',1195),(4567,'Shabeellaha Dhexe','SD',1195),(4568,'Shabeellaha Hoose','SH',1195),(4569,'Sool','SO',1195),(4570,'Togdheer','TO',1195),(4571,'Woqooyi Galbeed','WO',1195),(4572,'Brokopondo','BR',1201),(4573,'Commewijne','CM',1201),(4574,'Coronie','CR',1201),(4575,'Marowijne','MA',1201),(4576,'Nickerie','NI',1201),(4577,'Paramaribo','PM',1201),(4578,'Saramacca','SA',1201),(4579,'Sipaliwini','SI',1201),(4580,'Wanica','WA',1201),(4581,'Principe','P',1207),(4582,'Sao Tome','S',1207),(4583,'Ahuachapan','AH',1066),(4584,'Cabanas','CA',1066),(4585,'Cuscatlan','CU',1066),(4586,'Chalatenango','CH',1066),(4587,'Morazan','MO',1066),(4588,'San Miguel','SM',1066),(4589,'San Salvador','SS',1066),(4590,'Santa Ana','SA',1066),(4591,'San Vicente','SV',1066),(4592,'Sonsonate','SO',1066),(4593,'Usulutan','US',1066),(4594,'Al Hasakah','HA',1206),(4595,'Al Ladhiqiyah','LA',1206),(4596,'Al Qunaytirah','QU',1206),(4597,'Ar Raqqah','RA',1206),(4598,'As Suwayda\'','SU',1206),(4599,'Dar\'a','DR',1206),(4600,'Dayr az Zawr','DY',1206),(4601,'Dimashq','DI',1206),(4602,'Halab','HL',1206),(4603,'Hamah','HM',1206),(4604,'Jim\'','HI',1206),(4605,'Idlib','ID',1206),(4606,'Rif Dimashq','RD',1206),(4607,'Tarts','TA',1206),(4608,'Hhohho','HH',1203),(4609,'Lubombo','LU',1203),(4610,'Manzini','MA',1203),(4611,'Shiselweni','SH',1203),(4612,'Batha','BA',1043),(4613,'Biltine','BI',1043),(4614,'Borkou-Ennedi-Tibesti','BET',1043),(4615,'Chari-Baguirmi','CB',1043),(4616,'Guera','GR',1043),(4617,'Kanem','KA',1043),(4618,'Lac','LC',1043),(4619,'Logone-Occidental','LO',1043),(4620,'Logone-Oriental','LR',1043),(4621,'Mayo-Kebbi','MK',1043),(4622,'Moyen-Chari','MC',1043),(4623,'Ouaddai','OD',1043),(4624,'Salamat','SA',1043),(4625,'Tandjile','TA',1043),(4626,'Kara','K',1214),(4627,'Maritime (Region)','M',1214),(4628,'Savannes','S',1214),(4629,'Krung Thep Maha Nakhon Bangkok','10',1211),(4630,'Phatthaya','S',1211),(4631,'Amnat Charoen','37',1211),(4632,'Ang Thong','15',1211),(4633,'Buri Ram','31',1211),(4634,'Chachoengsao','24',1211),(4635,'Chai Nat','18',1211),(4636,'Chaiyaphum','36',1211),(4637,'Chanthaburi','22',1211),(4638,'Chiang Mai','50',1211),(4639,'Chiang Rai','57',1211),(4640,'Chon Buri','20',1211),(4641,'Chumphon','86',1211),(4642,'Kalasin','46',1211),(4643,'Kamphasng Phet','62',1211),(4644,'Kanchanaburi','71',1211),(4645,'Khon Kaen','40',1211),(4646,'Krabi','81',1211),(4647,'Lampang','52',1211),(4648,'Lamphun','51',1211),(4649,'Loei','42',1211),(4650,'Lop Buri','16',1211),(4651,'Mae Hong Son','58',1211),(4652,'Maha Sarakham','44',1211),(4653,'Mukdahan','49',1211),(4654,'Nakhon Nayok','26',1211),(4655,'Nakhon Pathom','73',1211),(4656,'Nakhon Phanom','48',1211),(4657,'Nakhon Ratchasima','30',1211),(4658,'Nakhon Sawan','60',1211),(4659,'Nakhon Si Thammarat','80',1211),(4660,'Nan','55',1211),(4661,'Narathiwat','96',1211),(4662,'Nong Bua Lam Phu','39',1211),(4663,'Nong Khai','43',1211),(4664,'Nonthaburi','12',1211),(4665,'Pathum Thani','13',1211),(4666,'Pattani','94',1211),(4667,'Phangnga','82',1211),(4668,'Phatthalung','93',1211),(4669,'Phayao','56',1211),(4670,'Phetchabun','67',1211),(4671,'Phetchaburi','76',1211),(4672,'Phichit','66',1211),(4673,'Phitsanulok','65',1211),(4674,'Phrae','54',1211),(4675,'Phra Nakhon Si Ayutthaya','14',1211),(4676,'Phuket','83',1211),(4677,'Prachin Buri','25',1211),(4678,'Prachuap Khiri Khan','77',1211),(4679,'Ranong','85',1211),(4680,'Ratchaburi','70',1211),(4681,'Rayong','21',1211),(4682,'Roi Et','45',1211),(4683,'Sa Kaeo','27',1211),(4684,'Sakon Nakhon','47',1211),(4685,'Samut Prakan','11',1211),(4686,'Samut Sakhon','74',1211),(4687,'Samut Songkhram','75',1211),(4688,'Saraburi','19',1211),(4689,'Satun','91',1211),(4690,'Sing Buri','17',1211),(4691,'Si Sa Ket','33',1211),(4692,'Songkhla','90',1211),(4693,'Sukhothai','64',1211),(4694,'Suphan Buri','72',1211),(4695,'Surat Thani','84',1211),(4696,'Surin','32',1211),(4697,'Tak','63',1211),(4698,'Trang','92',1211),(4699,'Trat','23',1211),(4700,'Ubon Ratchathani','34',1211),(4701,'Udon Thani','41',1211),(4702,'Uthai Thani','61',1211),(4703,'Uttaradit','53',1211),(4704,'Yala','95',1211),(4705,'Yasothon','35',1211),(4706,'Sughd','SU',1209),(4707,'Khatlon','KT',1209),(4708,'Gorno-Badakhshan','GB',1209),(4709,'Ahal','A',1220),(4710,'Balkan','B',1220),(4711,'Dasoguz','D',1220),(4712,'Lebap','L',1220),(4713,'Mary','M',1220),(4714,'Béja','31',1218),(4715,'Ben Arous','13',1218),(4716,'Bizerte','23',1218),(4717,'Gabès','81',1218),(4718,'Gafsa','71',1218),(4719,'Jendouba','32',1218),(4720,'Kairouan','41',1218),(4721,'Rasserine','42',1218),(4722,'Kebili','73',1218),(4723,'L\'Ariana','12',1218),(4724,'Le Ref','33',1218),(4725,'Mahdia','53',1218),(4726,'La Manouba','14',1218),(4727,'Medenine','82',1218),(4728,'Moneatir','52',1218),(4729,'Naboul','21',1218),(4730,'Sfax','61',1218),(4731,'Sidi Bouxid','43',1218),(4732,'Siliana','34',1218),(4733,'Sousse','51',1218),(4734,'Tataouine','83',1218),(4735,'Tozeur','72',1218),(4736,'Tunis','11',1218),(4737,'Zaghouan','22',1218),(4738,'Adana','01',1219),(4739,'Ad yaman','02',1219),(4740,'Afyon','03',1219),(4741,'Ag r','04',1219),(4742,'Aksaray','68',1219),(4743,'Amasya','05',1219),(4744,'Ankara','06',1219),(4745,'Antalya','07',1219),(4746,'Ardahan','75',1219),(4747,'Artvin','08',1219),(4748,'Aydin','09',1219),(4749,'Bal kesir','10',1219),(4750,'Bartin','74',1219),(4751,'Batman','72',1219),(4752,'Bayburt','69',1219),(4753,'Bilecik','11',1219),(4754,'Bingol','12',1219),(4755,'Bitlis','13',1219),(4756,'Bolu','14',1219),(4757,'Burdur','15',1219),(4758,'Bursa','16',1219),(4759,'Canakkale','17',1219),(4760,'Cankir','18',1219),(4761,'Corum','19',1219),(4762,'Denizli','20',1219),(4763,'Diyarbakir','21',1219),(4764,'Duzce','81',1219),(4765,'Edirne','22',1219),(4766,'Elazig','23',1219),(4767,'Erzincan','24',1219),(4768,'Erzurum','25',1219),(4769,'Eskis\'ehir','26',1219),(4770,'Gaziantep','27',1219),(4771,'Giresun','28',1219),(4772,'Gms\'hane','29',1219),(4773,'Hakkari','30',1219),(4774,'Hatay','31',1219),(4775,'Igidir','76',1219),(4776,'Isparta','32',1219),(4777,'Icel','33',1219),(4778,'Istanbul','34',1219),(4779,'Izmir','35',1219),(4780,'Kahramanmaras','46',1219),(4781,'Karabk','78',1219),(4782,'Karaman','70',1219),(4783,'Kars','36',1219),(4784,'Kastamonu','37',1219),(4785,'Kayseri','38',1219),(4786,'Kirikkale','71',1219),(4787,'Kirklareli','39',1219),(4788,'Kirs\'ehir','40',1219),(4789,'Kilis','79',1219),(4790,'Kocaeli','41',1219),(4791,'Konya','42',1219),(4792,'Ktahya','43',1219),(4793,'Malatya','44',1219),(4794,'Manisa','45',1219),(4795,'Mardin','47',1219),(4796,'Mugila','48',1219),(4797,'Mus','49',1219),(4798,'Nevs\'ehir','50',1219),(4799,'Nigide','51',1219),(4800,'Ordu','52',1219),(4801,'Osmaniye','80',1219),(4802,'Rize','53',1219),(4803,'Sakarya','54',1219),(4804,'Samsun','55',1219),(4805,'Siirt','56',1219),(4806,'Sinop','57',1219),(4807,'Sivas','58',1219),(4808,'S\'anliurfa','63',1219),(4809,'S\'rnak','73',1219),(4810,'Tekirdag','59',1219),(4811,'Tokat','60',1219),(4812,'Trabzon','61',1219),(4813,'Tunceli','62',1219),(4814,'Us\'ak','64',1219),(4815,'Van','65',1219),(4816,'Yalova','77',1219),(4817,'Yozgat','66',1219),(4818,'Zonguldak','67',1219),(4819,'Couva-Tabaquite-Talparo','CTT',1217),(4820,'Diego Martin','DMN',1217),(4821,'Eastern Tobago','ETO',1217),(4822,'Penal-Debe','PED',1217),(4823,'Princes Town','PRT',1217),(4824,'Rio Claro-Mayaro','RCM',1217),(4825,'Sangre Grande','SGE',1217),(4826,'San Juan-Laventille','SJL',1217),(4827,'Siparia','SIP',1217),(4828,'Tunapuna-Piarco','TUP',1217),(4829,'Western Tobago','WTO',1217),(4830,'Arima','ARI',1217),(4831,'Chaguanas','CHA',1217),(4832,'Point Fortin','PTF',1217),(4833,'Port of Spain','POS',1217),(4834,'San Fernando','SFO',1217),(4835,'Aileu','AL',1063),(4836,'Ainaro','AN',1063),(4837,'Bacucau','BA',1063),(4838,'Bobonaro','BO',1063),(4839,'Cova Lima','CO',1063),(4840,'Dili','DI',1063),(4841,'Ermera','ER',1063),(4842,'Laulem','LA',1063),(4843,'Liquica','LI',1063),(4844,'Manatuto','MT',1063),(4845,'Manafahi','MF',1063),(4846,'Oecussi','OE',1063),(4847,'Viqueque','VI',1063),(4848,'Changhua County','CHA',1208),(4849,'Chiayi County','CYQ',1208),(4850,'Hsinchu County','HSQ',1208),(4851,'Hualien County','HUA',1208),(4852,'Ilan County','ILA',1208),(4853,'Kaohsiung County','KHQ',1208),(4854,'Miaoli County','MIA',1208),(4855,'Nantou County','NAN',1208),(4856,'Penghu County','PEN',1208),(4857,'Pingtung County','PIF',1208),(4858,'Taichung County','TXQ',1208),(4859,'Tainan County','TNQ',1208),(4860,'Taipei County','TPQ',1208),(4861,'Taitung County','TTT',1208),(4862,'Taoyuan County','TAO',1208),(4863,'Yunlin County','YUN',1208),(4864,'Keelung City','KEE',1208),(4865,'Arusha','01',1210),(4866,'Dar-es-Salaam','02',1210),(4867,'Dodoma','03',1210),(4868,'Iringa','04',1210),(4869,'Kagera','05',1210),(4870,'Kaskazini Pemba','06',1210),(4871,'Kaskazini Unguja','07',1210),(4872,'Xigoma','08',1210),(4873,'Kilimanjaro','09',1210),(4874,'Rusini Pemba','10',1210),(4875,'Kusini Unguja','11',1210),(4876,'Lindi','12',1210),(4877,'Manyara','26',1210),(4878,'Mara','13',1210),(4879,'Mbeya','14',1210),(4880,'Mjini Magharibi','15',1210),(4881,'Morogoro','16',1210),(4882,'Mtwara','17',1210),(4883,'Pwani','19',1210),(4884,'Rukwa','20',1210),(4885,'Ruvuma','21',1210),(4886,'Shinyanga','22',1210),(4887,'Singida','23',1210),(4888,'Tabora','24',1210),(4889,'Tanga','25',1210),(4890,'Cherkas\'ka Oblast\'','71',1224),(4891,'Chernihivs\'ka Oblast\'','74',1224),(4892,'Chernivets\'ka Oblast\'','77',1224),(4893,'Dnipropetrovs\'ka Oblast\'','12',1224),(4894,'Donets\'ka Oblast\'','14',1224),(4895,'Ivano-Frankivs\'ka Oblast\'','26',1224),(4896,'Kharkivs\'ka Oblast\'','63',1224),(4897,'Khersons\'ka Oblast\'','65',1224),(4898,'Khmel\'nyts\'ka Oblast\'','68',1224),(4899,'Kirovohrads\'ka Oblast\'','35',1224),(4900,'Kyivs\'ka Oblast\'','32',1224),(4901,'Luhans\'ka Oblast\'','09',1224),(4902,'L\'vivs\'ka Oblast\'','46',1224),(4903,'Mykolaivs\'ka Oblast\'','48',1224),(4904,'Odes \'ka Oblast\'','51',1224),(4905,'Poltavs\'ka Oblast\'','53',1224),(4906,'Rivnens\'ka Oblast\'','56',1224),(4907,'Sums \'ka Oblast\'','59',1224),(4908,'Ternopil\'s\'ka Oblast\'','61',1224),(4909,'Vinnyts\'ka Oblast\'','05',1224),(4910,'Volyos\'ka Oblast\'','07',1224),(4911,'Zakarpats\'ka Oblast\'','21',1224),(4912,'Zaporiz\'ka Oblast\'','23',1224),(4913,'Zhytomyrs\'ka Oblast\'','18',1224),(4914,'Respublika Krym','43',1224),(4915,'Kyiv','30',1224),(4916,'Sevastopol','40',1224),(4917,'Adjumani','301',1223),(4918,'Apac','302',1223),(4919,'Arua','303',1223),(4920,'Bugiri','201',1223),(4921,'Bundibugyo','401',1223),(4922,'Bushenyi','402',1223),(4923,'Busia','202',1223),(4924,'Gulu','304',1223),(4925,'Hoima','403',1223),(4926,'Iganga','203',1223),(4927,'Jinja','204',1223),(4928,'Kabale','404',1223),(4929,'Kabarole','405',1223),(4930,'Kaberamaido','213',1223),(4931,'Kalangala','101',1223),(4932,'Kampala','102',1223),(4933,'Kamuli','205',1223),(4934,'Kamwenge','413',1223),(4935,'Kanungu','414',1223),(4936,'Kapchorwa','206',1223),(4937,'Kasese','406',1223),(4938,'Katakwi','207',1223),(4939,'Kayunga','112',1223),(4940,'Kibaale','407',1223),(4941,'Kiboga','103',1223),(4942,'Kisoro','408',1223),(4943,'Kitgum','305',1223),(4944,'Kotido','306',1223),(4945,'Kumi','208',1223),(4946,'Kyenjojo','415',1223),(4947,'Lira','307',1223),(4948,'Luwero','104',1223),(4949,'Masaka','105',1223),(4950,'Masindi','409',1223),(4951,'Mayuge','214',1223),(4952,'Mbale','209',1223),(4953,'Mbarara','410',1223),(4954,'Moroto','308',1223),(4955,'Moyo','309',1223),(4956,'Mpigi','106',1223),(4957,'Mubende','107',1223),(4958,'Mukono','108',1223),(4959,'Nakapiripirit','311',1223),(4960,'Nakasongola','109',1223),(4961,'Nebbi','310',1223),(4962,'Ntungamo','411',1223),(4963,'Pader','312',1223),(4964,'Pallisa','210',1223),(4965,'Rakai','110',1223),(4966,'Rukungiri','412',1223),(4967,'Sembabule','111',1223),(4968,'Sironko','215',1223),(4969,'Soroti','211',1223),(4970,'Tororo','212',1223),(4971,'Wakiso','113',1223),(4972,'Yumbe','313',1223),(4973,'Baker Island','81',1227),(4974,'Howland Island','84',1227),(4975,'Jarvis Island','86',1227),(4976,'Johnston Atoll','67',1227),(4977,'Kingman Reef','89',1227),(4978,'Midway Islands','71',1227),(4979,'Navassa Island','76',1227),(4980,'Palmyra Atoll','95',1227),(4981,'Wake Island','79',1227),(4982,'Artigsa','AR',1229),(4983,'Canelones','CA',1229),(4984,'Cerro Largo','CL',1229),(4985,'Colonia','CO',1229),(4986,'Durazno','DU',1229),(4987,'Flores','FS',1229),(4988,'Lavalleja','LA',1229),(4989,'Maldonado','MA',1229),(4990,'Montevideo','MO',1229),(4991,'Paysandu','PA',1229),(4992,'Rivera','RV',1229),(4993,'Rocha','RO',1229),(4994,'Salto','SA',1229),(4995,'Soriano','SO',1229),(4996,'Tacuarembo','TA',1229),(4997,'Treinta y Tres','TT',1229),(4998,'Toshkent (city)','TK',1230),(4999,'Qoraqalpogiston Respublikasi','QR',1230),(5000,'Andijon','AN',1230),(5001,'Buxoro','BU',1230),(5002,'Farg\'ona','FA',1230),(5003,'Jizzax','JI',1230),(5004,'Khorazm','KH',1230),(5005,'Namangan','NG',1230),(5006,'Navoiy','NW',1230),(5007,'Qashqadaryo','QA',1230),(5008,'Samarqand','SA',1230),(5009,'Sirdaryo','SI',1230),(5010,'Surxondaryo','SU',1230),(5011,'Toshkent','TO',1230),(5012,'Xorazm','XO',1230),(5013,'Distrito Federal','A',1232),(5014,'Anzoategui','B',1232),(5015,'Apure','C',1232),(5016,'Aragua','D',1232),(5017,'Barinas','E',1232),(5018,'Carabobo','G',1232),(5019,'Cojedes','H',1232),(5020,'Falcon','I',1232),(5021,'Guarico','J',1232),(5022,'Lara','K',1232),(5023,'Merida','L',1232),(5024,'Miranda','M',1232),(5025,'Monagas','N',1232),(5026,'Nueva Esparta','O',1232),(5027,'Portuguesa','P',1232),(5028,'Tachira','S',1232),(5029,'Trujillo','T',1232),(5030,'Vargas','X',1232),(5031,'Yaracuy','U',1232),(5032,'Zulia','V',1232),(5033,'Delta Amacuro','Y',1232),(5034,'Dependencias Federales','W',1232),(5035,'An Giang','44',1233),(5036,'Ba Ria - Vung Tau','43',1233),(5037,'Bac Can','53',1233),(5038,'Bac Giang','54',1233),(5039,'Bac Lieu','55',1233),(5040,'Bac Ninh','56',1233),(5041,'Ben Tre','50',1233),(5042,'Binh Dinh','31',1233),(5043,'Binh Duong','57',1233),(5044,'Binh Phuoc','58',1233),(5045,'Binh Thuan','40',1233),(5046,'Ca Mau','59',1233),(5047,'Can Tho','48',1233),(5048,'Cao Bang','04',1233),(5049,'Da Nang, thanh pho','60',1233),(5050,'Dong Nai','39',1233),(5051,'Dong Thap','45',1233),(5052,'Gia Lai','30',1233),(5053,'Ha Giang','03',1233),(5054,'Ha Nam','63',1233),(5055,'Ha Noi, thu do','64',1233),(5056,'Ha Tay','15',1233),(5057,'Ha Tinh','23',1233),(5058,'Hai Duong','61',1233),(5059,'Hai Phong, thanh pho','62',1233),(5060,'Hoa Binh','14',1233),(5061,'Ho Chi Minh, thanh pho [Sai Gon]','65',1233),(5062,'Hung Yen','66',1233),(5063,'Khanh Hoa','34',1233),(5064,'Kien Giang','47',1233),(5065,'Kon Tum','28',1233),(5066,'Lai Chau','01',1233),(5067,'Lam Dong','35',1233),(5068,'Lang Son','09',1233),(5069,'Lao Cai','02',1233),(5070,'Long An','41',1233),(5071,'Nam Dinh','67',1233),(5072,'Nghe An','22',1233),(5073,'Ninh Binh','18',1233),(5074,'Ninh Thuan','36',1233),(5075,'Phu Tho','68',1233),(5076,'Phu Yen','32',1233),(5077,'Quang Binh','24',1233),(5078,'Quang Nam','27',1233),(5079,'Quang Ngai','29',1233),(5080,'Quang Ninh','13',1233),(5081,'Quang Tri','25',1233),(5082,'Soc Trang','52',1233),(5083,'Son La','05',1233),(5084,'Tay Ninh','37',1233),(5085,'Thai Binh','20',1233),(5086,'Thai Nguyen','69',1233),(5087,'Thanh Hoa','21',1233),(5088,'Thua Thien-Hue','26',1233),(5089,'Tien Giang','46',1233),(5090,'Tra Vinh','51',1233),(5091,'Tuyen Quang','07',1233),(5092,'Vinh Long','49',1233),(5093,'Vinh Phuc','70',1233),(5094,'Yen Bai','06',1233),(5095,'Malampa','MAP',1231),(5096,'Penama','PAM',1231),(5097,'Sanma','SAM',1231),(5098,'Shefa','SEE',1231),(5099,'Tafea','TAE',1231),(5100,'Torba','TOB',1231),(5101,'A\'ana','AA',1185),(5102,'Aiga-i-le-Tai','AL',1185),(5103,'Atua','AT',1185),(5104,'Fa\'aaaleleaga','FA',1185),(5105,'Gaga\'emauga','GE',1185),(5106,'Gagaifomauga','GI',1185),(5107,'Palauli','PA',1185),(5108,'Satupa\'itea','SA',1185),(5109,'Tuamasaga','TU',1185),(5110,'Va\'a-o-Fonoti','VF',1185),(5111,'Vaisigano','VS',1185),(5112,'Crna Gora','CG',1243),(5113,'Srbija','SR',1242),(5114,'Kosovo-Metohija','KM',1242),(5115,'Vojvodina','VO',1242),(5116,'Abyan','AB',1237),(5117,'Adan','AD',1237),(5118,'Ad Dali','DA',1237),(5119,'Al Bayda\'','BA',1237),(5120,'Al Hudaydah','MU',1237),(5121,'Al Mahrah','MR',1237),(5122,'Al Mahwit','MW',1237),(5123,'Amran','AM',1237),(5124,'Dhamar','DH',1237),(5125,'Hadramawt','HD',1237),(5126,'Hajjah','HJ',1237),(5127,'Ibb','IB',1237),(5128,'Lahij','LA',1237),(5129,'Ma\'rib','MA',1237),(5130,'Sa\'dah','SD',1237),(5131,'San\'a\'','SN',1237),(5132,'Shabwah','SH',1237),(5133,'Ta\'izz','TA',1237),(5134,'Eastern Cape','EC',1196),(5135,'Free State','FS',1196),(5136,'Gauteng','GT',1196),(5137,'Kwazulu-Natal','NL',1196),(5138,'Mpumalanga','MP',1196),(5139,'Northern Cape','NC',1196),(5140,'Limpopo','NP',1196),(5141,'Western Cape','WC',1196),(5142,'Copperbelt','08',1239),(5143,'Luapula','04',1239),(5144,'Lusaka','09',1239),(5145,'North-Western','06',1239),(5146,'Bulawayo','BU',1240),(5147,'Harare','HA',1240),(5148,'Manicaland','MA',1240),(5149,'Mashonaland Central','MC',1240),(5150,'Mashonaland East','ME',1240),(5151,'Mashonaland West','MW',1240),(5152,'Masvingo','MV',1240),(5153,'Matabeleland North','MN',1240),(5154,'Matabeleland South','MS',1240),(5155,'Midlands','MI',1240),(5156,'South Karelia','SK',1075),(5157,'South Ostrobothnia','SO',1075),(5158,'Etelä-Savo','ES',1075),(5159,'Häme','HH',1075),(5160,'Itä-Uusimaa','IU',1075),(5161,'Kainuu','KA',1075),(5162,'Central Ostrobothnia','CO',1075),(5163,'Central Finland','CF',1075),(5164,'Kymenlaakso','KY',1075),(5165,'Lapland','LA',1075),(5166,'Tampere Region','TR',1075),(5167,'Ostrobothnia','OB',1075),(5168,'North Karelia','NK',1075),(5169,'Northern Ostrobothnia','NO',1075),(5170,'Northern Savo','NS',1075),(5171,'Päijät-Häme','PH',1075),(5172,'Satakunta','SK',1075),(5173,'Uusimaa','UM',1075),(5174,'South-West Finland','SW',1075),(5175,'Åland','AL',1075),(5176,'Limburg','LI',1152),(5177,'Central and Western','CW',1098),(5178,'Eastern','EA',1098),(5179,'Southern','SO',1098),(5180,'Wan Chai','WC',1098),(5181,'Kowloon City','KC',1098),(5182,'Kwun Tong','KU',1098),(5183,'Sham Shui Po','SS',1098),(5184,'Wong Tai Sin','WT',1098),(5185,'Yau Tsim Mong','YT',1098),(5186,'Islands','IS',1098),(5187,'Kwai Tsing','KI',1098),(5188,'North','NO',1098),(5189,'Sai Kung','SK',1098),(5190,'Sha Tin','ST',1098),(5191,'Tai Po','TP',1098),(5192,'Tsuen Wan','TW',1098),(5193,'Tuen Mun','TM',1098),(5194,'Yuen Long','YL',1098),(5195,'Manchester','MR',1108),(5196,'Al Manāmah (Al ‘Āşimah)','13',1016),(5197,'Al Janūbīyah','14',1016),(5199,'Al Wusţá','16',1016),(5200,'Ash Shamālīyah','17',1016),(5201,'Jenin','_A',1165),(5202,'Tubas','_B',1165),(5203,'Tulkarm','_C',1165),(5204,'Nablus','_D',1165),(5205,'Qalqilya','_E',1165),(5206,'Salfit','_F',1165),(5207,'Ramallah and Al-Bireh','_G',1165),(5208,'Jericho','_H',1165),(5209,'Jerusalem','_I',1165),(5210,'Bethlehem','_J',1165),(5211,'Hebron','_K',1165),(5212,'North Gaza','_L',1165),(5213,'Gaza','_M',1165),(5214,'Deir el-Balah','_N',1165),(5215,'Khan Yunis','_O',1165),(5216,'Rafah','_P',1165),(5217,'Brussels','BRU',1020),(5218,'Distrito Federal','DIF',1140),(5219,'Taichung City','TXG',1208),(5220,'Kaohsiung City','KHH',1208),(5221,'Taipei City','TPE',1208),(5222,'Chiayi City','CYI',1208),(5223,'Hsinchu City','HSZ',1208),(5224,'Tainan City','TNN',1208),(9000,'North West','NW',1196),(9986,'Tyne and Wear','TWR',1226),(9988,'Greater Manchester','GTM',1226),(9989,'Co Tyrone','TYR',1226),(9990,'West Yorkshire','WYK',1226),(9991,'South Yorkshire','SYK',1226),(9992,'Merseyside','MSY',1226),(9993,'Berkshire','BRK',1226),(9994,'West Midlands','WMD',1226),(9998,'West Glamorgan','WGM',1226),(9999,'London','LON',1226),(10000,'Carbonia-Iglesias','CI',1107),(10001,'Olbia-Tempio','OT',1107),(10002,'Medio Campidano','VS',1107),(10003,'Ogliastra','OG',1107),(10009,'Jura','39',1076),(10010,'Barletta-Andria-Trani','Bar',1107),(10011,'Fermo','Fer',1107),(10012,'Monza e Brianza','Mon',1107),(10013,'Clwyd','CWD',1226),(10015,'South Glamorgan','SGM',1226),(10016,'Artibonite','AR',1094),(10017,'Centre','CE',1094),(10018,'Nippes','NI',1094),(10019,'Nord','ND',1094),(10020,'La Rioja','F',1010),(10021,'Andorra la Vella','07',1005),(10022,'Canillo','02',1005),(10023,'Encamp','03',1005),(10024,'Escaldes-Engordany','08',1005),(10025,'La Massana','04',1005),(10026,'Ordino','05',1005),(10027,'Sant Julia de Loria','06',1005),(10028,'Abaco Islands','AB',1212),(10029,'Andros Island','AN',1212),(10030,'Berry Islands','BR',1212),(10031,'Eleuthera','EL',1212),(10032,'Grand Bahama','GB',1212),(10033,'Rum Cay','RC',1212),(10034,'San Salvador Island','SS',1212),(10035,'Kongo central','01',1050),(10036,'Kwango','02',1050),(10037,'Kwilu','03',1050),(10038,'Mai-Ndombe','04',1050),(10039,'Kasai','05',1050),(10040,'Lulua','06',1050),(10041,'Lomami','07',1050),(10042,'Sankuru','08',1050),(10043,'Ituri','09',1050),(10044,'Haut-Uele','10',1050),(10045,'Tshopo','11',1050),(10046,'Bas-Uele','12',1050),(10047,'Nord-Ubangi','13',1050),(10048,'Mongala','14',1050),(10049,'Sud-Ubangi','15',1050),(10050,'Tshuapa','16',1050),(10051,'Haut-Lomami','17',1050),(10052,'Lualaba','18',1050),(10053,'Haut-Katanga','19',1050),(10054,'Tanganyika','20',1050),(10055,'Toledo','TO',1198),(10056,'Córdoba','CO',1198),(10057,'Metropolitan Manila','MNL',1170),(10058,'La Paz','LP',1097),(10059,'Yinchuan','YN',1045),(10060,'Shizuishan','SZ',1045),(10061,'Wuzhong','WZ',1045),(10062,'Guyuan','GY',1045),(10063,'Zhongwei','ZW',1045),(10064,'Luxembourg','L',1126),(10065,'Aizkraukles novads','002',1119),(10066,'Jaunjelgavas novads','038',1119),(10067,'Pļaviņu novads','072',1119),(10068,'Kokneses novads','046',1119),(10069,'Neretas novads','065',1119),(10070,'Skrīveru novads','092',1119),(10071,'Alūksnes novads','007',1119),(10072,'Apes novads','009',1119),(10073,'Balvu novads','015',1119),(10074,'Viļakas novads','108',1119),(10075,'Baltinavas novads','014',1119),(10076,'Rugāju novads','082',1119),(10077,'Bauskas novads','016',1119),(10078,'Iecavas novads','034',1119),(10079,'Rundāles novads','083',1119),(10080,'Vecumnieku novads','105',1119),(10081,'Cēsu novads','022',1119),(10082,'Līgatnes novads','055',1119),(10083,'Amatas novads','008',1119),(10084,'Jaunpiebalgas novads','039',1119),(10085,'Priekuļu novads','075',1119),(10086,'Pārgaujas novads','070',1119),(10087,'Raunas novads','076',1119),(10088,'Vecpiebalgas novads','104',1119),(10089,'Daugavpils novads','025',1119),(10090,'Ilūkstes novads','036',1119),(10091,'Dobeles novads','026',1119),(10092,'Auces novads','010',1119),(10093,'Tērvetes novads','098',1119),(10094,'Gulbenes novads','033',1119),(10095,'Jelgavas novads','041',1119),(10096,'Ozolnieku novads','069',1119),(10097,'Jēkabpils novads','042',1119),(10098,'Aknīstes novads','004',1119),(10099,'Viesītes novads','107',1119),(10100,'Krustpils novads','049',1119),(10101,'Salas novads','085',1119),(10102,'Krāslavas novads','047',1119),(10103,'Dagdas novads','024',1119),(10104,'Aglonas novads','001',1119),(10105,'Kuldīgas novads','050',1119),(10106,'Skrundas novads','093',1119),(10107,'Alsungas novads','006',1119),(10108,'Aizputes novads','003',1119),(10109,'Durbes novads','028',1119),(10110,'Grobiņas novads','032',1119),(10111,'Pāvilostas novads','071',1119),(10112,'Priekules novads','074',1119),(10113,'Nīcas novads','066',1119),(10114,'Rucavas novads','081',1119),(10115,'Vaiņodes novads','100',1119),(10116,'Limbažu novads','054',1119),(10117,'Alojas novads','005',1119),(10118,'Salacgrīvas novads','086',1119),(10119,'Ludzas novads','058',1119),(10120,'Kārsavas novads','044',1119),(10121,'Zilupes novads','110',1119),(10122,'Ciblas novads','023',1119),(10123,'Madonas novads','059',1119),(10124,'Cesvaines novads','021',1119),(10125,'Lubānas novads','057',1119),(10126,'Varakļānu novads','102',1119),(10127,'Ērgļu novads','030',1119),(10128,'Ogres novads','067',1119),(10129,'Ikšķiles novads','035',1119),(10130,'Ķeguma novads','051',1119),(10131,'Lielvārdes novads','053',1119),(10132,'Preiļu novads','073',1119),(10133,'Līvānu novads','056',1119),(10134,'Riebiņu novads','078',1119),(10135,'Vārkavas novads','103',1119),(10136,'Rēzeknes novads','077',1119),(10137,'Viļānu novads','109',1119),(10138,'Baldones novads','013',1119),(10139,'Ķekavas novads','052',1119),(10140,'Olaines novads','068',1119),(10141,'Salaspils novads','087',1119),(10142,'Saulkrastu novads','089',1119),(10143,'Siguldas novads','091',1119),(10144,'Inčukalna novads','037',1119),(10145,'Ādažu novads','011',1119),(10146,'Babītes novads','012',1119),(10147,'Carnikavas novads','020',1119),(10148,'Garkalnes novads','031',1119),(10149,'Krimuldas novads','048',1119),(10150,'Mālpils novads','061',1119),(10151,'Mārupes novads','062',1119),(10152,'Ropažu novads','080',1119),(10153,'Sējas novads','090',1119),(10154,'Stopiņu novads','095',1119),(10155,'Saldus novads','088',1119),(10156,'Brocēnu novads','018',1119),(10157,'Talsu novads','097',1119),(10158,'Dundagas novads','027',1119),(10159,'Mērsraga novads','063',1119),(10160,'Rojas novads','079',1119),(10161,'Tukuma novads','099',1119),(10162,'Kandavas novads','043',1119),(10163,'Engures novads','029',1119),(10164,'Jaunpils novads','040',1119),(10165,'Valkas novads','101',1119),(10166,'Smiltenes novads','094',1119),(10167,'Strenču novads','096',1119),(10168,'Kocēnu novads','045',1119),(10169,'Mazsalacas novads','060',1119),(10170,'Rūjienas novads','084',1119),(10171,'Beverīnas novads','017',1119),(10172,'Burtnieku novads','019',1119),(10173,'Naukšēnu novads','064',1119),(10174,'Ventspils novads','106',1119),(10175,'Jēkabpils','JKB',1119),(10176,'Valmiera','VMR',1119),(10177,'Florida','FL',1229),(10178,'Rio Negro','RN',1229),(10179,'San Jose','SJ',1229),(10180,'Plateau','PL',1157),(10181,'Pieria','61',1085),(10182,'Los Rios','LR',1044),(10183,'Arica y Parinacota','AP',1044),(10184,'Amazonas','AMA',1169),(10185,'Kalimantan Tengah','KT',1102),(10186,'Sulawesi Barat','SR',1102),(10187,'Kalimantan Utara','KU',1102),(10188,'Ankaran','86',1193),(10189,'Apače','87',1193),(10190,'Cirkulane','88',1193),(10191,'Gorje','89',1193),(10192,'Kostanjevica na Krki','90',1193),(10193,'Log-Dragomer','91',1193),(10194,'Makole','92',1193),(10195,'Mirna','93',1193),(10196,'Mokronog-Trebelno','94',1193),(10197,'Odranci','95',1193),(10198,'Oplotnica','96',1193),(10199,'Ormož','97',1193),(10200,'Osilnica','98',1193),(10201,'Pesnica','99',1193),(10202,'Piran','100',1193),(10203,'Pivka','101',1193),(10204,'Podčetrtek','102',1193),(10205,'Podlehnik','103',1193),(10206,'Podvelka','104',1193),(10207,'Poljčane','105',1193),(10208,'Polzela','106',1193),(10209,'Postojna','107',1193),(10210,'Prebold','108',1193),(10211,'Preddvor','109',1193),(10212,'Prevalje','110',1193),(10213,'Ptuj','111',1193),(10214,'Puconci','112',1193),(10215,'Rače-Fram','113',1193),(10216,'Radeče','114',1193),(10217,'Radenci','115',1193),(10218,'Radlje ob Dravi','139',1193),(10219,'Radovljica','145',1193),(10220,'Ravne na Koroškem','171',1193),(10221,'Razkrižje','172',1193),(10222,'Rečica ob Savinji','173',1193),(10223,'Renče-Vogrsko','174',1193),(10224,'Ribnica','175',1193),(10225,'Ribnica na Pohorju','176',1193),(10226,'Rogaška Slatina','177',1193),(10227,'Rogašovci','178',1193),(10228,'Rogatec','179',1193),(10229,'Ruše','180',1193),(10230,'Selnica ob Dravi','195',1193),(10231,'Semič','196',1193),(10232,'Šentrupert','197',1193),(10233,'Sevnica','198',1193),(10234,'Sežana','199',1193),(10235,'Slovenj Gradec','200',1193),(10236,'Slovenska Bistrica','201',1193),(10237,'Slovenske Konjice','202',1193),(10238,'Šmarješke Toplice','203',1193),(10239,'Sodražica','204',1193),(10240,'Solčava','205',1193),(10241,'Središče ob Dravi','206',1193),(10242,'Starše','207',1193),(10243,'Straža','208',1193),(10244,'Sveta Trojica v Slovenskih goricah','209',1193),(10245,'Sveti Jurij v Slovenskih goricah','210',1193),(10246,'Sveti Tomaž','211',1193),(10247,'Vodice','212',1193),(10248,'Abkhazia','AB',1081),(10249,'Adjara','AJ',1081),(10250,'Tbilisi','TB',1081),(10251,'Guria','GU',1081),(10252,'Imereti','IM',1081),(10253,'Kakheti','KA',1081),(10254,'Kvemo Kartli','KK',1081),(10255,'Mtskheta-Mtianeti','MM',1081),(10256,'Racha-Lechkhumi and Kvemo Svaneti','RL',1081),(10257,'Samegrelo-Zemo Svaneti','SZ',1081),(10258,'Samtskhe-Javakheti','SJ',1081),(10259,'Shida Kartli','SK',1081),(10260,'Central','C',1074),(10261,'Punjab','PB',1163),(10262,'La Libertad','LI',1066),(10263,'La Paz','PA',1066),(10264,'La Union','UN',1066),(10265,'Littoral','LT',1038),(10266,'Nord-Ouest','NW',1038),(10267,'Telangana','TG',1101),(10268,'Ash Sharqiyah','04',1187),(10269,'Guadeloupe','GP',1076),(10270,'Martinique','MQ',1076),(10271,'Guyane','GF',1076),(10272,'La Réunion','RE',1076),(10273,'Mayotte','YT',1076),(10274,'Baringo','01',1112),(10275,'Bomet','02',1112),(10276,'Bungoma','03',1112),(10277,'Busia','04',1112),(10278,'Elgeyo/Marakwet','05',1112),(10279,'Embu','06',1112),(10280,'Garissa','07',1112),(10281,'Homa Bay','08',1112),(10282,'Isiolo','09',1112),(10283,'Kajiado','10',1112),(10284,'Kakamega','11',1112),(10285,'Kericho','12',1112),(10286,'Kiambu','13',1112),(10287,'Kilifi','14',1112),(10288,'Kirinyaga','15',1112),(10289,'Kisii','16',1112),(10290,'Kisumu','17',1112),(10291,'Kitui','18',1112),(10292,'Kwale','19',1112),(10293,'Laikipia','20',1112),(10294,'Lamu','21',1112),(10295,'Machakos','22',1112),(10296,'Makueni','23',1112),(10297,'Mandera','24',1112),(10298,'Marsabit','25',1112),(10299,'Meru','26',1112),(10300,'Migori','27',1112),(10301,'Mombasa','28',1112),(10302,'Murang\'a','29',1112),(10303,'Nairobi City','30',1112),(10304,'Nakuru','31',1112),(10305,'Nandi','32',1112),(10306,'Narok','33',1112),(10307,'Nyamira','34',1112),(10308,'Nyandarua','35',1112),(10309,'Nyeri','36',1112),(10310,'Samburu','37',1112),(10311,'Siaya','38',1112),(10312,'Taita/Taveta','39',1112),(10313,'Tana River','40',1112),(10314,'Tharaka-Nithi','41',1112),(10315,'Trans Nzoia','42',1112),(10316,'Turkana','43',1112),(10317,'Uasin Gishu','44',1112),(10318,'Vihiga','45',1112),(10319,'Wajir','46',1112),(10320,'West Pokot','47',1112),(10321,'Chandigarh','CH',1101),(10322,'Central','CP',1083),(10323,'Eastern','EP',1083),(10324,'Northern','NP',1083),(10325,'Western','WP',1083),(10326,'Saint Kitts','K',1181),(10327,'Nevis','N',1181),(10328,'Eastern','E',1190),(10329,'Northern','N',1190),(10330,'Southern','S',1190),(10331,'Dushanbe','DU',1209),(10332,'Nohiyahoi Tobei Jumhurí','RA',1209),(10333,'Wallis-et-Futuna','WF',1076),(10334,'Nouvelle-Calédonie','NC',1076),(10335,'Haute-Marne','52',1076),(10336,'Saint George','03',1009),(10337,'Saint John','04',1009),(10338,'Saint Mary','05',1009),(10339,'Saint Paul','06',1009),(10340,'Saint Peter','07',1009),(10341,'Saint Philip','08',1009),(10342,'Barbuda','10',1009),(10343,'Redonda','11',1009),(10344,'Christ Church','01',1018),(10345,'Saint Andrew','02',1018),(10346,'Saint George','03',1018),(10347,'Saint James','04',1018),(10348,'Saint John','05',1018),(10349,'Saint Joseph','06',1018),(10350,'Saint Lucy','07',1018),(10351,'Saint Michael','08',1018),(10352,'Saint Peter','09',1018),(10353,'Saint Philip','10',1018),(10354,'Saint Thomas','11',1018),(10355,'Estuaire','01',1080),(10356,'Haut-Ogooué','02',1080),(10357,'Moyen-Ogooué','03',1080),(10358,'Ngounié','04',1080),(10359,'Nyanga','05',1080),(10360,'Ogooué-Ivindo','06',1080),(10361,'Ogooué-Lolo','07',1080),(10362,'Ogooué-Maritime','08',1080),(10363,'Woleu-Ntem','09',1080),(10364,'Monmouthshire','MON',1226),(10365,'Antrim and Newtownabbey','ANN',1226),(10366,'Ards and North Down','AND',1226),(10367,'Armagh City, Banbridge and Craigavon','ABC',1226),(10368,'Belfast','BFS',1226),(10369,'Causeway Coast and Glens','CCG',1226),(10370,'Derry City and Strabane','DRS',1226),(10371,'Fermanagh and Omagh','FMO',1226),(10372,'Lisburn and Castlereagh','LBC',1226),(10373,'Mid and East Antrim','MEA',1226),(10374,'Mid Ulster','MUL',1226),(10375,'Newry, Mourne and Down','NMD',1226),(10376,'Bridgend','BGE',1226),(10377,'Caerphilly','CAY',1226),(10378,'Cardiff','CRF',1226),(10379,'Carmarthenshire','CRF',1226),(10380,'Ceredigion','CGN',1226),(10381,'Conwy','CWY',1226),(10382,'Denbighshire','DEN',1226),(10383,'Flintshire','FLN',1226),(10384,'Isle of Anglesey','AGY',1226),(10385,'Merthyr Tydfil','MTY',1226),(10386,'Neath Port Talbot','NTL',1226),(10387,'Newport','NWP',1226),(10388,'Pembrokeshire','PEM',1226),(10389,'Rhondda, Cynon, Taff','RCT',1226),(10390,'Swansea','SWA',1226),(10391,'Torfaen','TOF',1226),(10392,'Wrexham','WRX',1226);
 /*!40000 ALTER TABLE `civicrm_state_province` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1347,7 +1347,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_subscription_history` WRITE;
 /*!40000 ALTER TABLE `civicrm_subscription_history` DISABLE KEYS */;
-INSERT INTO `civicrm_subscription_history` (`id`, `contact_id`, `group_id`, `date`, `method`, `status`, `tracking`) VALUES (1,169,2,'2019-11-20 21:26:21','Admin','Added',NULL),(2,24,2,'2019-12-23 11:52:30','Email','Added',NULL),(3,124,2,'2019-11-18 09:34:53','Email','Added',NULL),(4,57,2,'2019-09-21 08:05:46','Admin','Added',NULL),(5,17,2,'2019-11-27 11:47:55','Email','Added',NULL),(6,182,2,'2020-03-12 13:17:00','Email','Added',NULL),(7,99,2,'2019-08-04 20:42:42','Email','Added',NULL),(8,138,2,'2020-07-14 02:26:21','Email','Added',NULL),(9,81,2,'2020-02-17 20:51:29','Email','Added',NULL),(10,53,2,'2019-12-12 16:46:40','Email','Added',NULL),(11,15,2,'2020-06-08 11:55:39','Email','Added',NULL),(12,33,2,'2019-12-02 00:17:20','Email','Added',NULL),(13,179,2,'2019-09-18 20:51:54','Admin','Added',NULL),(14,83,2,'2020-02-21 16:59:13','Email','Added',NULL),(15,164,2,'2019-09-04 18:42:28','Email','Added',NULL),(16,146,2,'2019-08-16 17:31:30','Admin','Added',NULL),(17,120,2,'2019-10-25 00:35:51','Admin','Added',NULL),(18,193,2,'2020-05-08 16:05:56','Email','Added',NULL),(19,76,2,'2019-08-18 21:58:45','Email','Added',NULL),(20,162,2,'2019-08-25 15:21:21','Email','Added',NULL),(21,66,2,'2019-08-21 12:54:54','Admin','Added',NULL),(22,92,2,'2019-08-30 06:33:41','Admin','Added',NULL),(23,167,2,'2020-03-26 10:25:26','Email','Added',NULL),(24,65,2,'2020-04-21 20:54:05','Admin','Added',NULL),(25,190,2,'2019-09-11 17:19:20','Email','Added',NULL),(26,184,2,'2019-12-21 22:09:38','Email','Added',NULL),(27,67,2,'2019-08-13 13:10:41','Email','Added',NULL),(28,185,2,'2020-05-16 21:14:47','Admin','Added',NULL),(29,183,2,'2020-06-23 07:14:06','Email','Added',NULL),(30,175,2,'2019-12-09 11:30:16','Admin','Added',NULL),(31,129,2,'2020-03-06 02:22:27','Email','Added',NULL),(32,197,2,'2019-08-28 11:28:01','Email','Added',NULL),(33,122,2,'2019-09-12 07:55:23','Email','Added',NULL),(34,7,2,'2019-11-13 02:54:04','Admin','Added',NULL),(35,154,2,'2019-08-30 21:35:11','Email','Added',NULL),(36,51,2,'2020-03-13 22:09:33','Email','Added',NULL),(37,97,2,'2020-01-04 06:55:30','Email','Added',NULL),(38,111,2,'2020-04-21 03:12:40','Admin','Added',NULL),(39,143,2,'2019-11-15 07:26:31','Email','Added',NULL),(40,77,2,'2020-04-10 22:45:14','Email','Added',NULL),(41,186,2,'2020-05-11 19:35:51','Admin','Added',NULL),(42,12,2,'2020-02-20 08:29:05','Admin','Added',NULL),(43,8,2,'2020-01-17 21:34:08','Admin','Added',NULL),(44,84,2,'2020-05-11 14:40:31','Email','Added',NULL),(45,71,2,'2019-12-18 13:22:22','Admin','Added',NULL),(46,3,2,'2020-06-23 16:06:41','Email','Added',NULL),(47,123,2,'2020-04-15 15:26:58','Admin','Added',NULL),(48,119,2,'2020-02-11 11:16:39','Admin','Added',NULL),(49,161,2,'2019-09-14 18:37:42','Admin','Added',NULL),(50,145,2,'2020-05-23 07:34:56','Email','Added',NULL),(51,60,2,'2019-08-22 10:28:33','Email','Added',NULL),(52,31,2,'2019-11-13 10:56:38','Email','Added',NULL),(53,55,2,'2020-02-13 23:43:08','Admin','Added',NULL),(54,88,2,'2019-12-24 11:11:02','Email','Added',NULL),(55,64,2,'2020-02-03 07:32:36','Admin','Added',NULL),(56,41,2,'2019-08-08 18:06:57','Email','Added',NULL),(57,30,2,'2020-04-26 23:17:36','Email','Added',NULL),(58,2,2,'2020-01-16 00:51:51','Email','Added',NULL),(59,156,2,'2019-11-24 19:05:36','Email','Added',NULL),(60,118,2,'2020-05-08 22:41:55','Admin','Added',NULL),(61,87,3,'2020-02-12 19:47:53','Email','Added',NULL),(62,49,3,'2019-11-24 14:21:59','Email','Added',NULL),(63,23,3,'2020-03-20 02:01:17','Email','Added',NULL),(64,5,3,'2020-02-12 06:13:02','Email','Added',NULL),(65,93,3,'2020-03-26 23:29:51','Admin','Added',NULL),(66,18,3,'2019-09-26 12:23:17','Email','Added',NULL),(67,6,3,'2019-09-19 13:40:19','Admin','Added',NULL),(68,199,3,'2020-04-23 00:44:59','Email','Added',NULL),(69,176,3,'2020-02-29 17:05:30','Email','Added',NULL),(70,132,3,'2020-02-17 15:44:05','Admin','Added',NULL),(71,80,3,'2020-03-01 11:59:37','Email','Added',NULL),(72,45,3,'2020-01-23 09:13:35','Admin','Added',NULL),(73,44,3,'2019-08-22 22:38:26','Admin','Added',NULL),(74,96,3,'2020-07-20 11:43:21','Email','Added',NULL),(75,166,3,'2019-10-22 19:46:03','Email','Added',NULL),(76,169,4,'2020-04-20 15:35:07','Email','Added',NULL),(77,138,4,'2019-09-14 05:27:21','Admin','Added',NULL),(78,164,4,'2019-12-21 08:53:52','Email','Added',NULL),(79,92,4,'2019-11-08 12:12:13','Email','Added',NULL),(80,183,4,'2020-02-20 08:24:27','Email','Added',NULL),(81,51,4,'2020-05-18 10:54:03','Admin','Added',NULL),(82,8,4,'2019-08-23 17:30:49','Admin','Added',NULL),(83,145,4,'2020-06-15 07:19:20','Email','Added',NULL);
+INSERT INTO `civicrm_subscription_history` (`id`, `contact_id`, `group_id`, `date`, `method`, `status`, `tracking`) VALUES (1,158,2,'2020-04-11 18:21:48','Email','Added',NULL),(2,200,2,'2020-04-07 11:25:08','Email','Added',NULL),(3,44,2,'2020-08-13 21:14:58','Admin','Added',NULL),(4,159,2,'2020-05-24 20:11:08','Email','Added',NULL),(5,193,2,'2020-08-28 16:18:40','Email','Added',NULL),(6,18,2,'2019-10-29 05:04:27','Email','Added',NULL),(7,188,2,'2020-06-10 07:23:41','Admin','Added',NULL),(8,131,2,'2019-12-23 13:20:18','Email','Added',NULL),(9,34,2,'2019-10-29 17:19:05','Admin','Added',NULL),(10,153,2,'2020-05-29 15:09:12','Email','Added',NULL),(11,163,2,'2019-10-09 20:50:26','Admin','Added',NULL),(12,85,2,'2020-07-18 03:51:19','Email','Added',NULL),(13,57,2,'2019-11-03 23:54:12','Admin','Added',NULL),(14,95,2,'2020-08-09 11:14:23','Admin','Added',NULL),(15,185,2,'2020-02-19 20:16:34','Admin','Added',NULL),(16,173,2,'2019-12-08 00:23:57','Email','Added',NULL),(17,27,2,'2020-05-18 03:21:09','Email','Added',NULL),(18,133,2,'2020-01-21 01:37:01','Admin','Added',NULL),(19,182,2,'2020-03-08 00:31:06','Admin','Added',NULL),(20,33,2,'2020-09-20 20:34:55','Admin','Added',NULL),(21,171,2,'2020-05-08 06:14:00','Admin','Added',NULL),(22,125,2,'2020-05-08 03:19:56','Admin','Added',NULL),(23,101,2,'2020-09-06 07:46:15','Admin','Added',NULL),(24,134,2,'2020-04-11 08:27:35','Email','Added',NULL),(25,97,2,'2020-01-04 21:48:04','Email','Added',NULL),(26,16,2,'2020-04-04 20:08:57','Email','Added',NULL),(27,147,2,'2019-11-16 19:22:08','Admin','Added',NULL),(28,180,2,'2019-10-27 17:48:03','Email','Added',NULL),(29,175,2,'2020-07-24 13:42:18','Email','Added',NULL),(30,137,2,'2020-07-15 20:55:10','Email','Added',NULL),(31,111,2,'2020-04-04 13:14:01','Admin','Added',NULL),(32,195,2,'2020-08-16 14:01:56','Email','Added',NULL),(33,183,2,'2020-01-08 09:36:07','Admin','Added',NULL),(34,108,2,'2020-09-19 09:45:02','Admin','Added',NULL),(35,76,2,'2020-05-27 11:44:20','Admin','Added',NULL),(36,109,2,'2019-11-11 08:47:27','Email','Added',NULL),(37,90,2,'2020-03-21 17:27:58','Admin','Added',NULL),(38,135,2,'2019-12-02 19:13:20','Admin','Added',NULL),(39,47,2,'2020-04-18 13:30:42','Email','Added',NULL),(40,26,2,'2020-02-05 15:11:44','Admin','Added',NULL),(41,20,2,'2020-10-02 20:39:32','Admin','Added',NULL),(42,25,2,'2020-09-03 01:38:10','Admin','Added',NULL),(43,166,2,'2020-05-21 11:45:00','Admin','Added',NULL),(44,140,2,'2020-03-29 00:35:59','Email','Added',NULL),(45,67,2,'2020-02-07 23:12:26','Email','Added',NULL),(46,94,2,'2019-10-18 12:27:39','Admin','Added',NULL),(47,30,2,'2019-10-12 00:13:21','Email','Added',NULL),(48,22,2,'2020-02-12 07:45:47','Email','Added',NULL),(49,143,2,'2019-10-27 09:06:05','Email','Added',NULL),(50,84,2,'2020-04-12 18:34:19','Email','Added',NULL),(51,169,2,'2020-09-11 17:31:10','Admin','Added',NULL),(52,184,2,'2020-04-18 09:41:29','Admin','Added',NULL),(53,113,2,'2020-05-08 01:22:04','Admin','Added',NULL),(54,141,2,'2020-01-21 12:58:48','Email','Added',NULL),(55,58,2,'2020-02-09 23:53:57','Email','Added',NULL),(56,19,2,'2019-11-08 07:01:20','Email','Added',NULL),(57,17,2,'2020-01-26 12:33:15','Admin','Added',NULL),(58,176,2,'2020-05-16 05:38:41','Admin','Added',NULL),(59,60,2,'2019-10-10 01:19:08','Admin','Added',NULL),(60,40,2,'2019-11-24 03:40:53','Email','Added',NULL),(61,23,3,'2020-01-13 16:36:17','Email','Added',NULL),(62,130,3,'2020-08-03 14:22:11','Email','Added',NULL),(63,99,3,'2020-04-11 16:18:06','Admin','Added',NULL),(64,106,3,'2020-04-05 19:09:14','Email','Added',NULL),(65,102,3,'2020-04-12 14:29:44','Email','Added',NULL),(66,66,3,'2020-06-22 20:00:19','Admin','Added',NULL),(67,32,3,'2020-02-21 05:35:26','Admin','Added',NULL),(68,187,3,'2020-04-22 19:04:56','Email','Added',NULL),(69,14,3,'2020-04-27 03:11:12','Email','Added',NULL),(70,151,3,'2020-04-02 23:11:28','Admin','Added',NULL),(71,31,3,'2020-02-10 00:25:03','Admin','Added',NULL),(72,117,3,'2020-02-04 18:38:33','Admin','Added',NULL),(73,64,3,'2020-03-03 09:29:30','Admin','Added',NULL),(74,56,3,'2020-01-22 08:57:03','Email','Added',NULL),(75,28,3,'2020-08-31 18:38:45','Admin','Added',NULL),(76,158,4,'2020-10-03 21:33:02','Admin','Added',NULL),(77,131,4,'2019-12-25 12:35:03','Admin','Added',NULL),(78,185,4,'2020-03-21 21:00:20','Admin','Added',NULL),(79,125,4,'2019-12-25 21:34:41','Admin','Added',NULL),(80,175,4,'2020-06-06 11:03:12','Email','Added',NULL),(81,109,4,'2019-12-27 14:14:48','Email','Added',NULL),(82,166,4,'2020-02-05 03:13:59','Email','Added',NULL),(83,84,4,'2020-06-19 12:48:40','Admin','Added',NULL);
 /*!40000 ALTER TABLE `civicrm_subscription_history` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1443,7 +1443,7 @@ UNLOCK TABLES;
 
 LOCK TABLES `civicrm_website` WRITE;
 /*!40000 ALTER TABLE `civicrm_website` DISABLE KEYS */;
-INSERT INTO `civicrm_website` (`id`, `contact_id`, `url`, `website_type_id`) VALUES (1,174,'http://northpointdevelopmentschool.org',1),(2,105,'http://urbanculture.org',1),(3,144,'http://globalempowerment.org',1),(4,148,'http://dallaspartnership.org',1),(5,90,'http://rebeccafellowship.org',1),(6,86,'http://beechdevelopmenttrust.org',1),(7,56,'http://kentuckyinitiative.org',1),(8,137,'http://aptossustainability.org',1),(9,14,'http://bltechnologyfund.org',1),(10,178,'http://sierrasoftwaresolutions.org',1),(11,117,'http://maincollective.org',1),(12,157,'http://moxahaladevelopmentalliance.org',1),(13,91,'http://greenpoetry.org',1),(14,79,'http://ogdensburgpoetry.org',1),(15,37,'http://urbanactionschool.org',1),(16,46,'http://greeninitiative.org',1),(17,50,'http://collegehealthassociation.org',1);
+INSERT INTO `civicrm_website` (`id`, `contact_id`, `url`, `website_type_id`) VALUES (1,69,'http://idahoadvocacyacademy.org',1),(2,39,'http://wardensvilleempowerment.org',1),(3,78,'http://beechpoetryassociation.org',1),(4,98,'http://kentuckypoetry.org',1),(5,80,'http://alaskapoetrysystems.org',1),(6,196,'http://urbanenvironmentalfund.org',1),(7,142,'http://hartlandempowerment.org',1),(8,38,'http://washingtonservices.org',1),(9,189,'http://lincolnsoftwareassociation.org',1),(10,162,'http://grotonadvocacy.org',1),(11,3,'http://globalinitiative.org',1),(12,4,'http://creativeschool.org',1),(13,61,'http://nhfoodfellowship.org',1),(14,104,'http://pinecenter.org',1);
 /*!40000 ALTER TABLE `civicrm_website` ENABLE KEYS */;
 UNLOCK TABLES;
 
@@ -1475,7 +1475,7 @@ UNLOCK TABLES;
 /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
 
--- Dump completed on 2020-07-24 15:34:05
+-- Dump completed on 2020-10-08 12:49:16
 -- +--------------------------------------------------------------------+
 -- | Copyright CiviCRM LLC. All rights reserved.                        |
 -- |                                                                    |
diff --git a/civicrm/templates/CRM/Activity/Form/ActivityView.tpl b/civicrm/templates/CRM/Activity/Form/ActivityView.tpl
index 4f68416e217b1e56855e9064e66c7874264884f4..b0a02df612d4372aee2c5e4bcbdd0ef27eab0bf8 100644
--- a/civicrm/templates/CRM/Activity/Form/ActivityView.tpl
+++ b/civicrm/templates/CRM/Activity/Form/ActivityView.tpl
@@ -119,7 +119,7 @@
             </tr>
         {else}
              <tr>
-                 <td class="label">{ts}Details{/ts}</td><td class="view-value report">{$values.details|crmStripAlternatives|nl2br}</td>
+                 <td class="label">{ts}Details{/ts}</td><td class="view-value report">{$values.details|crmStripAlternatives|purify|nl2br}</td>
              </tr>
         {/if}
 {if $values.attachment}
diff --git a/civicrm/templates/CRM/Admin/Form/MailSettings.tpl b/civicrm/templates/CRM/Admin/Form/MailSettings.tpl
index 361ffe09e187932ba91ed2b4adee24be4970f7a0..d003ef89f9ba1c2529b145138645f8579e897612 100644
--- a/civicrm/templates/CRM/Admin/Form/MailSettings.tpl
+++ b/civicrm/templates/CRM/Admin/Form/MailSettings.tpl
@@ -9,62 +9,73 @@
 *}
 {* this template is used for adding/editing email settings.  *}
 <div class="crm-block crm-form-block crm-mail-settings-form-block">
-<div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
-{if $action eq 8}
-  <div class="messages status no-popup">
+  <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
+  {if $action eq 8}
+    <div class="messages status no-popup">
       {icon icon="fa-info-circle"}{/icon}
-  {ts}WARNING: Deleting this option will result in the loss of mail settings data.{/ts} {ts}Do you want to continue?{/ts}
-  </div>
+      {ts}WARNING: Deleting this option will result in the loss of mail settings data.{/ts} {ts}Do you want to continue?{/ts}
+    </div>
     <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
-{else}
+  {else}
     <table class="form-layout-compressed">
 
-  <tr class="crm-mail-settings-form-block-name"><td class="label">{$form.name.label}</td><td>{$form.name.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}Name of this group of settings.{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-name"><td class="label">{$form.name.label}</td><td>{$form.name.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Name of this group of settings.{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-server"><td class="label">{$form.server.label}</td><td>{$form.server.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}Name or IP address of mail server machine.{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-server"><td class="label">{$form.server.label}</td><td>{$form.server.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Name or IP address of mail server machine.{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-username"><td class="label">{$form.username.label}</td><td>{$form.username.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}Username to use when polling (for IMAP and POP3).{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-username"><td class="label">{$form.username.label}</td><td>{$form.username.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Username to use when polling (for IMAP and POP3).{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-password"><td class="label">{$form.password.label}</td><td>{$form.password.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}Password to use when polling (for IMAP and POP3).{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-password"><td class="label">{$form.password.label}</td><td>{$form.password.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Password to use when polling (for IMAP and POP3).{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-localpart"><td class="label">{$form.localpart.label}</td><td>{$form.localpart.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}Optional local part (e.g., 'civimail+' for addresses like civimail+s.1.2@example.com).{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-localpart"><td class="label">{$form.localpart.label}</td><td>{$form.localpart.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Optional local part (e.g., 'civimail+' for addresses like civimail+s.1.2@example.com).{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-domain"><td class="label">{$form.domain.label}</td><td>{$form.domain.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}Email address domain (the part after @).{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-domain"><td class="label">{$form.domain.label}</td><td>{$form.domain.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Email address domain (the part after @).{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-return_path"><td class="label">{$form.return_path.label}</td><td>{$form.return_path.html}</td><tr>
-        <tr><td class="label">&nbsp;</td><td class="description">{ts}Contents of the Return-Path header.{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-return_path"><td class="label">{$form.return_path.label}</td><td>{$form.return_path.html}</td><tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Contents of the Return-Path header.{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-protocol"><td class="label">{$form.protocol.label}</td><td>{$form.protocol.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}Name of the protocol to use for polling.{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-protocol"><td class="label">{$form.protocol.label}</td><td>{$form.protocol.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Name of the protocol to use for polling.{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-source"><td class="label">{$form.source.label}</td><td>{$form.source.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}Folder to poll from when using IMAP (will default to INBOX when empty), path to poll from when using Maildir, etc..{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-source"><td class="label">{$form.source.label}</td><td>{$form.source.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Folder to poll from when using IMAP (will default to INBOX when empty), path to poll from when using Maildir, etc..{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-is_ssl"><td class="label">{$form.is_ssl.label}</td><td>{$form.is_ssl.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}Whether to use SSL for IMAP and POP3 or not.{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-is_ssl"><td class="label">{$form.is_ssl.label}</td><td>{$form.is_ssl.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}Whether to use SSL for IMAP and POP3 or not.{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-is_default"><td class="label">{$form.is_default.label}</td><td>{$form.is_default.html}</td></tr>
-  <tr><td class="label">&nbsp;</td><td class="description">{ts}How this mail account will be used. Only one box may be used for bounce processing. It will also be used as the envelope email when sending mass mailings.{/ts}</td></tr>
+      <tr class="crm-mail-settings-form-block-is_default"><td class="label">{$form.is_default.label}</td><td>{$form.is_default.html}</td></tr>
+      <tr><td class="label">&nbsp;</td><td class="description">{ts}How this mail account will be used. Only one box may be used for bounce processing. It will also be used as the envelope email when sending mass mailings.{/ts}</td></tr>
 
-  <tr class="crm-mail-settings-form-block-activity_status"><td class="label">{$form.activity_status.label}</td><td>{$form.activity_status.html}</td></tr>
+      <tr class="crm-mail-settings-form-block-is_non_case_email_skipped"><td class="label">&nbsp;</td><td>{$form.is_non_case_email_skipped.html}{$form.is_non_case_email_skipped.label} {help id='is_non_case_email_skipped'}</td></tr>
+
+      <tr class="crm-mail-settings-form-block-is_contact_creation_disabled_if_no_match"><td class="label">&nbsp;</td><td>{$form.is_contact_creation_disabled_if_no_match.html}{$form.is_contact_creation_disabled_if_no_match.label} {help id='is_contact_creation_disabled_if_no_match'}</td></tr>
+
+      <tr class="crm-mail-settings-form-block-activity_status"><td class="label">&nbsp;</td><td>{$form.activity_status.label}<div>{$form.activity_status.html}</div></td></tr>
     </table>
-  <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
-{/if}
+
+    <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
+  {/if}
 </div>
+
 {literal}
 <script type="text/javascript">
   CRM.$(function($) {
     var $form = $('form.{/literal}{$form.formClass}{literal}');
-    function showActivityStatus() {
-      $('.crm-mail-settings-form-block-activity_status', $form).toggle($(this).val() === '0');
+    function showActivityFields() {
+      var fields = [
+        '.crm-mail-settings-form-block-activity_status',
+        '.crm-mail-settings-form-block-is_non_case_email_skipped',
+        '.crm-mail-settings-form-block-is_contact_creation_disabled_if_no_match',
+      ];
+      $(fields.join(', '), $form).toggle($(this).val() === '0');
     }
-    $('select[name=is_default]').each(showActivityStatus).change(showActivityStatus);
+    $('select[name="is_default"]').each(showActivityFields).change(showActivityFields);
   });
 </script>
 {/literal}
diff --git a/civicrm/templates/CRM/Admin/Form/PaymentProcessor.tpl b/civicrm/templates/CRM/Admin/Form/PaymentProcessor.tpl
index 67464d00e998a9b788325f1e042c2689ca1813c1..a18fde994390712388d7e0a3a3305620b6775f66 100644
--- a/civicrm/templates/CRM/Admin/Form/PaymentProcessor.tpl
+++ b/civicrm/templates/CRM/Admin/Form/PaymentProcessor.tpl
@@ -73,15 +73,17 @@
             <td class="label">{$form.subject.label}</td><td>{$form.subject.html} {help id=$ppTypeName|cat:'-live-subject' title=$form.subject.label}</td>
         </tr>
 {/if}
+{if $form.url_site}
         <tr class="crm-paymentProcessor-form-block-url_site">
             <td class="label">{$form.url_site.label}</td><td>{$form.url_site.html|crmAddClass:huge} {help id=$ppTypeName|cat:'-live-url-site' title=$form.url_site.label}</td>
         </tr>
+{/if}
 {if $form.url_api}
         <tr class="crm-paymentProcessor-form-block-url_api">
             <td class="label">{$form.url_api.label}</td><td>{$form.url_api.html|crmAddClass:huge} {help id=$ppTypeName|cat:'-live-url-api' title=$form.url_api.label}</td>
         </tr>
 {/if}
-{if $is_recur}
+{if $form.url_recur}
         <tr class="crm-paymentProcessor-form-block-url_recur">
             <td class="label">{$form.url_recur.label}</td><td>{$form.url_recur.html|crmAddClass:huge} {help id=$ppTypeName|cat:'-live-url-recur' title=$form.url_recur.label}</td>
         </tr>
@@ -114,15 +116,17 @@
             <td class="label">{$form.test_subject.label}</td><td>{$form.test_subject.html} {help id=$ppTypeName|cat:'-test-subject' title=$form.test_subject.label}</td>
         </tr>
 {/if}
+{if $form.test_url_site}
         <tr class="crm-paymentProcessor-form-block-test_url_site">
             <td class="label">{$form.test_url_site.label}</td><td>{$form.test_url_site.html|crmAddClass:huge} {help id=$ppTypeName|cat:'-test-url-site' title=$form.test_url_site.label}</td>
         </tr>
+{/if}
 {if $form.test_url_api}
         <tr class="crm-paymentProcessor-form-block-test_url_api">
             <td class="label">{$form.test_url_api.label}</td><td>{$form.test_url_api.html|crmAddClass:huge} {help id=$ppTypeName|cat:'-test-url-api' title=$form.test_url_api.label}</td>
         </tr>
 {/if}
-{if $is_recur}
+{if $form.test_url_recur}
         <tr class="crm-paymentProcessor-form-block-test_url_recur">
             <td class="label">{$form.test_url_recur.label}</td><td>{$form.test_url_recur.html|crmAddClass:huge} {help id=$ppTypeName|cat:'-test-url-recur' title=$form.test_url_recur.label}</td>
         </tr>
diff --git a/civicrm/templates/CRM/Admin/Form/Preferences/Display.tpl b/civicrm/templates/CRM/Admin/Form/Preferences/Display.tpl
index 049a5ebf9975f78a4a4fe002de5724784583f32b..b06cb53588ac1ce86ea4480b80b344848807e703 100644
--- a/civicrm/templates/CRM/Admin/Form/Preferences/Display.tpl
+++ b/civicrm/templates/CRM/Admin/Form/Preferences/Display.tpl
@@ -161,10 +161,7 @@
       <td>
         {$form.editor_id.html}
         &nbsp;
-        <span class="crm-button crm-icon-button" style="display:inline-block;vertical-align:middle;float:none!important;">
-          <i class="crm-i fa-wrench" style="margin: 0 -18px 0 2px;" aria-hidden="true"></i>
-          {$form.ckeditor_config.html}
-        </span>
+        {$form.ckeditor_config.html}
       </td>
     </tr>
     <tr class="crm-preferences-display-form-block-ajaxPopupsEnabled">
@@ -206,22 +203,14 @@
         {$form.menubar_color.html}
       </td>
     </tr>
-
-    {if $config->userSystem->is_drupal EQ '1'}
-      <tr class="crm-preferences-display-form-block-theme">
-        <td class="label">{ts}Theme{/ts} {help id="theme"}</td>
-        <td>{$form.theme_backend.html}</td>
-      </tr>
-    {else}
-      <tr class="crm-preferences-display-form-block-theme_backend">
-        <td class="label">{$form.theme_backend.label} {help id="theme_backend"}</td>
-        <td>{$form.theme_backend.html}</td>
-      </tr>
-      <tr class="crm-preferences-display-form-block-theme_frontend">
-        <td class="label">{$form.theme_frontend.label} {help id="theme_frontend"}</td>
-        <td>{$form.theme_frontend.html}</td>
-      </tr>
-      {/if}
+    <tr class="crm-preferences-display-form-block-theme_backend">
+      <td class="label">{$form.theme_backend.label} {help id="theme_backend"}</td>
+      <td>{$form.theme_backend.html}</td>
+    </tr>
+    <tr class="crm-preferences-display-form-block-theme_frontend">
+      <td class="label">{$form.theme_frontend.label} {help id="theme_frontend"}</td>
+      <td>{$form.theme_frontend.html}</td>
+    </tr>
   </table>
   <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
 </div>
diff --git a/civicrm/templates/CRM/Admin/Page/APIExplorer.tpl b/civicrm/templates/CRM/Admin/Page/APIExplorer.tpl
index 1e1b8eb497da1501bbc2e14e17dc516a28516f9e..2be5f1f3c4abce9ce90fbf526556149db4d08d75 100644
--- a/civicrm/templates/CRM/Admin/Page/APIExplorer.tpl
+++ b/civicrm/templates/CRM/Admin/Page/APIExplorer.tpl
@@ -285,9 +285,9 @@
         </table>
       </div>
       <div class="crm-submit-buttons">
-        <span class="crm-button crm-i-button">
-          <i class="crm-i fa-bolt" aria-hidden="true"></i><input type="submit" value="{ts}Execute{/ts}" class="crm-form-submit" accesskey="S" title="{ts}Execute API call and display results{/ts}"/>
-        </span>
+        <button type="submit" class="crm-button crm-form-submit" accesskey="S" title="{ts}Execute API call and display results{/ts}">
+          <i class="crm-i fa-bolt" aria-hidden="true"></i> {ts}Execute{/ts}
+        </button>
       </div>
 
 <pre id="api-result" class="linenums">
diff --git a/civicrm/templates/CRM/Admin/Page/ConfigTaskList.tpl b/civicrm/templates/CRM/Admin/Page/ConfigTaskList.tpl
index 140e32415c0576c5d5f0220a118885476a072732..26f6ebf3dfe39f16dd73d4952da1f26084acc889 100644
--- a/civicrm/templates/CRM/Admin/Page/ConfigTaskList.tpl
+++ b/civicrm/templates/CRM/Admin/Page/ConfigTaskList.tpl
@@ -141,35 +141,35 @@
         <td colspan="2">{ts}Components{/ts}</td>
     </tr>
     <tr class="even">
-        <td class="tasklist nowrap" style="width: 10%;">{docURL page="user/contributions/what-is-civicontribute" text="CiviContribute"}</td>
+        <td class="tasklist nowrap" style="width: 10%;">{docURL page="user/contributions/what-is-civicontribute" text=$componentTitles.CiviContribute}</td>
         <td>{ts}Online fundraising and donor management, as well as offline contribution processing and tracking.{/ts}</td>
     </tr>
     <tr class="even">
-        <td class="tasklist nowrap" style="width: 10%;">{docURL page="user/pledges/what-is-civipledge" text="CiviPledge"}</td>
+        <td class="tasklist nowrap" style="width: 10%;">{docURL page="user/pledges/what-is-civipledge" text=$componentTitles.CiviPledge}</td>
         <td>{ts}Accept and track pledges (for recurring gifts).{/ts}</td>
     </tr>
     <tr class="even">
-        <td class="tasklist nowrap">{docURL page="user/events/what-is-civievent" text="CiviEvent"}</td>
+        <td class="tasklist nowrap">{docURL page="user/events/what-is-civievent" text=$componentTitles.CiviEvent}</td>
         <td>{ts}Online event registration and participant tracking.{/ts}</td>
     </tr>
     <tr class="even">
-        <td class="tasklist nowrap">{docURL page="user/membership/what-is-civimember" text="CiviMember"}</td>
+        <td class="tasklist nowrap">{docURL page="user/membership/what-is-civimember" text=$componentTitles.CiviMember}</td>
         <td>{ts}Online signup and membership management.{/ts}</td>
     </tr>
     <tr class="even">
-        <td class="tasklist nowrap">{docURL page="user/email/what-is-civimail" text="CiviMail"}</td>
+        <td class="tasklist nowrap">{docURL page="user/email/what-is-civimail" text=$componentTitles.CiviMail}</td>
         <td>{ts}Personalized email blasts and newsletters.{/ts}</td>
     </tr>
     <tr class="even">
-        <td class="tasklist nowrap">{docURL page="user/campaign/what-is-civicampaign" text="CiviCampaign"}</td>
+        <td class="tasklist nowrap">{docURL page="user/campaign/what-is-civicampaign" text=$componentTitles.CiviCampaign}</td>
         <td>{ts}Link together events, mailings, activities, and contributions. Create surveys and online petitions.{/ts}</td>
     </tr>
     <tr class="even">
-        <td class="tasklist nowrap">{docURL page="user/case-management/what-is-civicase" text="CiviCase"}</td>
+        <td class="tasklist nowrap">{docURL page="user/case-management/what-is-civicase" text=$componentTitles.CiviCase}</td>
         <td>{ts}Integrated case management for human service providers{/ts}</td>
     </tr>
     <tr class="even">
-        <td class="tasklist nowrap">{docURL page="user/grants/what-is-civigrant" text="CiviGrant"}</td>
+        <td class="tasklist nowrap">{docURL page="user/grants/what-is-civigrant" text=$componentTitles.CiviGrant}</td>
         <td>{ts}Distribute funds to others, for example foundations, grant givers, etc.{/ts}</td>
     </tr>
 </table>
diff --git a/civicrm/templates/CRM/Admin/Page/JobLog.tpl b/civicrm/templates/CRM/Admin/Page/JobLog.tpl
index 367b0f5b1b113bd9d63029dcd56bc8dcb12cd4da..ca3bac9e5566ed4cc7032440f1396009fb6004a8 100644
--- a/civicrm/templates/CRM/Admin/Page/JobLog.tpl
+++ b/civicrm/templates/CRM/Admin/Page/JobLog.tpl
@@ -19,6 +19,9 @@
 
   <div class="action-link">
     <a href="{crmURL p='civicrm/admin/job' q="reset=1"}" id="jobsList-top" class="button"><span><i class="crm-i fa-chevron-left" aria-hidden="true"></i> {ts}Back to Scheduled Jobs Listing{/ts}</span></a>
+    {if $jobRunUrl}
+      <a href="{$jobRunUrl}" id="jobsList-run-top" class="button"><span><i class="crm-i fa-play" aria-hidden="true"></i> {ts}Execute Now{/ts}</span></a>
+    {/if}
   </div>
 
 {if $rows}
@@ -60,5 +63,8 @@
 
   <div class="action-link">
     <a href="{crmURL p='civicrm/admin/job' q="reset=1"}" id="jobsList-bottom" class="button"><span><i class="crm-i fa-chevron-left" aria-hidden="true"></i> {ts}Back to Scheduled Jobs Listing{/ts}</span></a>
+    {if $jobRunUrl}
+      <a href="{$jobRunUrl}" id="jobsList-run-bottom" class="button"><span><i class="crm-i fa-play" aria-hidden="true"></i> {ts}Execute Now{/ts}</span></a>
+    {/if}
   </div>
 </div>
diff --git a/civicrm/templates/CRM/Admin/Page/MailSettings.hlp b/civicrm/templates/CRM/Admin/Page/MailSettings.hlp
new file mode 100644
index 0000000000000000000000000000000000000000..fac9cf4bc610f88b4c5db3e081d9164fc92ea245
--- /dev/null
+++ b/civicrm/templates/CRM/Admin/Page/MailSettings.hlp
@@ -0,0 +1,30 @@
+{*
+ +--------------------------------------------------------------------+
+ | Copyright CiviCRM LLC. All rights reserved.                        |
+ |                                                                    |
+ | This work is published under the GNU AGPLv3 license with some      |
+ | permitted exceptions and without any warranty. For full license    |
+ | and copyright information, see https://civicrm.org/licensing       |
+ +--------------------------------------------------------------------+
+*}
+
+{htxt id="is_non_case_email_skipped-title"}
+  {ts}Skip emails which do not have a Case ID or Case hash{/ts}
+{/htxt}
+
+{htxt id="is_non_case_email_skipped"}
+  <p>{ts}CiviCRM has functionality to file emails which contain the Case ID or Case Hash in the subject line in the format [case #1234] against a case record.{/ts}</p>
+  <p>{ts}Where the Case ID or Case Hash is not included CiviCRM will file the email against the contact record, by matching the email addresses on the email with any email addresses of Contact records in CiviCRM.{/ts}</p>
+  <p>{ts}Enabling this option will have CiviCRM skip any emails that do not have the Case ID or Case Hash so that the system will only process emails that can be placed on case records.{/ts}</p>
+  <p>{ts}Any emails that are not processed will be moved to the ignored folder.{/ts}</p>
+  <p>{ts}If email is skipped, no activities or contacts ("from"/"to"/"cc"/"bcc") will be created.{/ts}</p>
+{/htxt}
+
+{htxt id="is_contact_creation_disabled_if_no_match-title"}
+  {ts}Do not create new contacts when filing emails{/ts}
+{/htxt}
+
+{htxt id="is_contact_creation_disabled_if_no_match"}
+  <p>{ts}If this option is enabled, CiviCRM will not create new contacts ("from"/"to"/"cc"/"bcc") when filing emails.{/ts}</p>
+  <p>{ts}If the email subject contains a valid Case ID or Case hash, the email will be filed against the case.{/ts}</p>
+{/htxt}
diff --git a/civicrm/templates/CRM/Batch/Form/Entry.tpl b/civicrm/templates/CRM/Batch/Form/Entry.tpl
index 70c0a1c3506996113f34e5d7419882642921be83..14581e63435925bfbb9896d920435abb20720269 100644
--- a/civicrm/templates/CRM/Batch/Form/Entry.tpl
+++ b/civicrm/templates/CRM/Batch/Form/Entry.tpl
@@ -22,9 +22,7 @@
     <div class="status message status-warning">
       <i class="crm-i fa-exclamation-triangle" aria-hidden="true"></i> {ts}Total for amounts entered below does not match the expected batch total.{/ts}
     </div>
-    <span class="crm-button crm-button_qf_Entry_upload_force-save">
-      {$form._qf_Entry_upload_force.html}
-    </span>
+    {$form._qf_Entry_upload_force.html}
     <div class="clear"></div>
   {/if}
   <table class="form-layout-compressed batch-totals">
diff --git a/civicrm/templates/CRM/Block/Add.tpl b/civicrm/templates/CRM/Block/Add.tpl
index dd4f36735a8e47ad51ed7f554771fb8af5bb4c59..00bf545715ad9a8661b8d863a0d3612742197607 100644
--- a/civicrm/templates/CRM/Block/Add.tpl
+++ b/civicrm/templates/CRM/Block/Add.tpl
@@ -45,7 +45,7 @@
     <input type="hidden" name="qfKey" value="{crmKey name='CRM_Contact_Form_Contact' addSequence=1}" />
 </div>
 
-<div class="form-item"><input type="submit" name="_qf_Contact_next" value="{ts}Save{/ts}" class="crm-form-submit" /></div>
+<div class="form-item"><button type="submit" name="_qf_Contact_next" class="crm-button crm-form-submit">{ts}Save{/ts}</button></div>
 
 </form>
 </div>
diff --git a/civicrm/templates/CRM/Block/FullTextSearch.tpl b/civicrm/templates/CRM/Block/FullTextSearch.tpl
index 4f85ad1ba25851cd7e47f25331c056127eff04ae..9a7299a39b98a8735d06c18cb571bca178374470 100644
--- a/civicrm/templates/CRM/Block/FullTextSearch.tpl
+++ b/civicrm/templates/CRM/Block/FullTextSearch.tpl
@@ -24,7 +24,7 @@
 <div class="block-crm crm-container">
     <form method="post" id="id_fulltext_search">
     <div style="margin-bottom: 8px;">
-    <input type="text" name="text" id='text' value="" class="crm-form-text" style="width: 10em;" />&nbsp;<input type="submit" name="submit" id="fulltext_submit" value="{ts}Go{/ts}" class="crm-form-submit"/ onclick='submitForm();'>
+    <input type="text" name="text" id='text' value="" class="crm-form-text" />
     <input type="hidden" name="qfKey" value="{crmKey name='CRM_Contact_Controller_Search' addSequence=1}" />
   </div>
   <select class="form-select" id="fulltext_table" name="fulltext_table">
@@ -46,5 +46,6 @@
         <option value="Membership">{ts}Memberships{/ts}</option>
 {/if}
     </select> {help id="id-fullText" file="CRM/Contact/Form/Search/Custom/FullText.hlp"}
+    <div class="crm-submit-buttons"><button type="submit" name="submit" id="fulltext_submit" class="crm-button crm-form-submit" onclick='submitForm();'>{ts}Search{/ts}</button></div>
     </form>
 </div>
diff --git a/civicrm/templates/CRM/Case/Form/Task/SearchTaskHookSample.tpl b/civicrm/templates/CRM/Case/Form/Task/SearchTaskHookSample.tpl
deleted file mode 100644
index cff2cc5fb09855f0cf2ec5a7d47add753452e0df..0000000000000000000000000000000000000000
--- a/civicrm/templates/CRM/Case/Form/Task/SearchTaskHookSample.tpl
+++ /dev/null
@@ -1,36 +0,0 @@
-{if $rows}
-<div class="crm-submit-buttons">
-     <span class="element-right">{include file="CRM/common/formButtons.tpl" location="top"}</span>
-</div>
-
-<div class="spacer"></div>
-
-<div>
-<br />
-<table>
-  <tr class="columnheader">
-    <th>{ts}Display Name{/ts}</th>
-    <th>{ts}Start Date{/ts}</th>
-    <th>{ts}Status{/ts}</th>
-  </tr>
-
-  {foreach from=$rows item=row}
-    <tr class="{cycle values="odd-row,even-row"}">
-        <td class="crm-case-searchtaskhooksample-display_name">{$row.display_name}</td>
-        <td class="crm-case-searchtaskhooksample-start_date">{$row.start_date}</td>
-        <td class="crm-case-searchtaskhooksample-status">{$row.status}</td>
-    </tr>
-  {/foreach}
-</table>
-</div>
-
-<div class="crm-submit-buttons">
-     <span class="element-right">{include file="CRM/common/formButtons.tpl" location="bottom"}</span>
-</div>
-
-{else}
-   <div class="messages status no-popup">
-      {icon icon="fa-info-circle"}{/icon}
-          {ts}There are no records selected.{/ts}
-      </div>
-{/if}
diff --git a/civicrm/templates/CRM/Contact/Form/Contact.tpl b/civicrm/templates/CRM/Contact/Form/Contact.tpl
index 2acbff7dccbd4e024b3765ba06675a93dff54081..2844d09e35a4d6fff615ab8af8534c0dd86eb6d5 100644
--- a/civicrm/templates/CRM/Contact/Form/Contact.tpl
+++ b/civicrm/templates/CRM/Contact/Form/Contact.tpl
@@ -66,14 +66,10 @@
           </table>
 
           {*add dupe buttons *}
-          <span class="crm-button crm-button_qf_Contact_refresh_dedupe">
-            {$form._qf_Contact_refresh_dedupe.html}
-          </span>
+          {$form._qf_Contact_refresh_dedupe.html}
           {if $isDuplicate}
             &nbsp;&nbsp;
-              <span class="crm-button crm-button_qf_Contact_upload_duplicate">
-                {$form._qf_Contact_upload_duplicate.html}
-              </span>
+            {$form._qf_Contact_upload_duplicate.html}
           {/if}
           <div class="spacer"></div>
         </div>
@@ -212,7 +208,7 @@
     loadMultiRecordFields();
 
     {/literal}{if $oldSubtypes}{literal}
-    $('input[name=_qf_Contact_upload_view], input[name=_qf_Contact_upload_new]').click(function() {
+    $('button[name=_qf_Contact_upload_view], button[name=_qf_Contact_upload_new]').click(function() {
       var submittedSubtypes = $('#contact_sub_type').val();
       var oldSubtypes = {/literal}{$oldSubtypes}{literal};
 
diff --git a/civicrm/templates/CRM/Contact/Form/Search/Basic.hlp b/civicrm/templates/CRM/Contact/Form/Search/Basic.hlp
index 4fceec8fc9c933a229a7c49f123a5c89c1fd3c68..5d84d1f7f71721da5d1964c4c514cb622b94116d 100644
--- a/civicrm/templates/CRM/Contact/Form/Search/Basic.hlp
+++ b/civicrm/templates/CRM/Contact/Form/Search/Basic.hlp
@@ -26,19 +26,6 @@
         <li>{ts}Use the 'Group Status...' checkboxes to view contacts with 'Pending' status and/or contacts who have been 'Removed' from this group.{/ts}</li>
       </ul>
     </p>
-    {if $params.permissionedForGroup}
-        {capture assign=addMembersURL}{crmURL q="context=amtg&amtgID=`$params.group_id`&reset=1"}{/capture}
-        <p>{ts 1=$addMembersURL 2=$params.group_title}Click <a href='%1'>Add Contacts to %2</a> if you want to add contacts to this group.{/ts}
-        {if !empty($params.ssID)}
-            {if $params.ssMappingID}
-                {capture assign=editSmartGroupURL}{crmURL p="civicrm/contact/search/builder" q="reset=1&force=1&ssID=`$params.ssID`"}{/capture}
-            {else}
-                {capture assign=editSmartGroupURL}{crmURL p="civicrm/contact/search/advanced" q="reset=1&force=1&ssID=`$params.ssID`"}{/capture}
-            {/if} 
-            {ts 1=$editSmartGroupURL}Click <a href='%1'>Edit Smart Group Search Criteria...</a> to change the search query used for this 'smart' group.{/ts}
-        {/if}
-        </p>
-    {/if}
 {/htxt}
 
 {htxt id="id-amtg-criteria-title"}
diff --git a/civicrm/templates/CRM/Contact/Form/Search/Builder.js b/civicrm/templates/CRM/Contact/Form/Search/Builder.js
index fd6a984c13947535d125fd947feb8af9d727ed85..4dc3523571e949d94e59e099d407dcf72bb3e06f 100644
--- a/civicrm/templates/CRM/Contact/Form/Search/Builder.js
+++ b/civicrm/templates/CRM/Contact/Form/Search/Builder.js
@@ -293,7 +293,7 @@
       })
       // Add new field - if there's a hidden one, show it
       // Otherwise allow form to submit and fetch more from the server
-      .on('click', 'input[name^=addMore]', function() {
+      .on('click', 'button[name^=addMore]', function() {
         var table = $(this).closest('table');
         if ($('tr:hidden', table).length) {
           $('tr:hidden', table).first().show();
diff --git a/civicrm/templates/CRM/Contact/Form/Search/Custom/FullText.tpl b/civicrm/templates/CRM/Contact/Form/Search/Custom/FullText.tpl
index 6a7d8b516a80234db780089d3708ffa7d1fc7d83..f2bcfdebb169d2202bd1ae94ce1d3bd9b8d8e21a 100644
--- a/civicrm/templates/CRM/Contact/Form/Search/Custom/FullText.tpl
+++ b/civicrm/templates/CRM/Contact/Form/Search/Custom/FullText.tpl
@@ -13,10 +13,14 @@
     <div class="form-item">
       <table class="form-layout-compressed">
         <tr>
-          <td class="label">{$form.text.label}</td>
-          <td>{$form.text.html}</td>
-          <td class="label">{ts}in...{/ts}</td>
-          <td>{$form.table.html}</td>
+          <td>
+            <label>{$form.text.label}</label>
+            {$form.text.html}
+          </td>
+          <td>
+            <label>{ts}in...{/ts}</label>
+            {$form.table.html}
+          </td>
           <td>{$form.buttons.html} {help id="id-fullText"}</td>
         </tr>
       </table>
@@ -62,7 +66,7 @@
     {if !$table and $summary.addShowAllLink.Contact}
       <div class="crm-section full-text-view-all-section">
         <a href="{crmURL p='civicrm/contact/search/custom' q="csid=`$csID`&reset=1&force=1&table=Contact&text=$text"}"
-        title="{ts}View all results for contacts{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i>&nbsp;{ts}View all results for contacts{/ts}</a>
+        title="{ts}View all results for contacts{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View all results for contacts{/ts}</a>
       </div>{/if}
     {* note we using location="below" because we don't want to use rows per page for now. And therefore don't put location="bottom" for now. *}
     {if $table}{include file="CRM/common/pager.tpl" location="below"}{/if}
@@ -125,7 +129,7 @@
     {if !$table and $summary.addShowAllLink.Activity}
       <div class="crm-section full-text-view-all-section">
         <a href="{crmURL p='civicrm/contact/search/custom' q="csid=`$csID`&reset=1&force=1&table=Activity&text=$text"}"
-        title="{ts}View all results for activities{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i>&nbsp;{ts}View all results for activities{/ts}</a>
+        title="{ts}View all results for activities{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View all results for activities{/ts}</a>
       </div>
     {/if}
     {if $table}{include file="CRM/common/pager.tpl" location="below"}{/if}
@@ -182,7 +186,7 @@
     {if !$table and $summary.addShowAllLink.Case}
       <div class="crm-section full-text-view-all-section">
         <a href="{crmURL p='civicrm/contact/search/custom' q="csid=`$csID`&reset=1&force=1&table=Case&text=$text"}"
-        title="{ts}View all results for cases{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i>&nbsp;{ts}View all results for cases{/ts}</a>
+        title="{ts}View all results for cases{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View all results for cases{/ts}</a>
       </div>
     {/if}
     {if $table}{include file="CRM/common/pager.tpl" location="below"}{/if}
@@ -236,7 +240,7 @@
     {if !$table and $summary.addShowAllLink.Contribution}
       <div class="crm-section full-text-view-all-section">
         <a href="{crmURL p='civicrm/contact/search/custom' q="csid=`$csID`&reset=1&force=1&table=Contribution&text=$text"}"
-        title="{ts}View all results for contributions{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i>&nbsp;{ts}View all results for contributions{/ts}</a>
+        title="{ts}View all results for contributions{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View all results for contributions{/ts}</a>
       </div>
     {/if}
     {if $table}{include file="CRM/common/pager.tpl" location="below"}{/if}
@@ -293,7 +297,7 @@
     {if !$table and $summary.addShowAllLink.Participant}
       <div class="crm-section full-text-view-all-section"><a
         href="{crmURL p='civicrm/contact/search/custom' q="csid=`$csID`&reset=1&force=1&table=Participant&text=$text"}"
-        title="{ts}View all results for participants{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i>&nbsp;{ts}View all results for participants{/ts}</a>
+        title="{ts}View all results for participants{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View all results for participants{/ts}</a>
       </div>{/if}
     {if $table}{include file="CRM/common/pager.tpl" location="below"}{/if}
     {* END Actions/Results section *}
@@ -349,7 +353,7 @@
     {if !$table and $summary.addShowAllLink.Membership}
       <div class="crm-section full-text-view-all-section">
         <a href="{crmURL p='civicrm/contact/search/custom' q="csid=`$csID`&reset=1&force=1&table=Membership&text=$text"}"
-        title="{ts}View all results for memberships{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i>&nbsp;{ts}View all results for memberships{/ts}</a>
+        title="{ts}View all results for memberships{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View all results for memberships{/ts}</a>
       </div>
     {/if}
     {if $table}{include file="CRM/common/pager.tpl" location="below"}{/if}
@@ -395,7 +399,7 @@
   {if !$table and $summary.addShowAllLink.File}
   <div class="crm-section full-text-view-all-section">
     <a href="{crmURL p='civicrm/contact/search/custom' q="csid=`$csID`&reset=1&force=1&table=File&text=$text"}"
-          title="{ts}View all results for files{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i>&nbsp;{ts}View all results for files{/ts}</a>
+          title="{ts}View all results for files{/ts}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}View all results for files{/ts}</a>
   </div>{/if}
   {if $table}{include file="CRM/common/pager.tpl" location="below"}{/if}
 {* END Actions/Results section *}
diff --git a/civicrm/templates/CRM/Contact/Form/Search/Intro.tpl b/civicrm/templates/CRM/Contact/Form/Search/Intro.tpl
index adc70018d03a78153a74ec7d66eb4b4cc943de96..8cbfb012cf7bd1ea50faa94f766c3ab34a3467a2 100644
--- a/civicrm/templates/CRM/Contact/Form/Search/Intro.tpl
+++ b/civicrm/templates/CRM/Contact/Form/Search/Intro.tpl
@@ -11,20 +11,11 @@
 {* smog = 'show members of group'; amtg = 'add members to group' *}
 {if $context EQ 'smog'}
   {* Provide link to modify smart group search criteria if we are viewing a smart group (ssID = saved search ID) *}
-  {if $permissionEditSmartGroup}
-    {if !empty($ssID)}
-      {if $ssMappingID}
-        {capture assign=editSmartGroupURL}{crmURL p="civicrm/contact/search/builder" q="reset=1&ssID=`$ssID`"}{/capture}
-      {elseif $savedSearch.search_custom_id}
-        {capture assign=editSmartGroupURL}{crmURL p="civicrm/contact/search/custom" q="reset=1&ssID=`$ssID`"}{/capture}
-      {else}
-        {capture assign=editSmartGroupURL}{crmURL p="civicrm/contact/search/advanced" q="reset=1&ssID=`$ssID`"}{/capture}
-      {/if}
+  {if $permissionEditSmartGroup && !empty($editSmartGroupURL)}
       <div class="crm-submit-buttons">
         <a href="{$editSmartGroupURL}" class="button no-popup"><span><i class="crm-i fa-pencil" aria-hidden="true"></i> {ts 1=$group.title}Edit Smart Group Search Criteria for %1{/ts}</span></a>
         {help id="id-edit-smartGroup"}
       </div>
-    {/if}
   {/if}
 
   {if $permissionedForGroup}
diff --git a/civicrm/templates/CRM/Contact/Form/Search/ResultTasks.tpl b/civicrm/templates/CRM/Contact/Form/Search/ResultTasks.tpl
index 1e3e0df3cca72525ceb79e5b5cadf04d1fe95c93..28ca892fa15ef6e9a53ce428d62e008b9e6e2e14 100644
--- a/civicrm/templates/CRM/Contact/Form/Search/ResultTasks.tpl
+++ b/civicrm/templates/CRM/Contact/Form/Search/ResultTasks.tpl
@@ -23,7 +23,7 @@
             <a href="{$searchBuilderURL}"><i class="crm-i fa-chevron-right" aria-hidden="true"></i> {ts}Search Builder{/ts}</a><br />
         {/if}
         {if $context eq 'smog'}
-            {help id="id-smog-criteria" group_id=$group.id group_title=$group.title ssID=$ssID ssMappingID=$ssMappingID permissionedForGroup=$permissionedForGroup}
+            {help id="id-smog-criteria" group_title=$group.title}
         {elseif $context eq 'amtg'}
             {help id="id-amtg-criteria" group_title=$group.title}
         {else}
diff --git a/civicrm/templates/CRM/Contact/Form/Task/PDFLetterCommon.tpl b/civicrm/templates/CRM/Contact/Form/Task/PDFLetterCommon.tpl
index ec9c043705db312c460c11821816e61e27dca81c..864fedeb6daad783007fb2c6e149571acd48ca77 100644
--- a/civicrm/templates/CRM/Contact/Form/Task/PDFLetterCommon.tpl
+++ b/civicrm/templates/CRM/Contact/Form/Task/PDFLetterCommon.tpl
@@ -34,7 +34,7 @@
 
 <div class="crm-accordion-wrapper collapsed crm-pdf-format-accordion">
     <div class="crm-accordion-header">
-        {$form.pdf_format_header.html}
+      {ts}Page Format:{/ts} <span class="pdf-format-header-label"></span>
     </div>
     <div class="crm-accordion-body">
       <div class="crm-block crm-form-block">
@@ -52,7 +52,7 @@
         <td colspan="2">&nbsp;</td>
       </tr>
       <tr>
-        <td>{$form.paper_dimensions.html}</td><td id="paper_dimensions">&nbsp;</td>
+        <td>{ts}Width x Height{/ts}</td><td id="paper_dimensions">&nbsp;</td>
         <td colspan="2">&nbsp;</td>
       </tr>
       <tr>
diff --git a/civicrm/templates/CRM/Contact/Page/View/Print.tpl b/civicrm/templates/CRM/Contact/Page/View/Print.tpl
index 1fb9798cc53f151a7e20d59f9a8f33be5df50c36..6031bf210b8f9c33b14aba9a91915cd312768b5c 100644
--- a/civicrm/templates/CRM/Contact/Page/View/Print.tpl
+++ b/civicrm/templates/CRM/Contact/Page/View/Print.tpl
@@ -19,7 +19,7 @@
 {/literal}
 <form action="{crmURL p='civicrm/contact/view' q="cid=`$contactId`&reset=1"}" method="post" id="Print1" >
   <div class="form-item">
-       <span class="element-right"><input onclick="window.print(); return false" class="crm-form-submit default" name="_qf_Print_next" value="{ts}Print{/ts}" type="submit" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input class="crm-form-submit" name="_qf_Print_back" value="{ts}Done{/ts}" type="submit" /></span>
+       <span class="element-right"><button onclick="window.print(); return false" class="crm-button crm-form-submit default" name="_qf_Print_next" type="submit">{ts}Print{/ts}</button>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<button class="crm-button crm-form-submit" name="_qf_Print_back" type="submit">{ts}Done{/ts}</button></span>
   </div>
 </form>
 <br />
diff --git a/civicrm/templates/CRM/Contribute/Form/Contribution/OnBehalfOf.tpl b/civicrm/templates/CRM/Contribute/Form/Contribution/OnBehalfOf.tpl
index 26b67db9573ea4b5cf9bbf9f8b08b701bd707aa7..7731d4d3a208b7818ee7391efd2f9b1f5b28fd81 100644
--- a/civicrm/templates/CRM/Contribute/Form/Contribution/OnBehalfOf.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/Contribution/OnBehalfOf.tpl
@@ -147,7 +147,6 @@
       $.ajax({
         url         : locationUrl,
         dataType    : "json",
-        timeout     : 5000, //Time in milliseconds
         success     : function(data, status) {
           for (var ele in data) {
             if ($("#"+ ele).hasClass('crm-chain-select-target')) {
diff --git a/civicrm/templates/CRM/Contribute/Form/Contribution/PremiumBlock.tpl b/civicrm/templates/CRM/Contribute/Form/Contribution/PremiumBlock.tpl
index 6ca766cc26b31a2dbd8d4009d9d201ecc68647fd..286cee5a6763848495a810a32ea35fbe9daf4cf4 100644
--- a/civicrm/templates/CRM/Contribute/Form/Contribution/PremiumBlock.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/Contribution/PremiumBlock.tpl
@@ -62,7 +62,9 @@
               <div class="premium-full-title">{$row.name}</div>
               <div class="premium-full-disabled">
                 {ts 1=$row.min_contribution|crmMoney}You must contribute at least %1 to get this item{/ts}<br/>
-                <input type="button" value="{ts 1=$row.min_contribution|crmMoney}Contribute %1 Instead{/ts}" amount="{$row.min_contribution}" />
+                <button type="button" amount="{$row.min_contribution}">
+                  {ts 1=$row.min_contribution|crmMoney}Contribute %1 Instead{/ts}
+                </button>
               </div>
               <div class="premium-full-description">
                 {$row.description}
@@ -235,7 +237,7 @@
         amounts.sort(function(a,b){return a - b});
 
         // make contribution instead buttons work
-        $('.premium-full-disabled input').click(function(){
+        $('.premium-full-disabled button').click(function(){
           var amount = Number($(this).attr('amount'));
           if (price_sets[amount]) {
             if (!$(price_sets[amount]).length) {
@@ -347,4 +349,3 @@
     {/literal}
   {/if}
 {/if}
-
diff --git a/civicrm/templates/CRM/Contribute/Form/Task/Invoice.tpl b/civicrm/templates/CRM/Contribute/Form/Task/Invoice.tpl
index 9f3dde88890e677c073220468e56780eb4634a16..777354f29f069c1dbddf8f99d6e8816df52eb5d9 100644
--- a/civicrm/templates/CRM/Contribute/Form/Task/Invoice.tpl
+++ b/civicrm/templates/CRM/Contribute/Form/Task/Invoice.tpl
@@ -28,6 +28,18 @@
     <td class="label">{$form.from_email_address.label}</td>
     <td>{$form.from_email_address.html} {help id="id-from_email" file="CRM/Contact/Form/Task/Email.hlp" isAdmin=$isAdmin}</td>
   </tr>
+  <tr class="crm-email-element crm-contactEmail-form-block-cc_id">
+    <td class="label">{$form.cc_id.label}</td>
+    <td>
+        {$form.cc_id.html}
+    </td>
+  </tr>
+  <tr class="crm-email-element crm-contactEmail-form-block-subject">
+    <td class="label">{$form.subject.label}</td>
+    <td>
+        {$form.subject.html}
+    </td>
+  </tr>
   <tr class="crm-email-element">
     <td class="label">{$form.email_comment.label}</td>
     <td>{$form.email_comment.html}</td>
diff --git a/civicrm/templates/CRM/Contribute/Form/Task/SearchTaskHookSample.tpl b/civicrm/templates/CRM/Contribute/Form/Task/SearchTaskHookSample.tpl
deleted file mode 100644
index a14a183b17747d6640f09e8ac445f48a06a5c7ee..0000000000000000000000000000000000000000
--- a/civicrm/templates/CRM/Contribute/Form/Task/SearchTaskHookSample.tpl
+++ /dev/null
@@ -1,38 +0,0 @@
-{if $rows}
-<div class="form-item crm-block crm-form-block crm-contribution-form-block">
-     <span class="element-right">{$form.buttons.html}</span>
-</div>
-
-<div class="spacer"></div>
-
-<div>
-<br />
-<table>
-  <tr class="columnheader">
-    <th>{ts}Display Name{/ts}</th>
-    <th>{ts}Amount{/ts}</th>
-    <th>{ts}Source{/ts}</th>
-    <th>{ts}Receive Date{/ts}</th>
-  </tr>
-
-  {foreach from=$rows item=row}
-    <tr class="{cycle values="odd-row,even-row"}">
-        <td>{$row.display_name}</td>
-        <td>{$row.amount}</td>
-        <td>{$row.source}</td>
-        <td>{$row.receive_date}</td>
-    </tr>
-  {/foreach}
-</table>
-</div>
-
-<div class="form-item">
-     <span class="element-right">{$form.buttons.html}</span>
-</div>
-
-{else}
-   <div class="messages status no-popup">
-    {icon icon="fa-info-circle"}{/icon}
-    {ts}There are no records selected.{/ts}
-   </div>
-{/if}
diff --git a/civicrm/templates/CRM/Custom/Form/ChangeFieldType.tpl b/civicrm/templates/CRM/Custom/Form/ChangeFieldType.tpl
deleted file mode 100644
index e87067ea84472e86d4ecdc61b52161eab91c1548..0000000000000000000000000000000000000000
--- a/civicrm/templates/CRM/Custom/Form/ChangeFieldType.tpl
+++ /dev/null
@@ -1,46 +0,0 @@
-{*
- +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC. All rights reserved.                        |
- |                                                                    |
- | This work is published under the GNU AGPLv3 license with some      |
- | permitted exceptions and without any warranty. For full license    |
- | and copyright information, see https://civicrm.org/licensing       |
- +--------------------------------------------------------------------+
-*}
-<div class="crm-block crm-form-block crm-custom-field-form-block">
-<div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="top"}</div>
-    <div class='status'>{icon icon="fa-info-circle"}{/icon}
-        &nbsp;{ts}Warning: This functionality is currently in beta stage. Consider backing up your database before using it. Click "Cancel" to return to the "edit custom field" form without making changes.{/ts}
-    </div>
-    <table class="form-layout">
-        <tr class="crm-custom-src-field-form-block-label">
-            <td class="label">{$form.src_html_type.label}</td>
-            <td class="html-adjust">{$form.src_html_type.html}</td>
-        </tr>
-        <tr class="crm-custom-dst-field-form-block-label">
-            <td class="label">{$form.dst_html_type.label}</td>
-            <td class="html-adjust">{$form.dst_html_type.html}</td>
-        </tr>
-    </table>
-<div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
-</div>
-{literal}
-<script type="text/Javascript">
-  function checkCustomDataField( ) {
-    var srcHtmlType = {/literal}{$srcHtmlType|@json_encode}{literal};
-    var singleValOps = ['Text', 'Select', 'Radio', 'Autocomplete-Select'];
-    var multiValOps  = ['CheckBox', 'Multi-Select'];
-    var dstHtmlType = cj('#dst_html_type').val( );
-    if ( !dstHtmlType ) {
-      return true;
-    }
-
-    if ( ( cj.inArray(srcHtmlType, multiValOps) > -1 ) &&
-         ( cj.inArray(dstHtmlType, singleValOps) > -1 ) ) {
-    return confirm( "{/literal}{ts escape='js'}Changing a 'multi option' html type to a 'single option' html type, might results in a data loss. Please consider to take db backup before change the html type. Click 'Ok' to continue.{/ts}{literal}" );
-    }
-    return true;
-  }
-</script>
-{/literal}
-
diff --git a/civicrm/templates/CRM/Custom/Form/Field.tpl b/civicrm/templates/CRM/Custom/Form/Field.tpl
index fe0d6914825e81fb2c0f43c2b6d0fee0bebc26c5..aeb56d695bc6e5c3844c278eb5e69842a258806d 100644
--- a/civicrm/templates/CRM/Custom/Form/Field.tpl
+++ b/civicrm/templates/CRM/Custom/Form/Field.tpl
@@ -20,29 +20,16 @@
     </tr>
     <tr class="crm-custom-field-form-block-data_type">
       <td class="label">{$form.data_type.label}</td>
-      <td class="html-adjust">{$form.data_type.html}
-        {if $action neq 1 && $form.data_type.value[1][0] eq "Select" && $form.serialize.value}
-          <span>({ts}Multi-Select{/ts})</span>
-        {/if}
-        {if $action neq 4 and $action neq 2}
-          <br /><span class="description">{ts}Select the type of data you want to collect and store for this contact. Then select from the available HTML input field types (choices are based on the type of data being collected).{/ts}</span>
-        {/if}
-        {if $action eq 2 and $changeFieldType}
-          <br />
-          <a class="action-item crm-hover-button" href='{crmURL p="civicrm/admin/custom/group/field/changetype" q="reset=1&id=`$id`"}'>
-            <i class="crm-i fa-wrench" aria-hidden="true"></i>
-            {ts}Change Input Field Type{/ts}
-          </a>
-          <div class='clear'></div>
-        {/if}
-      </td>
+      <td class="html-adjust">{$form.data_type.html}</td>
+    </tr>
+    <tr class="crm-custom-field-form-block-html_type">
+      <td class="label">{$form.html_type.label}</td>
+      <td class="html-adjust">{$form.html_type.html}</td>
+    </tr>
+    <tr class="crm-custom-field-form-block-serialize">
+      <td class="label">{$form.serialize.label}</td>
+      <td class="html-adjust">{$form.serialize.html}</td>
     </tr>
-    {if $action eq 1}
-      <tr class="crm-custom-field-form-block-serialize">
-        <td class="label">{$form.serialize.label}</td>
-        <td class="html-adjust">{$form.serialize.html}</td>
-      </tr>
-    {/if}
     {if $form.in_selector}
       <tr class='crm-custom-field-form-block-in_selector'>
         <td class='label'>{$form.in_selector.label}</td>
@@ -176,19 +163,45 @@
 {literal}
 <script type="text/javascript">
   CRM.$(function($) {
-    var $form = $('form.{/literal}{$form.formClass}{literal}'),
-      dataTypes = {/literal}{$dataTypeKeys|@json_encode}{literal};
+    var _ = CRM._,
+      $form = $('form.{/literal}{$form.formClass}{literal}'),
+      dataToHTML = {/literal}{$dataToHTML|@json_encode}{literal},
+      originalHtmlType = '{/literal}{$originalHtmlType}{literal}',
+      existingMultiValueCount = {/literal}{if empty($existingMultiValueCount)}null{else}{$existingMultiValueCount}{/if}{literal},
+      originalSerialize = {/literal}{if empty($originalSerialize)}false{else}true{/if}{literal},
+      htmlTypes = CRM.utils.getOptions($('#html_type', $form));
 
-    function showSearchRange() {
-      var htmlType = $("[name='data_type[1]']", $form).val(),
-       dataType = dataTypes[$("[name='data_type[0]']", $form).val()];
+    function onChangeDataType() {
+      var dataType = $(this).val(),
+        allowedHtmlTypes = _.filter(htmlTypes, function(type) {
+          return _.includes(dataToHTML[dataType], type.key);
+        });
+      CRM.utils.setOptions($('#html_type', $form), allowedHtmlTypes);
+      if (!$('#html_type', $form).val()) {
+        $('#html_type', $form).val(dataToHTML[dataType][0]).change();
+      }
+      customOptionHtmlType(dataType);
+      makeDefaultValueField(dataType);
+    }
 
-      if (dataType === 'Int' || dataType === 'Float' || dataType === 'Money' || dataType === 'Date') {
-        if ($('#is_searchable', $form).is(':checked')) {
-          $("#searchByRange", $form).show();
-        } else {
-          $("#searchByRange", $form).hide();
-        }
+    function onChangeHtmlType() {
+      var htmlType = $(this).val(),
+        dataType = $('#data_type', $form).val();
+
+      if (htmlType === 'CheckBox' || htmlType === 'Radio') {
+        $('#serialize', $form).prop('checked', htmlType === 'CheckBox');
+      }
+
+      showSearchRange(dataType);
+      customOptionHtmlType(dataType);
+    }
+
+    $('#data_type', $form).each(onChangeDataType).change(onChangeDataType);
+    $('#html_type', $form).each(onChangeHtmlType).change(onChangeHtmlType);
+
+    function showSearchRange(dataType) {
+      if (_.includes(['Date', 'Int', 'Float', 'Money'], dataType)) {
+        $("#searchByRange", $form).toggle($('#is_searchable', $form).is(':checked'));
       } else {
         $("#searchByRange", $form).hide();
       }
@@ -212,13 +225,11 @@
     }
     $('.toggle-contact-ref-mode', $form).click(toggleContactRefFilter);
 
-    function customOptionHtmlType() {
-      var htmlType = $("[name='data_type[1]']", $form).val(),
-        dataTypeId = $("[name='data_type[0]']", $form).val(),
-        dataType = dataTypes[dataTypeId],
-        radioOption, checkBoxOption;
+    function customOptionHtmlType(dataType) {
+      var htmlType = $("#html_type", $form).val(),
+        serialize = $("#serialize", $form).is(':checked');
 
-      if (!htmlType && !dataTypeId) {
+      if (!htmlType) {
         return;
       }
 
@@ -228,7 +239,7 @@
         $('#field_advance_filter, #contact_reference_group', $form).hide();
       }
 
-      if (dataTypeId < 4) {
+      if (_.includes(['String', 'Int', 'Float', 'Money'], dataType)) {
         if (htmlType !== "Text") {
           $("#showoption, #searchable", $form).show();
           $("#hideDefault, #hideDesc, #searchByRange", $form).hide();
@@ -248,23 +259,17 @@
         $("#showoption").hide();
       }
 
-      for (var i=1; i<=11; i++) {
-        radioOption = 'radio'+i;
-        checkBoxOption = 'checkbox'+i;
-        if (dataTypeId < 4) {
-          if (htmlType != "Text") {
-            if (htmlType == "CheckBox" || htmlType == "Multi-Select") {
-              $("#"+checkBoxOption, $form).show();
-              $("#"+radioOption, $form).hide();
-            } else {
-              $("#"+radioOption, $form).show();
-              $("#"+checkBoxOption, $form).hide();
-            }
-          }
+      if (_.includes(['String', 'Int', 'Float', 'Money'], dataType) && htmlType !== 'Text') {
+        if (serialize) {
+          $('div[id^=checkbox]', '#optionField').show();
+          $('div[id^=radio]', '#optionField').hide();
+        } else {
+          $('div[id^=radio]', '#optionField').show();
+          $('div[id^=checkbox]', '#optionField').hide();
         }
       }
 
-      $("#optionsPerLine", $form).toggle((htmlType == "CheckBox" || htmlType == "Radio") && dataType !== 'Boolean');
+      $("#optionsPerLine", $form).toggle((htmlType === "CheckBox" || htmlType === "Radio") && dataType !== 'Boolean');
 
       $("#startDateRange, #endDateRange, #includedDatePart", $form).toggle(dataType === 'Date');
 
@@ -272,18 +277,54 @@
 
       $("#noteColumns, #noteRows, #noteLength", $form).toggle(dataType === 'Memo');
 
-      $(".crm-custom-field-form-block-serialize", $form).toggle(htmlType === 'Select' || htmlType === 'Country' || htmlType === 'StateProvince');
+      $(".crm-custom-field-form-block-serialize", $form).toggle(htmlType === 'Select');
+    }
+
+    function makeDefaultValueField(dataType) {
+      var field = $('#default_value', $form);
+      field.crmDatepicker('destroy');
+      field.crmSelect2('destroy');
+      switch (dataType) {
+        case 'Date':
+          field.crmDatepicker({date: 'yy-mm-dd', time: false});
+          break;
+
+        case 'Boolean':
+          field.crmSelect2({data: [{id: '1', text: ts('Yes')}, {id: '0', text: ts('No')}], placeholder: ' '});
+          break;
+
+        case 'Country':
+          field.crmEntityRef({entity: 'Country'});
+          break;
+
+        case 'StateProvince':
+          field.crmEntityRef({entity: 'StateProvince', api: {description_field: ['country_id.name']}});
+          break;
+      }
     }
 
-    $('[name^="data_type"]', $form).change(customOptionHtmlType);
-    customOptionHtmlType();
-    $('#is_searchable, [name^="data_type"]', $form).change(showSearchRange);
-    showSearchRange();
+    $('#is_searchable, #serialize', $form).change(onChangeHtmlType);
+
+    $form.submit(function() {
+      var htmlType = $('#html_type', $form).val(),
+        serialize = $("#serialize", $form).is(':checked'),
+        htmlTypeLabel = (serialize && htmlType === 'Select') ? ts('Multi-Select') : _.find(htmlTypes, {key: htmlType}).value;
+      if (originalHtmlType && (originalHtmlType !== htmlType || originalSerialize !== serialize)) {
+        var origHtmlTypeLabel = (originalSerialize && originalHtmlType === 'Select') ? ts('Multi-Select') : _.find(htmlTypes, {key: originalHtmlType}).value;
+        if (originalSerialize && !serialize && existingMultiValueCount) {
+          return confirm(ts('WARNING: Changing this multivalued field to singular will result in the loss of data!')
+            + "\n" + ts('%1 existing records contain multiple values - the data in each of these fields will be truncated to a single value.', {1: existingMultiValueCount})
+          )
+        } else {
+          return confirm(ts('Change this field from %1 to %2? Existing data will be preserved.', {1: origHtmlTypeLabel, 2: htmlTypeLabel}));
+        }
+      }
+    });
   });
 </script>
 {/literal}
-{* Give link to view/edit choice options if in edit mode and html_type is one of the multiple choice types *}
-{if $action eq 2 AND ($form.data_type.value.1.0 eq 'CheckBox' OR ($form.data_type.value.1.0 eq 'Radio' AND $form.data_type.value.0.0 neq 6) OR $form.data_type.value.1.0 eq 'Select' OR ($form.data_type.value.1.0 eq 'Multi-Select' AND $dontShowLink neq 1 ) ) }
+{* Give link to view/edit option group *}
+{if $action eq 2 && !empty($hasOptionGroup) }
   <div class="action-link">
     {crmButton p="civicrm/admin/custom/group/field/option" q="reset=1&action=browse&fid=`$id`&gid=`$gid`" icon="pencil"}{ts}View / Edit Multiple Choice Options{/ts}{/crmButton}
   </div>
diff --git a/civicrm/templates/CRM/Event/Form/ManageEvent/Registration.tpl b/civicrm/templates/CRM/Event/Form/ManageEvent/Registration.tpl
index 4858e9803259849346fd504d596704290e30d18a..27c4cdb59b21a20a2da34f076a9fc478639a1a34 100644
--- a/civicrm/templates/CRM/Event/Form/ManageEvent/Registration.tpl
+++ b/civicrm/templates/CRM/Event/Form/ManageEvent/Registration.tpl
@@ -396,7 +396,7 @@ invert              = 0
 <script type="text/javascript">
 {literal}    (function($, _) { // Generic Closure
 
-    $(".crm-submit-buttons input").click( function() {
+    $(".crm-submit-buttons button").click( function() {
       $(".dedupenotify .ui-notify-close").click();
     });
 
diff --git a/civicrm/templates/CRM/Event/Form/Participant.tpl b/civicrm/templates/CRM/Event/Form/Participant.tpl
index bf8a4c4fdfd6104daf6ae7b8444ac378a923371e..498eb2697fce29ce568ab5cfc674630900a94303 100644
--- a/civicrm/templates/CRM/Event/Form/Participant.tpl
+++ b/civicrm/templates/CRM/Event/Form/Participant.tpl
@@ -437,7 +437,7 @@
     notificationStatusIds = notificationStatusIds.split(',');
     if (cj.inArray(cj('select#status_id option:selected').val(), notificationStatusIds) > -1) {
       cj("#notify").show();
-      cj("#is_notify").prop('checked', true);
+      cj("#is_notify").prop('checked', false);
     }
     else {
       cj("#notify").hide();
diff --git a/civicrm/templates/CRM/Event/Form/ParticipantFeeSelection.tpl b/civicrm/templates/CRM/Event/Form/ParticipantFeeSelection.tpl
index 16bb9a1938acff8dde23299d7b0ba41c1cb0a989..f91c883be3b426a274885a2a8937905c2c70b88d 100644
--- a/civicrm/templates/CRM/Event/Form/ParticipantFeeSelection.tpl
+++ b/civicrm/templates/CRM/Event/Form/ParticipantFeeSelection.tpl
@@ -87,7 +87,7 @@ CRM.$(function($) {
   <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
   {if !$email}
   <div class="messages status no-popup">
-    <i class="crm-i fa-info-circle" aria-hidden="true"></i>&nbsp;{ts}You will not be able to send an automatic email receipt for this payment because there is no email address recorded for this contact. If you want a receipt to be sent when this payment is recorded, click Cancel and then click Edit from the Summary tab to add an email address before recording the payment.{/ts}
+    <i class="crm-i fa-info-circle" aria-hidden="true"></i> {ts}You will not be able to send an automatic email receipt for this payment because there is no email address recorded for this contact. If you want a receipt to be sent when this payment is recorded, click Cancel and then click Edit from the Summary tab to add an email address before recording the payment.{/ts}
   </div>
   {/if}
   <table class="form-layout">
diff --git a/civicrm/templates/CRM/Event/Form/Task/SearchTaskHookSample.tpl b/civicrm/templates/CRM/Event/Form/Task/SearchTaskHookSample.tpl
deleted file mode 100644
index 9cfdab00089337a72adc283cbecf25afade2b3fc..0000000000000000000000000000000000000000
--- a/civicrm/templates/CRM/Event/Form/Task/SearchTaskHookSample.tpl
+++ /dev/null
@@ -1,36 +0,0 @@
-{if $rows}
-<div class="crm-submit-buttons">
-     <span class="element-right">{include file="CRM/common/formButtons.tpl" location="top"}</span>
-</div>
-
-<div class="spacer"></div>
-<div>
-<br />
-<table>
-  <tr class="columnheader">
-    <th>{ts}Display Name{/ts}</th>
-    <th>{ts}Amount{/ts}</th>
-    <th>{ts}Register Date{/ts}</th>
-    <th>{ts}Source{/ts}</th>
-  </tr>
-
-  {foreach from=$rows item=row}
-    <tr class="{cycle values="odd-row,even-row"}">
-        <td class="crm-event-searchtaskhooksample-display_name">{$row.display_name}</td>
-        <td class="crm-event-searchtaskhooksample-amount">{$row.amount}</td>
-        <td class="crm-event-searchtaskhooksample-register_date">{$row.register_date}</td>
-        <td class="crm-event-searchtaskhooksample-source">{$row.source}</td>
-    </tr>
-  {/foreach}
-</table>
-</div>
-
-<div class="crm-submit-buttons">
-     <span class="element-right">{include file="CRM/common/formButtons.tpl" location="bottom"}</span>
-</div>
-
-{else}
-   <div class="messages status no-popup">
-      {icon icon="fa-info-circle"}{/icon}{ts}There are no records selected.{/ts}
-   </div>
-{/if}
diff --git a/civicrm/templates/CRM/Event/Page/DashBoard.tpl b/civicrm/templates/CRM/Event/Page/DashBoard.tpl
index 3ca364f0932997f9ecea62b8a6ca470eb91f2a6c..d01250ee681b22c8fcb00e666ae0ec3a4e18b2d9 100644
--- a/civicrm/templates/CRM/Event/Page/DashBoard.tpl
+++ b/civicrm/templates/CRM/Event/Page/DashBoard.tpl
@@ -87,7 +87,7 @@
       {if $actionColumn}
         <td class="crm-event-isMap">
           {if $values.isMap}
-            <a href="{$values.isMap}" title="{ts}Map event location{/ts}"><i class="crm-i fa-map-marker" aria-hidden="true"></i>&nbsp;{ts}Map{/ts}</a>
+            <a href="{$values.isMap}" title="{ts}Map event location{/ts}"><i class="crm-i fa-map-marker" aria-hidden="true"></i> {ts}Map{/ts}</a>
             &nbsp;|&nbsp;
           {/if}
           {if $values.configure}
diff --git a/civicrm/templates/CRM/Grant/Form/Task/SearchTaskHookSample.tpl b/civicrm/templates/CRM/Grant/Form/Task/SearchTaskHookSample.tpl
deleted file mode 100644
index 144ad174ca59449da14e34b38f9cc0b319058bc2..0000000000000000000000000000000000000000
--- a/civicrm/templates/CRM/Grant/Form/Task/SearchTaskHookSample.tpl
+++ /dev/null
@@ -1,34 +0,0 @@
-{if $rows}
-<div class="crm-submit-buttons element-right">{include file="CRM/common/formButtons.tpl" location="top"}</div>
-
-<div class="spacer"></div>
-
-<div>
-<br />
-<table>
-  <tr class="columnheader">
-    <td>{ts}Display Name{/ts}</td>
-    <td>{ts}Decision Date{/ts}</td>
-    <td>{ts}Amount Requested{/ts}</td>
-    <td>{ts}Amount Granted{/ts}</td>
-  </tr>
-
-  {foreach from=$rows item=row}
-    <tr class="{cycle values="odd-row,even-row"} crm-grant">
-        <td class="crm-grant-task-SearchTaskHookSample-form-block-display_name">{$row.display_name}</td>
-        <td class="crm-grant-task-SearchTaskHookSample-form-block-decision_date">{$row.decision_date}</td>
-        <td class="crm-grant-task-SearchTaskHookSample-form-block-amount_requested">{$row.amount_requested}</td>
-        <td class="crm-grant-task-SearchTaskHookSample-form-block-amount_granted">{$row.amount_granted}</td>
-    </tr>
-  {/foreach}
-</table>
-</div>
-
-<div class="crm-submit-buttons element-right">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
-
-{else}
-   <div class="messages status no-popup">
-          {icon icon="fa-info-circle"}{/icon}
-            {ts}There are no records selected.{/ts}
-   </div>
-{/if}
diff --git a/civicrm/templates/CRM/Group/Form/Edit.tpl b/civicrm/templates/CRM/Group/Form/Edit.tpl
index 42b82ac93e797d17e181af92cd5b82aee271d61f..fb46c69e9bc98c08822158b71047fae71d1a86e8 100644
--- a/civicrm/templates/CRM/Group/Form/Edit.tpl
+++ b/civicrm/templates/CRM/Group/Form/Edit.tpl
@@ -83,16 +83,9 @@
   {if $action neq 1}
     <div class="action-link">
       <a {$crmURL}><i class="crm-i fa-users" aria-hidden="true"></i> {ts}Contacts in this Group{/ts}</a>
-      {if $group.saved_search_id}
+      {if $editSmartGroupURL}
         <br />
-        {if $group.mapping_id}
-          <a class="no-popup" href="{crmURL p="civicrm/contact/search/builder" q="reset=1&ssID=`$group.saved_search_id`"}"><i class="crm-i fa-pencil" aria-hidden="true"></i> {ts}Edit Smart Group Criteria{/ts}</a>
-        {elseif $group.search_custom_id}
-          <a class="no-popup" href="{crmURL p="civicrm/contact/search/custom" q="reset=1&ssID=`$group.saved_search_id`"}"><i class="crm-i fa-pencil" aria-hidden="true"></i> {ts}Edit Smart Group Criteria{/ts}</a>
-        {else}
-          <a class="no-popup" href="{crmURL p="civicrm/contact/search/advanced" q="reset=1&ssID=`$group.saved_search_id`"}"><i class="crm-i fa-pencil" aria-hidden="true"></i> {ts}Edit Smart Group Criteria{/ts}</a>
-        {/if}
-
+        <a class="no-popup" href="{$editSmartGroupURL}"><i class="crm-i fa-pencil" aria-hidden="true"></i> {ts}Edit Smart Group Criteria{/ts}</a>
       {/if}
     </div>
   {/if}
diff --git a/civicrm/templates/CRM/Group/Form/Search.tpl b/civicrm/templates/CRM/Group/Form/Search.tpl
index a2019f4d1c2c09efcb75e1148237e49d5abe7ea7..e01ece5d192bc00b9c6940a3c5b49022824856bb 100644
--- a/civicrm/templates/CRM/Group/Form/Search.tpl
+++ b/civicrm/templates/CRM/Group/Form/Search.tpl
@@ -55,6 +55,13 @@
               {$form.component_mode.html}
             </td>
           </tr>
+          <tr>
+            <td>
+              {$form.saved_search.label} <br/>{$form.saved_search.html}
+            </td>
+            <td colspan="2">
+            </td>
+          </tr>
         </table>
       </div>
     </div>
@@ -116,6 +123,7 @@
           d.group_type = groupTypes,
           d.visibility = $(".crm-group-search-form-block select#visibility").val(),
           d.status = groupStatus,
+          d.savedSearch = $('.crm-group-search-form-block select#saved_search').val(),
           d.component_mode = $(".crm-group-search-form-block select#component_mode").val(),
           d.showOrgInfo = {/literal}"{$showOrgInfo}"{literal},
           d.parentsOnly = parentsOnly
diff --git a/civicrm/templates/CRM/Mailing/Page/Event.tpl b/civicrm/templates/CRM/Mailing/Page/Event.tpl
index 4636f96d5e1217fa3cbdff9fec5afa6e359c11ea..e54646eaf4cffdb47e7d1c2a344ecdf47202ea78 100644
--- a/civicrm/templates/CRM/Mailing/Page/Event.tpl
+++ b/civicrm/templates/CRM/Mailing/Page/Event.tpl
@@ -56,7 +56,7 @@
   <script type="text/javascript">
     var totalPages = {/literal}{$pager->_totalPages}{literal};
     CRM.$(function($) {
-      $("#crm-container .crm-pager input.crm-form-submit").click(function () {
+      $("#crm-container .crm-pager button.crm-form-submit").click(function () {
         submitPagerData(this);
       });
     });
diff --git a/civicrm/templates/CRM/Mailing/Page/Resubscribe.tpl b/civicrm/templates/CRM/Mailing/Page/Resubscribe.tpl
index 47b413d078af6abc0ca1c9be8b891d9131b45b19..98c0f9f3be0027be61e50c5380b36bc448508eef 100644
--- a/civicrm/templates/CRM/Mailing/Page/Resubscribe.tpl
+++ b/civicrm/templates/CRM/Mailing/Page/Resubscribe.tpl
@@ -18,9 +18,9 @@
 {ts 1=$display_name 2=$email}Are you sure you want to resubscribe: %1 (%2){/ts}
 <br/>
 <center>
-<input type="submit" name="_qf_resubscribe_next" value="{ts}Resubscribe{/ts}" class="crm-form-submit" />
+<button type="submit" name="_qf_resubscribe_next" class="crm-button crm-form-submit">{ts}Resubscribe{/ts}</button>
 &nbsp;&nbsp;&nbsp;
-<input type="submit" name="_qf_resubscribe_cancel" value="{ts}Cancel{/ts}" class="crm-form-submit" />
+<button type="submit" name="_qf_resubscribe_cancel" class="crm-button crm-form-submit">{ts}Cancel{/ts}</button>
 </center>
 </form>
 </div>
diff --git a/civicrm/templates/CRM/Member/Form/MembershipRenewal.tpl b/civicrm/templates/CRM/Member/Form/MembershipRenewal.tpl
index 73b1b6850a4b8570057736960de48ec954459562..aa8ff8fb6ed0cb886ebb19d8cdc92d283caba53e 100644
--- a/civicrm/templates/CRM/Member/Form/MembershipRenewal.tpl
+++ b/civicrm/templates/CRM/Member/Form/MembershipRenewal.tpl
@@ -68,7 +68,7 @@
       </tr>
       <tr class="crm-member-membershiprenew-form-block-end_date">
         <td class="label">{ts}Membership End Date{/ts}</td>
-        <td class="html-adjust">&nbsp;{$endDate}</td>
+        <td class="html-adjust">&nbsp;{$endDate|crmDate}</td>
       </tr>
       <tr class="crm-member-membershiprenew-form-block-renewal_date">
         <td class="label">{$form.renewal_date.label}</td>
diff --git a/civicrm/templates/CRM/Member/Page/Tab.tpl b/civicrm/templates/CRM/Member/Page/Tab.tpl
index 249634931c3a587f045942e00ffb46aa26723239..7e807c94822bc65ab7474c3a57fcb02cf3de55dc 100644
--- a/civicrm/templates/CRM/Member/Page/Tab.tpl
+++ b/civicrm/templates/CRM/Member/Page/Tab.tpl
@@ -15,31 +15,20 @@
 {elseif $action eq 32768}  {* renew *}
     {include file="CRM/Member/Form/MembershipRenewal.tpl"}
 {elseif $action eq 16} {* Browse memberships for a contact *}
-    {if $permission EQ 'edit'}
-      {capture assign=newURL}{crmURL p="civicrm/contact/view/membership" q="reset=1&action=add&cid=`$contactId`&context=membership"}{/capture}{/if}
-
     {if $action ne 1 and $action ne 2 and $permission EQ 'edit'}
         <div class="help">
-            {if $permission EQ 'edit'}
-              {capture assign="link"}class="action-item" href="{$newURL}"{/capture}
-              {ts 1=$link}Click <a %1>Add Membership</a> to record a new membership.{/ts}
-              {if $newCredit}
-                {capture assign=newCreditURL}{crmURL p="civicrm/contact/view/membership" q="reset=1&action=add&cid=`$contactId`&context=membership&mode=live"}{/capture}
-                {capture assign="link"}class="action-item" href="{$newCreditURL}"{/capture}
-                {ts 1=$link}Click <a %1>Submit Credit Card Membership</a> to process a Membership on behalf of the member using their credit card.{/ts}
-                {/if}
+            {if $linkButtons.add_membership}
+              {ts}Click <em>Add Membership</em> to record a new membership.{/ts}
             {else}
-                {ts 1=$displayName}Current and inactive memberships for %1 are listed below.{/ts}
+              {ts 1=$displayName}Current and inactive memberships for %1 are listed below.{/ts}
+            {/if}
+            {if $linkButtons.creditcard_membership}
+              {ts}Click <em>Submit Credit Card Membership</em> to process a Membership on behalf of the member using their credit card.{/ts}
             {/if}
         </div>
 
         <div class="action-link">
-            <a accesskey="N" href="{$newURL}" class="button"><span><i class="crm-i fa-plus-circle" aria-hidden="true"></i> {ts}Add Membership{/ts}</span></a>
-            {if $accessContribution and $newCredit}
-                <a accesskey="N" href="{$newCreditURL}" class="button"><span><i class="crm-i fa-credit-card" aria-hidden="true"></i> {ts}Submit Credit Card Membership{/ts}</span></a><br /><br />
-            {else}
-                <br/ ><br/ >
-            {/if}
+          {include file="CRM/common/formButtons.tpl" location="top"}
         </div>
     {/if}
     {if NOT ($activeMembers or $inActiveMembers) and $action ne 2 and $action ne 1 and $action ne 8 and $action ne 4 and $action ne 32768}
diff --git a/civicrm/templates/CRM/Profile/Form/Dynamic.tpl b/civicrm/templates/CRM/Profile/Form/Dynamic.tpl
index 2d0240fb886bb3f1ad93a97671dc7f714daa73a0..09ed9986ddd17fa09caafedfecccf6ecf7c949f1 100644
--- a/civicrm/templates/CRM/Profile/Form/Dynamic.tpl
+++ b/civicrm/templates/CRM/Profile/Form/Dynamic.tpl
@@ -19,7 +19,7 @@
   </div>
 
   <div class="crm-submit-buttons">
-    <span class="crm-button">{$form._qf_Edit_upload_delete.html}</span>
+    {$form._qf_Edit_upload_delete.html}
     {if $includeCancelButton}
       <a class="button cancel" href="{$cancelURL}">{$cancelButtonText}</a>
     {/if}
@@ -37,7 +37,7 @@
 
   {if $isDuplicate and ( ($action eq 1 and $mode eq 4 ) or ($action eq 2) or ($action eq 8192) ) }
     <div class="crm-submit-buttons">
-      <span class="crm-button">{$form._qf_Edit_upload_duplicate.html}</span>
+      {$form._qf_Edit_upload_duplicate.html}
     </div>
   {/if}
   {if $mode eq 1 || $activeComponent neq "CiviCRM"}
@@ -53,7 +53,7 @@
     {if $action eq 2 and $multiRecordFieldListing}
       <h1>{ts}Edit Details{/ts}</h1>
       <div class="crm-submit-buttons" style='float:right'>
-      {include file="CRM/common/formButtons.tpl"}{if $isDuplicate}<span class="crm-button">{$form._qf_Edit_upload_duplicate.html}</span>{/if}
+      {include file="CRM/common/formButtons.tpl"}{if $isDuplicate}{$form._qf_Edit_upload_duplicate.html}{/if}
       </div>
     {/if}
 
@@ -209,7 +209,7 @@
         </div>
       {/if}
       <div class="crm-submit-buttons" style='{$floatStyle}'>
-        {include file="CRM/common/formButtons.tpl"}{if $isDuplicate}<span class="crm-button">{$form._qf_Edit_upload_duplicate.html}</span>{/if}
+        {include file="CRM/common/formButtons.tpl"}{if $isDuplicate}{$form._qf_Edit_upload_duplicate.html}{/if}
         {if $includeCancelButton}
           <a class="button cancel" href="{$cancelURL}">
             <span>
diff --git a/civicrm/templates/CRM/Report/Form/Actions.tpl b/civicrm/templates/CRM/Report/Form/Actions.tpl
index 9aee8f669585f0588cf03036c71760727fb3a19a..34690c1d916d416587aa5a160b1df58d91d2302f 100644
--- a/civicrm/templates/CRM/Report/Form/Actions.tpl
+++ b/civicrm/templates/CRM/Report/Form/Actions.tpl
@@ -20,7 +20,7 @@
               <tr>
                 {include file="CRM/common/tasks.tpl" location="botton"}
                 {if $instanceUrl}
-                  <td>&nbsp;&nbsp;<i class="crm-i fa-chevron-right" aria-hidden="true"></i>&nbsp;<a href="{$instanceUrl}">{ts}Existing report(s) from this template{/ts}</a></td>
+                  <td>&nbsp;&nbsp;<i class="crm-i fa-chevron-right" aria-hidden="true"></i> <a href="{$instanceUrl}">{ts}Existing report(s) from this template{/ts}</a></td>
                 {/if}
               </tr>
             </table>
diff --git a/civicrm/templates/CRM/Report/Form/Layout/Graph.tpl b/civicrm/templates/CRM/Report/Form/Layout/Graph.tpl
index 508d39ca48f2c28866424d515f99f74a548e9360..0add07e2ea183fdf8e10c6f244e3c278cb4c5fed 100644
--- a/civicrm/templates/CRM/Report/Form/Layout/Graph.tpl
+++ b/civicrm/templates/CRM/Report/Form/Layout/Graph.tpl
@@ -34,14 +34,6 @@
            var divName = {/literal}"chart_{$uniqueId}"{literal};
            createChart( chartID, divName, chartValues.size.xSize, chartValues.size.ySize, allData[chartID].object );
          });
-
-         $("input[id$='submit_print'],input[id$='submit_pdf']").bind('click', function(e){
-           // image creator php file path and append image name
-           var url = CRM.url('civicrm/report/chart', 'name=' + '{/literal}{$chartId}{literal}' + '.png');
-
-           //fetch object and 'POST' image
-           swfobject.getObjectById("chart_{/literal}{$uniqueId}{literal}").post_image(url, true, false);
-         });
        });
 
     </script>
diff --git a/civicrm/templates/CRM/Tag/Page/Tag.tpl b/civicrm/templates/CRM/Tag/Page/Tag.tpl
index e59f24246a76710c5df727c464d88f4dab7a628a..e0ded1e4bcb40847c81b4cc746ce6609a2cb1191 100644
--- a/civicrm/templates/CRM/Tag/Page/Tag.tpl
+++ b/civicrm/templates/CRM/Tag/Page/Tag.tpl
@@ -463,16 +463,16 @@
   <% {rdelim} %>
   <div class="crm-submit-buttons">
     <a href="{crmURL p="civicrm/tag/edit" q="action=add&parent_id="}<%= tagset || '' %>" class="button crm-popup">
-      <span><i class="crm-i fa-plus" aria-hidden="true"></i>&nbsp; {ts}Add Tag{/ts}</span>
+      <span><i class="crm-i fa-plus" aria-hidden="true"></i> {ts}Add Tag{/ts}</span>
     </a>
     <% if(tagset && adminTagsets) {ldelim} %>
       <a href="{crmURL p="civicrm/tag/edit" q="action=update&id="}<%= tagset %>" class="button crm-popup tagset-action-update">
-        <span><i class="crm-i fa-pencil" aria-hidden="true"></i>&nbsp; {ts}Edit Set{/ts}</span>
+        <span><i class="crm-i fa-pencil" aria-hidden="true"></i> {ts}Edit Set{/ts}</span>
       </a>
     <% {rdelim} %>
     <% if(tagset && !length && adminTagsets && (!is_reserved || adminReserved)) {ldelim} %>
       <a href="{crmURL p="civicrm/tag/edit" q="action=delete&id="}<%= tagset %>" class="button crm-popup small-popup tagset-action-delete">
-        <span><i class="crm-i fa-trash" aria-hidden="true"></i>&nbsp; {ts}Delete Set{/ts}</span>
+        <span><i class="crm-i fa-trash" aria-hidden="true"></i> {ts}Delete Set{/ts}</span>
       </a>
     <% {rdelim} %>
   </div>
@@ -519,21 +519,21 @@
   <div class="crm-submit-buttons">
     <% if(!tagset) {ldelim} %>
       <a href="{crmURL p="civicrm/tag/edit" q="action=add&parent_id="}<%= id %>" class="button crm-popup" title="{ts}Create new tag under this one{/ts}">
-        <span><i class="crm-i fa-plus" aria-hidden="true"></i>&nbsp; {ts}Add Child{/ts}</span>
+        <span><i class="crm-i fa-plus" aria-hidden="true"></i> {ts}Add Child{/ts}</span>
       </a>
     <% {rdelim} %>
     <a href="{crmURL p="civicrm/tag/edit" q="action=add&clone_from="}<%= id %>" class="button crm-popup" title="{ts}Duplicate this tag{/ts}">
-      <span><i class="crm-i fa-copy" aria-hidden="true"></i>&nbsp; {ts}Clone Tag{/ts}</span>
+      <span><i class="crm-i fa-copy" aria-hidden="true"></i> {ts}Clone Tag{/ts}</span>
     </a>
     <% if(!data.is_reserved || adminReserved) {ldelim} %>
       <% if(tagsetCount) {ldelim} %>
         <a href="#move" class="button move-tag-button" title="{ts}Move to a different tagset{/ts}">
-          <span><i class="crm-i fa-share-square-o" aria-hidden="true"></i>&nbsp; {ts}Move Tag{/ts}</span>
+          <span><i class="crm-i fa-share-square-o" aria-hidden="true"></i> {ts}Move Tag{/ts}</span>
         </a>
       <% {rdelim} %>
       <% if(!hasChildren) {ldelim} %>
         <a href="{crmURL p="civicrm/tag/edit" q="action=delete&id="}<%= id %>" class="button crm-popup small-popup">
-          <span><i class="crm-i fa-trash" aria-hidden="true"></i>&nbsp; {ts}Delete{/ts}</span>
+          <span><i class="crm-i fa-trash" aria-hidden="true"></i> {ts}Delete{/ts}</span>
         </a>
       <% {rdelim} %>
     <% {rdelim} %>
@@ -551,16 +551,16 @@
   <div class="crm-submit-buttons">
     <% if(!reserved || adminReserved) {ldelim} %>
       <a href="{crmURL p="civicrm/tag/merge" q="id="}<%= items.join() %>" class="button crm-popup small-popup" title="{ts}Combine tags into one{/ts}">
-        <span><i class="crm-i fa-compress" aria-hidden="true"></i>&nbsp; {ts}Merge Tags{/ts}</span>
+        <span><i class="crm-i fa-compress" aria-hidden="true"></i> {ts}Merge Tags{/ts}</span>
       </a>
       <% if(tagsetCount) {ldelim} %>
         <a href="#move" class="button move-tag-button" title="{ts}Move to a different tagset{/ts}">
-          <span><i class="crm-i fa-share-square-o" aria-hidden="true"></i>&nbsp; {ts}Move Tags{/ts}</span>
+          <span><i class="crm-i fa-share-square-o" aria-hidden="true"></i> {ts}Move Tags{/ts}</span>
         </a>
       <% {rdelim} %>
       <% if(!hasChildren) {ldelim} %>
         <a href="{crmURL p="civicrm/tag/edit" q="action=delete&id="}<%= items.join() %>" class="button crm-popup small-popup">
-          <span><i class="crm-i fa-trash" aria-hidden="true"></i>&nbsp; {ts}Delete All{/ts}</span>
+          <span><i class="crm-i fa-trash" aria-hidden="true"></i> {ts}Delete All{/ts}</span>
         </a>
       <% {rdelim} %>
     <% {rdelim} %>
diff --git a/civicrm/templates/CRM/common/TabHeader.js b/civicrm/templates/CRM/common/TabHeader.js
index e816f0baacd46b33bf5416e39fe6661d2a29a22a..ba514b81268fb2719b1485a598b685f1240a61c7 100644
--- a/civicrm/templates/CRM/common/TabHeader.js
+++ b/civicrm/templates/CRM/common/TabHeader.js
@@ -23,7 +23,7 @@ CRM.$(function($) {
           params.autoClose = params.openInline = params.cancelButton = params.refreshAction = false;
           ui.panel.on('crmFormLoad', function() {
             // Hack: "Save and done" and "Cancel" buttons submit without ajax
-            $('.cancel.crm-form-submit, input[name$=upload_done]', this).on('click', function(e) {
+            $('.cancel.crm-form-submit, button[name$=upload_done]', this).on('click', function(e) {
               $(this).closest('form').ajaxFormUnbind();
             });
           });
diff --git a/civicrm/templates/CRM/common/civicrm.settings.php.template b/civicrm/templates/CRM/common/civicrm.settings.php.template
index 3d0575569fb8dbccc87ac797befb0fcc48ca85e1..d66a63d632ecb2b5f2c7605c5ca314e0e4ab5b89 100644
--- a/civicrm/templates/CRM/common/civicrm.settings.php.template
+++ b/civicrm/templates/CRM/common/civicrm.settings.php.template
@@ -73,7 +73,7 @@ if (!defined('CIVICRM_UF')) {
  *      define( 'CIVICRM_UF_DSN', 'mysql://cms_db_username:cms_db_password@db_server/cms_database?new_link=true');
  */
 if (!defined('CIVICRM_UF_DSN') && CIVICRM_UF !== 'UnitTests') {
-  define( 'CIVICRM_UF_DSN'           , 'mysql://%%CMSdbUser%%:%%CMSdbPass%%@%%CMSdbHost%%/%%CMSdbName%%?new_link=true');
+  define( 'CIVICRM_UF_DSN'           , 'mysql://%%CMSdbUser%%:%%CMSdbPass%%@%%CMSdbHost%%/%%CMSdbName%%?new_link=true%%CMSdbSSL%%');
 }
 
 // %%extraSettings%%
diff --git a/civicrm/templates/CRM/common/deferredFinancialType.tpl b/civicrm/templates/CRM/common/deferredFinancialType.tpl
index 0b8f6645c1582466ab42b5ab0aed32f79a74afbd..10c9628b2dbd36daa610a2d3ccbeb3dad50e1489 100644
--- a/civicrm/templates/CRM/common/deferredFinancialType.tpl
+++ b/civicrm/templates/CRM/common/deferredFinancialType.tpl
@@ -12,7 +12,7 @@
 {literal}
 <script type="text/javascript">
 CRM.$(function($) {
-  var more = $('.crm-button input.validate').click(function(e) {
+  var more = $('.crm-button.validate').click(function(e) {
     var message = "{/literal} {if $context eq 'Event'}
         {ts escape='js'}Note: Revenue for this event registration will not be deferred as the financial type does not have a deferred revenue account setup for it. If you want the revenue to be deferred, please select a different Financial Type with a Deferred Revenue account setup for it, or setup a Deferred Revenue account for this Financial Type.{/ts}
       {else if $context eq 'MembershipType'}
diff --git a/civicrm/templates/CRM/common/formButtons.tpl b/civicrm/templates/CRM/common/formButtons.tpl
index 92b41f4dff0dae94968c7160b2faea3e8693db64..355abcadc62fe39253c4d6525b3aafa56f3f6032 100644
--- a/civicrm/templates/CRM/common/formButtons.tpl
+++ b/civicrm/templates/CRM/common/formButtons.tpl
@@ -12,7 +12,7 @@
 {* Loops through $linkButtons and assigns html "a" (link) buttons to the template. Used for additional entity functions such as "Move to Case" or "Renew Membership" *}
 {if $linkButtons}
   {foreach from=$linkButtons item=linkButton}
-    {if $linkButton.accesskey}
+    {if $linkButton.accessKey}
       {capture assign=accessKey}accesskey="{$linkButton.accessKey}"{/capture}
     {else}{assign var="accessKey" value=""}
     {/if}
@@ -28,30 +28,13 @@
   {/foreach}
 {/if}
 
-{* Loops through $form.buttons.html array and assigns separate spans with classes to allow theming by button and name.
- * crmBtnType grabs type keyword from button name (e.g. 'upload', 'next', 'back', 'cancel') so types of buttons can be styled differently via css.
- *}
 {foreach from=$form.buttons item=button key=key name=btns}
   {if $key|substring:0:4 EQ '_qf_'}
     {if $location}
-      {assign var='html' value=$form.buttons.$key.html|crmReplace:id:"$key-$location"}
+      {$form.buttons.$key.html|crmReplace:id:"$key-$location"}
     {else}
-      {assign var='html' value=$form.buttons.$key.html}
+      {$form.buttons.$key.html}
     {/if}
-    {crmGetAttribute html=$html attr='crm-icon' assign='icon'}
-    {capture assign=iconPrefix}{$icon|truncate:3:"":true}{/capture}
-    {if $icon && $iconPrefix eq 'fa-'}
-      {assign var='buttonClass' value=' crm-i-button'}
-      {capture assign=iconDisp}<i class="crm-i {$icon}" aria-hidden="true"></i>{/capture}
-    {elseif $icon}
-      {assign var='buttonClass' value=' crm-icon-button'}
-      {capture assign=iconDisp}<span class="crm-button-icon ui-icon-{$icon}"> </span>{/capture}
-    {/if}
-    {crmGetAttribute html=$html attr='disabled' assign='disabled'}
-    <span class="crm-button crm-button-type-{$key|crmBtnType} crm-button{$key}{$buttonClass}{if $disabled} crm-button-disabled{/if}"{if $buttonStyle} style="{$buttonStyle}"{/if}>
-      {$iconDisp}
-      {$html}
-    </span>
   {/if}
 {/foreach}
 {/crmRegion}
diff --git a/civicrm/templates/CRM/common/navigation.js.tpl b/civicrm/templates/CRM/common/navigation.js.tpl
index 866769185c51e2d61c862b3577e5ac1490019480..5ec824a85e46250e75f26587a78cf8def7fabcc7 100644
--- a/civicrm/templates/CRM/common/navigation.js.tpl
+++ b/civicrm/templates/CRM/common/navigation.js.tpl
@@ -17,7 +17,7 @@
             <input type="hidden" name="hidden_location" value="1" />
             <input type="hidden" name="hidden_custom" value="1" />
             <input type="hidden" name="qfKey" value="" />
-            <div style="height:1px; overflow:hidden;"><input type="submit" value="{ts}Go{/ts}" name="_qf_Advanced_refresh" class="crm-form-submit default" /></div>
+            <div style="height:1px; overflow:hidden;"><button type="submit" name="_qf_Advanced_refresh" class="crm-button crm-form-submit default">{ts}Go{/ts}</button></div>
           </div>
         </form>
         <ul>
diff --git a/civicrm/templates/CRM/common/paymentBlock.tpl b/civicrm/templates/CRM/common/paymentBlock.tpl
index 1d5c3e5e71ac784ff63e2cbc69289afd2794df14..c3171f349d4031f06f2978517852c546d2bf91aa 100644
--- a/civicrm/templates/CRM/common/paymentBlock.tpl
+++ b/civicrm/templates/CRM/common/paymentBlock.tpl
@@ -28,6 +28,8 @@
       payment_processor.hide();
       payment_information.hide();
       billing_block.hide();
+      // Ensure that jquery validation doesn't block submission when we don't need to fill in the billing details section
+      cj('#billing-payment-block select.crm-select2').addClass('crm-no-validate');
       // also unset selected payment methods
       cj('input[name="payment_processor_id"]').removeProp('checked');
     }
@@ -36,6 +38,7 @@
       payment_processor.show();
       payment_information.show();
       billing_block.show();
+      cj('#billing-payment-block select.crm-select2').removeClass('crm-no-validate');
       // also set selected payment methods
       cj('input[name="payment_processor_id"][checked=checked]').prop('checked', true);
     }
diff --git a/civicrm/templates/CRM/common/success.tpl b/civicrm/templates/CRM/common/success.tpl
index 14ca9873a9fdcb41c399a5a768bdc869f1212bff..4871f6b56a64b1543f59f10e918cadb9e27222e2 100644
--- a/civicrm/templates/CRM/common/success.tpl
+++ b/civicrm/templates/CRM/common/success.tpl
@@ -44,7 +44,7 @@
       <div class="bold" style="padding: 1em; background-color: rgba(255, 255, 255, 0.76);">
         <p>
           <img style="display:block; float:left; width:40px; margin-right:10px;" src="{$config->resourceBase}i/logo_lg.png">
-          {ts 1="https://civicrm.org/core-team" 2="https://civicrm.org/providers/contributors" 3="https://civicrm.org/become-a-member?src=ug&sid=$sid" 4=$newVersion}Thank you for upgrading to %4, the latest version of CiviCRM. Packed with new features and improvements, this release was made possible by both the <a href="%1">CiviCRM Core Team</a> and an incredible group of <a href="%2">contributors</a>, combined with the financial support of CiviCRM Members and Partners, without whom the project could not exist. We invite you to join their ranks by <a href="%3">becoming a member of CiviCRM today</a>. There is no better way to say thanks than to support those that have made CiviCRM %4 possible. <a href="%3">Join today</a>.{/ts}
+          {ts 1="https://civicrm.org/core-team" 2="https://civicrm.org/contributors" 3="https://civicrm.org/members" 4="https://civicrm.org/partners" 5="https://civicrm.org/become-a-member?src=ug&sid=$sid" 6=$newVersion 7="https://civicrm.org/become-a-partner" 8="https://civicrm.org"}Thank you for upgrading to %6. This release was made possible by the <a href="%1" target="_blank">CiviCRM Core Team</a> and an <a href="%2" target="_blank">incredible group of CiviCRM Contributors</a>. The CiviCRM project could not exist without the continued financial support of <a href="%3" target="_blank">CiviCRM Members</a> and <a href="%4" target="_blank">CiviCRM Partners</a>. We invite you to support CiviCRM by becoming a <a href="%5" target="_blank">CiviCRM Member</a> or <a href="%7" target="_blank">CiviCRM Partner</a> today. Providing financial support ensures that the <a href="%8" target="_blank">CiviCRM project</a> can continue to provide the essential resources and services to support the <a href="%8" target="_blank">CiviCRM community</a>.{/ts}
         </p>
       </div>
       <p><span class="crm-status-icon success"> </span>{$message}</p>
diff --git a/civicrm/vendor/autoload.php b/civicrm/vendor/autoload.php
index 88a6c222653210b66fd7a4bcf10722cf03d39f87..845dacc2baeb5307f0e2a06ba93bb511b4d8d370 100644
--- a/civicrm/vendor/autoload.php
+++ b/civicrm/vendor/autoload.php
@@ -4,4 +4,4 @@
 
 require_once __DIR__ . '/composer/autoload_real.php';
 
-return ComposerAutoloaderInit53b94b8697ed3e528623510a6d85b3d5::getLoader();
+return ComposerAutoloaderInit48a04dd099c7551f9f6464ca07a76900::getLoader();
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/.gitignore b/civicrm/vendor/civicrm/composer-compile-lib/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e79fe3232e889c72574a2e6ea04b0f607fe7cc23
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/.gitignore
@@ -0,0 +1,7 @@
+/CCL.php
+/tests/examples/scss/dist
+/tests/examples/scss/output.css
+/tests/examples/scss/output.min.css
+/vendor/
+/.idea/
+*~
\ No newline at end of file
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/README.md b/civicrm/vendor/civicrm/composer-compile-lib/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..9627a22281cf2b0410890930977c653492553037
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/README.md
@@ -0,0 +1,222 @@
+# CiviCRM Composer Compilation Library
+
+This package provides a handful of small tasks and helpers for use with [composer-compile-plugin](https://github.com/civicrm/composer-compile-plugin).
+
+Design guidelines for this package:
+
+* To ensure easy operation in a new/unbooted system:
+    * Use basic functions and static methods
+    * Use primitive data sources (such as static JSON files)
+* To ensure that compilation steps report errors:
+    * Every task/function must throw an exception if it doesn't work.
+* To allow pithy tasks:
+    * If a task is outputting to a folder, and if the folder doesn't exist, then it should auto-create the folder.
+
+The primary purpose here is *demonstrative* - to provide examples.  Consequently, it is fairly minimal / lightweight /
+loosely-coupled.  There is no dependency on CiviCRM.  Conversely, CiviCRM packages may define other tasks which are not
+in this library.
+
+## Require the library
+
+All the examples below require the `civicrm/composer-compile-lib` package. Load via CLI:
+
+```bash
+composer require civicrm/composer-compile-lib:'~0.2'
+```
+
+Or via `composer.json`:
+
+```javascript
+  "require": {
+    "civicrm/composer-compile-lib": "~0.2"
+  }
+```
+
+## Task: SCSS
+
+In this example, we generate a file `dist/sandwich.css` by reading `scss/sandwich.scss`.  The file may `@import` mixins and
+variables from the `./scss/` folder.
+
+```javascript
+{
+  "extra": {
+    "compile": [
+      {
+        "title": "Prepare CSS (<comment>sandwich.css</comment>, <comment>salad.css</comment>)",
+        "run": "@php-method \\CCL\\Tasks::scss",
+        "watch-files": ["scss"],
+        "scss-files": {
+          "dist/sandwich.css": "scss/sandwich.scss",
+          "dist/salad.css": "scss/salad.scss"
+        },
+        "scss-imports": ["scss"]
+        "scss-import-prefixes": {"LOGICAL_PREFIX/": "physical/folder/"}
+      }
+    ]
+  }
+}
+```
+
+Note that a "task" simply calls a static PHP method (`@php-method \\CCL\\Tasks::scss`) with the JSON data as input.  You
+can also call the method in a PHP script. For example, we could define a task based on a script:
+
+```javascript
+{
+  "extra": {
+    "compile": [
+      {
+        "title": "Prepare CSS (<comment>sandwich.css</comment>, <comment>salad.css</comment>)",
+        "run": "@php-script bin/compile-scss"
+      }
+    ]
+  }
+}
+```
+
+The following script generalizes the example from before -- it maps *any* SCSS files (`scss/*.scss`) to
+corresponding CSS files (`dist/#1.css`). This file-list is passed into `\CCL\Tasks::scss` for processing:
+
+```php
+\CCL::assertTask();
+
+$files = \CCL::globMap('scss/*.scss', 'dist/#1.css', 1);
+\CCL\Tasks::scss([
+  'scss-files' => $files,
+  'scss-imports' => ['scss']
+  'scss-import-prefixes' => ['LOGICAL_PREFIX/' => 'physical/folder/']
+]);
+```
+
+Note that this implementation of `\CCL\Tasks::scss()` is fairly opinionated - it combines `scssphp` with
+`php-autoprefixer`. The output is written as two files, a larger files (`*.css`) and a smaller file (`*.min.css`).
+
+## Task: PHP Template
+
+In this example, we use a PHP template to generate another PHP file.  Specifically, we create `Sandwich.php` using
+the specification from [`Sandwich.json`](tests/examples/Sandwich.json) and [`EntityTemplate.php`](tests/examples/EntityTemplate.php):
+
+```javascript
+{
+  "extra": {
+    "compile": [
+      {
+        "title": "Sandwich (<comment>src/Sandwich.php</comment>)",
+        "run": "@php-method \\CCL\\Tasks::template",
+        "watch-files": ["src/Entity"],
+        "tpl-items": [
+          "src/Entity/Sandwich.php": "src/Entity/Sandwich.json",
+          "src/Entity/Salad.php": "src/Entity/Salad.json"
+        ],
+        "tpl-file": "src/Entity/EntityTemplate.php"
+      }
+    ]
+  }
+}
+```
+
+As in the previous example, the task is simply a PHP method (`@php-method \\CCL\\Tasks::template`), so it can be used
+from a PHP script.  The following script would extend the pattern, mapping *any* JSON files (`src/Entity/*.json`) to
+corresponding PHP files (`src/Entity/#1.php`):
+
+```php
+$files = \CCL::globMap('src/Entity/*.json', 'src/Entity/#1.php', 1);
+\CCL\Tasks::template([
+  "tpl-file" => "src/Entity/EntityTemplate.php",
+  "tpl-items" => $files,
+]);
+```
+
+## Functions
+
+PHP's standard library has a lot of functions that would work for basic file manipulation (`copy()`, `rename()`, `chdir()`, etc).  The
+problem is error-signaling -- you have to explicitly check error-output, and this grows cumbersome for improvised glue code.  It's more
+convenient to have a default *stop-on-error* behavior, e.g.  throwing exceptions.
+
+[symfony/filesystem](https://symfony.com/doc/current/components/filesystem.html) provides wrappers which throw exceptions.
+But it puts them into a class `Filesystem` which, which requires more boilerplate.
+
+For the most part, `CCL` simply mirrors `symfony/filesystem` using static methods in the `CCL` class. Compare:
+
+```php
+// PHP Standard Library
+if (!copy('old', 'new')) {
+  throw new \Exception("...");
+}
+
+// Symfony Filesystem
+$fs = new \Symfony\Component\Filesystem\Filesystem();
+$fs->copy('old', 'new');
+
+// Composer Compile Library
+\CCL::copy('old', 'new');
+```
+
+This is more convenient for scripting one-liners. For example, the following tasks do simple file operations. If anything
+goes wrong, they raise an exception and stop the compilation process.
+
+```javascript
+{
+  "extra": {
+    "compile": [
+      {
+        "title": "Smorgasboard of random helpers",
+        "run": [
+          // Create files and folders
+          "@php-eval \\CCL::dumpFile('dist/timestamp.txt', date('Y-m-d H:i:s'));",
+          "@php-eval \\CCL::mkdir('some/other/place');",
+
+          // Concatenate a few files
+          "@php-eval \\CCL::dumpFile('dist/bundle.js', \\CCL::cat(glob('js/*.js'));",
+          "@php-eval \\CCL::chdir('css'); \\CCL::dumpFile('all.css', ['colors.css', 'layouts.css']);",
+
+          // If you need reference material from another package...
+          "@export TWBS={{pkg:twbs/bootstrap}}",
+          "@php-eval \\CCL::copy(getenv('TWBS') .'/dist/bootstrap.css', 'web/main.css')"
+        ]
+      }
+    ]
+  }
+}
+```
+
+The full function list:
+
+```php
+// CCL wrapper functions
+
+function chdir(string $dir);
+function glob($pat, $flags = null);
+
+// CCL distinct functions
+
+function cat($files);
+function mapkv($array, $func);
+function globMap($globPat, $mapPat, $flip = false);
+
+// Symfony wrapper functions
+
+function appendToFile($filename, $content);
+function dumpFile($filename, $content);
+function mkdir($dirs, $mode = 511);
+function touch($files, $time = null, $atime = null);
+
+function copy($originFile, $targetFile, $overwriteNewerFiles = true);
+function mirror($originDir, $targetDir, $iterator = null, $options = []);
+function remove($files);
+function rename($origin, $target, $overwrite = false);
+
+function chgrp($files, $group, $recursive = false);
+function chmod($files, $mode, $umask = 0, $recursive = false);
+function chown($files, $user, $recursive = false);
+
+function hardlink($originFile, $targetFiles);
+function readlink($path, $canonicalize = false);
+function symlink($originDir, $targetDir, $copyOnWindows = false);
+
+function exists($files);
+
+function tempnam($dir, $prefix);
+```
+
+For more details about each function, see [`CCL\Functions`](src/Functions.php) and
+[symfony/filesystem](https://symfony.com/doc/current/components/filesystem.html).
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/composer.json b/civicrm/vendor/civicrm/composer-compile-lib/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..8d4d01d9fc01b3d642f211530bc81a984088b5bb
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/composer.json
@@ -0,0 +1,42 @@
+{
+    "name": "civicrm/composer-compile-lib",
+    "description": "Small library of compilation helpers",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "CiviCRM",
+            "email": "info@civicrm.org"
+        }
+    ],
+    "autoload": {
+      "psr-0": {
+        "CCL": ""
+      },
+      "psr-4": {
+        "CCL\\": ["src/"]
+      }
+    },
+    "config": {
+        "platform": {
+            "php": "7.1"
+        }
+    },
+    "require": {
+        "civicrm/composer-compile-plugin": "~0.9 || ~1.0",
+        "symfony/filesystem": "~2.8 || ~3.4 || ~4.0 || ~5.0",
+        "scssphp/scssphp": "~1.2",
+        "padaliyajay/php-autoprefixer": "~1.2",
+        "tubalmartin/cssmin": "^4.1"
+    },
+    "extra": {
+        "compile": [
+            {
+                "title": "Generate <comment>CCL</comment> wrapper functions",
+                "run": ["@php-method \\CCL\\Tasks::template"],
+                "tpl-file": "src/StubsTpl.php",
+                "tpl-items": {"CCL.php": true},
+                "watch-files": ["src/StubsTpl.php", "src/Functions.php"]
+            }
+        ]
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/composer.lock b/civicrm/vendor/civicrm/composer-compile-lib/composer.lock
new file mode 100644
index 0000000000000000000000000000000000000000..25a7b21f307fa4be5f6a222e1ee373302dc66cd0
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/composer.lock
@@ -0,0 +1,462 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "ae55cd77803c8d008816142aa485b5b0",
+    "packages": [
+        {
+            "name": "civicrm/composer-compile-plugin",
+            "version": "v0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/civicrm/composer-compile-plugin.git",
+                "reference": "ad3dda7edecbc83d460d4839154e74c67b3eb146"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/civicrm/composer-compile-plugin/zipball/ad3dda7edecbc83d460d4839154e74c67b3eb146",
+                "reference": "ad3dda7edecbc83d460d4839154e74c67b3eb146",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.1 || ^2.0",
+                "php": ">=7.1",
+                "totten/lurkerlite": "^1.3"
+            },
+            "require-dev": {
+                "composer/composer": "~1.0",
+                "totten/process-helper": "^1.0.1"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "Civi\\CompilePlugin\\CompilePlugin"
+            },
+            "autoload": {
+                "psr-4": {
+                    "Civi\\CompilePlugin\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Tim Otten",
+                    "email": "info@civicrm.org"
+                }
+            ],
+            "description": "Define a 'compile' event for all packages in the dependency-graph",
+            "time": "2020-09-26T08:20:55+00:00"
+        },
+        {
+            "name": "padaliyajay/php-autoprefixer",
+            "version": "1.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/padaliyajay/php-autoprefixer.git",
+                "reference": "f05f374f0c1e463db62209613f52b38bf4b52430"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/padaliyajay/php-autoprefixer/zipball/f05f374f0c1e463db62209613f52b38bf4b52430",
+                "reference": "f05f374f0c1e463db62209613f52b38bf4b52430",
+                "shasum": ""
+            },
+            "require": {
+                "sabberworm/php-css-parser": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Padaliyajay\\PHPAutoprefixer\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jay padaliya"
+                }
+            ],
+            "description": "CSS Autoprefixer written in pure PHP.",
+            "time": "2019-11-26T09:55:37+00:00"
+        },
+        {
+            "name": "sabberworm/php-css-parser",
+            "version": "8.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sabberworm/PHP-CSS-Parser.git",
+                "reference": "d217848e1396ef962fb1997cf3e2421acba7f796"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796",
+                "reference": "d217848e1396ef962fb1997cf3e2421acba7f796",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "codacy/coverage": "^1.4",
+                "phpunit/phpunit": "~4.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Sabberworm\\CSS": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Raphael Schweikert"
+                }
+            ],
+            "description": "Parser for CSS Files written in PHP",
+            "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser",
+            "keywords": [
+                "css",
+                "parser",
+                "stylesheet"
+            ],
+            "time": "2020-06-01T09:10:00+00:00"
+        },
+        {
+            "name": "scssphp/scssphp",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/scssphp/scssphp.git",
+                "reference": "a05ea68160b7286ebbfd6e5fd7ae9e1a946ad6e1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/scssphp/scssphp/zipball/a05ea68160b7286ebbfd6e5fd7ae9e1a946ad6e1",
+                "reference": "a05ea68160b7286ebbfd6e5fd7ae9e1a946ad6e1",
+                "shasum": ""
+            },
+            "require": {
+                "ext-ctype": "*",
+                "ext-json": "*",
+                "php": ">=5.6.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3",
+                "sass/sass-spec": "2020.08.10",
+                "squizlabs/php_codesniffer": "~3.5",
+                "twbs/bootstrap": "~4.3",
+                "zurb/foundation": "~6.5"
+            },
+            "bin": [
+                "bin/pscss"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "ScssPhp\\ScssPhp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Anthon Pang",
+                    "email": "apang@softwaredevelopment.ca",
+                    "homepage": "https://github.com/robocoder"
+                },
+                {
+                    "name": "Cédric Morin",
+                    "email": "cedric@yterium.com",
+                    "homepage": "https://github.com/Cerdic"
+                }
+            ],
+            "description": "scssphp is a compiler for SCSS written in PHP.",
+            "homepage": "http://scssphp.github.io/scssphp/",
+            "keywords": [
+                "css",
+                "less",
+                "sass",
+                "scss",
+                "stylesheet"
+            ],
+            "time": "2020-09-07T21:15:42+00:00"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v3.4.45",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "495646f13d051cc5a8f77a68b68313dc854080aa"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/495646f13d051cc5a8f77a68b68313dc854080aa",
+                "reference": "495646f13d051cc5a8f77a68b68313dc854080aa",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Filesystem Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-09-02T16:06:40+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.18.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "1c302646f6efc070cd46856e600e5e0684d6b454"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454",
+                "reference": "1c302646f6efc070cd46856e600e5e0684d6b454",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.18-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Ctype\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gert de Pagter",
+                    "email": "BackEndTea@gmail.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-07-14T12:35:20+00:00"
+        },
+        {
+            "name": "totten/lurkerlite",
+            "version": "1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/totten/Lurker.git",
+                "reference": "a20c47142b486415b9117c76aa4c2117ff95b49a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/totten/Lurker/zipball/a20c47142b486415b9117c76aa4c2117ff95b49a",
+                "reference": "a20c47142b486415b9117c76aa4c2117ff95b49a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "replace": {
+                "henrikbjorn/lurker": "*"
+            },
+            "suggest": {
+                "ext-inotify": ">=0.1.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Lurker": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com"
+                },
+                {
+                    "name": "Yaroslav Kiliba",
+                    "email": "om.dattaya@gmail.com"
+                },
+                {
+                    "name": "Henrik Bjrnskov",
+                    "email": "henrik@bjrnskov.dk"
+                }
+            ],
+            "description": "Resource Watcher - Lightweight edition of henrikbjorn/lurker with no dependencies",
+            "keywords": [
+                "filesystem",
+                "resource",
+                "watching"
+            ],
+            "time": "2020-09-01T10:01:01+00:00"
+        },
+        {
+            "name": "tubalmartin/cssmin",
+            "version": "v4.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port.git",
+                "reference": "3cbf557f4079d83a06f9c3ff9b957c022d7805cf"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/tubalmartin/YUI-CSS-compressor-PHP-port/zipball/3cbf557f4079d83a06f9c3ff9b957c022d7805cf",
+                "reference": "3cbf557f4079d83a06f9c3ff9b957c022d7805cf",
+                "shasum": ""
+            },
+            "require": {
+                "ext-pcre": "*",
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "cogpowered/finediff": "0.3.*",
+                "phpunit/phpunit": "4.8.*"
+            },
+            "bin": [
+                "cssmin"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "tubalmartin\\CssMin\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Túbal Martín",
+                    "homepage": "http://tubalmartin.me/"
+                }
+            ],
+            "description": "A PHP port of the YUI CSS compressor",
+            "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port",
+            "keywords": [
+                "compress",
+                "compressor",
+                "css",
+                "cssmin",
+                "minify",
+                "yui"
+            ],
+            "time": "2018-01-15T15:26:51+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": [],
+    "platform-overrides": {
+        "php": "7.1"
+    },
+    "plugin-api-version": "1.1.0"
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/phpunit.xml b/civicrm/vendor/civicrm/composer-compile-lib/phpunit.xml
new file mode 100644
index 0000000000000000000000000000000000000000..81431dd1a62035c4ccdeabb907f0abe466e1e180
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/phpunit.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit colors="true" bootstrap="vendor/autoload.php" defaultTestSuite="Main">
+
+    <testsuites>
+        <testsuite name="Main">
+            <directory>tests</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./src/*/</directory>
+        </whitelist>
+    </filter>
+
+</phpunit>
\ No newline at end of file
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/src/ErrorBuffer.php b/civicrm/vendor/civicrm/composer-compile-lib/src/ErrorBuffer.php
new file mode 100644
index 0000000000000000000000000000000000000000..dc3098b31841ba814aca69bbbcced25925600b9c
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/src/ErrorBuffer.php
@@ -0,0 +1,83 @@
+<?php
+namespace CCL;
+
+class ErrorBuffer {
+
+  /**
+   * @return static
+   */
+  public static function create() {
+    return new static();
+  }
+
+  /**
+   * @var string[]
+   */
+  protected $lines = [];
+
+  /**
+   * @var bool
+   */
+  protected $fatal = FALSE;
+
+  /**
+   * Start directing errors to this buffer.
+   *
+   * @return static
+   */
+  public function start() {
+    set_error_handler([$this, 'onError']);
+    return $this;
+  }
+
+  /**
+   * Stop directing errors to this buffer.
+   *
+   * @return static
+   */
+  public function stop() {
+    restore_error_handler();
+    return $this;
+  }
+
+  public function onError($errno, $errstr, $errfile, $errline) {
+    switch ($errno) {
+      case E_ERROR:
+      case E_PARSE:
+      case E_CORE_ERROR:
+      case E_COMPILE_ERROR:
+      case E_USER_ERROR:
+      case E_RECOVERABLE_ERROR:
+        $this->fatal = TRUE;
+        $this->lines[] = sprintf("Error: \"%s\" in \"%s\" at line %d", $errstr, $errfile, $errline);
+        return TRUE;
+
+      case E_WARNING:
+      case E_CORE_WARNING:
+      case E_COMPILE_WARNING:
+      case E_USER_WARNING:
+      case E_NOTICE:
+      case E_USER_NOTICE:
+      case E_STRICT:
+      case E_DEPRECATED:
+      case E_USER_DEPRECATED:
+        $this->lines[] = sprintf("Warning: \"%s\" in \"%s\" at line %d", $errstr, $errfile, $errline);
+        return TRUE;
+
+      default:
+        return FALSE;
+    }
+  }
+
+  /**
+   * @return \string[]
+   */
+  public function getLines() {
+    return $this->lines;
+  }
+
+  public function isFatal() {
+    return $this->fatal;
+  }
+
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/src/Functions.php b/civicrm/vendor/civicrm/composer-compile-lib/src/Functions.php
new file mode 100644
index 0000000000000000000000000000000000000000..97bc01b9ff80c99b6737779f48e2eb7e4aa9ecb7
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/src/Functions.php
@@ -0,0 +1,178 @@
+<?php
+namespace CCL;
+
+class Functions {
+
+  /**
+   * Assert that we are properly executing within the context of a compilation task.
+   *
+   * If this script tries to run in any other context, then you will get some
+   * kind of error (e.g. class not found or RuntimeException).
+   */
+  public function assertTask() {
+    \Civi\CompilePlugin\Util\Script::assertTask();
+  }
+
+  /**
+   * Array-map function. Similar to array_map(), but tuned to key-value pairs.
+   *
+   * Example:
+   *   $data = [100 => 'apple', 200 => 'banana'];
+   *   $opposite = mapkv($data, function($k, $v){ return [-1 * $k => strtoupper($v)]; });
+   *
+   * This would return [-100 => 'APPLE', -200 => 'BANANA']
+   *
+   * By convention, mapping functions should return an 1-row array "[newKey => newValue]".
+   *
+   * Some unconventional forms are also defined:
+   *  - Return empty array ==> Skip/omit the row
+   *  - Return multiple items ==> Add all items to the result
+   *  - Return an unkeyed (numeric) array ==> Discard original keys. Items are appended numerically (`$arr[] = $value`).
+   *
+   * @param array $array
+   *   Values to iterate over
+   * @param callable $func
+   *   Callback function.
+   *   function(scalar $key, mixed $value): array
+   * @return array
+   *   The filtered array.
+   */
+  public function mapkv($array, $func) {
+    $r = [];
+    foreach ($array as $k => $v) {
+      foreach ($func($k, $v) as $out_k => $out_v) {
+        if (isset($r[$out_k])) {
+          $r[] = $out_v;
+        }
+        else {
+          $r[$out_k] = $out_v;
+        }
+      }
+    }
+    return $r;
+  }
+
+  /**
+   * Map file-names.
+   *
+   * @param string $matchPat
+   *   Ex: 'src/*.json'
+   * @param string $outPat
+   *   Ex: 'dest/#1.json'
+   * @param bool $flip
+   *   The orientation of the result map.
+   *   If false, returned as "original => filtered".
+   *   If true, returned as "filtered => original".
+   * @return array
+   *   List of files and the corresponding names.
+   */
+  public function globMap($matchPat, $outPat, $flip = FALSE) {
+    $inFiles = glob($matchPat);
+    $regex = ';' . preg_quote($matchPat, ';') . ';';
+    $regex = str_replace(preg_quote('*', ';'), '(.*)', $regex);
+    $replacement = preg_replace(';#(\d+);', '\\' . '\\\1', $outPat);
+    $outFiles = preg_replace($regex, $replacement, $inFiles);
+    return $flip ? array_combine($outFiles, $inFiles) : array_combine($inFiles, $outFiles);
+  }
+
+  public function chdir($directory) {
+    if (!\chdir($directory)) {
+      throw new IOException("Failed to change directory ($directory)");
+    }
+  }
+
+  /**
+   * @param string|string[] $pats
+   *   List of glob patterns.
+   * @param null|int $flags
+   * @return array
+   *   List of matching files.
+   */
+  public function glob($pats, $flags = NULL) {
+    $r = [];
+    $pats = (array) $pats;
+    foreach ($pats as $pat) {
+      $r = array_unique(array_merge($r, (array) \glob($pat, $flags)));
+    }
+    sort($r);
+    return $r;
+  }
+
+  /**
+   * Read a set of files and concatenate the results
+   *
+   * @param string|string[] $srcs
+   *   Files to read. These may be globs.
+   * @param string $newLine
+   *   Whether to ensure that joined files have a newline separator.
+   *   Ex: 'raw' (as-is), 'auto' (add if missing)
+   * @return string
+   *   The result of joining the files.
+   */
+  public function cat($srcs, $newLine = 'auto') {
+    $buf = '';
+    foreach (glob($srcs) as $file) {
+      if (!is_readable($file)) {
+        throw new \RuntimeException("Cannot read $file");
+      }
+      $buf .= file_get_contents($file);
+      switch ($newLine) {
+        case 'auto':
+          if (substr($buf, -1) !== "\n") {
+            $buf .= "\n";
+          }
+          break;
+
+        case 'raw':
+          // Don't
+          break;
+      }
+    }
+    return $buf;
+  }
+
+  ///**
+  // * Atomically dumps content into a file.
+  // *
+  // * @param string $filename The file to be written to
+  // * @param string $content  The data to write into the file
+  // *
+  // * @throws IOException if the file cannot be written to
+  // */
+  //public function write($file, $content) {
+  //    \CCL\dumpFile($file, $content);
+  //}
+
+  ///**
+  // * Copy file(s) to a destination.
+  // *
+  // * This does work with files or directories. However, if you wish to reference a directory, then
+  // * it *must* end with a trailing slash. Ex:
+  // *
+  // * Copy "infile.txt" to "outfile.txt"
+  // *   cp("infile.txt", "outfile.txt");
+  // *
+  // * Copy "myfile.txt" to "out-dir/myfile.txt"
+  // *   cp("myfile.txt", "out-dir/");
+  // *
+  // * Recursively copy "in-dir/*" into "out-dir/"
+  // *   cp("in-dir/*", "out-dir/");
+  // *
+  // * Recursively copy the whole "in-dir/" into "out-dir/deriv/"
+  // *   cp("in-dir/", "out-dir/deriv/");
+  // *
+  // * @param string $srcs
+  // * @param string $dest
+  // */
+  //public function cp($srcs, $dest) {
+  //    $destType = substr($dest, -1) === '/' ? 'D' : 'F';
+  //
+  //    foreach (glob($srcs, MARK) as $src) {
+  //        $srcType = substr($src, -1) === '/' ? 'D' : 'F';
+  //        switch ($srcType . $destType) {
+  //        }
+  //    }
+  //
+  //}
+
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/src/ScssCompiler.php b/civicrm/vendor/civicrm/composer-compile-lib/src/ScssCompiler.php
new file mode 100644
index 0000000000000000000000000000000000000000..e595e9609c5c427b8c2eddcbc34d49d399e5a874
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/src/ScssCompiler.php
@@ -0,0 +1,55 @@
+<?php
+namespace CCL;
+
+class ScssCompiler extends \ScssPhp\ScssPhp\Compiler {
+
+  protected $importPrefixes = [];
+
+  /**
+   * Return the file path for an import url if it exists
+   *
+   * @api
+   *
+   * @param string $url
+   *
+   * @return string|null
+   */
+  public function findImport($url) {
+    $hasExtension = preg_match('/[.]s?css$/', $url);
+    $pickFile = function($path) use ($hasExtension) {
+      $dir = dirname($path);
+      $file = basename($path);
+      if ($hasExtension && file_exists("$dir/_$file")) {
+        return "$dir/_$file";
+      }
+      if ($hasExtension && file_exists("$dir/$file")) {
+        return "$dir/$file";
+      }
+      if (!$hasExtension && file_exists("$dir/_$file.scss")) {
+        return "$dir/_$file.scss";
+      }
+      if (!$hasExtension && file_exists("$dir/$file.scss")) {
+        return "$dir/$file.scss";
+      }
+      return NULL;
+    };
+
+    foreach ($this->importPrefixes as $prefixRegExp => $path) {
+      if (preg_match($prefixRegExp, $url)) {
+        if ($path = $pickFile(preg_replace($prefixRegExp, $path, $url))) {
+          return $path;
+        }
+      }
+    }
+
+    return parent::findImport($url);
+  }
+
+  public function addImportPrefix(string $prefix, string $path) {
+    $this->importPrefixes[';^' . preg_quote($prefix, ';') . ';'] = $path;
+    uasort($this->importPrefixes, function($a, $b) {
+      return strlen($b) - strlen($a);
+    });
+  }
+
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/src/StubsTpl.php b/civicrm/vendor/civicrm/composer-compile-lib/src/StubsTpl.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f89ab42c72528653ad9ab49334df2fac4db6332
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/src/StubsTpl.php
@@ -0,0 +1,176 @@
+<?php
+/**
+ * For every class-method in Symfony `Filesystem` and CCL `Functions`, make a function in CCL namespace.
+ * Write the result to a PHP file.
+ *
+ * NOTE: It's a bit annoying that PHP supports auto-loading of classes but not of functions; this means that
+ * namespaced functions have to be parsed fully (even if they're not going to be used). But if it's
+ * any consolation, we only load the 1-line wrappers.
+ */
+namespace CCL\FsStubsTpl;
+
+use Symfony\Component\Filesystem\Exception\FileNotFoundException;
+use Symfony\Component\Filesystem\Exception\IOException;
+use Symfony\Component\Filesystem\Filesystem;
+
+$outClass = 'CCL';
+$baseClasses = [Filesystem::class => '_sym', \CCL\Functions::class => '_ccl'];
+$useClasses = [IOException::class, FileNotFoundException::class];
+$skipMethods = ['handleError'];
+
+$filterSignature = [];
+$filterSignature['copy'] = function ($sig) {
+    return preg_replace(';\$overwriteNewerFiles = FALSE;i', 'bool $overwriteNewerFiles = TRUE', $sig);
+};
+
+####################################################################################
+## Utilities
+
+/**
+ * Export the value of $v as PHP code.
+ *
+ * @param mixed $v
+ * @return string
+ */
+$export = function ($v) {
+  if ($v === TRUE || $v === FALSE || $v === NULL) {
+    return strtoupper(var_export($v, 1));
+  }
+  if ($v === []) {
+    return '[]';
+  }
+  return var_export($v, 1);
+};
+
+/**
+ * Create a parameter-signature.
+ *
+ * @param \ReflectionParameter[] $params
+ * @return string
+ *   Ex: '$a, $b, $c = 100, $d = true'
+ */
+$formatSignature = function ($name, $params) use ($export, $filterSignature) {
+  $sigs = [];
+  foreach ($params as $param) {
+    /**
+     * @var \ReflectionParameter $param
+     */
+
+    // Note: we don't formally constrain parameter types in here, because that
+    // yields a more stable signature across diff versions of Symfony Filesystem.
+    $sig = '';
+    $sig .= '$' . $param->getName();
+    try {
+        $sig .= ' = ' . $export($param->getDefaultValue(), 1);
+    } catch (\ReflectionException $e) {
+    }
+
+    $sigs[] = $sig;
+  }
+  $sig = implode(', ', $sigs);
+
+  if (isset($filterSignature[$name])) {
+      $sig = call_user_func($filterSignature[$name], $sig);
+  }
+  return $sig;
+};
+
+/**
+ * @param \ReflectionParameter[] $params
+ * @return string
+ */
+$formatPassthru = function ($params) {
+  $passthrus = [];
+  foreach ($params as $param) {
+    /**
+     * @var \ReflectionParameter $param
+     */
+    $passthrus[] = '$' . $param->getName();
+  }
+  return implode(', ', $passthrus);
+};
+
+/**
+ * @param int $spaces
+ *   Number of leading spaces to add (positive) or remove (negative).
+ * @param string $text
+ * @return string
+ */
+$indent = function ($spaces, $text) {
+  $lines = explode("\n", $text);
+  $prefix = str_repeat(' ', abs($spaces));
+  $remove = ($spaces < 0);
+  $spaces = abs($spaces);
+  foreach ($lines as &$line) {
+    if ($remove) {
+      if (substr($line, 0, $spaces) === $prefix) {
+        $line = substr($line, $spaces);
+      }
+    } else {
+      $line = $prefix . $line;
+    }
+  }
+  return implode("\n", $lines);
+};
+
+$formatDocBlock = function ($text) {
+  $prefix = function($line) {
+    return " * $line";
+  };
+
+  return "/" . "**\n" .
+    implode("\n", array_map($prefix, explode("\n", rtrim($text)))) . "\n" .
+    " *" . "/\n";
+};
+
+####################################################################################
+## Main
+
+printf("<" . "?php\n");
+printf("// AUTO-GENERATED VIA %s\n", __FILE__);
+printf("// If this file somehow becomes invalid (eg when patching CCL), you may safely delete and re-run install.\n");
+
+foreach ($useClasses as $useClass) {
+    printf("use %s;\n", $useClass);
+}
+
+printf("\n");
+printf("class %s {\n", $outClass);
+
+foreach ($baseClasses as $baseClass => $singletonFunc) {
+  printf("\n");
+  printf("%s\n", rtrim($indent(2, $formatDocBlock("@return $baseClass"))));
+  printf("  public static function %s() {\n", $singletonFunc);
+  printf("    static \$singleton = NULL;\n");
+  printf("    \$singleton = \$singleton ?: new \\%s();\n", $baseClass);
+  printf("    return \$singleton;\n");
+  printf("  }\n");
+}
+
+foreach ($baseClasses as $baseClass => $singletonFunc) {
+  $c = new \ReflectionClass($baseClass);
+  foreach ($c->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
+    /**
+     * @var \ReflectionMethod $method
+     */
+
+    if (in_array($method->getName(), $skipMethods)) {
+      continue;
+    }
+
+    preg_match(';\n( +);m', $method->getDocComment(), $oldDocSpaces);
+
+    printf("\n");
+    printf("  %s\n", $indent(3 - strlen($oldDocSpaces[1] ?? ''), $method->getDocComment()));
+    printf("  public static function %s(%s) {\n", $method->getName(), $formatSignature($method->getName(), $method->getParameters()));
+    if (preg_match(';@return;', $method->getDocComment())) {
+      printf("    return self::%s()->%s(%s);\n", $singletonFunc, $method->getName(), $formatPassthru($method->getParameters()));
+    } else {
+      printf("    self::%s()->%s(%s);\n", $singletonFunc, $method->getName(), $formatPassthru($method->getParameters()));
+    }
+    printf("  }\n");
+  }
+}
+
+printf("\n");
+printf("}\n");
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/src/Tasks.php b/civicrm/vendor/civicrm/composer-compile-lib/src/Tasks.php
new file mode 100644
index 0000000000000000000000000000000000000000..b0d87188ba803a48061f243d970488a3d910281c
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/src/Tasks.php
@@ -0,0 +1,27 @@
+<?php
+namespace CCL;
+
+/**
+ * Quick-and-dirty task library
+ */
+class Tasks {
+
+  /**
+   * Generate SCSS files.
+   *
+   * @see \CCL\Tasks\Scss::compile
+   */
+  public static function scss(array $tasks) {
+    \CCL\Tasks\Scss::compile($tasks);
+  }
+
+  /**
+   * Generate PHP files using JSON templates.
+   *
+   * @see \CCL\Tasks\Template::compile
+   */
+  public static function template(array $tasks) {
+    \CCL\Tasks\Template::compile($tasks);
+  }
+
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/src/Tasks/Scss.php b/civicrm/vendor/civicrm/composer-compile-lib/src/Tasks/Scss.php
new file mode 100644
index 0000000000000000000000000000000000000000..63f8275acf0d06340de992d817b4848bc6e9401c
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/src/Tasks/Scss.php
@@ -0,0 +1,59 @@
+<?php
+namespace CCL\Tasks;
+
+use CCL\ScssCompiler;
+use tubalmartin\CssMin\Minifier;
+
+class Scss {
+
+  /**
+   * Compile some SCSS file(s).
+   *
+   * @param array $task
+   *   With keys:
+   *   - scss-imports: string[], list of paths with SCSS helper files
+   *   - scss-import-prefixes: array, key-value mapping where keys are "logical file prefixes" and values are file-paths
+   *   - scss-includes: string[], an alias for 'scss-imports'
+   *   - scss-files: array, list of files to generate and their inputs
+   *     Ex: ['generatedFile.css': 'sourceFile.scss']
+   *
+   * @link https://github.com/civicrm/composer-compile-plugin/blob/master/doc/tasks.md
+   */
+  public static function compile(array $task) {
+    $scssCompiler = new ScssCompiler();
+    $includes = $task['scss-imports'] ?? $task['scss-includes'] ?? [];
+    foreach ($includes as $include) {
+      $scssCompiler->addImportPath($include);
+    }
+    $prefixes = $task['scss-import-prefixes'] ?? [];
+    foreach ($prefixes as $prefix => $path) {
+      $scssCompiler->addImportPrefix($prefix, $path);
+    }
+
+    $minifier = new Minifier();
+
+    if (empty($task['scss-files'])) {
+      throw new \InvalidArgumentException("Invalid task: required argument 'scss-files' is missing");
+    }
+    foreach ($task['scss-files'] as $outputFile => $inputFile) {
+      if (!file_exists($inputFile)) {
+        throw new \InvalidArgumentException("File does not exist: " . $inputFile);
+      }
+      $inputScss = file_get_contents($inputFile);
+      $css = $scssCompiler->compile($inputScss);
+      $autoprefixer = new \Padaliyajay\PHPAutoprefixer\Autoprefixer($css);
+
+      if (!file_exists(dirname($outputFile))) {
+        mkdir(dirname($outputFile), 0777, TRUE);
+      }
+
+      $outputCss = $autoprefixer->compile();
+      \CCL::dumpFile($outputFile, $outputCss);
+
+      $outputMinCssFile = preg_replace(';\.css$;', '.min.css', $outputFile);
+      $outputMinCss = $minifier->run($outputCss);
+      \CCL::dumpFile($outputMinCssFile, $outputMinCss);
+    }
+  }
+
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-lib/src/Tasks/Template.php b/civicrm/vendor/civicrm/composer-compile-lib/src/Tasks/Template.php
new file mode 100644
index 0000000000000000000000000000000000000000..4e567412f7c512e927997fd17900d5fa1aad135d
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-lib/src/Tasks/Template.php
@@ -0,0 +1,71 @@
+<?php
+namespace CCL\Tasks;
+
+use CCL\ErrorBuffer;
+use Symfony\Component\Filesystem\Filesystem;
+
+class Template {
+
+  /**
+   * Create PHP code using JSON data and a PHP template.
+   *
+   * @param array $task
+   *   With keys:
+   *   - tpl-file: string, the name of the template file
+   *   - tpl-items: array, list of files to generate
+   *     array(string $fileName => mixed $templateData)
+   *
+   * @link https://github.com/civicrm/composer-compile-plugin/blob/master/doc/tasks.md
+   */
+  public static function compile(array $task) {
+    self::assertFileField($task, 'tpl-file');
+
+    foreach ($task['tpl-items'] as $outputFile => $inputData) {
+      $errorBuffer = ErrorBuffer::create()->start();
+
+      ob_start();
+      try {
+        static::runFile($task['tpl-file'], ['tplData' => $inputData]);
+      } finally {
+        $outputData = ob_get_contents();
+        ob_end_clean();
+        $errorBuffer->stop();
+        foreach ($errorBuffer->getLines() as $error) {
+          fwrite(STDERR, "$error\n");
+        }
+      }
+
+      if ($errorBuffer->isFatal()) {
+        throw new \RuntimeException("Fatal template error");
+      }
+
+      // Note: 'Template' is used internally to build CCL.php, so don't call CCL::dumpFile().
+      (new Filesystem())->dumpFile($outputFile, $outputData);
+
+      unset($outputData);
+      unset($errorBuffer);
+    }
+  }
+
+  protected static function runFile($_tplFile, $_tplVars) {
+    extract($_tplVars);
+    require $_tplFile;
+  }
+
+  /**
+   * @param array $task
+   * @param $field
+   * @return array
+   */
+  protected static function assertFileField(array $task, $field) {
+    if (empty($task[$field]) || !file_exists($task[$field])) {
+      throw new \InvalidArgumentException(sprintf(
+        "Invalid file reference (%s=%s)",
+        $field,
+        $task[$field] ?? 'NULL'
+      ));
+    }
+    return $task;
+  }
+
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/.gitignore b/civicrm/vendor/civicrm/composer-compile-plugin/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..1c80a7d635112b2ab2b96021d974b81a35c5db59
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/.gitignore
@@ -0,0 +1,6 @@
+.php_cs.cache
+/.idea/
+/vendor/
+/tests/pkgs/cherry-yogurt/yogurt.out
+/tests/pkgs/cherry-jam/jam.out
+/tests/pkgs/strawberry-jam/subordinate/jam.out
\ No newline at end of file
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/.phpcs.xml.dist b/civicrm/vendor/civicrm/composer-compile-plugin/.phpcs.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..1b9461b51f90c8ded814e019417dcdda7fa8ec2c
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/.phpcs.xml.dist
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<ruleset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="PHP_CodeSniffer" xsi:noNamespaceSchemaLocation="phpcs.xsd">
+
+  <file>src</file>
+  <file>tests</file>
+
+  <rule ref="PSR12"/>
+  
+  <rule ref="Generic.Files.LineLength">
+    <properties>
+      <property name="lineLimit" value="150"/>
+      <property name="absoluteLineLimit" value="0"/>
+    </properties>
+  </rule>
+
+</ruleset>
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/.travis.yml b/civicrm/vendor/civicrm/composer-compile-plugin/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5c313b4b337861ebba20855bf3372db6858ea447
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/.travis.yml
@@ -0,0 +1,33 @@
+language: php
+
+sudo: false
+
+cache:
+  directories:
+    - $HOME/.composer/cache/files
+    - $HOME/.cache/phar
+
+matrix:
+  include:
+    - os: linux
+      dist: xenial
+      php: 7.1
+      env: COMPOSER_VERSION=--1
+    - os: linux
+      dist: xenial
+      php: 7.1
+      env: COMPOSER_VERSION=--snapshot
+    - os: linux
+      dist: xenial
+      php: 7.4
+      env: COMPOSER_VERSION=--snapshot
+    - os: osx
+      osx_image: xcode12
+      language: generic
+      env: COMPOSER_VERSION=--1
+
+before_script:
+  - ./scripts/travis-ci.sh before_script
+
+script:
+  - ./scripts/travis-ci.sh script
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/LICENSE b/civicrm/vendor/civicrm/composer-compile-plugin/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..176292186f0534c3a93076c1c90851bf96601a09
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/LICENSE
@@ -0,0 +1,19 @@
+(c) 2020 CiviCRM LLC, Tim Otten <info@civicrm.org>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/README.md b/civicrm/vendor/civicrm/composer-compile-plugin/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f4386602d2409b7fae08fd4f01f2492d342ed041
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/README.md
@@ -0,0 +1,35 @@
+# Composer Compile Plugin [![Build Status](https://travis-ci.com/civicrm/composer-compile-plugin.svg?branch=master)](https://travis-ci.com/civicrm/composer-compile-plugin)
+
+The "Compile" plugin enables developers of PHP libraries to define free-form "compilation" tasks, such as:
+
+* Converting SCSS to CSS
+* Generating PHP wrappers based on an XML schema
+
+For PHP site-builders who use these libraries, the compilation process is a seamless part of the regular download (`composer install`, etc). 
+
+Tasks may be defined in several ways, such as:
+
+* Shell command (`@sh cat file-{1,2,3} > big-file`)
+* PHP method (`@php-method MyBuilder::build`)
+* PHP eval (`@php-eval file_put_contents('big-file', make_big_file());`)
+* PHP script file (`@php-script my-script.php`)
+* Composer subcommand (`@composer dump-autoload`)
+
+Features:
+
+* Easy to enable. No manual configuration for downstream site-builders. Framework agnostic.
+* Plays well with other `composer` tooling, like [forked repositories](https://matthewsetter.com/series/tooling/composer/forked-repositories/), [composer-patches](https://github.com/cweagans/composer-patches), [composer-locator](https://github.com/mindplay-dk/composer-locator), and [composer-downloads](https://github.com/civicrm/composer-downloads-plugin).
+* Allows library repos to remain "clean" without committing build artifacts.
+* Runs locally in PHP. Does not require external/hosted services or additional interpreters.
+* Supports file monitoring for automatic rebuilds (`composer compile:watch`)
+* Enforces permission model to address historical concerns about `composer` hooks and untrusted libraries.
+* Integration-tests pass on both `composer` v1.10 and v2.0-dev (*at time of writing*).
+
+The plugin is currently in version `0.x`. The integration-tests are passing, and it seems to be working for the original need, but it's also new and hasn't seen wide-spread testing yet.
+
+## More information
+
+* [doc/site-build.md](doc/site-build.md): Managing the root package (for site-builders)
+* [doc/tasks.md](doc/tasks.md): Working with tasks (for library developers)
+* [doc/evaluation.md](doc/evaluation.md): Evaluate and compare against similar options
+* [doc/develop.md](doc/develop.md): How to work with `composer-compile-plugin.git` (for plugin-development)
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/composer.json b/civicrm/vendor/civicrm/composer-compile-plugin/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..2865c9d7f2bbf4ef8bbb300db41b6925e9425b9a
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/composer.json
@@ -0,0 +1,39 @@
+{
+    "name": "civicrm/composer-compile-plugin",
+    "description": "Define a 'compile' event for all packages in the dependency-graph",
+    "type": "composer-plugin",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Tim Otten",
+            "email": "info@civicrm.org"
+        }
+    ],
+    "config": {
+        "platform": {
+            "php": "7.1"
+        }
+    },
+    "require": {
+        "composer-plugin-api": "^1.1 || ^2.0",
+        "php": ">=7.1",
+        "totten/lurkerlite": "^1.3"
+    },
+    "require-dev": {
+        "composer/composer": "~1.0",
+        "totten/process-helper": "^1.0.1"
+    },
+    "autoload": {
+        "psr-4": {
+            "Civi\\CompilePlugin\\": "src/"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Civi\\CompilePlugin\\Tests\\": "tests/"
+        }
+    },
+    "extra": {
+        "class": "Civi\\CompilePlugin\\CompilePlugin"
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/composer.lock b/civicrm/vendor/civicrm/composer-compile-plugin/composer.lock
new file mode 100644
index 0000000000000000000000000000000000000000..7897b3318ab0b28efa85b61e19903dcca3390156
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/composer.lock
@@ -0,0 +1,1208 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "8368a6e750dfc72262db6123cdfe965d",
+    "packages": [
+        {
+            "name": "totten/lurkerlite",
+            "version": "1.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/totten/Lurker.git",
+                "reference": "a20c47142b486415b9117c76aa4c2117ff95b49a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/totten/Lurker/zipball/a20c47142b486415b9117c76aa4c2117ff95b49a",
+                "reference": "a20c47142b486415b9117c76aa4c2117ff95b49a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "replace": {
+                "henrikbjorn/lurker": "*"
+            },
+            "suggest": {
+                "ext-inotify": ">=0.1.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Lurker": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com"
+                },
+                {
+                    "name": "Yaroslav Kiliba",
+                    "email": "om.dattaya@gmail.com"
+                },
+                {
+                    "name": "Henrik Bjrnskov",
+                    "email": "henrik@bjrnskov.dk"
+                }
+            ],
+            "description": "Resource Watcher - Lightweight edition of henrikbjorn/lurker with no dependencies",
+            "keywords": [
+                "filesystem",
+                "resource",
+                "watching"
+            ],
+            "time": "2020-09-01T10:01:01+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "composer/ca-bundle",
+            "version": "1.2.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/ca-bundle.git",
+                "reference": "8a7ecad675253e4654ea05505233285377405215"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215",
+                "reference": "8a7ecad675253e4654ea05505233285377405215",
+                "shasum": ""
+            },
+            "require": {
+                "ext-openssl": "*",
+                "ext-pcre": "*",
+                "php": "^5.3.2 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
+                "psr/log": "^1.0",
+                "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\CaBundle\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
+            "keywords": [
+                "cabundle",
+                "cacert",
+                "certificate",
+                "ssl",
+                "tls"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-23T12:54:47+00:00"
+        },
+        {
+            "name": "composer/composer",
+            "version": "1.10.13",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/composer.git",
+                "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/composer/zipball/47c841ba3b2d3fc0b4b13282cf029ea18b66d78b",
+                "reference": "47c841ba3b2d3fc0b4b13282cf029ea18b66d78b",
+                "shasum": ""
+            },
+            "require": {
+                "composer/ca-bundle": "^1.0",
+                "composer/semver": "^1.0",
+                "composer/spdx-licenses": "^1.2",
+                "composer/xdebug-handler": "^1.1",
+                "justinrainbow/json-schema": "^5.2.10",
+                "php": "^5.3.2 || ^7.0",
+                "psr/log": "^1.0",
+                "seld/jsonlint": "^1.4",
+                "seld/phar-utils": "^1.0",
+                "symfony/console": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+                "symfony/filesystem": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+                "symfony/finder": "^2.7 || ^3.0 || ^4.0 || ^5.0",
+                "symfony/process": "^2.7 || ^3.0 || ^4.0 || ^5.0"
+            },
+            "conflict": {
+                "symfony/console": "2.8.38"
+            },
+            "require-dev": {
+                "phpspec/prophecy": "^1.10",
+                "symfony/phpunit-bridge": "^4.2"
+            },
+            "suggest": {
+                "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
+                "ext-zip": "Enabling the zip extension allows you to unzip archives",
+                "ext-zlib": "Allow gzip compression of HTTP requests"
+            },
+            "bin": [
+                "bin/composer"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.10-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\": "src/Composer"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.",
+            "homepage": "https://getcomposer.org/",
+            "keywords": [
+                "autoload",
+                "dependency",
+                "package"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-09-09T09:46:34+00:00"
+        },
+        {
+            "name": "composer/semver",
+            "version": "1.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/semver.git",
+                "reference": "114f819054a2ea7db03287f5efb757e2af6e4079"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/semver/zipball/114f819054a2ea7db03287f5efb757e2af6e4079",
+                "reference": "114f819054a2ea7db03287f5efb757e2af6e4079",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.5 || ^5.0.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Semver\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@gmail.com",
+                    "homepage": "http://robbast.nl"
+                }
+            ],
+            "description": "Semver library that offers utilities, version constraint parsing and validation.",
+            "keywords": [
+                "semantic",
+                "semver",
+                "validation",
+                "versioning"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-09-09T09:34:06+00:00"
+        },
+        {
+            "name": "composer/spdx-licenses",
+            "version": "1.5.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/spdx-licenses.git",
+                "reference": "6946f785871e2314c60b4524851f3702ea4f2223"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/6946f785871e2314c60b4524851f3702ea4f2223",
+                "reference": "6946f785871e2314c60b4524851f3702ea4f2223",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 7"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Composer\\Spdx\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@naderman.de",
+                    "homepage": "http://www.naderman.de"
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@gmail.com",
+                    "homepage": "http://robbast.nl"
+                }
+            ],
+            "description": "SPDX licenses list and validation library.",
+            "keywords": [
+                "license",
+                "spdx",
+                "validator"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-07-15T15:35:07+00:00"
+        },
+        {
+            "name": "composer/xdebug-handler",
+            "version": "1.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/composer/xdebug-handler.git",
+                "reference": "ebd27a9866ae8254e873866f795491f02418c5a5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ebd27a9866ae8254e873866f795491f02418c5a5",
+                "reference": "ebd27a9866ae8254e873866f795491f02418c5a5",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.2 || ^7.0 || ^8.0",
+                "psr/log": "^1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Composer\\XdebugHandler\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "John Stevenson",
+                    "email": "john-stevenson@blueyonder.co.uk"
+                }
+            ],
+            "description": "Restarts a process without Xdebug.",
+            "keywords": [
+                "Xdebug",
+                "performance"
+            ],
+            "funding": [
+                {
+                    "url": "https://packagist.com",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/composer",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-19T10:27:58+00:00"
+        },
+        {
+            "name": "justinrainbow/json-schema",
+            "version": "5.2.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/justinrainbow/json-schema.git",
+                "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
+                "reference": "2ba9c8c862ecd5510ed16c6340aa9f6eadb4f31b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
+                "json-schema/json-schema-test-suite": "1.2.0",
+                "phpunit/phpunit": "^4.8.35"
+            },
+            "bin": [
+                "bin/validate-json"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "JsonSchema\\": "src/JsonSchema/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bruno Prieto Reis",
+                    "email": "bruno.p.reis@gmail.com"
+                },
+                {
+                    "name": "Justin Rainbow",
+                    "email": "justin.rainbow@gmail.com"
+                },
+                {
+                    "name": "Igor Wiedler",
+                    "email": "igor@wiedler.ch"
+                },
+                {
+                    "name": "Robert Schönthal",
+                    "email": "seroscho@googlemail.com"
+                }
+            ],
+            "description": "A library to validate a json schema.",
+            "homepage": "https://github.com/justinrainbow/json-schema",
+            "keywords": [
+                "json",
+                "schema"
+            ],
+            "time": "2020-05-27T16:41:55+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.1.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+                "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2020-03-23T09:12:05+00:00"
+        },
+        {
+            "name": "seld/jsonlint",
+            "version": "1.8.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/jsonlint.git",
+                "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/590cfec960b77fd55e39b7d9246659e95dd6d337",
+                "reference": "590cfec960b77fd55e39b7d9246659e95dd6d337",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3 || ^7.0 || ^8.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+            },
+            "bin": [
+                "bin/jsonlint"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "JSON Linter",
+            "keywords": [
+                "json",
+                "linter",
+                "parser",
+                "validator"
+            ],
+            "funding": [
+                {
+                    "url": "https://github.com/Seldaek",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-25T06:56:57+00:00"
+        },
+        {
+            "name": "seld/phar-utils",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/phar-utils.git",
+                "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/8674b1d84ffb47cc59a101f5d5a3b61e87d23796",
+                "reference": "8674b1d84ffb47cc59a101f5d5a3b61e87d23796",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Seld\\PharUtils\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be"
+                }
+            ],
+            "description": "PHAR file format utilities, for when PHP phars you up",
+            "keywords": [
+                "phar"
+            ],
+            "time": "2020-07-07T18:42:57+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v3.4.44",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "71da881ad579f0cd66aef8677e4cf6217d8ecd0c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/71da881ad579f0cd66aef8677e4cf6217d8ecd0c",
+                "reference": "71da881ad579f0cd66aef8677e4cf6217d8ecd0c",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "symfony/debug": "~2.8|~3.0|~4.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<3.4",
+                "symfony/process": "<3.3"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~3.3|~4.0",
+                "symfony/dependency-injection": "~3.4|~4.0",
+                "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
+                "symfony/lock": "~3.4|~4.0",
+                "symfony/process": "~3.3|~4.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/lock": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Console Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-09T08:16:57+00:00"
+        },
+        {
+            "name": "symfony/debug",
+            "version": "v3.4.44",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/debug.git",
+                "reference": "0893a0b07c499a1530614d65869ea6a7b1b8a164"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/0893a0b07c499a1530614d65869ea6a7b1b8a164",
+                "reference": "0893a0b07c499a1530614d65869ea6a7b1b8a164",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "psr/log": "~1.0"
+            },
+            "conflict": {
+                "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+            },
+            "require-dev": {
+                "symfony/http-kernel": "~2.8|~3.0|~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Debug\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Debug Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-09T08:13:48+00:00"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v3.4.44",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git",
+                "reference": "8e6eff546d0fe879996fa701ee2f312767e95e50"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/8e6eff546d0fe879996fa701ee2f312767e95e50",
+                "reference": "8e6eff546d0fe879996fa701ee2f312767e95e50",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8",
+                "symfony/polyfill-ctype": "~1.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Filesystem Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-08-21T12:53:49+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v3.4.44",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "5ec813ccafa8164ef21757e8c725d3a57da59200"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/5ec813ccafa8164ef21757e8c725d3a57da59200",
+                "reference": "5ec813ccafa8164ef21757e8c725d3a57da59200",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Finder Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-02-14T07:34:21+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.18.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "1c302646f6efc070cd46856e600e5e0684d6b454"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454",
+                "reference": "1c302646f6efc070cd46856e600e5e0684d6b454",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.18-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Ctype\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gert de Pagter",
+                    "email": "BackEndTea@gmail.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-07-14T12:35:20+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.18.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a",
+                "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.18-dev"
+                },
+                "thanks": {
+                    "name": "symfony/polyfill",
+                    "url": "https://github.com/symfony/polyfill"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-07-14T12:35:20+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v3.4.44",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "af8d812d75fcdf2eae30928b42396fe17df137e4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/af8d812d75fcdf2eae30928b42396fe17df137e4",
+                "reference": "af8d812d75fcdf2eae30928b42396fe17df137e4",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.5.9|>=7.0.8"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Process\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Process Component",
+            "homepage": "https://symfony.com",
+            "funding": [
+                {
+                    "url": "https://symfony.com/sponsor",
+                    "type": "custom"
+                },
+                {
+                    "url": "https://github.com/fabpot",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-07-16T09:41:49+00:00"
+        },
+        {
+            "name": "totten/process-helper",
+            "version": "v1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/totten/process-helper.git",
+                "reference": "4cd78744c60ca8fff3a1a1e453e53a8e099d9c4e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/totten/process-helper/zipball/4cd78744c60ca8fff3a1a1e453e53a8e099d9c4e",
+                "reference": "4cd78744c60ca8fff3a1a1e453e53a8e099d9c4e",
+                "shasum": ""
+            },
+            "require": {
+                "symfony/process": "^2.0 || ^3.0 || ^4.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "ProcessHelper\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Tim Otten",
+                    "email": "totten@civicrm.org"
+                }
+            ],
+            "description": "Some quick sugar for working with Symfony Process",
+            "time": "2019-08-09T07:44:46+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "composer-plugin-api": "^1.1 || ^2.0",
+        "php": ">=7.1"
+    },
+    "platform-dev": [],
+    "platform-overrides": {
+        "php": "7.1"
+    },
+    "plugin-api-version": "1.1.0"
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/phpunit.xml b/civicrm/vendor/civicrm/composer-compile-plugin/phpunit.xml
new file mode 100644
index 0000000000000000000000000000000000000000..13e0c849414fb195205b8b2c1d8d035087f16e5a
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/phpunit.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit colors="true" bootstrap="vendor/autoload.php" defaultTestSuite="Plugin">
+
+    <testsuites>
+        <testsuite name="Plugin">
+            <directory>tests</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./src/*/</directory>
+        </whitelist>
+    </filter>
+
+</phpunit>
\ No newline at end of file
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/scripts/travis-ci.sh b/civicrm/vendor/civicrm/composer-compile-plugin/scripts/travis-ci.sh
new file mode 100755
index 0000000000000000000000000000000000000000..92b62436b0d77ac755fdd6322b855142c066a5d2
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/scripts/travis-ci.sh
@@ -0,0 +1,77 @@
+#!/bin/bash
+set -e
+
+PHAR_CACHE="$HOME/.cache/phar"
+PHAR_BIN="$HOME/.local/phar"
+PATH="$PHAR_BIN:$PATH"
+
+export PATH
+
+##########################################################################
+## Utilities
+
+function phar_inst() {
+  local prog="$1"
+  local url="$2"
+  local md5="$3"
+  local cachefile="$PHAR_CACHE/$prog"
+  local minsize=250000
+  local binfile="$PHAR_BIN/$prog"
+
+  mkdir -p "$PHAR_CACHE" "$PHAR_BIN"
+
+  echo "[[ Setup PHAR: $prog ($url) ]]"
+
+  if [ -f "$cachefile" ]; then
+    if echo "$md5 $cachefile" | md5sum -c ; then
+      echo "- Found cache: $cachefile"
+    else
+      echo "- Found bad cache: $cachefile"
+      rm -f "$cachefile"
+    fi
+  fi
+
+  if [ ! -f "$cachefile" ]; then
+    echo "- Download to cache: $cachefile"
+    curl -sSfL -o "$cachefile" "$url"
+    chmod 755 "$cachefile"
+  fi
+
+  echo "- Install: $binfile"
+  cp -f "$cachefile" "$binfile"
+
+  local activefile=$( which $prog )
+  echo "- Active file: $activefile"
+}
+
+##########################################################################
+## Main
+
+case "$1" in
+
+  before_script)
+    phar_inst phpunit https://phar.phpunit.de/phpunit-6.5.14.phar 7ff9eeb835864152d7e0d2c7ce50e55d
+    phar_inst composer https://getcomposer.org/download/1.10.13/composer.phar 56f13c034e5e0c58de35b77cbd0f1b0b
+
+    echo "[[ Switch composer ]]"
+    composer self-update $COMPOSER_VERSION
+
+    echo "[[ Run 'composer install' ]]"
+    composer install --no-progress --no-interaction
+    ;;
+
+  script)
+    echo "[[ Run phpunit ]]"
+    phpunit
+    ;;
+
+  all)
+    "$0" before_script
+    "$0" script
+    ;;
+
+  *)
+    echo "usage: $0 before_script|script|all"
+    ;;
+
+esac
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Command/CompileCommand.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Command/CompileCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..aec23a5aa47632f5d899b2dddd5ca494f49d6e0c
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Command/CompileCommand.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Civi\CompilePlugin\Command;
+
+use Civi\CompilePlugin\TaskList;
+use Civi\CompilePlugin\TaskRunner;
+use Composer\Script\ScriptEvents;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class CompileCommand extends \Composer\Command\BaseCommand
+{
+
+    protected function configure()
+    {
+        parent::configure();
+
+        $this
+          ->setName('compile')
+          ->setDescription('Run compilation tasks')
+          ->addOption('all', null, InputOption::VALUE_NONE, 'Run all tasks, regardless of configuration')
+          ->addOption('dry-run', 'N', InputOption::VALUE_NONE, 'Dry-run: Print a list of steps to be run')
+          ->addOption('soft-options', null, InputOption::VALUE_OPTIONAL, '(Internal)')
+          ->addArgument('filterExpr', InputArgument::IS_ARRAY, 'Optional filter to match. Ex: \'vendor/package\' or \'vendor/package:id\'')
+          ->setHelp(
+              "Run compilation steps in all packages\n" .
+              "\n" .
+              "If no filterExpr is given, then it will execute based on the current\n" .
+              "configuration (per composer.json and environment-variables)."
+          )
+        ;
+    }
+
+    protected function initialize(
+        InputInterface $input,
+        OutputInterface $output
+    ) {
+        $so = $input->getOption('soft-options');
+        if ($so) {
+            $json = json_decode(base64_decode($so), 1);
+            foreach ($json['o'] ?? [] as $key => $value) {
+                if ($input->hasOption($key)) {
+                    $input->setOption($key, $value);
+                }
+            }
+        }
+
+        parent::initialize($input, $output);
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        if ($output->isVerbose()) {
+            putenv('COMPOSER_COMPILE_PASSTHRU=always');
+        }
+
+        $taskList = new TaskList($this->getComposer(), $this->getIO());
+        $taskList->load()->validateAll();
+
+        $taskRunner = new TaskRunner($this->getComposer(), $this->getIO());
+        $filters = $input->getArgument('filterExpr');
+        if ($input->getOption('all') && !empty($filters)) {
+            throw new \InvalidArgumentException("The --all option does not accept filters.");
+        } elseif ($input->getOption('all')) {
+            $taskRunner->run($taskList->getAll(), $input->getOption('dry-run'));
+        } elseif (!empty($filters)) {
+            $tasks = $taskList->getByFilters($filters);
+            $taskRunner->run(
+                $tasks,
+                $input->getOption('dry-run')
+            );
+        } else {
+            $taskRunner->runDefault($taskList, $input->getOption('dry-run'));
+        }
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Command/CompileListCommand.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Command/CompileListCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..fe2c365ca1d27170366adba532cf9e943f119436
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Command/CompileListCommand.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Civi\CompilePlugin\Command;
+
+use Civi\CompilePlugin\TaskList;
+use Civi\CompilePlugin\TaskRunner;
+use Civi\CompilePlugin\Util\TaskUIHelper;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class CompileListCommand extends \Composer\Command\BaseCommand
+{
+
+    protected function configure()
+    {
+        parent::configure();
+
+        $this
+          ->setName('compile:list')
+          ->setDescription('Print list of compilation tasks')
+          ->addOption('json', null, InputOption::VALUE_NONE, 'Report tasks in JSON format')
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $taskList = new TaskList($this->getComposer(), $this->getIO());
+        $taskList->load();
+
+        $taskRunner = new TaskRunner($this->getComposer(), $this->getIO());
+        $tasks = $taskRunner->sortTasks($taskList->getAll());
+
+        if ($input->getOption('json')) {
+            $output->writeln(json_encode($tasks), OutputInterface::OUTPUT_RAW);
+        } elseif ($output->isVerbose()) {
+            // TODO: Can we get Symfony Dumper to make this pretty?
+            $output->writeln(
+                json_encode($tasks, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES),
+                OutputInterface::OUTPUT_RAW
+            );
+        } else {
+            $output->write(TaskUIHelper::formatTaskTable($tasks, ['active', 'id', 'title', 'action']));
+        }
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Command/CompileWatchCommand.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Command/CompileWatchCommand.php
new file mode 100644
index 0000000000000000000000000000000000000000..99ec6226e5ff3141f52148b8c5117ce380c041c2
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Command/CompileWatchCommand.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace Civi\CompilePlugin\Command;
+
+use Civi\CompilePlugin\Task;
+use Civi\CompilePlugin\TaskList;
+use Civi\CompilePlugin\Util\ShellRunner;
+use Composer\EventDispatcher\ScriptExecutionException;
+use Lurker\ResourceWatcher;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class CompileWatchCommand extends \Composer\Command\BaseCommand
+{
+
+    protected function configure()
+    {
+        parent::configure();
+
+        $this
+          ->setName('compile:watch')
+          ->setDescription('Watch source tree for changes. Compile automatically')
+          ->addOption('dry-run', 'N', InputOption::VALUE_NONE, 'Dry-run: Print a list of steps to be run')
+          ->addOption('interval', null, InputOption::VALUE_REQUIRED, 'How frequently to check for changes (milliseconds)', 1000)
+        ;
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        if ($output->isVerbose()) {
+            putenv('COMPOSER_COMPILE_PASSTHRU=always');
+        }
+
+        $intervalMicroseconds = 1000 * $input->getOption('interval');
+        $watcher = $taskList = null;
+        $stale = true;
+        $firstRun = true;
+
+        while (true) {
+            if ($stale) {
+                if ($firstRun) {
+                    $output->writeln("<info>Load compilation tasks</info>");
+                } else {
+                    $output->writeln("<info>Reload compilation tasks</info>");
+                    // Ensure any previous instances destruct first. (Ex: Cleanup inotify)
+                    unset($watcher);
+                    $this->resetComposer();
+                }
+
+                $oldTaskList = $taskList;
+                $taskList = new TaskList($this->getComposer(), $this->getIO());
+                $taskList->load()->validateAll();
+
+                $output->writeln(sprintf("Found <comment>%d</comment> task(s)", count($taskList->getAll())));
+
+                if ($oldTaskList === null) {
+                    $output->writeln("<info>Perform initial build</info>");
+                    $this->runCompile($input, $output);
+                } else {
+                    $changedTasks = $this->findChangedTasks($oldTaskList, $taskList);
+                    if ($changedTasks) {
+                        $output->writeln("<info>Run new or modified tasks</info>");
+                        foreach ($changedTasks as $taskId => $task) {
+                            $this->runCompile($input, $output, $taskId);
+                        }
+                    } else {
+                        $output->writeln("<info>No changed tasks</info>");
+                    }
+                    $oldTaskList = null;
+                }
+
+                $output->writeln("<info>Watch for updates</info>");
+                $watcher = new ResourceWatcher();
+                $addWatch = function ($logicalId, $filename, $callback) use ($watcher, $output) {
+                    if (strpos($filename, getcwd() . '/') === 0) {
+                        $filename = substr($filename, strlen(getcwd()) + 1);
+                    }
+                    $trackingId = $logicalId . ':' . md5($filename);
+                    $output->writeln("<comment>$logicalId</comment>: $filename", OutputInterface::VERBOSITY_VERY_VERBOSE);
+                    $watcher->track($trackingId, $filename);
+                    $watcher->addListener($trackingId, $callback);
+                };
+                $onTaskListChange = function () use (&$stale) {
+                    $stale = true;
+                };
+                foreach ($taskList->getSourceFiles() as $sourceFile) {
+                    if (file_exists($sourceFile)) {
+                        $addWatch('taskList', $sourceFile, $onTaskListChange);
+                    }
+                }
+
+                foreach ($taskList->getAll() as $task) {
+                    /** @var Task $task */
+                    $onChangeTask = function ($e) use ($input, $output, $task) {
+                        $this->runCompile($input, $output, $task->id);
+                    };
+                    foreach ($task->watchFiles ?? [] as $watch) {
+                        $addWatch($task->id, $task->pwd . '/' . $watch, $onChangeTask);
+                    }
+                }
+
+                $stale = false;
+                $firstRun = false;
+            }
+            // CONSIDER: Perhaps it would be better to restart a PHP subprocess everytime configuration changes?
+            // This would be more robust if, eg, the downloaded PHP code changes?
+
+            $output->writeln("Polling", OutputInterface::VERBOSITY_VERY_VERBOSE);
+            $watcher->start($intervalMicroseconds, $intervalMicroseconds);
+        }
+    }
+
+    /**
+     * Execute a subprocess with the 'composer compile' command.
+     *
+     * @param \Symfony\Component\Console\Input\InputInterface $input
+     * @param \Symfony\Component\Console\Output\OutputInterface $output
+     * @param string|null $filterExpr
+     *   Optional filter expression to pass to the subcommand.
+     *   Ex: 'vendor/package:123'
+     */
+    protected function runCompile(InputInterface $input, OutputInterface $output, $filterExpr = null)
+    {
+        // Note: It is important to run compilation tasks in a subprocess to
+        // ensure that (eg) `callback`s run with the latest code.
+
+        $start = microtime(1);
+        $output->writeln(sprintf("<info>Started at <comment>%s</comment></info>", date('Y-m-d H:i:s', (int)$start)));
+
+        $cmd = '@composer compile';
+        if ($input->getOption('dry-run')) {
+            $cmd .= ' --dry-run';
+        }
+        if ($input->getOption('ansi')) {
+            $cmd .= ' --ansi';
+        }
+        if ($filterExpr) {
+            $cmd .= ' ' . escapeshellarg($filterExpr);
+        }
+        try {
+            $r = new ShellRunner($this->getComposer(), $this->getIO());
+            $r->run($cmd);
+        } catch (ScriptExecutionException $e) {
+            $this->getIO()->writeError('<error>Compilation failed</error>');
+        } finally {
+            $end = microtime(1);
+            $output->writeln(sprintf(
+                "<info>Finished at <comment>%s</comment> (<comment>%.3f</comment> seconds)</info>",
+                date('Y-m-d H:i:s', $start),
+                $end - $start
+            ));
+        }
+    }
+
+    protected function findChangedTasks(TaskList $oldTaskList, TaskList $newTaskList)
+    {
+        $export = function (Task $task) {
+            $d = $task->definition;
+            ksort($d);
+            return $d;
+        };
+        $tasks = [];
+        $old = $oldTaskList->getAll();
+        foreach ($newTaskList->getAll() as $id => $newTask) {
+            if (!isset($old[$id]) || $export($old[$id]) != $export($newTask)) {
+                $tasks[$id] = $newTask;
+            }
+        }
+        return $tasks;
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/CommandProvider.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/CommandProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e2ac50767505e13ff1f888fc33e4129d5c0a446
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/CommandProvider.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Civi\CompilePlugin;
+
+use Civi\CompilePlugin\Command\CompileCommand;
+use Civi\CompilePlugin\Command\CompileListCommand;
+use Civi\CompilePlugin\Command\CompileWatchCommand;
+
+class CommandProvider implements \Composer\Plugin\Capability\CommandProvider
+{
+
+    public function getCommands()
+    {
+        return [
+            new CompileCommand(),
+            new CompileListCommand(),
+            new CompileWatchCommand(),
+        ];
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/CompilePlugin.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/CompilePlugin.php
new file mode 100644
index 0000000000000000000000000000000000000000..0a1f3a937ecbdedbd125d983f03e7f4559f80dd1
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/CompilePlugin.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace Civi\CompilePlugin;
+
+use Civi\CompilePlugin\Command\CompileListCommand;
+use Civi\CompilePlugin\Event\CompileEvents;
+use Civi\CompilePlugin\Subscriber\OldTaskAdapter;
+use Civi\CompilePlugin\Subscriber\ShellSubscriber;
+use Civi\CompilePlugin\Util\ComposerPassthru;
+use Civi\CompilePlugin\Util\TaskUIHelper;
+use Composer\Composer;
+use Composer\EventDispatcher\EventSubscriberInterface;
+use Composer\IO\IOInterface;
+use Composer\Plugin\Capable;
+use Composer\Plugin\PluginInterface;
+use Composer\Script\Event;
+use Composer\Script\ScriptEvents;
+
+class CompilePlugin implements PluginInterface, EventSubscriberInterface, Capable
+{
+
+    /**
+     * @var \Composer\Composer
+     */
+    private $composer;
+
+    /**
+     * @var \Composer\IO\IOInterface
+     */
+    private $io;
+
+    /**
+     * @var EventSubscriberInterface[]
+     */
+    private $extraSubscribers;
+
+    public static function getSubscribedEvents()
+    {
+        return [
+            ScriptEvents::PRE_INSTALL_CMD => ['validateMode', -5],
+            ScriptEvents::PRE_UPDATE_CMD => ['validateMode', -5],
+            ScriptEvents::POST_INSTALL_CMD => ['runTasks', -5],
+            ScriptEvents::POST_UPDATE_CMD => ['runTasks', -5],
+        ];
+    }
+
+    public function getCapabilities()
+    {
+        return [
+            'Composer\Plugin\Capability\CommandProvider' => CommandProvider::class,
+        ];
+    }
+
+    public function activate(Composer $composer, IOInterface $io)
+    {
+        $this->composer = $composer;
+        $this->io = $io;
+        $dispatch = $composer->getEventDispatcher();
+        $this->extraSubscribers = [
+            'oldTask' => new OldTaskAdapter(),
+        ];
+        foreach ($this->extraSubscribers as $subscriber) {
+            $dispatch->addSubscriber($subscriber);
+        }
+    }
+
+    public function deactivate(Composer $composer, IOInterface $io)
+    {
+        // NOTE: This method is only valid on composer v2.
+        $dispatch = $composer->getEventDispatcher();
+        // This looks asymmetrical, but the meaning: "remove all listeners which involve the given object".
+        foreach ($this->extraSubscribers as $subscriber) {
+            $dispatch->removeListener($subscriber);
+        }
+        $this->extraSubscribers = null;
+    }
+
+    public function uninstall(Composer $composer, IOInterface $io)
+    {
+        // NOTE: This method is only valid on composer v2.
+    }
+
+    /**
+     * The "prompt" compilation mode only makes sense with interactive usage.
+     */
+    public function validateMode(Event $event)
+    {
+        if (!class_exists('Civi\CompilePlugin\TaskRunner')) {
+            // Likely a problem in composer v1 uninstall process?
+            return;
+        }
+        $taskRunner = new TaskRunner($this->composer, $this->io);
+        if ($taskRunner->getMode() === 'prompt' && !$this->io->isInteractive()) {
+            $this->io->write(file_get_contents(__DIR__ . '/messages/cannot-prompt.txt'));
+        }
+    }
+
+    public function runTasks(Event $event)
+    {
+        $io = $event->getIO();
+
+        if (!class_exists('Civi\CompilePlugin\TaskList')) {
+            // Likely a problem in composer v1 uninstall process?
+            $io->write("<warning>Skip CompilePlugin::runTasks. Environment does not appear well-formed.</warning>");
+            return;
+        }
+
+        // We need to propagate some of our process's options to the subprocess...
+
+        // The "soft" options should be safer for passing options between different versions.
+        // The "soft" options will be used if recognized by the recipient, and ignored otherwise.
+        // Ex: $soft['o']['dry-run'] = true;
+        $soft = [];
+        $softEsc = $soft ? '--soft-options=' . escapeshellarg(base64_encode(json_encode($soft))) : '';
+
+        $runner = new ComposerPassthru($event->getComposer(), $io);
+        $runner->run("@composer compile $softEsc");
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Event/CompileEvents.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Event/CompileEvents.php
new file mode 100644
index 0000000000000000000000000000000000000000..1582f55583aaae79e470d12687b27b64ec689099
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Event/CompileEvents.php
@@ -0,0 +1,32 @@
+<?php
+namespace Civi\CompilePlugin\Event;
+
+class CompileEvents
+{
+
+    /**
+     * The PRE_COMPILE_LIST event occurs before parsing the task-list. This allows
+     * other plugins to inspect and modify the raw 'taskDefinitions'.
+     *
+     * @see CompileListEvent
+     */
+    const PRE_COMPILE_LIST = 'pre-compile-list';
+
+    /**
+     * The POST_COMPILE_LIST event occurs after parsing the task-list. This allows
+     * other plugins to inspect and modify the parsed 'tasks'.
+     *
+     * @see CompileListEvent
+     */
+    const POST_COMPILE_LIST = 'post-compile-list';
+
+    /**
+     * The PRE_COMPILE_TASK event occurs before executing a specific task.
+     */
+    const PRE_COMPILE_TASK = 'pre-compile-task';
+
+    /**
+     * The POST_COMPILE_TASK event occurs before executing a specific task.
+     */
+    const POST_COMPILE_TASK = 'post-compile-task';
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Event/CompileListEvent.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Event/CompileListEvent.php
new file mode 100644
index 0000000000000000000000000000000000000000..c51b96e88ee92b55ff6ff44a8384a80cb0df7c6c
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Event/CompileListEvent.php
@@ -0,0 +1,118 @@
+<?php
+
+namespace Civi\CompilePlugin\Event;
+
+use Civi\CompilePlugin\Task;
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+
+class CompileListEvent extends \Composer\EventDispatcher\Event
+{
+
+    /**
+     * @var IOInterface
+     */
+    private $io;
+
+    /**
+     * @var Composer
+     */
+    private $composer;
+
+    /**
+     * @var PackageInterface
+     */
+    private $package;
+
+    /**
+     * @var array
+     */
+    private $tasksSpecs;
+
+    /**
+     * @var Task[]
+     */
+    private $tasks;
+
+    /**
+     * CompileEvent constructor.
+     * @param string $eventName
+     * @param \Composer\Composer $composer
+     * @param \Composer\IO\IOInterface $io
+     * @param \Composer\Package\PackageInterface $package
+     * @param array $tasksSpecs
+     * @param \Civi\CompilePlugin\Task[] $tasks
+     */
+    public function __construct(
+        $eventName,
+        \Composer\Composer $composer,
+        \Composer\IO\IOInterface $io,
+        \Composer\Package\PackageInterface $package,
+        array $tasksSpecs,
+        array $tasks = null
+    ) {
+        parent::__construct($eventName);
+        $this->io = $io;
+        $this->composer = $composer;
+        $this->package = $package;
+        $this->tasksSpecs = $tasksSpecs;
+        $this->tasks = $tasks;
+    }
+
+    /**
+     * @return \Composer\IO\IOInterface
+     */
+    public function getIO()
+    {
+        return $this->io;
+    }
+
+    /**
+     * @return \Composer\Composer
+     */
+    public function getComposer()
+    {
+        return $this->composer;
+    }
+
+    /**
+     * @return \Composer\Package\PackageInterface
+     */
+    public function getPackage()
+    {
+        return $this->package;
+    }
+
+    /**
+     * @return array
+     */
+    public function getTasksSpecs()
+    {
+        return $this->tasksSpecs;
+    }
+
+    /**
+     * @param array $tasksSpecs
+     */
+    public function setTasksSpecs($tasksSpecs)
+    {
+        $this->tasksSpecs = $tasksSpecs;
+    }
+
+    /**
+     * @return \Civi\CompilePlugin\Task[]
+     */
+    public function getTasks()
+    {
+        return $this->tasks;
+    }
+
+    /**
+     * @param \Civi\CompilePlugin\Task[] $tasks
+     */
+    public function setTasks($tasks)
+    {
+        $this->tasks = $tasks;
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Event/CompileTaskEvent.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Event/CompileTaskEvent.php
new file mode 100644
index 0000000000000000000000000000000000000000..16775c96e047f30da4337a12fc8f410827f78273
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Event/CompileTaskEvent.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace Civi\CompilePlugin\Event;
+
+use Civi\CompilePlugin\Task;
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+
+class CompileTaskEvent extends \Composer\EventDispatcher\Event
+{
+
+    /**
+     * @var IOInterface
+     */
+    private $io;
+
+    /**
+     * @var Composer
+     */
+    private $composer;
+
+    /**
+     * @var PackageInterface
+     */
+    private $package;
+
+    /**
+     * @var Task
+     */
+    private $task;
+
+    /**
+     * @var bool
+     */
+    private $dryRun;
+
+    /**
+     * CompileEvent constructor.
+     * @param string $eventName
+     * @param \Composer\Composer $composer
+     * @param \Composer\IO\IOInterface $io
+     * @param \Composer\Package\PackageInterface $package
+     * @param \Civi\CompilePlugin\Task $task
+     * @param bool $dryRun
+     */
+    public function __construct(
+        $eventName,
+        \Composer\Composer $composer,
+        \Composer\IO\IOInterface $io,
+        \Composer\Package\PackageInterface $package,
+        Task $task,
+        $dryRun
+    ) {
+        parent::__construct($eventName);
+        $this->io = $io;
+        $this->composer = $composer;
+        $this->package = $package;
+        $this->task = $task;
+        $this->dryRun = $dryRun;
+    }
+
+    /**
+     * @return \Composer\IO\IOInterface
+     */
+    public function getIO()
+    {
+        return $this->io;
+    }
+
+    /**
+     * @return \Composer\Composer
+     */
+    public function getComposer()
+    {
+        return $this->composer;
+    }
+
+    /**
+     * @return \Composer\Package\PackageInterface
+     */
+    public function getPackage()
+    {
+        return $this->package;
+    }
+
+    /**
+     * @return \Civi\CompilePlugin\Task
+     */
+    public function getTask()
+    {
+        return $this->task;
+    }
+
+    /**
+     * @return boolean
+     */
+    public function isDryRun()
+    {
+        return $this->dryRun;
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Exception/TaskFailedException.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Exception/TaskFailedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..732ca7f7c963918b559eb2bfdddb850fb8b95567
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Exception/TaskFailedException.php
@@ -0,0 +1,28 @@
+<?php
+namespace Civi\CompilePlugin\Exception;
+
+use Civi\CompilePlugin\Task;
+
+class TaskFailedException extends \Exception
+{
+
+    protected $task;
+
+    /**
+     * TaskFailedException constructor.
+     * @param Task $task
+     */
+    public function __construct(Task $task)
+    {
+        parent::__construct('Failed task: ' . $task->title);
+        $this->task = $task;
+    }
+
+    /**
+     * @return \Civi\CompilePlugin\Task
+     */
+    public function getTask()
+    {
+        return $this->task;
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/ComposerScriptHandler.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/ComposerScriptHandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..f3a100b1f47fb315ccd735ec830fd3283c589c9d
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/ComposerScriptHandler.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Civi\CompilePlugin\Handler;
+
+use Civi\CompilePlugin\Event\CompileTaskEvent;
+use Civi\CompilePlugin\Util\ShellRunner;
+
+class ComposerScriptHandler
+{
+
+    public function runTask(CompileTaskEvent $e, $runType, $runCode)
+    {
+        $r = new ShellRunner($e->getComposer(), $e->getIO());
+        switch ($runType) {
+            // This type is actually handled as a composer script, though they don't recognize the prefix.
+            case 'sh':
+                $r->run($runCode);
+                break;
+
+            // These prefixes are the same -- simple pass-through.
+            case 'composer':
+            case 'php':
+            case 'putenv':
+                $r->run('@' . $runType . ' ' . $runCode);
+                break;
+
+            default:
+                throw new \InvalidArgumentException("Unrecognized run-type: $runType");
+        }
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/ExportHandler.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/ExportHandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..30f00577ad04f835f74da8f86f3c7ef35bde95ec
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/ExportHandler.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Civi\CompilePlugin\Handler;
+
+use Civi\CompilePlugin\Event\CompileTaskEvent;
+use Civi\CompilePlugin\Util\ComposerIoTrait;
+use Civi\CompilePlugin\Util\ShellRunner;
+use Composer\Composer;
+use Composer\IO\IOInterface;
+
+/**
+ * Class ExportHandler
+ * @package Civi\CompilePlugin\Handler
+ *
+ * This implements support for run-steps based on `@export VAR1={{expr1}} VAR2={{expr2}}`.
+ *
+ * The intent is to allow exporting information about the composer runtime, such
+ * as the file-path to upstream packages.
+ */
+class ExportHandler
+{
+    /**
+     * ExportHandler constructor.
+     */
+    public function __construct()
+    {
+        $this->rootPackagePath = getcwd();
+    }
+
+    /**
+     * @param \Civi\CompilePlugin\Event\CompileTaskEvent $event
+     * @param string $runType
+     * @param string $exportList
+     *   Ex: 'BOOT_CSS={{pkg:twbs/bootstrap}}'
+     *   Ex: 'BOOT_CSS={{pkg:twbs/bootstrap}} BOOT_SCSS={{pkg:twbs/bootstrap-sass}}'
+     */
+    public function runTask(CompileTaskEvent $event, $runType, $exportList)
+    {
+        /** @var Composer $composer */
+        $composer = $event->getComposer();
+        $io = $event->getIO();
+
+        $exports = explode(' ', $exportList);
+        foreach ($exports as $export) {
+            $envExpr = preg_replace_callback(';\{\{([\w_\-: /]*)\}\};', function ($m) use ($composer, $io) {
+                // Ex: 'pkgs:twbs/bootstrap'
+                $expr = $m[1];
+
+                if (preg_match('/^pkg:/', $expr)) {
+                    $packageName = substr($expr, 4);
+                    return $this->findPkgPath($composer, $io, $packageName);
+                }
+            }, trim($export));
+            putenv($envExpr);
+        }
+    }
+
+    /**
+     * @param Composer $composer
+     * @param IOInterface $io
+     * @param string $packageName
+     * @return string
+     */
+    protected function findPkgPath($composer, $io, $packageName)
+    {
+        if (in_array($packageName, $composer->getPackage()->getNames())) {
+            return $this->rootPackagePath;
+        }
+
+        $localRepo = $composer->getRepositoryManager()->getLocalRepository();
+        $package = $localRepo->findPackage($packageName, '*');
+        if ($package) {
+            return $composer->getInstallationManager()->getInstallPath($package);
+        } else {
+            // This is only a warning -- e.g. they might be looking up a 'suggested' pkg.
+            $io->write("<warning>The package $packageName does not exist.</warning>");
+            return '';
+        }
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/PhpEvalHandler.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/PhpEvalHandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..5cf867a2eb6988ffd4dd007a73a4cf0df3ee2d06
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/PhpEvalHandler.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Civi\CompilePlugin\Handler;
+
+use Civi\CompilePlugin\Event\CompileTaskEvent;
+use Civi\CompilePlugin\TaskTransfer;
+use Civi\CompilePlugin\Util\ShellRunner;
+
+/**
+ * Class PhpEvalHandler
+ * @package Civi\CompilePlugin\Handler
+ *
+ * This implements support for run-steps based on `@php-eval <phpcode>`.
+ */
+class PhpEvalHandler
+{
+    /**
+     * @param \Civi\CompilePlugin\Event\CompileTaskEvent $event
+     * @param string $runType
+     * @param string $phpEval
+     *   Ex: 'echo "Hello world";'
+     */
+    public function runTask(CompileTaskEvent $event, $runType, $phpEval)
+    {
+        $cmd = $this->createCommand($event, $runType, $phpEval);
+        $r = new ShellRunner($event->getComposer(), $event->getIO());
+        $r->run($cmd);
+    }
+
+    /**
+     * @param \Civi\CompilePlugin\Event\CompileTaskEvent $event
+     * @param string $runType
+     * @param string $phpEval
+     *   Ex: 'echo "Hello world";'
+     */
+    protected function createCommand($event, $runType, $phpEval)
+    {
+        // Surely there's a smarter way to get this?
+        $vendorPath = $event->getComposer()->getConfig()->get('vendor-dir');
+        $autoload =  $vendorPath . '/autoload.php';
+        if (!file_exists($autoload)) {
+            throw new \RuntimeException("CompilePlugin: Failed to locate autoload.php");
+        }
+
+        if (strpos($phpEval, "\n") !== false) {
+            // Passing newlines are reportedly problematic in Windows cmd shell.
+            throw new \RuntimeException("CompilePlugin: Multiline eval is not permitted");
+        }
+
+        return '@php -r ' . escapeshellarg(sprintf(
+            'require_once %s; %s %s',
+            var_export($autoload, 1),
+            TaskTransfer::createImportStatement(),
+            $phpEval
+        ));
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/PhpMethodHandler.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/PhpMethodHandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..7656191deffd7921a79151a240c40ce8940dd869
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/PhpMethodHandler.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Civi\CompilePlugin\Handler;
+
+use Civi\CompilePlugin\Event\CompileTaskEvent;
+use Civi\CompilePlugin\TaskTransfer;
+use Civi\CompilePlugin\Util\ShellRunner;
+
+class PhpMethodHandler
+{
+    public function runTask(CompileTaskEvent $event, $runType, $phpMethod)
+    {
+        // Surely there's a smarter way to get this?
+        $vendorPath = $event->getComposer()->getConfig()->get('vendor-dir');
+        $autoload =  $vendorPath . '/autoload.php';
+        if (!file_exists($autoload)) {
+            throw new \RuntimeException("CompilePlugin: Failed to locate autoload.php");
+        }
+
+        $cmd = '@php -r ' . escapeshellarg(sprintf(
+            'require_once %s; %s %s($GLOBALS["COMPOSER_COMPILE_TASK"]);',
+            var_export($autoload, 1),
+            TaskTransfer::createImportStatement(),
+            $phpMethod
+        ));
+
+        $r = new ShellRunner($event->getComposer(), $event->getIO());
+        $r->run($cmd);
+    }
+
+    /**
+     * @param string $phpMethod
+     * @return bool
+     */
+    public static function isWellFormedMethod($phpMethod)
+    {
+        if (!is_string($phpMethod)) {
+            return false;
+        }
+        $parts = explode('::', $phpMethod);
+        if (count($parts) > 2) {
+            return false;
+        }
+        return preg_match(';^[a-zA-Z0-9_\\\:]+$;', $phpMethod);
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/PhpScriptHandler.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/PhpScriptHandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..06452bb51bc8aa608af0e4bbded19701e06ed6c6
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Handler/PhpScriptHandler.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Civi\CompilePlugin\Handler;
+
+use Civi\CompilePlugin\Event\CompileTaskEvent;
+use Civi\CompilePlugin\Util\ShellRunner;
+
+/**
+ * Class PhpScriptHandler
+ * @package Civi\CompilePlugin\Handler
+ *
+ * This implements support for run-steps based on `@php-script <filename> [<cli-args>]`.
+ */
+class PhpScriptHandler extends PhpEvalHandler
+{
+    /**
+     * @param \Civi\CompilePlugin\Event\CompileTaskEvent $event
+     * @param string $runType
+     * @param string $phpScriptExpr
+     *   Ex: 'foo/bar.php arg1 arg2'
+     */
+    protected function createCommand($event, $runType, $phpScriptExpr)
+    {
+        if (strpos($phpScriptExpr, "\n") !== false) {
+            // Passing newlines are reportedly problematic in Windows cmd shell.
+            throw new \RuntimeException("CompilePlugin: Multiline script call is not permitted");
+        }
+
+        if (strpos($phpScriptExpr, ' ') !== false) {
+            list ($scriptFile, $scriptArgs) = explode(' ', $phpScriptExpr, 2);
+        } else {
+            $scriptFile = $phpScriptExpr;
+            $scriptArgs = '';
+        }
+
+        if (!file_exists($scriptFile)) {
+            // It's prettier if we report the error rather than letting the subprocess fail.
+            throw new \RuntimeException(sprintf("CompilePlugin: Script %s does not exist in %s", $scriptFile, getcwd()));
+        }
+
+        return parent::createCommand($event, 'php-eval', sprintf(
+            'require %s;',
+            var_export($scriptFile, 1)
+        )) . ' ' . $scriptArgs;
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/PackageSorter.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/PackageSorter.php
new file mode 100644
index 0000000000000000000000000000000000000000..20e9181bdaa1293ae19594572f0e9b61d12ba8e6
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/PackageSorter.php
@@ -0,0 +1,112 @@
+<?php
+namespace Civi\CompilePlugin;
+
+use Composer\Package\PackageInterface;
+
+class PackageSorter
+{
+
+    /**
+     * Get the list of installed packages (sorted topologically).
+     *
+     * @param PackageInterface[] $installedPackages
+     *   All installed packages, including the root.
+     * @return array
+     *   List of installed packages (sorted topologically).
+     *
+     *   Upstream packages with no dependencies come earlier than downstream packages that require them.
+     *
+     *   Ex: [0 => 'very-much/upstream', 1 => 'some-what/midstream', 2 => 'here-now/downstream']
+     */
+    public static function sortPackages($installedPackages)
+    {
+        // We do our own topological sort.  It doesn't seem particularly easy to ask composer for this list -- the
+        // canonical sort for 'composer require' and 'composer update' have to address a lot of issues (like
+        // version-selection and already-installed packages) that don't make sense here.
+
+        // The topological sort may have multiple, equally-correct outputs. Given the same
+        // packages as input (regardless of input-order), we want to produce stable output.
+        usort($installedPackages, function ($a, $b) {
+            return strnatcmp($a->getName(), $b->getName());
+        });
+
+        // Index mapping all known aliases (provides/replaces) to real names.
+        // Array(string $logicalName => string $realName)
+        $realNames = [];
+        foreach ($installedPackages as $package) {
+            /** @var PackageInterface $package */
+            foreach ($package->getNames() as $alias) {
+                $realNames[$alias] = $package->getName();
+            }
+        }
+
+        // Array(string $realName => string[] $realNames)
+        $realRequires = [];
+        $addRealRequires = function ($package, $target) use (&$realRequires, &$realNames) {
+            if (isset($realNames[$target]) && $realNames[$target] !== $package) {
+                $realRequires[$package][] = $realNames[$target];
+            }
+        };
+        foreach ($installedPackages as $package) {
+            /** @var PackageInterface $package */
+            foreach ($package->getRequires() as $link) {
+                $addRealRequires($package->getName(), $link->getTarget());
+            }
+            // Unfortunately, cycles are common among suggests/dev-requires... ex: phpunit
+            //foreach ($package->getDevRequires() as $link) {
+            //    $addRealRequires($package->getName(), $link->getTarget());
+            //}
+            //foreach ($package->getSuggests() as $target => $comment) {
+            //    $addRealRequires($package->getName(), $target);
+            //}
+        }
+
+        // Unsorted list of packages that need to be visited.
+        // Array(string $packageName => PackageInterface $package).
+        $todoPackages = [];
+        foreach ($installedPackages as $package) {
+            $todoPackages[$package->getName()] = $package;
+        }
+
+        // The topologically sorted packages, from least-dependent to most-dependent.
+        // Array(string $packageName => PackageInterface $package)
+        $sortedPackages = [];
+
+        // A package is "ripe" when all its requirements are met.
+        $isRipe = function (PackageInterface $pkg) use (&$sortedPackages, &$realRequires) {
+            foreach ($realRequires[$pkg->getName()] ?? [] as $target) {
+                if (!isset($sortedPackages[$target])) {
+                     // printf("[%s] is not ripe due to [%s]\n", $pkg->getName(), $target);
+                    return false;
+                }
+            }
+            // printf("[%s] is ripe\n", $pkg->getName());
+            return true;
+        };
+
+        // A package is "consumed" when we move it from $todoPackages to $sortedPackages.
+        $consumePackage = function (PackageInterface $pkg) use (&$sortedPackages, &$todoPackages) {
+            $sortedPackages[$pkg->getName()] = $pkg;
+            unset($todoPackages[$pkg->getName()]);
+        };
+
+        // Main loop: Progressively move ripe packages from $todoPackages to $sortedPackages.
+        while (!empty($todoPackages)) {
+            $ripePackages = array_filter($todoPackages, $isRipe);
+            if (empty($ripePackages)) {
+                $todoStr = implode(' ', array_map(
+                    function ($p) {
+                        return $p->getName();
+                    },
+                    $todoPackages
+                ));
+                throw new \RuntimeException("Error: Failed to find next installable package. Remaining: $todoStr");
+            }
+            foreach ($ripePackages as $package) {
+                $consumePackage($package);
+            }
+        }
+
+        return array_keys($sortedPackages);
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Subscriber/OldTaskAdapter.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Subscriber/OldTaskAdapter.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9ae2b9dd98417fc3a6bb075b9675492e92535c3
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Subscriber/OldTaskAdapter.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Civi\CompilePlugin\Subscriber;
+
+use Civi\CompilePlugin\Event\CompileEvents;
+use Civi\CompilePlugin\Event\CompileListEvent;
+use Civi\CompilePlugin\Handler\PhpMethodHandler;
+use Composer\EventDispatcher\EventSubscriberInterface;
+
+class OldTaskAdapter implements EventSubscriberInterface
+{
+
+    public static function getSubscribedEvents()
+    {
+        return [
+          CompileEvents::PRE_COMPILE_LIST => 'mapRunner'
+        ];
+    }
+
+    /**
+     * In previous releases, the task could specify 'php-method' or 'shell'.
+     * These have been consolidated as 'run'.
+     *
+     * This function maps the old notation to the new notation.
+     *
+     * @param \Civi\CompilePlugin\Event\CompileListEvent $e
+     */
+    public function mapRunner(CompileListEvent $e)
+    {
+        $defns = $e->getTasksSpecs();
+        foreach ($defns as &$defn) {
+            $defn['run'] = $defn['run'] ?? [];
+
+            if (isset($defn['php-method'])) {
+                $phpMethods = (array)$defn['php-method'];
+                foreach ($phpMethods as $phpMethod) {
+                    // TODO Maybe move the validation bit elsewhere
+                    if (PhpMethodHandler::isWellFormedMethod($phpMethod)) {
+                        $defn['run'][] = '@php-method ' . $phpMethod;
+                    } else {
+                        throw new \InvalidArgumentException("Malformed php-method: " . json_encode($phpMethod, JSON_UNESCAPED_SLASHES));
+                    }
+                }
+            }
+
+            if (isset($defn['shell'])) {
+                $shellCmds = (array)$defn['shell'];
+                foreach ($shellCmds as $shellCmd) {
+                    $defn['run'][] = '@sh ' . $shellCmd;
+                }
+            }
+        }
+
+        $e->setTasksSpecs($defns);
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Task.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Task.php
new file mode 100644
index 0000000000000000000000000000000000000000..0b811cc717870815c1c80e40201310f4860f3690
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Task.php
@@ -0,0 +1,205 @@
+<?php
+
+namespace Civi\CompilePlugin;
+
+class Task
+{
+
+    /**
+     * List of supported types
+     *
+     * This is a quick-and-dirty hack.
+     */
+    const HANDLERS = 'composer|export|php|php-eval|php-method|php-script|putenv|sh';
+
+    /**
+     * (Required) A unique ID for this task
+     *
+     * Ex: 'vendor/package:123'
+     *
+     * @var string
+     */
+    public $id;
+
+    /**
+     * (Optional) Printable title for this compilation task.
+     *
+     * @var string
+     *   Ex: 'Compile <comment>foobar.txt</comment>'
+     */
+    public $title;
+
+    /**
+     * (Optional) The developer's chosen ordering key.
+     *
+     * This ordering takes precedence over all other orderings. For example,
+     * if your ecosystem had a policy that all `XML=>PHP` compilations run
+     * before all `SCSS=>CSS` compilations, then you would use different weights
+     * for `XML=>PHP` (eg -5) and `SCSS=>CSS` (eg +5).
+     *
+     * NOTE: This option was added in early drafts as a pressure-relief valve
+     * in case some control was needed over ordering. It's now hidden, though,
+     * because I think it's better to wait for some feedback re:use-cases before
+     * committing to this model.
+     *
+     * @var int
+     */
+    public $weight;
+
+    /**
+     * (System-Generated) The topological order of the package which defines this
+     * task.
+     *
+     * @var int
+     */
+    public $packageWeight;
+
+    /**
+     * (System-Generated) Within a given package, the written ordering (from JSON)
+     * determines natural weight.
+     *
+     * @var int
+     */
+    public $naturalWeight;
+
+    /**
+     * (System-Generated) The name of the package which defined this task.
+     *
+     * @var string
+     */
+    public $packageName;
+
+    /**
+     * (Required) Run commands
+     *
+     * List of commands to run. Each command should begin with an '@type'.
+     *
+     * Ex: '@php-method Foo::bar'
+     * Ex: '@sh cp foo bar'
+     *
+     * @var string[]
+     */
+    public $run;
+
+    /**
+     * (Required) The folder in which to execute the task.
+     *
+     * @var string
+     */
+    public $pwd;
+
+    /**
+     * List of file-names and/or directory-names to watch.
+     *
+     * @see \Lurker\ResourceWatcher::track()
+     * @var array
+     */
+    public $watchFiles = [];
+
+    /**
+     * (Optional) Whether the task should be executed.
+     *
+     * @var bool
+     */
+    public $active;
+
+    /**
+     * The file in which this task was originally defined.
+     *
+     * @var string
+     */
+    public $sourceFile;
+
+    /**
+     * (Required) The raw task definition
+     *
+     * @var array
+     */
+    public $definition;
+
+    /**
+     * Ensure that any required fields are defined.
+     * @return static
+     */
+    public function validate()
+    {
+        $missing = [];
+        foreach (['naturalWeight', 'packageWeight', 'packageName', 'pwd', 'definition', 'run'] as $requiredField) {
+            if ($this->{$requiredField} === null || $this->{$requiredField} === '') {
+                $missing[] = $requiredField;
+            }
+        }
+        if ($missing) {
+            throw new \RuntimeException("Compilation task is missing field(s): " . implode(",", $missing));
+        }
+
+        $handlers = explode('|', self::HANDLERS);
+        foreach ($this->getParsedRun() as $run) {
+            if (!in_array($run['type'], $handlers)) {
+                throw new \RuntimeException("Compilation task has invalid run expression: " . json_encode($run['expr']));
+            }
+        }
+        return $this;
+    }
+
+    /**
+     * @param string $filter
+     *   Ex: 'vendor/*'
+     *   Ex: 'vendor/package'
+     *   Ex: 'vendor/package:id'
+     * @return bool
+     */
+    public function matchesFilter($filter)
+    {
+        if ($this->packageName === '__root__') {
+            return $filter === '__root__';
+        }
+
+        list ($tgtVendorPackage, $tgtId) = explode(':', "{$filter}:");
+        list ($tgtVendor, $tgtPackage) = explode('/', $tgtVendorPackage . '/');
+        list ($actualVendor, $actualPackage) = explode('/', $this->packageName);
+
+        if ($tgtVendor !== '*' && $tgtVendor !== $actualVendor) {
+            return false;
+        }
+        if ($tgtPackage !== '*' && $tgtPackage !== $actualPackage) {
+            return false;
+        }
+        if ($tgtId !== '' && $tgtId !== '*' && $tgtId != $this->naturalWeight) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * Get a list of 'run' values.
+     *
+     * @return array
+     *   List of the 'run' values. Each is parsed.
+     *
+     *   Example: Suppose we have `run => ['@php foo']`
+     *   The output would be: `[['type' => 'php', 'code' => 'foo']]`
+     */
+    public function getParsedRun()
+    {
+        $runs = [];
+        foreach ($this->run as $runExpr) {
+            $runs[] = $this->parseRunExpr($runExpr);
+        }
+        return $runs;
+    }
+
+    protected function parseRunExpr($runExpr)
+    {
+        if (preg_match(';^@([a-z0-9\-]+) (.*)$;', $runExpr, $m)) {
+            return [
+              'type' => $m[1],
+              'code' => $m[2],
+              'expr' => $runExpr,
+            ];
+        } else {
+            throw new \InvalidArgumentException("Failed to parse run expression: $runExpr");
+        }
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/TaskList.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/TaskList.php
new file mode 100644
index 0000000000000000000000000000000000000000..6538c1289c7d8ec30228d6a6fb79cee621828526
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/TaskList.php
@@ -0,0 +1,224 @@
+<?php
+namespace Civi\CompilePlugin;
+
+use Civi\CompilePlugin\Event\CompileEvents;
+use Civi\CompilePlugin\Event\CompileListEvent;
+use Civi\CompilePlugin\Util\ComposerIoTrait;
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+
+class TaskList
+{
+    use ComposerIoTrait;
+
+    /**
+     * @var Task[]
+     */
+    protected $tasks;
+
+    /**
+     * @var array
+     */
+    protected $sourceFiles;
+
+    /**
+     * @var array
+     *   Ex: ['foo/upstream' => 1, 'foo/downstream' => 2]
+     */
+    protected $packageWeights;
+
+    /**
+     * Scan the composer data and build a list of compilation tasks.
+     *
+     * @return static
+     */
+    public function load()
+    {
+        $this->tasks = [];
+        $this->sourceFiles = [];
+        $this->packageWeights = array_flip(PackageSorter::sortPackages(array_merge(
+            $this->composer->getRepositoryManager()->getLocalRepository()->getCanonicalPackages(),
+            [$this->composer->getPackage()]
+        )));
+
+        $rootPackage = $this->composer->getPackage();
+        $localRepo = $this->composer->getRepositoryManager()->getLocalRepository();
+        foreach ($this->packageWeights as $packageName => $packageWeight) {
+            if ($packageName === $rootPackage->getName()) {
+                $this->loadPackage($rootPackage, realpath('.'));
+                // I'm not a huge fan of using 'realpath()' here, but other tasks (using `getInstallPath()`)
+                // are effectively using `realpath()`, so we should be consistent.
+            } else {
+                $package = $localRepo->findPackage($packageName, '*');
+                $this->loadPackage($package, $this->composer->getInstallationManager()->getInstallPath($package));
+            }
+        }
+
+        return $this;
+    }
+
+    /**
+     * @param \Composer\Package\PackageInterface $package
+     * @param string $installPath
+     *   The package's location on disk.
+     */
+    protected function loadPackage(PackageInterface $package, $installPath)
+    {
+        // Typically, a package folder has its own copy of composer.json.  We prefer to read from that file in case one
+        // is drafting or applying patches.  Relatedly, if another plugin wants to hook into our list of tasks, they
+        // should not try to work with `getExtra()`.  Instead, listen to `PRE_COMPILE_LIST` or `POST_COMPILE_LIST`
+        // and alter configuration there.
+
+        $taskDefinitions = [];
+        $addDefinitions = function ($newDefinitions, $sourceFile) use (&$taskDefinitions) {
+            foreach ($newDefinitions as $defn) {
+                $defn['source-file'] = $sourceFile;
+                $taskDefinitions[] = $defn;
+            }
+            $this->sourceFiles[] = $sourceFile;
+        };
+
+        $extra = null;
+        if ($extra === null && file_exists("$installPath/composer.json")) {
+            $json = json_decode(file_get_contents("$installPath/composer.json"), 1);
+            $extra = $json['extra'] ?? null;
+        }
+        if ($extra === null) {
+            $extra = $package->getExtra();
+        }
+        $addDefinitions($extra['compile'] ?? [], "$installPath/composer.json");
+
+        foreach ($extra['compile-includes'] ?? [] as $includeFile) {
+            $includePathFull = "$installPath/$includeFile";
+            if (!file_exists($includePathFull) || !is_readable($includePathFull)) {
+                $this->io->writeError("<warning>Failed to read $includePathFull</warning>");
+                continue;
+            }
+            $inc = json_decode(file_get_contents($includePathFull), 1);
+            $addDefinitions($inc['compile'] ?? [], $includePathFull);
+        }
+
+        $event = new CompileListEvent(CompileEvents::PRE_COMPILE_LIST, $this->composer, $this->io, $package, $taskDefinitions);
+        $this->composer->getEventDispatcher()->dispatch(CompileEvents::PRE_COMPILE_LIST, $event);
+        $taskDefinitions = $event->getTasksSpecs();
+
+        $naturalWeight = 1;
+        $tasks = [];
+        foreach ($taskDefinitions as $taskDefinition) {
+            $defaults = [
+                'active' => true,
+                'title' => sprintf(
+                    '<comment>%s</comment>:<comment>%s</comment>',
+                    $package->getName(),
+                    $naturalWeight
+                ),
+                'watch-files' => null,
+            ];
+
+            $taskDefinition = array_merge($defaults, $taskDefinition);
+            $task = new Task();
+            $task->id = $package->getName() . ':' . $naturalWeight;
+            $task->sourceFile = $taskDefinition['source-file'];
+            $task->definition = $taskDefinition;
+            $task->packageName = $package->getName();
+            $task->pwd = dirname($taskDefinition['source-file']);
+            $task->weight = 0;
+            $task->packageWeight = $this->packageWeights[$package->getName()];
+            $task->naturalWeight = $naturalWeight;
+            $task->active = $taskDefinition['active'];
+            $task->watchFiles = $taskDefinition['watch-files'];
+            $task->title = $taskDefinition['title'];
+            $task->run = (array) $taskDefinition['run'];
+            $tasks[$task->id] = $task;
+            $naturalWeight++;
+        }
+
+        $event = new CompileListEvent(CompileEvents::POST_COMPILE_LIST, $this->composer, $this->io, $package, $taskDefinitions, $tasks);
+        $this->composer->getEventDispatcher()->dispatch(CompileEvents::POST_COMPILE_LIST, $event);
+
+        $this->tasks = array_merge($this->tasks, $event->getTasks());
+    }
+
+    /**
+     * Disable a list of tasks.
+     *
+     * @param string|string[] $taskIds
+     * @return int
+     *   The number of tasks which were toggled.
+     */
+    public function disable($taskIds)
+    {
+        $taskIds = (array)$taskIds;
+        $count = 0;
+        foreach ($taskIds as $taskId) {
+            if ($this->tasks[$taskId]->active) {
+                $this->tasks[$taskId]->active = false;
+                $count++;
+            }
+        }
+        return $count;
+    }
+
+    /**
+     * Get the list of input files which produced this task-list.
+     *
+     * @return \string[]
+     */
+    public function getSourceFiles()
+    {
+        return $this->sourceFiles;
+    }
+
+    /**
+     * @return Task[]
+     */
+    public function getAll()
+    {
+        return $this->tasks;
+    }
+
+    /**
+     * @param string $filter
+     *   Ex: 'vendor/*'
+     *   Ex: 'vendor/package'
+     *   Ex: 'vendor/package:id'
+     * @return Task[]
+     */
+    public function getByFilter($filter)
+    {
+        $tasks = [];
+        foreach ($this->tasks as $task) {
+            /** @var Task $task */
+            if ($task->matchesFilter($filter)) {
+                $tasks[$task->id] = $task;
+            }
+        }
+        return $tasks;
+    }
+
+    /**
+     * @param string[] $filters
+     *   Ex: ['vendor1/*', 'vendor2/package2']
+     * @return Task[]
+     */
+    public function getByFilters($filters)
+    {
+        $tasks = [];
+        foreach ($filters as $filter) {
+            $tasks = array_merge($tasks, $this->getByFilter($filter));
+        }
+        return $tasks;
+    }
+
+    /**
+     * @return static
+     */
+    public function validateAll()
+    {
+        foreach ($this->tasks as $task) {
+            $task->validate();
+        }
+        return $this;
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/TaskRunner.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/TaskRunner.php
new file mode 100644
index 0000000000000000000000000000000000000000..d5a3255e0a57b25fcca409ec372929463e426103
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/TaskRunner.php
@@ -0,0 +1,380 @@
+<?php
+namespace Civi\CompilePlugin;
+
+use Civi\CompilePlugin\Event\CompileEvents;
+use Civi\CompilePlugin\Event\CompileTaskEvent;
+use Civi\CompilePlugin\Exception\TaskFailedException;
+use Civi\CompilePlugin\Handler\ComposerScriptHandler;
+use Civi\CompilePlugin\Handler\ExportHandler;
+use Civi\CompilePlugin\Handler\PhpEvalHandler;
+use Civi\CompilePlugin\Handler\PhpMethodHandler;
+use Civi\CompilePlugin\Handler\PhpScriptHandler;
+use Civi\CompilePlugin\Util\ComposerIoTrait;
+use Civi\CompilePlugin\Util\EnvHelper;
+use Civi\CompilePlugin\Util\PassthruPolicyFilter;
+use Civi\CompilePlugin\Util\TaskUIHelper;
+use Composer\Composer;
+use Composer\IO\IOInterface;
+use Composer\Package\PackageInterface;
+
+class TaskRunner
+{
+
+    use ComposerIoTrait {
+        __construct as constructComposerIo;
+    }
+
+    /**
+     * @var array
+     *   [string $type => object $handler]
+     */
+    private $handlers;
+
+    public function __construct(
+        \Composer\Composer $composer,
+        \Composer\IO\IOInterface $io
+    ) {
+        $this->constructComposerIo($composer, $io);
+        $this->handlers = [
+          'export' => new ExportHandler(),
+          'php-eval' => new PhpEvalHandler(),
+          'php-method' => new PhpMethodHandler(),
+          'php-script' => new PhpScriptHandler(),
+          'sh' => new ComposerScriptHandler(),
+          'putenv' => new ComposerScriptHandler(),
+          'php' => new ComposerScriptHandler(),
+          'composer' => new ComposerScriptHandler(),
+        ];
+        ksort($this->handlers);
+        if (Task::HANDLERS !== implode('|', array_keys($this->handlers))) {
+            throw new \RuntimeException("Task type list is out-of-date. Validation may not work.");
+        }
+    }
+
+    /**
+     * Run the items in the $taskList, as per policy.
+     *
+     * @param \Civi\CompilePlugin\TaskList $taskList
+     */
+    public function runDefault(TaskList $taskList, $isDryRun = false)
+    {
+        $allowedTasks = $taskList->getByFilters($this->getWhitelistRules());
+        $blockedTasks = array_filter($taskList->getAll(), function ($task) use ($allowedTasks) {
+            return !isset($allowedTasks[$task->id]);
+        });
+
+        $mode = $this->getMode();
+        if ($mode === 'prompt' && empty($blockedTasks)) {
+            // If whitelist covers all extant tasks, then no need for user-interaction.
+            $mode = 'all';
+        }
+
+        switch ($mode) {
+            case 'all':
+                $this->run($taskList->getAll(), $isDryRun);
+                break;
+
+            case 'none':
+                $this->io->write(
+                    "<error>ERROR</error>: Automatic compilation is disabled. These packages have compilation tasks which have not been executed:"
+                );
+                $this->io->write(TaskUIHelper::formatTaskSummary($taskList->getAll()));
+                $this->io->writeError(sprintf("<error>Skipped %d compilation task(s)</error>", count($taskList->getAll())));
+                $this->io->writeError("<error>You may run skipped tasks with \"composer compile --all\"</error>");
+                break;
+
+            case 'whitelist':
+                $disabledCount = $taskList->disable($blockedTasks);
+                $this->run($taskList->getAll(), $isDryRun);
+                if ($disabledCount) {
+                    $this->io->writeError(sprintf('<error>WARNING</error>: %d task(s) were omitted due to whitelist policy', $disabledCount));
+                }
+                $this->io->writeError("<error>You may run skipped tasks with \"composer compile --all\"</error>");
+                break;
+
+            case 'prompt':
+                $choice = $this->askApproveTasks($blockedTasks);
+                if ($choice === 'a') {
+                    $this->addWhitelistRules(array_map(function ($task) {
+                        return $task->packageName;
+                    }, $blockedTasks));
+                }
+
+                switch ($choice) {
+                    case 'y':
+                    case 'a':
+                        $this->run($taskList->getAll(), $isDryRun);
+                        break;
+
+                    case 'n':
+                        $this->io->writeError(sprintf("<error>Skipped %d compilation task(s)</error>", count($blockedTasks)));
+                        $this->io->writeError("<error>You may run skipped tasks with \"composer compile --all\"</error>");
+                        break;
+                }
+        }
+    }
+
+    /**
+     * Execute a list of compilation tasks.
+     *
+     * @param Task[] $tasks
+     * @param bool $isDryRun
+     */
+    public function run(array $tasks, $isDryRun = false)
+    {
+        /** @var IOInterface $io */
+        $io = $this->io;
+
+        $dryRunText = $isDryRun ? '<error>(DRY-RUN)</error> ' : '';
+
+        if (empty($tasks)) {
+            return;
+        }
+
+        switch ($this->getPassthruMode()) {
+            case 'never':
+            case 'error':
+                $io->write('<info>Compiling additional files</info> (<comment>For full details, use verbose "-v" mode.</comment>)');
+                break;
+
+            case 'always':
+                $io->write('<info>Compiling additional files</info>');
+                break;
+        }
+
+        $tasks = $this->sortTasks($tasks);
+        foreach ($tasks as $task) {
+            /** @var \Civi\CompilePlugin\Task $task */
+
+            $package = ($this->composer->getPackage()->getName() === $task->packageName)
+              ? $this->composer->getPackage()
+              : $this->composer->getRepositoryManager()->getLocalRepository()->findPackage($task->packageName, '*');
+
+            $event = new CompileTaskEvent(CompileEvents::PRE_COMPILE_TASK, $this->composer, $this->io, $package, $task, $isDryRun);
+            $dispatcher = $this->composer->getEventDispatcher();
+            $dispatcher->dispatch(CompileEvents::PRE_COMPILE_TASK, $event);
+
+            if (!$task->active) {
+                $io->write(
+                    $dryRunText . '<error>Skip</error>: ' . ($task->title),
+                    true,
+                    IOInterface::VERBOSE
+                );
+                continue;
+            }
+
+            $io->write($dryRunText . '<info>Compile</info>: ' . ($task->title));
+
+            if (!$isDryRun) {
+                $this->runTask($task, $package);
+            }
+
+            $event = new CompileTaskEvent(CompileEvents::POST_COMPILE_TASK, $this->composer, $this->io, $package, $task, $isDryRun);
+            $this->composer->getEventDispatcher()->dispatch(CompileEvents::POST_COMPILE_TASK, $event);
+        }
+    }
+
+    protected function runTask(Task $task, PackageInterface $package)
+    {
+        $orig = [
+            'pwd' => getcwd(),
+            'env' => EnvHelper::getAll(),
+        ];
+
+        $passthruPolicyFilter = new PassthruPolicyFilter(
+            $this->io,
+            $this->getPassthruMode(),
+            function ($message) {
+                if ($this->io->isVerbose()) {
+                    return true;
+                }
+                return preg_match(';^<error|warning>;', $message);
+            }
+        );
+
+        try {
+            chdir($task->pwd);
+            TaskTransfer::export($task);
+
+            foreach ($task->getParsedRun() as $run) {
+                if (!isset($this->handlers[$run['type']])) {
+                    throw new \InvalidArgumentException("Unrecognized prefix: @" . $run['type']);
+                }
+
+                $isDryRun = false;
+                $e = new CompileTaskEvent(null, $this->composer, $passthruPolicyFilter, $package, $task, $isDryRun);
+                $this->handlers[$run['type']]->runTask($e, $run['type'], $run['code']);
+            }
+        } finally {
+            TaskTransfer::cleanup();
+            chdir($orig['pwd']);
+            EnvHelper::setAll($orig['env']);
+        }
+    }
+
+    /**
+     * @param Task[] $tasks
+     * @return Task[]
+     */
+    public function sortTasks($tasks)
+    {
+        usort($tasks, function ($a, $b) {
+            $fields = ['weight', 'packageWeight', 'naturalWeight'];
+            foreach ($fields as $field) {
+                if ($a->{$field} > $b->{$field}) {
+                    return 1;
+                } elseif ($a->{$field} < $b->{$field}) {
+                    return -1;
+                }
+            }
+            return 0;
+        });
+        return $tasks;
+    }
+
+    /**
+     * Determine whether compilation is enabled.
+     *
+     * @return string
+     *   One of:
+     *   - 'all': Automatically run all compilation tasks
+     *   - 'whitelist': Automatically compile anything on the whitelist, and
+     *     reject everything else.
+     *   - 'prompt': Automatically compile anything on the whitelist, and
+     *     prompt for everything else.
+     *   - 'none': Do not compile automatically.
+     */
+    public function getMode()
+    {
+        $aliases = [
+            '0' => 'none',
+            '1' => 'all',
+            'off' => 'none',
+            'on' => 'all',
+        ];
+
+        $mode = getenv('COMPOSER_COMPILE');
+
+        if ($mode === '' || $mode === false || $mode === null) {
+            $extra = $this->composer->getPackage()->getExtra();
+            $mode = $extra['compile-mode'] ?? '';
+        }
+
+        if ($mode === '' || $mode === false || $mode === null) {
+            $mode = 'prompt';
+        }
+
+        $mode = strtolower($mode);
+        if (isset($aliases[$mode])) {
+            $mode = $aliases[$mode];
+        }
+
+        $options = ['all', 'prompt', 'whitelist', 'none'];
+        if (in_array($mode, $options)) {
+            return $mode;
+        } else {
+            throw new \InvalidArgumentException(
+                "The compilation policy (COMPOSER_COMPILE or extra.compile-mode) is invalid. Valid options are \"" . implode('", "', $options) . "\"."
+            );
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function getPassthruMode()
+    {
+        $passthru = getenv('COMPOSER_COMPILE_PASSTHRU');
+        if ($passthru === '' || $passthru === false || $passthru === null) {
+            $extra = $this->composer->getPackage()->getExtra();
+            $passthru = $extra['compile-passthru'] ?? '';
+        }
+        if ($passthru === '' || $passthru === false || $passthru === null) {
+            $passthru = 'error';
+        }
+        return $passthru;
+    }
+
+    /**
+     * Get a list of packages that are trusted to do compilation.
+     *
+     * @return array
+     *   Ex: ['foo/bar', 'civicrm/*']
+     */
+    protected function getWhitelistRules()
+    {
+        $rules = $this->composer->getPackage()->getExtra()['compile-whitelist'] ?? [];
+
+        // The root package is an ex-officio member of the whitelist.
+        $root = $this->composer->getPackage();
+        if (!in_array($root->getName(), $rules)) {
+            $rules[] = $root->getName();
+        }
+
+        return $rules;
+    }
+
+    /**
+     * Update list of packages that are trusted to do compilation.
+     *
+     * @param array $newRules
+     *   Ex: ['foo/bar', 'civicrm/*']
+     */
+    protected function addWhitelistRules($newRules)
+    {
+        $oldRules = $this->composer->getPackage()->getExtra()['compile-whitelist'] ?? [];
+        $rules = array_unique(array_merge($oldRules, $newRules));
+        sort($rules);
+        $this->composer->getConfig()->getConfigSource()->addProperty('extra.compile-whitelist', $rules);
+    }
+
+    /**
+     * @param Task[] $blockedTasks
+     *   List of tasks that we cannot currently run.
+     * @return string
+     *   Returns 'y' or 'n' or 'a'
+     * @throws \Exception
+     */
+    protected function askApproveTasks($blockedTasks)
+    {
+        if (!$this->io->isInteractive()) {
+            throw new \Exception(
+                "Cannot prompt for compilation preferences. Please update COMPOSER_COMPILE, extra.compile-mode, or extra.compile-whitelist."
+            );
+        }
+
+        $blockedTasks = $this->sortTasks($blockedTasks);
+
+        $choice = null;
+        do {
+            if ($choice === null) {
+                $this->io->write("");
+                $this->io->write(sprintf("The following packages have new compilation tasks:"));
+                $this->io->write(TaskUIHelper::formatTaskSummary($blockedTasks));
+            }
+
+            $actions = implode(', ', [
+                '[<comment>y</comment>]es',
+                '[<comment>a</comment>]lways',
+                '[<comment>n</comment>]o',
+                '[<comment>l</comment>]ist',
+                '[<comment>h</comment>]elp'
+            ]);
+            $choice = $this->io->askAndValidate(
+                '<info>Allow these packages to compile?</info> (' . $actions . ') ',
+                function ($x) {
+                    $x = strtolower($x);
+                    return in_array($x, ['y', 'n', 'a', 'h', 'l']) ? $x : null;
+                }
+            );
+            if ($choice === 'h') {
+                $this->io->write("\n" . file_get_contents(__DIR__ . '/messages/prompt-help.txt'));
+            }
+            if ($choice === 'l') {
+                $this->io->write(TaskUIHelper::formatTaskTable($blockedTasks, ['packageName', 'title', 'action']));
+            }
+        } while (!in_array($choice, ['y', 'n', 'a']));
+
+        return $choice;
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/TaskTransfer.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/TaskTransfer.php
new file mode 100644
index 0000000000000000000000000000000000000000..11fbebc61d7bfc0d8d30732906adc25708b0fe99
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/TaskTransfer.php
@@ -0,0 +1,96 @@
+<?php
+namespace Civi\CompilePlugin;
+
+/**
+ * Class TaskTransfer
+ * @package Civi\CompilePlugin
+ *
+ * Facilitate the transfer of the `$task` definition from the main compilation
+ * process to any subordinate PHP process.
+ *
+ * The transfer is performed through an environment variable COMPOSER_COMPILE_TASK.
+ *
+ * If the task-definition is reasonably small (eg a few lines of text), then it
+ * will be put directly into `COMPOSER_COMPILE_TASK` (as base64(gzip(json))).
+ *
+ * If the task definition is larger, then it will be written to a JSON file.
+ * The env-var will have a file reference ('@/tmp/foobar-1234.json`).
+ *
+ * Notes:
+ *  - '@' is outside the range of characters for b64, so that's not ambiguous.
+ *  - Subprocesses only live long enough to run a single task, so it's fair to
+ *    have a global variable within that process.
+ */
+class TaskTransfer
+{
+
+    const ENV_VAR = 'COMPOSER_COMPILE_TASK';
+    const GLOBAL_VAR = 'COMPOSER_COMPILE_TASK';
+
+    /**
+     * If the env-var would exceed this size, then divert to a file.
+     *
+     * Completely arbitrary number. In Windows, there's a cumulative limit
+     * of 32k for all env-vars.
+     */
+    const MAX_ENV_SIZE = 1500;
+
+    /**
+     * Put the $task definition into an environment variable.
+     *
+     * @param \Civi\CompilePlugin\Task $task
+     */
+    public static function export(Task $task)
+    {
+        $data = base64_encode(gzencode(json_encode($task->definition)));
+        if (strlen($data) < self::MAX_ENV_SIZE) {
+            putenv(self::ENV_VAR . '=' . $data);
+        } else {
+            $tempFile = tempnam(sys_get_temp_dir(), 'composer-compile-');
+            file_put_contents($tempFile, json_encode($task->definition));
+            putenv(self::ENV_VAR . '=@' . $tempFile);
+        }
+    }
+
+    /**
+     * Import the task definition from an environment variable.
+     */
+    public static function import()
+    {
+        $raw = getenv(self::ENV_VAR);
+        if ($raw === false || $raw === '') {
+            fprintf(STDERR, "WARNING: Failed to read compilation-task from %s. Please use \"composer compile\".\n", self::ENV_VAR);
+            $GLOBALS[self::GLOBAL_VAR] = [];
+            return;
+        }
+
+        if ($raw[0] === '@') {
+            $file = substr($raw, 1);
+            $GLOBALS[self::GLOBAL_VAR] = json_decode(file_get_contents($file), 1);
+        } else {
+            $GLOBALS[self::GLOBAL_VAR] = json_decode(gzdecode(base64_decode($raw)), 1);
+        }
+    }
+
+    /**
+     * After executing a subtask, cleanup any variables/files that we created.
+     */
+    public static function cleanup()
+    {
+        $raw = getenv(self::ENV_VAR);
+        if ($raw[0] === '@') {
+            $file = substr($raw, 1);
+            unlink($file);
+        }
+        putenv(self::ENV_VAR);
+    }
+
+    /**
+     * @return string
+     *   PHP code to setup a global variable with the active task.
+     */
+    public static function createImportStatement()
+    {
+        return sprintf('%s::import();', self::CLASS);
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/ComposerIoTrait.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/ComposerIoTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..b6b7162de966b7b44201cc4395874e68e10bfe7d
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/ComposerIoTrait.php
@@ -0,0 +1,37 @@
+<?php
+namespace Civi\CompilePlugin\Util;
+
+use Composer\Composer;
+use Composer\IO\IOInterface;
+
+/**
+ * Class ComposerIoTrait
+ * @package Civi\CompilePlugin\Util
+ *
+ * Small bit of sugar for the common-case where a class injects $composer + $io.
+ */
+trait ComposerIoTrait
+{
+    /**
+     * @var Composer
+     */
+    protected $composer;
+
+    /**
+     * @var IOInterface
+     */
+    protected $io;
+
+    /**
+     * TaskList constructor.
+     * @param \Composer\Composer $composer
+     * @param \Composer\IO\IOInterface $io
+     */
+    public function __construct(
+        \Composer\Composer $composer,
+        \Composer\IO\IOInterface $io
+    ) {
+        $this->composer = $composer;
+        $this->io = $io;
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/ComposerPassthru.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/ComposerPassthru.php
new file mode 100644
index 0000000000000000000000000000000000000000..d18454400b4127c25b61c31fa7521b8d3c32b212
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/ComposerPassthru.php
@@ -0,0 +1,87 @@
+<?php
+namespace Civi\CompilePlugin\Util;
+
+use Composer\Composer;
+use Composer\EventDispatcher\EventDispatcher;
+use Composer\IO\IOInterface;
+
+/**
+ * Class ComposerPassthru
+ * @package Civi\CompilePlugin\Util
+ *
+ * Place a call to composer in a subprocess.
+ *
+ * Unlike EventDispatcher and ShellRunner, this variant is supposed to be
+ * pass-thru console I/O.
+ *
+ * This is useful for protecting against quirky scenarios mid-upgrade.
+ * @link https://github.com/civicrm/composer-compile-plugin/issues/7
+ */
+class ComposerPassthru
+{
+
+    use ComposerIoTrait {
+        __construct as constructComposerIo;
+    }
+
+    /**
+     * List of basic 'composer' options that will be passed
+     * through to any/all subcommands.
+     *
+     * @var string[]
+     */
+    protected $options;
+
+    public function __construct(Composer $composer, IOInterface $io)
+    {
+        $this->constructComposerIo($composer, $io);
+        if ($io->isDecorated()) {
+            $this->options[] = '--ansi';
+        }
+
+        if (!$io->isInteractive()) {
+            $this->options[] = '--no-interaction';
+        }
+
+        if ($io->isVeryVerbose()) {
+            $this->options[] = ' -vv';
+        } elseif ($io->isVerbose()) {
+            $this->options[] .= '-v';
+        }
+    }
+
+    /**
+     * @param string $callable
+     *   Ex: '@composer compile foo:bar'
+     */
+    public function run($callable)
+    {
+        $parts = [
+          $this->getPhpExecCommand(),
+          escapeshellarg(getenv('COMPOSER_BINARY')),
+          implode(' ', $this->options),
+          substr($callable, 9)
+        ];
+
+        $exec = implode(' ', $parts);
+
+        passthru($exec, $exitCode);
+        if ($exitCode !== 0) {
+            $message = sprintf('Subcommand %s returned with error code %d', $callable, $exitCode);
+            $this->io->writeError("<error>$message</error>", true, IOInterface::QUIET);
+            throw new \RuntimeException($message);
+        }
+    }
+
+    protected function getPhpExecCommand()
+    {
+        $d = new class($this->composer, $this->io) extends EventDispatcher
+        {
+            public function exfiltratePhpExec()
+            {
+                return $this->getPhpExecCommand();
+            }
+        };
+        return $d->exfiltratePhpExec();
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/EnvHelper.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/EnvHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..a954435ce8a63569ce7eda410497b61bbad5e3ed
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/EnvHelper.php
@@ -0,0 +1,51 @@
+<?php
+namespace Civi\CompilePlugin\Util;
+
+class EnvHelper
+{
+
+    /**
+     * @return string[]
+     *   Key-value pairs.
+     */
+    public static function getAll()
+    {
+        // Huzza, PHP 7.1
+        return getenv();
+    }
+
+    /**
+     * Set the full environment, precisely.
+     *
+     * @param array $newEnv
+     *   The new environment. Key-value pairs.
+     *   All other environment variables will be removed.
+     */
+    public static function setAll($newEnv)
+    {
+        $currentEnv = self::getAll();
+        $allKeys = array_unique(array_merge(array_keys($currentEnv), array_keys($newEnv)));
+        foreach ($allKeys as $key) {
+            if (!isset($currentEnv[$key])) {
+                putenv("$key=" . $newEnv[$key]);
+            } elseif (!isset($newEnv[$key])) {
+                putenv("$key");
+            } elseif ($currentEnv[$key] !== $newEnv[$key]) {
+                putenv("$key=" . $newEnv[$key]);
+            }
+        }
+    }
+
+    /**
+     * Add variables to the environment.
+     *
+     * @param array $vars
+     *   The new environment. Key-value pairs.
+     */
+    public static function add($vars)
+    {
+        foreach ($vars as $key => $value) {
+            putenv("$key=$value");
+        }
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/IOFilter.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/IOFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..4f27a0367771f5d8cc99a2f8530edac5c0723aef
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/IOFilter.php
@@ -0,0 +1,141 @@
+<?php
+namespace Civi\CompilePlugin\Util;
+
+use Composer\IO\BaseIO;
+use Composer\IO\IOInterface;
+
+/**
+ * Class IOFilter
+ * @package Civi\CompilePlugin\Util
+ *
+ * This is a base-class for implementing a wrapper around IOInterface.
+ */
+class IOFilter extends BaseIO implements IOInterface
+{
+    /**
+     * @var IOInterface
+     */
+    protected $delegate;
+
+    /**
+     * IOFilter constructor.
+     * @param IOInterface $delegate
+     */
+    public function __construct($delegate)
+    {
+        $this->delegate = $delegate;
+    }
+
+    public function isInteractive()
+    {
+        return $this->delegate->isInteractive();
+    }
+
+    public function isVerbose()
+    {
+        return $this->delegate->isVerbose();
+    }
+
+    public function isVeryVerbose()
+    {
+        return $this->delegate->isVeryVerbose();
+    }
+
+    public function isDebug()
+    {
+        return $this->delegate->isDebug();
+    }
+
+    public function isDecorated()
+    {
+        return $this->delegate->isDecorated();
+    }
+
+    public function write($messages, $newline = true, $verbosity = self::NORMAL)
+    {
+        return $this->delegate->write($messages, $newline, $verbosity);
+    }
+
+    public function writeError(
+        $messages,
+        $newline = true,
+        $verbosity = self::NORMAL
+    ) {
+        return $this->delegate->writeError($messages, $newline, $verbosity);
+    }
+
+    public function overwrite(
+        $messages,
+        $newline = true,
+        $size = null,
+        $verbosity = self::NORMAL
+    ) {
+        return $this->delegate->overwrite(
+            $messages,
+            $newline,
+            $size,
+            $verbosity
+        );
+    }
+
+    public function overwriteError(
+        $messages,
+        $newline = true,
+        $size = null,
+        $verbosity = self::NORMAL
+    ) {
+        return $this->delegate->overwriteError(
+            $messages,
+            $newline,
+            $size,
+            $verbosity
+        );
+    }
+
+    public function ask($question, $default = null)
+    {
+        return $this->delegate->ask($question, $default);
+    }
+
+    public function askConfirmation($question, $default = true)
+    {
+        return $this->delegate->askConfirmation($question, $default);
+    }
+
+    public function askAndValidate(
+        $question,
+        $validator,
+        $attempts = null,
+        $default = null
+    ) {
+        return $this->delegate->askAndValidate(
+            $question,
+            $validator,
+            $attempts,
+            $default
+        );
+    }
+
+    public function askAndHideAnswer($question)
+    {
+        return $this->delegate->askAndHideAnswer($question);
+    }
+
+    public function select(
+        $question,
+        $choices,
+        $default,
+        $attempts = false,
+        $errorMessage = 'Value "%s" is invalid',
+        $multiselect = false
+    ) {
+        return $this->delegate->select(
+            $question,
+            $choices,
+            $default,
+            $attempts,
+            $errorMessage,
+            $multiselect
+        );
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/PassthruPolicyFilter.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/PassthruPolicyFilter.php
new file mode 100644
index 0000000000000000000000000000000000000000..db2c99297efc1fcfdcbcbe4cacc49b5234b8edd8
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/PassthruPolicyFilter.php
@@ -0,0 +1,212 @@
+<?php
+namespace Civi\CompilePlugin\Util;
+
+use Composer\IO\IOInterface;
+
+/**
+ * Class PassthruPolicyFilter
+ * @package Civi\CompilePlugin\Util
+ *
+ * This provides a variant of IOInterface in which output abides by the "passthru"
+ * policy, i.e.
+ *    - 'always': Print all output
+ *    - 'error': Only print output if there's an error. Requires buffering.
+ *    - 'never': Do not print anything
+ */
+class PassthruPolicyFilter extends IOFilter
+{
+
+    /**
+     * @var string
+     *   One of: 'always', 'error', 'never'
+     */
+    private $mode;
+
+    /**
+     * @var string[]
+     */
+    private $buffer;
+
+    /**
+     * @var callable
+     */
+    private $checkMessage;
+
+    /**
+     * PassthruPolicyFilter constructor.
+     * @param IOInterface $delegate ;
+     * @param string $mode
+     *   One of: 'always', 'error', 'never'
+     * @param callable $checkMessage
+     *   Check if a message represents an error. This is used to switch from
+     *   buffer-mode to output mode.
+     *   Signature: `function(string $msg, string $method): bool`
+     */
+    public function __construct($delegate, $mode, $checkMessage)
+    {
+        parent::__construct($delegate);
+        $this->mode = $mode;
+        $this->checkMessage = $checkMessage;
+        switch ($mode) {
+            case 'always':
+            case 'never':
+                $this->buffer = null;
+                break;
+            case 'error':
+                $this->buffer = [];
+                break;
+            default:
+                throw new \InvalidArgumentException("Unrecognized passthru mode: $mode");
+        }
+    }
+
+    private function onBufferMessage($method, $args)
+    {
+        $this->buffer[] = [$method, $args];
+
+        if ($this->mode === 'flushing') {
+            return;
+        }
+
+        $isError = false;
+        $messages = (array)$args[0];
+        foreach ($messages as $message) {
+            if (call_user_func($this->checkMessage, $message, $method)) {
+                $isError = true;
+                break;
+            }
+        }
+
+        if ($isError) {
+            $this->mode = 'flushing';
+            for ($i = 0; $i < count($this->buffer); $i++) {
+                call_user_func_array([$this->delegate, $this->buffer[$i][0]], $this->buffer[$i][1]);
+            }
+            $this->mode = 'always';
+            $this->buffer = null;
+        }
+    }
+
+    public function writeRaw(
+        $messages,
+        $newline = true,
+        $verbosity = self::NORMAL
+    ) {
+        switch ($this->mode) {
+            case 'always':
+                return $this->delegate->writeRaw(
+                    $messages,
+                    $newline,
+                    $verbosity
+                );
+            case 'error':
+            case 'flushing':
+                return $this->onBufferMessage(
+                    __FUNCTION__,
+                    [$messages, $newline, $verbosity]
+                );
+        }
+    }
+
+    public function writeErrorRaw(
+        $messages,
+        $newline = true,
+        $verbosity = self::NORMAL
+    ) {
+        switch ($this->mode) {
+            case 'always':
+                return $this->delegate->writeErrorRaw(
+                    $messages,
+                    $newline,
+                    $verbosity
+                );
+            case 'error':
+            case 'flushing':
+                return $this->onBufferMessage(
+                    __FUNCTION__,
+                    [$messages, $newline, $verbosity]
+                );
+        }
+    }
+
+    public function write($messages, $newline = true, $verbosity = self::NORMAL)
+    {
+        switch ($this->mode) {
+            case 'always':
+                return $this->delegate->write($messages, $newline, $verbosity);
+            case 'error':
+            case 'flushing':
+                return $this->onBufferMessage(
+                    __FUNCTION__,
+                    [$messages, $newline, $verbosity]
+                );
+        }
+    }
+
+    public function writeError(
+        $messages,
+        $newline = true,
+        $verbosity = self::NORMAL
+    ) {
+        switch ($this->mode) {
+            case 'always':
+                return $this->delegate->writeError(
+                    $messages,
+                    $newline,
+                    $verbosity
+                );
+            case 'error':
+            case 'flushing':
+                return $this->onBufferMessage(
+                    __FUNCTION__,
+                    [$messages, $newline, $verbosity]
+                );
+        }
+    }
+
+    public function overwrite(
+        $messages,
+        $newline = true,
+        $size = null,
+        $verbosity = self::NORMAL
+    ) {
+        switch ($this->mode) {
+            case 'always':
+                return $this->delegate->overwrite(
+                    $messages,
+                    $newline,
+                    $size,
+                    $verbosity
+                );
+            case 'error':
+            case 'flushing':
+                return $this->onBufferMessage(
+                    __FUNCTION__,
+                    [$messages, $newline, $size, $verbosity]
+                );
+        }
+    }
+
+    public function overwriteError(
+        $messages,
+        $newline = true,
+        $size = null,
+        $verbosity = self::NORMAL
+    ) {
+        switch ($this->mode) {
+            case 'always':
+                return $this->delegate->overwriteError(
+                    $messages,
+                    $newline,
+                    $size,
+                    $verbosity
+                );
+            case 'error':
+            case 'flushing':
+                return $this->onBufferMessage(
+                    __FUNCTION__,
+                    [$messages, $newline, $size, $verbosity]
+                );
+        }
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/Script.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/Script.php
new file mode 100644
index 0000000000000000000000000000000000000000..68f5e7acf1aafdbb35b781f263cd33c3ea5f845d
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/Script.php
@@ -0,0 +1,34 @@
+<?php
+namespace Civi\CompilePlugin\Util;
+
+/**
+ * Class Script
+ * @package Civi\CompilePlugin\Util
+ *
+ * Small helper methods for use in task-scripts.
+ *
+ */
+class Script
+{
+    /**
+     * Assert that we are properly executing within the context of a compilation ask.
+     */
+    public static function assertTask()
+    {
+        if (empty($GLOBALS['COMPOSER_COMPILE_TASK']) || empty(getenv('COMPOSER_COMPILE_TASK'))) {
+            fwrite(STDERR, "This script may only be invoked via \"composer compile\".\n");
+            exit(1);
+        }
+    }
+
+    /**
+     * Get the task-definition.
+     *
+     * @return array
+     *   The task definition, as per `composer.json` (possibly with some defaults/mappings filled in).
+     */
+    public static function getTask()
+    {
+        return $GLOBALS['COMPOSER_COMPILE_TASK'];
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/ShellRunner.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/ShellRunner.php
new file mode 100644
index 0000000000000000000000000000000000000000..24b57bc4de9327c66e8fc329484436bf053be2de
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/ShellRunner.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Civi\CompilePlugin\Util;
+
+use Composer\EventDispatcher\Event;
+use Composer\EventDispatcher\EventDispatcher;
+
+class ShellRunner
+{
+
+    use ComposerIoTrait;
+
+    /**
+     * Run a shell command in the same style as Composer's EventDispatcher.
+     *
+     * @param string $cmd
+     *   Ex: '@php -r "echo 123;"'
+     *   Ex: '@composer require foo/bar'
+     */
+    public function run($cmd)
+    {
+        $d = new EventDispatcher($this->composer, $this->io);
+        $d->addListener('shell-runner', $cmd);
+        $d->dispatch('shell-runner', new Event('shell-runner'));
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/TableHelper.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/TableHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..1279982e5ec51ab47dd2eeecdb1576a0d87bfdda
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/TableHelper.php
@@ -0,0 +1,64 @@
+<?php
+namespace Civi\CompilePlugin\Util;
+
+use Symfony\Component\Console\Output\OutputInterface;
+
+class TableHelper
+{
+
+    /**
+     * @param array $header
+     *   Ex: ['Column A', 'Column B']
+     * @param array $rows
+     *   Ex: [[10,20,30], [11,21,31]]
+     * @return string
+     */
+    public static function formatTable($header, $rows)
+    {
+        // Hard dice: we don't know what version of Symfony Console is around.
+
+        $stripMeta = function ($s) {
+            return preg_replace(';</?(info|comment|error)>;', '', $s);
+        };
+
+        $colCount = count($header);
+        $colWidths = [];
+        for ($col = 0; $col < $colCount; $col++) {
+            $colWidths[$col] = strlen($stripMeta($header[$col]));
+            foreach ($rows as $row) {
+                $colWidths[$col] = max($colWidths[$col], strlen($stripMeta($row[$col])));
+            }
+        }
+
+        $mkRow = function ($row) use ($colWidths, $stripMeta) {
+            $buf = '';
+            foreach ($row as $col => $cell) {
+                $buf .= '| ';
+                $buf .= $cell;
+                $buf .= str_repeat(' ', $colWidths[$col] - strlen($stripMeta($cell)));
+                $buf .= ' ';
+            }
+            $buf .= '|';
+            return $buf;
+        };
+
+        $bold = function ($c) {
+            return "<info>$c</info>";
+        };
+
+        $hrPattern = '+';
+        for ($col = 0; $col < $colCount; $col++) {
+            $hrPattern .= str_repeat('-', 2 + $colWidths[$col]) . '+';
+        }
+
+        $buf = '';
+        $buf .= $hrPattern . "\n";
+        $buf .= $mkRow(array_map($bold, $header)) . "\n";
+        $buf .= $hrPattern . "\n";
+        foreach ($rows as $row) {
+            $buf .= $mkRow($row) . "\n";
+        }
+        $buf .= $hrPattern . "\n";
+        return $buf;
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/TaskUIHelper.php b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/TaskUIHelper.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c927b4661e4fd9e83921951f26185ffdcaebb8b
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/Util/TaskUIHelper.php
@@ -0,0 +1,116 @@
+<?php
+namespace Civi\CompilePlugin\Util;
+
+use Civi\CompilePlugin\Subscriber\OldTaskAdapter;
+use Civi\CompilePlugin\Subscriber\ShellSubscriber;
+use Civi\CompilePlugin\Task;
+
+class TaskUIHelper
+{
+
+    /**
+     * Make a bulleted list to summarize the tasks.
+     *
+     * @param Task[] $tasks
+     * @return string
+     */
+    public static function formatTaskSummary($tasks)
+    {
+        $tallies = [];
+        foreach ($tasks as $task) {
+            $tallies[$task->packageName] = $tallies[$task->packageName] ?? 0;
+            $tallies[$task->packageName]++;
+        }
+        $buf = '';
+        foreach ($tallies as $package => $tally) {
+            if ($tally === 1) {
+                $buf .= sprintf(
+                    " - <comment>%s</comment> has <comment>%d</comment> task\n",
+                    $package,
+                    $tally
+                );
+            } else {
+                $buf .= sprintf(
+                    " - <comment>%s</comment> has <comment>%d</comment> task(s)\n",
+                    $package,
+                    $tally
+                );
+            }
+        }
+        return $buf;
+    }
+
+    /**
+     * Make a table displaying a list of tasks.
+     *
+     * @param Task[] $tasks
+     * @param string[] $fields
+     *   List of fields/columns to display.
+     *   Some mix of: 'active', 'id', 'packageName', 'title', 'action'
+     * @return string
+     */
+    public static function formatTaskTable($tasks, $fields)
+    {
+        $availableHeaders = ['active' => '', 'id' => 'ID', 'packageName' => 'Package', 'title' => 'Title', 'action' => 'Action'];
+
+        $header = [];
+        foreach ($fields as $field) {
+            $header[] = $availableHeaders[$field];
+        }
+
+        $fmtRun = function ($run) {
+            return sprintf('<info>@%s</info> %s', $run['type'], $run['code']);
+        };
+
+        $makeMainRow = function (Task $task, $runExpr) use ($fields) {
+            $row = [];
+            foreach ($fields as $field) {
+                switch ($field) {
+                    case 'active':
+                        $row[] = $task->active ? '+' : '-';
+                        break;
+
+                    case 'action':
+                        $row[] = $runExpr;
+                        break;
+
+                    default:
+                        $row[] = $task->{$field};
+                        break;
+                }
+            }
+            return $row;
+        };
+
+        $makeExtraRow = function (Task $task, $runExpr) use ($fields) {
+            $row = [];
+            foreach ($fields as $field) {
+                switch ($field) {
+                    case 'action':
+                        $row[] = $runExpr;
+                        break;
+
+                    default:
+                        $row[] = '';
+                        break;
+                }
+            }
+            return $row;
+        };
+
+        $rows = [];
+        foreach ($tasks as $task) {
+            /** @var Task $task */
+            if (in_array('action', $fields)) {
+                foreach ($task->getParsedRun() as $n => $run) {
+                    $maker = ($n === 0) ? $makeMainRow : $makeExtraRow;
+                    $rows[] = $maker($task, $fmtRun($run));
+                }
+            } else {
+                $rows[] = $makeMainRow($task, null);
+            }
+        }
+
+        return TableHelper::formatTable($header, $rows);
+    }
+}
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/messages/cannot-prompt.txt b/civicrm/vendor/civicrm/composer-compile-plugin/src/messages/cannot-prompt.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9987ad6b5fef7b106bc2dc03b2853de69584292a
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/messages/cannot-prompt.txt
@@ -0,0 +1,15 @@
+<error>WARNING: Unattended installation should have a compilation policy.</error>
+
+If any packages require unrecognized compilation steps, composer will
+prompt for approval. However, it is not possible to prompt during unattended
+installation.
+
+You should set a preference via environment-variable or composer
+configuration, e.g.
+
+ - <comment>export COMPOSER_COMPILE=all</comment>
+ - <comment>export COMPOSER_COMPILE=whitelist</comment>
+ - <comment>export COMPOSER_COMPILE=none</comment>
+ - <comment>composer config extra.compile-mode all</comment>
+ - <comment>composer config extra.compile-mode whitelist</comment>
+ - <comment>composer config extra.compile-mode none</comment>
diff --git a/civicrm/vendor/civicrm/composer-compile-plugin/src/messages/prompt-help.txt b/civicrm/vendor/civicrm/composer-compile-plugin/src/messages/prompt-help.txt
new file mode 100644
index 0000000000000000000000000000000000000000..9f129b37ce9f7bd571aa5a0410626e2dd063908b
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-compile-plugin/src/messages/prompt-help.txt
@@ -0,0 +1,16 @@
+Some packages require executing compilation tasks, such as converting SCSS to CSS.
+
+<info>The options are</info>:
+
+- <comment>Yes</comment>: Run tasks from these packages (this time)
+- <comment>Always</comment>: Run tasks from these packages (now and in the future)
+- <comment>No</comment>: Do not run these new tasks
+- <comment>List</comment>: Display full list of tasks
+
+<info>To avoid asking this question in the future</info>, you may set a preference via
+environment variable or composer configuration, e.g.
+
+ - <comment>export COMPOSER_COMPILE=all</comment>
+ - <comment>export COMPOSER_COMPILE=none</comment>
+ - <comment>composer config extra.compile-mode all</comment>
+ - <comment>composer config extra.compile-mode none</comment>
diff --git a/civicrm/vendor/civicrm/composer-downloads-plugin/.github/workflows/main.yml b/civicrm/vendor/civicrm/composer-downloads-plugin/.github/workflows/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..026f0d72bac45ed0343657634f3d3014b5a2e86c
--- /dev/null
+++ b/civicrm/vendor/civicrm/composer-downloads-plugin/.github/workflows/main.yml
@@ -0,0 +1,36 @@
+name: PHP Composer
+
+on:
+  push:
+  pull_request:
+    branches: [ master ]
+
+jobs:
+  phpunit:
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        php: [7.4, 7.3]
+        os: [ubuntu-latest]
+        composer: [v1, v2]
+    name: ${{ matrix.php }} - PHPUnit - Composer ${{ matrix.composer }}
+    steps:
+      - uses: actions/checkout@v2
+      - uses: actions/cache@v2
+        with:
+            path: |
+              ~/.composer/cache/files
+              ~/.composer/cache/repo
+            key: dependencies-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }}
+      - uses: shivammathur/setup-php@v2
+        with:
+            php-version: ${{ matrix.php }}
+            extensions: dom, curl, libxml, mbstring, zip, pdo, mysql, pdo_mysql, bcmath, soap, intl, gd, exif, iconv
+            coverage: none
+            tools: composer:${{ matrix.composer }}
+      - name: Validate composer.json
+        run: composer validate
+      - name: Install dependencies
+        run: composer install --prefer-dist --no-progress --no-suggest
+      - name: Run tests
+        run: ./vendor/bin/phpunit
diff --git a/civicrm/vendor/civicrm/composer-downloads-plugin/README.md b/civicrm/vendor/civicrm/composer-downloads-plugin/README.md
index 9292beb966306a7b9530aa43cb4ef44d3d46e72c..7ca12bfacfcb2049af321d0c72eec7f544195b31 100644
--- a/civicrm/vendor/civicrm/composer-downloads-plugin/README.md
+++ b/civicrm/vendor/civicrm/composer-downloads-plugin/README.md
@@ -1,23 +1,26 @@
 Composer Downloads Plugin
 ===========================
 
-> This is a fork of [lastcall/composer-extra-files](https://github.com/LastCallMedia/ComposerExtraFiles/). Some of the
-> configuration options have changed, so it has been renamed to prevent it from conflicting in real-world usage.
+The "Downloads" plugin allows you to download extra files (`*.zip` or `*.tar.gz`) and extract them within your package.
 
-This `composer` plugin allows you to download extra files (`*.zip` or `*.tar.gz`) and extract them within your package.
+This is an updated version of [lastcall/composer-extra-files](https://github.com/LastCallMedia/ComposerExtraFiles/).
+It adds integration tests, fixes some bugs, and makes a few other improvements. Some of the
+configuration options have changed, so it has been renamed to prevent it from conflicting in real-world usage.
 
-For example, suppose you publish a PHP package `foo/bar` which relies on an external artifact `examplelib-0.1.zip` (containing some JS, CSS, or image). Place this configuration in the `composer.json` for `foo/bar`:
+## Example
+
+Suppose you publish a PHP package `foo/bar` which relies on an external artifact `examplelib-0.1.zip`. Place this configuration in the `composer.json` for `foo/bar`:
 
 ```json
 {
   "name": "foo/bar",
   "require": {
-    "civicrm/composer-downloads-plugin": "~1.0"
+    "civicrm/composer-downloads-plugin": "~2.1"
   },
   "extra": {
     "downloads": {
       "examplelib": {
-        "url": "`https://example.com/examplelib-0.1.zip`",
+        "url": "https://example.com/examplelib-0.1.zip",
         "path": "extern/examplelib",
         "ignore": ["test", "doc", ".*"]
       }
@@ -28,22 +31,26 @@ For example, suppose you publish a PHP package `foo/bar` which relies on an exte
 
 When a downstream user of `foo/bar` runs `composer install`, it will fetch and extract the zip file, creating `vendor/foo/bar/extern/examplelib`. 
 
-This does not require consumers of `foo/bar` to make any special changes in their root-level project, and it uses `composer`'s built-in cache system.
+## Evaluation
+
+The primary strengths of `composer-downloads-plugin` are:
 
-## When should I use this?
+* __Simple__: It downloads a URL (ZIP/TAR file) and extracts it. It only needs to know two things: *what to download* (`url`) and *where to put it* (`path`). It runs as pure-PHP without any external dependencies.
+* __Fast__: The logic does not require scanning, indexing, or mapping any large registries. The download system uses `composer`'s built-in cache.
+* __Isolated__: As the author of a package `foo/bar`, you define the content under the `vendor/foo/bar` folder. When others use `foo/bar`, there is no need for special instructions, no root-level configuration, no interaction with other packages.
 
-The most common use-case is if you have compiled front-end code, where the compiled version is never committed to a git repository, and therefore isn't registered on packagist.org.  For example, if you want your distributed package to depend on an NPM/Bower package.
+The "Downloads" plugin is only a download mechanism. Use it to *assimilate* an external resource as part of a `composer` package.
 
-If you have the ability to maintain the root `composer.json` of consumers, then consider these alternatives -- when using multiple NPM/Bower packages, they provide more robust functionality (such as automatic updates and version-constraints).
+The "Downloads" plugin is __not__ a *dependency management system*. There is no logic to scan registries, resolve transitive dependencies, identify version-conflicts, etc among diverse external resources.  If you need that functionality, then you may want a *bridge* to integrate `composer` with an external dependency management tool. A few good bridges to consider:
 
 * [Asset Packagist](https://asset-packagist.org/)
 * [Composer Asset Plugin](https://github.com/fxpio/composer-asset-plugin)
-
-The `downloads` approach is most appropriate if (a) you publish an intermediate (non-root) project to diverse consumers and (b) the external assets are relatively stable.
+* [Composer Bower Plugin](https://github.com/php-kit/composer-bower-plugin)
+* [Foxy](https://github.com/fxpio/foxy)
 
 ## Configuration: Properties
 
-The `downloads` contains a list of files to download. Each extra-file as a symbolic ID (e.g. `examplelib` above) and some mix of properties:
+The `extra.downloads` section contains a list of files to download. Each extra-file has a symbolic ID (e.g. `examplelib` above) and some mix of properties:
 
 * `url`: The URL to fetch the content from.
 
@@ -66,7 +73,7 @@ Values in `url` and `path` support the following variables:
 
 ## Configuration: Defaults
 
-You may set default values for downloaded files using the `*` entry.
+You may set default properties for all downloads. Place them under `*`, as in:
 
 ```json
 {
@@ -87,13 +94,18 @@ You may set default values for downloaded files using the `*` entry.
 }
 ```
 
+This example will:
+
+* Create `bower_components/jquery` (based on jQuery 1.12.4), minus any test/doc folders.
+* Create `bower_components/jquery-ui` (based on jQueryUI 1.12.1), minus any test/doc folders.
+
 ## Tips
 
-In each downloaded folder, this plugin will create a small metadata folder (`.composer-downloads`) to track the origin of the current code. If you modify the `composer.json` to use a different URL, then it will re-download the file.
+* In each downloaded folder, this plugin will create a small metadata folder (`.composer-downloads`) to track the origin of the current code. If you modify the `composer.json` to use a different URL, then it will re-download the file.
 
-Download each extra file to a distinct `path`. Don't try to download into overlapping paths. (*This has not been tested, but it may lead to extraneous deletions/re-downloads.*)
+* Download each extra file to a distinct `path`. Don't try to download into overlapping paths. (*This has not been tested, but I expect downloads are not well-ordered, and you may find that updates require re-downloading.*)
 
-What should you do if you *normally* download the extra-file as `*.tgz` but sometimes (for local dev) need to grab bleeding edge content from somewhere else?  Simply delete the autodownloaded folder and replace it with your own.  `composer-downloads-plugin` will detect that conflict (by virtue of the absent `.composer-downloads`) and leave your code in place (until you choose to get rid of it). To switch back, you can simply delete the code and run `composer install` again.
+* What should you do if you *normally* download the extra-file as `*.tar.gz` but sometimes (for local dev) need to grab bleeding edge content from somewhere else?  Simply delete the autodownloaded folder and replace it with your own.  `composer-downloads-plugin` will detect that conflict (by virtue of the absent `.composer-downloads`) and leave your code in place (until you choose to get rid of it). To switch back, you can simply delete the code and run `composer install` again.
 
 ## Known Limitations
 
diff --git a/civicrm/vendor/civicrm/composer-downloads-plugin/composer.json b/civicrm/vendor/civicrm/composer-downloads-plugin/composer.json
index 1e83d1e55dd560bdff04d6417d6e0a5c7b6b7dbd..6e51f4d51d78579276e8a56730ed1e175e3237e7 100644
--- a/civicrm/vendor/civicrm/composer-downloads-plugin/composer.json
+++ b/civicrm/vendor/civicrm/composer-downloads-plugin/composer.json
@@ -14,12 +14,12 @@
         }
     ],
     "require": {
-        "composer-plugin-api": "^1.1",
+        "composer-plugin-api": "^1.1 || ^2.0",
         "php": ">=5.6",
         "togos/gitignore": "~1.1.1"
     },
     "require-dev": {
-        "composer/composer": "~1.0",
+        "composer/composer": "~1.0 || ~2.0",
         "phpunit/phpunit": "^5.7",
         "friendsofphp/php-cs-fixer": "^2.3",
         "totten/process-helper": "^1.0.1"
diff --git a/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/ArchiveHandler.php b/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/ArchiveHandler.php
index 81b99a0209f9a142c0796337a97792a5345c54e8..f9a8f52a4d44c4ce51cda6339121ddcbcf2a6210 100644
--- a/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/ArchiveHandler.php
+++ b/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/ArchiveHandler.php
@@ -72,7 +72,17 @@ class ArchiveHandler extends BaseHandler
     {
         $targetPath = $this->getTargetPath();
         $downloadManager = $composer->getDownloadManager();
-        $downloadManager->download($this->getSubpackage(), $targetPath);
+
+        // In composer:v2, download and extract were separated.
+        $version = method_exists(Composer::class, 'getVersion') ? Composer::getVersion() : Composer::VERSION;
+        if (version_compare($version, '2.0.0') >= 0) {
+          $promise = $downloadManager->download($this->getSubpackage(), $targetPath);
+          $composer->getLoop()->wait([$promise]);
+          $promise = $downloadManager->install($this->getSubpackage(), $targetPath);
+          $composer->getLoop()->wait([$promise]);
+        } else {
+          $downloadManager->download($this->getSubpackage(), $targetPath);
+        }
         GlobCleaner::clean($io, $targetPath, $this->findIgnores());
     }
 
diff --git a/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/FileHandler.php b/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/FileHandler.php
index fbf887837322224da7d08cc40d6a484d51ab7735..299a0178c9f08e4529827675fb8033d763975698 100644
--- a/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/FileHandler.php
+++ b/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/FileHandler.php
@@ -5,6 +5,7 @@ namespace LastCall\DownloadsPlugin\Handler;
 use Composer\Composer;
 use Composer\IO\IOInterface;
 use Composer\Util\Filesystem;
+use React\Promise\PromiseInterface;
 
 class FileHandler extends BaseHandler
 {
@@ -41,22 +42,35 @@ class FileHandler extends BaseHandler
         if (file_exists($tmpDir)) {
             $cfs->remove($tmpDir);
         }
+        if (file_exists($target)) {
+          $cfs->remove($target);
+        }
 
         $pkg = clone $this->getSubpackage();
         $pkg->setTargetDir($tmpDir);
         $downloadManager = $composer->getDownloadManager();
-        $downloadManager->download($pkg, $tmpDir);
-
-        if (file_exists($target)) {
-            $cfs->remove($target);
+        // composer:v2
+        $version = method_exists(Composer::class, 'getVersion') ? Composer::getVersion() : Composer::VERSION;
+        if (version_compare($version, '2.0.0') >= 0) {
+          $file = '';
+          $promise = $downloadManager->download($pkg, $tmpDir);
+          $promise->then(static function($res) use (&$file) {
+            $file = $res;
+          });
+          $composer->getLoop()->wait([$promise]);
+          $cfs->rename($file, $target);
+          $cfs->remove($tmpDir);
         }
-
-        foreach ((array)glob("$tmpDir/*") as $file) {
+        // composer:v1
+        else {
+          $downloadManager->download($pkg, $tmpDir);
+          foreach ((array)glob("$tmpDir/*") as $file) {
             if (is_file($file)) {
-                $cfs->rename($file, $target);
-                $cfs->remove($tmpDir);
-                break;
+              $cfs->rename($file, $target);
+              $cfs->remove($tmpDir);
+              break;
             }
+          }
         }
     }
 
diff --git a/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/PharHandler.php b/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/PharHandler.php
index 1e531de7d4be6926d04f7199aad453eb8b32f7b8..450fbe32cf08d407c4b123d367330ff05ff7bb7c 100644
--- a/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/PharHandler.php
+++ b/civicrm/vendor/civicrm/composer-downloads-plugin/src/Handler/PharHandler.php
@@ -25,4 +25,4 @@ class PharHandler extends FileHandler
     }
 
 
-}
\ No newline at end of file
+}
diff --git a/civicrm/vendor/civicrm/composer-downloads-plugin/src/Plugin.php b/civicrm/vendor/civicrm/composer-downloads-plugin/src/Plugin.php
index 083cdb916913307077413678c4128d1275257d2d..23def5b041dada3d459c0726d2124c93d34956aa 100644
--- a/civicrm/vendor/civicrm/composer-downloads-plugin/src/Plugin.php
+++ b/civicrm/vendor/civicrm/composer-downloads-plugin/src/Plugin.php
@@ -84,6 +84,16 @@ class Plugin implements PluginInterface, EventSubscriberInterface
         $this->io = $io;
     }
 
+    public function deactivate(Composer $composer, IOInterface $io)
+    {
+        // @todo determine if any operation required.
+    }
+
+    public function uninstall(Composer $composer, IOInterface $io)
+    {
+        // @todo determine if any operation required.
+    }
+
     /**
      * @param string $basePath
      * @param PackageInterface $package
@@ -116,7 +126,7 @@ class Plugin implements PluginInterface, EventSubscriberInterface
             }
 
             $this->io->write(sprintf("<info>Download extra file <comment>%s</comment></info>", $extraFilePkg->getName()), TRUE, IOInterface::VERBOSE);
-            $extraFileHandler->download($this->composer, $this->io, $basePath);
+            $extraFileHandler->download($this->composer, $this->io);
 
             if (!file_exists(dirname($trackingFile))) {
                 mkdir(dirname($trackingFile), 0777, TRUE);
diff --git a/civicrm/vendor/composer/autoload_files.php b/civicrm/vendor/composer/autoload_files.php
index 4c42fbeae2637711fb5115d1b0948d153cc6e409..b01007dcf0a4199e6a0d9c3620141b28957ceee9 100644
--- a/civicrm/vendor/composer/autoload_files.php
+++ b/civicrm/vendor/composer/autoload_files.php
@@ -7,8 +7,8 @@ $baseDir = dirname($vendorDir);
 
 return array(
     '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
-    '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
     '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
+    '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php',
     '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
     'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
     '3919eeb97e98d4648304477f8ef734ba' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Random.php',
@@ -18,5 +18,6 @@ return array(
     '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
     '9e4824c5afbdc1482b6025ce3d4dfde8' => $vendorDir . '/league/csv/src/functions_include.php',
     'def43f6c87e4f8dfd0c9e1b1bab14fe8' => $vendorDir . '/symfony/polyfill-iconv/bootstrap.php',
+    '667aeda72477189d0494fecd327c3641' => $vendorDir . '/symfony/var-dumper/Resources/functions/dump.php',
     'bad842bce63596a608e2623519fb382c' => $vendorDir . '/xkerman/restricted-unserialize/src/function.php',
 );
diff --git a/civicrm/vendor/composer/autoload_namespaces.php b/civicrm/vendor/composer/autoload_namespaces.php
index fc4a46d05bf2bd09094d8fb67ea5467bf3404c77..755cdd5e45eb5c7e0c57e3adc9ea87681a9b7ad3 100644
--- a/civicrm/vendor/composer/autoload_namespaces.php
+++ b/civicrm/vendor/composer/autoload_namespaces.php
@@ -14,6 +14,7 @@ return array(
     'Net' => array($vendorDir . '/phpseclib/phpseclib/phpseclib', $vendorDir . '/pear/net_socket', $vendorDir . '/pear/net_smtp'),
     'Math' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'),
     'Mail' => array($vendorDir . '/pear/mail', $vendorDir . '/pear/mail_mime'),
+    'Lurker' => array($vendorDir . '/totten/lurkerlite/src'),
     'Log' => array($vendorDir . '/pear/log'),
     'File' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'),
     'Dflydev\\ApacheMimeTypes' => array($vendorDir . '/dflydev/apache-mime-types/src'),
@@ -22,6 +23,7 @@ return array(
     'Console' => array($vendorDir . '/pear/console_getopt'),
     'Civi\\' => array($baseDir . '/tests/phpunit'),
     'Civi' => array($baseDir . '/'),
+    'CCL' => array($vendorDir . '/civicrm/composer-compile-lib'),
     'CA_Config' => array($vendorDir . '/totten/ca-config/src'),
     'Auth' => array($vendorDir . '/pear/auth_sasl'),
     '' => array($vendorDir . '/pear/pear-core-minimal/src'),
diff --git a/civicrm/vendor/composer/autoload_psr4.php b/civicrm/vendor/composer/autoload_psr4.php
index 3b1d36505253901ee02c98c67d21576242adb410..cc90bdd7c563c3d349d6b6e06ac93df4e5724e4e 100644
--- a/civicrm/vendor/composer/autoload_psr4.php
+++ b/civicrm/vendor/composer/autoload_psr4.php
@@ -7,6 +7,7 @@ $baseDir = dirname($vendorDir);
 
 return array(
     'xKerman\\Restricted\\' => array($vendorDir . '/xkerman/restricted-unserialize/src'),
+    'tubalmartin\\CssMin\\' => array($vendorDir . '/tubalmartin/cssmin/src'),
     'cweagans\\Composer\\' => array($vendorDir . '/cweagans/composer-patches/src'),
     'Zend\\Escaper\\' => array($vendorDir . '/zendframework/zend-escaper/src'),
     'When\\' => array($vendorDir . '/tplaner/when/src'),
@@ -16,6 +17,7 @@ return array(
     'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'),
     'Symfony\\Polyfill\\Iconv\\' => array($vendorDir . '/symfony/polyfill-iconv'),
     'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
+    'Symfony\\Component\\VarDumper\\' => array($vendorDir . '/symfony/var-dumper'),
     'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'),
     'Symfony\\Component\\Finder\\' => array($vendorDir . '/symfony/finder'),
     'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'),
@@ -23,6 +25,7 @@ return array(
     'Symfony\\Component\\DependencyInjection\\' => array($vendorDir . '/symfony/dependency-injection'),
     'Symfony\\Component\\Config\\' => array($vendorDir . '/symfony/config'),
     'Svg\\' => array($vendorDir . '/phenx/php-svg-lib/src/Svg'),
+    'ScssPhp\\ScssPhp\\' => array($vendorDir . '/scssphp/scssphp/src'),
     'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
     'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
     'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
@@ -30,6 +33,7 @@ return array(
     'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
     'PhpOffice\\PhpWord\\' => array($vendorDir . '/phpoffice/phpword/src/PhpWord'),
     'PhpOffice\\Common\\' => array($vendorDir . '/phpoffice/common/src/Common'),
+    'Padaliyajay\\PHPAutoprefixer\\' => array($vendorDir . '/padaliyajay/php-autoprefixer/src'),
     'MimeTyper\\' => array($vendorDir . '/adrienrn/php-mimetyper/src'),
     'MJS\\TopSort\\Tests\\' => array($vendorDir . '/marcj/topsort/tests/Tests'),
     'MJS\\TopSort\\' => array($vendorDir . '/marcj/topsort/src'),
@@ -41,9 +45,11 @@ return array(
     'FontLib\\' => array($vendorDir . '/phenx/php-font-lib/src/FontLib'),
     'Dompdf\\' => array($vendorDir . '/dompdf/dompdf/src'),
     'Civi\\Cxn\\Rpc\\' => array($vendorDir . '/civicrm/civicrm-cxn-rpc/src'),
+    'Civi\\CompilePlugin\\' => array($vendorDir . '/civicrm/composer-compile-plugin/src'),
     'Civi\\' => array($baseDir . '/', $baseDir . '/Civi', $baseDir . '/setup/src'),
     'Cache\\TagInterop\\' => array($vendorDir . '/cache/tag-interop'),
     'Cache\\IntegrationTests\\' => array($vendorDir . '/cache/integration-tests/src'),
+    'CCL\\' => array($vendorDir . '/civicrm/composer-compile-lib/src'),
     'Brick\\Money\\' => array($vendorDir . '/brick/money/src'),
     'Brick\\Math\\' => array($vendorDir . '/brick/math/src'),
 );
diff --git a/civicrm/vendor/composer/autoload_real.php b/civicrm/vendor/composer/autoload_real.php
index 8d780b7acb541145a903da77d58d5100fe69dd90..d5a2be520507f423407cab9e42c7bb026bf81466 100644
--- a/civicrm/vendor/composer/autoload_real.php
+++ b/civicrm/vendor/composer/autoload_real.php
@@ -2,7 +2,7 @@
 
 // autoload_real.php @generated by Composer
 
-class ComposerAutoloaderInit53b94b8697ed3e528623510a6d85b3d5
+class ComposerAutoloaderInit48a04dd099c7551f9f6464ca07a76900
 {
     private static $loader;
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInit53b94b8697ed3e528623510a6d85b3d5
             return self::$loader;
         }
 
-        spl_autoload_register(array('ComposerAutoloaderInit53b94b8697ed3e528623510a6d85b3d5', 'loadClassLoader'), true, true);
+        spl_autoload_register(array('ComposerAutoloaderInit48a04dd099c7551f9f6464ca07a76900', 'loadClassLoader'), true, true);
         self::$loader = $loader = new \Composer\Autoload\ClassLoader();
-        spl_autoload_unregister(array('ComposerAutoloaderInit53b94b8697ed3e528623510a6d85b3d5', 'loadClassLoader'));
+        spl_autoload_unregister(array('ComposerAutoloaderInit48a04dd099c7551f9f6464ca07a76900', 'loadClassLoader'));
 
         $includePaths = require __DIR__ . '/include_paths.php';
         $includePaths[] = get_include_path();
@@ -31,7 +31,7 @@ class ComposerAutoloaderInit53b94b8697ed3e528623510a6d85b3d5
         if ($useStaticLoader) {
             require_once __DIR__ . '/autoload_static.php';
 
-            call_user_func(\Composer\Autoload\ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5::getInitializer($loader));
+            call_user_func(\Composer\Autoload\ComposerStaticInit48a04dd099c7551f9f6464ca07a76900::getInitializer($loader));
         } else {
             $map = require __DIR__ . '/autoload_namespaces.php';
             foreach ($map as $namespace => $path) {
@@ -52,19 +52,19 @@ class ComposerAutoloaderInit53b94b8697ed3e528623510a6d85b3d5
         $loader->register(true);
 
         if ($useStaticLoader) {
-            $includeFiles = Composer\Autoload\ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5::$files;
+            $includeFiles = Composer\Autoload\ComposerStaticInit48a04dd099c7551f9f6464ca07a76900::$files;
         } else {
             $includeFiles = require __DIR__ . '/autoload_files.php';
         }
         foreach ($includeFiles as $fileIdentifier => $file) {
-            composerRequire53b94b8697ed3e528623510a6d85b3d5($fileIdentifier, $file);
+            composerRequire48a04dd099c7551f9f6464ca07a76900($fileIdentifier, $file);
         }
 
         return $loader;
     }
 }
 
-function composerRequire53b94b8697ed3e528623510a6d85b3d5($fileIdentifier, $file)
+function composerRequire48a04dd099c7551f9f6464ca07a76900($fileIdentifier, $file)
 {
     if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
         require $file;
diff --git a/civicrm/vendor/composer/autoload_static.php b/civicrm/vendor/composer/autoload_static.php
index 2b8c10e09b8b6ce1097cbf474aab08f44358e683..27c884ddb448fb0fb267af529a7924a3d2c7e288 100644
--- a/civicrm/vendor/composer/autoload_static.php
+++ b/civicrm/vendor/composer/autoload_static.php
@@ -4,12 +4,12 @@
 
 namespace Composer\Autoload;
 
-class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
+class ComposerStaticInit48a04dd099c7551f9f6464ca07a76900
 {
     public static $files = array (
         '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
-        '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
         '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
+        '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php',
         '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
         'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
         '3919eeb97e98d4648304477f8ef734ba' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Random.php',
@@ -19,6 +19,7 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
         '9e4824c5afbdc1482b6025ce3d4dfde8' => __DIR__ . '/..' . '/league/csv/src/functions_include.php',
         'def43f6c87e4f8dfd0c9e1b1bab14fe8' => __DIR__ . '/..' . '/symfony/polyfill-iconv/bootstrap.php',
+        '667aeda72477189d0494fecd327c3641' => __DIR__ . '/..' . '/symfony/var-dumper/Resources/functions/dump.php',
         'bad842bce63596a608e2623519fb382c' => __DIR__ . '/..' . '/xkerman/restricted-unserialize/src/function.php',
     );
 
@@ -27,6 +28,10 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         array (
             'xKerman\\Restricted\\' => 19,
         ),
+        't' => 
+        array (
+            'tubalmartin\\CssMin\\' => 19,
+        ),
         'c' => 
         array (
             'cweagans\\Composer\\' => 18,
@@ -50,6 +55,7 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
             'Symfony\\Polyfill\\Intl\\Idn\\' => 26,
             'Symfony\\Polyfill\\Iconv\\' => 23,
             'Symfony\\Polyfill\\Ctype\\' => 23,
+            'Symfony\\Component\\VarDumper\\' => 28,
             'Symfony\\Component\\Process\\' => 26,
             'Symfony\\Component\\Finder\\' => 25,
             'Symfony\\Component\\Filesystem\\' => 29,
@@ -57,6 +63,7 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
             'Symfony\\Component\\DependencyInjection\\' => 38,
             'Symfony\\Component\\Config\\' => 25,
             'Svg\\' => 4,
+            'ScssPhp\\ScssPhp\\' => 16,
         ),
         'P' => 
         array (
@@ -67,6 +74,7 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
             'Psr\\Cache\\' => 10,
             'PhpOffice\\PhpWord\\' => 18,
             'PhpOffice\\Common\\' => 17,
+            'Padaliyajay\\PHPAutoprefixer\\' => 28,
         ),
         'M' => 
         array (
@@ -96,9 +104,11 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         'C' => 
         array (
             'Civi\\Cxn\\Rpc\\' => 13,
+            'Civi\\CompilePlugin\\' => 19,
             'Civi\\' => 5,
             'Cache\\TagInterop\\' => 17,
             'Cache\\IntegrationTests\\' => 23,
+            'CCL\\' => 4,
         ),
         'B' => 
         array (
@@ -112,6 +122,10 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         array (
             0 => __DIR__ . '/..' . '/xkerman/restricted-unserialize/src',
         ),
+        'tubalmartin\\CssMin\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/tubalmartin/cssmin/src',
+        ),
         'cweagans\\Composer\\' => 
         array (
             0 => __DIR__ . '/..' . '/cweagans/composer-patches/src',
@@ -148,6 +162,10 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         array (
             0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
         ),
+        'Symfony\\Component\\VarDumper\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/var-dumper',
+        ),
         'Symfony\\Component\\Process\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/process',
@@ -176,6 +194,10 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         array (
             0 => __DIR__ . '/..' . '/phenx/php-svg-lib/src/Svg',
         ),
+        'ScssPhp\\ScssPhp\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/scssphp/scssphp/src',
+        ),
         'Psr\\SimpleCache\\' => 
         array (
             0 => __DIR__ . '/..' . '/psr/simple-cache/src',
@@ -204,6 +226,10 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         array (
             0 => __DIR__ . '/..' . '/phpoffice/common/src/Common',
         ),
+        'Padaliyajay\\PHPAutoprefixer\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/padaliyajay/php-autoprefixer/src',
+        ),
         'MimeTyper\\' => 
         array (
             0 => __DIR__ . '/..' . '/adrienrn/php-mimetyper/src',
@@ -248,6 +274,10 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         array (
             0 => __DIR__ . '/..' . '/civicrm/civicrm-cxn-rpc/src',
         ),
+        'Civi\\CompilePlugin\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/civicrm/composer-compile-plugin/src',
+        ),
         'Civi\\' => 
         array (
             0 => __DIR__ . '/../..' . '/',
@@ -262,6 +292,10 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         array (
             0 => __DIR__ . '/..' . '/cache/integration-tests/src',
         ),
+        'CCL\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/civicrm/composer-compile-lib/src',
+        ),
         'Brick\\Money\\' => 
         array (
             0 => __DIR__ . '/..' . '/brick/money/src',
@@ -328,6 +362,10 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
         ),
         'L' => 
         array (
+            'Lurker' => 
+            array (
+                0 => __DIR__ . '/..' . '/totten/lurkerlite/src',
+            ),
             'Log' => 
             array (
                 0 => __DIR__ . '/..' . '/pear/log',
@@ -369,6 +407,10 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
             array (
                 0 => __DIR__ . '/../..' . '/',
             ),
+            'CCL' => 
+            array (
+                0 => __DIR__ . '/..' . '/civicrm/composer-compile-lib',
+            ),
             'CA_Config' => 
             array (
                 0 => __DIR__ . '/..' . '/totten/ca-config/src',
@@ -535,11 +577,11 @@ class ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5
     public static function getInitializer(ClassLoader $loader)
     {
         return \Closure::bind(function () use ($loader) {
-            $loader->prefixLengthsPsr4 = ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5::$prefixLengthsPsr4;
-            $loader->prefixDirsPsr4 = ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5::$prefixDirsPsr4;
-            $loader->prefixesPsr0 = ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5::$prefixesPsr0;
-            $loader->fallbackDirsPsr0 = ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5::$fallbackDirsPsr0;
-            $loader->classMap = ComposerStaticInit53b94b8697ed3e528623510a6d85b3d5::$classMap;
+            $loader->prefixLengthsPsr4 = ComposerStaticInit48a04dd099c7551f9f6464ca07a76900::$prefixLengthsPsr4;
+            $loader->prefixDirsPsr4 = ComposerStaticInit48a04dd099c7551f9f6464ca07a76900::$prefixDirsPsr4;
+            $loader->prefixesPsr0 = ComposerStaticInit48a04dd099c7551f9f6464ca07a76900::$prefixesPsr0;
+            $loader->fallbackDirsPsr0 = ComposerStaticInit48a04dd099c7551f9f6464ca07a76900::$fallbackDirsPsr0;
+            $loader->classMap = ComposerStaticInit48a04dd099c7551f9f6464ca07a76900::$classMap;
 
         }, null, ClassLoader::class);
     }
diff --git a/civicrm/vendor/composer/installed.json b/civicrm/vendor/composer/installed.json
index 3989c7f86ad1ac4ce138d20d54980b4256cdb521..6ba18bfd2a3e3f9e99d72d671a3b98b3c34ec58c 100644
--- a/civicrm/vendor/composer/installed.json
+++ b/civicrm/vendor/composer/installed.json
@@ -302,33 +302,145 @@
         ],
         "description": "RPC library for CiviConnect"
     },
+    {
+        "name": "civicrm/composer-compile-lib",
+        "version": "v0.3",
+        "version_normalized": "0.3.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/civicrm/composer-compile-lib.git",
+            "reference": "980b26dcc3d51ecf47aa45c43564ab9b6dbac244"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/civicrm/composer-compile-lib/zipball/980b26dcc3d51ecf47aa45c43564ab9b6dbac244",
+            "reference": "980b26dcc3d51ecf47aa45c43564ab9b6dbac244",
+            "shasum": ""
+        },
+        "require": {
+            "civicrm/composer-compile-plugin": "~0.9 || ~1.0",
+            "padaliyajay/php-autoprefixer": "~1.2",
+            "scssphp/scssphp": "~1.2",
+            "symfony/filesystem": "~2.8 || ~3.4 || ~4.0 || ~5.0",
+            "tubalmartin/cssmin": "^4.1"
+        },
+        "time": "2020-10-03T00:11:18+00:00",
+        "type": "library",
+        "extra": {
+            "compile": [
+                {
+                    "title": "Generate <comment>CCL</comment> wrapper functions",
+                    "run": [
+                        "@php-method \\CCL\\Tasks::template"
+                    ],
+                    "tpl-file": "src/StubsTpl.php",
+                    "tpl-items": {
+                        "CCL.php": true
+                    },
+                    "watch-files": [
+                        "src/StubsTpl.php",
+                        "src/Functions.php"
+                    ]
+                }
+            ]
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "CCL": ""
+            },
+            "psr-4": {
+                "CCL\\": [
+                    "src/"
+                ]
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "CiviCRM",
+                "email": "info@civicrm.org"
+            }
+        ],
+        "description": "Small library of compilation helpers"
+    },
+    {
+        "name": "civicrm/composer-compile-plugin",
+        "version": "v0.12",
+        "version_normalized": "0.12.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/civicrm/composer-compile-plugin.git",
+            "reference": "5ed863f2276a445775900ba18e99d14b15402640"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/civicrm/composer-compile-plugin/zipball/5ed863f2276a445775900ba18e99d14b15402640",
+            "reference": "5ed863f2276a445775900ba18e99d14b15402640",
+            "shasum": ""
+        },
+        "require": {
+            "composer-plugin-api": "^1.1 || ^2.0",
+            "php": ">=7.1",
+            "totten/lurkerlite": "^1.3"
+        },
+        "require-dev": {
+            "composer/composer": "~1.0",
+            "totten/process-helper": "^1.0.1"
+        },
+        "time": "2020-10-04T00:13:46+00:00",
+        "type": "composer-plugin",
+        "extra": {
+            "class": "Civi\\CompilePlugin\\CompilePlugin"
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Civi\\CompilePlugin\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Tim Otten",
+                "email": "info@civicrm.org"
+            }
+        ],
+        "description": "Define a 'compile' event for all packages in the dependency-graph"
+    },
     {
         "name": "civicrm/composer-downloads-plugin",
-        "version": "v2.1.1",
-        "version_normalized": "2.1.1.0",
+        "version": "v3.0.1",
+        "version_normalized": "3.0.1.0",
         "source": {
             "type": "git",
             "url": "https://github.com/civicrm/composer-downloads-plugin.git",
-            "reference": "8722bc7d547315be39397a3078bb51ee053ca269"
+            "reference": "3aabb6d259a86158d01829fc2c62a2afb9618877"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/civicrm/composer-downloads-plugin/zipball/8722bc7d547315be39397a3078bb51ee053ca269",
-            "reference": "8722bc7d547315be39397a3078bb51ee053ca269",
+            "url": "https://api.github.com/repos/civicrm/composer-downloads-plugin/zipball/3aabb6d259a86158d01829fc2c62a2afb9618877",
+            "reference": "3aabb6d259a86158d01829fc2c62a2afb9618877",
             "shasum": ""
         },
         "require": {
-            "composer-plugin-api": "^1.1",
+            "composer-plugin-api": "^1.1 || ^2.0",
             "php": ">=5.6",
             "togos/gitignore": "~1.1.1"
         },
         "require-dev": {
-            "composer/composer": "~1.0",
+            "composer/composer": "~1.0 || ~2.0",
             "friendsofphp/php-cs-fixer": "^2.3",
             "phpunit/phpunit": "^5.7",
             "totten/process-helper": "^1.0.1"
         },
-        "time": "2019-08-28T00:33:51+00:00",
+        "time": "2020-11-02T04:00:42+00:00",
         "type": "composer-plugin",
         "extra": {
             "class": "LastCall\\DownloadsPlugin\\Plugin"
@@ -886,6 +998,43 @@
             "topsort"
         ]
     },
+    {
+        "name": "padaliyajay/php-autoprefixer",
+        "version": "1.3",
+        "version_normalized": "1.3.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/padaliyajay/php-autoprefixer.git",
+            "reference": "f05f374f0c1e463db62209613f52b38bf4b52430"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/padaliyajay/php-autoprefixer/zipball/f05f374f0c1e463db62209613f52b38bf4b52430",
+            "reference": "f05f374f0c1e463db62209613f52b38bf4b52430",
+            "shasum": ""
+        },
+        "require": {
+            "sabberworm/php-css-parser": "*"
+        },
+        "time": "2019-11-26T09:55:37+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Padaliyajay\\PHPAutoprefixer\\": "src"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Jay padaliya"
+            }
+        ],
+        "description": "CSS Autoprefixer written in pure PHP."
+    },
     {
         "name": "pclzip/pclzip",
         "version": "2.8.2",
@@ -2232,6 +2381,70 @@
             "stylesheet"
         ]
     },
+    {
+        "name": "scssphp/scssphp",
+        "version": "1.2.1",
+        "version_normalized": "1.2.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/scssphp/scssphp.git",
+            "reference": "a05ea68160b7286ebbfd6e5fd7ae9e1a946ad6e1"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/scssphp/scssphp/zipball/a05ea68160b7286ebbfd6e5fd7ae9e1a946ad6e1",
+            "reference": "a05ea68160b7286ebbfd6e5fd7ae9e1a946ad6e1",
+            "shasum": ""
+        },
+        "require": {
+            "ext-ctype": "*",
+            "ext-json": "*",
+            "php": ">=5.6.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3",
+            "sass/sass-spec": "2020.08.10",
+            "squizlabs/php_codesniffer": "~3.5",
+            "twbs/bootstrap": "~4.3",
+            "zurb/foundation": "~6.5"
+        },
+        "time": "2020-09-07T21:15:42+00:00",
+        "bin": [
+            "bin/pscss"
+        ],
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "ScssPhp\\ScssPhp\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Anthon Pang",
+                "email": "apang@softwaredevelopment.ca",
+                "homepage": "https://github.com/robocoder"
+            },
+            {
+                "name": "Cédric Morin",
+                "email": "cedric@yterium.com",
+                "homepage": "https://github.com/Cerdic"
+            }
+        ],
+        "description": "scssphp is a compiler for SCSS written in PHP.",
+        "homepage": "http://scssphp.github.io/scssphp/",
+        "keywords": [
+            "css",
+            "less",
+            "sass",
+            "scss",
+            "stylesheet"
+        ]
+    },
     {
         "name": "symfony/config",
         "version": "v3.4.40",
@@ -2893,6 +3106,77 @@
         "description": "Symfony Process Component",
         "homepage": "https://symfony.com"
     },
+    {
+        "name": "symfony/var-dumper",
+        "version": "v3.4.44",
+        "version_normalized": "3.4.44.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/var-dumper.git",
+            "reference": "3e31b82077039b1ea3b5a203ec1e3016606f4484"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/var-dumper/zipball/3e31b82077039b1ea3b5a203ec1e3016606f4484",
+            "reference": "3e31b82077039b1ea3b5a203ec1e3016606f4484",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^5.5.9|>=7.0.8",
+            "symfony/polyfill-mbstring": "~1.0"
+        },
+        "conflict": {
+            "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+        },
+        "require-dev": {
+            "ext-iconv": "*",
+            "twig/twig": "~1.34|~2.4"
+        },
+        "suggest": {
+            "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+            "ext-intl": "To show region name in time zone dump",
+            "ext-symfony_debug": ""
+        },
+        "time": "2020-08-17T07:27:37+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.4-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "files": [
+                "Resources/functions/dump.php"
+            ],
+            "psr-4": {
+                "Symfony\\Component\\VarDumper\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Nicolas Grekas",
+                "email": "p@tchwork.com"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors"
+            }
+        ],
+        "description": "Symfony mechanism for exploring and dumping PHP variables",
+        "homepage": "https://symfony.com",
+        "keywords": [
+            "debug",
+            "dump"
+        ]
+    },
     {
         "name": "tecnickcom/tcpdf",
         "version": "6.3.5",
@@ -3031,6 +3315,68 @@
         "description": "Default configuration for certificate authorities",
         "homepage": "https://github.com/totten/ca_config"
     },
+    {
+        "name": "totten/lurkerlite",
+        "version": "1.3.0",
+        "version_normalized": "1.3.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/totten/Lurker.git",
+            "reference": "a20c47142b486415b9117c76aa4c2117ff95b49a"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/totten/Lurker/zipball/a20c47142b486415b9117c76aa4c2117ff95b49a",
+            "reference": "a20c47142b486415b9117c76aa4c2117ff95b49a",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "replace": {
+            "henrikbjorn/lurker": "*"
+        },
+        "suggest": {
+            "ext-inotify": ">=0.1.6"
+        },
+        "time": "2020-09-01T10:01:01+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.3.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Lurker": "src"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Konstantin Kudryashov",
+                "email": "ever.zet@gmail.com"
+            },
+            {
+                "name": "Yaroslav Kiliba",
+                "email": "om.dattaya@gmail.com"
+            },
+            {
+                "name": "Henrik Bjrnskov",
+                "email": "henrik@bjrnskov.dk"
+            }
+        ],
+        "description": "Resource Watcher - Lightweight edition of henrikbjorn/lurker with no dependencies",
+        "keywords": [
+            "filesystem",
+            "resource",
+            "watching"
+        ]
+    },
     {
         "name": "tplaner/when",
         "version": "3.0.0+php53",
@@ -3072,6 +3418,61 @@
             "time"
         ]
     },
+    {
+        "name": "tubalmartin/cssmin",
+        "version": "v4.1.1",
+        "version_normalized": "4.1.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port.git",
+            "reference": "3cbf557f4079d83a06f9c3ff9b957c022d7805cf"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/tubalmartin/YUI-CSS-compressor-PHP-port/zipball/3cbf557f4079d83a06f9c3ff9b957c022d7805cf",
+            "reference": "3cbf557f4079d83a06f9c3ff9b957c022d7805cf",
+            "shasum": ""
+        },
+        "require": {
+            "ext-pcre": "*",
+            "php": ">=5.3.2"
+        },
+        "require-dev": {
+            "cogpowered/finediff": "0.3.*",
+            "phpunit/phpunit": "4.8.*"
+        },
+        "time": "2018-01-15T15:26:51+00:00",
+        "bin": [
+            "cssmin"
+        ],
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "tubalmartin\\CssMin\\": "src"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Túbal Martín",
+                "homepage": "http://tubalmartin.me/"
+            }
+        ],
+        "description": "A PHP port of the YUI CSS compressor",
+        "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port",
+        "keywords": [
+            "compress",
+            "compressor",
+            "css",
+            "cssmin",
+            "minify",
+            "yui"
+        ]
+    },
     {
         "name": "typo3/phar-stream-wrapper",
         "version": "v3.1.4",
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/.gitignore b/civicrm/vendor/padaliyajay/php-autoprefixer/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..660d4197226ef223c46fef2842c4f0b89295c019
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/.gitignore
@@ -0,0 +1,3 @@
+/nbproject/
+/test/nbproject/private/
+/test/
\ No newline at end of file
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/LICENSE b/civicrm/vendor/padaliyajay/php-autoprefixer/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..28c6b18c76920323075ddd9234ef767fca3c55fe
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 Jay Padaliya
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/README.md b/civicrm/vendor/padaliyajay/php-autoprefixer/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..3ae18bbfb617f812a3212dc5c5a3effb74adbcb2
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/README.md
@@ -0,0 +1,27 @@
+# php-autoprefixer
+CSS autoprefixer written in pure PHP
+
+## Installation
+Simply add a dependency on padaliyajay/php-autoprefixer to your composer.json file if you use [Composer](https://getcomposer.org/) to manage the dependencies of your project:
+```
+composer require padaliyajay/php-autoprefixer
+```
+Although it's recommended to use Composer, you can actually [include these files](https://github.com/padaliyajay/php-autoprefixer/wiki/Installation) anyway you want.
+
+## Usage
+```
+use Padaliyajay\PHPAutoprefixer\Autoprefixer;
+
+$unprefixed_css = file_get_contents('main.css'); // CSS code
+
+$autoprefixer = new Autoprefixer($unprefixed_css);
+$prefixed_css = $autoprefixer->compile();
+```
+
+## License
+
+[MIT](http://opensource.org/licenses/MIT) licensed.
+
+
+## Donate & Support
+[PayPal.me](https://www.paypal.me/padaliyajay/)
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/composer.json b/civicrm/vendor/padaliyajay/php-autoprefixer/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..0cf002c98828587d9f6a7a67be5333aa7981e75d
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/composer.json
@@ -0,0 +1,16 @@
+{
+    "name": "padaliyajay/php-autoprefixer",
+    "description": "CSS Autoprefixer written in pure PHP.",
+	"license": "MIT",
+    "authors": [
+        {
+            "name": "Jay padaliya"
+        }
+    ],
+    "require": {
+        "sabberworm/php-css-parser": "*"
+    },
+    "autoload":{
+            "psr-4": {"Padaliyajay\\PHPAutoprefixer\\": "src"}
+    }
+}
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/composer.lock b/civicrm/vendor/padaliyajay/php-autoprefixer/composer.lock
new file mode 100644
index 0000000000000000000000000000000000000000..44baa112c1f0db01a4422fccee0bc5dc889d4489
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/composer.lock
@@ -0,0 +1,62 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "57a7717d18903fe16dabedebe85af918",
+    "packages": [
+        {
+            "name": "sabberworm/php-css-parser",
+            "version": "8.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sabberworm/PHP-CSS-Parser.git",
+                "reference": "8be357d90c29c2f6dd426be4cb60bf09ef6d0120"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/8be357d90c29c2f6dd426be4cb60bf09ef6d0120",
+                "reference": "8be357d90c29c2f6dd426be4cb60bf09ef6d0120",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.8"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Sabberworm\\CSS": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Raphael Schweikert"
+                }
+            ],
+            "description": "Parser for CSS Files written in PHP",
+            "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser",
+            "keywords": [
+                "css",
+                "parser",
+                "stylesheet"
+            ],
+            "time": "2018-07-13T13:23:56+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": []
+}
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Autoprefixer.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Autoprefixer.php
new file mode 100644
index 0000000000000000000000000000000000000000..6167b78d50043997de47f17d546cd2085e6e1acd
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Autoprefixer.php
@@ -0,0 +1,90 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer;
+
+class Autoprefixer {
+
+    private $css_parser;
+
+    public function __construct($css_code){
+        $this->css_parser = new \Sabberworm\CSS\Parser($css_code);
+    }
+
+    /**
+     * @param bool $prettyOutput
+     * @return bool
+     */
+    public function compile($prettyOutput = true) {
+        if($this->css_parser){
+            $css_document = $this->css_parser->parse();
+
+            $this->compileCSSList($css_document);
+
+            $outputFormat = $prettyOutput ?
+                \Sabberworm\CSS\OutputFormat::createPretty() :
+                \Sabberworm\CSS\OutputFormat::createCompact();
+
+            return $css_document->render($outputFormat);
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * Compile CSSList
+     * @param \Sabberworm\CSS\CSSList\CSSList $css_list
+     */
+    protected function compileCSSList($css_list){
+        $m_contents = $css_list->getContents();
+        $total_added = 0;
+
+        foreach($css_list->getContents() as $key => $content){
+            $vendor_contents = array();
+
+            // RuleSet
+            if($content instanceof \Sabberworm\CSS\RuleSet\RuleSet) {
+                $compile_ruleSet = new Compile\RuleSet($content);
+                $compile_ruleSet->compile();
+            }
+
+            // DeclarationBlock
+            if($content instanceof \Sabberworm\CSS\RuleSet\DeclarationBlock){
+                $compile_declarationBlock = new Compile\DeclarationBlock($content);
+                $compile_declarationBlock->compile();
+            }
+
+            // AtRule
+            if($content instanceof \Sabberworm\CSS\Property\AtRule){
+                $compile_atRule = new Compile\AtRule($content);
+                $m_atRules = $compile_atRule->compile();
+
+                if($m_atRules){
+                    $vendor_contents = array_merge($vendor_contents, $m_atRules);
+                }
+            }
+
+            // CSSList
+            if($content instanceof \Sabberworm\CSS\CSSList\CSSList) {
+                $this->compileCSSList($content);
+            }
+
+            // Remove already existing vendor content
+            $vendor_contents = array_filter($vendor_contents, function($vendor_content) use($m_contents){
+                if(!in_array((string)$vendor_content, array_map('strval', $m_contents))){
+                    return true;
+                } else {
+                    return false;
+                }
+            });
+
+            // Add vendor content
+            if($vendor_contents){
+                array_splice($m_contents, $key + $total_added, 0, $vendor_contents);
+                $total_added += count($vendor_contents);
+            }
+        }
+
+        $css_list->setContents($m_contents);
+    }
+
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Compile/AtRule.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Compile/AtRule.php
new file mode 100644
index 0000000000000000000000000000000000000000..643477d49a16b28ce0bc9822e96c6559be8b83d2
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Compile/AtRule.php
@@ -0,0 +1,87 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Compile;
+
+use Padaliyajay\PHPAutoprefixer\Vendor;
+
+/**
+ * Compile CSS AtRule
+ * This class under construction
+ */
+class AtRule {
+    /**
+     * @type \Sabberworm\CSS\Property\AtRule
+     */
+    private $atRule;
+    
+    public function __construct($atRule){
+        if($atRule instanceof \Sabberworm\CSS\Property\AtRule){
+            $this->atRule = $atRule;
+        } else {
+            throw new \Exception('Invalid argument! Require instance of \Sabberworm\CSS\Property\AtRule');
+        }
+    }
+    
+    /**
+     * Compile AtRule
+     */
+    public function compile(){
+        return $this->getVendorsRule();
+    }
+    
+    public function getVendorsRule(){
+        $vendors_rule = array();
+        
+        foreach(Vendor::getVendors() as $vendor){
+            $vendor_rule_name = $this->getVendorRuleName($vendor);
+            
+            if($vendor_rule_name){
+                $vendors_rule[] = $vendor_rule_name;
+            }
+        }
+        
+        return $vendors_rule;
+    }
+    
+    public function getVendorRuleName($vendor){
+        $vendor_rule_names = Vendor::getATRule($vendor);
+        
+        $generic_rule_name = $this->atRule->atRuleName();
+        
+        if(isset($vendor_rule_names[$generic_rule_name])){
+            $vendor_at_rule = false;
+            
+            if($this->atRule instanceof \Sabberworm\CSS\CSSList\KeyFrame){
+                $vendor_at_rule = clone $this->atRule;
+                $vendor_at_rule->setVendorKeyFrame($vendor_rule_names[$generic_rule_name]);
+            }
+            
+            if($this->atRule instanceof \Sabberworm\CSS\CSSList\AtRuleBlockList){
+                $vendor_at_rule = new \Sabberworm\CSS\CSSList\AtRuleBlockList($vendor_rule_names[$generic_rule_name], $this->atRule->atRuleArgs());
+            }
+            
+            return $vendor_at_rule;
+        } else {
+            return false;
+        }
+    }
+    
+//    protected function parseArgs($argStr){
+//        $parseArg = array();
+//        $parseArg['type'] = 'box';
+//        $parseArg['value'] = '';
+//        
+//        $argStr = ltrim(trim($argStr), '(');
+//        
+//        for($i = 0; $i < strlen($argStr); $i++){
+//            if($argStr[$i] == '('){
+//                
+//                
+//            } elseif($argStr[$i] == ')'){
+//                break;
+//            }
+//        }
+//        
+//        return $parseArg;
+//    }
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Compile/DeclarationBlock.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Compile/DeclarationBlock.php
new file mode 100644
index 0000000000000000000000000000000000000000..6dd5e9fe7740845ef6319253b627bd5daa4acce6
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Compile/DeclarationBlock.php
@@ -0,0 +1,47 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Compile;
+
+class DeclarationBlock {
+    /**
+     * @type \Sabberworm\CSS\RuleSet\DeclarationBlock
+     */
+    private $declarationBlock;
+    
+    public function __construct($declarationBlock){
+        if($declarationBlock instanceof \Sabberworm\CSS\RuleSet\DeclarationBlock){
+            $this->declarationBlock = $declarationBlock;
+        } else {
+            throw new \Exception('Invalid argument! Require instance of \Sabberworm\CSS\RuleSet\DeclarationBlock');
+        }
+    }
+    
+    /**
+     * Compile \Sabberworm\CSS\RuleSet\DeclarationBlock
+     */
+    public function compile(){
+        $m_selectors = $this->declarationBlock->getSelectors();
+        
+        $total_added = 0;
+        foreach($this->declarationBlock->getSelectors() as $key => $selector){
+            $parse_selector = new \Padaliyajay\PHPAutoprefixer\Parse\Selector($selector);
+            $vendors_selector = $parse_selector->getVendorsSelector();
+            
+            // Remove already existing value
+            $vendors_selector = array_filter($vendors_selector, function($vendor_selector) use($m_selectors) {
+                if(!in_array((string)$vendor_selector, array_map('strval', $m_selectors))){
+                    return true;
+                } else {
+                    return false;
+                }
+            });
+            
+            if($vendors_selector){
+                array_splice($m_selectors, $key + $total_added, 0, $vendors_selector);
+                $total_added += count($vendors_selector);
+            }
+        }
+        
+        $this->declarationBlock->setSelectors($m_selectors);
+    }
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Compile/RuleSet.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Compile/RuleSet.php
new file mode 100644
index 0000000000000000000000000000000000000000..ff2bed26804c87c437d315a30df31d3826eecdf8
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Compile/RuleSet.php
@@ -0,0 +1,47 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Compile;
+
+class RuleSet {
+    /**
+     * @type \Sabberworm\CSS\RuleSet\RuleSet
+     */
+    private $ruleSet;
+    
+    public function __construct($ruleSet){
+        if($ruleSet instanceof \Sabberworm\CSS\RuleSet\RuleSet){
+            $this->ruleSet = $ruleSet;
+        } else {
+            throw new \Exception('Invalid argument! Require instance of \Sabberworm\CSS\RuleSet\RuleSet');
+        }
+    }
+    
+    /**
+     * Compile \Sabberworm\CSS\RuleSet\RuleSet
+     */
+    public function compile(){
+        $m_rules = $this->ruleSet->getRules();
+        
+        $total_added = 0;
+        foreach($this->ruleSet->getRules() as $key => $rule){
+            $parser_rule = new \Padaliyajay\PHPAutoprefixer\Parse\Rule($rule);
+            $vendor_rules = $parser_rule->getVendorRules();
+            
+            // Remove already existing value
+            $vendor_rules = array_filter($vendor_rules, function($vendor_rule) use($m_rules) {
+                if(!in_array((string)$vendor_rule, array_map('strval', $m_rules))){
+                    return true;
+                } else {
+                    return false;
+                }
+            });
+            
+            if($vendor_rules){
+                array_splice($m_rules, $key + $total_added, 0, $vendor_rules);
+                $total_added += count($vendor_rules);
+            }
+        }
+        
+        $this->ruleSet->setRules($m_rules);
+    }
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Parse/Property.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Parse/Property.php
new file mode 100644
index 0000000000000000000000000000000000000000..6dd9dc3fe244936dd323b5a0b70a6bdfc2f90536
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Parse/Property.php
@@ -0,0 +1,100 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Parse;
+
+use Padaliyajay\PHPAutoprefixer\Vendor;
+
+class Property {
+    /**
+     * @type String
+     */
+    private $pName;
+    
+    public function __construct($pName){
+        $this->pName = $pName;
+    }
+    
+//    public function getVendorsProperty(){
+//        $vendor_properties = array();
+//        
+//        foreach(Vendor::getVendors() as $vendor){
+//            $vendor_property_set = Vendor::getRuleProperty($vendor);
+//            
+//            if(isset($vendor_property_set[$this->pName])) {
+//                $vendor_properties[] = new Property($vendor_property_set[$this->pName]);
+//            }
+//        }
+//        
+//        return $vendor_properties;
+//    }
+    
+    public function getVendorProperty($vendor){
+        $vendor_property_set = Vendor::getRuleProperty($vendor);
+
+        if(isset($vendor_property_set[$this->pName])) {
+            return new Property($vendor_property_set[$this->pName]);
+        } else {
+            return false;
+        }
+    }
+    
+//    public function getVendorValue($generic_value, $vendor){
+//        $vendor_values = array();
+//        
+//        // Get vendor list
+//        $vendors = array();
+//        if($vendor){
+//            $vendors[] = $vendor;
+//        } else {
+//            $vendors = Vendor::getVendors();
+//        }
+//        
+//        foreach($vendors as $vendor){
+//            $vendor_value_set = Vendor::getRuleValue($vendor);
+//            
+//            if(isset($vendor_value_set[$this->pName][$generic_value])) {
+//                $vendor_values[] = $vendor_value_set[$this->pName][$generic_value];
+//            }
+//        }
+//        
+//        return $vendor_values;
+//    }
+    
+    public function getVendorValue($generic_value, $vendor){
+        $vendor_value_set = Vendor::getRuleValue($vendor);
+
+        if(is_string($generic_value) && isset($vendor_value_set[$this->pName][$generic_value])) {
+            
+            return $vendor_value_set[$this->pName][$generic_value];
+        } elseif(is_string($generic_value)) { // parse value as property
+            
+            $vendor_property_set = Vendor::getRuleProperty($vendor);
+            if(isset($vendor_property_set[$generic_value])){
+                return $vendor_property_set[$generic_value];
+            }
+        } elseif($generic_value instanceof \Sabberworm\CSS\Value\ValueList){
+            
+            $vendor_value = clone $generic_value;
+            
+            $list_components = $vendor_value->getListComponents();
+            foreach($list_components as $key => $component){
+                $vendor_component = $this->getVendorValue($component, $vendor);
+                if($vendor_component){
+                    $list_components[$key] = $vendor_component;
+                }
+            }
+            $vendor_value->setListComponents($list_components);
+            
+            if($vendor_value != $generic_value){
+                return $vendor_value;
+            }
+        }
+        
+        return false;
+    }
+    
+    public function __toString() {
+        return $this->pName;
+    }
+    
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Parse/Rule.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Parse/Rule.php
new file mode 100644
index 0000000000000000000000000000000000000000..15e4055ccd2baee51a03e94dbdf7887dada1bdd1
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Parse/Rule.php
@@ -0,0 +1,62 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Parse;
+
+use Padaliyajay\PHPAutoprefixer\Vendor;
+use Padaliyajay\PHPAutoprefixer\Parse\Property;
+
+class Rule {
+    /**
+     * @type \Sabberworm\CSS\Rule\Rule
+     */
+    private $rule;
+    
+    public function __construct($rule){
+        if($rule instanceof \Sabberworm\CSS\Rule\Rule){
+            $this->rule = $rule;
+        } else {
+            throw new \Exception('Invalid argument! Require instance of \Sabberworm\CSS\Rule\Rule');
+        }
+    }
+    
+    /**
+     * Create vendor rules of generic rule
+     * @return Array Vendor rules
+     */
+    public function getVendorRules(){
+        $vendor_rules = array();
+        
+        foreach(Vendor::getVendors() as $vendor){
+            $rule_property = new Property($this->rule->getRule());
+            
+            // Vendor property
+            $rule_vendor_property = $rule_property->getVendorProperty($vendor);
+            
+            if($rule_vendor_property){
+                $vendor_rule = clone $this->rule;
+                $vendor_rule->setRule((string)$rule_vendor_property);
+                
+                $vendor_value = $rule_vendor_property->getVendorValue($this->rule->getValue(), $vendor);
+                if($vendor_value){
+                    $vendor_rule->setValue($vendor_value);
+                }
+                
+                $vendor_rules[] = $vendor_rule;
+            }
+            
+            // Vendor value
+            $rule_vendor_value = $rule_property->getVendorValue($this->rule->getValue(), $vendor);
+            
+            if($rule_vendor_value){
+                $vendor_rule = clone $this->rule;
+                $vendor_rule->setValue($rule_vendor_value);
+                
+                $vendor_rules[] = $vendor_rule;
+            }
+        }
+        
+        return $vendor_rules;
+    }
+    
+    
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Parse/Selector.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Parse/Selector.php
new file mode 100644
index 0000000000000000000000000000000000000000..8c9279da17304745e2d717b326f88bc0c4bc3b48
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Parse/Selector.php
@@ -0,0 +1,68 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Parse;
+
+use Padaliyajay\PHPAutoprefixer\Vendor;
+
+class Selector {
+    /**
+     * @type \Sabberworm\CSS\Property\Selector
+     */
+    private $selector;
+    
+    public function __construct($selector){
+        if($selector instanceof \Sabberworm\CSS\Property\Selector){
+            $this->selector = $selector;
+        } else {
+            throw new \Exception('Invalid argument! Require instance of \Sabberworm\CSS\Property\Selector');
+        }
+    }
+    
+    /**
+     * Create list of vendor prefixed selectors
+     * @return Array
+     */
+    public function getVendorsSelector(){
+        $vendor_selectors = array();
+        
+        foreach(Vendor::getVendors() as $vendor){
+            $vendor_selector = $this->getVendorSelector($vendor);
+            
+            if($vendor_selector instanceof \Sabberworm\CSS\Property\Selector){
+                $vendor_selectors[] = $vendor_selector;
+            }
+        }
+        
+        return $vendor_selectors;
+    }
+    
+    /**
+     * Get vendor selector of generic selector
+     * @return Mixed
+     */
+    public function getVendorSelector($vendor){
+        return $this->getVendorPseudo($vendor);
+    }
+    
+    public function getVendorPseudo($vendor){
+        $vendor_pseudos = Vendor::getPseudo($vendor);
+        
+        $m_generic_selector = $this->selector->getSelector();
+        
+        // Pseudo
+        foreach($vendor_pseudos as $generic_pseudo => $vendor_pseudo){
+            if(strpos($m_generic_selector, $generic_pseudo) !== false){
+                $m_generic_selector = str_replace($generic_pseudo, $vendor_pseudo, $m_generic_selector);
+            }
+        }
+        
+        if($m_generic_selector !== $this->selector->getSelector()){
+            $new_selector = clone $this->selector;
+            $new_selector->setSelector($m_generic_selector);
+            
+            return $new_selector;
+        } else {
+            return false;
+        }
+    }
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor.php
new file mode 100644
index 0000000000000000000000000000000000000000..9428374023ef668040f9d3cb31d3ee40f075e65e
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor.php
@@ -0,0 +1,31 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer;
+
+class Vendor {
+    const Vendors = array('IE', 'Mozilla', 'Webkit');
+    
+    public static function getRuleProperty($vendor){
+        $vendor_class = 'Padaliyajay\PHPAutoprefixer\Vendor\\' . $vendor;
+        return $vendor_class::getRuleProperty();
+    }
+    
+    public static function getRuleValue($vendor){
+        $vendor_class = 'Padaliyajay\PHPAutoprefixer\Vendor\\' . $vendor;
+        return $vendor_class::getRuleValue();
+    }
+    
+    public static function getPseudo($vendor){
+        $vendor_class = 'Padaliyajay\PHPAutoprefixer\Vendor\\' . $vendor;
+        return $vendor_class::getPseudo();
+    }
+    
+    public static function getATRule($vendor){
+        $vendor_class = 'Padaliyajay\PHPAutoprefixer\Vendor\\' . $vendor;
+        return $vendor_class::getATRule();
+    }
+    
+    public static function getVendors(){
+        return self::Vendors;
+    }
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/IE.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/IE.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d49ace311b64f745e754201cc1b69a4e6381453
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/IE.php
@@ -0,0 +1,46 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Vendor;
+
+use Padaliyajay\PHPAutoprefixer\Vendor\Vendor;
+
+class IE extends Vendor {
+    protected static $RULE_PROPERTY = array(
+        'flex' => '-ms-flex',
+        'flex-wrap' => '-ms-flex-wrap',
+        'flex-basis' => '-ms-flex-preferred-size',
+        'flex-grow' => '-ms-flex-positive',
+        'flex-flow' => '-ms-flex-flow',
+        'flex-direction' => '-ms-flex-direction',
+        'flex-shrink' => '-ms-flex-negative',
+        'flow-from' => '-ms-flow-from',
+        'flow-into' => '-ms-flow-into',
+        'align-items' => '-ms-flex-align',
+        'align-content' => '-ms-flex-line-pack',
+        'align-self' => '-ms-flex-item-align',
+        'justify-content' => '-ms-flex-pack',
+        'order' => '-ms-flex-order',
+        'user-select' => '-ms-user-select',
+        'hyphens' => '-ms-hyphens',
+        'word-break' => '-ms-word-break',
+        'transform'  => '-ms-transform',
+        'transform-origin'  => '-ms-transform-origin'
+    );
+    
+    protected static $RULE_VALUE = array(
+        'display' => array(
+            'flex' => '-ms-flexbox',
+            'inline-flex' => '-ms-inline-flexbox',
+            'grid' => '-ms-grid',
+        ),
+        '-ms-flex-align' => array('flex-start' => 'start', 'flex-end' => 'end'),
+        '-ms-flex-line-pack' => array('flex-start' => 'start', 'flex-end' => 'end', 'space-between' => 'justify', 'space-around' => 'distribute'),
+        '-ms-flex-item-align' => array('flex-start' => 'start', 'flex-end' => 'end', 'space-between' => 'justify', 'space-around' => 'distribute'),
+        '-ms-flex-pack' => array('space-between' => 'justify', 'flex-start' => 'start', 'flex-end' => 'end', 'space-around' => 'distribute'),
+        
+    );
+    
+    protected static $PSEUDO = array(
+        '::placeholder' => '::-ms-input-placeholder',
+    );
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/Mozilla.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/Mozilla.php
new file mode 100644
index 0000000000000000000000000000000000000000..264a3b62bce752cb247ac25c4569961f679012c2
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/Mozilla.php
@@ -0,0 +1,22 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Vendor;
+
+use Padaliyajay\PHPAutoprefixer\Vendor\Vendor;
+
+class Mozilla extends Vendor {
+    protected static $RULE_PROPERTY = array(
+        'column-count' => '-moz-column-count',
+        'column-gap' => '-moz-column-gap',
+        'column-rule' => '-moz-column-rule',
+        'user-select' => '-moz-user-select',
+        'appearance' => '-moz-appearance',
+        'font-feature-settings' => '-moz-font-feature-settings',
+        'hyphens' => '-moz-hyphens',
+        
+    );
+    
+    protected static $PSEUDO = array(
+        '::placeholder' => '::-moz-placeholder',
+    );
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/Vendor.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/Vendor.php
new file mode 100644
index 0000000000000000000000000000000000000000..1149ae107f4a4e437de7100dacd80691b9e6abbd
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/Vendor.php
@@ -0,0 +1,29 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Vendor;
+
+abstract class Vendor {
+    protected static $RULE_PROPERTY = array();
+    
+    protected static $RULE_VALUE = array();
+    
+    protected static $PSEUDO = array();
+    
+    protected static $AT_RULE = array();
+    
+    public static function getRuleProperty(){
+        return static::$RULE_PROPERTY;
+    }
+    
+    public static function getRuleValue(){
+        return static::$RULE_VALUE;
+    }
+    
+    public static function getPseudo(){
+        return static::$PSEUDO;
+    }
+    
+    public static function getATRule(){
+        return static::$AT_RULE;
+    }
+}
+
diff --git a/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/Webkit.php b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/Webkit.php
new file mode 100644
index 0000000000000000000000000000000000000000..41cc8fbdd03c3b7218b5b3011392ad70c477965d
--- /dev/null
+++ b/civicrm/vendor/padaliyajay/php-autoprefixer/src/Vendor/Webkit.php
@@ -0,0 +1,44 @@
+<?php
+namespace Padaliyajay\PHPAutoprefixer\Vendor;
+
+use Padaliyajay\PHPAutoprefixer\Vendor\Vendor;
+
+class Webkit extends Vendor {
+    protected static $RULE_PROPERTY = array(
+        'box-reflect' => '-webkit-box-reflect',
+        'column-count' => '-webkit-column-count',
+        'column-gap' => '-webkit-column-gap',
+        'column-rule' => '-webkit-column-rule',
+        'clip-path' => '-webkit-clip-path',
+        'user-select' => '-webkit-user-select',
+        'appearance' => '-webkit-appearance',
+        'animation' => '-webkit-animation',
+        'transition' => '-webkit-transition',
+        'transform' => '-webkit-transform',
+        'transform-origin' => '-webkit-transform-origin',
+        'backface-visibility' => '-webkit-backface-visibility',
+        'perspective' => '-webkit-perspective',
+        'background-clip' => '-webkit-background-clip',
+        'filter' => '-webkit-filter',
+        'font-feature-settings' => '-webkit-font-feature-settings',
+        'flow-from' => '-webkit-flow-from',
+        'flow-into' => '-webkit-flow-into',
+        'hyphens' => '-webkit-hyphens',
+        'mask-image' => '-webkit-mask-image',
+    );
+    
+    protected static $RULE_VALUE = array(
+        'display' => array(
+            'flex' => '-webkit-flex',
+            'inline-flex' => '-webkit-inline-flex',
+        ),
+        'position' => array('sticky' => '-webkit-sticky')
+    );
+    
+    protected static $PSEUDO = array(
+        '::placeholder' => '::-webkit-input-placeholder',
+    );
+    
+    protected static $AT_RULE = array('keyframes' => '-webkit-keyframes');
+}
+
diff --git a/civicrm/vendor/scssphp/scssphp/LICENSE.md b/civicrm/vendor/scssphp/scssphp/LICENSE.md
new file mode 100644
index 0000000000000000000000000000000000000000..afcfdfb264eea7e1a277906c3f54d55814a5598a
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/LICENSE.md
@@ -0,0 +1,20 @@
+Copyright (c) 2015 Leaf Corcoran, http://scssphp.github.io/scssphp
+ 
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+ 
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+ 
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/civicrm/vendor/scssphp/scssphp/README.md b/civicrm/vendor/scssphp/scssphp/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..cd5fce1de217a7a11d451edd20fe90bf7cf44f04
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/README.md
@@ -0,0 +1,46 @@
+# scssphp
+### <https://scssphp.github.io/scssphp>
+
+[![Build](https://travis-ci.org/scssphp/scssphp.svg?branch=master)](https://travis-ci.org/scssphp/scssphp)
+[![License](https://poser.pugx.org/scssphp/scssphp/license)](https://packagist.org/packages/scssphp/scssphp)
+
+`scssphp` is a compiler for SCSS written in PHP.
+
+Checkout the homepage, <https://scssphp.github.io/scssphp>, for directions on how to use.
+
+## Running Tests
+
+`scssphp` uses [PHPUnit](https://github.com/sebastianbergmann/phpunit) for testing.
+
+Run the following command from the root directory to run every test:
+
+    vendor/bin/phpunit tests
+
+There are several tests in the `tests/` directory:
+
+* `ApiTest.php` contains various unit tests that test the PHP interface.
+* `ExceptionTest.php` contains unit tests that test for exceptions thrown by the parser and compiler.
+* `FailingTest.php` contains tests reported in Github issues that demonstrate compatibility bugs.
+* `InputTest.php` compiles every `.scss` file in the `tests/inputs` directory
+  then compares to the respective `.css` file in the `tests/outputs` directory.
+* `ScssTest.php` extracts (ruby) `scss` tests from the `tests/scss_test.rb` file.
+
+When changing any of the tests in `tests/inputs`, the tests will most likely
+fail because the output has changed. Once you verify that the output is correct
+you can run the following command to rebuild all the tests:
+
+    BUILD=1 vendor/bin/phpunit tests
+
+This will compile all the tests, and save results into `tests/outputs`.
+
+To enable the `scss` compatibility tests:
+
+    TEST_SCSS_COMPAT=1 vendor/bin/phpunit tests
+
+## Coding Standard
+
+`scssphp` source conforms to [PSR12](https://www.php-fig.org/psr/psr-12/).
+
+Run the following command from the root directory to check the code for "sniffs".
+
+    vendor/bin/phpcs --standard=PSR12 --extensions=php bin src tests *.php
diff --git a/civicrm/vendor/scssphp/scssphp/bin/pscss b/civicrm/vendor/scssphp/scssphp/bin/pscss
new file mode 100755
index 0000000000000000000000000000000000000000..d48af2f87830467cee7122dd2fbe110d5c542454
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/bin/pscss
@@ -0,0 +1,208 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+error_reporting(E_ALL);
+
+if (version_compare(PHP_VERSION, '5.6') < 0) {
+    die('Requires PHP 5.6 or above');
+}
+
+include __DIR__ . '/../scss.inc.php';
+
+use ScssPhp\ScssPhp\Compiler;
+use ScssPhp\ScssPhp\Parser;
+use ScssPhp\ScssPhp\Version;
+
+$style = null;
+$loadPaths = null;
+$dumpTree = false;
+$inputFile = null;
+$changeDir = false;
+$debugInfo = false;
+$lineNumbers = false;
+$encoding = false;
+$sourceMap = false;
+
+/**
+ * Parse argument
+ *
+ * @param integer $i
+ * @param array $options
+ *
+ * @return string|null
+ */
+function parseArgument(&$i, $options) {
+    global $argc;
+    global $argv;
+
+    if (! preg_match('/^(?:' . implode('|', (array) $options) . ')=?(.*)/', $argv[$i], $matches)) {
+        return;
+    }
+
+    if (strlen($matches[1])) {
+        return $matches[1];
+    }
+
+    if ($i + 1 < $argc) {
+        $i++;
+
+        return $argv[$i];
+    }
+}
+
+for ($i = 1; $i < $argc; $i++) {
+    if ($argv[$i] === '-?' || $argv[$i] === '-h' || $argv[$i] === '--help') {
+        $exe = $argv[0];
+
+        $HELP = <<<EOT
+Usage: $exe [options] [input-file]
+
+Options include:
+
+    --help              Show this message [-h, -?]
+    --continue-on-error [deprecated] Ignored
+    --debug-info        Annotate selectors with CSS referring to the source file and line number [-g]
+    --dump-tree         Dump formatted parse tree [-T]
+    --iso8859-1         Use iso8859-1 encoding instead of default utf-8
+    --line-numbers      Annotate selectors with comments referring to the source file and line number [--line-comments]
+    --load-path=PATH    Set import path [-I]
+    --precision=N       [deprecated] Ignored. (default 10) [-p]
+    --sourcemap         Create source map file
+    --style=FORMAT      Set the output format (compact, compressed, crunched, expanded, or nested) [-s, -t]
+    --version           Print the version [-v]
+
+EOT;
+        exit($HELP);
+    }
+
+    if ($argv[$i] === '-v' || $argv[$i] === '--version') {
+        exit(Version::VERSION . "\n");
+    }
+
+    // Keep parsing --continue-on-error to avoid BC breaks for scripts using it
+    if ($argv[$i] === '--continue-on-error') {
+        // TODO report it as a warning ?
+        continue;
+    }
+
+    if ($argv[$i] === '-g' || $argv[$i] === '--debug-info') {
+        $debugInfo = true;
+        continue;
+    }
+
+    if ($argv[$i] === '--iso8859-1') {
+        $encoding = 'iso8859-1';
+        continue;
+    }
+
+    if ($argv[$i] === '--line-numbers' || $argv[$i] === '--line-comments') {
+        $lineNumbers = true;
+        continue;
+    }
+
+    if ($argv[$i] === '--sourcemap') {
+        $sourceMap = true;
+        continue;
+    }
+
+    if ($argv[$i] === '-T' || $argv[$i] === '--dump-tree') {
+        $dumpTree = true;
+        continue;
+    }
+
+    $value = parseArgument($i, array('-t', '-s', '--style'));
+
+    if (isset($value)) {
+        $style = $value;
+        continue;
+    }
+
+    $value = parseArgument($i, array('-I', '--load-path'));
+
+    if (isset($value)) {
+        $loadPaths = $value;
+        continue;
+    }
+
+    // Keep parsing --precision to avoid BC breaks for scripts using it
+    $value = parseArgument($i, array('-p', '--precision'));
+
+    if (isset($value)) {
+        // TODO report it as a warning ?
+        continue;
+    }
+
+    if (file_exists($argv[$i])) {
+        $inputFile = $argv[$i];
+        continue;
+    }
+}
+
+
+if ($inputFile) {
+    $data = file_get_contents($inputFile);
+
+    $newWorkingDir = dirname(realpath($inputFile));
+    $oldWorkingDir = getcwd();
+
+    if ($oldWorkingDir !== $newWorkingDir) {
+        $changeDir = chdir($newWorkingDir);
+        $inputFile = basename($inputFile);
+    }
+} else {
+    $data = '';
+
+    while (! feof(STDIN)) {
+        $data .= fread(STDIN, 8192);
+    }
+}
+
+if ($dumpTree) {
+    $parser = new Parser($inputFile);
+
+    print_r(json_decode(json_encode($parser->parse($data)), true));
+
+    exit();
+}
+
+$scss = new Compiler();
+
+if ($debugInfo) {
+    $scss->setLineNumberStyle(Compiler::DEBUG_INFO);
+}
+
+if ($lineNumbers) {
+    $scss->setLineNumberStyle(Compiler::LINE_COMMENTS);
+}
+
+if ($loadPaths) {
+    $scss->setImportPaths(explode(PATH_SEPARATOR, $loadPaths));
+}
+
+if ($style) {
+    $scss->setFormatter('ScssPhp\\ScssPhp\\Formatter\\' . ucfirst($style));
+}
+
+if ($sourceMap) {
+    $scss->setSourceMap(Compiler::SOURCE_MAP_INLINE);
+}
+
+if ($encoding) {
+    $scss->setEncoding($encoding);
+}
+
+echo $scss->compile($data, $inputFile);
+
+if ($changeDir) {
+    chdir($oldWorkingDir);
+}
diff --git a/civicrm/vendor/scssphp/scssphp/composer.json b/civicrm/vendor/scssphp/scssphp/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..7f420edf3d45d24a937878549f7551b28aa52843
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/composer.json
@@ -0,0 +1,72 @@
+{
+    "name": "scssphp/scssphp",
+    "type": "library",
+    "description": "scssphp is a compiler for SCSS written in PHP.",
+    "keywords": ["css", "stylesheet", "scss", "sass", "less"],
+    "homepage": "http://scssphp.github.io/scssphp/",
+    "license": [
+        "MIT"
+    ],
+    "authors": [
+        {
+            "name": "Anthon Pang",
+            "email": "apang@softwaredevelopment.ca",
+            "homepage": "https://github.com/robocoder"
+        },
+        {
+            "name": "Cédric Morin",
+            "email": "cedric@yterium.com",
+            "homepage": "https://github.com/Cerdic"
+        }
+    ],
+    "autoload": {
+        "psr-4": { "ScssPhp\\ScssPhp\\": "src/" }
+    },
+    "autoload-dev": {
+        "psr-4": { "ScssPhp\\ScssPhp\\Tests\\": "tests/" }
+    },
+    "require": {
+        "php": ">=5.6.0",
+        "ext-json": "*",
+        "ext-ctype": "*"
+    },
+    "require-dev": {
+        "sass/sass-spec": "2020.08.10",
+        "squizlabs/php_codesniffer": "~3.5",
+        "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3",
+        "twbs/bootstrap": "~4.3",
+        "zurb/foundation": "~6.5"
+    },
+    "repositories": [
+        {
+            "type": "package",
+            "package": {
+                "name": "sass/sass-spec",
+                "version": "2020.08.10",
+                "source": {
+                    "type": "git",
+                    "url": "https://github.com/sass/sass-spec.git",
+                    "reference": "73222792c42a516d62e2e25c3f5d9e35f5567030"
+                },
+                "dist": {
+                    "type": "zip",
+                    "url": "https://api.github.com/repos/sass/sass-spec/zipball/73222792c42a516d62e2e25c3f5d9e35f5567030",
+                    "reference": "73222792c42a516d62e2e25c3f5d9e35f5567030",
+                    "shasum": ""
+                }
+            }
+        }
+    ],
+    "minimum-stability": "dev",
+    "bin": ["bin/pscss"],
+    "archive": {
+        "exclude": [
+            "/Makefile",
+            "/.gitattributes",
+            "/.gitignore",
+            "/.travis.yml",
+            "/phpunit.xml.dist",
+            "/tests"
+        ]
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/phpcs.xml.dist b/civicrm/vendor/scssphp/scssphp/phpcs.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..b162dbd6bdd53fd4898714b4c76bfe341cf02d8b
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/phpcs.xml.dist
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<ruleset name="PSR12 (adapted for PHP 5.6+)">
+    <rule ref="PSR12">
+        <!-- Ignore this PHP 7.1+ sniff as long as we support PHP 5.6+ -->
+        <exclude name="PSR12.Properties.ConstantVisibility.NotFound"/>
+
+        <!-- This sniff doesn't ignore comment blocks -->
+<!--
+        <exclude name="Generic.Files.LineLength"/>
+-->
+    </rule>
+</ruleset>
diff --git a/civicrm/vendor/scssphp/scssphp/scss.inc.php b/civicrm/vendor/scssphp/scssphp/scss.inc.php
new file mode 100644
index 0000000000000000000000000000000000000000..abbd9d21a6438dcfa28361efada17212d744e8e2
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/scss.inc.php
@@ -0,0 +1,36 @@
+<?php
+
+if (version_compare(PHP_VERSION, '5.6') < 0) {
+    throw new \Exception('scssphp requires PHP 5.6 or above');
+}
+
+if (! class_exists('ScssPhp\ScssPhp\Version', false)) {
+    include_once __DIR__ . '/src/Base/Range.php';
+    include_once __DIR__ . '/src/Block.php';
+    include_once __DIR__ . '/src/Cache.php';
+    include_once __DIR__ . '/src/Colors.php';
+    include_once __DIR__ . '/src/Compiler.php';
+    include_once __DIR__ . '/src/Compiler/Environment.php';
+    include_once __DIR__ . '/src/Exception/SassException.php';
+    include_once __DIR__ . '/src/Exception/CompilerException.php';
+    include_once __DIR__ . '/src/Exception/ParserException.php';
+    include_once __DIR__ . '/src/Exception/RangeException.php';
+    include_once __DIR__ . '/src/Exception/ServerException.php';
+    include_once __DIR__ . '/src/Formatter.php';
+    include_once __DIR__ . '/src/Formatter/Compact.php';
+    include_once __DIR__ . '/src/Formatter/Compressed.php';
+    include_once __DIR__ . '/src/Formatter/Crunched.php';
+    include_once __DIR__ . '/src/Formatter/Debug.php';
+    include_once __DIR__ . '/src/Formatter/Expanded.php';
+    include_once __DIR__ . '/src/Formatter/Nested.php';
+    include_once __DIR__ . '/src/Formatter/OutputBlock.php';
+    include_once __DIR__ . '/src/Node.php';
+    include_once __DIR__ . '/src/Node/Number.php';
+    include_once __DIR__ . '/src/Parser.php';
+    include_once __DIR__ . '/src/SourceMap/Base64.php';
+    include_once __DIR__ . '/src/SourceMap/Base64VLQ.php';
+    include_once __DIR__ . '/src/SourceMap/SourceMapGenerator.php';
+    include_once __DIR__ . '/src/Type.php';
+    include_once __DIR__ . '/src/Util.php';
+    include_once __DIR__ . '/src/Version.php';
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Base/Range.php b/civicrm/vendor/scssphp/scssphp/src/Base/Range.php
new file mode 100644
index 0000000000000000000000000000000000000000..2846746d8e90495eda19b6b20568f3c3404cc9d0
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Base/Range.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2015-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Base;
+
+/**
+ * Range
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Range
+{
+    public $first;
+    public $last;
+
+    /**
+     * Initialize range
+     *
+     * @param integer|float $first
+     * @param integer|float $last
+     */
+    public function __construct($first, $last)
+    {
+        $this->first = $first;
+        $this->last = $last;
+    }
+
+    /**
+     * Test for inclusion in range
+     *
+     * @param integer|float $value
+     *
+     * @return boolean
+     */
+    public function includes($value)
+    {
+        return $value >= $this->first && $value <= $this->last;
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Block.php b/civicrm/vendor/scssphp/scssphp/src/Block.php
new file mode 100644
index 0000000000000000000000000000000000000000..aaeba715fbfa17b8e4af1460f292b4a0460a43fc
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Block.php
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+/**
+ * Block
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Block
+{
+    /**
+     * @var string
+     */
+    public $type;
+
+    /**
+     * @var \ScssPhp\ScssPhp\Block
+     */
+    public $parent;
+
+    /**
+     * @var string
+     */
+    public $sourceName;
+
+    /**
+     * @var integer
+     */
+    public $sourceIndex;
+
+    /**
+     * @var integer
+     */
+    public $sourceLine;
+
+    /**
+     * @var integer
+     */
+    public $sourceColumn;
+
+    /**
+     * @var array
+     */
+    public $selectors;
+
+    /**
+     * @var array
+     */
+    public $comments;
+
+    /**
+     * @var array
+     */
+    public $children;
+
+    /**
+     * @var \ScssPhp\ScssPhp\Block
+     */
+    public $selfParent;
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Cache.php b/civicrm/vendor/scssphp/scssphp/src/Cache.php
new file mode 100644
index 0000000000000000000000000000000000000000..02d47ac8a7777a3f80f7b197f8516bf869c81c4b
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Cache.php
@@ -0,0 +1,240 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+use Exception;
+
+/**
+ * The scss cache manager.
+ *
+ * In short:
+ *
+ * allow to put in cache/get from cache a generic result from a known operation on a generic dataset,
+ * taking in account options that affects the result
+ *
+ * The cache manager is agnostic about data format and only the operation is expected to be described by string
+ */
+
+/**
+ * SCSS cache
+ *
+ * @author Cedric Morin <cedric@yterium.com>
+ */
+class Cache
+{
+    const CACHE_VERSION = 1;
+
+    // directory used for storing data
+    public static $cacheDir = false;
+
+    // prefix for the storing data
+    public static $prefix = 'scssphp_';
+
+    // force a refresh : 'once' for refreshing the first hit on a cache only, true to never use the cache in this hit
+    public static $forceRefresh = false;
+
+    // specifies the number of seconds after which data cached will be seen as 'garbage' and potentially cleaned up
+    public static $gcLifetime = 604800;
+
+    // array of already refreshed cache if $forceRefresh==='once'
+    protected static $refreshed = [];
+
+    /**
+     * Constructor
+     *
+     * @param array $options
+     */
+    public function __construct($options)
+    {
+        // check $cacheDir
+        if (isset($options['cacheDir'])) {
+            self::$cacheDir = $options['cacheDir'];
+        }
+
+        if (empty(self::$cacheDir)) {
+            throw new Exception('cacheDir not set');
+        }
+
+        if (isset($options['prefix'])) {
+            self::$prefix = $options['prefix'];
+        }
+
+        if (empty(self::$prefix)) {
+            throw new Exception('prefix not set');
+        }
+
+        if (isset($options['forceRefresh'])) {
+            self::$forceRefresh = $options['forceRefresh'];
+        }
+
+        self::checkCacheDir();
+    }
+
+    /**
+     * Get the cached result of $operation on $what,
+     * which is known as dependant from the content of $options
+     *
+     * @param string  $operation    parse, compile...
+     * @param mixed   $what         content key (e.g., filename to be treated)
+     * @param array   $options      any option that affect the operation result on the content
+     * @param integer $lastModified last modified timestamp
+     *
+     * @return mixed
+     *
+     * @throws \Exception
+     */
+    public function getCache($operation, $what, $options = [], $lastModified = null)
+    {
+        $fileCache = self::$cacheDir . self::cacheName($operation, $what, $options);
+
+        if (
+            ((self::$forceRefresh === false) || (self::$forceRefresh === 'once' &&
+            isset(self::$refreshed[$fileCache]))) && file_exists($fileCache)
+        ) {
+            $cacheTime = filemtime($fileCache);
+
+            if (
+                (\is_null($lastModified) || $cacheTime > $lastModified) &&
+                $cacheTime + self::$gcLifetime > time()
+            ) {
+                $c = file_get_contents($fileCache);
+                $c = unserialize($c);
+
+                if (\is_array($c) && isset($c['value'])) {
+                    return $c['value'];
+                }
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Put in cache the result of $operation on $what,
+     * which is known as dependant from the content of $options
+     *
+     * @param string $operation
+     * @param mixed  $what
+     * @param mixed  $value
+     * @param array  $options
+     */
+    public function setCache($operation, $what, $value, $options = [])
+    {
+        $fileCache = self::$cacheDir . self::cacheName($operation, $what, $options);
+
+        $c = ['value' => $value];
+        $c = serialize($c);
+
+        file_put_contents($fileCache, $c);
+
+        if (self::$forceRefresh === 'once') {
+            self::$refreshed[$fileCache] = true;
+        }
+    }
+
+    /**
+     * Get the cache name for the caching of $operation on $what,
+     * which is known as dependant from the content of $options
+     *
+     * @param string $operation
+     * @param mixed  $what
+     * @param array  $options
+     *
+     * @return string
+     */
+    private static function cacheName($operation, $what, $options = [])
+    {
+        $t = [
+          'version' => self::CACHE_VERSION,
+          'operation' => $operation,
+          'what' => $what,
+          'options' => $options
+        ];
+
+        $t = self::$prefix
+          . sha1(json_encode($t))
+          . ".$operation"
+          . ".scsscache";
+
+        return $t;
+    }
+
+    /**
+     * Check that the cache dir exists and is writeable
+     *
+     * @throws \Exception
+     */
+    public static function checkCacheDir()
+    {
+        self::$cacheDir = str_replace('\\', '/', self::$cacheDir);
+        self::$cacheDir = rtrim(self::$cacheDir, '/') . '/';
+
+        if (! is_dir(self::$cacheDir)) {
+            throw new Exception('Cache directory doesn\'t exist: ' . self::$cacheDir);
+        }
+
+        if (! is_writable(self::$cacheDir)) {
+            throw new Exception('Cache directory isn\'t writable: ' . self::$cacheDir);
+        }
+    }
+
+    /**
+     * Delete unused cached files
+     */
+    public static function cleanCache()
+    {
+        static $clean = false;
+
+        if ($clean || empty(self::$cacheDir)) {
+            return;
+        }
+
+        $clean = true;
+
+        // only remove files with extensions created by SCSSPHP Cache
+        // css files removed based on the list files
+        $removeTypes = ['scsscache' => 1];
+
+        $files = scandir(self::$cacheDir);
+
+        if (! $files) {
+            return;
+        }
+
+        $checkTime = time() - self::$gcLifetime;
+
+        foreach ($files as $file) {
+            // don't delete if the file wasn't created with SCSSPHP Cache
+            if (strpos($file, self::$prefix) !== 0) {
+                continue;
+            }
+
+            $parts = explode('.', $file);
+            $type = array_pop($parts);
+
+            if (! isset($removeTypes[$type])) {
+                continue;
+            }
+
+            $fullPath = self::$cacheDir . $file;
+            $mtime = filemtime($fullPath);
+
+            // don't delete if it's a relatively new file
+            if ($mtime > $checkTime) {
+                continue;
+            }
+
+            unlink($fullPath);
+        }
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Colors.php b/civicrm/vendor/scssphp/scssphp/src/Colors.php
new file mode 100644
index 0000000000000000000000000000000000000000..4b62c361c52f79ac398286f0f63262cb04b51718
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Colors.php
@@ -0,0 +1,245 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+/**
+ * CSS Colors
+ *
+ * @author Leaf Corcoran <leafot@gmail.com>
+ */
+class Colors
+{
+    /**
+     * CSS Colors
+     *
+     * @see http://www.w3.org/TR/css3-color
+     *
+     * @var array
+     */
+    protected static $cssColors = [
+        'aliceblue' => '240,248,255',
+        'antiquewhite' => '250,235,215',
+        'cyan' => '0,255,255',
+        'aqua' => '0,255,255',
+        'aquamarine' => '127,255,212',
+        'azure' => '240,255,255',
+        'beige' => '245,245,220',
+        'bisque' => '255,228,196',
+        'black' => '0,0,0',
+        'blanchedalmond' => '255,235,205',
+        'blue' => '0,0,255',
+        'blueviolet' => '138,43,226',
+        'brown' => '165,42,42',
+        'burlywood' => '222,184,135',
+        'cadetblue' => '95,158,160',
+        'chartreuse' => '127,255,0',
+        'chocolate' => '210,105,30',
+        'coral' => '255,127,80',
+        'cornflowerblue' => '100,149,237',
+        'cornsilk' => '255,248,220',
+        'crimson' => '220,20,60',
+        'darkblue' => '0,0,139',
+        'darkcyan' => '0,139,139',
+        'darkgoldenrod' => '184,134,11',
+        'darkgray' => '169,169,169',
+        'darkgrey' => '169,169,169',
+        'darkgreen' => '0,100,0',
+        'darkkhaki' => '189,183,107',
+        'darkmagenta' => '139,0,139',
+        'darkolivegreen' => '85,107,47',
+        'darkorange' => '255,140,0',
+        'darkorchid' => '153,50,204',
+        'darkred' => '139,0,0',
+        'darksalmon' => '233,150,122',
+        'darkseagreen' => '143,188,143',
+        'darkslateblue' => '72,61,139',
+        'darkslategray' => '47,79,79',
+        'darkslategrey' => '47,79,79',
+        'darkturquoise' => '0,206,209',
+        'darkviolet' => '148,0,211',
+        'deeppink' => '255,20,147',
+        'deepskyblue' => '0,191,255',
+        'dimgray' => '105,105,105',
+        'dimgrey' => '105,105,105',
+        'dodgerblue' => '30,144,255',
+        'firebrick' => '178,34,34',
+        'floralwhite' => '255,250,240',
+        'forestgreen' => '34,139,34',
+        'magenta' => '255,0,255',
+        'fuchsia' => '255,0,255',
+        'gainsboro' => '220,220,220',
+        'ghostwhite' => '248,248,255',
+        'gold' => '255,215,0',
+        'goldenrod' => '218,165,32',
+        'gray' => '128,128,128',
+        'grey' => '128,128,128',
+        'green' => '0,128,0',
+        'greenyellow' => '173,255,47',
+        'honeydew' => '240,255,240',
+        'hotpink' => '255,105,180',
+        'indianred' => '205,92,92',
+        'indigo' => '75,0,130',
+        'ivory' => '255,255,240',
+        'khaki' => '240,230,140',
+        'lavender' => '230,230,250',
+        'lavenderblush' => '255,240,245',
+        'lawngreen' => '124,252,0',
+        'lemonchiffon' => '255,250,205',
+        'lightblue' => '173,216,230',
+        'lightcoral' => '240,128,128',
+        'lightcyan' => '224,255,255',
+        'lightgoldenrodyellow' => '250,250,210',
+        'lightgray' => '211,211,211',
+        'lightgrey' => '211,211,211',
+        'lightgreen' => '144,238,144',
+        'lightpink' => '255,182,193',
+        'lightsalmon' => '255,160,122',
+        'lightseagreen' => '32,178,170',
+        'lightskyblue' => '135,206,250',
+        'lightslategray' => '119,136,153',
+        'lightslategrey' => '119,136,153',
+        'lightsteelblue' => '176,196,222',
+        'lightyellow' => '255,255,224',
+        'lime' => '0,255,0',
+        'limegreen' => '50,205,50',
+        'linen' => '250,240,230',
+        'maroon' => '128,0,0',
+        'mediumaquamarine' => '102,205,170',
+        'mediumblue' => '0,0,205',
+        'mediumorchid' => '186,85,211',
+        'mediumpurple' => '147,112,219',
+        'mediumseagreen' => '60,179,113',
+        'mediumslateblue' => '123,104,238',
+        'mediumspringgreen' => '0,250,154',
+        'mediumturquoise' => '72,209,204',
+        'mediumvioletred' => '199,21,133',
+        'midnightblue' => '25,25,112',
+        'mintcream' => '245,255,250',
+        'mistyrose' => '255,228,225',
+        'moccasin' => '255,228,181',
+        'navajowhite' => '255,222,173',
+        'navy' => '0,0,128',
+        'oldlace' => '253,245,230',
+        'olive' => '128,128,0',
+        'olivedrab' => '107,142,35',
+        'orange' => '255,165,0',
+        'orangered' => '255,69,0',
+        'orchid' => '218,112,214',
+        'palegoldenrod' => '238,232,170',
+        'palegreen' => '152,251,152',
+        'paleturquoise' => '175,238,238',
+        'palevioletred' => '219,112,147',
+        'papayawhip' => '255,239,213',
+        'peachpuff' => '255,218,185',
+        'peru' => '205,133,63',
+        'pink' => '255,192,203',
+        'plum' => '221,160,221',
+        'powderblue' => '176,224,230',
+        'purple' => '128,0,128',
+        'red' => '255,0,0',
+        'rosybrown' => '188,143,143',
+        'royalblue' => '65,105,225',
+        'saddlebrown' => '139,69,19',
+        'salmon' => '250,128,114',
+        'sandybrown' => '244,164,96',
+        'seagreen' => '46,139,87',
+        'seashell' => '255,245,238',
+        'sienna' => '160,82,45',
+        'silver' => '192,192,192',
+        'skyblue' => '135,206,235',
+        'slateblue' => '106,90,205',
+        'slategray' => '112,128,144',
+        'slategrey' => '112,128,144',
+        'snow' => '255,250,250',
+        'springgreen' => '0,255,127',
+        'steelblue' => '70,130,180',
+        'tan' => '210,180,140',
+        'teal' => '0,128,128',
+        'thistle' => '216,191,216',
+        'tomato' => '255,99,71',
+        'turquoise' => '64,224,208',
+        'violet' => '238,130,238',
+        'wheat' => '245,222,179',
+        'white' => '255,255,255',
+        'whitesmoke' => '245,245,245',
+        'yellow' => '255,255,0',
+        'yellowgreen' => '154,205,50',
+        'rebeccapurple' => '102,51,153',
+        'transparent' => '0,0,0,0',
+    ];
+
+    /**
+     * Convert named color in a [r,g,b[,a]] array
+     *
+     * @param string $colorName
+     *
+     * @return array|null
+     */
+    public static function colorNameToRGBa($colorName)
+    {
+        if (\is_string($colorName) && isset(static::$cssColors[$colorName])) {
+            $rgba = explode(',', static::$cssColors[$colorName]);
+
+            // only case with opacity is transparent, with opacity=0, so we can intval on opacity also
+            $rgba = array_map('intval', $rgba);
+
+            return $rgba;
+        }
+
+        return null;
+    }
+
+    /**
+     * Reverse conversion : from RGBA to a color name if possible
+     *
+     * @param integer $r
+     * @param integer $g
+     * @param integer $b
+     * @param integer $a
+     *
+     * @return string|null
+     */
+    public static function RGBaToColorName($r, $g, $b, $a = 1)
+    {
+        static $reverseColorTable = null;
+
+        if (! is_numeric($r) || ! is_numeric($g) || ! is_numeric($b) || ! is_numeric($a)) {
+            return null;
+        }
+
+        if ($a < 1) {
+            return null;
+        }
+
+        if (\is_null($reverseColorTable)) {
+            $reverseColorTable = [];
+
+            foreach (static::$cssColors as $name => $rgb_str) {
+                $rgb_str = explode(',', $rgb_str);
+
+                if (
+                    \count($rgb_str) == 3 &&
+                    ! isset($reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])])
+                ) {
+                    $reverseColorTable[\intval($rgb_str[0])][\intval($rgb_str[1])][\intval($rgb_str[2])] = $name;
+                }
+            }
+        }
+
+        if (isset($reverseColorTable[\intval($r)][\intval($g)][\intval($b)])) {
+            return $reverseColorTable[\intval($r)][\intval($g)][\intval($b)];
+        }
+
+        return null;
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Compiler.php b/civicrm/vendor/scssphp/scssphp/src/Compiler.php
new file mode 100644
index 0000000000000000000000000000000000000000..9eb8dec17ad370753d6bbe3784d77b6cedd87581
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Compiler.php
@@ -0,0 +1,8588 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+use ScssPhp\ScssPhp\Base\Range;
+use ScssPhp\ScssPhp\Block;
+use ScssPhp\ScssPhp\Cache;
+use ScssPhp\ScssPhp\Colors;
+use ScssPhp\ScssPhp\Compiler\Environment;
+use ScssPhp\ScssPhp\Exception\CompilerException;
+use ScssPhp\ScssPhp\Formatter\OutputBlock;
+use ScssPhp\ScssPhp\Node;
+use ScssPhp\ScssPhp\SourceMap\SourceMapGenerator;
+use ScssPhp\ScssPhp\Type;
+use ScssPhp\ScssPhp\Parser;
+use ScssPhp\ScssPhp\Util;
+
+/**
+ * The scss compiler and parser.
+ *
+ * Converting SCSS to CSS is a three stage process. The incoming file is parsed
+ * by `Parser` into a syntax tree, then it is compiled into another tree
+ * representing the CSS structure by `Compiler`. The CSS tree is fed into a
+ * formatter, like `Formatter` which then outputs CSS as a string.
+ *
+ * During the first compile, all values are *reduced*, which means that their
+ * types are brought to the lowest form before being dump as strings. This
+ * handles math equations, variable dereferences, and the like.
+ *
+ * The `compile` function of `Compiler` is the entry point.
+ *
+ * In summary:
+ *
+ * The `Compiler` class creates an instance of the parser, feeds it SCSS code,
+ * then transforms the resulting tree to a CSS tree. This class also holds the
+ * evaluation context, such as all available mixins and variables at any given
+ * time.
+ *
+ * The `Parser` class is only concerned with parsing its input.
+ *
+ * The `Formatter` takes a CSS tree, and dumps it to a formatted string,
+ * handling things like indentation.
+ */
+
+/**
+ * SCSS compiler
+ *
+ * @author Leaf Corcoran <leafot@gmail.com>
+ */
+class Compiler
+{
+    const LINE_COMMENTS = 1;
+    const DEBUG_INFO    = 2;
+
+    const WITH_RULE     = 1;
+    const WITH_MEDIA    = 2;
+    const WITH_SUPPORTS = 4;
+    const WITH_ALL      = 7;
+
+    const SOURCE_MAP_NONE   = 0;
+    const SOURCE_MAP_INLINE = 1;
+    const SOURCE_MAP_FILE   = 2;
+
+    /**
+     * @var array
+     */
+    protected static $operatorNames = [
+        '+'   => 'add',
+        '-'   => 'sub',
+        '*'   => 'mul',
+        '/'   => 'div',
+        '%'   => 'mod',
+
+        '=='  => 'eq',
+        '!='  => 'neq',
+        '<'   => 'lt',
+        '>'   => 'gt',
+
+        '<='  => 'lte',
+        '>='  => 'gte',
+        '<=>' => 'cmp',
+    ];
+
+    /**
+     * @var array
+     */
+    protected static $namespaces = [
+        'special'  => '%',
+        'mixin'    => '@',
+        'function' => '^',
+    ];
+
+    public static $true         = [Type::T_KEYWORD, 'true'];
+    public static $false        = [Type::T_KEYWORD, 'false'];
+    public static $NaN          = [Type::T_KEYWORD, 'NaN'];
+    public static $Infinity     = [Type::T_KEYWORD, 'Infinity'];
+    public static $null         = [Type::T_NULL];
+    public static $nullString   = [Type::T_STRING, '', []];
+    public static $defaultValue = [Type::T_KEYWORD, ''];
+    public static $selfSelector = [Type::T_SELF];
+    public static $emptyList    = [Type::T_LIST, '', []];
+    public static $emptyMap     = [Type::T_MAP, [], []];
+    public static $emptyString  = [Type::T_STRING, '"', []];
+    public static $with         = [Type::T_KEYWORD, 'with'];
+    public static $without      = [Type::T_KEYWORD, 'without'];
+
+    protected $importPaths = [''];
+    protected $importCache = [];
+    protected $importedFiles = [];
+    protected $userFunctions = [];
+    protected $registeredVars = [];
+    protected $registeredFeatures = [
+        'extend-selector-pseudoclass' => false,
+        'at-error'                    => true,
+        'units-level-3'               => false,
+        'global-variable-shadowing'   => false,
+    ];
+
+    protected $encoding = null;
+    protected $lineNumberStyle = null;
+
+    protected $sourceMap = self::SOURCE_MAP_NONE;
+    protected $sourceMapOptions = [];
+
+    /**
+     * @var string|\ScssPhp\ScssPhp\Formatter
+     */
+    protected $formatter = 'ScssPhp\ScssPhp\Formatter\Nested';
+
+    protected $rootEnv;
+    protected $rootBlock;
+
+    /**
+     * @var \ScssPhp\ScssPhp\Compiler\Environment
+     */
+    protected $env;
+    protected $scope;
+    protected $storeEnv;
+    protected $charsetSeen;
+    protected $sourceNames;
+
+    protected $cache;
+
+    protected $indentLevel;
+    protected $extends;
+    protected $extendsMap;
+    protected $parsedFiles;
+    protected $parser;
+    protected $sourceIndex;
+    protected $sourceLine;
+    protected $sourceColumn;
+    protected $stderr;
+    protected $shouldEvaluate;
+    protected $ignoreErrors;
+    protected $ignoreCallStackMessage = false;
+
+    protected $callStack = [];
+
+    /**
+     * Constructor
+     *
+     * @param array|null $cacheOptions
+     */
+    public function __construct($cacheOptions = null)
+    {
+        $this->parsedFiles = [];
+        $this->sourceNames = [];
+
+        if ($cacheOptions) {
+            $this->cache = new Cache($cacheOptions);
+        }
+
+        $this->stderr = fopen('php://stderr', 'w');
+    }
+
+    /**
+     * Get compiler options
+     *
+     * @return array
+     */
+    public function getCompileOptions()
+    {
+        $options = [
+            'importPaths'        => $this->importPaths,
+            'registeredVars'     => $this->registeredVars,
+            'registeredFeatures' => $this->registeredFeatures,
+            'encoding'           => $this->encoding,
+            'sourceMap'          => serialize($this->sourceMap),
+            'sourceMapOptions'   => $this->sourceMapOptions,
+            'formatter'          => $this->formatter,
+        ];
+
+        return $options;
+    }
+
+    /**
+     * Set an alternative error output stream, for testing purpose only
+     *
+     * @param resource $handle
+     */
+    public function setErrorOuput($handle)
+    {
+        $this->stderr = $handle;
+    }
+
+    /**
+     * Compile scss
+     *
+     * @api
+     *
+     * @param string $code
+     * @param string $path
+     *
+     * @return string
+     */
+    public function compile($code, $path = null)
+    {
+        if ($this->cache) {
+            $cacheKey       = ($path ? $path : '(stdin)') . ':' . md5($code);
+            $compileOptions = $this->getCompileOptions();
+            $cache          = $this->cache->getCache('compile', $cacheKey, $compileOptions);
+
+            if (\is_array($cache) && isset($cache['dependencies']) && isset($cache['out'])) {
+                // check if any dependency file changed before accepting the cache
+                foreach ($cache['dependencies'] as $file => $mtime) {
+                    if (! is_file($file) || filemtime($file) !== $mtime) {
+                        unset($cache);
+                        break;
+                    }
+                }
+
+                if (isset($cache)) {
+                    return $cache['out'];
+                }
+            }
+        }
+
+
+        $this->indentLevel    = -1;
+        $this->extends        = [];
+        $this->extendsMap     = [];
+        $this->sourceIndex    = null;
+        $this->sourceLine     = null;
+        $this->sourceColumn   = null;
+        $this->env            = null;
+        $this->scope          = null;
+        $this->storeEnv       = null;
+        $this->charsetSeen    = null;
+        $this->shouldEvaluate = null;
+        $this->ignoreCallStackMessage = false;
+
+        $this->parser = $this->parserFactory($path);
+        $tree         = $this->parser->parse($code);
+        $this->parser = null;
+
+        $this->formatter = new $this->formatter();
+        $this->rootBlock = null;
+        $this->rootEnv   = $this->pushEnv($tree);
+
+        $this->injectVariables($this->registeredVars);
+        $this->compileRoot($tree);
+        $this->popEnv();
+
+        $sourceMapGenerator = null;
+
+        if ($this->sourceMap) {
+            if (\is_object($this->sourceMap) && $this->sourceMap instanceof SourceMapGenerator) {
+                $sourceMapGenerator = $this->sourceMap;
+                $this->sourceMap = self::SOURCE_MAP_FILE;
+            } elseif ($this->sourceMap !== self::SOURCE_MAP_NONE) {
+                $sourceMapGenerator = new SourceMapGenerator($this->sourceMapOptions);
+            }
+        }
+
+        $out = $this->formatter->format($this->scope, $sourceMapGenerator);
+
+        if (! empty($out) && $this->sourceMap && $this->sourceMap !== self::SOURCE_MAP_NONE) {
+            $sourceMap    = $sourceMapGenerator->generateJson();
+            $sourceMapUrl = null;
+
+            switch ($this->sourceMap) {
+                case self::SOURCE_MAP_INLINE:
+                    $sourceMapUrl = sprintf('data:application/json,%s', Util::encodeURIComponent($sourceMap));
+                    break;
+
+                case self::SOURCE_MAP_FILE:
+                    $sourceMapUrl = $sourceMapGenerator->saveMap($sourceMap);
+                    break;
+            }
+
+            $out .= sprintf('/*# sourceMappingURL=%s */', $sourceMapUrl);
+        }
+
+        if ($this->cache && isset($cacheKey) && isset($compileOptions)) {
+            $v = [
+                'dependencies' => $this->getParsedFiles(),
+                'out' => &$out,
+            ];
+
+            $this->cache->setCache('compile', $cacheKey, $v, $compileOptions);
+        }
+
+        return $out;
+    }
+
+    /**
+     * Instantiate parser
+     *
+     * @param string $path
+     *
+     * @return \ScssPhp\ScssPhp\Parser
+     */
+    protected function parserFactory($path)
+    {
+        // https://sass-lang.com/documentation/at-rules/import
+        // CSS files imported by Sass don’t allow any special Sass features.
+        // In order to make sure authors don’t accidentally write Sass in their CSS,
+        // all Sass features that aren’t also valid CSS will produce errors.
+        // Otherwise, the CSS will be rendered as-is. It can even be extended!
+        $cssOnly = false;
+
+        if (substr($path, '-4') === '.css') {
+            $cssOnly = true;
+        }
+
+        $parser = new Parser($path, \count($this->sourceNames), $this->encoding, $this->cache, $cssOnly);
+
+        $this->sourceNames[] = $path;
+        $this->addParsedFile($path);
+
+        return $parser;
+    }
+
+    /**
+     * Is self extend?
+     *
+     * @param array $target
+     * @param array $origin
+     *
+     * @return boolean
+     */
+    protected function isSelfExtend($target, $origin)
+    {
+        foreach ($origin as $sel) {
+            if (\in_array($target, $sel)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Push extends
+     *
+     * @param array      $target
+     * @param array      $origin
+     * @param array|null $block
+     */
+    protected function pushExtends($target, $origin, $block)
+    {
+        $i = \count($this->extends);
+        $this->extends[] = [$target, $origin, $block];
+
+        foreach ($target as $part) {
+            if (isset($this->extendsMap[$part])) {
+                $this->extendsMap[$part][] = $i;
+            } else {
+                $this->extendsMap[$part] = [$i];
+            }
+        }
+    }
+
+    /**
+     * Make output block
+     *
+     * @param string $type
+     * @param array  $selectors
+     *
+     * @return \ScssPhp\ScssPhp\Formatter\OutputBlock
+     */
+    protected function makeOutputBlock($type, $selectors = null)
+    {
+        $out = new OutputBlock();
+        $out->type      = $type;
+        $out->lines     = [];
+        $out->children  = [];
+        $out->parent    = $this->scope;
+        $out->selectors = $selectors;
+        $out->depth     = $this->env->depth;
+
+        if ($this->env->block instanceof Block) {
+            $out->sourceName   = $this->env->block->sourceName;
+            $out->sourceLine   = $this->env->block->sourceLine;
+            $out->sourceColumn = $this->env->block->sourceColumn;
+        } else {
+            $out->sourceName   = null;
+            $out->sourceLine   = null;
+            $out->sourceColumn = null;
+        }
+
+        return $out;
+    }
+
+    /**
+     * Compile root
+     *
+     * @param \ScssPhp\ScssPhp\Block $rootBlock
+     */
+    protected function compileRoot(Block $rootBlock)
+    {
+        $this->rootBlock = $this->scope = $this->makeOutputBlock(Type::T_ROOT);
+
+        $this->compileChildrenNoReturn($rootBlock->children, $this->scope);
+        $this->flattenSelectors($this->scope);
+        $this->missingSelectors();
+    }
+
+    /**
+     * Report missing selectors
+     */
+    protected function missingSelectors()
+    {
+        foreach ($this->extends as $extend) {
+            if (isset($extend[3])) {
+                continue;
+            }
+
+            list($target, $origin, $block) = $extend;
+
+            // ignore if !optional
+            if ($block[2]) {
+                continue;
+            }
+
+            $target = implode(' ', $target);
+            $origin = $this->collapseSelectors($origin);
+
+            $this->sourceLine = $block[Parser::SOURCE_LINE];
+            throw $this->error("\"$origin\" failed to @extend \"$target\". The selector \"$target\" was not found.");
+        }
+    }
+
+    /**
+     * Flatten selectors
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     * @param string                                 $parentKey
+     */
+    protected function flattenSelectors(OutputBlock $block, $parentKey = null)
+    {
+        if ($block->selectors) {
+            $selectors = [];
+
+            foreach ($block->selectors as $s) {
+                $selectors[] = $s;
+
+                if (! \is_array($s)) {
+                    continue;
+                }
+
+                // check extends
+                if (! empty($this->extendsMap)) {
+                    $this->matchExtends($s, $selectors);
+
+                    // remove duplicates
+                    array_walk($selectors, function (&$value) {
+                        $value = serialize($value);
+                    });
+
+                    $selectors = array_unique($selectors);
+
+                    array_walk($selectors, function (&$value) {
+                        $value = unserialize($value);
+                    });
+                }
+            }
+
+            $block->selectors = [];
+            $placeholderSelector = false;
+
+            foreach ($selectors as $selector) {
+                if ($this->hasSelectorPlaceholder($selector)) {
+                    $placeholderSelector = true;
+                    continue;
+                }
+
+                $block->selectors[] = $this->compileSelector($selector);
+            }
+
+            if ($placeholderSelector && 0 === \count($block->selectors) && null !== $parentKey) {
+                unset($block->parent->children[$parentKey]);
+
+                return;
+            }
+        }
+
+        foreach ($block->children as $key => $child) {
+            $this->flattenSelectors($child, $key);
+        }
+    }
+
+    /**
+     * Glue parts of :not( or :nth-child( ... that are in general splitted in selectors parts
+     *
+     * @param array $parts
+     *
+     * @return array
+     */
+    protected function glueFunctionSelectors($parts)
+    {
+        $new = [];
+
+        foreach ($parts as $part) {
+            if (\is_array($part)) {
+                $part = $this->glueFunctionSelectors($part);
+                $new[] = $part;
+            } else {
+                // a selector part finishing with a ) is the last part of a :not( or :nth-child(
+                // and need to be joined to this
+                if (
+                    \count($new) && \is_string($new[\count($new) - 1]) &&
+                    \strlen($part) && substr($part, -1) === ')' && strpos($part, '(') === false
+                ) {
+                    while (\count($new) > 1 && substr($new[\count($new) - 1], -1) !== '(') {
+                        $part = array_pop($new) . $part;
+                    }
+                    $new[\count($new) - 1] .= $part;
+                } else {
+                    $new[] = $part;
+                }
+            }
+        }
+
+        return $new;
+    }
+
+    /**
+     * Match extends
+     *
+     * @param array   $selector
+     * @param array   $out
+     * @param integer $from
+     * @param boolean $initial
+     */
+    protected function matchExtends($selector, &$out, $from = 0, $initial = true)
+    {
+        static $partsPile = [];
+        $selector = $this->glueFunctionSelectors($selector);
+
+        if (\count($selector) == 1 && \in_array(reset($selector), $partsPile)) {
+            return;
+        }
+
+        $outRecurs = [];
+
+        foreach ($selector as $i => $part) {
+            if ($i < $from) {
+                continue;
+            }
+
+            // check that we are not building an infinite loop of extensions
+            // if the new part is just including a previous part don't try to extend anymore
+            if (\count($part) > 1) {
+                foreach ($partsPile as $previousPart) {
+                    if (! \count(array_diff($previousPart, $part))) {
+                        continue 2;
+                    }
+                }
+            }
+
+            $partsPile[] = $part;
+
+            if ($this->matchExtendsSingle($part, $origin, $initial)) {
+                $after       = \array_slice($selector, $i + 1);
+                $before      = \array_slice($selector, 0, $i);
+                list($before, $nonBreakableBefore) = $this->extractRelationshipFromFragment($before);
+
+                foreach ($origin as $new) {
+                    $k = 0;
+
+                    // remove shared parts
+                    if (\count($new) > 1) {
+                        while ($k < $i && isset($new[$k]) && $selector[$k] === $new[$k]) {
+                            $k++;
+                        }
+                    }
+
+                    if (\count($nonBreakableBefore) && $k === \count($new)) {
+                        $k--;
+                    }
+
+                    $replacement = [];
+                    $tempReplacement = $k > 0 ? \array_slice($new, $k) : $new;
+
+                    for ($l = \count($tempReplacement) - 1; $l >= 0; $l--) {
+                        $slice = [];
+
+                        foreach ($tempReplacement[$l] as $chunk) {
+                            if (! \in_array($chunk, $slice)) {
+                                $slice[] = $chunk;
+                            }
+                        }
+
+                        array_unshift($replacement, $slice);
+
+                        if (! $this->isImmediateRelationshipCombinator(end($slice))) {
+                            break;
+                        }
+                    }
+
+                    $afterBefore = $l != 0 ? \array_slice($tempReplacement, 0, $l) : [];
+
+                    // Merge shared direct relationships.
+                    $mergedBefore = $this->mergeDirectRelationships($afterBefore, $nonBreakableBefore);
+
+                    $result = array_merge(
+                        $before,
+                        $mergedBefore,
+                        $replacement,
+                        $after
+                    );
+
+                    if ($result === $selector) {
+                        continue;
+                    }
+
+                    $this->pushOrMergeExtentedSelector($out, $result);
+
+                    // recursively check for more matches
+                    $startRecurseFrom = \count($before) + min(\count($nonBreakableBefore), \count($mergedBefore));
+
+                    if (\count($origin) > 1) {
+                        $this->matchExtends($result, $out, $startRecurseFrom, false);
+                    } else {
+                        $this->matchExtends($result, $outRecurs, $startRecurseFrom, false);
+                    }
+
+                    // selector sequence merging
+                    if (! empty($before) && \count($new) > 1) {
+                        $preSharedParts = $k > 0 ? \array_slice($before, 0, $k) : [];
+                        $postSharedParts = $k > 0 ? \array_slice($before, $k) : $before;
+
+                        list($betweenSharedParts, $nonBreakabl2) = $this->extractRelationshipFromFragment($afterBefore);
+
+                        $result2 = array_merge(
+                            $preSharedParts,
+                            $betweenSharedParts,
+                            $postSharedParts,
+                            $nonBreakabl2,
+                            $nonBreakableBefore,
+                            $replacement,
+                            $after
+                        );
+
+                        $this->pushOrMergeExtentedSelector($out, $result2);
+                    }
+                }
+            }
+            array_pop($partsPile);
+        }
+
+        while (\count($outRecurs)) {
+            $result = array_shift($outRecurs);
+            $this->pushOrMergeExtentedSelector($out, $result);
+        }
+    }
+
+    /**
+     * Test a part for being a pseudo selector
+     *
+     * @param string $part
+     * @param array  $matches
+     *
+     * @return boolean
+     */
+    protected function isPseudoSelector($part, &$matches)
+    {
+        if (
+            strpos($part, ':') === 0 &&
+            preg_match(",^::?([\w-]+)\((.+)\)$,", $part, $matches)
+        ) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Push extended selector except if
+     *  - this is a pseudo selector
+     *  - same as previous
+     *  - in a white list
+     * in this case we merge the pseudo selector content
+     *
+     * @param array $out
+     * @param array $extended
+     */
+    protected function pushOrMergeExtentedSelector(&$out, $extended)
+    {
+        if (\count($out) && \count($extended) === 1 && \count(reset($extended)) === 1) {
+            $single = reset($extended);
+            $part = reset($single);
+
+            if (
+                $this->isPseudoSelector($part, $matchesExtended) &&
+                \in_array($matchesExtended[1], [ 'slotted' ])
+            ) {
+                $prev = end($out);
+                $prev = $this->glueFunctionSelectors($prev);
+
+                if (\count($prev) === 1 && \count(reset($prev)) === 1) {
+                    $single = reset($prev);
+                    $part = reset($single);
+
+                    if (
+                        $this->isPseudoSelector($part, $matchesPrev) &&
+                        $matchesPrev[1] === $matchesExtended[1]
+                    ) {
+                        $extended = explode($matchesExtended[1] . '(', $matchesExtended[0], 2);
+                        $extended[1] = $matchesPrev[2] . ', ' . $extended[1];
+                        $extended = implode($matchesExtended[1] . '(', $extended);
+                        $extended = [ [ $extended ]];
+                        array_pop($out);
+                    }
+                }
+            }
+        }
+        $out[] = $extended;
+    }
+
+    /**
+     * Match extends single
+     *
+     * @param array   $rawSingle
+     * @param array   $outOrigin
+     * @param boolean $initial
+     *
+     * @return boolean
+     */
+    protected function matchExtendsSingle($rawSingle, &$outOrigin, $initial = true)
+    {
+        $counts = [];
+        $single = [];
+
+        // simple usual cases, no need to do the whole trick
+        if (\in_array($rawSingle, [['>'],['+'],['~']])) {
+            return false;
+        }
+
+        foreach ($rawSingle as $part) {
+            // matches Number
+            if (! \is_string($part)) {
+                return false;
+            }
+
+            if (! preg_match('/^[\[.:#%]/', $part) && \count($single)) {
+                $single[\count($single) - 1] .= $part;
+            } else {
+                $single[] = $part;
+            }
+        }
+
+        $extendingDecoratedTag = false;
+
+        if (\count($single) > 1) {
+            $matches = null;
+            $extendingDecoratedTag = preg_match('/^[a-z0-9]+$/i', $single[0], $matches) ? $matches[0] : false;
+        }
+
+        $outOrigin = [];
+        $found = false;
+
+        foreach ($single as $k => $part) {
+            if (isset($this->extendsMap[$part])) {
+                foreach ($this->extendsMap[$part] as $idx) {
+                    $counts[$idx] = isset($counts[$idx]) ? $counts[$idx] + 1 : 1;
+                }
+            }
+
+            if (
+                $initial &&
+                $this->isPseudoSelector($part, $matches) &&
+                ! \in_array($matches[1], [ 'not' ])
+            ) {
+                $buffer    = $matches[2];
+                $parser    = $this->parserFactory(__METHOD__);
+
+                if ($parser->parseSelector($buffer, $subSelectors)) {
+                    foreach ($subSelectors as $ksub => $subSelector) {
+                        $subExtended = [];
+                        $this->matchExtends($subSelector, $subExtended, 0, false);
+
+                        if ($subExtended) {
+                            $subSelectorsExtended = $subSelectors;
+                            $subSelectorsExtended[$ksub] = $subExtended;
+
+                            foreach ($subSelectorsExtended as $ksse => $sse) {
+                                $subSelectorsExtended[$ksse] = $this->collapseSelectors($sse);
+                            }
+
+                            $subSelectorsExtended = implode(', ', $subSelectorsExtended);
+                            $singleExtended = $single;
+                            $singleExtended[$k] = str_replace('(' . $buffer . ')', "($subSelectorsExtended)", $part);
+                            $outOrigin[] = [ $singleExtended ];
+                            $found = true;
+                        }
+                    }
+                }
+            }
+        }
+
+        foreach ($counts as $idx => $count) {
+            list($target, $origin, /* $block */) = $this->extends[$idx];
+
+            $origin = $this->glueFunctionSelectors($origin);
+
+            // check count
+            if ($count !== \count($target)) {
+                continue;
+            }
+
+            $this->extends[$idx][3] = true;
+
+            $rem = array_diff($single, $target);
+
+            foreach ($origin as $j => $new) {
+                // prevent infinite loop when target extends itself
+                if ($this->isSelfExtend($single, $origin) && ! $initial) {
+                    return false;
+                }
+
+                $replacement = end($new);
+
+                // Extending a decorated tag with another tag is not possible.
+                if (
+                    $extendingDecoratedTag && $replacement[0] != $extendingDecoratedTag &&
+                    preg_match('/^[a-z0-9]+$/i', $replacement[0])
+                ) {
+                    unset($origin[$j]);
+                    continue;
+                }
+
+                $combined = $this->combineSelectorSingle($replacement, $rem);
+
+                if (\count(array_diff($combined, $origin[$j][\count($origin[$j]) - 1]))) {
+                    $origin[$j][\count($origin[$j]) - 1] = $combined;
+                }
+            }
+
+            $outOrigin = array_merge($outOrigin, $origin);
+
+            $found = true;
+        }
+
+        return $found;
+    }
+
+    /**
+     * Extract a relationship from the fragment.
+     *
+     * When extracting the last portion of a selector we will be left with a
+     * fragment which may end with a direction relationship combinator. This
+     * method will extract the relationship fragment and return it along side
+     * the rest.
+     *
+     * @param array $fragment The selector fragment maybe ending with a direction relationship combinator.
+     *
+     * @return array The selector without the relationship fragment if any, the relationship fragment.
+     */
+    protected function extractRelationshipFromFragment(array $fragment)
+    {
+        $parents = [];
+        $children = [];
+
+        $j = $i = \count($fragment);
+
+        for (;;) {
+            $children = $j != $i ? \array_slice($fragment, $j, $i - $j) : [];
+            $parents  = \array_slice($fragment, 0, $j);
+            $slice    = end($parents);
+
+            if (empty($slice) || ! $this->isImmediateRelationshipCombinator($slice[0])) {
+                break;
+            }
+
+            $j -= 2;
+        }
+
+        return [$parents, $children];
+    }
+
+    /**
+     * Combine selector single
+     *
+     * @param array $base
+     * @param array $other
+     *
+     * @return array
+     */
+    protected function combineSelectorSingle($base, $other)
+    {
+        $tag    = [];
+        $out    = [];
+        $wasTag = false;
+        $pseudo = [];
+
+        while (\count($other) && strpos(end($other), ':') === 0) {
+            array_unshift($pseudo, array_pop($other));
+        }
+
+        foreach ([array_reverse($base), array_reverse($other)] as $single) {
+            $rang = count($single);
+
+            foreach ($single as $part) {
+                if (preg_match('/^[\[:]/', $part)) {
+                    $out[] = $part;
+                    $wasTag = false;
+                } elseif (preg_match('/^[\.#]/', $part)) {
+                    array_unshift($out, $part);
+                    $wasTag = false;
+                } elseif (preg_match('/^[^_-]/', $part) && $rang === 1) {
+                    $tag[] = $part;
+                    $wasTag = true;
+                } elseif ($wasTag) {
+                    $tag[\count($tag) - 1] .= $part;
+                } else {
+                    array_unshift($out, $part);
+                }
+                $rang--;
+            }
+        }
+
+        if (\count($tag)) {
+            array_unshift($out, $tag[0]);
+        }
+
+        while (\count($pseudo)) {
+            $out[] = array_shift($pseudo);
+        }
+
+        return $out;
+    }
+
+    /**
+     * Compile media
+     *
+     * @param \ScssPhp\ScssPhp\Block $media
+     */
+    protected function compileMedia(Block $media)
+    {
+        $this->pushEnv($media);
+
+        $mediaQueries = $this->compileMediaQuery($this->multiplyMedia($this->env));
+
+        if (! empty($mediaQueries) && $mediaQueries) {
+            $previousScope = $this->scope;
+            $parentScope = $this->mediaParent($this->scope);
+
+            foreach ($mediaQueries as $mediaQuery) {
+                $this->scope = $this->makeOutputBlock(Type::T_MEDIA, [$mediaQuery]);
+
+                $parentScope->children[] = $this->scope;
+                $parentScope = $this->scope;
+            }
+
+            // top level properties in a media cause it to be wrapped
+            $needsWrap = false;
+
+            foreach ($media->children as $child) {
+                $type = $child[0];
+
+                if (
+                    $type !== Type::T_BLOCK &&
+                    $type !== Type::T_MEDIA &&
+                    $type !== Type::T_DIRECTIVE &&
+                    $type !== Type::T_IMPORT
+                ) {
+                    $needsWrap = true;
+                    break;
+                }
+            }
+
+            if ($needsWrap) {
+                $wrapped = new Block();
+                $wrapped->sourceName   = $media->sourceName;
+                $wrapped->sourceIndex  = $media->sourceIndex;
+                $wrapped->sourceLine   = $media->sourceLine;
+                $wrapped->sourceColumn = $media->sourceColumn;
+                $wrapped->selectors    = [];
+                $wrapped->comments     = [];
+                $wrapped->parent       = $media;
+                $wrapped->children     = $media->children;
+
+                $media->children = [[Type::T_BLOCK, $wrapped]];
+
+                if (isset($this->lineNumberStyle)) {
+                    $annotation = $this->makeOutputBlock(Type::T_COMMENT);
+                    $annotation->depth = 0;
+
+                    $file = $this->sourceNames[$media->sourceIndex];
+                    $line = $media->sourceLine;
+
+                    switch ($this->lineNumberStyle) {
+                        case static::LINE_COMMENTS:
+                            $annotation->lines[] = '/* line ' . $line
+                                                 . ($file ? ', ' . $file : '')
+                                                 . ' */';
+                            break;
+
+                        case static::DEBUG_INFO:
+                            $annotation->lines[] = '@media -sass-debug-info{'
+                                                 . ($file ? 'filename{font-family:"' . $file . '"}' : '')
+                                                 . 'line{font-family:' . $line . '}}';
+                            break;
+                    }
+
+                    $this->scope->children[] = $annotation;
+                }
+            }
+
+            $this->compileChildrenNoReturn($media->children, $this->scope);
+
+            $this->scope = $previousScope;
+        }
+
+        $this->popEnv();
+    }
+
+    /**
+     * Media parent
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope
+     *
+     * @return \ScssPhp\ScssPhp\Formatter\OutputBlock
+     */
+    protected function mediaParent(OutputBlock $scope)
+    {
+        while (! empty($scope->parent)) {
+            if (! empty($scope->type) && $scope->type !== Type::T_MEDIA) {
+                break;
+            }
+
+            $scope = $scope->parent;
+        }
+
+        return $scope;
+    }
+
+    /**
+     * Compile directive
+     *
+     * @param \ScssPhp\ScssPhp\Block|array $block
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+     */
+    protected function compileDirective($directive, OutputBlock $out)
+    {
+        if (\is_array($directive)) {
+            $directiveName = $this->compileDirectiveName($directive[0]);
+            $s = '@' . $directiveName;
+
+            if (! empty($directive[1])) {
+                $s .= ' ' . $this->compileValue($directive[1]);
+            }
+            // sass-spec compliance on newline after directives, a bit tricky :/
+            $appendNewLine = (! empty($directive[2]) || strpos($s, "\n")) ? "\n" : "";
+            if (\is_array($directive[0]) && empty($directive[1])) {
+                $appendNewLine = "\n";
+            }
+
+            if (empty($directive[3])) {
+                $this->appendRootDirective($s . ';' . $appendNewLine, $out, [Type::T_COMMENT, Type::T_DIRECTIVE]);
+            } else {
+                $this->appendOutputLine($out, Type::T_DIRECTIVE, $s . ';');
+            }
+        } else {
+            $directive->name = $this->compileDirectiveName($directive->name);
+            $s = '@' . $directive->name;
+
+            if (! empty($directive->value)) {
+                $s .= ' ' . $this->compileValue($directive->value);
+            }
+
+            if ($directive->name === 'keyframes' || substr($directive->name, -10) === '-keyframes') {
+                $this->compileKeyframeBlock($directive, [$s]);
+            } else {
+                $this->compileNestedBlock($directive, [$s]);
+            }
+        }
+    }
+
+    /**
+     * directive names can include some interpolation
+     *
+     * @param string|array $directiveName
+     * @return array|string
+     * @throws CompilerException
+     */
+    protected function compileDirectiveName($directiveName)
+    {
+        if (is_string($directiveName)) {
+            return $directiveName;
+        }
+
+        return $this->compileValue($directiveName);
+    }
+
+    /**
+     * Compile at-root
+     *
+     * @param \ScssPhp\ScssPhp\Block $block
+     */
+    protected function compileAtRoot(Block $block)
+    {
+        $env     = $this->pushEnv($block);
+        $envs    = $this->compactEnv($env);
+        list($with, $without) = $this->compileWith(isset($block->with) ? $block->with : null);
+
+        // wrap inline selector
+        if ($block->selector) {
+            $wrapped = new Block();
+            $wrapped->sourceName   = $block->sourceName;
+            $wrapped->sourceIndex  = $block->sourceIndex;
+            $wrapped->sourceLine   = $block->sourceLine;
+            $wrapped->sourceColumn = $block->sourceColumn;
+            $wrapped->selectors    = $block->selector;
+            $wrapped->comments     = [];
+            $wrapped->parent       = $block;
+            $wrapped->children     = $block->children;
+            $wrapped->selfParent   = $block->selfParent;
+
+            $block->children = [[Type::T_BLOCK, $wrapped]];
+            $block->selector = null;
+        }
+
+        $selfParent = $block->selfParent;
+
+        if (
+            ! $block->selfParent->selectors &&
+            isset($block->parent) && $block->parent &&
+            isset($block->parent->selectors) && $block->parent->selectors
+        ) {
+            $selfParent = $block->parent;
+        }
+
+        $this->env = $this->filterWithWithout($envs, $with, $without);
+
+        $saveScope   = $this->scope;
+        $this->scope = $this->filterScopeWithWithout($saveScope, $with, $without);
+
+        // propagate selfParent to the children where they still can be useful
+        $this->compileChildrenNoReturn($block->children, $this->scope, $selfParent);
+
+        $this->scope = $this->completeScope($this->scope, $saveScope);
+        $this->scope = $saveScope;
+        $this->env   = $this->extractEnv($envs);
+
+        $this->popEnv();
+    }
+
+    /**
+     * Filter at-root scope depending of with/without option
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope
+     * @param array                                  $with
+     * @param array                                  $without
+     *
+     * @return mixed
+     */
+    protected function filterScopeWithWithout($scope, $with, $without)
+    {
+        $filteredScopes = [];
+        $childStash = [];
+
+        if ($scope->type === TYPE::T_ROOT) {
+            return $scope;
+        }
+
+        // start from the root
+        while ($scope->parent && $scope->parent->type !== TYPE::T_ROOT) {
+            array_unshift($childStash, $scope);
+            $scope = $scope->parent;
+        }
+
+        for (;;) {
+            if (! $scope) {
+                break;
+            }
+
+            if ($this->isWith($scope, $with, $without)) {
+                $s = clone $scope;
+                $s->children = [];
+                $s->lines    = [];
+                $s->parent   = null;
+
+                if ($s->type !== Type::T_MEDIA && $s->type !== Type::T_DIRECTIVE) {
+                    $s->selectors = [];
+                }
+
+                $filteredScopes[] = $s;
+            }
+
+            if (\count($childStash)) {
+                $scope = array_shift($childStash);
+            } elseif ($scope->children) {
+                $scope = end($scope->children);
+            } else {
+                $scope = null;
+            }
+        }
+
+        if (! \count($filteredScopes)) {
+            return $this->rootBlock;
+        }
+
+        $newScope = array_shift($filteredScopes);
+        $newScope->parent = $this->rootBlock;
+
+        $this->rootBlock->children[] = $newScope;
+
+        $p = &$newScope;
+
+        while (\count($filteredScopes)) {
+            $s = array_shift($filteredScopes);
+            $s->parent = $p;
+            $p->children[] = $s;
+            $newScope = &$p->children[0];
+            $p = &$p->children[0];
+        }
+
+        return $newScope;
+    }
+
+    /**
+     * found missing selector from a at-root compilation in the previous scope
+     * (if at-root is just enclosing a property, the selector is in the parent tree)
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $previousScope
+     *
+     * @return mixed
+     */
+    protected function completeScope($scope, $previousScope)
+    {
+        if (! $scope->type && (! $scope->selectors || ! \count($scope->selectors)) && \count($scope->lines)) {
+            $scope->selectors = $this->findScopeSelectors($previousScope, $scope->depth);
+        }
+
+        if ($scope->children) {
+            foreach ($scope->children as $k => $c) {
+                $scope->children[$k] = $this->completeScope($c, $previousScope);
+            }
+        }
+
+        return $scope;
+    }
+
+    /**
+     * Find a selector by the depth node in the scope
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $scope
+     * @param integer                                $depth
+     *
+     * @return array
+     */
+    protected function findScopeSelectors($scope, $depth)
+    {
+        if ($scope->depth === $depth && $scope->selectors) {
+            return $scope->selectors;
+        }
+
+        if ($scope->children) {
+            foreach (array_reverse($scope->children) as $c) {
+                if ($s = $this->findScopeSelectors($c, $depth)) {
+                    return $s;
+                }
+            }
+        }
+
+        return [];
+    }
+
+    /**
+     * Compile @at-root's with: inclusion / without: exclusion into 2 lists uses to filter scope/env later
+     *
+     * @param array $withCondition
+     *
+     * @return array
+     */
+    protected function compileWith($withCondition)
+    {
+        // just compile what we have in 2 lists
+        $with = [];
+        $without = ['rule' => true];
+
+        if ($withCondition) {
+            if ($withCondition[0] === Type::T_INTERPOLATE) {
+                $w = $this->compileValue($withCondition);
+
+                $buffer = "($w)";
+                $parser = $this->parserFactory(__METHOD__);
+
+                if ($parser->parseValue($buffer, $reParsedWith)) {
+                    $withCondition = $reParsedWith;
+                }
+            }
+
+            if ($this->libMapHasKey([$withCondition, static::$with])) {
+                $without = []; // cancel the default
+                $list = $this->coerceList($this->libMapGet([$withCondition, static::$with]));
+
+                foreach ($list[2] as $item) {
+                    $keyword = $this->compileStringContent($this->coerceString($item));
+
+                    $with[$keyword] = true;
+                }
+            }
+
+            if ($this->libMapHasKey([$withCondition, static::$without])) {
+                $without = []; // cancel the default
+                $list = $this->coerceList($this->libMapGet([$withCondition, static::$without]));
+
+                foreach ($list[2] as $item) {
+                    $keyword = $this->compileStringContent($this->coerceString($item));
+
+                    $without[$keyword] = true;
+                }
+            }
+        }
+
+        return [$with, $without];
+    }
+
+    /**
+     * Filter env stack
+     *
+     * @param array $envs
+     * @param array $with
+     * @param array $without
+     *
+     * @return \ScssPhp\ScssPhp\Compiler\Environment
+     */
+    protected function filterWithWithout($envs, $with, $without)
+    {
+        $filtered = [];
+
+        foreach ($envs as $e) {
+            if ($e->block && ! $this->isWith($e->block, $with, $without)) {
+                $ec = clone $e;
+                $ec->block     = null;
+                $ec->selectors = [];
+
+                $filtered[] = $ec;
+            } else {
+                $filtered[] = $e;
+            }
+        }
+
+        return $this->extractEnv($filtered);
+    }
+
+    /**
+     * Filter WITH rules
+     *
+     * @param \ScssPhp\ScssPhp\Block|\ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     * @param array                                                         $with
+     * @param array                                                         $without
+     *
+     * @return boolean
+     */
+    protected function isWith($block, $with, $without)
+    {
+        if (isset($block->type)) {
+            if ($block->type === Type::T_MEDIA) {
+                return $this->testWithWithout('media', $with, $without);
+            }
+
+            if ($block->type === Type::T_DIRECTIVE) {
+                if (isset($block->name)) {
+                    return $this->testWithWithout($this->compileDirectiveName($block->name), $with, $without);
+                } elseif (isset($block->selectors) && preg_match(',@(\w+),ims', json_encode($block->selectors), $m)) {
+                    return $this->testWithWithout($m[1], $with, $without);
+                } else {
+                    return $this->testWithWithout('???', $with, $without);
+                }
+            }
+        } elseif (isset($block->selectors)) {
+            // a selector starting with number is a keyframe rule
+            if (\count($block->selectors)) {
+                $s = reset($block->selectors);
+
+                while (\is_array($s)) {
+                    $s = reset($s);
+                }
+
+                if (\is_object($s) && $s instanceof Node\Number) {
+                    return $this->testWithWithout('keyframes', $with, $without);
+                }
+            }
+
+            return $this->testWithWithout('rule', $with, $without);
+        }
+
+        return true;
+    }
+
+    /**
+     * Test a single type of block against with/without lists
+     *
+     * @param string $what
+     * @param array  $with
+     * @param array  $without
+     *
+     * @return boolean
+     *   true if the block should be kept, false to reject
+     */
+    protected function testWithWithout($what, $with, $without)
+    {
+        // if without, reject only if in the list (or 'all' is in the list)
+        if (\count($without)) {
+            return (isset($without[$what]) || isset($without['all'])) ? false : true;
+        }
+
+        // otherwise reject all what is not in the with list
+        return (isset($with[$what]) || isset($with['all'])) ? true : false;
+    }
+
+
+    /**
+     * Compile keyframe block
+     *
+     * @param \ScssPhp\ScssPhp\Block $block
+     * @param array                  $selectors
+     */
+    protected function compileKeyframeBlock(Block $block, $selectors)
+    {
+        $env = $this->pushEnv($block);
+
+        $envs = $this->compactEnv($env);
+
+        $this->env = $this->extractEnv(array_filter($envs, function (Environment $e) {
+            return ! isset($e->block->selectors);
+        }));
+
+        $this->scope = $this->makeOutputBlock($block->type, $selectors);
+        $this->scope->depth = 1;
+        $this->scope->parent->children[] = $this->scope;
+
+        $this->compileChildrenNoReturn($block->children, $this->scope);
+
+        $this->scope = $this->scope->parent;
+        $this->env   = $this->extractEnv($envs);
+
+        $this->popEnv();
+    }
+
+    /**
+     * Compile nested properties lines
+     *
+     * @param \ScssPhp\ScssPhp\Block                 $block
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+     */
+    protected function compileNestedPropertiesBlock(Block $block, OutputBlock $out)
+    {
+        $prefix = $this->compileValue($block->prefix) . '-';
+
+        $nested = $this->makeOutputBlock($block->type);
+        $nested->parent = $out;
+
+        if ($block->hasValue) {
+            $nested->depth = $out->depth + 1;
+        }
+
+        $out->children[] = $nested;
+
+        foreach ($block->children as $child) {
+            switch ($child[0]) {
+                case Type::T_ASSIGN:
+                    array_unshift($child[1][2], $prefix);
+                    break;
+
+                case Type::T_NESTED_PROPERTY:
+                    array_unshift($child[1]->prefix[2], $prefix);
+                    break;
+            }
+
+            $this->compileChild($child, $nested);
+        }
+    }
+
+    /**
+     * Compile nested block
+     *
+     * @param \ScssPhp\ScssPhp\Block $block
+     * @param array                  $selectors
+     */
+    protected function compileNestedBlock(Block $block, $selectors)
+    {
+        $this->pushEnv($block);
+
+        $this->scope = $this->makeOutputBlock($block->type, $selectors);
+        $this->scope->parent->children[] = $this->scope;
+
+        // wrap assign children in a block
+        // except for @font-face
+        if ($block->type !== Type::T_DIRECTIVE || $this->compileDirectiveName($block->name) !== 'font-face') {
+            // need wrapping?
+            $needWrapping = false;
+
+            foreach ($block->children as $child) {
+                if ($child[0] === Type::T_ASSIGN) {
+                    $needWrapping = true;
+                    break;
+                }
+            }
+
+            if ($needWrapping) {
+                $wrapped = new Block();
+                $wrapped->sourceName   = $block->sourceName;
+                $wrapped->sourceIndex  = $block->sourceIndex;
+                $wrapped->sourceLine   = $block->sourceLine;
+                $wrapped->sourceColumn = $block->sourceColumn;
+                $wrapped->selectors    = [];
+                $wrapped->comments     = [];
+                $wrapped->parent       = $block;
+                $wrapped->children     = $block->children;
+                $wrapped->selfParent   = $block->selfParent;
+
+                $block->children = [[Type::T_BLOCK, $wrapped]];
+            }
+        }
+
+        $this->compileChildrenNoReturn($block->children, $this->scope);
+
+        $this->scope = $this->scope->parent;
+
+        $this->popEnv();
+    }
+
+    /**
+     * Recursively compiles a block.
+     *
+     * A block is analogous to a CSS block in most cases. A single SCSS document
+     * is encapsulated in a block when parsed, but it does not have parent tags
+     * so all of its children appear on the root level when compiled.
+     *
+     * Blocks are made up of selectors and children.
+     *
+     * The children of a block are just all the blocks that are defined within.
+     *
+     * Compiling the block involves pushing a fresh environment on the stack,
+     * and iterating through the props, compiling each one.
+     *
+     * @see Compiler::compileChild()
+     *
+     * @param \ScssPhp\ScssPhp\Block $block
+     */
+    protected function compileBlock(Block $block)
+    {
+        $env = $this->pushEnv($block);
+        $env->selectors = $this->evalSelectors($block->selectors);
+
+        $out = $this->makeOutputBlock(null);
+
+        if (isset($this->lineNumberStyle) && \count($env->selectors) && \count($block->children)) {
+            $annotation = $this->makeOutputBlock(Type::T_COMMENT);
+            $annotation->depth = 0;
+
+            $file = $this->sourceNames[$block->sourceIndex];
+            $line = $block->sourceLine;
+
+            switch ($this->lineNumberStyle) {
+                case static::LINE_COMMENTS:
+                    $annotation->lines[] = '/* line ' . $line
+                                         . ($file ? ', ' . $file : '')
+                                         . ' */';
+                    break;
+
+                case static::DEBUG_INFO:
+                    $annotation->lines[] = '@media -sass-debug-info{'
+                                         . ($file ? 'filename{font-family:"' . $file . '"}' : '')
+                                         . 'line{font-family:' . $line . '}}';
+                    break;
+            }
+
+            $this->scope->children[] = $annotation;
+        }
+
+        $this->scope->children[] = $out;
+
+        if (\count($block->children)) {
+            $out->selectors = $this->multiplySelectors($env, $block->selfParent);
+
+            // propagate selfParent to the children where they still can be useful
+            $selfParentSelectors = null;
+
+            if (isset($block->selfParent->selectors)) {
+                $selfParentSelectors = $block->selfParent->selectors;
+                $block->selfParent->selectors = $out->selectors;
+            }
+
+            $this->compileChildrenNoReturn($block->children, $out, $block->selfParent);
+
+            // and revert for the following children of the same block
+            if ($selfParentSelectors) {
+                $block->selfParent->selectors = $selfParentSelectors;
+            }
+        }
+
+        $this->popEnv();
+    }
+
+
+    /**
+     * Compile the value of a comment that can have interpolation
+     *
+     * @param array   $value
+     * @param boolean $pushEnv
+     *
+     * @return array|mixed|string
+     */
+    protected function compileCommentValue($value, $pushEnv = false)
+    {
+        $c = $value[1];
+
+        if (isset($value[2])) {
+            if ($pushEnv) {
+                $this->pushEnv();
+            }
+
+            $ignoreCallStackMessage = $this->ignoreCallStackMessage;
+            $this->ignoreCallStackMessage = true;
+
+            try {
+                $c = $this->compileValue($value[2]);
+            } catch (\Exception $e) {
+                // ignore error in comment compilation which are only interpolation
+            }
+
+            $this->ignoreCallStackMessage = $ignoreCallStackMessage;
+
+            if ($pushEnv) {
+                $this->popEnv();
+            }
+        }
+
+        return $c;
+    }
+
+    /**
+     * Compile root level comment
+     *
+     * @param array $block
+     */
+    protected function compileComment($block)
+    {
+        $out = $this->makeOutputBlock(Type::T_COMMENT);
+        $out->lines[] = $this->compileCommentValue($block, true);
+
+        $this->scope->children[] = $out;
+    }
+
+    /**
+     * Evaluate selectors
+     *
+     * @param array $selectors
+     *
+     * @return array
+     */
+    protected function evalSelectors($selectors)
+    {
+        $this->shouldEvaluate = false;
+
+        $selectors = array_map([$this, 'evalSelector'], $selectors);
+
+        // after evaluating interpolates, we might need a second pass
+        if ($this->shouldEvaluate) {
+            $selectors = $this->replaceSelfSelector($selectors, '&');
+            $buffer    = $this->collapseSelectors($selectors);
+            $parser    = $this->parserFactory(__METHOD__);
+
+            if ($parser->parseSelector($buffer, $newSelectors)) {
+                $selectors = array_map([$this, 'evalSelector'], $newSelectors);
+            }
+        }
+
+        return $selectors;
+    }
+
+    /**
+     * Evaluate selector
+     *
+     * @param array $selector
+     *
+     * @return array
+     */
+    protected function evalSelector($selector)
+    {
+        return array_map([$this, 'evalSelectorPart'], $selector);
+    }
+
+    /**
+     * Evaluate selector part; replaces all the interpolates, stripping quotes
+     *
+     * @param array $part
+     *
+     * @return array
+     */
+    protected function evalSelectorPart($part)
+    {
+        foreach ($part as &$p) {
+            if (\is_array($p) && ($p[0] === Type::T_INTERPOLATE || $p[0] === Type::T_STRING)) {
+                $p = $this->compileValue($p);
+
+                // force re-evaluation
+                if (strpos($p, '&') !== false || strpos($p, ',') !== false) {
+                    $this->shouldEvaluate = true;
+                }
+            } elseif (
+                \is_string($p) && \strlen($p) >= 2 &&
+                ($first = $p[0]) && ($first === '"' || $first === "'") &&
+                substr($p, -1) === $first
+            ) {
+                $p = substr($p, 1, -1);
+            }
+        }
+
+        return $this->flattenSelectorSingle($part);
+    }
+
+    /**
+     * Collapse selectors
+     *
+     * @param array   $selectors
+     * @param boolean $selectorFormat
+     *   if false return a collapsed string
+     *   if true return an array description of a structured selector
+     *
+     * @return string
+     */
+    protected function collapseSelectors($selectors, $selectorFormat = false)
+    {
+        $parts = [];
+
+        foreach ($selectors as $selector) {
+            $output = [];
+            $glueNext = false;
+
+            foreach ($selector as $node) {
+                $compound = '';
+
+                array_walk_recursive(
+                    $node,
+                    function ($value, $key) use (&$compound) {
+                        $compound .= $value;
+                    }
+                );
+
+                if ($selectorFormat && $this->isImmediateRelationshipCombinator($compound)) {
+                    if (\count($output)) {
+                        $output[\count($output) - 1] .= ' ' . $compound;
+                    } else {
+                        $output[] = $compound;
+                    }
+
+                    $glueNext = true;
+                } elseif ($glueNext) {
+                    $output[\count($output) - 1] .= ' ' . $compound;
+                    $glueNext = false;
+                } else {
+                    $output[] = $compound;
+                }
+            }
+
+            if ($selectorFormat) {
+                foreach ($output as &$o) {
+                    $o = [Type::T_STRING, '', [$o]];
+                }
+
+                $output = [Type::T_LIST, ' ', $output];
+            } else {
+                $output = implode(' ', $output);
+            }
+
+            $parts[] = $output;
+        }
+
+        if ($selectorFormat) {
+            $parts = [Type::T_LIST, ',', $parts];
+        } else {
+            $parts = implode(', ', $parts);
+        }
+
+        return $parts;
+    }
+
+    /**
+     * Parse down the selector and revert [self] to "&" before a reparsing
+     *
+     * @param array $selectors
+     *
+     * @return array
+     */
+    protected function replaceSelfSelector($selectors, $replace = null)
+    {
+        foreach ($selectors as &$part) {
+            if (\is_array($part)) {
+                if ($part === [Type::T_SELF]) {
+                    if (\is_null($replace)) {
+                        $replace = $this->reduce([Type::T_SELF]);
+                        $replace = $this->compileValue($replace);
+                    }
+                    $part = $replace;
+                } else {
+                    $part = $this->replaceSelfSelector($part, $replace);
+                }
+            }
+        }
+
+        return $selectors;
+    }
+
+    /**
+     * Flatten selector single; joins together .classes and #ids
+     *
+     * @param array $single
+     *
+     * @return array
+     */
+    protected function flattenSelectorSingle($single)
+    {
+        $joined = [];
+
+        foreach ($single as $part) {
+            if (
+                empty($joined) ||
+                ! \is_string($part) ||
+                preg_match('/[\[.:#%]/', $part)
+            ) {
+                $joined[] = $part;
+                continue;
+            }
+
+            if (\is_array(end($joined))) {
+                $joined[] = $part;
+            } else {
+                $joined[\count($joined) - 1] .= $part;
+            }
+        }
+
+        return $joined;
+    }
+
+    /**
+     * Compile selector to string; self(&) should have been replaced by now
+     *
+     * @param string|array $selector
+     *
+     * @return string
+     */
+    protected function compileSelector($selector)
+    {
+        if (! \is_array($selector)) {
+            return $selector; // media and the like
+        }
+
+        return implode(
+            ' ',
+            array_map(
+                [$this, 'compileSelectorPart'],
+                $selector
+            )
+        );
+    }
+
+    /**
+     * Compile selector part
+     *
+     * @param array $piece
+     *
+     * @return string
+     */
+    protected function compileSelectorPart($piece)
+    {
+        foreach ($piece as &$p) {
+            if (! \is_array($p)) {
+                continue;
+            }
+
+            switch ($p[0]) {
+                case Type::T_SELF:
+                    $p = '&';
+                    break;
+
+                default:
+                    $p = $this->compileValue($p);
+                    break;
+            }
+        }
+
+        return implode($piece);
+    }
+
+    /**
+     * Has selector placeholder?
+     *
+     * @param array $selector
+     *
+     * @return boolean
+     */
+    protected function hasSelectorPlaceholder($selector)
+    {
+        if (! \is_array($selector)) {
+            return false;
+        }
+
+        foreach ($selector as $parts) {
+            foreach ($parts as $part) {
+                if (\strlen($part) && '%' === $part[0]) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    protected function pushCallStack($name = '')
+    {
+        $this->callStack[] = [
+          'n' => $name,
+          Parser::SOURCE_INDEX => $this->sourceIndex,
+          Parser::SOURCE_LINE => $this->sourceLine,
+          Parser::SOURCE_COLUMN => $this->sourceColumn
+        ];
+
+        // infinite calling loop
+        if (\count($this->callStack) > 25000) {
+            // not displayed but you can var_dump it to deep debug
+            $msg = $this->callStackMessage(true, 100);
+            $msg = 'Infinite calling loop';
+
+            throw $this->error($msg);
+        }
+    }
+
+    protected function popCallStack()
+    {
+        array_pop($this->callStack);
+    }
+
+    /**
+     * Compile children and return result
+     *
+     * @param array                                  $stms
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+     * @param string                                 $traceName
+     *
+     * @return array|null
+     */
+    protected function compileChildren($stms, OutputBlock $out, $traceName = '')
+    {
+        $this->pushCallStack($traceName);
+
+        foreach ($stms as $stm) {
+            $ret = $this->compileChild($stm, $out);
+
+            if (isset($ret)) {
+                $this->popCallStack();
+
+                return $ret;
+            }
+        }
+
+        $this->popCallStack();
+
+        return null;
+    }
+
+    /**
+     * Compile children and throw exception if unexpected @return
+     *
+     * @param array                                  $stms
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+     * @param \ScssPhp\ScssPhp\Block                 $selfParent
+     * @param string                                 $traceName
+     *
+     * @throws \Exception
+     */
+    protected function compileChildrenNoReturn($stms, OutputBlock $out, $selfParent = null, $traceName = '')
+    {
+        $this->pushCallStack($traceName);
+
+        foreach ($stms as $stm) {
+            if ($selfParent && isset($stm[1]) && \is_object($stm[1]) && $stm[1] instanceof Block) {
+                $stm[1]->selfParent = $selfParent;
+                $ret = $this->compileChild($stm, $out);
+                $stm[1]->selfParent = null;
+            } elseif ($selfParent && \in_array($stm[0], [TYPE::T_INCLUDE, TYPE::T_EXTEND])) {
+                $stm['selfParent'] = $selfParent;
+                $ret = $this->compileChild($stm, $out);
+                unset($stm['selfParent']);
+            } else {
+                $ret = $this->compileChild($stm, $out);
+            }
+
+            if (isset($ret)) {
+                throw $this->error('@return may only be used within a function');
+            }
+        }
+
+        $this->popCallStack();
+    }
+
+
+    /**
+     * evaluate media query : compile internal value keeping the structure inchanged
+     *
+     * @param array $queryList
+     *
+     * @return array
+     */
+    protected function evaluateMediaQuery($queryList)
+    {
+        static $parser = null;
+
+        $outQueryList = [];
+
+        foreach ($queryList as $kql => $query) {
+            $shouldReparse = false;
+
+            foreach ($query as $kq => $q) {
+                for ($i = 1; $i < \count($q); $i++) {
+                    $value = $this->compileValue($q[$i]);
+
+                    // the parser had no mean to know if media type or expression if it was an interpolation
+                    // so you need to reparse if the T_MEDIA_TYPE looks like anything else a media type
+                    if (
+                        $q[0] == Type::T_MEDIA_TYPE &&
+                        (strpos($value, '(') !== false ||
+                        strpos($value, ')') !== false ||
+                        strpos($value, ':') !== false ||
+                        strpos($value, ',') !== false)
+                    ) {
+                        $shouldReparse = true;
+                    }
+
+                    $queryList[$kql][$kq][$i] = [Type::T_KEYWORD, $value];
+                }
+            }
+
+            if ($shouldReparse) {
+                if (\is_null($parser)) {
+                    $parser = $this->parserFactory(__METHOD__);
+                }
+
+                $queryString = $this->compileMediaQuery([$queryList[$kql]]);
+                $queryString = reset($queryString);
+
+                if (strpos($queryString, '@media ') === 0) {
+                    $queryString = substr($queryString, 7);
+                    $queries = [];
+
+                    if ($parser->parseMediaQueryList($queryString, $queries)) {
+                        $queries = $this->evaluateMediaQuery($queries[2]);
+
+                        while (\count($queries)) {
+                            $outQueryList[] = array_shift($queries);
+                        }
+
+                        continue;
+                    }
+                }
+            }
+
+            $outQueryList[] = $queryList[$kql];
+        }
+
+        return $outQueryList;
+    }
+
+    /**
+     * Compile media query
+     *
+     * @param array $queryList
+     *
+     * @return array
+     */
+    protected function compileMediaQuery($queryList)
+    {
+        $start   = '@media ';
+        $default = trim($start);
+        $out     = [];
+        $current = '';
+
+        foreach ($queryList as $query) {
+            $type = null;
+            $parts = [];
+
+            $mediaTypeOnly = true;
+
+            foreach ($query as $q) {
+                if ($q[0] !== Type::T_MEDIA_TYPE) {
+                    $mediaTypeOnly = false;
+                    break;
+                }
+            }
+
+            foreach ($query as $q) {
+                switch ($q[0]) {
+                    case Type::T_MEDIA_TYPE:
+                        $newType = array_map([$this, 'compileValue'], \array_slice($q, 1));
+
+                        // combining not and anything else than media type is too risky and should be avoided
+                        if (! $mediaTypeOnly) {
+                            if (\in_array(Type::T_NOT, $newType) || ($type && \in_array(Type::T_NOT, $type) )) {
+                                if ($type) {
+                                    array_unshift($parts, implode(' ', array_filter($type)));
+                                }
+
+                                if (! empty($parts)) {
+                                    if (\strlen($current)) {
+                                        $current .= $this->formatter->tagSeparator;
+                                    }
+
+                                    $current .= implode(' and ', $parts);
+                                }
+
+                                if ($current) {
+                                    $out[] = $start . $current;
+                                }
+
+                                $current = '';
+                                $type    = null;
+                                $parts   = [];
+                            }
+                        }
+
+                        if ($newType === ['all'] && $default) {
+                            $default = $start . 'all';
+                        }
+
+                        // all can be safely ignored and mixed with whatever else
+                        if ($newType !== ['all']) {
+                            if ($type) {
+                                $type = $this->mergeMediaTypes($type, $newType);
+
+                                if (empty($type)) {
+                                    // merge failed : ignore this query that is not valid, skip to the next one
+                                    $parts = [];
+                                    $default = ''; // if everything fail, no @media at all
+                                    continue 3;
+                                }
+                            } else {
+                                $type = $newType;
+                            }
+                        }
+                        break;
+
+                    case Type::T_MEDIA_EXPRESSION:
+                        if (isset($q[2])) {
+                            $parts[] = '('
+                                . $this->compileValue($q[1])
+                                . $this->formatter->assignSeparator
+                                . $this->compileValue($q[2])
+                                . ')';
+                        } else {
+                            $parts[] = '('
+                                . $this->compileValue($q[1])
+                                . ')';
+                        }
+                        break;
+
+                    case Type::T_MEDIA_VALUE:
+                        $parts[] = $this->compileValue($q[1]);
+                        break;
+                }
+            }
+
+            if ($type) {
+                array_unshift($parts, implode(' ', array_filter($type)));
+            }
+
+            if (! empty($parts)) {
+                if (\strlen($current)) {
+                    $current .= $this->formatter->tagSeparator;
+                }
+
+                $current .= implode(' and ', $parts);
+            }
+        }
+
+        if ($current) {
+            $out[] = $start . $current;
+        }
+
+        // no @media type except all, and no conflict?
+        if (! $out && $default) {
+            $out[] = $default;
+        }
+
+        return $out;
+    }
+
+    /**
+     * Merge direct relationships between selectors
+     *
+     * @param array $selectors1
+     * @param array $selectors2
+     *
+     * @return array
+     */
+    protected function mergeDirectRelationships($selectors1, $selectors2)
+    {
+        if (empty($selectors1) || empty($selectors2)) {
+            return array_merge($selectors1, $selectors2);
+        }
+
+        $part1 = end($selectors1);
+        $part2 = end($selectors2);
+
+        if (! $this->isImmediateRelationshipCombinator($part1[0]) && $part1 !== $part2) {
+            return array_merge($selectors1, $selectors2);
+        }
+
+        $merged = [];
+
+        do {
+            $part1 = array_pop($selectors1);
+            $part2 = array_pop($selectors2);
+
+            if (! $this->isImmediateRelationshipCombinator($part1[0]) && $part1 !== $part2) {
+                if ($this->isImmediateRelationshipCombinator(reset($merged)[0])) {
+                    array_unshift($merged, [$part1[0] . $part2[0]]);
+                    $merged = array_merge($selectors1, $selectors2, $merged);
+                } else {
+                    $merged = array_merge($selectors1, [$part1], $selectors2, [$part2], $merged);
+                }
+
+                break;
+            }
+
+            array_unshift($merged, $part1);
+        } while (! empty($selectors1) && ! empty($selectors2));
+
+        return $merged;
+    }
+
+    /**
+     * Merge media types
+     *
+     * @param array $type1
+     * @param array $type2
+     *
+     * @return array|null
+     */
+    protected function mergeMediaTypes($type1, $type2)
+    {
+        if (empty($type1)) {
+            return $type2;
+        }
+
+        if (empty($type2)) {
+            return $type1;
+        }
+
+        if (\count($type1) > 1) {
+            $m1 = strtolower($type1[0]);
+            $t1 = strtolower($type1[1]);
+        } else {
+            $m1 = '';
+            $t1 = strtolower($type1[0]);
+        }
+
+        if (\count($type2) > 1) {
+            $m2 = strtolower($type2[0]);
+            $t2 = strtolower($type2[1]);
+        } else {
+            $m2 = '';
+            $t2 = strtolower($type2[0]);
+        }
+
+        if (($m1 === Type::T_NOT) ^ ($m2 === Type::T_NOT)) {
+            if ($t1 === $t2) {
+                return null;
+            }
+
+            return [
+                $m1 === Type::T_NOT ? $m2 : $m1,
+                $m1 === Type::T_NOT ? $t2 : $t1,
+            ];
+        }
+
+        if ($m1 === Type::T_NOT && $m2 === Type::T_NOT) {
+            // CSS has no way of representing "neither screen nor print"
+            if ($t1 !== $t2) {
+                return null;
+            }
+
+            return [Type::T_NOT, $t1];
+        }
+
+        if ($t1 !== $t2) {
+            return null;
+        }
+
+        // t1 == t2, neither m1 nor m2 are "not"
+        return [empty($m1) ? $m2 : $m1, $t1];
+    }
+
+    /**
+     * Compile import; returns true if the value was something that could be imported
+     *
+     * @param array                                  $rawPath
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+     * @param boolean                                $once
+     *
+     * @return boolean
+     */
+    protected function compileImport($rawPath, OutputBlock $out, $once = false)
+    {
+        if ($rawPath[0] === Type::T_STRING) {
+            $path = $this->compileStringContent($rawPath);
+
+            if (strpos($path, 'url(') !== 0 && $path = $this->findImport($path)) {
+                if (! $once || ! \in_array($path, $this->importedFiles)) {
+                    $this->importFile($path, $out);
+                    $this->importedFiles[] = $path;
+                }
+
+                return true;
+            }
+
+            $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out);
+
+            return false;
+        }
+
+        if ($rawPath[0] === Type::T_LIST) {
+            // handle a list of strings
+            if (\count($rawPath[2]) === 0) {
+                return false;
+            }
+
+            foreach ($rawPath[2] as $path) {
+                if ($path[0] !== Type::T_STRING) {
+                    $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out);
+
+                    return false;
+                }
+            }
+
+            foreach ($rawPath[2] as $path) {
+                $this->compileImport($path, $out, $once);
+            }
+
+            return true;
+        }
+
+        $this->appendRootDirective('@import ' . $this->compileImportPath($rawPath) . ';', $out);
+
+        return false;
+    }
+
+    /**
+     * @param $rawPath
+     * @return string
+     * @throws CompilerException
+     */
+    protected function compileImportPath($rawPath)
+    {
+        $path = $this->compileValue($rawPath);
+
+        // case url() without quotes : supress \r \n remaining in the path
+        // if this is a real string there can not be CR or LF char
+        if (strpos($path, 'url(') === 0) {
+            $path = str_replace(array("\r", "\n"), array('', ' '), $path);
+        } else {
+            // if this is a file name in a string, spaces shoudl be escaped
+            $path = $this->reduce($rawPath);
+            $path = $this->escapeImportPathString($path);
+            $path = $this->compileValue($path);
+        }
+
+        return $path;
+    }
+
+    /**
+     * @param array $path
+     * @return array
+     * @throws CompilerException
+     */
+    protected function escapeImportPathString($path)
+    {
+        switch ($path[0]) {
+            case Type::T_LIST:
+                foreach ($path[2] as $k => $v) {
+                    $path[2][$k] = $this->escapeImportPathString($v);
+                }
+                break;
+            case Type::T_STRING:
+                if ($path[1]) {
+                    $path = $this->compileValue($path);
+                    $path = str_replace(' ', '\\ ', $path);
+                    $path = [Type::T_KEYWORD, $path];
+                }
+                break;
+        }
+
+        return $path;
+    }
+
+    /**
+     * Append a root directive like @import or @charset as near as the possible from the source code
+     * (keeping before comments, @import and @charset coming before in the source code)
+     *
+     * @param string                                        $line
+     * @param @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+     * @param array                                         $allowed
+     */
+    protected function appendRootDirective($line, $out, $allowed = [Type::T_COMMENT])
+    {
+        $root = $out;
+
+        while ($root->parent) {
+            $root = $root->parent;
+        }
+
+        $i = 0;
+
+        while ($i < \count($root->children)) {
+            if (! isset($root->children[$i]->type) || ! \in_array($root->children[$i]->type, $allowed)) {
+                break;
+            }
+
+            $i++;
+        }
+
+        // remove incompatible children from the bottom of the list
+        $saveChildren = [];
+
+        while ($i < \count($root->children)) {
+            $saveChildren[] = array_pop($root->children);
+        }
+
+        // insert the directive as a comment
+        $child = $this->makeOutputBlock(Type::T_COMMENT);
+        $child->lines[]      = $line;
+        $child->sourceName   = $this->sourceNames[$this->sourceIndex];
+        $child->sourceLine   = $this->sourceLine;
+        $child->sourceColumn = $this->sourceColumn;
+
+        $root->children[] = $child;
+
+        // repush children
+        while (\count($saveChildren)) {
+            $root->children[] = array_pop($saveChildren);
+        }
+    }
+
+    /**
+     * Append lines to the current output block:
+     * directly to the block or through a child if necessary
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+     * @param string                                 $type
+     * @param string|mixed                           $line
+     */
+    protected function appendOutputLine(OutputBlock $out, $type, $line)
+    {
+        $outWrite = &$out;
+
+        // check if it's a flat output or not
+        if (\count($out->children)) {
+            $lastChild = &$out->children[\count($out->children) - 1];
+
+            if (
+                $lastChild->depth === $out->depth &&
+                \is_null($lastChild->selectors) &&
+                ! \count($lastChild->children)
+            ) {
+                $outWrite = $lastChild;
+            } else {
+                $nextLines = $this->makeOutputBlock($type);
+                $nextLines->parent = $out;
+                $nextLines->depth  = $out->depth;
+
+                $out->children[] = $nextLines;
+                $outWrite = &$nextLines;
+            }
+        }
+
+        $outWrite->lines[] = $line;
+    }
+
+    /**
+     * Compile child; returns a value to halt execution
+     *
+     * @param array                                  $child
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+     *
+     * @return array
+     */
+    protected function compileChild($child, OutputBlock $out)
+    {
+        if (isset($child[Parser::SOURCE_LINE])) {
+            $this->sourceIndex  = isset($child[Parser::SOURCE_INDEX]) ? $child[Parser::SOURCE_INDEX] : null;
+            $this->sourceLine   = isset($child[Parser::SOURCE_LINE]) ? $child[Parser::SOURCE_LINE] : -1;
+            $this->sourceColumn = isset($child[Parser::SOURCE_COLUMN]) ? $child[Parser::SOURCE_COLUMN] : -1;
+        } elseif (\is_array($child) && isset($child[1]->sourceLine)) {
+            $this->sourceIndex  = $child[1]->sourceIndex;
+            $this->sourceLine   = $child[1]->sourceLine;
+            $this->sourceColumn = $child[1]->sourceColumn;
+        } elseif (! empty($out->sourceLine) && ! empty($out->sourceName)) {
+            $this->sourceLine   = $out->sourceLine;
+            $this->sourceIndex  = array_search($out->sourceName, $this->sourceNames);
+            $this->sourceColumn = $out->sourceColumn;
+
+            if ($this->sourceIndex === false) {
+                $this->sourceIndex = null;
+            }
+        }
+
+        switch ($child[0]) {
+            case Type::T_SCSSPHP_IMPORT_ONCE:
+                $rawPath = $this->reduce($child[1]);
+
+                $this->compileImport($rawPath, $out, true);
+                break;
+
+            case Type::T_IMPORT:
+                $rawPath = $this->reduce($child[1]);
+
+                $this->compileImport($rawPath, $out);
+                break;
+
+            case Type::T_DIRECTIVE:
+                $this->compileDirective($child[1], $out);
+                break;
+
+            case Type::T_AT_ROOT:
+                $this->compileAtRoot($child[1]);
+                break;
+
+            case Type::T_MEDIA:
+                $this->compileMedia($child[1]);
+                break;
+
+            case Type::T_BLOCK:
+                $this->compileBlock($child[1]);
+                break;
+
+            case Type::T_CHARSET:
+                if (! $this->charsetSeen) {
+                    $this->charsetSeen = true;
+                    $this->appendRootDirective('@charset ' . $this->compileValue($child[1]) . ';', $out);
+                }
+                break;
+
+            case Type::T_CUSTOM_PROPERTY:
+                list(, $name, $value) = $child;
+                $compiledName = $this->compileValue($name);
+
+                // if the value reduces to null from something else then
+                // the property should be discarded
+                if ($value[0] !== Type::T_NULL) {
+                    $value = $this->reduce($value);
+
+                    if ($value[0] === Type::T_NULL || $value === static::$nullString) {
+                        break;
+                    }
+                }
+
+                $compiledValue = $this->compileValue($value);
+
+                $line = $this->formatter->customProperty(
+                    $compiledName,
+                    $compiledValue
+                );
+
+                $this->appendOutputLine($out, Type::T_ASSIGN, $line);
+                break;
+
+            case Type::T_ASSIGN:
+                list(, $name, $value) = $child;
+
+                if ($name[0] === Type::T_VARIABLE) {
+                    $flags     = isset($child[3]) ? $child[3] : [];
+                    $isDefault = \in_array('!default', $flags);
+                    $isGlobal  = \in_array('!global', $flags);
+
+                    if ($isGlobal) {
+                        $this->set($name[1], $this->reduce($value), false, $this->rootEnv, $value);
+                        break;
+                    }
+
+                    $shouldSet = $isDefault &&
+                        (\is_null($result = $this->get($name[1], false)) ||
+                        $result === static::$null);
+
+                    if (! $isDefault || $shouldSet) {
+                        $this->set($name[1], $this->reduce($value), true, null, $value);
+                    }
+                    break;
+                }
+
+                $compiledName = $this->compileValue($name);
+
+                // handle shorthand syntaxes : size / line-height...
+                if (\in_array($compiledName, ['font', 'grid-row', 'grid-column', 'border-radius'])) {
+                    if ($value[0] === Type::T_VARIABLE) {
+                        // if the font value comes from variable, the content is already reduced
+                        // (i.e., formulas were already calculated), so we need the original unreduced value
+                        $value = $this->get($value[1], true, null, true);
+                    }
+
+                    $shorthandValue=&$value;
+
+                    $shorthandDividerNeedsUnit = false;
+                    $maxListElements           = null;
+                    $maxShorthandDividers      = 1;
+
+                    switch ($compiledName) {
+                        case 'border-radius':
+                            $maxListElements = 4;
+                            $shorthandDividerNeedsUnit = true;
+                            break;
+                    }
+
+                    if ($compiledName === 'font' && $value[0] === Type::T_LIST && $value[1] === ',') {
+                        // this is the case if more than one font is given: example: "font: 400 1em/1.3 arial,helvetica"
+                        // we need to handle the first list element
+                        $shorthandValue=&$value[2][0];
+                    }
+
+                    if ($shorthandValue[0] === Type::T_EXPRESSION && $shorthandValue[1] === '/') {
+                        $revert = true;
+
+                        if ($shorthandDividerNeedsUnit) {
+                            $divider = $shorthandValue[3];
+
+                            if (\is_array($divider)) {
+                                $divider = $this->reduce($divider, true);
+                            }
+
+                            if (\intval($divider->dimension) && ! \count($divider->units)) {
+                                $revert = false;
+                            }
+                        }
+
+                        if ($revert) {
+                            $shorthandValue = $this->expToString($shorthandValue);
+                        }
+                    } elseif ($shorthandValue[0] === Type::T_LIST) {
+                        foreach ($shorthandValue[2] as &$item) {
+                            if ($item[0] === Type::T_EXPRESSION && $item[1] === '/') {
+                                if ($maxShorthandDividers > 0) {
+                                    $revert = true;
+
+                                    // if the list of values is too long, this has to be a shorthand,
+                                    // otherwise it could be a real division
+                                    if (\is_null($maxListElements) || \count($shorthandValue[2]) <= $maxListElements) {
+                                        if ($shorthandDividerNeedsUnit) {
+                                            $divider = $item[3];
+
+                                            if (\is_array($divider)) {
+                                                $divider = $this->reduce($divider, true);
+                                            }
+
+                                            if (\intval($divider->dimension) && ! \count($divider->units)) {
+                                                $revert = false;
+                                            }
+                                        }
+                                    }
+
+                                    if ($revert) {
+                                        $item = $this->expToString($item);
+                                        $maxShorthandDividers--;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                // if the value reduces to null from something else then
+                // the property should be discarded
+                if ($value[0] !== Type::T_NULL) {
+                    $value = $this->reduce($value);
+
+                    if ($value[0] === Type::T_NULL || $value === static::$nullString) {
+                        break;
+                    }
+                }
+
+                $compiledValue = $this->compileValue($value);
+
+                // ignore empty value
+                if (\strlen($compiledValue)) {
+                    $line = $this->formatter->property(
+                        $compiledName,
+                        $compiledValue
+                    );
+                    $this->appendOutputLine($out, Type::T_ASSIGN, $line);
+                }
+                break;
+
+            case Type::T_COMMENT:
+                if ($out->type === Type::T_ROOT) {
+                    $this->compileComment($child);
+                    break;
+                }
+
+                $line = $this->compileCommentValue($child, true);
+                $this->appendOutputLine($out, Type::T_COMMENT, $line);
+                break;
+
+            case Type::T_MIXIN:
+            case Type::T_FUNCTION:
+                list(, $block) = $child;
+                // the block need to be able to go up to it's parent env to resolve vars
+                $block->parentEnv = $this->getStoreEnv();
+                $this->set(static::$namespaces[$block->type] . $block->name, $block, true);
+                break;
+
+            case Type::T_EXTEND:
+                foreach ($child[1] as $sel) {
+                    $sel = $this->replaceSelfSelector($sel);
+                    $results = $this->evalSelectors([$sel]);
+
+                    foreach ($results as $result) {
+                        // only use the first one
+                        $result = current($result);
+                        $selectors = $out->selectors;
+
+                        if (! $selectors && isset($child['selfParent'])) {
+                            $selectors = $this->multiplySelectors($this->env, $child['selfParent']);
+                        }
+
+                        $this->pushExtends($result, $selectors, $child);
+                    }
+                }
+                break;
+
+            case Type::T_IF:
+                list(, $if) = $child;
+
+                if ($this->isTruthy($this->reduce($if->cond, true))) {
+                    return $this->compileChildren($if->children, $out);
+                }
+
+                foreach ($if->cases as $case) {
+                    if (
+                        $case->type === Type::T_ELSE ||
+                        $case->type === Type::T_ELSEIF && $this->isTruthy($this->reduce($case->cond))
+                    ) {
+                        return $this->compileChildren($case->children, $out);
+                    }
+                }
+                break;
+
+            case Type::T_EACH:
+                list(, $each) = $child;
+
+                $list = $this->coerceList($this->reduce($each->list), ',', true);
+
+                $this->pushEnv();
+
+                foreach ($list[2] as $item) {
+                    if (\count($each->vars) === 1) {
+                        $this->set($each->vars[0], $item, true);
+                    } else {
+                        list(,, $values) = $this->coerceList($item);
+
+                        foreach ($each->vars as $i => $var) {
+                            $this->set($var, isset($values[$i]) ? $values[$i] : static::$null, true);
+                        }
+                    }
+
+                    $ret = $this->compileChildren($each->children, $out);
+
+                    if ($ret) {
+                        if ($ret[0] !== Type::T_CONTROL) {
+                            $store = $this->env->store;
+                            $this->popEnv();
+                            $this->backPropagateEnv($store, $each->vars);
+
+                            return $ret;
+                        }
+
+                        if ($ret[1]) {
+                            break;
+                        }
+                    }
+                }
+                $store = $this->env->store;
+                $this->popEnv();
+                $this->backPropagateEnv($store, $each->vars);
+
+                break;
+
+            case Type::T_WHILE:
+                list(, $while) = $child;
+
+                while ($this->isTruthy($this->reduce($while->cond, true))) {
+                    $ret = $this->compileChildren($while->children, $out);
+
+                    if ($ret) {
+                        if ($ret[0] !== Type::T_CONTROL) {
+                            return $ret;
+                        }
+
+                        if ($ret[1]) {
+                            break;
+                        }
+                    }
+                }
+                break;
+
+            case Type::T_FOR:
+                list(, $for) = $child;
+
+                $start = $this->reduce($for->start, true);
+                $end   = $this->reduce($for->end, true);
+
+                if (! $start instanceof Node\Number) {
+                    throw $this->error('%s is not a number', $start[0]);
+                }
+
+                if (! $end instanceof Node\Number) {
+                    throw $this->error('%s is not a number', $end[0]);
+                }
+
+                if (! ($start[2] == $end[2] || $end->unitless())) {
+                    throw $this->error('Incompatible units: "%s" && "%s".', $start->unitStr(), $end->unitStr());
+                }
+
+                $unit  = $start[2];
+                $start = $start[1];
+                $end   = $end[1];
+
+                $d = $start < $end ? 1 : -1;
+
+                $this->pushEnv();
+
+                for (;;) {
+                    if (
+                        (! $for->until && $start - $d == $end) ||
+                        ($for->until && $start == $end)
+                    ) {
+                        break;
+                    }
+
+                    $this->set($for->var, new Node\Number($start, $unit));
+                    $start += $d;
+
+                    $ret = $this->compileChildren($for->children, $out);
+
+                    if ($ret) {
+                        if ($ret[0] !== Type::T_CONTROL) {
+                            $store = $this->env->store;
+                            $this->popEnv();
+                            $this->backPropagateEnv($store, [$for->var]);
+
+                            return $ret;
+                        }
+
+                        if ($ret[1]) {
+                            break;
+                        }
+                    }
+                }
+
+                $store = $this->env->store;
+                $this->popEnv();
+                $this->backPropagateEnv($store, [$for->var]);
+
+                break;
+
+            case Type::T_BREAK:
+                return [Type::T_CONTROL, true];
+
+            case Type::T_CONTINUE:
+                return [Type::T_CONTROL, false];
+
+            case Type::T_RETURN:
+                return $this->reduce($child[1], true);
+
+            case Type::T_NESTED_PROPERTY:
+                $this->compileNestedPropertiesBlock($child[1], $out);
+                break;
+
+            case Type::T_INCLUDE:
+                // including a mixin
+                list(, $name, $argValues, $content, $argUsing) = $child;
+
+                $mixin = $this->get(static::$namespaces['mixin'] . $name, false);
+
+                if (! $mixin) {
+                    throw $this->error("Undefined mixin $name");
+                }
+
+                $callingScope = $this->getStoreEnv();
+
+                // push scope, apply args
+                $this->pushEnv();
+                $this->env->depth--;
+
+                // Find the parent selectors in the env to be able to know what '&' refers to in the mixin
+                // and assign this fake parent to childs
+                $selfParent = null;
+
+                if (isset($child['selfParent']) && isset($child['selfParent']->selectors)) {
+                    $selfParent = $child['selfParent'];
+                } else {
+                    $parentSelectors = $this->multiplySelectors($this->env);
+
+                    if ($parentSelectors) {
+                        $parent = new Block();
+                        $parent->selectors = $parentSelectors;
+
+                        foreach ($mixin->children as $k => $child) {
+                            if (isset($child[1]) && \is_object($child[1]) && $child[1] instanceof Block) {
+                                $mixin->children[$k][1]->parent = $parent;
+                            }
+                        }
+                    }
+                }
+
+                // clone the stored content to not have its scope spoiled by a further call to the same mixin
+                // i.e., recursive @include of the same mixin
+                if (isset($content)) {
+                    $copyContent = clone $content;
+                    $copyContent->scope = clone $callingScope;
+
+                    $this->setRaw(static::$namespaces['special'] . 'content', $copyContent, $this->env);
+                } else {
+                    $this->setRaw(static::$namespaces['special'] . 'content', null, $this->env);
+                }
+
+                // save the "using" argument list for applying it to when "@content" is invoked
+                if (isset($argUsing)) {
+                    $this->setRaw(static::$namespaces['special'] . 'using', $argUsing, $this->env);
+                } else {
+                    $this->setRaw(static::$namespaces['special'] . 'using', null, $this->env);
+                }
+
+                if (isset($mixin->args)) {
+                    $this->applyArguments($mixin->args, $argValues);
+                }
+
+                $this->env->marker = 'mixin';
+
+                if (! empty($mixin->parentEnv)) {
+                    $this->env->declarationScopeParent = $mixin->parentEnv;
+                } else {
+                    throw $this->error("@mixin $name() without parentEnv");
+                }
+
+                $this->compileChildrenNoReturn($mixin->children, $out, $selfParent, $this->env->marker . ' ' . $name);
+
+                $this->popEnv();
+                break;
+
+            case Type::T_MIXIN_CONTENT:
+                $env        = isset($this->storeEnv) ? $this->storeEnv : $this->env;
+                $content    = $this->get(static::$namespaces['special'] . 'content', false, $env);
+                $argUsing   = $this->get(static::$namespaces['special'] . 'using', false, $env);
+                $argContent = $child[1];
+
+                if (! $content) {
+                    break;
+                }
+
+                $storeEnv = $this->storeEnv;
+                $varsUsing = [];
+
+                if (isset($argUsing) && isset($argContent)) {
+                    // Get the arguments provided for the content with the names provided in the "using" argument list
+                    $this->storeEnv = null;
+                    $varsUsing = $this->applyArguments($argUsing, $argContent, false);
+                }
+
+                // restore the scope from the @content
+                $this->storeEnv = $content->scope;
+
+                // append the vars from using if any
+                foreach ($varsUsing as $name => $val) {
+                    $this->set($name, $val, true, $this->storeEnv);
+                }
+
+                $this->compileChildrenNoReturn($content->children, $out);
+
+                $this->storeEnv = $storeEnv;
+                break;
+
+            case Type::T_DEBUG:
+                list(, $value) = $child;
+
+                $fname = $this->sourceNames[$this->sourceIndex];
+                $line  = $this->sourceLine;
+                $value = $this->compileDebugValue($value);
+
+                fwrite($this->stderr, "$fname:$line DEBUG: $value\n");
+                break;
+
+            case Type::T_WARN:
+                list(, $value) = $child;
+
+                $fname = $this->sourceNames[$this->sourceIndex];
+                $line  = $this->sourceLine;
+                $value = $this->compileDebugValue($value);
+
+                fwrite($this->stderr, "WARNING: $value\n         on line $line of $fname\n\n");
+                break;
+
+            case Type::T_ERROR:
+                list(, $value) = $child;
+
+                $fname = $this->sourceNames[$this->sourceIndex];
+                $line  = $this->sourceLine;
+                $value = $this->compileValue($this->reduce($value, true));
+
+                throw $this->error("File $fname on line $line ERROR: $value\n");
+
+            case Type::T_CONTROL:
+                throw $this->error('@break/@continue not permitted in this scope');
+
+            default:
+                throw $this->error("unknown child type: $child[0]");
+        }
+    }
+
+    /**
+     * Reduce expression to string
+     *
+     * @param array $exp
+     * @param true $keepParens
+     *
+     * @return array
+     */
+    protected function expToString($exp, $keepParens = false)
+    {
+        list(, $op, $left, $right, $inParens, $whiteLeft, $whiteRight) = $exp;
+
+        $content = [];
+
+        if ($keepParens && $inParens) {
+            $content[] = '(';
+        }
+
+        $content[] = $this->reduce($left);
+
+        if ($whiteLeft) {
+            $content[] = ' ';
+        }
+
+        $content[] = $op;
+
+        if ($whiteRight) {
+            $content[] = ' ';
+        }
+
+        $content[] = $this->reduce($right);
+
+        if ($keepParens && $inParens) {
+            $content[] = ')';
+        }
+
+        return [Type::T_STRING, '', $content];
+    }
+
+    /**
+     * Is truthy?
+     *
+     * @param array $value
+     *
+     * @return boolean
+     */
+    protected function isTruthy($value)
+    {
+        return $value !== static::$false && $value !== static::$null;
+    }
+
+    /**
+     * Is the value a direct relationship combinator?
+     *
+     * @param string $value
+     *
+     * @return boolean
+     */
+    protected function isImmediateRelationshipCombinator($value)
+    {
+        return $value === '>' || $value === '+' || $value === '~';
+    }
+
+    /**
+     * Should $value cause its operand to eval
+     *
+     * @param array $value
+     *
+     * @return boolean
+     */
+    protected function shouldEval($value)
+    {
+        switch ($value[0]) {
+            case Type::T_EXPRESSION:
+                if ($value[1] === '/') {
+                    return $this->shouldEval($value[2]) || $this->shouldEval($value[3]);
+                }
+
+                // fall-thru
+            case Type::T_VARIABLE:
+            case Type::T_FUNCTION_CALL:
+                return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Reduce value
+     *
+     * @param array   $value
+     * @param boolean $inExp
+     *
+     * @return null|string|array|\ScssPhp\ScssPhp\Node\Number
+     */
+    protected function reduce($value, $inExp = false)
+    {
+        if (\is_null($value)) {
+            return null;
+        }
+
+        switch ($value[0]) {
+            case Type::T_EXPRESSION:
+                list(, $op, $left, $right, $inParens) = $value;
+
+                $opName = isset(static::$operatorNames[$op]) ? static::$operatorNames[$op] : $op;
+                $inExp = $inExp || $this->shouldEval($left) || $this->shouldEval($right);
+
+                $left = $this->reduce($left, true);
+
+                if ($op !== 'and' && $op !== 'or') {
+                    $right = $this->reduce($right, true);
+                }
+
+                // special case: looks like css shorthand
+                if (
+                    $opName == 'div' && ! $inParens && ! $inExp && isset($right[2]) &&
+                    (($right[0] !== Type::T_NUMBER && $right[2] != '') ||
+                    ($right[0] === Type::T_NUMBER && ! $right->unitless()))
+                ) {
+                    return $this->expToString($value);
+                }
+
+                $left  = $this->coerceForExpression($left);
+                $right = $this->coerceForExpression($right);
+                $ltype = $left[0];
+                $rtype = $right[0];
+
+                $ucOpName = ucfirst($opName);
+                $ucLType  = ucfirst($ltype);
+                $ucRType  = ucfirst($rtype);
+
+                // this tries:
+                // 1. op[op name][left type][right type]
+                // 2. op[left type][right type] (passing the op as first arg
+                // 3. op[op name]
+                $fn = "op${ucOpName}${ucLType}${ucRType}";
+
+                if (
+                    \is_callable([$this, $fn]) ||
+                    (($fn = "op${ucLType}${ucRType}") &&
+                        \is_callable([$this, $fn]) &&
+                        $passOp = true) ||
+                    (($fn = "op${ucOpName}") &&
+                        \is_callable([$this, $fn]) &&
+                        $genOp = true)
+                ) {
+                    $coerceUnit = false;
+
+                    if (
+                        ! isset($genOp) &&
+                        $left[0] === Type::T_NUMBER && $right[0] === Type::T_NUMBER
+                    ) {
+                        $coerceUnit = true;
+
+                        switch ($opName) {
+                            case 'mul':
+                                $targetUnit = $left[2];
+
+                                foreach ($right[2] as $unit => $exp) {
+                                    $targetUnit[$unit] = (isset($targetUnit[$unit]) ? $targetUnit[$unit] : 0) + $exp;
+                                }
+                                break;
+
+                            case 'div':
+                                $targetUnit = $left[2];
+
+                                foreach ($right[2] as $unit => $exp) {
+                                    $targetUnit[$unit] = (isset($targetUnit[$unit]) ? $targetUnit[$unit] : 0) - $exp;
+                                }
+                                break;
+
+                            case 'mod':
+                                $targetUnit = $left[2];
+                                break;
+
+                            default:
+                                $targetUnit = $left->unitless() ? $right[2] : $left[2];
+                        }
+
+                        $baseUnitLeft = $left->isNormalizable();
+                        $baseUnitRight = $right->isNormalizable();
+
+                        if ($baseUnitLeft && $baseUnitRight && $baseUnitLeft === $baseUnitRight) {
+                            $left = $left->normalize();
+                            $right = $right->normalize();
+                        } elseif ($coerceUnit) {
+                            $left = new Node\Number($left[1], []);
+                        }
+                    }
+
+                    $shouldEval = $inParens || $inExp;
+
+                    if (isset($passOp)) {
+                        $out = $this->$fn($op, $left, $right, $shouldEval);
+                    } else {
+                        $out = $this->$fn($left, $right, $shouldEval);
+                    }
+
+                    if (isset($out)) {
+                        if ($coerceUnit && $out[0] === Type::T_NUMBER) {
+                            $out = $out->coerce($targetUnit);
+                        }
+
+                        return $out;
+                    }
+                }
+
+                return $this->expToString($value);
+
+            case Type::T_UNARY:
+                list(, $op, $exp, $inParens) = $value;
+
+                $inExp = $inExp || $this->shouldEval($exp);
+                $exp = $this->reduce($exp);
+
+                if ($exp[0] === Type::T_NUMBER) {
+                    switch ($op) {
+                        case '+':
+                            return new Node\Number($exp[1], $exp[2]);
+
+                        case '-':
+                            return new Node\Number(-$exp[1], $exp[2]);
+                    }
+                }
+
+                if ($op === 'not') {
+                    if ($inExp || $inParens) {
+                        if ($exp === static::$false || $exp === static::$null) {
+                            return static::$true;
+                        }
+
+                        return static::$false;
+                    }
+
+                    $op = $op . ' ';
+                }
+
+                return [Type::T_STRING, '', [$op, $exp]];
+
+            case Type::T_VARIABLE:
+                return $this->reduce($this->get($value[1]));
+
+            case Type::T_LIST:
+                foreach ($value[2] as &$item) {
+                    $item = $this->reduce($item);
+                }
+
+                return $value;
+
+            case Type::T_MAP:
+                foreach ($value[1] as &$item) {
+                    $item = $this->reduce($item);
+                }
+
+                foreach ($value[2] as &$item) {
+                    $item = $this->reduce($item);
+                }
+
+                return $value;
+
+            case Type::T_STRING:
+                foreach ($value[2] as &$item) {
+                    if (\is_array($item) || $item instanceof \ArrayAccess) {
+                        $item = $this->reduce($item);
+                    }
+                }
+
+                return $value;
+
+            case Type::T_INTERPOLATE:
+                $value[1] = $this->reduce($value[1]);
+
+                if ($inExp) {
+                    return $value[1];
+                }
+
+                return $value;
+
+            case Type::T_FUNCTION_CALL:
+                return $this->fncall($value[1], $value[2]);
+
+            case Type::T_SELF:
+                $selfParent = ! empty($this->env->block->selfParent) ? $this->env->block->selfParent : null;
+                $selfSelector = $this->multiplySelectors($this->env, $selfParent);
+                $selfSelector = $this->collapseSelectors($selfSelector, true);
+
+                return $selfSelector;
+
+            default:
+                return $value;
+        }
+    }
+
+    /**
+     * Function caller
+     *
+     * @param string $name
+     * @param array  $argValues
+     *
+     * @return array|null
+     */
+    protected function fncall($functionReference, $argValues)
+    {
+        // a string means this is a static hard reference coming from the parsing
+        if (is_string($functionReference)) {
+            $name = $functionReference;
+
+            $functionReference = $this->getFunctionReference($name);
+            if ($functionReference === static::$null || $functionReference[0] !== Type::T_FUNCTION_REFERENCE) {
+                $functionReference = [Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]];
+            }
+        }
+
+        // a function type means we just want a plain css function call
+        if ($functionReference[0] === Type::T_FUNCTION) {
+            // for CSS functions, simply flatten the arguments into a list
+            $listArgs = [];
+
+            foreach ((array) $argValues as $arg) {
+                if (empty($arg[0]) || count($argValues) === 1) {
+                    $listArgs[] = $this->reduce($this->stringifyFncallArgs($arg[1]));
+                }
+            }
+
+            return [Type::T_FUNCTION, $functionReference[1], [Type::T_LIST, ',', $listArgs]];
+        }
+
+        if ($functionReference === static::$null || $functionReference[0] !== Type::T_FUNCTION_REFERENCE) {
+            return static::$defaultValue;
+        }
+
+
+        switch ($functionReference[1]) {
+            // SCSS @function
+            case 'scss':
+                return $this->callScssFunction($functionReference[3], $argValues);
+
+            // native PHP functions
+            case 'user':
+            case 'native':
+                list(,,$name, $fn, $prototype) = $functionReference;
+
+                // special cases of css valid functions min/max
+                $name = strtolower($name);
+                if (\in_array($name, ['min', 'max'])) {
+                    $cssFunction = $this->cssValidArg(
+                        [Type::T_FUNCTION_CALL, $name, $argValues],
+                        ['min', 'max', 'calc', 'env', 'var']
+                    );
+                    if ($cssFunction !== false) {
+                        return $cssFunction;
+                    }
+                }
+                $returnValue = $this->callNativeFunction($name, $fn, $prototype, $argValues);
+
+                if (! isset($returnValue)) {
+                    return $this->fncall([Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]], $argValues);
+                }
+
+                return $returnValue;
+
+            default:
+                return static::$defaultValue;
+        }
+    }
+
+    protected function cssValidArg($arg, $allowed_function = [], $inFunction = false)
+    {
+        switch ($arg[0]) {
+            case Type::T_INTERPOLATE:
+                return [Type::T_KEYWORD, $this->CompileValue($arg)];
+
+            case Type::T_FUNCTION:
+                if (! \in_array($arg[1], $allowed_function)) {
+                    return false;
+                }
+                if ($arg[2][0] === Type::T_LIST) {
+                    foreach ($arg[2][2] as $k => $subarg) {
+                        $arg[2][2][$k] = $this->cssValidArg($subarg, $allowed_function, $arg[1]);
+                        if ($arg[2][2][$k] === false) {
+                            return false;
+                        }
+                    }
+                }
+                return $arg;
+
+            case Type::T_FUNCTION_CALL:
+                if (! \in_array($arg[1], $allowed_function)) {
+                    return false;
+                }
+                $cssArgs = [];
+                foreach ($arg[2] as $argValue) {
+                    if ($argValue === static::$null) {
+                        return false;
+                    }
+                    $cssArg = $this->cssValidArg($argValue[1], $allowed_function, $arg[1]);
+                    if (empty($argValue[0]) && $cssArg !== false) {
+                        $cssArgs[] = [$argValue[0], $cssArg];
+                    } else {
+                        return false;
+                    }
+                }
+
+                return $this->fncall([Type::T_FUNCTION, $arg[1], [Type::T_LIST, ',', []]], $cssArgs);
+
+            case Type::T_STRING:
+            case Type::T_KEYWORD:
+                if (!$inFunction or !\in_array($inFunction, ['calc', 'env', 'var'])) {
+                    return false;
+                }
+                return $this->stringifyFncallArgs($arg);
+
+            case Type::T_NUMBER:
+                return $this->stringifyFncallArgs($arg);
+
+            case Type::T_LIST:
+                if (!$inFunction) {
+                    return false;
+                }
+                if (empty($arg['enclosing']) and $arg[1] === '') {
+                    foreach ($arg[2] as $k => $subarg) {
+                        $arg[2][$k] = $this->cssValidArg($subarg, $allowed_function, $inFunction);
+                        if ($arg[2][$k] === false) {
+                            return false;
+                        }
+                    }
+                    $arg[0] = Type::T_STRING;
+                    return $arg;
+                }
+                return false;
+
+            case Type::T_EXPRESSION:
+                if (! \in_array($arg[1], ['+', '-', '/', '*'])) {
+                    return false;
+                }
+                $arg[2] = $this->cssValidArg($arg[2], $allowed_function, $inFunction);
+                $arg[3] = $this->cssValidArg($arg[3], $allowed_function, $inFunction);
+                if ($arg[2] === false || $arg[3] === false) {
+                    return false;
+                }
+                return $this->expToString($arg, true);
+
+            case Type::T_VARIABLE:
+            case Type::T_SELF:
+            default:
+                return false;
+        }
+    }
+
+
+    /**
+     * Reformat fncall arguments to proper css function output
+     * @param $arg
+     * @return array|\ArrayAccess|Node\Number|string|null
+     */
+    protected function stringifyFncallArgs($arg)
+    {
+
+        switch ($arg[0]) {
+            case Type::T_LIST:
+                foreach ($arg[2] as $k => $v) {
+                    $arg[2][$k] = $this->stringifyFncallArgs($v);
+                }
+                break;
+
+            case Type::T_EXPRESSION:
+                if ($arg[1] === '/') {
+                    $arg[2] = $this->stringifyFncallArgs($arg[2]);
+                    $arg[3] = $this->stringifyFncallArgs($arg[3]);
+                    $arg[5] = $arg[6] = false; // no space around /
+                    $arg = $this->expToString($arg);
+                }
+                break;
+
+            case Type::T_FUNCTION_CALL:
+                $name = strtolower($arg[1]);
+
+                if (in_array($name, ['max', 'min', 'calc'])) {
+                    $args = $arg[2];
+                    $arg = $this->fncall([Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]], $args);
+                }
+                break;
+        }
+
+        return $arg;
+    }
+
+    /**
+     * Find a function reference
+     * @param string $name
+     * @param bool $safeCopy
+     * @return array
+     */
+    protected function getFunctionReference($name, $safeCopy = false)
+    {
+        // SCSS @function
+        if ($func = $this->get(static::$namespaces['function'] . $name, false)) {
+            if ($safeCopy) {
+                $func = clone $func;
+            }
+
+            return [Type::T_FUNCTION_REFERENCE, 'scss', $name, $func];
+        }
+
+        // native PHP functions
+
+        // try to find a native lib function
+        $normalizedName = $this->normalizeName($name);
+        $libName = null;
+
+        if (isset($this->userFunctions[$normalizedName])) {
+            // see if we can find a user function
+            list($f, $prototype) = $this->userFunctions[$normalizedName];
+
+            return [Type::T_FUNCTION_REFERENCE, 'user', $name, $f, $prototype];
+        }
+
+        if (($f = $this->getBuiltinFunction($normalizedName)) && \is_callable($f)) {
+            $libName   = $f[1];
+            $prototype = isset(static::$$libName) ? static::$$libName : null;
+
+            return [Type::T_FUNCTION_REFERENCE, 'native', $name, $f, $prototype];
+        }
+
+        return static::$null;
+    }
+
+
+    /**
+     * Normalize name
+     *
+     * @param string $name
+     *
+     * @return string
+     */
+    protected function normalizeName($name)
+    {
+        return str_replace('-', '_', $name);
+    }
+
+    /**
+     * Normalize value
+     *
+     * @param array $value
+     *
+     * @return array
+     */
+    public function normalizeValue($value)
+    {
+        $value = $this->coerceForExpression($this->reduce($value));
+
+        switch ($value[0]) {
+            case Type::T_LIST:
+                $value = $this->extractInterpolation($value);
+
+                if ($value[0] !== Type::T_LIST) {
+                    return [Type::T_KEYWORD, $this->compileValue($value)];
+                }
+
+                foreach ($value[2] as $key => $item) {
+                    $value[2][$key] = $this->normalizeValue($item);
+                }
+
+                if (! empty($value['enclosing'])) {
+                    unset($value['enclosing']);
+                }
+
+                return $value;
+
+            case Type::T_STRING:
+                return [$value[0], '"', [$this->compileStringContent($value)]];
+
+            case Type::T_NUMBER:
+                return $value->normalize();
+
+            case Type::T_INTERPOLATE:
+                return [Type::T_KEYWORD, $this->compileValue($value)];
+
+            default:
+                return $value;
+        }
+    }
+
+    /**
+     * Add numbers
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return \ScssPhp\ScssPhp\Node\Number
+     */
+    protected function opAddNumberNumber($left, $right)
+    {
+        return new Node\Number($left[1] + $right[1], $left[2]);
+    }
+
+    /**
+     * Multiply numbers
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return \ScssPhp\ScssPhp\Node\Number
+     */
+    protected function opMulNumberNumber($left, $right)
+    {
+        return new Node\Number($left[1] * $right[1], $left[2]);
+    }
+
+    /**
+     * Subtract numbers
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return \ScssPhp\ScssPhp\Node\Number
+     */
+    protected function opSubNumberNumber($left, $right)
+    {
+        return new Node\Number($left[1] - $right[1], $left[2]);
+    }
+
+    /**
+     * Divide numbers
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return array|\ScssPhp\ScssPhp\Node\Number
+     */
+    protected function opDivNumberNumber($left, $right)
+    {
+        if ($right[1] == 0) {
+            return ($left[1] == 0) ? static::$NaN : static::$Infinity;
+        }
+
+        return new Node\Number($left[1] / $right[1], $left[2]);
+    }
+
+    /**
+     * Mod numbers
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return \ScssPhp\ScssPhp\Node\Number
+     */
+    protected function opModNumberNumber($left, $right)
+    {
+        if ($right[1] == 0) {
+            return static::$NaN;
+        }
+
+        return new Node\Number($left[1] % $right[1], $left[2]);
+    }
+
+    /**
+     * Add strings
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return array|null
+     */
+    protected function opAdd($left, $right)
+    {
+        if ($strLeft = $this->coerceString($left)) {
+            if ($right[0] === Type::T_STRING) {
+                $right[1] = '';
+            }
+
+            $strLeft[2][] = $right;
+
+            return $strLeft;
+        }
+
+        if ($strRight = $this->coerceString($right)) {
+            if ($left[0] === Type::T_STRING) {
+                $left[1] = '';
+            }
+
+            array_unshift($strRight[2], $left);
+
+            return $strRight;
+        }
+
+        return null;
+    }
+
+    /**
+     * Boolean and
+     *
+     * @param array   $left
+     * @param array   $right
+     * @param boolean $shouldEval
+     *
+     * @return array|null
+     */
+    protected function opAnd($left, $right, $shouldEval)
+    {
+        $truthy = ($left === static::$null || $right === static::$null) ||
+                  ($left === static::$false || $left === static::$true) &&
+                  ($right === static::$false || $right === static::$true);
+
+        if (! $shouldEval) {
+            if (! $truthy) {
+                return null;
+            }
+        }
+
+        if ($left !== static::$false && $left !== static::$null) {
+            return $this->reduce($right, true);
+        }
+
+        return $left;
+    }
+
+    /**
+     * Boolean or
+     *
+     * @param array   $left
+     * @param array   $right
+     * @param boolean $shouldEval
+     *
+     * @return array|null
+     */
+    protected function opOr($left, $right, $shouldEval)
+    {
+        $truthy = ($left === static::$null || $right === static::$null) ||
+                  ($left === static::$false || $left === static::$true) &&
+                  ($right === static::$false || $right === static::$true);
+
+        if (! $shouldEval) {
+            if (! $truthy) {
+                return null;
+            }
+        }
+
+        if ($left !== static::$false && $left !== static::$null) {
+            return $left;
+        }
+
+        return $this->reduce($right, true);
+    }
+
+    /**
+     * Compare colors
+     *
+     * @param string $op
+     * @param array  $left
+     * @param array  $right
+     *
+     * @return array
+     */
+    protected function opColorColor($op, $left, $right)
+    {
+        $out = [Type::T_COLOR];
+
+        foreach ([1, 2, 3] as $i) {
+            $lval = isset($left[$i]) ? $left[$i] : 0;
+            $rval = isset($right[$i]) ? $right[$i] : 0;
+
+            switch ($op) {
+                case '+':
+                    $out[] = $lval + $rval;
+                    break;
+
+                case '-':
+                    $out[] = $lval - $rval;
+                    break;
+
+                case '*':
+                    $out[] = $lval * $rval;
+                    break;
+
+                case '%':
+                    if ($rval == 0) {
+                        throw $this->error("color: Can't take modulo by zero");
+                    }
+
+                    $out[] = $lval % $rval;
+                    break;
+
+                case '/':
+                    if ($rval == 0) {
+                        throw $this->error("color: Can't divide by zero");
+                    }
+
+                    $out[] = (int) ($lval / $rval);
+                    break;
+
+                case '==':
+                    return $this->opEq($left, $right);
+
+                case '!=':
+                    return $this->opNeq($left, $right);
+
+                default:
+                    throw $this->error("color: unknown op $op");
+            }
+        }
+
+        if (isset($left[4])) {
+            $out[4] = $left[4];
+        } elseif (isset($right[4])) {
+            $out[4] = $right[4];
+        }
+
+        return $this->fixColor($out);
+    }
+
+    /**
+     * Compare color and number
+     *
+     * @param string $op
+     * @param array  $left
+     * @param array  $right
+     *
+     * @return array
+     */
+    protected function opColorNumber($op, $left, $right)
+    {
+        $value = $right[1];
+
+        return $this->opColorColor(
+            $op,
+            $left,
+            [Type::T_COLOR, $value, $value, $value]
+        );
+    }
+
+    /**
+     * Compare number and color
+     *
+     * @param string $op
+     * @param array  $left
+     * @param array  $right
+     *
+     * @return array
+     */
+    protected function opNumberColor($op, $left, $right)
+    {
+        $value = $left[1];
+
+        return $this->opColorColor(
+            $op,
+            [Type::T_COLOR, $value, $value, $value],
+            $right
+        );
+    }
+
+    /**
+     * Compare number1 == number2
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return array
+     */
+    protected function opEq($left, $right)
+    {
+        if (($lStr = $this->coerceString($left)) && ($rStr = $this->coerceString($right))) {
+            $lStr[1] = '';
+            $rStr[1] = '';
+
+            $left = $this->compileValue($lStr);
+            $right = $this->compileValue($rStr);
+        }
+
+        return $this->toBool($left === $right);
+    }
+
+    /**
+     * Compare number1 != number2
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return array
+     */
+    protected function opNeq($left, $right)
+    {
+        if (($lStr = $this->coerceString($left)) && ($rStr = $this->coerceString($right))) {
+            $lStr[1] = '';
+            $rStr[1] = '';
+
+            $left = $this->compileValue($lStr);
+            $right = $this->compileValue($rStr);
+        }
+
+        return $this->toBool($left !== $right);
+    }
+
+    /**
+     * Compare number1 >= number2
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return array
+     */
+    protected function opGteNumberNumber($left, $right)
+    {
+        return $this->toBool($left[1] >= $right[1]);
+    }
+
+    /**
+     * Compare number1 > number2
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return array
+     */
+    protected function opGtNumberNumber($left, $right)
+    {
+        return $this->toBool($left[1] > $right[1]);
+    }
+
+    /**
+     * Compare number1 <= number2
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return array
+     */
+    protected function opLteNumberNumber($left, $right)
+    {
+        return $this->toBool($left[1] <= $right[1]);
+    }
+
+    /**
+     * Compare number1 < number2
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return array
+     */
+    protected function opLtNumberNumber($left, $right)
+    {
+        return $this->toBool($left[1] < $right[1]);
+    }
+
+    /**
+     * Three-way comparison, aka spaceship operator
+     *
+     * @param array $left
+     * @param array $right
+     *
+     * @return \ScssPhp\ScssPhp\Node\Number
+     */
+    protected function opCmpNumberNumber($left, $right)
+    {
+        $n = $left[1] - $right[1];
+
+        return new Node\Number($n ? $n / abs($n) : 0, '');
+    }
+
+    /**
+     * Cast to boolean
+     *
+     * @api
+     *
+     * @param mixed $thing
+     *
+     * @return array
+     */
+    public function toBool($thing)
+    {
+        return $thing ? static::$true : static::$false;
+    }
+
+    /**
+     * Compiles a primitive value into a CSS property value.
+     *
+     * Values in scssphp are typed by being wrapped in arrays, their format is
+     * typically:
+     *
+     *     array(type, contents [, additional_contents]*)
+     *
+     * The input is expected to be reduced. This function will not work on
+     * things like expressions and variables.
+     *
+     * @api
+     *
+     * @param array $value
+     *
+     * @return string|array
+     */
+    public function compileValue($value)
+    {
+        $value = $this->reduce($value);
+
+        switch ($value[0]) {
+            case Type::T_KEYWORD:
+                return $value[1];
+
+            case Type::T_COLOR:
+                // [1] - red component (either number for a %)
+                // [2] - green component
+                // [3] - blue component
+                // [4] - optional alpha component
+                list(, $r, $g, $b) = $value;
+
+                $r = $this->compileRGBAValue($r);
+                $g = $this->compileRGBAValue($g);
+                $b = $this->compileRGBAValue($b);
+
+                if (\count($value) === 5) {
+                    $alpha = $this->compileRGBAValue($value[4], true);
+
+                    if (! is_numeric($alpha) || $alpha < 1) {
+                        $colorName = Colors::RGBaToColorName($r, $g, $b, $alpha);
+
+                        if (! \is_null($colorName)) {
+                            return $colorName;
+                        }
+
+                        if (is_numeric($alpha)) {
+                            $a = new Node\Number($alpha, '');
+                        } else {
+                            $a = $alpha;
+                        }
+
+                        return 'rgba(' . $r . ', ' . $g . ', ' . $b . ', ' . $a . ')';
+                    }
+                }
+
+                if (! is_numeric($r) || ! is_numeric($g) || ! is_numeric($b)) {
+                    return 'rgb(' . $r . ', ' . $g . ', ' . $b . ')';
+                }
+
+                $colorName = Colors::RGBaToColorName($r, $g, $b);
+
+                if (! \is_null($colorName)) {
+                    return $colorName;
+                }
+
+                $h = sprintf('#%02x%02x%02x', $r, $g, $b);
+
+                // Converting hex color to short notation (e.g. #003399 to #039)
+                if ($h[1] === $h[2] && $h[3] === $h[4] && $h[5] === $h[6]) {
+                    $h = '#' . $h[1] . $h[3] . $h[5];
+                }
+
+                return $h;
+
+            case Type::T_NUMBER:
+                return $value->output($this);
+
+            case Type::T_STRING:
+                $content = $this->compileStringContent($value);
+
+                if ($value[1]) {
+                    // force double quote as string quote for the output in certain cases
+                    if (
+                        $value[1] === "'" &&
+                        strpos($content, '"') === false &&
+                        strpbrk($content, '{}') !== false
+                    ) {
+                        $value[1] = '"';
+                    }
+                    $content = str_replace(
+                        array('\\a', "\n", "\f" , '\\'  , "\r" , $value[1]),
+                        array("\r" , ' ' , '\\f', '\\\\', '\\a', '\\' . $value[1]),
+                        $content
+                    );
+                }
+
+                return $value[1] . $content . $value[1];
+
+            case Type::T_FUNCTION:
+                $args = ! empty($value[2]) ? $this->compileValue($value[2]) : '';
+
+                return "$value[1]($args)";
+
+            case Type::T_FUNCTION_REFERENCE:
+                $name = ! empty($value[2]) ? $value[2] : '';
+
+                return "get-function(\"$name\")";
+
+            case Type::T_LIST:
+                $value = $this->extractInterpolation($value);
+
+                if ($value[0] !== Type::T_LIST) {
+                    return $this->compileValue($value);
+                }
+
+                list(, $delim, $items) = $value;
+                $pre = $post = '';
+
+                if (! empty($value['enclosing'])) {
+                    switch ($value['enclosing']) {
+                        case 'parent':
+                            //$pre = '(';
+                            //$post = ')';
+                            break;
+                        case 'forced_parent':
+                            $pre = '(';
+                            $post = ')';
+                            break;
+                        case 'bracket':
+                        case 'forced_bracket':
+                            $pre = '[';
+                            $post = ']';
+                            break;
+                    }
+                }
+
+                $prefix_value = '';
+
+                if ($delim !== ' ') {
+                    $prefix_value = ' ';
+                }
+
+                $filtered = [];
+
+                foreach ($items as $item) {
+                    if ($item[0] === Type::T_NULL) {
+                        continue;
+                    }
+
+                    $compiled = $this->compileValue($item);
+
+                    if ($prefix_value && \strlen($compiled)) {
+                        $compiled = $prefix_value . $compiled;
+                    }
+
+                    $filtered[] = $compiled;
+                }
+
+                return $pre . substr(implode("$delim", $filtered), \strlen($prefix_value)) . $post;
+
+            case Type::T_MAP:
+                $keys     = $value[1];
+                $values   = $value[2];
+                $filtered = [];
+
+                for ($i = 0, $s = \count($keys); $i < $s; $i++) {
+                    $filtered[$this->compileValue($keys[$i])] = $this->compileValue($values[$i]);
+                }
+
+                array_walk($filtered, function (&$value, $key) {
+                    $value = $key . ': ' . $value;
+                });
+
+                return '(' . implode(', ', $filtered) . ')';
+
+            case Type::T_INTERPOLATED:
+                // node created by extractInterpolation
+                list(, $interpolate, $left, $right) = $value;
+                list(,, $whiteLeft, $whiteRight) = $interpolate;
+
+                $delim = $left[1];
+
+                if ($delim && $delim !== ' ' && ! $whiteLeft) {
+                    $delim .= ' ';
+                }
+
+                $left = \count($left[2]) > 0
+                    ?  $this->compileValue($left) . $delim . $whiteLeft
+                    : '';
+
+                $delim = $right[1];
+
+                if ($delim && $delim !== ' ') {
+                    $delim .= ' ';
+                }
+
+                $right = \count($right[2]) > 0 ?
+                    $whiteRight . $delim . $this->compileValue($right) : '';
+
+                return $left . $this->compileValue($interpolate) . $right;
+
+            case Type::T_INTERPOLATE:
+                // strip quotes if it's a string
+                $reduced = $this->reduce($value[1]);
+
+                switch ($reduced[0]) {
+                    case Type::T_LIST:
+                        $reduced = $this->extractInterpolation($reduced);
+
+                        if ($reduced[0] !== Type::T_LIST) {
+                            break;
+                        }
+
+                        list(, $delim, $items) = $reduced;
+
+                        if ($delim !== ' ') {
+                            $delim .= ' ';
+                        }
+
+                        $filtered = [];
+
+                        foreach ($items as $item) {
+                            if ($item[0] === Type::T_NULL) {
+                                continue;
+                            }
+
+                            $temp = $this->compileValue([Type::T_KEYWORD, $item]);
+
+                            if ($temp[0] === Type::T_STRING) {
+                                $filtered[] = $this->compileStringContent($temp);
+                            } elseif ($temp[0] === Type::T_KEYWORD) {
+                                $filtered[] = $temp[1];
+                            } else {
+                                $filtered[] = $this->compileValue($temp);
+                            }
+                        }
+
+                        $reduced = [Type::T_KEYWORD, implode("$delim", $filtered)];
+                        break;
+
+                    case Type::T_STRING:
+                        $reduced = [Type::T_KEYWORD, $this->compileStringContent($reduced)];
+                        break;
+
+                    case Type::T_NULL:
+                        $reduced = [Type::T_KEYWORD, ''];
+                }
+
+                return $this->compileValue($reduced);
+
+            case Type::T_NULL:
+                return 'null';
+
+            case Type::T_COMMENT:
+                return $this->compileCommentValue($value);
+
+            default:
+                throw $this->error('unknown value type: ' . json_encode($value));
+        }
+    }
+
+    /**
+     * @param array $value
+     *
+     * @return array|string
+     */
+    protected function compileDebugValue($value)
+    {
+        $value = $this->reduce($value, true);
+
+        switch ($value[0]) {
+            case Type::T_STRING:
+                return $this->compileStringContent($value);
+
+            default:
+                return $this->compileValue($value);
+        }
+    }
+
+    /**
+     * Flatten list
+     *
+     * @param array $list
+     *
+     * @return string
+     */
+    protected function flattenList($list)
+    {
+        return $this->compileValue($list);
+    }
+
+    /**
+     * Compile string content
+     *
+     * @param array $string
+     *
+     * @return string
+     */
+    protected function compileStringContent($string)
+    {
+        $parts = [];
+
+        foreach ($string[2] as $part) {
+            if (\is_array($part) || $part instanceof \ArrayAccess) {
+                $parts[] = $this->compileValue($part);
+            } else {
+                $parts[] = $part;
+            }
+        }
+
+        return implode($parts);
+    }
+
+    /**
+     * Extract interpolation; it doesn't need to be recursive, compileValue will handle that
+     *
+     * @param array $list
+     *
+     * @return array
+     */
+    protected function extractInterpolation($list)
+    {
+        $items = $list[2];
+
+        foreach ($items as $i => $item) {
+            if ($item[0] === Type::T_INTERPOLATE) {
+                $before = [Type::T_LIST, $list[1], \array_slice($items, 0, $i)];
+                $after  = [Type::T_LIST, $list[1], \array_slice($items, $i + 1)];
+
+                return [Type::T_INTERPOLATED, $item, $before, $after];
+            }
+        }
+
+        return $list;
+    }
+
+    /**
+     * Find the final set of selectors
+     *
+     * @param \ScssPhp\ScssPhp\Compiler\Environment $env
+     * @param \ScssPhp\ScssPhp\Block                $selfParent
+     *
+     * @return array
+     */
+    protected function multiplySelectors(Environment $env, $selfParent = null)
+    {
+        $envs            = $this->compactEnv($env);
+        $selectors       = [];
+        $parentSelectors = [[]];
+
+        $selfParentSelectors = null;
+
+        if (! \is_null($selfParent) && $selfParent->selectors) {
+            $selfParentSelectors = $this->evalSelectors($selfParent->selectors);
+        }
+
+        while ($env = array_pop($envs)) {
+            if (empty($env->selectors)) {
+                continue;
+            }
+
+            $selectors = $env->selectors;
+
+            do {
+                $stillHasSelf  = false;
+                $prevSelectors = $selectors;
+                $selectors     = [];
+
+                foreach ($parentSelectors as $parent) {
+                    foreach ($prevSelectors as $selector) {
+                        if ($selfParentSelectors) {
+                            foreach ($selfParentSelectors as $selfParent) {
+                                // if no '&' in the selector, each call will give same result, only add once
+                                $s = $this->joinSelectors($parent, $selector, $stillHasSelf, $selfParent);
+                                $selectors[serialize($s)] = $s;
+                            }
+                        } else {
+                            $s = $this->joinSelectors($parent, $selector, $stillHasSelf);
+                            $selectors[serialize($s)] = $s;
+                        }
+                    }
+                }
+            } while ($stillHasSelf);
+
+            $parentSelectors = $selectors;
+        }
+
+        $selectors = array_values($selectors);
+
+        // case we are just starting a at-root : nothing to multiply but parentSelectors
+        if (! $selectors && $selfParentSelectors) {
+            $selectors = $selfParentSelectors;
+        }
+
+        return $selectors;
+    }
+
+    /**
+     * Join selectors; looks for & to replace, or append parent before child
+     *
+     * @param array   $parent
+     * @param array   $child
+     * @param boolean $stillHasSelf
+     * @param array   $selfParentSelectors
+
+     * @return array
+     */
+    protected function joinSelectors($parent, $child, &$stillHasSelf, $selfParentSelectors = null)
+    {
+        $setSelf = false;
+        $out = [];
+
+        foreach ($child as $part) {
+            $newPart = [];
+
+            foreach ($part as $p) {
+                // only replace & once and should be recalled to be able to make combinations
+                if ($p === static::$selfSelector && $setSelf) {
+                    $stillHasSelf = true;
+                }
+
+                if ($p === static::$selfSelector && ! $setSelf) {
+                    $setSelf = true;
+
+                    if (\is_null($selfParentSelectors)) {
+                        $selfParentSelectors = $parent;
+                    }
+
+                    foreach ($selfParentSelectors as $i => $parentPart) {
+                        if ($i > 0) {
+                            $out[] = $newPart;
+                            $newPart = [];
+                        }
+
+                        foreach ($parentPart as $pp) {
+                            if (\is_array($pp)) {
+                                $flatten = [];
+
+                                array_walk_recursive($pp, function ($a) use (&$flatten) {
+                                    $flatten[] = $a;
+                                });
+
+                                $pp = implode($flatten);
+                            }
+
+                            $newPart[] = $pp;
+                        }
+                    }
+                } else {
+                    $newPart[] = $p;
+                }
+            }
+
+            $out[] = $newPart;
+        }
+
+        return $setSelf ? $out : array_merge($parent, $child);
+    }
+
+    /**
+     * Multiply media
+     *
+     * @param \ScssPhp\ScssPhp\Compiler\Environment $env
+     * @param array                                 $childQueries
+     *
+     * @return array
+     */
+    protected function multiplyMedia(Environment $env = null, $childQueries = null)
+    {
+        if (
+            ! isset($env) ||
+            ! empty($env->block->type) && $env->block->type !== Type::T_MEDIA
+        ) {
+            return $childQueries;
+        }
+
+        // plain old block, skip
+        if (empty($env->block->type)) {
+            return $this->multiplyMedia($env->parent, $childQueries);
+        }
+
+        $parentQueries = isset($env->block->queryList)
+            ? $env->block->queryList
+            : [[[Type::T_MEDIA_VALUE, $env->block->value]]];
+
+        $store = [$this->env, $this->storeEnv];
+
+        $this->env      = $env;
+        $this->storeEnv = null;
+        $parentQueries  = $this->evaluateMediaQuery($parentQueries);
+
+        list($this->env, $this->storeEnv) = $store;
+
+        if (\is_null($childQueries)) {
+            $childQueries = $parentQueries;
+        } else {
+            $originalQueries = $childQueries;
+            $childQueries = [];
+
+            foreach ($parentQueries as $parentQuery) {
+                foreach ($originalQueries as $childQuery) {
+                    $childQueries[] = array_merge(
+                        $parentQuery,
+                        [[Type::T_MEDIA_TYPE, [Type::T_KEYWORD, 'all']]],
+                        $childQuery
+                    );
+                }
+            }
+        }
+
+        return $this->multiplyMedia($env->parent, $childQueries);
+    }
+
+    /**
+     * Convert env linked list to stack
+     *
+     * @param \ScssPhp\ScssPhp\Compiler\Environment $env
+     *
+     * @return array
+     */
+    protected function compactEnv(Environment $env)
+    {
+        for ($envs = []; $env; $env = $env->parent) {
+            $envs[] = $env;
+        }
+
+        return $envs;
+    }
+
+    /**
+     * Convert env stack to singly linked list
+     *
+     * @param array $envs
+     *
+     * @return \ScssPhp\ScssPhp\Compiler\Environment
+     */
+    protected function extractEnv($envs)
+    {
+        for ($env = null; $e = array_pop($envs);) {
+            $e->parent = $env;
+            $env = $e;
+        }
+
+        return $env;
+    }
+
+    /**
+     * Push environment
+     *
+     * @param \ScssPhp\ScssPhp\Block $block
+     *
+     * @return \ScssPhp\ScssPhp\Compiler\Environment
+     */
+    protected function pushEnv(Block $block = null)
+    {
+        $env = new Environment();
+        $env->parent = $this->env;
+        $env->parentStore = $this->storeEnv;
+        $env->store  = [];
+        $env->block  = $block;
+        $env->depth  = isset($this->env->depth) ? $this->env->depth + 1 : 0;
+
+        $this->env = $env;
+        $this->storeEnv = null;
+
+        return $env;
+    }
+
+    /**
+     * Pop environment
+     */
+    protected function popEnv()
+    {
+        $this->storeEnv = $this->env->parentStore;
+        $this->env = $this->env->parent;
+    }
+
+    /**
+     * Propagate vars from a just poped Env (used in @each and @for)
+     *
+     * @param array      $store
+     * @param null|array $excludedVars
+     */
+    protected function backPropagateEnv($store, $excludedVars = null)
+    {
+        foreach ($store as $key => $value) {
+            if (empty($excludedVars) || ! \in_array($key, $excludedVars)) {
+                $this->set($key, $value, true);
+            }
+        }
+    }
+
+    /**
+     * Get store environment
+     *
+     * @return \ScssPhp\ScssPhp\Compiler\Environment
+     */
+    protected function getStoreEnv()
+    {
+        return isset($this->storeEnv) ? $this->storeEnv : $this->env;
+    }
+
+    /**
+     * Set variable
+     *
+     * @param string                                $name
+     * @param mixed                                 $value
+     * @param boolean                               $shadow
+     * @param \ScssPhp\ScssPhp\Compiler\Environment $env
+     * @param mixed                                 $valueUnreduced
+     */
+    protected function set($name, $value, $shadow = false, Environment $env = null, $valueUnreduced = null)
+    {
+        $name = $this->normalizeName($name);
+
+        if (! isset($env)) {
+            $env = $this->getStoreEnv();
+        }
+
+        if ($shadow) {
+            $this->setRaw($name, $value, $env, $valueUnreduced);
+        } else {
+            $this->setExisting($name, $value, $env, $valueUnreduced);
+        }
+    }
+
+    /**
+     * Set existing variable
+     *
+     * @param string                                $name
+     * @param mixed                                 $value
+     * @param \ScssPhp\ScssPhp\Compiler\Environment $env
+     * @param mixed                                 $valueUnreduced
+     */
+    protected function setExisting($name, $value, Environment $env, $valueUnreduced = null)
+    {
+        $storeEnv = $env;
+        $specialContentKey = static::$namespaces['special'] . 'content';
+
+        $hasNamespace = $name[0] === '^' || $name[0] === '@' || $name[0] === '%';
+
+        $maxDepth = 10000;
+
+        for (;;) {
+            if ($maxDepth-- <= 0) {
+                break;
+            }
+
+            if (\array_key_exists($name, $env->store)) {
+                break;
+            }
+
+            if (! $hasNamespace && isset($env->marker)) {
+                if (! empty($env->store[$specialContentKey])) {
+                    $env = $env->store[$specialContentKey]->scope;
+                    continue;
+                }
+
+                if (! empty($env->declarationScopeParent)) {
+                    $env = $env->declarationScopeParent;
+                    continue;
+                } else {
+                    $env = $storeEnv;
+                    break;
+                }
+            }
+
+            if (isset($env->parentStore)) {
+                $env = $env->parentStore;
+            } elseif (isset($env->parent)) {
+                $env = $env->parent;
+            } else {
+                $env = $storeEnv;
+                break;
+            }
+        }
+
+        $env->store[$name] = $value;
+
+        if ($valueUnreduced) {
+            $env->storeUnreduced[$name] = $valueUnreduced;
+        }
+    }
+
+    /**
+     * Set raw variable
+     *
+     * @param string                                $name
+     * @param mixed                                 $value
+     * @param \ScssPhp\ScssPhp\Compiler\Environment $env
+     * @param mixed                                 $valueUnreduced
+     */
+    protected function setRaw($name, $value, Environment $env, $valueUnreduced = null)
+    {
+        $env->store[$name] = $value;
+
+        if ($valueUnreduced) {
+            $env->storeUnreduced[$name] = $valueUnreduced;
+        }
+    }
+
+    /**
+     * Get variable
+     *
+     * @api
+     *
+     * @param string                                $name
+     * @param boolean                               $shouldThrow
+     * @param \ScssPhp\ScssPhp\Compiler\Environment $env
+     * @param boolean                               $unreduced
+     *
+     * @return mixed|null
+     */
+    public function get($name, $shouldThrow = true, Environment $env = null, $unreduced = false)
+    {
+        $normalizedName = $this->normalizeName($name);
+        $specialContentKey = static::$namespaces['special'] . 'content';
+
+        if (! isset($env)) {
+            $env = $this->getStoreEnv();
+        }
+
+        $hasNamespace = $normalizedName[0] === '^' || $normalizedName[0] === '@' || $normalizedName[0] === '%';
+
+        $maxDepth = 10000;
+
+        for (;;) {
+            if ($maxDepth-- <= 0) {
+                break;
+            }
+
+            if (\array_key_exists($normalizedName, $env->store)) {
+                if ($unreduced && isset($env->storeUnreduced[$normalizedName])) {
+                    return $env->storeUnreduced[$normalizedName];
+                }
+
+                return $env->store[$normalizedName];
+            }
+
+            if (! $hasNamespace && isset($env->marker)) {
+                if (! empty($env->store[$specialContentKey])) {
+                    $env = $env->store[$specialContentKey]->scope;
+                    continue;
+                }
+
+                if (! empty($env->declarationScopeParent)) {
+                    $env = $env->declarationScopeParent;
+                } else {
+                    $env = $this->rootEnv;
+                }
+                continue;
+            }
+
+            if (isset($env->parentStore)) {
+                $env = $env->parentStore;
+            } elseif (isset($env->parent)) {
+                $env = $env->parent;
+            } else {
+                break;
+            }
+        }
+
+        if ($shouldThrow) {
+            throw $this->error("Undefined variable \$$name" . ($maxDepth <= 0 ? ' (infinite recursion)' : ''));
+        }
+
+        // found nothing
+        return null;
+    }
+
+    /**
+     * Has variable?
+     *
+     * @param string                                $name
+     * @param \ScssPhp\ScssPhp\Compiler\Environment $env
+     *
+     * @return boolean
+     */
+    protected function has($name, Environment $env = null)
+    {
+        return ! \is_null($this->get($name, false, $env));
+    }
+
+    /**
+     * Inject variables
+     *
+     * @param array $args
+     */
+    protected function injectVariables(array $args)
+    {
+        if (empty($args)) {
+            return;
+        }
+
+        $parser = $this->parserFactory(__METHOD__);
+
+        foreach ($args as $name => $strValue) {
+            if ($name[0] === '$') {
+                $name = substr($name, 1);
+            }
+
+            if (! $parser->parseValue($strValue, $value)) {
+                $value = $this->coerceValue($strValue);
+            }
+
+            $this->set($name, $value);
+        }
+    }
+
+    /**
+     * Set variables
+     *
+     * @api
+     *
+     * @param array $variables
+     */
+    public function setVariables(array $variables)
+    {
+        $this->registeredVars = array_merge($this->registeredVars, $variables);
+    }
+
+    /**
+     * Unset variable
+     *
+     * @api
+     *
+     * @param string $name
+     */
+    public function unsetVariable($name)
+    {
+        unset($this->registeredVars[$name]);
+    }
+
+    /**
+     * Returns list of variables
+     *
+     * @api
+     *
+     * @return array
+     */
+    public function getVariables()
+    {
+        return $this->registeredVars;
+    }
+
+    /**
+     * Adds to list of parsed files
+     *
+     * @api
+     *
+     * @param string $path
+     */
+    public function addParsedFile($path)
+    {
+        if (isset($path) && is_file($path)) {
+            $this->parsedFiles[realpath($path)] = filemtime($path);
+        }
+    }
+
+    /**
+     * Returns list of parsed files
+     *
+     * @api
+     *
+     * @return array
+     */
+    public function getParsedFiles()
+    {
+        return $this->parsedFiles;
+    }
+
+    /**
+     * Add import path
+     *
+     * @api
+     *
+     * @param string|callable $path
+     */
+    public function addImportPath($path)
+    {
+        if (! \in_array($path, $this->importPaths)) {
+            $this->importPaths[] = $path;
+        }
+    }
+
+    /**
+     * Set import paths
+     *
+     * @api
+     *
+     * @param string|array $path
+     */
+    public function setImportPaths($path)
+    {
+        $this->importPaths = (array) $path;
+    }
+
+    /**
+     * Set number precision
+     *
+     * @api
+     *
+     * @param integer $numberPrecision
+     *
+     * @deprecated The number precision is not configurable anymore. The default is enough for all browsers.
+     */
+    public function setNumberPrecision($numberPrecision)
+    {
+        @trigger_error('The number precision is not configurable anymore. '
+            . 'The default is enough for all browsers.', E_USER_DEPRECATED);
+    }
+
+    /**
+     * Set formatter
+     *
+     * @api
+     *
+     * @param string $formatterName
+     */
+    public function setFormatter($formatterName)
+    {
+        $this->formatter = $formatterName;
+    }
+
+    /**
+     * Set line number style
+     *
+     * @api
+     *
+     * @param string $lineNumberStyle
+     */
+    public function setLineNumberStyle($lineNumberStyle)
+    {
+        $this->lineNumberStyle = $lineNumberStyle;
+    }
+
+    /**
+     * Enable/disable source maps
+     *
+     * @api
+     *
+     * @param integer $sourceMap
+     */
+    public function setSourceMap($sourceMap)
+    {
+        $this->sourceMap = $sourceMap;
+    }
+
+    /**
+     * Set source map options
+     *
+     * @api
+     *
+     * @param array $sourceMapOptions
+     */
+    public function setSourceMapOptions($sourceMapOptions)
+    {
+        $this->sourceMapOptions = $sourceMapOptions;
+    }
+
+    /**
+     * Register function
+     *
+     * @api
+     *
+     * @param string   $name
+     * @param callable $func
+     * @param array    $prototype
+     */
+    public function registerFunction($name, $func, $prototype = null)
+    {
+        $this->userFunctions[$this->normalizeName($name)] = [$func, $prototype];
+    }
+
+    /**
+     * Unregister function
+     *
+     * @api
+     *
+     * @param string $name
+     */
+    public function unregisterFunction($name)
+    {
+        unset($this->userFunctions[$this->normalizeName($name)]);
+    }
+
+    /**
+     * Add feature
+     *
+     * @api
+     *
+     * @param string $name
+     */
+    public function addFeature($name)
+    {
+        $this->registeredFeatures[$name] = true;
+    }
+
+    /**
+     * Import file
+     *
+     * @param string                                 $path
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $out
+     */
+    protected function importFile($path, OutputBlock $out)
+    {
+        $this->pushCallStack('import ' . $path);
+        // see if tree is cached
+        $realPath = realpath($path);
+
+        if (isset($this->importCache[$realPath])) {
+            $this->handleImportLoop($realPath);
+
+            $tree = $this->importCache[$realPath];
+        } else {
+            $code   = file_get_contents($path);
+            $parser = $this->parserFactory($path);
+            $tree   = $parser->parse($code);
+
+            $this->importCache[$realPath] = $tree;
+        }
+
+        $pi = pathinfo($path);
+
+        array_unshift($this->importPaths, $pi['dirname']);
+        $this->compileChildrenNoReturn($tree->children, $out);
+        array_shift($this->importPaths);
+        $this->popCallStack();
+    }
+
+    /**
+     * Return the file path for an import url if it exists
+     *
+     * @api
+     *
+     * @param string $url
+     *
+     * @return string|null
+     */
+    public function findImport($url)
+    {
+        $urls = [];
+
+        $hasExtension = preg_match('/[.]s?css$/', $url);
+
+        // for "normal" scss imports (ignore vanilla css and external requests)
+        if (! preg_match('~\.css$|^https?://|^//~', $url)) {
+            $isPartial = (strpos(basename($url), '_') === 0);
+
+            // try both normal and the _partial filename
+            $urls = [$url . ($hasExtension ? '' : '.scss')];
+
+            if (! $isPartial) {
+                $urls[] = preg_replace('~[^/]+$~', '_\0', $url) . ($hasExtension ? '' : '.scss');
+            }
+
+            if (! $hasExtension) {
+                $urls[] = "$url/index.scss";
+                // allow to find a plain css file, *if* no scss or partial scss is found
+                $urls[] .= $url . '.css';
+            }
+        }
+
+        foreach ($this->importPaths as $dir) {
+            if (\is_string($dir)) {
+                // check urls for normal import paths
+                foreach ($urls as $full) {
+                    $found = [];
+                    $separator = (
+                        ! empty($dir) &&
+                        substr($dir, -1) !== '/' &&
+                        substr($full, 0, 1) !== '/'
+                    ) ? '/' : '';
+                    $full = $dir . $separator . $full;
+
+                    if (is_file($file = $full)) {
+                        $found[] = $file;
+                    }
+                    if (! $isPartial) {
+                        $full = dirname($full) . '/_' . basename($full);
+                        if (is_file($file = $full)) {
+                            $found[] = $file;
+                        }
+                    }
+                    if ($found) {
+                        if (\count($found) === 1) {
+                            return reset($found);
+                        }
+                        if (\count($found) > 1) {
+                            throw $this->error(
+                                "Error: It's not clear which file to import. Found: " . implode(', ', $found)
+                            );
+                        }
+                    }
+                }
+            } elseif (\is_callable($dir)) {
+                // check custom callback for import path
+                $file = \call_user_func($dir, $url);
+
+                if (! \is_null($file)) {
+                    return $file;
+                }
+            }
+        }
+
+        if ($urls) {
+            if (! $hasExtension || preg_match('/[.]scss$/', $url)) {
+                throw $this->error("`$url` file not found for @import");
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Set encoding
+     *
+     * @api
+     *
+     * @param string $encoding
+     */
+    public function setEncoding($encoding)
+    {
+        $this->encoding = $encoding;
+    }
+
+    /**
+     * Ignore errors?
+     *
+     * @api
+     *
+     * @param boolean $ignoreErrors
+     *
+     * @return \ScssPhp\ScssPhp\Compiler
+     *
+     * @deprecated Ignoring Sass errors is not longer supported.
+     */
+    public function setIgnoreErrors($ignoreErrors)
+    {
+        @trigger_error('Ignoring Sass errors is not longer supported.', E_USER_DEPRECATED);
+
+        return $this;
+    }
+
+    /**
+     * Get source position
+     *
+     * @api
+     *
+     * @return array
+     */
+    public function getSourcePosition()
+    {
+        $sourceFile = isset($this->sourceNames[$this->sourceIndex]) ? $this->sourceNames[$this->sourceIndex] : '';
+
+        return [$sourceFile, $this->sourceLine, $this->sourceColumn];
+    }
+
+    /**
+     * Throw error (exception)
+     *
+     * @api
+     *
+     * @param string $msg Message with optional sprintf()-style vararg parameters
+     *
+     * @throws \ScssPhp\ScssPhp\Exception\CompilerException
+     *
+     * @deprecated use "error" and throw the exception in the caller instead.
+     */
+    public function throwError($msg)
+    {
+        @trigger_error(
+            'The method "throwError" is deprecated. Use "error" and throw the exception in the caller instead',
+            E_USER_DEPRECATED
+        );
+
+        throw $this->error(...func_get_args());
+    }
+
+    /**
+     * Build an error (exception)
+     *
+     * @api
+     *
+     * @param string $msg Message with optional sprintf()-style vararg parameters
+     *
+     * @return CompilerException
+     */
+    public function error($msg, ...$args)
+    {
+        if ($args) {
+            $msg = sprintf($msg, ...$args);
+        }
+
+        if (! $this->ignoreCallStackMessage) {
+            $line   = $this->sourceLine;
+            $column = $this->sourceColumn;
+
+            $loc = isset($this->sourceNames[$this->sourceIndex])
+                ? $this->sourceNames[$this->sourceIndex] . " on line $line, at column $column"
+                : "line: $line, column: $column";
+
+            $msg = "$msg: $loc";
+
+            $callStackMsg = $this->callStackMessage();
+
+            if ($callStackMsg) {
+                $msg .= "\nCall Stack:\n" . $callStackMsg;
+            }
+        }
+
+        return new CompilerException($msg);
+    }
+
+    /**
+     * @param string $functionName
+     * @param array $ExpectedArgs
+     * @param int $nbActual
+     * @return CompilerException
+     */
+    public function errorArgsNumber($functionName, $ExpectedArgs, $nbActual)
+    {
+        $nbExpected = \count($ExpectedArgs);
+
+        if ($nbActual > $nbExpected) {
+            return $this->error(
+                'Error: Only %d arguments allowed in %s(), but %d were passed.',
+                $nbExpected,
+                $functionName,
+                $nbActual
+            );
+        } else {
+            $missing = [];
+
+            while (count($ExpectedArgs) && count($ExpectedArgs) > $nbActual) {
+                array_unshift($missing, array_pop($ExpectedArgs));
+            }
+
+            return $this->error(
+                'Error: %s() argument%s %s missing.',
+                $functionName,
+                count($missing) > 1 ? 's' : '',
+                implode(', ', $missing)
+            );
+        }
+    }
+
+    /**
+     * Beautify call stack for output
+     *
+     * @param boolean $all
+     * @param null    $limit
+     *
+     * @return string
+     */
+    protected function callStackMessage($all = false, $limit = null)
+    {
+        $callStackMsg = [];
+        $ncall = 0;
+
+        if ($this->callStack) {
+            foreach (array_reverse($this->callStack) as $call) {
+                if ($all || (isset($call['n']) && $call['n'])) {
+                    $msg = '#' . $ncall++ . ' ' . $call['n'] . ' ';
+                    $msg .= (isset($this->sourceNames[$call[Parser::SOURCE_INDEX]])
+                          ? $this->sourceNames[$call[Parser::SOURCE_INDEX]]
+                          : '(unknown file)');
+                    $msg .= ' on line ' . $call[Parser::SOURCE_LINE];
+
+                    $callStackMsg[] = $msg;
+
+                    if (! \is_null($limit) && $ncall > $limit) {
+                        break;
+                    }
+                }
+            }
+        }
+
+        return implode("\n", $callStackMsg);
+    }
+
+    /**
+     * Handle import loop
+     *
+     * @param string $name
+     *
+     * @throws \Exception
+     */
+    protected function handleImportLoop($name)
+    {
+        for ($env = $this->env; $env; $env = $env->parent) {
+            if (! $env->block) {
+                continue;
+            }
+
+            $file = $this->sourceNames[$env->block->sourceIndex];
+
+            if (realpath($file) === $name) {
+                throw $this->error('An @import loop has been found: %s imports %s', $file, basename($file));
+            }
+        }
+    }
+
+    /**
+     * Call SCSS @function
+     *
+     * @param Object $func
+     * @param array  $argValues
+     *
+     * @return array $returnValue
+     */
+    protected function callScssFunction($func, $argValues)
+    {
+        if (! $func) {
+            return static::$defaultValue;
+        }
+        $name = $func->name;
+
+        $this->pushEnv();
+
+        // set the args
+        if (isset($func->args)) {
+            $this->applyArguments($func->args, $argValues);
+        }
+
+        // throw away lines and children
+        $tmp = new OutputBlock();
+        $tmp->lines    = [];
+        $tmp->children = [];
+
+        $this->env->marker = 'function';
+
+        if (! empty($func->parentEnv)) {
+            $this->env->declarationScopeParent = $func->parentEnv;
+        } else {
+            throw $this->error("@function $name() without parentEnv");
+        }
+
+        $ret = $this->compileChildren($func->children, $tmp, $this->env->marker . ' ' . $name);
+
+        $this->popEnv();
+
+        return ! isset($ret) ? static::$defaultValue : $ret;
+    }
+
+    /**
+     * Call built-in and registered (PHP) functions
+     *
+     * @param string $name
+     * @param string|array $function
+     * @param array  $prototype
+     * @param array  $args
+     *
+     * @return array
+     */
+    protected function callNativeFunction($name, $function, $prototype, $args)
+    {
+        $libName = (is_array($function) ? end($function) : null);
+        $sorted_kwargs = $this->sortNativeFunctionArgs($libName, $prototype, $args);
+
+        if (\is_null($sorted_kwargs)) {
+            return null;
+        }
+        @list($sorted, $kwargs) = $sorted_kwargs;
+
+        if ($name !== 'if' && $name !== 'call') {
+            $inExp = true;
+
+            if ($name === 'join') {
+                $inExp = false;
+            }
+
+            foreach ($sorted as &$val) {
+                $val = $this->reduce($val, $inExp);
+            }
+        }
+
+        $returnValue = \call_user_func($function, $sorted, $kwargs);
+
+        if (! isset($returnValue)) {
+            return null;
+        }
+
+        return $this->coerceValue($returnValue);
+    }
+
+    /**
+     * Get built-in function
+     *
+     * @param string $name Normalized name
+     *
+     * @return array
+     */
+    protected function getBuiltinFunction($name)
+    {
+        $libName = self::normalizeNativeFunctionName($name);
+        return [$this, $libName];
+    }
+
+    /**
+     * Normalize native function name
+     * @param $name
+     * @return string
+     */
+    public static function normalizeNativeFunctionName($name)
+    {
+        $name = str_replace("-", "_", $name);
+        $libName = 'lib' . preg_replace_callback(
+            '/_(.)/',
+            function ($m) {
+                return ucfirst($m[1]);
+            },
+            ucfirst($name)
+        );
+        return $libName;
+    }
+
+    /**
+     * Check if a function is a native built-in scss function, for css parsing
+     * @param $name
+     * @return bool
+     */
+    public static function isNativeFunction($name)
+    {
+        return method_exists(Compiler::class, self::normalizeNativeFunctionName($name));
+    }
+
+    /**
+     * Sorts keyword arguments
+     *
+     * @param string $functionName
+     * @param array  $prototypes
+     * @param array  $args
+     *
+     * @return array|null
+     */
+    protected function sortNativeFunctionArgs($functionName, $prototypes, $args)
+    {
+        static $parser = null;
+
+        if (! isset($prototypes)) {
+            $keyArgs = [];
+            $posArgs = [];
+
+            if (\is_array($args) && \count($args) && \end($args) === static::$null) {
+                array_pop($args);
+            }
+
+            // separate positional and keyword arguments
+            foreach ($args as $arg) {
+                list($key, $value) = $arg;
+
+                if (empty($key) or empty($key[1])) {
+                    $posArgs[] = empty($arg[2]) ? $value : $arg;
+                } else {
+                    $keyArgs[$key[1]] = $value;
+                }
+            }
+
+            return [$posArgs, $keyArgs];
+        }
+
+        // specific cases ?
+        if (\in_array($functionName, ['libRgb', 'libRgba', 'libHsl', 'libHsla'])) {
+            // notation 100 127 255 / 0 is in fact a simple list of 4 values
+            foreach ($args as $k => $arg) {
+                if ($arg[1][0] === Type::T_LIST && \count($arg[1][2]) === 3) {
+                    $last = end($arg[1][2]);
+
+                    if ($last[0] === Type::T_EXPRESSION && $last[1] === '/') {
+                        array_pop($arg[1][2]);
+                        $arg[1][2][] = $last[2];
+                        $arg[1][2][] = $last[3];
+                        $args[$k] = $arg;
+                    }
+                }
+            }
+        }
+
+        $finalArgs = [];
+
+        if (! \is_array(reset($prototypes))) {
+            $prototypes = [$prototypes];
+        }
+
+        $keyArgs = [];
+
+        // trying each prototypes
+        $prototypeHasMatch = false;
+        $exceptionMessage = '';
+
+        foreach ($prototypes as $prototype) {
+            $argDef = [];
+
+            foreach ($prototype as $i => $p) {
+                $default = null;
+                $p       = explode(':', $p, 2);
+                $name    = array_shift($p);
+
+                if (\count($p)) {
+                    $p = trim(reset($p));
+
+                    if ($p === 'null') {
+                        // differentiate this null from the static::$null
+                        $default = [Type::T_KEYWORD, 'null'];
+                    } else {
+                        if (\is_null($parser)) {
+                            $parser = $this->parserFactory(__METHOD__);
+                        }
+
+                        $parser->parseValue($p, $default);
+                    }
+                }
+
+                $isVariable = false;
+
+                if (substr($name, -3) === '...') {
+                    $isVariable = true;
+                    $name = substr($name, 0, -3);
+                }
+
+                $argDef[] = [$name, $default, $isVariable];
+            }
+
+            $ignoreCallStackMessage = $this->ignoreCallStackMessage;
+            $this->ignoreCallStackMessage = true;
+
+            try {
+                if (\count($args) > \count($argDef)) {
+                    $lastDef = end($argDef);
+
+                    // check that last arg is not a ...
+                    if (empty($lastDef[2])) {
+                        throw $this->errorArgsNumber($functionName, $argDef, \count($args));
+                    }
+                }
+                $vars = $this->applyArguments($argDef, $args, false, false);
+
+                // ensure all args are populated
+                foreach ($prototype as $i => $p) {
+                    $name = explode(':', $p)[0];
+
+                    if (! isset($finalArgs[$i])) {
+                        $finalArgs[$i] = null;
+                    }
+                }
+
+                // apply positional args
+                foreach (array_values($vars) as $i => $val) {
+                    $finalArgs[$i] = $val;
+                }
+
+                $keyArgs = array_merge($keyArgs, $vars);
+                $prototypeHasMatch = true;
+
+                // overwrite positional args with keyword args
+                foreach ($prototype as $i => $p) {
+                    $name = explode(':', $p)[0];
+
+                    if (isset($keyArgs[$name])) {
+                        $finalArgs[$i] = $keyArgs[$name];
+                    }
+
+                    // special null value as default: translate to real null here
+                    if ($finalArgs[$i] === [Type::T_KEYWORD, 'null']) {
+                        $finalArgs[$i] = null;
+                    }
+                }
+                // should we break if this prototype seems fulfilled?
+            } catch (CompilerException $e) {
+                $exceptionMessage = $e->getMessage();
+            }
+            $this->ignoreCallStackMessage = $ignoreCallStackMessage;
+        }
+
+        if ($exceptionMessage && ! $prototypeHasMatch) {
+            if (\in_array($functionName, ['libRgb', 'libRgba', 'libHsl', 'libHsla'])) {
+                // if var() or calc() is used as an argument, return as a css function
+                foreach ($args as $arg) {
+                    if ($arg[1][0] === Type::T_FUNCTION_CALL && in_array($arg[1][1], ['var'])) {
+                        return null;
+                    }
+                }
+            }
+
+            throw $this->error($exceptionMessage);
+        }
+
+        return [$finalArgs, $keyArgs];
+    }
+
+    /**
+     * Apply argument values per definition
+     *
+     * @param array   $argDef
+     * @param array   $argValues
+     * @param boolean $storeInEnv
+     * @param boolean $reduce
+     *   only used if $storeInEnv = false
+     *
+     * @return array
+     *
+     * @throws \Exception
+     */
+    protected function applyArguments($argDef, $argValues, $storeInEnv = true, $reduce = true)
+    {
+        $output = [];
+
+        if (\is_array($argValues) && \count($argValues) && end($argValues) === static::$null) {
+            array_pop($argValues);
+        }
+
+        if ($storeInEnv) {
+            $storeEnv = $this->getStoreEnv();
+
+            $env = new Environment();
+            $env->store = $storeEnv->store;
+        }
+
+        $hasVariable = false;
+        $args = [];
+
+        foreach ($argDef as $i => $arg) {
+            list($name, $default, $isVariable) = $argDef[$i];
+
+            $args[$name] = [$i, $name, $default, $isVariable];
+            $hasVariable |= $isVariable;
+        }
+
+        $splatSeparator      = null;
+        $keywordArgs         = [];
+        $deferredKeywordArgs = [];
+        $deferredNamedKeywordArgs = [];
+        $remaining           = [];
+        $hasKeywordArgument  = false;
+
+        // assign the keyword args
+        foreach ((array) $argValues as $arg) {
+            if (! empty($arg[0])) {
+                $hasKeywordArgument = true;
+
+                $name = $arg[0][1];
+
+                if (! isset($args[$name])) {
+                    foreach (array_keys($args) as $an) {
+                        if (str_replace('_', '-', $an) === str_replace('_', '-', $name)) {
+                            $name = $an;
+                            break;
+                        }
+                    }
+                }
+
+                if (! isset($args[$name]) || $args[$name][3]) {
+                    if ($hasVariable) {
+                        $deferredNamedKeywordArgs[$name] = $arg[1];
+                    } else {
+                        throw $this->error("Mixin or function doesn't have an argument named $%s.", $arg[0][1]);
+                    }
+                } elseif ($args[$name][0] < \count($remaining)) {
+                    throw $this->error("The argument $%s was passed both by position and by name.", $arg[0][1]);
+                } else {
+                    $keywordArgs[$name] = $arg[1];
+                }
+            } elseif (! empty($arg[2])) {
+                // $arg[2] means a var followed by ... in the arg ($list... )
+                $val = $this->reduce($arg[1], true);
+
+                if ($val[0] === Type::T_LIST) {
+                    foreach ($val[2] as $name => $item) {
+                        if (! is_numeric($name)) {
+                            if (! isset($args[$name])) {
+                                foreach (array_keys($args) as $an) {
+                                    if (str_replace('_', '-', $an) === str_replace('_', '-', $name)) {
+                                        $name = $an;
+                                        break;
+                                    }
+                                }
+                            }
+
+                            if ($hasVariable) {
+                                $deferredKeywordArgs[$name] = $item;
+                            } else {
+                                $keywordArgs[$name] = $item;
+                            }
+                        } else {
+                            if (\is_null($splatSeparator)) {
+                                $splatSeparator = $val[1];
+                            }
+
+                            $remaining[] = $item;
+                        }
+                    }
+                } elseif ($val[0] === Type::T_MAP) {
+                    foreach ($val[1] as $i => $name) {
+                        $name = $this->compileStringContent($this->coerceString($name));
+                        $item = $val[2][$i];
+
+                        if (! is_numeric($name)) {
+                            if (! isset($args[$name])) {
+                                foreach (array_keys($args) as $an) {
+                                    if (str_replace('_', '-', $an) === str_replace('_', '-', $name)) {
+                                        $name = $an;
+                                        break;
+                                    }
+                                }
+                            }
+
+                            if ($hasVariable) {
+                                $deferredKeywordArgs[$name] = $item;
+                            } else {
+                                $keywordArgs[$name] = $item;
+                            }
+                        } else {
+                            if (\is_null($splatSeparator)) {
+                                $splatSeparator = $val[1];
+                            }
+
+                            $remaining[] = $item;
+                        }
+                    }
+                } else {
+                    $remaining[] = $val;
+                }
+            } elseif ($hasKeywordArgument) {
+                throw $this->error('Positional arguments must come before keyword arguments.');
+            } else {
+                $remaining[] = $arg[1];
+            }
+        }
+
+        foreach ($args as $arg) {
+            list($i, $name, $default, $isVariable) = $arg;
+
+            if ($isVariable) {
+                // only if more than one arg : can not be passed as position and value
+                // see https://github.com/sass/libsass/issues/2927
+                if (count($args) > 1) {
+                    if (isset($remaining[$i]) && isset($deferredNamedKeywordArgs[$name])) {
+                        throw $this->error("The argument $%s was passed both by position and by name.", $name);
+                    }
+                }
+
+                $val = [Type::T_LIST, \is_null($splatSeparator) ? ',' : $splatSeparator , [], $isVariable];
+
+                for ($count = \count($remaining); $i < $count; $i++) {
+                    $val[2][] = $remaining[$i];
+                }
+
+                foreach ($deferredKeywordArgs as $itemName => $item) {
+                    $val[2][$itemName] = $item;
+                }
+
+                foreach ($deferredNamedKeywordArgs as $itemName => $item) {
+                    $val[2][$itemName] = $item;
+                }
+            } elseif (isset($remaining[$i])) {
+                $val = $remaining[$i];
+            } elseif (isset($keywordArgs[$name])) {
+                $val = $keywordArgs[$name];
+            } elseif (! empty($default)) {
+                continue;
+            } else {
+                throw $this->error("Missing argument $name");
+            }
+
+            if ($storeInEnv) {
+                $this->set($name, $this->reduce($val, true), true, $env);
+            } else {
+                $output[$name] = ($reduce ? $this->reduce($val, true) : $val);
+            }
+        }
+
+        if ($storeInEnv) {
+            $storeEnv->store = $env->store;
+        }
+
+        foreach ($args as $arg) {
+            list($i, $name, $default, $isVariable) = $arg;
+
+            if ($isVariable || isset($remaining[$i]) || isset($keywordArgs[$name]) || empty($default)) {
+                continue;
+            }
+
+            if ($storeInEnv) {
+                $this->set($name, $this->reduce($default, true), true);
+            } else {
+                $output[$name] = ($reduce ? $this->reduce($default, true) : $default);
+            }
+        }
+
+        return $output;
+    }
+
+    /**
+     * Coerce a php value into a scss one
+     *
+     * @param mixed $value
+     *
+     * @return array|\ScssPhp\ScssPhp\Node\Number
+     */
+    protected function coerceValue($value)
+    {
+        if (\is_array($value) || $value instanceof \ArrayAccess) {
+            return $value;
+        }
+
+        if (\is_bool($value)) {
+            return $this->toBool($value);
+        }
+
+        if (\is_null($value)) {
+            return static::$null;
+        }
+
+        if (is_numeric($value)) {
+            return new Node\Number($value, '');
+        }
+
+        if ($value === '') {
+            return static::$emptyString;
+        }
+
+        $value = [Type::T_KEYWORD, $value];
+        $color = $this->coerceColor($value);
+
+        if ($color) {
+            return $color;
+        }
+
+        return $value;
+    }
+
+    /**
+     * Coerce something to map
+     *
+     * @param array $item
+     *
+     * @return array
+     */
+    protected function coerceMap($item)
+    {
+        if ($item[0] === Type::T_MAP) {
+            return $item;
+        }
+
+        if (
+            $item[0] === static::$emptyList[0] &&
+            $item[1] === static::$emptyList[1] &&
+            $item[2] === static::$emptyList[2]
+        ) {
+            return static::$emptyMap;
+        }
+
+        return $item;
+    }
+
+    /**
+     * Coerce something to list
+     *
+     * @param array   $item
+     * @param string  $delim
+     * @param boolean $removeTrailingNull
+     *
+     * @return array
+     */
+    protected function coerceList($item, $delim = ',', $removeTrailingNull = false)
+    {
+        if (isset($item) && $item[0] === Type::T_LIST) {
+            // remove trailing null from the list
+            if ($removeTrailingNull && end($item[2]) === static::$null) {
+                array_pop($item[2]);
+            }
+
+            return $item;
+        }
+
+        if (isset($item) && $item[0] === Type::T_MAP) {
+            $keys = $item[1];
+            $values = $item[2];
+            $list = [];
+
+            for ($i = 0, $s = \count($keys); $i < $s; $i++) {
+                $key = $keys[$i];
+                $value = $values[$i];
+
+                switch ($key[0]) {
+                    case Type::T_LIST:
+                    case Type::T_MAP:
+                    case Type::T_STRING:
+                    case Type::T_NULL:
+                        break;
+
+                    default:
+                        $key = [Type::T_KEYWORD, $this->compileStringContent($this->coerceString($key))];
+                        break;
+                }
+
+                $list[] = [
+                    Type::T_LIST,
+                    '',
+                    [$key, $value]
+                ];
+            }
+
+            return [Type::T_LIST, ',', $list];
+        }
+
+        return [Type::T_LIST, $delim, ! isset($item) ? [] : [$item]];
+    }
+
+    /**
+     * Coerce color for expression
+     *
+     * @param array $value
+     *
+     * @return array|null
+     */
+    protected function coerceForExpression($value)
+    {
+        if ($color = $this->coerceColor($value)) {
+            return $color;
+        }
+
+        return $value;
+    }
+
+    /**
+     * Coerce value to color
+     *
+     * @param array $value
+     *
+     * @return array|null
+     */
+    protected function coerceColor($value, $inRGBFunction = false)
+    {
+        switch ($value[0]) {
+            case Type::T_COLOR:
+                for ($i = 1; $i <= 3; $i++) {
+                    if (! is_numeric($value[$i])) {
+                        $cv = $this->compileRGBAValue($value[$i]);
+
+                        if (! is_numeric($cv)) {
+                            return null;
+                        }
+
+                        $value[$i] = $cv;
+                    }
+
+                    if (isset($value[4])) {
+                        if (! is_numeric($value[4])) {
+                            $cv = $this->compileRGBAValue($value[4], true);
+
+                            if (! is_numeric($cv)) {
+                                return null;
+                            }
+
+                            $value[4] = $cv;
+                        }
+                    }
+                }
+
+                return $value;
+
+            case Type::T_LIST:
+                if ($inRGBFunction) {
+                    if (\count($value[2]) == 3 || \count($value[2]) == 4) {
+                        $color = $value[2];
+                        array_unshift($color, Type::T_COLOR);
+
+                        return $this->coerceColor($color);
+                    }
+                }
+
+                return null;
+
+            case Type::T_KEYWORD:
+                if (! \is_string($value[1])) {
+                    return null;
+                }
+
+                $name = strtolower($value[1]);
+
+                // hexa color?
+                if (preg_match('/^#([0-9a-f]+)$/i', $name, $m)) {
+                    $nofValues = \strlen($m[1]);
+
+                    if (\in_array($nofValues, [3, 4, 6, 8])) {
+                        $nbChannels = 3;
+                        $color      = [];
+                        $num        = hexdec($m[1]);
+
+                        switch ($nofValues) {
+                            case 4:
+                                $nbChannels = 4;
+                                // then continuing with the case 3:
+                            case 3:
+                                for ($i = 0; $i < $nbChannels; $i++) {
+                                    $t = $num & 0xf;
+                                    array_unshift($color, $t << 4 | $t);
+                                    $num >>= 4;
+                                }
+
+                                break;
+
+                            case 8:
+                                $nbChannels = 4;
+                                // then continuing with the case 6:
+                            case 6:
+                                for ($i = 0; $i < $nbChannels; $i++) {
+                                    array_unshift($color, $num & 0xff);
+                                    $num >>= 8;
+                                }
+
+                                break;
+                        }
+
+                        if ($nbChannels === 4) {
+                            if ($color[3] === 255) {
+                                $color[3] = 1; // fully opaque
+                            } else {
+                                $color[3] = round($color[3] / 255, Node\Number::PRECISION);
+                            }
+                        }
+
+                        array_unshift($color, Type::T_COLOR);
+
+                        return $color;
+                    }
+                }
+
+                if ($rgba = Colors::colorNameToRGBa($name)) {
+                    return isset($rgba[3])
+                        ? [Type::T_COLOR, $rgba[0], $rgba[1], $rgba[2], $rgba[3]]
+                        : [Type::T_COLOR, $rgba[0], $rgba[1], $rgba[2]];
+                }
+
+                return null;
+        }
+
+        return null;
+    }
+
+    /**
+     * @param integer|\ScssPhp\ScssPhp\Node\Number $value
+     * @param boolean                              $isAlpha
+     *
+     * @return integer|mixed
+     */
+    protected function compileRGBAValue($value, $isAlpha = false)
+    {
+        if ($isAlpha) {
+            return $this->compileColorPartValue($value, 0, 1, false);
+        }
+
+        return $this->compileColorPartValue($value, 0, 255, true);
+    }
+
+    /**
+     * @param mixed         $value
+     * @param integer|float $min
+     * @param integer|float $max
+     * @param boolean       $isInt
+     * @param boolean       $clamp
+     * @param boolean       $modulo
+     *
+     * @return integer|mixed
+     */
+    protected function compileColorPartValue($value, $min, $max, $isInt = true, $clamp = true, $modulo = false)
+    {
+        if (! is_numeric($value)) {
+            if (\is_array($value)) {
+                $reduced = $this->reduce($value);
+
+                if (\is_object($reduced) && $value->type === Type::T_NUMBER) {
+                    $value = $reduced;
+                }
+            }
+
+            if (\is_object($value) && $value->type === Type::T_NUMBER) {
+                $num = $value->dimension;
+
+                if (\count($value->units)) {
+                    $unit = array_keys($value->units);
+                    $unit = reset($unit);
+
+                    switch ($unit) {
+                        case '%':
+                            $num *= $max / 100;
+                            break;
+                        default:
+                            break;
+                    }
+                }
+
+                $value = $num;
+            } elseif (\is_array($value)) {
+                $value = $this->compileValue($value);
+            }
+        }
+
+        if (is_numeric($value)) {
+            if ($isInt) {
+                $value = round($value);
+            }
+
+            if ($clamp) {
+                $value = min($max, max($min, $value));
+            }
+
+            if ($modulo) {
+                $value = $value % $max;
+
+                // still negative?
+                while ($value < $min) {
+                    $value += $max;
+                }
+            }
+
+            return $value;
+        }
+
+        return $value;
+    }
+
+    /**
+     * Coerce value to string
+     *
+     * @param array $value
+     *
+     * @return array|null
+     */
+    protected function coerceString($value)
+    {
+        if ($value[0] === Type::T_STRING) {
+            return $value;
+        }
+
+        return [Type::T_STRING, '', [$this->compileValue($value)]];
+    }
+
+    /**
+     * Assert value is a string (or keyword)
+     *
+     * @api
+     *
+     * @param array $value
+     * @param string $varName
+     *
+     * @return array
+     *
+     * @throws \Exception
+     */
+    public function assertString($value, $varName = null)
+    {
+        // case of url(...) parsed a a function
+        if ($value[0] === Type::T_FUNCTION) {
+            $value = $this->coerceString($value);
+        }
+
+        if (! \in_array($value[0], [Type::T_STRING, Type::T_KEYWORD])) {
+            $value = $this->compileValue($value);
+            $var_display = ($varName ? " \${$varName}:" : '');
+            throw $this->error("Error:{$var_display} $value is not a string.");
+        }
+
+        $value = $this->coerceString($value);
+
+        return $value;
+    }
+
+    /**
+     * Coerce value to a percentage
+     *
+     * @param array $value
+     *
+     * @return integer|float
+     */
+    protected function coercePercent($value)
+    {
+        if ($value[0] === Type::T_NUMBER) {
+            if (! empty($value[2]['%'])) {
+                return $value[1] / 100;
+            }
+
+            return $value[1];
+        }
+
+        return 0;
+    }
+
+    /**
+     * Assert value is a map
+     *
+     * @api
+     *
+     * @param array $value
+     *
+     * @return array
+     *
+     * @throws \Exception
+     */
+    public function assertMap($value)
+    {
+        $value = $this->coerceMap($value);
+
+        if ($value[0] !== Type::T_MAP) {
+            throw $this->error('expecting map, %s received', $value[0]);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Assert value is a list
+     *
+     * @api
+     *
+     * @param array $value
+     *
+     * @return array
+     *
+     * @throws \Exception
+     */
+    public function assertList($value)
+    {
+        if ($value[0] !== Type::T_LIST) {
+            throw $this->error('expecting list, %s received', $value[0]);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Assert value is a color
+     *
+     * @api
+     *
+     * @param array $value
+     *
+     * @return array
+     *
+     * @throws \Exception
+     */
+    public function assertColor($value)
+    {
+        if ($color = $this->coerceColor($value)) {
+            return $color;
+        }
+
+        throw $this->error('expecting color, %s received', $value[0]);
+    }
+
+    /**
+     * Assert value is a number
+     *
+     * @api
+     *
+     * @param array $value
+     * @param string $varName
+     *
+     * @return integer|float
+     *
+     * @throws \Exception
+     */
+    public function assertNumber($value, $varName = null)
+    {
+        if ($value[0] !== Type::T_NUMBER) {
+            $value = $this->compileValue($value);
+            $var_display = ($varName ? " \${$varName}:" : '');
+            throw $this->error("Error:{$var_display} $value is not a number.");
+        }
+
+        return $value[1];
+    }
+
+    /**
+     * Assert value is a integer
+     *
+     * @api
+     *
+     * @param array $value
+     * @param string $varName
+     *
+     * @return integer|float
+     *
+     * @throws \Exception
+     */
+    public function assertInteger($value, $varName = null)
+    {
+
+        $value = $this->assertNumber($value, $varName);
+        if (round($value - \intval($value), Node\Number::PRECISION) > 0) {
+            $var_display = ($varName ? " \${$varName}:" : '');
+            throw $this->error("Error:{$var_display} $value is not an integer.");
+        }
+
+        return intval($value);
+    }
+
+
+    /**
+     * Make sure a color's components don't go out of bounds
+     *
+     * @param array $c
+     *
+     * @return array
+     */
+    protected function fixColor($c)
+    {
+        foreach ([1, 2, 3] as $i) {
+            if ($c[$i] < 0) {
+                $c[$i] = 0;
+            }
+
+            if ($c[$i] > 255) {
+                $c[$i] = 255;
+            }
+        }
+
+        return $c;
+    }
+
+    /**
+     * Convert RGB to HSL
+     *
+     * @api
+     *
+     * @param integer $red
+     * @param integer $green
+     * @param integer $blue
+     *
+     * @return array
+     */
+    public function toHSL($red, $green, $blue)
+    {
+        $min = min($red, $green, $blue);
+        $max = max($red, $green, $blue);
+
+        $l = $min + $max;
+        $d = $max - $min;
+
+        if ((int) $d === 0) {
+            $h = $s = 0;
+        } else {
+            if ($l < 255) {
+                $s = $d / $l;
+            } else {
+                $s = $d / (510 - $l);
+            }
+
+            if ($red == $max) {
+                $h = 60 * ($green - $blue) / $d;
+            } elseif ($green == $max) {
+                $h = 60 * ($blue - $red) / $d + 120;
+            } elseif ($blue == $max) {
+                $h = 60 * ($red - $green) / $d + 240;
+            }
+        }
+
+        return [Type::T_HSL, fmod($h, 360), $s * 100, $l / 5.1];
+    }
+
+    /**
+     * Hue to RGB helper
+     *
+     * @param float $m1
+     * @param float $m2
+     * @param float $h
+     *
+     * @return float
+     */
+    protected function hueToRGB($m1, $m2, $h)
+    {
+        if ($h < 0) {
+            $h += 1;
+        } elseif ($h > 1) {
+            $h -= 1;
+        }
+
+        if ($h * 6 < 1) {
+            return $m1 + ($m2 - $m1) * $h * 6;
+        }
+
+        if ($h * 2 < 1) {
+            return $m2;
+        }
+
+        if ($h * 3 < 2) {
+            return $m1 + ($m2 - $m1) * (2 / 3 - $h) * 6;
+        }
+
+        return $m1;
+    }
+
+    /**
+     * Convert HSL to RGB
+     *
+     * @api
+     *
+     * @param integer $hue        H from 0 to 360
+     * @param integer $saturation S from 0 to 100
+     * @param integer $lightness  L from 0 to 100
+     *
+     * @return array
+     */
+    public function toRGB($hue, $saturation, $lightness)
+    {
+        if ($hue < 0) {
+            $hue += 360;
+        }
+
+        $h = $hue / 360;
+        $s = min(100, max(0, $saturation)) / 100;
+        $l = min(100, max(0, $lightness)) / 100;
+
+        $m2 = $l <= 0.5 ? $l * ($s + 1) : $l + $s - $l * $s;
+        $m1 = $l * 2 - $m2;
+
+        $r = $this->hueToRGB($m1, $m2, $h + 1 / 3) * 255;
+        $g = $this->hueToRGB($m1, $m2, $h) * 255;
+        $b = $this->hueToRGB($m1, $m2, $h - 1 / 3) * 255;
+
+        $out = [Type::T_COLOR, $r, $g, $b];
+
+        return $out;
+    }
+
+    // Built in functions
+
+    protected static $libCall = ['function', 'args...'];
+    protected function libCall($args, $kwargs)
+    {
+        $functionReference = $this->reduce(array_shift($args), true);
+
+        if (in_array($functionReference[0], [Type::T_STRING, Type::T_KEYWORD])) {
+            $name = $this->compileStringContent($this->coerceString($this->reduce($functionReference, true)));
+            $warning = "DEPRECATION WARNING: Passing a string to call() is deprecated and will be illegal\n"
+                . "in Sass 4.0. Use call(function-reference($name)) instead.";
+            fwrite($this->stderr, "$warning\n\n");
+            $functionReference = $this->libGetFunction([$functionReference]);
+        }
+
+        if ($functionReference === static::$null) {
+            return static::$null;
+        }
+
+        if (! in_array($functionReference[0], [Type::T_FUNCTION_REFERENCE, Type::T_FUNCTION])) {
+            throw $this->error('Function reference expected, got ' . $functionReference[0]);
+        }
+
+        $callArgs = [];
+
+        // $kwargs['args'] is [Type::T_LIST, ',', [..]]
+        foreach ($kwargs['args'][2] as $varname => $arg) {
+            if (is_numeric($varname)) {
+                $varname = null;
+            } else {
+                $varname = [ 'var', $varname];
+            }
+
+            $callArgs[] = [$varname, $arg, false];
+        }
+
+        return $this->reduce([Type::T_FUNCTION_CALL, $functionReference, $callArgs]);
+    }
+
+
+    protected static $libGetFunction = [
+        ['name'],
+        ['name', 'css']
+    ];
+    protected function libGetFunction($args)
+    {
+        $name = $this->compileStringContent($this->coerceString($this->reduce(array_shift($args), true)));
+        $isCss = false;
+
+        if (count($args)) {
+            $isCss = $this->reduce(array_shift($args), true);
+            $isCss = (($isCss === static::$true) ? true : false);
+        }
+
+        if ($isCss) {
+            return [Type::T_FUNCTION, $name, [Type::T_LIST, ',', []]];
+        }
+
+        return $this->getFunctionReference($name, true);
+    }
+
+    protected static $libIf = ['condition', 'if-true', 'if-false:'];
+    protected function libIf($args)
+    {
+        list($cond, $t, $f) = $args;
+
+        if (! $this->isTruthy($this->reduce($cond, true))) {
+            return $this->reduce($f, true);
+        }
+
+        return $this->reduce($t, true);
+    }
+
+    protected static $libIndex = ['list', 'value'];
+    protected function libIndex($args)
+    {
+        list($list, $value) = $args;
+
+        if (
+            $list[0] === Type::T_MAP ||
+            $list[0] === Type::T_STRING ||
+            $list[0] === Type::T_KEYWORD ||
+            $list[0] === Type::T_INTERPOLATE
+        ) {
+            $list = $this->coerceList($list, ' ');
+        }
+
+        if ($list[0] !== Type::T_LIST) {
+            return static::$null;
+        }
+
+        $values = [];
+
+        foreach ($list[2] as $item) {
+            $values[] = $this->normalizeValue($item);
+        }
+
+        $key = array_search($this->normalizeValue($value), $values);
+
+        return false === $key ? static::$null : $key + 1;
+    }
+
+    protected static $libRgb = [
+        ['color'],
+        ['color', 'alpha'],
+        ['channels'],
+        ['red', 'green', 'blue'],
+        ['red', 'green', 'blue', 'alpha'] ];
+    protected function libRgb($args, $kwargs, $funcName = 'rgb')
+    {
+        switch (\count($args)) {
+            case 1:
+                if (! $color = $this->coerceColor($args[0], true)) {
+                    $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ')']];
+                }
+                break;
+
+            case 3:
+                $color = [Type::T_COLOR, $args[0], $args[1], $args[2]];
+
+                if (! $color = $this->coerceColor($color)) {
+                    $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ')']];
+                }
+
+                return $color;
+
+            case 2:
+                if ($color = $this->coerceColor($args[0], true)) {
+                    $alpha = $this->compileRGBAValue($args[1], true);
+
+                    if (is_numeric($alpha)) {
+                        $color[4] = $alpha;
+                    } else {
+                        $color = [Type::T_STRING, '',
+                            [$funcName . '(', $color[1], ', ', $color[2], ', ', $color[3], ', ', $alpha, ')']];
+                    }
+                } else {
+                    $color = [Type::T_STRING, '', [$funcName . '(', $args[0], ')']];
+                }
+                break;
+
+            case 4:
+            default:
+                $color = [Type::T_COLOR, $args[0], $args[1], $args[2], $args[3]];
+
+                if (! $color = $this->coerceColor($color)) {
+                    $color = [Type::T_STRING, '',
+                        [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ', ', $args[3], ')']];
+                }
+                break;
+        }
+
+        return $color;
+    }
+
+    protected static $libRgba = [
+        ['color'],
+        ['color', 'alpha'],
+        ['channels'],
+        ['red', 'green', 'blue'],
+        ['red', 'green', 'blue', 'alpha'] ];
+    protected function libRgba($args, $kwargs)
+    {
+        return $this->libRgb($args, $kwargs, 'rgba');
+    }
+
+    // helper function for adjust_color, change_color, and scale_color
+    protected function alterColor($args, $fn)
+    {
+        $color = $this->assertColor($args[0]);
+
+        foreach ([1 => 1, 2 => 2, 3 => 3, 7 => 4] as $iarg => $irgba) {
+            if (isset($args[$iarg])) {
+                $val = $this->assertNumber($args[$iarg]);
+
+                if (! isset($color[$irgba])) {
+                    $color[$irgba] = (($irgba < 4) ? 0 : 1);
+                }
+
+                $color[$irgba] = \call_user_func($fn, $color[$irgba], $val, $iarg);
+            }
+        }
+
+        if (! empty($args[4]) || ! empty($args[5]) || ! empty($args[6])) {
+            $hsl = $this->toHSL($color[1], $color[2], $color[3]);
+
+            foreach ([4 => 1, 5 => 2, 6 => 3] as $iarg => $ihsl) {
+                if (! empty($args[$iarg])) {
+                    $val = $this->assertNumber($args[$iarg]);
+                    $hsl[$ihsl] = \call_user_func($fn, $hsl[$ihsl], $val, $iarg);
+                }
+            }
+
+            $rgb = $this->toRGB($hsl[1], $hsl[2], $hsl[3]);
+
+            if (isset($color[4])) {
+                $rgb[4] = $color[4];
+            }
+
+            $color = $rgb;
+        }
+
+        return $color;
+    }
+
+    protected static $libAdjustColor = [
+        'color', 'red:null', 'green:null', 'blue:null',
+        'hue:null', 'saturation:null', 'lightness:null', 'alpha:null'
+    ];
+    protected function libAdjustColor($args)
+    {
+        return $this->alterColor($args, function ($base, $alter, $i) {
+            return $base + $alter;
+        });
+    }
+
+    protected static $libChangeColor = [
+        'color', 'red:null', 'green:null', 'blue:null',
+        'hue:null', 'saturation:null', 'lightness:null', 'alpha:null'
+    ];
+    protected function libChangeColor($args)
+    {
+        return $this->alterColor($args, function ($base, $alter, $i) {
+            return $alter;
+        });
+    }
+
+    protected static $libScaleColor = [
+        'color', 'red:null', 'green:null', 'blue:null',
+        'hue:null', 'saturation:null', 'lightness:null', 'alpha:null'
+    ];
+    protected function libScaleColor($args)
+    {
+        return $this->alterColor($args, function ($base, $scale, $i) {
+            // 1, 2, 3 - rgb
+            // 4, 5, 6 - hsl
+            // 7 - a
+            switch ($i) {
+                case 1:
+                case 2:
+                case 3:
+                    $max = 255;
+                    break;
+
+                case 4:
+                    $max = 360;
+                    break;
+
+                case 7:
+                    $max = 1;
+                    break;
+
+                default:
+                    $max = 100;
+            }
+
+            $scale = $scale / 100;
+
+            if ($scale < 0) {
+                return $base * $scale + $base;
+            }
+
+            return ($max - $base) * $scale + $base;
+        });
+    }
+
+    protected static $libIeHexStr = ['color'];
+    protected function libIeHexStr($args)
+    {
+        $color = $this->coerceColor($args[0]);
+
+        if (\is_null($color)) {
+            $this->throwError('Error: argument `$color` of `ie-hex-str($color)` must be a color');
+        }
+
+        $color[4] = isset($color[4]) ? round(255 * $color[4]) : 255;
+
+        return [Type::T_STRING, '', [sprintf('#%02X%02X%02X%02X', $color[4], $color[1], $color[2], $color[3])]];
+    }
+
+    protected static $libRed = ['color'];
+    protected function libRed($args)
+    {
+        $color = $this->coerceColor($args[0]);
+
+        if (\is_null($color)) {
+            $this->throwError('Error: argument `$color` of `red($color)` must be a color');
+        }
+
+        return $color[1];
+    }
+
+    protected static $libGreen = ['color'];
+    protected function libGreen($args)
+    {
+        $color = $this->coerceColor($args[0]);
+
+        if (\is_null($color)) {
+            $this->throwError('Error: argument `$color` of `green($color)` must be a color');
+        }
+
+        return $color[2];
+    }
+
+    protected static $libBlue = ['color'];
+    protected function libBlue($args)
+    {
+        $color = $this->coerceColor($args[0]);
+
+        if (\is_null($color)) {
+            $this->throwError('Error: argument `$color` of `blue($color)` must be a color');
+        }
+
+        return $color[3];
+    }
+
+    protected static $libAlpha = ['color'];
+    protected function libAlpha($args)
+    {
+        if ($color = $this->coerceColor($args[0])) {
+            return isset($color[4]) ? $color[4] : 1;
+        }
+
+        // this might be the IE function, so return value unchanged
+        return null;
+    }
+
+    protected static $libOpacity = ['color'];
+    protected function libOpacity($args)
+    {
+        $value = $args[0];
+
+        if ($value[0] === Type::T_NUMBER) {
+            return null;
+        }
+
+        return $this->libAlpha($args);
+    }
+
+    // mix two colors
+    protected static $libMix = [
+        ['color1', 'color2', 'weight:0.5'],
+        ['color-1', 'color-2', 'weight:0.5']
+        ];
+    protected function libMix($args)
+    {
+        list($first, $second, $weight) = $args;
+
+        $first = $this->assertColor($first);
+        $second = $this->assertColor($second);
+
+        if (! isset($weight)) {
+            $weight = 0.5;
+        } else {
+            $weight = $this->coercePercent($weight);
+        }
+
+        $firstAlpha = isset($first[4]) ? $first[4] : 1;
+        $secondAlpha = isset($second[4]) ? $second[4] : 1;
+
+        $w = $weight * 2 - 1;
+        $a = $firstAlpha - $secondAlpha;
+
+        $w1 = (($w * $a === -1 ? $w : ($w + $a) / (1 + $w * $a)) + 1) / 2.0;
+        $w2 = 1.0 - $w1;
+
+        $new = [Type::T_COLOR,
+            $w1 * $first[1] + $w2 * $second[1],
+            $w1 * $first[2] + $w2 * $second[2],
+            $w1 * $first[3] + $w2 * $second[3],
+        ];
+
+        if ($firstAlpha != 1.0 || $secondAlpha != 1.0) {
+            $new[] = $firstAlpha * $weight + $secondAlpha * (1 - $weight);
+        }
+
+        return $this->fixColor($new);
+    }
+
+    protected static $libHsl = [
+        ['channels'],
+        ['hue', 'saturation', 'lightness'],
+        ['hue', 'saturation', 'lightness', 'alpha'] ];
+    protected function libHsl($args, $kwargs, $funcName = 'hsl')
+    {
+        $args_to_check = $args;
+
+        if (\count($args) == 1) {
+            if ($args[0][0] !== Type::T_LIST || \count($args[0][2]) < 3 || \count($args[0][2]) > 4) {
+                return [Type::T_STRING, '', [$funcName . '(', $args[0], ')']];
+            }
+
+            $args = $args[0][2];
+            $args_to_check = $kwargs['channels'][2];
+        }
+
+        $hue = $this->compileColorPartValue($args[0], 0, 360, false, false, true);
+        $saturation = $this->compileColorPartValue($args[1], 0, 100, false);
+        $lightness = $this->compileColorPartValue($args[2], 0, 100, false);
+
+        foreach ($kwargs as $k => $arg) {
+            if (in_array($arg[0], [Type::T_FUNCTION_CALL]) && in_array($arg[1], ['min', 'max'])) {
+                return null;
+            }
+        }
+
+        foreach ($args_to_check as $k => $arg) {
+            if (in_array($arg[0], [Type::T_FUNCTION_CALL]) && in_array($arg[1], ['min', 'max'])) {
+                if (count($kwargs) > 1 || ($k >= 2 && count($args) === 4)) {
+                    return null;
+                }
+
+                $args[$k] = $this->stringifyFncallArgs($arg);
+                $hue = '';
+            }
+
+            if (
+                $k >= 2 && count($args) === 4 &&
+                in_array($arg[0], [Type::T_FUNCTION_CALL, Type::T_FUNCTION]) &&
+                in_array($arg[1], ['calc','env'])
+            ) {
+                return null;
+            }
+        }
+
+        $alpha = null;
+
+        if (\count($args) === 4) {
+            $alpha = $this->compileColorPartValue($args[3], 0, 100, false);
+
+            if (! is_numeric($hue) || ! is_numeric($saturation) || ! is_numeric($lightness) || ! is_numeric($alpha)) {
+                return [Type::T_STRING, '',
+                    [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ', ', $args[3], ')']];
+            }
+        } else {
+            if (! is_numeric($hue) || ! is_numeric($saturation) || ! is_numeric($lightness)) {
+                return [Type::T_STRING, '', [$funcName . '(', $args[0], ', ', $args[1], ', ', $args[2], ')']];
+            }
+        }
+
+        $color = $this->toRGB($hue, $saturation, $lightness);
+
+        if (! \is_null($alpha)) {
+            $color[4] = $alpha;
+        }
+
+        return $color;
+    }
+
+    protected static $libHsla = [
+            ['channels'],
+            ['hue', 'saturation', 'lightness'],
+            ['hue', 'saturation', 'lightness', 'alpha']];
+    protected function libHsla($args, $kwargs)
+    {
+        return $this->libHsl($args, $kwargs, 'hsla');
+    }
+
+    protected static $libHue = ['color'];
+    protected function libHue($args)
+    {
+        $color = $this->assertColor($args[0]);
+        $hsl = $this->toHSL($color[1], $color[2], $color[3]);
+
+        return new Node\Number($hsl[1], 'deg');
+    }
+
+    protected static $libSaturation = ['color'];
+    protected function libSaturation($args)
+    {
+        $color = $this->assertColor($args[0]);
+        $hsl = $this->toHSL($color[1], $color[2], $color[3]);
+
+        return new Node\Number($hsl[2], '%');
+    }
+
+    protected static $libLightness = ['color'];
+    protected function libLightness($args)
+    {
+        $color = $this->assertColor($args[0]);
+        $hsl = $this->toHSL($color[1], $color[2], $color[3]);
+
+        return new Node\Number($hsl[3], '%');
+    }
+
+    protected function adjustHsl($color, $idx, $amount)
+    {
+        $hsl = $this->toHSL($color[1], $color[2], $color[3]);
+        $hsl[$idx] += $amount;
+        $out = $this->toRGB($hsl[1], $hsl[2], $hsl[3]);
+
+        if (isset($color[4])) {
+            $out[4] = $color[4];
+        }
+
+        return $out;
+    }
+
+    protected static $libAdjustHue = ['color', 'degrees'];
+    protected function libAdjustHue($args)
+    {
+        $color = $this->assertColor($args[0]);
+        $degrees = $this->assertNumber($args[1]);
+
+        return $this->adjustHsl($color, 1, $degrees);
+    }
+
+    protected static $libLighten = ['color', 'amount'];
+    protected function libLighten($args)
+    {
+        $color = $this->assertColor($args[0]);
+        $amount = Util::checkRange('amount', new Range(0, 100), $args[1], '%');
+
+        return $this->adjustHsl($color, 3, $amount);
+    }
+
+    protected static $libDarken = ['color', 'amount'];
+    protected function libDarken($args)
+    {
+        $color = $this->assertColor($args[0]);
+        $amount = Util::checkRange('amount', new Range(0, 100), $args[1], '%');
+
+        return $this->adjustHsl($color, 3, -$amount);
+    }
+
+    protected static $libSaturate = [['color', 'amount'], ['amount']];
+    protected function libSaturate($args)
+    {
+        $value = $args[0];
+
+        if ($value[0] === Type::T_NUMBER) {
+            return null;
+        }
+
+        if (count($args) === 1) {
+            $val = $this->compileValue($value);
+            throw $this->error("\$amount: $val is not a number");
+        }
+
+        $color = $this->assertColor($value);
+        $amount = 100 * $this->coercePercent($args[1]);
+
+        return $this->adjustHsl($color, 2, $amount);
+    }
+
+    protected static $libDesaturate = ['color', 'amount'];
+    protected function libDesaturate($args)
+    {
+        $color = $this->assertColor($args[0]);
+        $amount = 100 * $this->coercePercent($args[1]);
+
+        return $this->adjustHsl($color, 2, -$amount);
+    }
+
+    protected static $libGrayscale = ['color'];
+    protected function libGrayscale($args)
+    {
+        $value = $args[0];
+
+        if ($value[0] === Type::T_NUMBER) {
+            return null;
+        }
+
+        return $this->adjustHsl($this->assertColor($value), 2, -100);
+    }
+
+    protected static $libComplement = ['color'];
+    protected function libComplement($args)
+    {
+        return $this->adjustHsl($this->assertColor($args[0]), 1, 180);
+    }
+
+    protected static $libInvert = ['color', 'weight:1'];
+    protected function libInvert($args)
+    {
+        list($value, $weight) = $args;
+
+        if (! isset($weight)) {
+            $weight = 1;
+        } else {
+            $weight = $this->coercePercent($weight);
+        }
+
+        if ($value[0] === Type::T_NUMBER) {
+            return null;
+        }
+
+        $color = $this->assertColor($value);
+        $inverted = $color;
+        $inverted[1] = 255 - $inverted[1];
+        $inverted[2] = 255 - $inverted[2];
+        $inverted[3] = 255 - $inverted[3];
+
+        if ($weight < 1) {
+            return $this->libMix([$inverted, $color, [Type::T_NUMBER, $weight]]);
+        }
+
+        return $inverted;
+    }
+
+    // increases opacity by amount
+    protected static $libOpacify = ['color', 'amount'];
+    protected function libOpacify($args)
+    {
+        $color = $this->assertColor($args[0]);
+        $amount = $this->coercePercent($args[1]);
+
+        $color[4] = (isset($color[4]) ? $color[4] : 1) + $amount;
+        $color[4] = min(1, max(0, $color[4]));
+
+        return $color;
+    }
+
+    protected static $libFadeIn = ['color', 'amount'];
+    protected function libFadeIn($args)
+    {
+        return $this->libOpacify($args);
+    }
+
+    // decreases opacity by amount
+    protected static $libTransparentize = ['color', 'amount'];
+    protected function libTransparentize($args)
+    {
+        $color = $this->assertColor($args[0]);
+        $amount = $this->coercePercent($args[1]);
+
+        $color[4] = (isset($color[4]) ? $color[4] : 1) - $amount;
+        $color[4] = min(1, max(0, $color[4]));
+
+        return $color;
+    }
+
+    protected static $libFadeOut = ['color', 'amount'];
+    protected function libFadeOut($args)
+    {
+        return $this->libTransparentize($args);
+    }
+
+    protected static $libUnquote = ['string'];
+    protected function libUnquote($args)
+    {
+        $str = $args[0];
+
+        if ($str[0] === Type::T_STRING) {
+            $str[1] = '';
+        }
+
+        return $str;
+    }
+
+    protected static $libQuote = ['string'];
+    protected function libQuote($args)
+    {
+        $value = $args[0];
+
+        if ($value[0] === Type::T_STRING && ! empty($value[1])) {
+            return $value;
+        }
+
+        return [Type::T_STRING, '"', [$value]];
+    }
+
+    protected static $libPercentage = ['number'];
+    protected function libPercentage($args)
+    {
+        return new Node\Number($this->coercePercent($args[0]) * 100, '%');
+    }
+
+    protected static $libRound = ['number'];
+    protected function libRound($args)
+    {
+        $num = $args[0];
+
+        return new Node\Number(round($num[1]), $num[2]);
+    }
+
+    protected static $libFloor = ['number'];
+    protected function libFloor($args)
+    {
+        $num = $args[0];
+
+        return new Node\Number(floor($num[1]), $num[2]);
+    }
+
+    protected static $libCeil = ['number'];
+    protected function libCeil($args)
+    {
+        $num = $args[0];
+
+        return new Node\Number(ceil($num[1]), $num[2]);
+    }
+
+    protected static $libAbs = ['number'];
+    protected function libAbs($args)
+    {
+        $num = $args[0];
+
+        return new Node\Number(abs($num[1]), $num[2]);
+    }
+
+    protected function libMin($args)
+    {
+        $numbers = $this->getNormalizedNumbers($args);
+        $minOriginal = null;
+        $minNormalized = null;
+
+        foreach ($numbers as $key => $pair) {
+            list($original, $normalized) = $pair;
+
+            if (\is_null($normalized) || \is_null($minNormalized)) {
+                if (\is_null($minOriginal) || $original[1] <= $minOriginal[1]) {
+                    $minOriginal = $original;
+                    $minNormalized = $normalized;
+                }
+            } elseif ($normalized[1] <= $minNormalized[1]) {
+                $minOriginal = $original;
+                $minNormalized = $normalized;
+            }
+        }
+
+        return $minOriginal;
+    }
+
+    protected function libMax($args)
+    {
+        $numbers = $this->getNormalizedNumbers($args);
+        $maxOriginal = null;
+        $maxNormalized = null;
+
+        foreach ($numbers as $key => $pair) {
+            list($original, $normalized) = $pair;
+
+            if (\is_null($normalized) || \is_null($maxNormalized)) {
+                if (\is_null($maxOriginal) || $original[1] >= $maxOriginal[1]) {
+                    $maxOriginal = $original;
+                    $maxNormalized = $normalized;
+                }
+            } elseif ($normalized[1] >= $maxNormalized[1]) {
+                $maxOriginal = $original;
+                $maxNormalized = $normalized;
+            }
+        }
+
+        return $maxOriginal;
+    }
+
+    /**
+     * Helper to normalize args containing numbers
+     *
+     * @param array $args
+     *
+     * @return array
+     */
+    protected function getNormalizedNumbers($args)
+    {
+        $unit         = null;
+        $originalUnit = null;
+        $numbers      = [];
+
+        foreach ($args as $key => $item) {
+            $this->assertNumber($item);
+
+            $number = $item->normalize();
+
+            if (empty($unit)) {
+                $unit = $number[2];
+                $originalUnit = $item->unitStr();
+            } elseif ($number[1] && $unit !== $number[2] && ! empty($number[2])) {
+                throw $this->error('Incompatible units: "%s" and "%s".', $originalUnit, $item->unitStr());
+            }
+
+            $numbers[$key] = [$args[$key], empty($number[2]) ? null : $number];
+        }
+
+        return $numbers;
+    }
+
+    protected static $libLength = ['list'];
+    protected function libLength($args)
+    {
+        $list = $this->coerceList($args[0], ',', true);
+
+        return \count($list[2]);
+    }
+
+    //protected static $libListSeparator = ['list...'];
+    protected function libListSeparator($args)
+    {
+        if (\count($args) > 1) {
+            return 'comma';
+        }
+
+        if (! \in_array($args[0][0], [Type::T_LIST, Type::T_MAP])) {
+            return 'space';
+        }
+
+        $list = $this->coerceList($args[0]);
+
+        if (\count($list[2]) <= 1 && empty($list['enclosing'])) {
+            return 'space';
+        }
+
+        if ($list[1] === ',') {
+            return 'comma';
+        }
+
+        return 'space';
+    }
+
+    protected static $libNth = ['list', 'n'];
+    protected function libNth($args)
+    {
+        $list = $this->coerceList($args[0], ',', false);
+        $n = $this->assertNumber($args[1]);
+
+        if ($n > 0) {
+            $n--;
+        } elseif ($n < 0) {
+            $n += \count($list[2]);
+        }
+
+        return isset($list[2][$n]) ? $list[2][$n] : static::$defaultValue;
+    }
+
+    protected static $libSetNth = ['list', 'n', 'value'];
+    protected function libSetNth($args)
+    {
+        $list = $this->coerceList($args[0]);
+        $n = $this->assertNumber($args[1]);
+
+        if ($n > 0) {
+            $n--;
+        } elseif ($n < 0) {
+            $n += \count($list[2]);
+        }
+
+        if (! isset($list[2][$n])) {
+            throw $this->error('Invalid argument for "n"');
+        }
+
+        $list[2][$n] = $args[2];
+
+        return $list;
+    }
+
+    protected static $libMapGet = ['map', 'key'];
+    protected function libMapGet($args)
+    {
+        $map = $this->assertMap($args[0]);
+        $key = $args[1];
+
+        if (! \is_null($key)) {
+            $key = $this->compileStringContent($this->coerceString($key));
+
+            for ($i = \count($map[1]) - 1; $i >= 0; $i--) {
+                if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) {
+                    return $map[2][$i];
+                }
+            }
+        }
+
+        return static::$null;
+    }
+
+    protected static $libMapKeys = ['map'];
+    protected function libMapKeys($args)
+    {
+        $map = $this->assertMap($args[0]);
+        $keys = $map[1];
+
+        return [Type::T_LIST, ',', $keys];
+    }
+
+    protected static $libMapValues = ['map'];
+    protected function libMapValues($args)
+    {
+        $map = $this->assertMap($args[0]);
+        $values = $map[2];
+
+        return [Type::T_LIST, ',', $values];
+    }
+
+    protected static $libMapRemove = ['map', 'key...'];
+    protected function libMapRemove($args)
+    {
+        $map = $this->assertMap($args[0]);
+        $keyList = $this->assertList($args[1]);
+
+        $keys = [];
+
+        foreach ($keyList[2] as $key) {
+            $keys[] = $this->compileStringContent($this->coerceString($key));
+        }
+
+        for ($i = \count($map[1]) - 1; $i >= 0; $i--) {
+            if (in_array($this->compileStringContent($this->coerceString($map[1][$i])), $keys)) {
+                array_splice($map[1], $i, 1);
+                array_splice($map[2], $i, 1);
+            }
+        }
+
+        return $map;
+    }
+
+    protected static $libMapHasKey = ['map', 'key'];
+    protected function libMapHasKey($args)
+    {
+        $map = $this->assertMap($args[0]);
+        $key = $this->compileStringContent($this->coerceString($args[1]));
+
+        for ($i = \count($map[1]) - 1; $i >= 0; $i--) {
+            if ($key === $this->compileStringContent($this->coerceString($map[1][$i]))) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    protected static $libMapMerge = [
+        ['map1', 'map2'],
+        ['map-1', 'map-2']
+    ];
+    protected function libMapMerge($args)
+    {
+        $map1 = $this->assertMap($args[0]);
+        $map2 = $this->assertMap($args[1]);
+
+        foreach ($map2[1] as $i2 => $key2) {
+            $key = $this->compileStringContent($this->coerceString($key2));
+
+            foreach ($map1[1] as $i1 => $key1) {
+                if ($key === $this->compileStringContent($this->coerceString($key1))) {
+                    $map1[2][$i1] = $map2[2][$i2];
+                    continue 2;
+                }
+            }
+
+            $map1[1][] = $map2[1][$i2];
+            $map1[2][] = $map2[2][$i2];
+        }
+
+        return $map1;
+    }
+
+    protected static $libKeywords = ['args'];
+    protected function libKeywords($args)
+    {
+        $this->assertList($args[0]);
+
+        $keys = [];
+        $values = [];
+
+        foreach ($args[0][2] as $name => $arg) {
+            $keys[] = [Type::T_KEYWORD, $name];
+            $values[] = $arg;
+        }
+
+        return [Type::T_MAP, $keys, $values];
+    }
+
+    protected static $libIsBracketed = ['list'];
+    protected function libIsBracketed($args)
+    {
+        $list = $args[0];
+        $this->coerceList($list, ' ');
+
+        if (! empty($list['enclosing']) && $list['enclosing'] === 'bracket') {
+            return true;
+        }
+
+        return false;
+    }
+
+    protected function listSeparatorForJoin($list1, $sep)
+    {
+        if (! isset($sep)) {
+            return $list1[1];
+        }
+
+        switch ($this->compileValue($sep)) {
+            case 'comma':
+                return ',';
+
+            case 'space':
+                return ' ';
+
+            default:
+                return $list1[1];
+        }
+    }
+
+    protected static $libJoin = ['list1', 'list2', 'separator:null', 'bracketed:auto'];
+    protected function libJoin($args)
+    {
+        list($list1, $list2, $sep, $bracketed) = $args;
+
+        $list1 = $this->coerceList($list1, ' ', true);
+        $list2 = $this->coerceList($list2, ' ', true);
+        $sep   = $this->listSeparatorForJoin($list1, $sep);
+
+        if ($bracketed === static::$true) {
+            $bracketed = true;
+        } elseif ($bracketed === static::$false) {
+            $bracketed = false;
+        } elseif ($bracketed === [Type::T_KEYWORD, 'auto']) {
+            $bracketed = 'auto';
+        } elseif ($bracketed === static::$null) {
+            $bracketed = false;
+        } else {
+            $bracketed = $this->compileValue($bracketed);
+            $bracketed = ! ! $bracketed;
+
+            if ($bracketed === true) {
+                $bracketed = true;
+            }
+        }
+
+        if ($bracketed === 'auto') {
+            $bracketed = false;
+
+            if (! empty($list1['enclosing']) && $list1['enclosing'] === 'bracket') {
+                $bracketed = true;
+            }
+        }
+
+        $res = [Type::T_LIST, $sep, array_merge($list1[2], $list2[2])];
+
+        if (isset($list1['enclosing'])) {
+            $res['enlcosing'] = $list1['enclosing'];
+        }
+
+        if ($bracketed) {
+            $res['enclosing'] = 'bracket';
+        }
+
+        return $res;
+    }
+
+    protected static $libAppend = ['list', 'val', 'separator:null'];
+    protected function libAppend($args)
+    {
+        list($list1, $value, $sep) = $args;
+
+        $list1 = $this->coerceList($list1, ' ', true);
+        $sep   = $this->listSeparatorForJoin($list1, $sep);
+        $res   = [Type::T_LIST, $sep, array_merge($list1[2], [$value])];
+
+        if (isset($list1['enclosing'])) {
+            $res['enclosing'] = $list1['enclosing'];
+        }
+
+        return $res;
+    }
+
+    protected function libZip($args)
+    {
+        foreach ($args as $key => $arg) {
+            $args[$key] = $this->coerceList($arg);
+        }
+
+        $lists = [];
+        $firstList = array_shift($args);
+
+        $result = [Type::T_LIST, ',', $lists];
+        if (! \is_null($firstList)) {
+            foreach ($firstList[2] as $key => $item) {
+                $list = [Type::T_LIST, '', [$item]];
+
+                foreach ($args as $arg) {
+                    if (isset($arg[2][$key])) {
+                        $list[2][] = $arg[2][$key];
+                    } else {
+                        break 2;
+                    }
+                }
+
+                $lists[] = $list;
+            }
+
+            $result[2] = $lists;
+        } else {
+            $result['enclosing'] = 'parent';
+        }
+
+        return $result;
+    }
+
+    protected static $libTypeOf = ['value'];
+    protected function libTypeOf($args)
+    {
+        $value = $args[0];
+
+        switch ($value[0]) {
+            case Type::T_KEYWORD:
+                if ($value === static::$true || $value === static::$false) {
+                    return 'bool';
+                }
+
+                if ($this->coerceColor($value)) {
+                    return 'color';
+                }
+
+                // fall-thru
+            case Type::T_FUNCTION:
+                return 'string';
+
+            case Type::T_FUNCTION_REFERENCE:
+                return 'function';
+
+            case Type::T_LIST:
+                if (isset($value[3]) && $value[3]) {
+                    return 'arglist';
+                }
+
+                // fall-thru
+            default:
+                return $value[0];
+        }
+    }
+
+    protected static $libUnit = ['number'];
+    protected function libUnit($args)
+    {
+        $num = $args[0];
+
+        if ($num[0] === Type::T_NUMBER) {
+            return [Type::T_STRING, '"', [$num->unitStr()]];
+        }
+
+        return '';
+    }
+
+    protected static $libUnitless = ['number'];
+    protected function libUnitless($args)
+    {
+        $value = $args[0];
+
+        return $value[0] === Type::T_NUMBER && $value->unitless();
+    }
+
+    protected static $libComparable = [
+        ['number1', 'number2'],
+        ['number-1', 'number-2']
+    ];
+    protected function libComparable($args)
+    {
+        list($number1, $number2) = $args;
+
+        if (
+            ! isset($number1[0]) || $number1[0] !== Type::T_NUMBER ||
+            ! isset($number2[0]) || $number2[0] !== Type::T_NUMBER
+        ) {
+            throw $this->error('Invalid argument(s) for "comparable"');
+        }
+
+        $number1 = $number1->normalize();
+        $number2 = $number2->normalize();
+
+        return $number1[2] === $number2[2] || $number1->unitless() || $number2->unitless();
+    }
+
+    protected static $libStrIndex = ['string', 'substring'];
+    protected function libStrIndex($args)
+    {
+        $string = $this->assertString($args[0], 'string');
+        $stringContent = $this->compileStringContent($string);
+
+        $substring = $this->assertString($args[1], 'substring');
+        $substringContent = $this->compileStringContent($substring);
+
+        if (! \strlen($substringContent)) {
+            $result = 0;
+        } else {
+            $result = strpos($stringContent, $substringContent);
+        }
+
+        return $result === false ? static::$null : new Node\Number($result + 1, '');
+    }
+
+    protected static $libStrInsert = ['string', 'insert', 'index'];
+    protected function libStrInsert($args)
+    {
+        $string = $this->assertString($args[0], 'string');
+        $stringContent = $this->compileStringContent($string);
+
+        $insert = $this->assertString($args[1], 'insert');
+        $insertContent = $this->compileStringContent($insert);
+
+        $index = $this->assertInteger($args[2], 'index');
+        if ($index > 0) {
+            $index = $index - 1;
+        }
+        if ($index < 0) {
+            $index = Util::mbStrlen($stringContent) + 1 + $index;
+        }
+
+        $string[2] = [
+            Util::mbSubstr($stringContent, 0, $index),
+            $insertContent,
+            Util::mbSubstr($stringContent, $index)
+        ];
+
+        return $string;
+    }
+
+    protected static $libStrLength = ['string'];
+    protected function libStrLength($args)
+    {
+        $string = $this->assertString($args[0], 'string');
+        $stringContent = $this->compileStringContent($string);
+
+        return new Node\Number(Util::mbStrlen($stringContent), '');
+    }
+
+    protected static $libStrSlice = ['string', 'start-at', 'end-at:-1'];
+    protected function libStrSlice($args)
+    {
+        if (isset($args[2]) && ! $args[2][1]) {
+            return static::$nullString;
+        }
+
+        $string = $this->coerceString($args[0]);
+        $stringContent = $this->compileStringContent($string);
+
+        $start = (int) $args[1][1];
+
+        if ($start > 0) {
+            $start--;
+        }
+
+        $end    = isset($args[2]) ? (int) $args[2][1] : -1;
+        $length = $end < 0 ? $end + 1 : ($end > 0 ? $end - $start : $end);
+
+        $string[2] = $length
+            ? [substr($stringContent, $start, $length)]
+            : [substr($stringContent, $start)];
+
+        return $string;
+    }
+
+    protected static $libToLowerCase = ['string'];
+    protected function libToLowerCase($args)
+    {
+        $string = $this->coerceString($args[0]);
+        $stringContent = $this->compileStringContent($string);
+
+        $string[2] = [\function_exists('mb_strtolower') ? mb_strtolower($stringContent) : strtolower($stringContent)];
+
+        return $string;
+    }
+
+    protected static $libToUpperCase = ['string'];
+    protected function libToUpperCase($args)
+    {
+        $string = $this->coerceString($args[0]);
+        $stringContent = $this->compileStringContent($string);
+
+        $string[2] = [\function_exists('mb_strtoupper') ? mb_strtoupper($stringContent) : strtoupper($stringContent)];
+
+        return $string;
+    }
+
+    protected static $libFeatureExists = ['feature'];
+    protected function libFeatureExists($args)
+    {
+        $string = $this->coerceString($args[0]);
+        $name = $this->compileStringContent($string);
+
+        return $this->toBool(
+            \array_key_exists($name, $this->registeredFeatures) ? $this->registeredFeatures[$name] : false
+        );
+    }
+
+    protected static $libFunctionExists = ['name'];
+    protected function libFunctionExists($args)
+    {
+        $string = $this->coerceString($args[0]);
+        $name = $this->compileStringContent($string);
+
+        // user defined functions
+        if ($this->has(static::$namespaces['function'] . $name)) {
+            return true;
+        }
+
+        $name = $this->normalizeName($name);
+
+        if (isset($this->userFunctions[$name])) {
+            return true;
+        }
+
+        // built-in functions
+        $f = $this->getBuiltinFunction($name);
+
+        return $this->toBool(\is_callable($f));
+    }
+
+    protected static $libGlobalVariableExists = ['name'];
+    protected function libGlobalVariableExists($args)
+    {
+        $string = $this->coerceString($args[0]);
+        $name = $this->compileStringContent($string);
+
+        return $this->has($name, $this->rootEnv);
+    }
+
+    protected static $libMixinExists = ['name'];
+    protected function libMixinExists($args)
+    {
+        $string = $this->coerceString($args[0]);
+        $name = $this->compileStringContent($string);
+
+        return $this->has(static::$namespaces['mixin'] . $name);
+    }
+
+    protected static $libVariableExists = ['name'];
+    protected function libVariableExists($args)
+    {
+        $string = $this->coerceString($args[0]);
+        $name = $this->compileStringContent($string);
+
+        return $this->has($name);
+    }
+
+    /**
+     * Workaround IE7's content counter bug.
+     *
+     * @param array $args
+     *
+     * @return array
+     */
+    protected function libCounter($args)
+    {
+        $list = array_map([$this, 'compileValue'], $args);
+
+        return [Type::T_STRING, '', ['counter(' . implode(',', $list) . ')']];
+    }
+
+    protected static $libRandom = ['limit:null'];
+    protected function libRandom($args)
+    {
+        if (isset($args[0]) & $args[0] !== static::$null) {
+            $n = $this->assertNumber($args[0]);
+
+            if ($n < 1) {
+                throw $this->error("\$limit must be greater than or equal to 1");
+            }
+
+            if (round($n - \intval($n), Node\Number::PRECISION) > 0) {
+                throw $this->error("Expected \$limit to be an integer but got $n for `random`");
+            }
+
+            return new Node\Number(mt_rand(1, \intval($n)), '');
+        }
+
+        $max = mt_getrandmax();
+        return new Node\Number(mt_rand(0, $max - 1) / $max, '');
+    }
+
+    protected function libUniqueId()
+    {
+        static $id;
+
+        if (! isset($id)) {
+            $id = PHP_INT_SIZE === 4
+                ? mt_rand(0, pow(36, 5)) . str_pad(mt_rand(0, pow(36, 5)) % 10000000, 7, '0', STR_PAD_LEFT)
+                : mt_rand(0, pow(36, 8));
+        }
+
+        $id += mt_rand(0, 10) + 1;
+
+        return [Type::T_STRING, '', ['u' . str_pad(base_convert($id, 10, 36), 8, '0', STR_PAD_LEFT)]];
+    }
+
+    protected function inspectFormatValue($value, $force_enclosing_display = false)
+    {
+        if ($value === static::$null) {
+            $value = [Type::T_KEYWORD, 'null'];
+        }
+
+        $stringValue = [$value];
+
+        if ($value[0] === Type::T_LIST) {
+            if (end($value[2]) === static::$null) {
+                array_pop($value[2]);
+                $value[2][] = [Type::T_STRING, '', ['']];
+                $force_enclosing_display = true;
+            }
+
+            if (
+                ! empty($value['enclosing']) &&
+                ($force_enclosing_display ||
+                    ($value['enclosing'] === 'bracket') ||
+                    ! \count($value[2]))
+            ) {
+                $value['enclosing'] = 'forced_' . $value['enclosing'];
+                $force_enclosing_display = true;
+            }
+
+            foreach ($value[2] as $k => $listelement) {
+                $value[2][$k] = $this->inspectFormatValue($listelement, $force_enclosing_display);
+            }
+
+            $stringValue = [$value];
+        }
+
+        return [Type::T_STRING, '', $stringValue];
+    }
+
+    protected static $libInspect = ['value'];
+    protected function libInspect($args)
+    {
+        $value = $args[0];
+
+        return $this->inspectFormatValue($value);
+    }
+
+    /**
+     * Preprocess selector args
+     *
+     * @param array $arg
+     *
+     * @return array|boolean
+     */
+    protected function getSelectorArg($arg, $varname = null, $allowParent = false)
+    {
+        static $parser = null;
+
+        if (\is_null($parser)) {
+            $parser = $this->parserFactory(__METHOD__);
+        }
+
+        if (! $this->checkSelectorArgType($arg)) {
+            $var_display = ($varname ? ' $' . $varname . ':' : '');
+            $var_value = $this->compileValue($arg);
+            throw $this->error("Error:{$var_display} $var_value is not a valid selector: it must be a string,"
+                . " a list of strings, or a list of lists of strings");
+        }
+
+        $arg = $this->libUnquote([$arg]);
+        $arg = $this->compileValue($arg);
+
+        $parsedSelector = [];
+
+        if ($parser->parseSelector($arg, $parsedSelector)) {
+            $selector = $this->evalSelectors($parsedSelector);
+            $gluedSelector = $this->glueFunctionSelectors($selector);
+
+            if (! $allowParent) {
+                foreach ($gluedSelector as $selector) {
+                    foreach ($selector as $s) {
+                        if (in_array(static::$selfSelector, $s)) {
+                            $var_display = ($varname ? ' $' . $varname . ':' : '');
+                            throw $this->error("Error:{$var_display} Parent selectors aren't allowed here.");
+                        }
+                    }
+                }
+            }
+
+            return $gluedSelector;
+        }
+
+        $var_display = ($varname ? ' $' . $varname . ':' : '');
+        throw $this->error("Error:{$var_display} expected more input, invalid selector.");
+    }
+
+    /**
+     * Check variable type for getSelectorArg() function
+     * @param array $arg
+     * @param int $maxDepth
+     * @return bool
+     */
+    protected function checkSelectorArgType($arg, $maxDepth = 2)
+    {
+        if ($arg[0] === Type::T_LIST && $maxDepth > 0) {
+            foreach ($arg[2] as $elt) {
+                if (! $this->checkSelectorArgType($elt, $maxDepth - 1)) {
+                    return false;
+                }
+            }
+            return true;
+        }
+        if (!in_array($arg[0], [Type::T_STRING, Type::T_KEYWORD])) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Postprocess selector to output in right format
+     *
+     * @param array $selectors
+     *
+     * @return string
+     */
+    protected function formatOutputSelector($selectors)
+    {
+        $selectors = $this->collapseSelectors($selectors, true);
+
+        return $selectors;
+    }
+
+    protected static $libIsSuperselector = ['super', 'sub'];
+    protected function libIsSuperselector($args)
+    {
+        list($super, $sub) = $args;
+
+        $super = $this->getSelectorArg($super, 'super');
+        $sub = $this->getSelectorArg($sub, 'sub');
+
+        return $this->isSuperSelector($super, $sub);
+    }
+
+    /**
+     * Test a $super selector again $sub
+     *
+     * @param array $super
+     * @param array $sub
+     *
+     * @return boolean
+     */
+    protected function isSuperSelector($super, $sub)
+    {
+        // one and only one selector for each arg
+        if (! $super) {
+            throw $this->error('Invalid super selector for isSuperSelector()');
+        }
+
+        if (! $sub) {
+            throw $this->error('Invalid sub selector for isSuperSelector()');
+        }
+
+        if (count($sub) > 1) {
+            foreach ($sub as $s) {
+                if (! $this->isSuperSelector($super, [$s])) {
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        if (count($super) > 1) {
+            foreach ($super as $s) {
+                if ($this->isSuperSelector([$s], $sub)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+
+        $super = reset($super);
+        $sub = reset($sub);
+
+        $i = 0;
+        $nextMustMatch = false;
+
+        foreach ($super as $node) {
+            $compound = '';
+
+            array_walk_recursive(
+                $node,
+                function ($value, $key) use (&$compound) {
+                    $compound .= $value;
+                }
+            );
+
+            if ($this->isImmediateRelationshipCombinator($compound)) {
+                if ($node !== $sub[$i]) {
+                    return false;
+                }
+
+                $nextMustMatch = true;
+                $i++;
+            } else {
+                while ($i < \count($sub) && ! $this->isSuperPart($node, $sub[$i])) {
+                    if ($nextMustMatch) {
+                        return false;
+                    }
+
+                    $i++;
+                }
+
+                if ($i >= \count($sub)) {
+                    return false;
+                }
+
+                $nextMustMatch = false;
+                $i++;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Test a part of super selector again a part of sub selector
+     *
+     * @param array $superParts
+     * @param array $subParts
+     *
+     * @return boolean
+     */
+    protected function isSuperPart($superParts, $subParts)
+    {
+        $i = 0;
+
+        foreach ($superParts as $superPart) {
+            while ($i < \count($subParts) && $subParts[$i] !== $superPart) {
+                $i++;
+            }
+
+            if ($i >= \count($subParts)) {
+                return false;
+            }
+
+            $i++;
+        }
+
+        return true;
+    }
+
+    protected static $libSelectorAppend = ['selector...'];
+    protected function libSelectorAppend($args)
+    {
+        // get the selector... list
+        $args = reset($args);
+        $args = $args[2];
+
+        if (\count($args) < 1) {
+            throw $this->error('selector-append() needs at least 1 argument');
+        }
+
+        $selectors = [];
+        foreach ($args as $arg) {
+            $selectors[] = $this->getSelectorArg($arg, 'selector');
+        }
+
+        return $this->formatOutputSelector($this->selectorAppend($selectors));
+    }
+
+    /**
+     * Append parts of the last selector in the list to the previous, recursively
+     *
+     * @param array $selectors
+     *
+     * @return array
+     *
+     * @throws \ScssPhp\ScssPhp\Exception\CompilerException
+     */
+    protected function selectorAppend($selectors)
+    {
+        $lastSelectors = array_pop($selectors);
+
+        if (! $lastSelectors) {
+            throw $this->error('Invalid selector list in selector-append()');
+        }
+
+        while (\count($selectors)) {
+            $previousSelectors = array_pop($selectors);
+
+            if (! $previousSelectors) {
+                throw $this->error('Invalid selector list in selector-append()');
+            }
+
+            // do the trick, happening $lastSelector to $previousSelector
+            $appended = [];
+
+            foreach ($lastSelectors as $lastSelector) {
+                $previous = $previousSelectors;
+
+                foreach ($lastSelector as $lastSelectorParts) {
+                    foreach ($lastSelectorParts as $lastSelectorPart) {
+                        foreach ($previous as $i => $previousSelector) {
+                            foreach ($previousSelector as $j => $previousSelectorParts) {
+                                $previous[$i][$j][] = $lastSelectorPart;
+                            }
+                        }
+                    }
+                }
+
+                foreach ($previous as $ps) {
+                    $appended[] = $ps;
+                }
+            }
+
+            $lastSelectors = $appended;
+        }
+
+        return $lastSelectors;
+    }
+
+    protected static $libSelectorExtend = [
+        ['selector', 'extendee', 'extender'],
+        ['selectors', 'extendee', 'extender']
+    ];
+    protected function libSelectorExtend($args)
+    {
+        list($selectors, $extendee, $extender) = $args;
+
+        $selectors = $this->getSelectorArg($selectors, 'selector');
+        $extendee  = $this->getSelectorArg($extendee, 'extendee');
+        $extender  = $this->getSelectorArg($extender, 'extender');
+
+        if (! $selectors || ! $extendee || ! $extender) {
+            throw $this->error('selector-extend() invalid arguments');
+        }
+
+        $extended = $this->extendOrReplaceSelectors($selectors, $extendee, $extender);
+
+        return $this->formatOutputSelector($extended);
+    }
+
+    protected static $libSelectorReplace = [
+        ['selector', 'original', 'replacement'],
+        ['selectors', 'original', 'replacement']
+    ];
+    protected function libSelectorReplace($args)
+    {
+        list($selectors, $original, $replacement) = $args;
+
+        $selectors   = $this->getSelectorArg($selectors, 'selector');
+        $original    = $this->getSelectorArg($original, 'original');
+        $replacement = $this->getSelectorArg($replacement, 'replacement');
+
+        if (! $selectors || ! $original || ! $replacement) {
+            throw $this->error('selector-replace() invalid arguments');
+        }
+
+        $replaced = $this->extendOrReplaceSelectors($selectors, $original, $replacement, true);
+
+        return $this->formatOutputSelector($replaced);
+    }
+
+    /**
+     * Extend/replace in selectors
+     * used by selector-extend and selector-replace that use the same logic
+     *
+     * @param array   $selectors
+     * @param array   $extendee
+     * @param array   $extender
+     * @param boolean $replace
+     *
+     * @return array
+     */
+    protected function extendOrReplaceSelectors($selectors, $extendee, $extender, $replace = false)
+    {
+        $saveExtends = $this->extends;
+        $saveExtendsMap = $this->extendsMap;
+
+        $this->extends = [];
+        $this->extendsMap = [];
+
+        foreach ($extendee as $es) {
+            // only use the first one
+            $this->pushExtends(reset($es), $extender, null);
+        }
+
+        $extended = [];
+
+        foreach ($selectors as $selector) {
+            if (! $replace) {
+                $extended[] = $selector;
+            }
+
+            $n = \count($extended);
+
+            $this->matchExtends($selector, $extended);
+
+            // if didnt match, keep the original selector if we are in a replace operation
+            if ($replace && \count($extended) === $n) {
+                $extended[] = $selector;
+            }
+        }
+
+        $this->extends = $saveExtends;
+        $this->extendsMap = $saveExtendsMap;
+
+        return $extended;
+    }
+
+    protected static $libSelectorNest = ['selector...'];
+    protected function libSelectorNest($args)
+    {
+        // get the selector... list
+        $args = reset($args);
+        $args = $args[2];
+
+        if (\count($args) < 1) {
+            throw $this->error('selector-nest() needs at least 1 argument');
+        }
+
+        $selectorsMap = [];
+        foreach ($args as $arg) {
+            $selectorsMap[] = $this->getSelectorArg($arg, 'selector', true);
+        }
+
+        $envs = [];
+
+        foreach ($selectorsMap as $selectors) {
+            $env = new Environment();
+            $env->selectors = $selectors;
+
+            $envs[] = $env;
+        }
+
+        $envs            = array_reverse($envs);
+        $env             = $this->extractEnv($envs);
+        $outputSelectors = $this->multiplySelectors($env);
+
+        return $this->formatOutputSelector($outputSelectors);
+    }
+
+    protected static $libSelectorParse = [
+        ['selector'],
+        ['selectors']
+    ];
+    protected function libSelectorParse($args)
+    {
+        $selectors = reset($args);
+        $selectors = $this->getSelectorArg($selectors, 'selector');
+
+        return $this->formatOutputSelector($selectors);
+    }
+
+    protected static $libSelectorUnify = ['selectors1', 'selectors2'];
+    protected function libSelectorUnify($args)
+    {
+        list($selectors1, $selectors2) = $args;
+
+        $selectors1 = $this->getSelectorArg($selectors1, 'selectors1');
+        $selectors2 = $this->getSelectorArg($selectors2, 'selectors2');
+
+        if (! $selectors1 || ! $selectors2) {
+            throw $this->error('selector-unify() invalid arguments');
+        }
+
+        // only consider the first compound of each
+        $compound1 = reset($selectors1);
+        $compound2 = reset($selectors2);
+
+        // unify them and that's it
+        $unified = $this->unifyCompoundSelectors($compound1, $compound2);
+
+        return $this->formatOutputSelector($unified);
+    }
+
+    /**
+     * The selector-unify magic as its best
+     * (at least works as expected on test cases)
+     *
+     * @param array $compound1
+     * @param array $compound2
+     *
+     * @return array|mixed
+     */
+    protected function unifyCompoundSelectors($compound1, $compound2)
+    {
+        if (! \count($compound1)) {
+            return $compound2;
+        }
+
+        if (! \count($compound2)) {
+            return $compound1;
+        }
+
+        // check that last part are compatible
+        $lastPart1 = array_pop($compound1);
+        $lastPart2 = array_pop($compound2);
+        $last      = $this->mergeParts($lastPart1, $lastPart2);
+
+        if (! $last) {
+            return [[]];
+        }
+
+        $unifiedCompound = [$last];
+        $unifiedSelectors = [$unifiedCompound];
+
+        // do the rest
+        while (\count($compound1) || \count($compound2)) {
+            $part1 = end($compound1);
+            $part2 = end($compound2);
+
+            if ($part1 && ($match2 = $this->matchPartInCompound($part1, $compound2))) {
+                list($compound2, $part2, $after2) = $match2;
+
+                if ($after2) {
+                    $unifiedSelectors = $this->prependSelectors($unifiedSelectors, $after2);
+                }
+
+                $c = $this->mergeParts($part1, $part2);
+                $unifiedSelectors = $this->prependSelectors($unifiedSelectors, [$c]);
+
+                $part1 = $part2 = null;
+
+                array_pop($compound1);
+            }
+
+            if ($part2 && ($match1 = $this->matchPartInCompound($part2, $compound1))) {
+                list($compound1, $part1, $after1) = $match1;
+
+                if ($after1) {
+                    $unifiedSelectors = $this->prependSelectors($unifiedSelectors, $after1);
+                }
+
+                $c = $this->mergeParts($part2, $part1);
+                $unifiedSelectors = $this->prependSelectors($unifiedSelectors, [$c]);
+
+                $part1 = $part2 = null;
+
+                array_pop($compound2);
+            }
+
+            $new = [];
+
+            if ($part1 && $part2) {
+                array_pop($compound1);
+                array_pop($compound2);
+
+                $s   = $this->prependSelectors($unifiedSelectors, [$part2]);
+                $new = array_merge($new, $this->prependSelectors($s, [$part1]));
+                $s   = $this->prependSelectors($unifiedSelectors, [$part1]);
+                $new = array_merge($new, $this->prependSelectors($s, [$part2]));
+            } elseif ($part1) {
+                array_pop($compound1);
+
+                $new = array_merge($new, $this->prependSelectors($unifiedSelectors, [$part1]));
+            } elseif ($part2) {
+                array_pop($compound2);
+
+                $new = array_merge($new, $this->prependSelectors($unifiedSelectors, [$part2]));
+            }
+
+            if ($new) {
+                $unifiedSelectors = $new;
+            }
+        }
+
+        return $unifiedSelectors;
+    }
+
+    /**
+     * Prepend each selector from $selectors with $parts
+     *
+     * @param array $selectors
+     * @param array $parts
+     *
+     * @return array
+     */
+    protected function prependSelectors($selectors, $parts)
+    {
+        $new = [];
+
+        foreach ($selectors as $compoundSelector) {
+            array_unshift($compoundSelector, $parts);
+
+            $new[] = $compoundSelector;
+        }
+
+        return $new;
+    }
+
+    /**
+     * Try to find a matching part in a compound:
+     * - with same html tag name
+     * - with some class or id or something in common
+     *
+     * @param array $part
+     * @param array $compound
+     *
+     * @return array|boolean
+     */
+    protected function matchPartInCompound($part, $compound)
+    {
+        $partTag = $this->findTagName($part);
+        $before  = $compound;
+        $after   = [];
+
+        // try to find a match by tag name first
+        while (\count($before)) {
+            $p = array_pop($before);
+
+            if ($partTag && $partTag !== '*' && $partTag == $this->findTagName($p)) {
+                return [$before, $p, $after];
+            }
+
+            $after[] = $p;
+        }
+
+        // try again matching a non empty intersection and a compatible tagname
+        $before = $compound;
+        $after = [];
+
+        while (\count($before)) {
+            $p = array_pop($before);
+
+            if ($this->checkCompatibleTags($partTag, $this->findTagName($p))) {
+                if (\count(array_intersect($part, $p))) {
+                    return [$before, $p, $after];
+                }
+            }
+
+            $after[] = $p;
+        }
+
+        return false;
+    }
+
+    /**
+     * Merge two part list taking care that
+     * - the html tag is coming first - if any
+     * - the :something are coming last
+     *
+     * @param array $parts1
+     * @param array $parts2
+     *
+     * @return array
+     */
+    protected function mergeParts($parts1, $parts2)
+    {
+        $tag1 = $this->findTagName($parts1);
+        $tag2 = $this->findTagName($parts2);
+        $tag  = $this->checkCompatibleTags($tag1, $tag2);
+
+        // not compatible tags
+        if ($tag === false) {
+            return [];
+        }
+
+        if ($tag) {
+            if ($tag1) {
+                $parts1 = array_diff($parts1, [$tag1]);
+            }
+
+            if ($tag2) {
+                $parts2 = array_diff($parts2, [$tag2]);
+            }
+        }
+
+        $mergedParts = array_merge($parts1, $parts2);
+        $mergedOrderedParts = [];
+
+        foreach ($mergedParts as $part) {
+            if (strpos($part, ':') === 0) {
+                $mergedOrderedParts[] = $part;
+            }
+        }
+
+        $mergedParts = array_diff($mergedParts, $mergedOrderedParts);
+        $mergedParts = array_merge($mergedParts, $mergedOrderedParts);
+
+        if ($tag) {
+            array_unshift($mergedParts, $tag);
+        }
+
+        return $mergedParts;
+    }
+
+    /**
+     * Check the compatibility between two tag names:
+     * if both are defined they should be identical or one has to be '*'
+     *
+     * @param string $tag1
+     * @param string $tag2
+     *
+     * @return array|boolean
+     */
+    protected function checkCompatibleTags($tag1, $tag2)
+    {
+        $tags = [$tag1, $tag2];
+        $tags = array_unique($tags);
+        $tags = array_filter($tags);
+
+        if (\count($tags) > 1) {
+            $tags = array_diff($tags, ['*']);
+        }
+
+        // not compatible nodes
+        if (\count($tags) > 1) {
+            return false;
+        }
+
+        return $tags;
+    }
+
+    /**
+     * Find the html tag name in a selector parts list
+     *
+     * @param array $parts
+     *
+     * @return mixed|string
+     */
+    protected function findTagName($parts)
+    {
+        foreach ($parts as $part) {
+            if (! preg_match('/^[\[.:#%_-]/', $part)) {
+                return $part;
+            }
+        }
+
+        return '';
+    }
+
+    protected static $libSimpleSelectors = ['selector'];
+    protected function libSimpleSelectors($args)
+    {
+        $selector = reset($args);
+        $selector = $this->getSelectorArg($selector, 'selector');
+
+        // remove selectors list layer, keeping the first one
+        $selector = reset($selector);
+
+        // remove parts list layer, keeping the first part
+        $part = reset($selector);
+
+        $listParts = [];
+
+        foreach ($part as $p) {
+            $listParts[] = [Type::T_STRING, '', [$p]];
+        }
+
+        return [Type::T_LIST, ',', $listParts];
+    }
+
+    protected static $libScssphpGlob = ['pattern'];
+    protected function libScssphpGlob($args)
+    {
+        $string = $this->coerceString($args[0]);
+        $pattern = $this->compileStringContent($string);
+        $matches = glob($pattern);
+        $listParts = [];
+
+        foreach ($matches as $match) {
+            if (! is_file($match)) {
+                continue;
+            }
+
+            $listParts[] = [Type::T_STRING, '"', [$match]];
+        }
+
+        return [Type::T_LIST, ',', $listParts];
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Compiler/Environment.php b/civicrm/vendor/scssphp/scssphp/src/Compiler/Environment.php
new file mode 100644
index 0000000000000000000000000000000000000000..dc2f86c1fbe0f64ace33be1183e555b0e3ec3845
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Compiler/Environment.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Compiler;
+
+/**
+ * Compiler environment
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Environment
+{
+    /**
+     * @var \ScssPhp\ScssPhp\Block
+     */
+    public $block;
+
+    /**
+     * @var \ScssPhp\ScssPhp\Compiler\Environment
+     */
+    public $parent;
+
+    /**
+     * @var array
+     */
+    public $store;
+
+    /**
+     * @var array
+     */
+    public $storeUnreduced;
+
+    /**
+     * @var integer
+     */
+    public $depth;
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Exception/CompilerException.php b/civicrm/vendor/scssphp/scssphp/src/Exception/CompilerException.php
new file mode 100644
index 0000000000000000000000000000000000000000..343da4c7028271fb4da10a2d795777d91874d2c0
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Exception/CompilerException.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Exception;
+
+/**
+ * Compiler exception
+ *
+ * @author Oleksandr Savchenko <traveltino@gmail.com>
+ */
+class CompilerException extends \Exception implements SassException
+{
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Exception/ParserException.php b/civicrm/vendor/scssphp/scssphp/src/Exception/ParserException.php
new file mode 100644
index 0000000000000000000000000000000000000000..5237f30795d476e09f5076cfa71058e4c4db63ec
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Exception/ParserException.php
@@ -0,0 +1,48 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Exception;
+
+/**
+ * Parser Exception
+ *
+ * @author Oleksandr Savchenko <traveltino@gmail.com>
+ */
+class ParserException extends \Exception implements SassException
+{
+    /**
+     * @var array
+     */
+    private $sourcePosition;
+
+    /**
+     * Get source position
+     *
+     * @api
+     */
+    public function getSourcePosition()
+    {
+        return $this->sourcePosition;
+    }
+
+    /**
+     * Set source position
+     *
+     * @api
+     *
+     * @param array $sourcePosition
+     */
+    public function setSourcePosition($sourcePosition)
+    {
+        $this->sourcePosition = $sourcePosition;
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Exception/RangeException.php b/civicrm/vendor/scssphp/scssphp/src/Exception/RangeException.php
new file mode 100644
index 0000000000000000000000000000000000000000..b18c32d6c3d95766eba14e11b01951c74f51fcad
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Exception/RangeException.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Exception;
+
+/**
+ * Range exception
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class RangeException extends \Exception implements SassException
+{
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Exception/SassException.php b/civicrm/vendor/scssphp/scssphp/src/Exception/SassException.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f62b3cd24b117dedcac47d86d33ef0fa3d1834c
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Exception/SassException.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace ScssPhp\ScssPhp\Exception;
+
+interface SassException
+{
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Exception/ServerException.php b/civicrm/vendor/scssphp/scssphp/src/Exception/ServerException.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad5b37998f5bfddbe8d59cdcf50bee9adb732247
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Exception/ServerException.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Exception;
+
+/**
+ * Server Exception
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class ServerException extends \Exception implements SassException
+{
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Formatter.php b/civicrm/vendor/scssphp/scssphp/src/Formatter.php
new file mode 100644
index 0000000000000000000000000000000000000000..290f5f3c74d334fdd1203977a90e91ba2ebd4fa9
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Formatter.php
@@ -0,0 +1,333 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+use ScssPhp\ScssPhp\Formatter\OutputBlock;
+use ScssPhp\ScssPhp\SourceMap\SourceMapGenerator;
+
+/**
+ * Base formatter
+ *
+ * @author Leaf Corcoran <leafot@gmail.com>
+ */
+abstract class Formatter
+{
+    /**
+     * @var integer
+     */
+    public $indentLevel;
+
+    /**
+     * @var string
+     */
+    public $indentChar;
+
+    /**
+     * @var string
+     */
+    public $break;
+
+    /**
+     * @var string
+     */
+    public $open;
+
+    /**
+     * @var string
+     */
+    public $close;
+
+    /**
+     * @var string
+     */
+    public $tagSeparator;
+
+    /**
+     * @var string
+     */
+    public $assignSeparator;
+
+    /**
+     * @var boolean
+     */
+    public $keepSemicolons;
+
+    /**
+     * @var \ScssPhp\ScssPhp\Formatter\OutputBlock
+     */
+    protected $currentBlock;
+
+    /**
+     * @var integer
+     */
+    protected $currentLine;
+
+    /**
+     * @var integer
+     */
+    protected $currentColumn;
+
+    /**
+     * @var \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator
+     */
+    protected $sourceMapGenerator;
+
+    /**
+     * @var string
+     */
+    protected $strippedSemicolon;
+
+    /**
+     * Initialize formatter
+     *
+     * @api
+     */
+    abstract public function __construct();
+
+    /**
+     * Return indentation (whitespace)
+     *
+     * @return string
+     */
+    protected function indentStr()
+    {
+        return '';
+    }
+
+    /**
+     * Return property assignment
+     *
+     * @api
+     *
+     * @param string $name
+     * @param mixed  $value
+     *
+     * @return string
+     */
+    public function property($name, $value)
+    {
+        return rtrim($name) . $this->assignSeparator . $value . ';';
+    }
+
+    /**
+     * Return custom property assignment
+     * differs in that you have to keep spaces in the value as is
+     *
+     * @api
+     *
+     * @param string $name
+     * @param mixed  $value
+     *
+     * @return string
+     */
+    public function customProperty($name, $value)
+    {
+        return rtrim($name) . trim($this->assignSeparator) . $value . ';';
+    }
+
+    /**
+     * Output lines inside a block
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     */
+    protected function blockLines(OutputBlock $block)
+    {
+        $inner = $this->indentStr();
+        $glue  = $this->break . $inner;
+
+        $this->write($inner . implode($glue, $block->lines));
+
+        if (! empty($block->children)) {
+            $this->write($this->break);
+        }
+    }
+
+    /**
+     * Output block selectors
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     */
+    protected function blockSelectors(OutputBlock $block)
+    {
+        $inner = $this->indentStr();
+
+        $this->write($inner
+            . implode($this->tagSeparator, $block->selectors)
+            . $this->open . $this->break);
+    }
+
+    /**
+     * Output block children
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     */
+    protected function blockChildren(OutputBlock $block)
+    {
+        foreach ($block->children as $child) {
+            $this->block($child);
+        }
+    }
+
+    /**
+     * Output non-empty block
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     */
+    protected function block(OutputBlock $block)
+    {
+        if (empty($block->lines) && empty($block->children)) {
+            return;
+        }
+
+        $this->currentBlock = $block;
+
+        $pre = $this->indentStr();
+
+        if (! empty($block->selectors)) {
+            $this->blockSelectors($block);
+
+            $this->indentLevel++;
+        }
+
+        if (! empty($block->lines)) {
+            $this->blockLines($block);
+        }
+
+        if (! empty($block->children)) {
+            $this->blockChildren($block);
+        }
+
+        if (! empty($block->selectors)) {
+            $this->indentLevel--;
+
+            if (! $this->keepSemicolons) {
+                $this->strippedSemicolon = '';
+            }
+
+            if (empty($block->children)) {
+                $this->write($this->break);
+            }
+
+            $this->write($pre . $this->close . $this->break);
+        }
+    }
+
+    /**
+     * Test and clean safely empty children
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     *
+     * @return boolean
+     */
+    protected function testEmptyChildren($block)
+    {
+        $isEmpty = empty($block->lines);
+
+        if ($block->children) {
+            foreach ($block->children as $k => &$child) {
+                if (! $this->testEmptyChildren($child)) {
+                    $isEmpty = false;
+                    continue;
+                }
+
+                if ($child->type === Type::T_MEDIA || $child->type === Type::T_DIRECTIVE) {
+                    $child->children = [];
+                    $child->selectors = null;
+                }
+            }
+        }
+
+        return $isEmpty;
+    }
+
+    /**
+     * Entry point to formatting a block
+     *
+     * @api
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock             $block              An abstract syntax tree
+     * @param \ScssPhp\ScssPhp\SourceMap\SourceMapGenerator|null $sourceMapGenerator Optional source map generator
+     *
+     * @return string
+     */
+    public function format(OutputBlock $block, SourceMapGenerator $sourceMapGenerator = null)
+    {
+        $this->sourceMapGenerator = null;
+
+        if ($sourceMapGenerator) {
+            $this->currentLine        = 1;
+            $this->currentColumn      = 0;
+            $this->sourceMapGenerator = $sourceMapGenerator;
+        }
+
+        $this->testEmptyChildren($block);
+
+        ob_start();
+
+        $this->block($block);
+
+        $out = ob_get_clean();
+
+        return $out;
+    }
+
+    /**
+     * Output content
+     *
+     * @param string $str
+     */
+    protected function write($str)
+    {
+        if (! empty($this->strippedSemicolon)) {
+            echo $this->strippedSemicolon;
+
+            $this->strippedSemicolon = '';
+        }
+
+        /*
+         * Maybe Strip semi-colon appended by property(); it's a separator, not a terminator
+         * will be striped for real before a closing, otherwise displayed unchanged starting the next write
+         */
+        if (
+            ! $this->keepSemicolons &&
+            $str &&
+            (strpos($str, ';') !== false) &&
+            (substr($str, -1) === ';')
+        ) {
+            $str = substr($str, 0, -1);
+
+            $this->strippedSemicolon = ';';
+        }
+
+        if ($this->sourceMapGenerator) {
+            $this->sourceMapGenerator->addMapping(
+                $this->currentLine,
+                $this->currentColumn,
+                $this->currentBlock->sourceLine,
+                //columns from parser are off by one
+                $this->currentBlock->sourceColumn > 0 ? $this->currentBlock->sourceColumn - 1 : 0,
+                $this->currentBlock->sourceName
+            );
+
+            $lines = explode("\n", $str);
+            $lineCount = \count($lines);
+            $this->currentLine += $lineCount - 1;
+
+            $lastLine = array_pop($lines);
+
+            $this->currentColumn = ($lineCount === 1 ? $this->currentColumn : 0) + \strlen($lastLine);
+        }
+
+        echo $str;
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Formatter/Compact.php b/civicrm/vendor/scssphp/scssphp/src/Formatter/Compact.php
new file mode 100644
index 0000000000000000000000000000000000000000..98009b41431d53308527053e690d10bd57857aa6
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Formatter/Compact.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Formatter;
+
+use ScssPhp\ScssPhp\Formatter;
+
+/**
+ * Compact formatter
+ *
+ * @author Leaf Corcoran <leafot@gmail.com>
+ */
+class Compact extends Formatter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct()
+    {
+        $this->indentLevel = 0;
+        $this->indentChar = '';
+        $this->break = '';
+        $this->open = ' {';
+        $this->close = "}\n\n";
+        $this->tagSeparator = ',';
+        $this->assignSeparator = ':';
+        $this->keepSemicolons = true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function indentStr()
+    {
+        return ' ';
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Formatter/Compressed.php b/civicrm/vendor/scssphp/scssphp/src/Formatter/Compressed.php
new file mode 100644
index 0000000000000000000000000000000000000000..3fdb97a40ba5206b627b5d3a0c34f6b90a517593
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Formatter/Compressed.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Formatter;
+
+use ScssPhp\ScssPhp\Formatter;
+use ScssPhp\ScssPhp\Formatter\OutputBlock;
+
+/**
+ * Compressed formatter
+ *
+ * @author Leaf Corcoran <leafot@gmail.com>
+ */
+class Compressed extends Formatter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct()
+    {
+        $this->indentLevel = 0;
+        $this->indentChar = '  ';
+        $this->break = '';
+        $this->open = '{';
+        $this->close = '}';
+        $this->tagSeparator = ',';
+        $this->assignSeparator = ':';
+        $this->keepSemicolons = false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function blockLines(OutputBlock $block)
+    {
+        $inner = $this->indentStr();
+
+        $glue = $this->break . $inner;
+
+        foreach ($block->lines as $index => $line) {
+            if (substr($line, 0, 2) === '/*' && substr($line, 2, 1) !== '!') {
+                unset($block->lines[$index]);
+            } elseif (substr($line, 0, 3) === '/*!') {
+                $block->lines[$index] = '/*' . substr($line, 3);
+            }
+        }
+
+        $this->write($inner . implode($glue, $block->lines));
+
+        if (! empty($block->children)) {
+            $this->write($this->break);
+        }
+    }
+
+    /**
+     * Output block selectors
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     */
+    protected function blockSelectors(OutputBlock $block)
+    {
+        $inner = $this->indentStr();
+
+        $this->write(
+            $inner
+            . implode(
+                $this->tagSeparator,
+                str_replace([' > ', ' + ', ' ~ '], ['>', '+', '~'], $block->selectors)
+            )
+            . $this->open . $this->break
+        );
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Formatter/Crunched.php b/civicrm/vendor/scssphp/scssphp/src/Formatter/Crunched.php
new file mode 100644
index 0000000000000000000000000000000000000000..137cdffbfb1cec2ed2fda1d1bf7adc9ce737f1ac
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Formatter/Crunched.php
@@ -0,0 +1,80 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Formatter;
+
+use ScssPhp\ScssPhp\Formatter;
+use ScssPhp\ScssPhp\Formatter\OutputBlock;
+
+/**
+ * Crunched formatter
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Crunched extends Formatter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct()
+    {
+        $this->indentLevel = 0;
+        $this->indentChar = '  ';
+        $this->break = '';
+        $this->open = '{';
+        $this->close = '}';
+        $this->tagSeparator = ',';
+        $this->assignSeparator = ':';
+        $this->keepSemicolons = false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function blockLines(OutputBlock $block)
+    {
+        $inner = $this->indentStr();
+
+        $glue = $this->break . $inner;
+
+        foreach ($block->lines as $index => $line) {
+            if (substr($line, 0, 2) === '/*') {
+                unset($block->lines[$index]);
+            }
+        }
+
+        $this->write($inner . implode($glue, $block->lines));
+
+        if (! empty($block->children)) {
+            $this->write($this->break);
+        }
+    }
+
+    /**
+     * Output block selectors
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     */
+    protected function blockSelectors(OutputBlock $block)
+    {
+        $inner = $this->indentStr();
+
+        $this->write(
+            $inner
+            . implode(
+                $this->tagSeparator,
+                str_replace([' > ', ' + ', ' ~ '], ['>', '+', '~'], $block->selectors)
+            )
+            . $this->open . $this->break
+        );
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Formatter/Debug.php b/civicrm/vendor/scssphp/scssphp/src/Formatter/Debug.php
new file mode 100644
index 0000000000000000000000000000000000000000..5c539a2d1710f8f4041278f2c7a59e49058b54a8
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Formatter/Debug.php
@@ -0,0 +1,122 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Formatter;
+
+use ScssPhp\ScssPhp\Formatter;
+use ScssPhp\ScssPhp\Formatter\OutputBlock;
+
+/**
+ * Debug formatter
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Debug extends Formatter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct()
+    {
+        $this->indentLevel = 0;
+        $this->indentChar = '';
+        $this->break = "\n";
+        $this->open = ' {';
+        $this->close = ' }';
+        $this->tagSeparator = ', ';
+        $this->assignSeparator = ': ';
+        $this->keepSemicolons = true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function indentStr()
+    {
+        return str_repeat('  ', $this->indentLevel);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function blockLines(OutputBlock $block)
+    {
+        $indent = $this->indentStr();
+
+        if (empty($block->lines)) {
+            $this->write("{$indent}block->lines: []\n");
+
+            return;
+        }
+
+        foreach ($block->lines as $index => $line) {
+            $this->write("{$indent}block->lines[{$index}]: $line\n");
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function blockSelectors(OutputBlock $block)
+    {
+        $indent = $this->indentStr();
+
+        if (empty($block->selectors)) {
+            $this->write("{$indent}block->selectors: []\n");
+
+            return;
+        }
+
+        foreach ($block->selectors as $index => $selector) {
+            $this->write("{$indent}block->selectors[{$index}]: $selector\n");
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function blockChildren(OutputBlock $block)
+    {
+        $indent = $this->indentStr();
+
+        if (empty($block->children)) {
+            $this->write("{$indent}block->children: []\n");
+
+            return;
+        }
+
+        $this->indentLevel++;
+
+        foreach ($block->children as $i => $child) {
+            $this->block($child);
+        }
+
+        $this->indentLevel--;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function block(OutputBlock $block)
+    {
+        $indent = $this->indentStr();
+
+        $this->write("{$indent}block->type: {$block->type}\n" .
+             "{$indent}block->depth: {$block->depth}\n");
+
+        $this->currentBlock = $block;
+
+        $this->blockSelectors($block);
+        $this->blockLines($block);
+        $this->blockChildren($block);
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Formatter/Expanded.php b/civicrm/vendor/scssphp/scssphp/src/Formatter/Expanded.php
new file mode 100644
index 0000000000000000000000000000000000000000..3d5344cfd009ee45699a8079a60cc75e7c3b1bd4
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Formatter/Expanded.php
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Formatter;
+
+use ScssPhp\ScssPhp\Formatter;
+use ScssPhp\ScssPhp\Formatter\OutputBlock;
+
+/**
+ * Expanded formatter
+ *
+ * @author Leaf Corcoran <leafot@gmail.com>
+ */
+class Expanded extends Formatter
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct()
+    {
+        $this->indentLevel = 0;
+        $this->indentChar = '  ';
+        $this->break = "\n";
+        $this->open = ' {';
+        $this->close = '}';
+        $this->tagSeparator = ', ';
+        $this->assignSeparator = ': ';
+        $this->keepSemicolons = true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function indentStr()
+    {
+        return str_repeat($this->indentChar, $this->indentLevel);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function blockLines(OutputBlock $block)
+    {
+        $inner = $this->indentStr();
+
+        $glue = $this->break . $inner;
+
+        foreach ($block->lines as $index => $line) {
+            if (substr($line, 0, 2) === '/*') {
+                $block->lines[$index] = preg_replace('/\r\n?|\n|\f/', $this->break, $line);
+            }
+        }
+
+        $this->write($inner . implode($glue, $block->lines));
+
+        if (empty($block->selectors) || ! empty($block->children)) {
+            $this->write($this->break);
+        }
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Formatter/Nested.php b/civicrm/vendor/scssphp/scssphp/src/Formatter/Nested.php
new file mode 100644
index 0000000000000000000000000000000000000000..046ecc85b004cea2996f01775cf990b64cded6f3
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Formatter/Nested.php
@@ -0,0 +1,231 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Formatter;
+
+use ScssPhp\ScssPhp\Formatter;
+use ScssPhp\ScssPhp\Formatter\OutputBlock;
+use ScssPhp\ScssPhp\Type;
+
+/**
+ * Nested formatter
+ *
+ * @author Leaf Corcoran <leafot@gmail.com>
+ */
+class Nested extends Formatter
+{
+    /**
+     * @var integer
+     */
+    private $depth;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct()
+    {
+        $this->indentLevel = 0;
+        $this->indentChar = '  ';
+        $this->break = "\n";
+        $this->open = ' {';
+        $this->close = ' }';
+        $this->tagSeparator = ', ';
+        $this->assignSeparator = ': ';
+        $this->keepSemicolons = true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function indentStr()
+    {
+        $n = $this->depth - 1;
+
+        return str_repeat($this->indentChar, max($this->indentLevel + $n, 0));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function blockLines(OutputBlock $block)
+    {
+        $inner = $this->indentStr();
+        $glue  = $this->break . $inner;
+
+        foreach ($block->lines as $index => $line) {
+            if (substr($line, 0, 2) === '/*') {
+                $block->lines[$index] = preg_replace('/\r\n?|\n|\f/', $this->break, $line);
+            }
+        }
+
+        $this->write($inner . implode($glue, $block->lines));
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function block(OutputBlock $block)
+    {
+        static $depths;
+        static $downLevel;
+        static $closeBlock;
+        static $previousEmpty;
+        static $previousHasSelector;
+
+        if ($block->type === 'root') {
+            $depths = [ 0 ];
+            $downLevel = '';
+            $closeBlock = '';
+            $this->depth = 0;
+            $previousEmpty = false;
+            $previousHasSelector = false;
+        }
+
+        $isMediaOrDirective = \in_array($block->type, [Type::T_DIRECTIVE, Type::T_MEDIA]);
+        $isSupport = ($block->type === Type::T_DIRECTIVE
+            && $block->selectors && strpos(implode('', $block->selectors), '@supports') !== false);
+
+        while ($block->depth < end($depths) || ($block->depth == 1 && end($depths) == 1)) {
+            array_pop($depths);
+            $this->depth--;
+
+            if (
+                ! $this->depth && ($block->depth <= 1 || (! $this->indentLevel && $block->type === Type::T_COMMENT)) &&
+                (($block->selectors && ! $isMediaOrDirective) || $previousHasSelector)
+            ) {
+                $downLevel = $this->break;
+            }
+
+            if (empty($block->lines) && empty($block->children)) {
+                $previousEmpty = true;
+            }
+        }
+
+        if (empty($block->lines) && empty($block->children)) {
+            return;
+        }
+
+        $this->currentBlock = $block;
+
+        if (! empty($block->lines) || (! empty($block->children) && ($this->depth < 1 || $isSupport))) {
+            if ($block->depth > end($depths)) {
+                if (! $previousEmpty || $this->depth < 1) {
+                    $this->depth++;
+
+                    $depths[] = $block->depth;
+                } else {
+                    // keep the current depth unchanged but take the block depth as a new reference for following blocks
+                    array_pop($depths);
+
+                    $depths[] = $block->depth;
+                }
+            }
+        }
+
+        $previousEmpty = ($block->type === Type::T_COMMENT);
+        $previousHasSelector = false;
+
+        if (! empty($block->selectors)) {
+            if ($closeBlock) {
+                $this->write($closeBlock);
+                $closeBlock = '';
+            }
+
+            if ($downLevel) {
+                $this->write($downLevel);
+                $downLevel = '';
+            }
+
+            $this->blockSelectors($block);
+
+            $this->indentLevel++;
+        }
+
+        if (! empty($block->lines)) {
+            if ($closeBlock) {
+                $this->write($closeBlock);
+                $closeBlock = '';
+            }
+
+            if ($downLevel) {
+                $this->write($downLevel);
+                $downLevel = '';
+            }
+
+            $this->blockLines($block);
+
+            $closeBlock = $this->break;
+        }
+
+        if (! empty($block->children)) {
+            if ($this->depth > 0 && ($isMediaOrDirective || ! $this->hasFlatChild($block))) {
+                array_pop($depths);
+
+                $this->depth--;
+                $this->blockChildren($block);
+                $this->depth++;
+
+                $depths[] = $block->depth;
+            } else {
+                $this->blockChildren($block);
+            }
+        }
+
+        // reclear to not be spoiled by children if T_DIRECTIVE
+        if ($block->type === Type::T_DIRECTIVE) {
+            $previousHasSelector = false;
+        }
+
+        if (! empty($block->selectors)) {
+            $this->indentLevel--;
+
+            if (! $this->keepSemicolons) {
+                $this->strippedSemicolon = '';
+            }
+
+            $this->write($this->close);
+
+            $closeBlock = $this->break;
+
+            if ($this->depth > 1 && ! empty($block->children)) {
+                array_pop($depths);
+                $this->depth--;
+            }
+
+            if (! $isMediaOrDirective) {
+                $previousHasSelector = true;
+            }
+        }
+
+        if ($block->type === 'root') {
+            $this->write($this->break);
+        }
+    }
+
+    /**
+     * Block has flat child
+     *
+     * @param \ScssPhp\ScssPhp\Formatter\OutputBlock $block
+     *
+     * @return boolean
+     */
+    private function hasFlatChild($block)
+    {
+        foreach ($block->children as $child) {
+            if (empty($child->selectors)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Formatter/OutputBlock.php b/civicrm/vendor/scssphp/scssphp/src/Formatter/OutputBlock.php
new file mode 100644
index 0000000000000000000000000000000000000000..8dcba7c91987be58ed17c15341abce3c2983d69e
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Formatter/OutputBlock.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Formatter;
+
+/**
+ * Output block
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class OutputBlock
+{
+    /**
+     * @var string
+     */
+    public $type;
+
+    /**
+     * @var integer
+     */
+    public $depth;
+
+    /**
+     * @var array
+     */
+    public $selectors;
+
+    /**
+     * @var array
+     */
+    public $lines;
+
+    /**
+     * @var array
+     */
+    public $children;
+
+    /**
+     * @var \ScssPhp\ScssPhp\Formatter\OutputBlock
+     */
+    public $parent;
+
+    /**
+     * @var string
+     */
+    public $sourceName;
+
+    /**
+     * @var integer
+     */
+    public $sourceLine;
+
+    /**
+     * @var integer
+     */
+    public $sourceColumn;
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Node.php b/civicrm/vendor/scssphp/scssphp/src/Node.php
new file mode 100644
index 0000000000000000000000000000000000000000..60d357e0ad87a608b5e3c1d040b5be909b3b429a
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Node.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+/**
+ * Base node
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+abstract class Node
+{
+    /**
+     * @var string
+     */
+    public $type;
+
+    /**
+     * @var integer
+     */
+    public $sourceIndex;
+
+    /**
+     * @var integer
+     */
+    public $sourceLine;
+
+    /**
+     * @var integer
+     */
+    public $sourceColumn;
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Node/Number.php b/civicrm/vendor/scssphp/scssphp/src/Node/Number.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f2099f58f0269acdab2a0b2e6357f78fed3a565
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Node/Number.php
@@ -0,0 +1,395 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\Node;
+
+use ScssPhp\ScssPhp\Compiler;
+use ScssPhp\ScssPhp\Node;
+use ScssPhp\ScssPhp\Type;
+
+/**
+ * Dimension + optional units
+ *
+ * {@internal
+ *     This is a work-in-progress.
+ *
+ *     The \ArrayAccess interface is temporary until the migration is complete.
+ * }}
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Number extends Node implements \ArrayAccess
+{
+    const PRECISION = 10;
+
+    /**
+     * @var integer
+     * @deprecated use {Number::PRECISION} instead to read the precision. Configuring it is not supported anymore.
+     */
+    public static $precision = self::PRECISION;
+
+    /**
+     * @see http://www.w3.org/TR/2012/WD-css3-values-20120308/
+     *
+     * @var array
+     */
+    protected static $unitTable = [
+        'in' => [
+            'in' => 1,
+            'pc' => 6,
+            'pt' => 72,
+            'px' => 96,
+            'cm' => 2.54,
+            'mm' => 25.4,
+            'q'  => 101.6,
+        ],
+        'turn' => [
+            'deg'  => 360,
+            'grad' => 400,
+            'rad'  => 6.28318530717958647692528676, // 2 * M_PI
+            'turn' => 1,
+        ],
+        's' => [
+            's'  => 1,
+            'ms' => 1000,
+        ],
+        'Hz' => [
+            'Hz'  => 1,
+            'kHz' => 0.001,
+        ],
+        'dpi' => [
+            'dpi'  => 1,
+            'dpcm' => 1 / 2.54,
+            'dppx' => 1 / 96,
+        ],
+    ];
+
+    /**
+     * @var integer|float
+     */
+    public $dimension;
+
+    /**
+     * @var array
+     */
+    public $units;
+
+    /**
+     * Initialize number
+     *
+     * @param mixed $dimension
+     * @param mixed $initialUnit
+     */
+    public function __construct($dimension, $initialUnit)
+    {
+        $this->type      = Type::T_NUMBER;
+        $this->dimension = $dimension;
+        $this->units     = \is_array($initialUnit)
+            ? $initialUnit
+            : ($initialUnit ? [$initialUnit => 1]
+                            : []);
+    }
+
+    /**
+     * Coerce number to target units
+     *
+     * @param array $units
+     *
+     * @return \ScssPhp\ScssPhp\Node\Number
+     */
+    public function coerce($units)
+    {
+        if ($this->unitless()) {
+            return new Number($this->dimension, $units);
+        }
+
+        $dimension = $this->dimension;
+
+        if (\count($units)) {
+            $baseUnit = array_keys($units);
+            $baseUnit = reset($baseUnit);
+            $baseUnit = $this->findBaseUnit($baseUnit);
+            if ($baseUnit && isset(static::$unitTable[$baseUnit])) {
+                foreach (static::$unitTable[$baseUnit] as $unit => $conv) {
+                    $from       = isset($this->units[$unit]) ? $this->units[$unit] : 0;
+                    $to         = isset($units[$unit]) ? $units[$unit] : 0;
+                    $factor     = pow($conv, $from - $to);
+                    $dimension /= $factor;
+                }
+            }
+        }
+
+        return new Number($dimension, $units);
+    }
+
+    /**
+     * Normalize number
+     *
+     * @return \ScssPhp\ScssPhp\Node\Number
+     */
+    public function normalize()
+    {
+        $dimension = $this->dimension;
+        $units     = [];
+
+        $this->normalizeUnits($dimension, $units);
+
+        return new Number($dimension, $units);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function offsetExists($offset)
+    {
+        if ($offset === -3) {
+            return ! \is_null($this->sourceColumn);
+        }
+
+        if ($offset === -2) {
+            return ! \is_null($this->sourceLine);
+        }
+
+        if (
+            $offset === -1 ||
+            $offset === 0 ||
+            $offset === 1 ||
+            $offset === 2
+        ) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function offsetGet($offset)
+    {
+        switch ($offset) {
+            case -3:
+                return $this->sourceColumn;
+
+            case -2:
+                return $this->sourceLine;
+
+            case -1:
+                return $this->sourceIndex;
+
+            case 0:
+                return $this->type;
+
+            case 1:
+                return $this->dimension;
+
+            case 2:
+                return $this->units;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function offsetSet($offset, $value)
+    {
+        if ($offset === 1) {
+            $this->dimension = $value;
+        } elseif ($offset === 2) {
+            $this->units = $value;
+        } elseif ($offset == -1) {
+            $this->sourceIndex = $value;
+        } elseif ($offset == -2) {
+            $this->sourceLine = $value;
+        } elseif ($offset == -3) {
+            $this->sourceColumn = $value;
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function offsetUnset($offset)
+    {
+        if ($offset === 1) {
+            $this->dimension = null;
+        } elseif ($offset === 2) {
+            $this->units = null;
+        } elseif ($offset === -1) {
+            $this->sourceIndex = null;
+        } elseif ($offset === -2) {
+            $this->sourceLine = null;
+        } elseif ($offset === -3) {
+            $this->sourceColumn = null;
+        }
+    }
+
+    /**
+     * Returns true if the number is unitless
+     *
+     * @return boolean
+     */
+    public function unitless()
+    {
+        return ! array_sum($this->units);
+    }
+
+    /**
+     * Test if a number can be normalized in a base unit
+     * ie if its units are homogeneous
+     *
+     * @return boolean
+     */
+    public function isNormalizable()
+    {
+        if ($this->unitless()) {
+            return false;
+        }
+
+        $baseUnit = null;
+
+        foreach ($this->units as $unit => $exp) {
+            $b = $this->findBaseUnit($unit);
+
+            if (\is_null($baseUnit)) {
+                $baseUnit = $b;
+            }
+
+            if (\is_null($b) or $b !== $baseUnit) {
+                return false;
+            }
+        }
+
+        return $baseUnit;
+    }
+
+    /**
+     * Returns unit(s) as the product of numerator units divided by the product of denominator units
+     *
+     * @return string
+     */
+    public function unitStr()
+    {
+        $numerators   = [];
+        $denominators = [];
+
+        foreach ($this->units as $unit => $unitSize) {
+            if ($unitSize > 0) {
+                $numerators = array_pad($numerators, \count($numerators) + $unitSize, $unit);
+                continue;
+            }
+
+            if ($unitSize < 0) {
+                $denominators = array_pad($denominators, \count($denominators) - $unitSize, $unit);
+                continue;
+            }
+        }
+
+        return implode('*', $numerators) . (\count($denominators) ? '/' . implode('*', $denominators) : '');
+    }
+
+    /**
+     * Output number
+     *
+     * @param \ScssPhp\ScssPhp\Compiler $compiler
+     *
+     * @return string
+     */
+    public function output(Compiler $compiler = null)
+    {
+        $dimension = round($this->dimension, self::PRECISION);
+
+        $units = array_filter($this->units, function ($unitSize) {
+            return $unitSize;
+        });
+
+        if (\count($units) > 1 && array_sum($units) === 0) {
+            $dimension = $this->dimension;
+            $units     = [];
+
+            $this->normalizeUnits($dimension, $units);
+
+            $dimension = round($dimension, self::PRECISION);
+            $units     = array_filter($units, function ($unitSize) {
+                return $unitSize;
+            });
+        }
+
+        $unitSize = array_sum($units);
+
+        if ($compiler && ($unitSize > 1 || $unitSize < 0 || \count($units) > 1)) {
+            $this->units = $units;
+            $unit = $this->unitStr();
+        } else {
+            reset($units);
+            $unit = key($units);
+        }
+
+        $dimension = number_format($dimension, self::PRECISION, '.', '');
+
+        return (self::PRECISION ? rtrim(rtrim($dimension, '0'), '.') : $dimension) . $unit;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __toString()
+    {
+        return $this->output();
+    }
+
+    /**
+     * Normalize units
+     *
+     * @param integer|float $dimension
+     * @param array         $units
+     * @param string        $baseUnit
+     */
+    private function normalizeUnits(&$dimension, &$units, $baseUnit = null)
+    {
+        $dimension = $this->dimension;
+        $units     = [];
+
+        foreach ($this->units as $unit => $exp) {
+            if (! $baseUnit) {
+                $baseUnit = $this->findBaseUnit($unit);
+            }
+
+            if ($baseUnit && isset(static::$unitTable[$baseUnit][$unit])) {
+                $factor = pow(static::$unitTable[$baseUnit][$unit], $exp);
+
+                $unit = $baseUnit;
+                $dimension /= $factor;
+            }
+
+            $units[$unit] = $exp + (isset($units[$unit]) ? $units[$unit] : 0);
+        }
+    }
+
+    /**
+     * Find the base unit family for a given unit
+     *
+     * @param string $unit
+     *
+     * @return string|null
+     */
+    private function findBaseUnit($unit)
+    {
+        foreach (static::$unitTable as $baseUnit => $unitVariants) {
+            if (isset($unitVariants[$unit])) {
+                return $baseUnit;
+            }
+        }
+
+        return null;
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Parser.php b/civicrm/vendor/scssphp/scssphp/src/Parser.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b47f15330a841a7e0c40ea9e0347178cd686371
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Parser.php
@@ -0,0 +1,3916 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+use ScssPhp\ScssPhp\Block;
+use ScssPhp\ScssPhp\Cache;
+use ScssPhp\ScssPhp\Compiler;
+use ScssPhp\ScssPhp\Exception\ParserException;
+use ScssPhp\ScssPhp\Node;
+use ScssPhp\ScssPhp\Type;
+
+/**
+ * Parser
+ *
+ * @author Leaf Corcoran <leafot@gmail.com>
+ */
+class Parser
+{
+    const SOURCE_INDEX  = -1;
+    const SOURCE_LINE   = -2;
+    const SOURCE_COLUMN = -3;
+
+    /**
+     * @var array
+     */
+    protected static $precedence = [
+        '='   => 0,
+        'or'  => 1,
+        'and' => 2,
+        '=='  => 3,
+        '!='  => 3,
+        '<=>' => 3,
+        '<='  => 4,
+        '>='  => 4,
+        '<'   => 4,
+        '>'   => 4,
+        '+'   => 5,
+        '-'   => 5,
+        '*'   => 6,
+        '/'   => 6,
+        '%'   => 6,
+    ];
+
+    protected static $commentPattern;
+    protected static $operatorPattern;
+    protected static $whitePattern;
+
+    protected $cache;
+
+    private $sourceName;
+    private $sourceIndex;
+    private $sourcePositions;
+    private $charset;
+    private $count;
+    private $env;
+    private $inParens;
+    private $eatWhiteDefault;
+    private $discardComments;
+    private $allowVars;
+    private $buffer;
+    private $utf8;
+    private $encoding;
+    private $patternModifiers;
+    private $commentsSeen;
+
+    private $cssOnly;
+
+    /**
+     * Constructor
+     *
+     * @api
+     *
+     * @param string                 $sourceName
+     * @param integer                $sourceIndex
+     * @param string                 $encoding
+     * @param \ScssPhp\ScssPhp\Cache $cache
+     */
+    public function __construct($sourceName, $sourceIndex = 0, $encoding = 'utf-8', $cache = null, $cssOnly = false)
+    {
+        $this->sourceName       = $sourceName ?: '(stdin)';
+        $this->sourceIndex      = $sourceIndex;
+        $this->charset          = null;
+        $this->utf8             = ! $encoding || strtolower($encoding) === 'utf-8';
+        $this->patternModifiers = $this->utf8 ? 'Aisu' : 'Ais';
+        $this->commentsSeen     = [];
+        $this->commentsSeen     = [];
+        $this->allowVars        = true;
+        $this->cssOnly          = $cssOnly;
+
+        if (empty(static::$operatorPattern)) {
+            static::$operatorPattern = '([*\/%+-]|[!=]\=|\>\=?|\<\=\>|\<\=?|and|or)';
+
+            $commentSingle      = '\/\/';
+            $commentMultiLeft   = '\/\*';
+            $commentMultiRight  = '\*\/';
+
+            static::$commentPattern = $commentMultiLeft . '.*?' . $commentMultiRight;
+            static::$whitePattern = $this->utf8
+                ? '/' . $commentSingle . '[^\n]*\s*|(' . static::$commentPattern . ')\s*|\s+/AisuS'
+                : '/' . $commentSingle . '[^\n]*\s*|(' . static::$commentPattern . ')\s*|\s+/AisS';
+        }
+
+        if ($cache) {
+            $this->cache = $cache;
+        }
+    }
+
+    /**
+     * Get source file name
+     *
+     * @api
+     *
+     * @return string
+     */
+    public function getSourceName()
+    {
+        return $this->sourceName;
+    }
+
+    /**
+     * Throw parser error
+     *
+     * @api
+     *
+     * @param string $msg
+     *
+     * @throws \ScssPhp\ScssPhp\Exception\ParserException
+     */
+    public function throwParseError($msg = 'parse error')
+    {
+        list($line, $column) = $this->getSourcePosition($this->count);
+
+        $loc = empty($this->sourceName)
+             ? "line: $line, column: $column"
+             : "$this->sourceName on line $line, at column $column";
+
+        if ($this->peek('(.*?)(\n|$)', $m, $this->count)) {
+            $this->restoreEncoding();
+
+            $e = new ParserException("$msg: failed at `$m[1]` $loc");
+            $e->setSourcePosition([$this->sourceName, $line, $column]);
+
+            throw $e;
+        }
+
+        $this->restoreEncoding();
+
+        $e = new ParserException("$msg: $loc");
+        $e->setSourcePosition([$this->sourceName, $line, $column]);
+
+        throw $e;
+    }
+
+    /**
+     * Parser buffer
+     *
+     * @api
+     *
+     * @param string $buffer
+     *
+     * @return \ScssPhp\ScssPhp\Block
+     */
+    public function parse($buffer)
+    {
+        if ($this->cache) {
+            $cacheKey = $this->sourceName . ':' . md5($buffer);
+            $parseOptions = [
+                'charset' => $this->charset,
+                'utf8' => $this->utf8,
+            ];
+            $v = $this->cache->getCache('parse', $cacheKey, $parseOptions);
+
+            if (! \is_null($v)) {
+                return $v;
+            }
+        }
+
+        // strip BOM (byte order marker)
+        if (substr($buffer, 0, 3) === "\xef\xbb\xbf") {
+            $buffer = substr($buffer, 3);
+        }
+
+        $this->buffer          = rtrim($buffer, "\x00..\x1f");
+        $this->count           = 0;
+        $this->env             = null;
+        $this->inParens        = false;
+        $this->eatWhiteDefault = true;
+
+        $this->saveEncoding();
+        $this->extractLineNumbers($buffer);
+
+        $this->pushBlock(null); // root block
+        $this->whitespace();
+        $this->pushBlock(null);
+        $this->popBlock();
+
+        while ($this->parseChunk()) {
+            ;
+        }
+
+        if ($this->count !== \strlen($this->buffer)) {
+            $this->throwParseError();
+        }
+
+        if (! empty($this->env->parent)) {
+            $this->throwParseError('unclosed block');
+        }
+
+        if ($this->charset) {
+            array_unshift($this->env->children, $this->charset);
+        }
+
+        $this->restoreEncoding();
+
+        if ($this->cache) {
+            $this->cache->setCache('parse', $cacheKey, $this->env, $parseOptions);
+        }
+
+        return $this->env;
+    }
+
+    /**
+     * Parse a value or value list
+     *
+     * @api
+     *
+     * @param string       $buffer
+     * @param string|array $out
+     *
+     * @return boolean
+     */
+    public function parseValue($buffer, &$out)
+    {
+        $this->count           = 0;
+        $this->env             = null;
+        $this->inParens        = false;
+        $this->eatWhiteDefault = true;
+        $this->buffer          = (string) $buffer;
+
+        $this->saveEncoding();
+
+        $list = $this->valueList($out);
+
+        $this->restoreEncoding();
+
+        return $list;
+    }
+
+    /**
+     * Parse a selector or selector list
+     *
+     * @api
+     *
+     * @param string       $buffer
+     * @param string|array $out
+     *
+     * @return boolean
+     */
+    public function parseSelector($buffer, &$out)
+    {
+        $this->count           = 0;
+        $this->env             = null;
+        $this->inParens        = false;
+        $this->eatWhiteDefault = true;
+        $this->buffer          = (string) $buffer;
+
+        $this->saveEncoding();
+
+        $selector = $this->selectors($out);
+
+        $this->restoreEncoding();
+
+        return $selector;
+    }
+
+    /**
+     * Parse a media Query
+     *
+     * @api
+     *
+     * @param string       $buffer
+     * @param string|array $out
+     *
+     * @return boolean
+     */
+    public function parseMediaQueryList($buffer, &$out)
+    {
+        $this->count           = 0;
+        $this->env             = null;
+        $this->inParens        = false;
+        $this->eatWhiteDefault = true;
+        $this->buffer          = (string) $buffer;
+
+        $this->saveEncoding();
+
+        $isMediaQuery = $this->mediaQueryList($out);
+
+        $this->restoreEncoding();
+
+        return $isMediaQuery;
+    }
+
+    /**
+     * Parse a single chunk off the head of the buffer and append it to the
+     * current parse environment.
+     *
+     * Returns false when the buffer is empty, or when there is an error.
+     *
+     * This function is called repeatedly until the entire document is
+     * parsed.
+     *
+     * This parser is most similar to a recursive descent parser. Single
+     * functions represent discrete grammatical rules for the language, and
+     * they are able to capture the text that represents those rules.
+     *
+     * Consider the function Compiler::keyword(). (All parse functions are
+     * structured the same.)
+     *
+     * The function takes a single reference argument. When calling the
+     * function it will attempt to match a keyword on the head of the buffer.
+     * If it is successful, it will place the keyword in the referenced
+     * argument, advance the position in the buffer, and return true. If it
+     * fails then it won't advance the buffer and it will return false.
+     *
+     * All of these parse functions are powered by Compiler::match(), which behaves
+     * the same way, but takes a literal regular expression. Sometimes it is
+     * more convenient to use match instead of creating a new function.
+     *
+     * Because of the format of the functions, to parse an entire string of
+     * grammatical rules, you can chain them together using &&.
+     *
+     * But, if some of the rules in the chain succeed before one fails, then
+     * the buffer position will be left at an invalid state. In order to
+     * avoid this, Compiler::seek() is used to remember and set buffer positions.
+     *
+     * Before parsing a chain, use $s = $this->count to remember the current
+     * position into $s. Then if a chain fails, use $this->seek($s) to
+     * go back where we started.
+     *
+     * @return boolean
+     */
+    protected function parseChunk()
+    {
+        $s = $this->count;
+
+        // the directives
+        if (isset($this->buffer[$this->count]) && $this->buffer[$this->count] === '@') {
+            if (
+                $this->literal('@at-root', 8) &&
+                ($this->selectors($selector) || true) &&
+                ($this->map($with) || true) &&
+                (($this->matchChar('(') &&
+                    $this->interpolation($with) &&
+                    $this->matchChar(')')) || true) &&
+                $this->matchChar('{', false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $atRoot = $this->pushSpecialBlock(Type::T_AT_ROOT, $s);
+                $atRoot->selector = $selector;
+                $atRoot->with     = $with;
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@media', 6) &&
+                $this->mediaQueryList($mediaQueryList) &&
+                $this->matchChar('{', false)
+            ) {
+                $media = $this->pushSpecialBlock(Type::T_MEDIA, $s);
+                $media->queryList = $mediaQueryList[2];
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@mixin', 6) &&
+                $this->keyword($mixinName) &&
+                ($this->argumentDef($args) || true) &&
+                $this->matchChar('{', false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $mixin = $this->pushSpecialBlock(Type::T_MIXIN, $s);
+                $mixin->name = $mixinName;
+                $mixin->args = $args;
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                ($this->literal('@include', 8) &&
+                    $this->keyword($mixinName) &&
+                    ($this->matchChar('(') &&
+                    ($this->argValues($argValues) || true) &&
+                    $this->matchChar(')') || true) &&
+                    ($this->end()) ||
+                ($this->literal('using', 5) &&
+                    $this->argumentDef($argUsing) &&
+                    ($this->end() || $this->matchChar('{') && $hasBlock = true)) ||
+                $this->matchChar('{') && $hasBlock = true)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $child = [
+                    Type::T_INCLUDE,
+                    $mixinName,
+                    isset($argValues) ? $argValues : null,
+                    null,
+                    isset($argUsing) ? $argUsing : null
+                ];
+
+                if (! empty($hasBlock)) {
+                    $include = $this->pushSpecialBlock(Type::T_INCLUDE, $s);
+                    $include->child = $child;
+                } else {
+                    $this->append($child, $s);
+                }
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@scssphp-import-once', 20) &&
+                $this->valueList($importPath) &&
+                $this->end()
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $this->append([Type::T_SCSSPHP_IMPORT_ONCE, $importPath], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@import', 7) &&
+                $this->valueList($importPath) &&
+                $importPath[0] !== Type::T_FUNCTION_CALL &&
+                $this->end()
+            ) {
+                if ($this->cssOnly) {
+                    $this->assertPlainCssValid($importPath, $s);
+                    $this->append([Type::T_COMMENT, rtrim(substr($this->buffer, $s, $this->count - $s))]);
+                    return true;
+                }
+
+                $this->append([Type::T_IMPORT, $importPath], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@import', 7) &&
+                $this->url($importPath) &&
+                $this->end()
+            ) {
+                if ($this->cssOnly) {
+                    $this->assertPlainCssValid($importPath, $s);
+                    $this->append([Type::T_COMMENT, rtrim(substr($this->buffer, $s, $this->count - $s))]);
+                    return true;
+                }
+
+                $this->append([Type::T_IMPORT, $importPath], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@extend', 7) &&
+                $this->selectors($selectors) &&
+                $this->end()
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                // check for '!flag'
+                $optional = $this->stripOptionalFlag($selectors);
+                $this->append([Type::T_EXTEND, $selectors, $optional], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@function', 9) &&
+                $this->keyword($fnName) &&
+                $this->argumentDef($args) &&
+                $this->matchChar('{', false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $func = $this->pushSpecialBlock(Type::T_FUNCTION, $s);
+                $func->name = $fnName;
+                $func->args = $args;
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@break', 6) &&
+                $this->end()
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $this->append([Type::T_BREAK], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@continue', 9) &&
+                $this->end()
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $this->append([Type::T_CONTINUE], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@return', 7) &&
+                ($this->valueList($retVal) || true) &&
+                $this->end()
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $this->append([Type::T_RETURN, isset($retVal) ? $retVal : [Type::T_NULL]], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@each', 5) &&
+                $this->genericList($varNames, 'variable', ',', false) &&
+                $this->literal('in', 2) &&
+                $this->valueList($list) &&
+                $this->matchChar('{', false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $each = $this->pushSpecialBlock(Type::T_EACH, $s);
+
+                foreach ($varNames[2] as $varName) {
+                    $each->vars[] = $varName[1];
+                }
+
+                $each->list = $list;
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@while', 6) &&
+                $this->expression($cond) &&
+                $this->matchChar('{', false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                while (
+                    $cond[0] === Type::T_LIST &&
+                    ! empty($cond['enclosing']) &&
+                    $cond['enclosing'] === 'parent' &&
+                    \count($cond[2]) == 1
+                ) {
+                    $cond = reset($cond[2]);
+                }
+
+                $while = $this->pushSpecialBlock(Type::T_WHILE, $s);
+                $while->cond = $cond;
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@for', 4) &&
+                $this->variable($varName) &&
+                $this->literal('from', 4) &&
+                $this->expression($start) &&
+                ($this->literal('through', 7) ||
+                    ($forUntil = true && $this->literal('to', 2))) &&
+                $this->expression($end) &&
+                $this->matchChar('{', false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $for = $this->pushSpecialBlock(Type::T_FOR, $s);
+                $for->var   = $varName[1];
+                $for->start = $start;
+                $for->end   = $end;
+                $for->until = isset($forUntil);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@if', 3) &&
+                $this->functionCallArgumentsList($cond, false, '{', false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $if = $this->pushSpecialBlock(Type::T_IF, $s);
+
+                while (
+                    $cond[0] === Type::T_LIST &&
+                    ! empty($cond['enclosing']) &&
+                    $cond['enclosing'] === 'parent' &&
+                    \count($cond[2]) == 1
+                ) {
+                    $cond = reset($cond[2]);
+                }
+
+                $if->cond  = $cond;
+                $if->cases = [];
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@debug', 6) &&
+                $this->functionCallArgumentsList($value, false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $this->append([Type::T_DEBUG, $value], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@warn', 5) &&
+                $this->functionCallArgumentsList($value, false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $this->append([Type::T_WARN, $value], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@error', 6) &&
+                $this->functionCallArgumentsList($value, false)
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $this->append([Type::T_ERROR, $value], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@content', 8) &&
+                ($this->end() ||
+                    $this->matchChar('(') &&
+                    $this->argValues($argContent) &&
+                    $this->matchChar(')') &&
+                    $this->end())
+            ) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+                $this->append([Type::T_MIXIN_CONTENT, isset($argContent) ? $argContent : null], $s);
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            $last = $this->last();
+
+            if (isset($last) && $last[0] === Type::T_IF) {
+                list(, $if) = $last;
+
+                if ($this->literal('@else', 5)) {
+                    if ($this->matchChar('{', false)) {
+                        $else = $this->pushSpecialBlock(Type::T_ELSE, $s);
+                    } elseif (
+                        $this->literal('if', 2) &&
+                        $this->valueList($cond) &&
+                        $this->matchChar('{', false)
+                    ) {
+                        $else = $this->pushSpecialBlock(Type::T_ELSEIF, $s);
+                        $else->cond = $cond;
+                    }
+
+                    if (isset($else)) {
+                        $else->dontAppend = true;
+                        $if->cases[] = $else;
+
+                        return true;
+                    }
+                }
+
+                $this->seek($s);
+            }
+
+            // only retain the first @charset directive encountered
+            if (
+                $this->literal('@charset', 8) &&
+                $this->valueList($charset) &&
+                $this->end()
+            ) {
+                if (! isset($this->charset)) {
+                    $statement = [Type::T_CHARSET, $charset];
+
+                    list($line, $column) = $this->getSourcePosition($s);
+
+                    $statement[static::SOURCE_LINE]   = $line;
+                    $statement[static::SOURCE_COLUMN] = $column;
+                    $statement[static::SOURCE_INDEX]  = $this->sourceIndex;
+
+                    $this->charset = $statement;
+                }
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->literal('@supports', 9) &&
+                ($t1 = $this->supportsQuery($supportQuery)) &&
+                ($t2 = $this->matchChar('{', false))
+            ) {
+                $directive = $this->pushSpecialBlock(Type::T_DIRECTIVE, $s);
+                $directive->name  = 'supports';
+                $directive->value = $supportQuery;
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            // doesn't match built in directive, do generic one
+            if (
+                $this->matchChar('@', false) &&
+                $this->mixedKeyword($dirName) &&
+                $this->directiveValue($dirValue, '{')
+            ) {
+                if (count($dirName) === 1 && is_string(reset($dirName))) {
+                    $dirName = reset($dirName);
+                } else {
+                    $dirName = [Type::T_STRING, '', $dirName];
+                }
+                if ($dirName === 'media') {
+                    $directive = $this->pushSpecialBlock(Type::T_MEDIA, $s);
+                } else {
+                    $directive = $this->pushSpecialBlock(Type::T_DIRECTIVE, $s);
+                    $directive->name = $dirName;
+                }
+
+                if (isset($dirValue)) {
+                    ! $this->cssOnly || ($dirValue = $this->assertPlainCssValid($dirValue));
+                    $directive->value = $dirValue;
+                }
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            // maybe it's a generic blockless directive
+            if (
+                $this->matchChar('@', false) &&
+                $this->mixedKeyword($dirName) &&
+                ! $this->isKnownGenericDirective($dirName) &&
+                ($this->end(false) || ($this->directiveValue($dirValue, '') && $this->end(false)))
+            ) {
+                if (\count($dirName) === 1 && \is_string(\reset($dirName))) {
+                    $dirName = \reset($dirName);
+                } else {
+                    $dirName = [Type::T_STRING, '', $dirName];
+                }
+                if (
+                    ! empty($this->env->parent) &&
+                    $this->env->type &&
+                    ! \in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA])
+                ) {
+                    $plain = \trim(\substr($this->buffer, $s, $this->count - $s));
+                    $this->throwParseError(
+                        "Unknown directive `{$plain}` not allowed in `" . $this->env->type . "` block"
+                    );
+                }
+                // blockless directives with a blank line after keeps their blank lines after
+                // sass-spec compliance purpose
+                $s = $this->count;
+                $hasBlankLine = false;
+                if ($this->match('\s*?\n\s*\n', $out, false)) {
+                    $hasBlankLine = true;
+                    $this->seek($s);
+                }
+                $isNotRoot = ! empty($this->env->parent);
+                $this->append([Type::T_DIRECTIVE, [$dirName, $dirValue, $hasBlankLine, $isNotRoot]], $s);
+                $this->whitespace();
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            return false;
+        }
+
+        $inCssSelector = null;
+        if ($this->cssOnly) {
+            $inCssSelector = (! empty($this->env->parent) &&
+                ! in_array($this->env->type, [Type::T_DIRECTIVE, Type::T_MEDIA]));
+        }
+        // custom properties : right part is static
+        if (($this->customProperty($name) ) && $this->matchChar(':', false)) {
+            $start = $this->count;
+
+            // but can be complex and finish with ; or }
+            foreach ([';','}'] as $ending) {
+                if (
+                    $this->openString($ending, $stringValue, '(', ')', false) &&
+                    $this->end()
+                ) {
+                    $end = $this->count;
+                    $value = $stringValue;
+
+                    // check if we have only a partial value due to nested [] or { } to take in account
+                    $nestingPairs = [['[', ']'], ['{', '}']];
+
+                    foreach ($nestingPairs as $nestingPair) {
+                        $p = strpos($this->buffer, $nestingPair[0], $start);
+
+                        if ($p && $p < $end) {
+                            $this->seek($start);
+
+                            if (
+                                $this->openString($ending, $stringValue, $nestingPair[0], $nestingPair[1], false) &&
+                                $this->end() &&
+                                $this->count > $end
+                            ) {
+                                $end = $this->count;
+                                $value = $stringValue;
+                            }
+                        }
+                    }
+
+                    $this->seek($end);
+                    $this->append([Type::T_CUSTOM_PROPERTY, $name, $value], $s);
+
+                    return true;
+                }
+            }
+
+            // TODO: output an error here if nothing found according to sass spec
+        }
+
+        $this->seek($s);
+
+        // property shortcut
+        // captures most properties before having to parse a selector
+        if (
+            $this->keyword($name, false) &&
+            $this->literal(': ', 2) &&
+            $this->valueList($value) &&
+            $this->end()
+        ) {
+            $name = [Type::T_STRING, '', [$name]];
+            $this->append([Type::T_ASSIGN, $name, $value], $s);
+
+            return true;
+        }
+
+        $this->seek($s);
+
+        // variable assigns
+        if (
+            $this->variable($name) &&
+            $this->matchChar(':') &&
+            $this->valueList($value) &&
+            $this->end()
+        ) {
+            ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+
+            // check for '!flag'
+            $assignmentFlags = $this->stripAssignmentFlags($value);
+            $this->append([Type::T_ASSIGN, $name, $value, $assignmentFlags], $s);
+
+            return true;
+        }
+
+        $this->seek($s);
+
+        // misc
+        if ($this->literal('-->', 3)) {
+            return true;
+        }
+
+        // opening css block
+        if (
+            $this->selectors($selectors) &&
+            $this->matchChar('{', false)
+        ) {
+            ! $this->cssOnly || ! $inCssSelector || $this->assertPlainCssValid(false);
+
+            $this->pushBlock($selectors, $s);
+
+            if ($this->eatWhiteDefault) {
+                $this->whitespace();
+                $this->append(null); // collect comments at the beginning if needed
+            }
+
+            return true;
+        }
+
+        $this->seek($s);
+
+        // property assign, or nested assign
+        if (
+            $this->propertyName($name) &&
+            $this->matchChar(':')
+        ) {
+            $foundSomething = false;
+
+            if ($this->valueList($value)) {
+                if (empty($this->env->parent)) {
+                    $this->throwParseError('expected "{"');
+                }
+
+                $this->append([Type::T_ASSIGN, $name, $value], $s);
+                $foundSomething = true;
+            }
+
+            if ($this->matchChar('{', false)) {
+                ! $this->cssOnly || $this->assertPlainCssValid(false);
+
+                $propBlock = $this->pushSpecialBlock(Type::T_NESTED_PROPERTY, $s);
+                $propBlock->prefix = $name;
+                $propBlock->hasValue = $foundSomething;
+
+                $foundSomething = true;
+            } elseif ($foundSomething) {
+                $foundSomething = $this->end();
+            }
+
+            if ($foundSomething) {
+                return true;
+            }
+        }
+
+        $this->seek($s);
+
+        // closing a block
+        if ($this->matchChar('}', false)) {
+            $block = $this->popBlock();
+
+            if (! isset($block->type) || $block->type !== Type::T_IF) {
+                if ($this->env->parent) {
+                    $this->append(null); // collect comments before next statement if needed
+                }
+            }
+
+            if (isset($block->type) && $block->type === Type::T_INCLUDE) {
+                $include = $block->child;
+                unset($block->child);
+                $include[3] = $block;
+                $this->append($include, $s);
+            } elseif (empty($block->dontAppend)) {
+                $type = isset($block->type) ? $block->type : Type::T_BLOCK;
+                $this->append([$type, $block], $s);
+            }
+
+            // collect comments just after the block closing if needed
+            if ($this->eatWhiteDefault) {
+                $this->whitespace();
+
+                if ($this->env->comments) {
+                    $this->append(null);
+                }
+            }
+
+            return true;
+        }
+
+        // extra stuff
+        if (
+            $this->matchChar(';') ||
+            $this->literal('<!--', 4)
+        ) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Push block onto parse tree
+     *
+     * @param array   $selectors
+     * @param integer $pos
+     *
+     * @return \ScssPhp\ScssPhp\Block
+     */
+    protected function pushBlock($selectors, $pos = 0)
+    {
+        list($line, $column) = $this->getSourcePosition($pos);
+
+        $b = new Block();
+        $b->sourceName   = $this->sourceName;
+        $b->sourceLine   = $line;
+        $b->sourceColumn = $column;
+        $b->sourceIndex  = $this->sourceIndex;
+        $b->selectors    = $selectors;
+        $b->comments     = [];
+        $b->parent       = $this->env;
+
+        if (! $this->env) {
+            $b->children = [];
+        } elseif (empty($this->env->children)) {
+            $this->env->children = $this->env->comments;
+            $b->children = [];
+            $this->env->comments = [];
+        } else {
+            $b->children = $this->env->comments;
+            $this->env->comments = [];
+        }
+
+        $this->env = $b;
+
+        // collect comments at the beginning of a block if needed
+        if ($this->eatWhiteDefault) {
+            $this->whitespace();
+
+            if ($this->env->comments) {
+                $this->append(null);
+            }
+        }
+
+        return $b;
+    }
+
+    /**
+     * Push special (named) block onto parse tree
+     *
+     * @param string  $type
+     * @param integer $pos
+     *
+     * @return \ScssPhp\ScssPhp\Block
+     */
+    protected function pushSpecialBlock($type, $pos)
+    {
+        $block = $this->pushBlock(null, $pos);
+        $block->type = $type;
+
+        return $block;
+    }
+
+    /**
+     * Pop scope and return last block
+     *
+     * @return \ScssPhp\ScssPhp\Block
+     *
+     * @throws \Exception
+     */
+    protected function popBlock()
+    {
+
+        // collect comments ending just before of a block closing
+        if ($this->env->comments) {
+            $this->append(null);
+        }
+
+        // pop the block
+        $block = $this->env;
+
+        if (empty($block->parent)) {
+            $this->throwParseError('unexpected }');
+        }
+
+        if ($block->type == Type::T_AT_ROOT) {
+            // keeps the parent in case of self selector &
+            $block->selfParent = $block->parent;
+        }
+
+        $this->env = $block->parent;
+
+        unset($block->parent);
+
+        return $block;
+    }
+
+    /**
+     * Peek input stream
+     *
+     * @param string  $regex
+     * @param array   $out
+     * @param integer $from
+     *
+     * @return integer
+     */
+    protected function peek($regex, &$out, $from = null)
+    {
+        if (! isset($from)) {
+            $from = $this->count;
+        }
+
+        $r = '/' . $regex . '/' . $this->patternModifiers;
+        $result = preg_match($r, $this->buffer, $out, null, $from);
+
+        return $result;
+    }
+
+    /**
+     * Seek to position in input stream (or return current position in input stream)
+     *
+     * @param integer $where
+     */
+    protected function seek($where)
+    {
+        $this->count = $where;
+    }
+
+    /**
+     * Assert a parsed part is plain CSS Valid
+     *
+     * @param array $parsed
+     * @param int $startPos
+     * @throws ParserException
+     */
+    protected function assertPlainCssValid($parsed, $startPos = null)
+    {
+        $type = '';
+        if ($parsed) {
+            $type = $parsed[0];
+            $parsed = $this->isPlainCssValidElement($parsed);
+        }
+        if (! $parsed) {
+            if (! \is_null($startPos)) {
+                $plain = rtrim(substr($this->buffer, $startPos, $this->count - $startPos));
+                $message = "Error : `{$plain}` isn't allowed in plain CSS";
+            } else {
+                $message = 'Error: SCSS syntax not allowed in CSS file';
+            }
+            if ($type) {
+                $message .= " ($type)";
+            }
+            $this->throwParseError($message);
+        }
+
+        return $parsed;
+    }
+
+    /**
+     * Check a parsed element is plain CSS Valid
+     * @param array $parsed
+     * @return bool|array
+     */
+    protected function isPlainCssValidElement($parsed, $allowExpression = false)
+    {
+        if (
+            \in_array($parsed[0], [Type::T_FUNCTION, Type::T_FUNCTION_CALL]) &&
+            !\in_array($parsed[1], [
+                'alpha',
+                'attr',
+                'calc',
+                'cubic-bezier',
+                'env',
+                'grayscale',
+                'hsl',
+                'hsla',
+                'invert',
+                'linear-gradient',
+                'min',
+                'max',
+                'radial-gradient',
+                'repeating-linear-gradient',
+                'repeating-radial-gradient',
+                'rgb',
+                'rgba',
+                'rotate',
+                'saturate',
+                'var',
+            ]) &&
+            Compiler::isNativeFunction($parsed[1])
+        ) {
+            return false;
+        }
+
+        switch ($parsed[0]) {
+            case Type::T_BLOCK:
+            case Type::T_KEYWORD:
+            case Type::T_NULL:
+            case Type::T_NUMBER:
+                return $parsed;
+
+            case Type::T_COMMENT:
+                if (isset($parsed[2])) {
+                    return false;
+                }
+                return $parsed;
+
+            case Type::T_DIRECTIVE:
+                if (\is_array($parsed[1])) {
+                    $parsed[1][1] = $this->isPlainCssValidElement($parsed[1][1]);
+                    if (! $parsed[1][1]) {
+                        return false;
+                    }
+                }
+
+                return $parsed;
+
+            case Type::T_STRING:
+                foreach ($parsed[2] as $k => $substr) {
+                    if (\is_array($substr)) {
+                        $parsed[2][$k] = $this->isPlainCssValidElement($substr);
+                        if (! $parsed[2][$k]) {
+                            return false;
+                        }
+                    }
+                }
+                return $parsed;
+
+            case Type::T_ASSIGN:
+                foreach ([1, 2, 3] as $k) {
+                    if (! empty($parsed[$k])) {
+                        $parsed[$k] = $this->isPlainCssValidElement($parsed[$k]);
+                        if (! $parsed[$k]) {
+                            return false;
+                        }
+                    }
+                }
+                return $parsed;
+
+            case Type::T_EXPRESSION:
+                list( ,$op, $lhs, $rhs, $inParens, $whiteBefore, $whiteAfter) = $parsed;
+                if (! $allowExpression &&  ! \in_array($op, ['and', 'or', '/'])) {
+                    return false;
+                }
+                $lhs = $this->isPlainCssValidElement($lhs, true);
+                if (! $lhs) {
+                    return false;
+                }
+                $rhs = $this->isPlainCssValidElement($rhs, true);
+                if (! $rhs) {
+                    return false;
+                }
+
+                return [
+                    Type::T_STRING,
+                    '', [
+                        $this->inParens ? '(' : '',
+                        $lhs,
+                        ($whiteBefore ? ' ' : '') . $op . ($whiteAfter ? ' ' : ''),
+                        $rhs,
+                        $this->inParens ? ')' : ''
+                    ]
+                ];
+
+            case Type::T_UNARY:
+                $parsed[2] = $this->isPlainCssValidElement($parsed[2]);
+                if (! $parsed[2]) {
+                    return false;
+                }
+                return $parsed;
+
+            case Type::T_FUNCTION:
+                $argsList = $parsed[2];
+                foreach ($argsList[2] as $argElement) {
+                    if (! $this->isPlainCssValidElement($argElement)) {
+                        return false;
+                    }
+                }
+                return $parsed;
+
+            case Type::T_FUNCTION_CALL:
+                $parsed[0] = Type::T_FUNCTION;
+                $argsList = [Type::T_LIST, ',', []];
+                foreach ($parsed[2] as $arg) {
+                    if ($arg[0] || ! empty($arg[2])) {
+                        // no named arguments possible in a css function call
+                        // nor ... argument
+                        return false;
+                    }
+                    $arg = $this->isPlainCssValidElement($arg[1], $parsed[1] === 'calc');
+                    if (! $arg) {
+                        return false;
+                    }
+                    $argsList[2][] = $arg;
+                }
+                $parsed[2] = $argsList;
+                return $parsed;
+        }
+
+        return false;
+    }
+
+    /**
+     * Match string looking for either ending delim, escape, or string interpolation
+     *
+     * {@internal This is a workaround for preg_match's 250K string match limit. }}
+     *
+     * @param array  $m     Matches (passed by reference)
+     * @param string $delim Delimiter
+     *
+     * @return boolean True if match; false otherwise
+     */
+    protected function matchString(&$m, $delim)
+    {
+        $token = null;
+
+        $end = \strlen($this->buffer);
+
+        // look for either ending delim, escape, or string interpolation
+        foreach (['#{', '\\', "\r", $delim] as $lookahead) {
+            $pos = strpos($this->buffer, $lookahead, $this->count);
+
+            if ($pos !== false && $pos < $end) {
+                $end = $pos;
+                $token = $lookahead;
+            }
+        }
+
+        if (! isset($token)) {
+            return false;
+        }
+
+        $match = substr($this->buffer, $this->count, $end - $this->count);
+        $m = [
+            $match . $token,
+            $match,
+            $token
+        ];
+        $this->count = $end + \strlen($token);
+
+        return true;
+    }
+
+    /**
+     * Try to match something on head of buffer
+     *
+     * @param string  $regex
+     * @param array   $out
+     * @param boolean $eatWhitespace
+     *
+     * @return boolean
+     */
+    protected function match($regex, &$out, $eatWhitespace = null)
+    {
+        $r = '/' . $regex . '/' . $this->patternModifiers;
+
+        if (! preg_match($r, $this->buffer, $out, null, $this->count)) {
+            return false;
+        }
+
+        $this->count += \strlen($out[0]);
+
+        if (! isset($eatWhitespace)) {
+            $eatWhitespace = $this->eatWhiteDefault;
+        }
+
+        if ($eatWhitespace) {
+            $this->whitespace();
+        }
+
+        return true;
+    }
+
+    /**
+     * Match a single string
+     *
+     * @param string  $char
+     * @param boolean $eatWhitespace
+     *
+     * @return boolean
+     */
+    protected function matchChar($char, $eatWhitespace = null)
+    {
+        if (! isset($this->buffer[$this->count]) || $this->buffer[$this->count] !== $char) {
+            return false;
+        }
+
+        $this->count++;
+
+        if (! isset($eatWhitespace)) {
+            $eatWhitespace = $this->eatWhiteDefault;
+        }
+
+        if ($eatWhitespace) {
+            $this->whitespace();
+        }
+
+        return true;
+    }
+
+    /**
+     * Match literal string
+     *
+     * @param string  $what
+     * @param integer $len
+     * @param boolean $eatWhitespace
+     *
+     * @return boolean
+     */
+    protected function literal($what, $len, $eatWhitespace = null)
+    {
+        if (strcasecmp(substr($this->buffer, $this->count, $len), $what) !== 0) {
+            return false;
+        }
+
+        $this->count += $len;
+
+        if (! isset($eatWhitespace)) {
+            $eatWhitespace = $this->eatWhiteDefault;
+        }
+
+        if ($eatWhitespace) {
+            $this->whitespace();
+        }
+
+        return true;
+    }
+
+    /**
+     * Match some whitespace
+     *
+     * @return boolean
+     */
+    protected function whitespace()
+    {
+        $gotWhite = false;
+
+        while (preg_match(static::$whitePattern, $this->buffer, $m, null, $this->count)) {
+            if (isset($m[1]) && empty($this->commentsSeen[$this->count])) {
+                // comment that are kept in the output CSS
+                $comment = [];
+                $startCommentCount = $this->count;
+                $endCommentCount = $this->count + \strlen($m[1]);
+
+                // find interpolations in comment
+                $p = strpos($this->buffer, '#{', $this->count);
+
+                while ($p !== false && $p < $endCommentCount) {
+                    $c           = substr($this->buffer, $this->count, $p - $this->count);
+                    $comment[]   = $c;
+                    $this->count = $p;
+                    $out         = null;
+
+                    if ($this->interpolation($out)) {
+                        // keep right spaces in the following string part
+                        if ($out[3]) {
+                            while ($this->buffer[$this->count - 1] !== '}') {
+                                $this->count--;
+                            }
+
+                            $out[3] = '';
+                        }
+
+                        $comment[] = [Type::T_COMMENT, substr($this->buffer, $p, $this->count - $p), $out];
+                    } else {
+                        $comment[] = substr($this->buffer, $this->count, 2);
+
+                        $this->count += 2;
+                    }
+
+                    $p = strpos($this->buffer, '#{', $this->count);
+                }
+
+                // remaining part
+                $c = substr($this->buffer, $this->count, $endCommentCount - $this->count);
+
+                if (! $comment) {
+                    // single part static comment
+                    $this->appendComment([Type::T_COMMENT, $c]);
+                } else {
+                    $comment[] = $c;
+                    $staticComment = substr($this->buffer, $startCommentCount, $endCommentCount - $startCommentCount);
+                    $this->appendComment([Type::T_COMMENT, $staticComment, [Type::T_STRING, '', $comment]]);
+                }
+
+                $this->commentsSeen[$startCommentCount] = true;
+                $this->count = $endCommentCount;
+            } else {
+                // comment that are ignored and not kept in the output css
+                $this->count += \strlen($m[0]);
+                // silent comments are not allowed in plain CSS files
+                ! $this->cssOnly
+                  || ! \strlen(trim($m[0]))
+                  || $this->assertPlainCssValid(false, $this->count - \strlen($m[0]));
+            }
+
+            $gotWhite = true;
+        }
+
+        return $gotWhite;
+    }
+
+    /**
+     * Append comment to current block
+     *
+     * @param array $comment
+     */
+    protected function appendComment($comment)
+    {
+        if (! $this->discardComments) {
+            $this->env->comments[] = $comment;
+        }
+    }
+
+    /**
+     * Append statement to current block
+     *
+     * @param array   $statement
+     * @param integer $pos
+     */
+    protected function append($statement, $pos = null)
+    {
+        if (! \is_null($statement)) {
+            ! $this->cssOnly || ($statement = $this->assertPlainCssValid($statement, $pos));
+
+            if (! \is_null($pos)) {
+                list($line, $column) = $this->getSourcePosition($pos);
+
+                $statement[static::SOURCE_LINE]   = $line;
+                $statement[static::SOURCE_COLUMN] = $column;
+                $statement[static::SOURCE_INDEX]  = $this->sourceIndex;
+            }
+
+            $this->env->children[] = $statement;
+        }
+
+        $comments = $this->env->comments;
+
+        if ($comments) {
+            $this->env->children = array_merge($this->env->children, $comments);
+            $this->env->comments = [];
+        }
+    }
+
+    /**
+     * Returns last child was appended
+     *
+     * @return array|null
+     */
+    protected function last()
+    {
+        $i = \count($this->env->children) - 1;
+
+        if (isset($this->env->children[$i])) {
+            return $this->env->children[$i];
+        }
+    }
+
+    /**
+     * Parse media query list
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function mediaQueryList(&$out)
+    {
+        return $this->genericList($out, 'mediaQuery', ',', false);
+    }
+
+    /**
+     * Parse media query
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function mediaQuery(&$out)
+    {
+        $expressions = null;
+        $parts = [];
+
+        if (
+            ($this->literal('only', 4) && ($only = true) ||
+            $this->literal('not', 3) && ($not = true) || true) &&
+            $this->mixedKeyword($mediaType)
+        ) {
+            $prop = [Type::T_MEDIA_TYPE];
+
+            if (isset($only)) {
+                $prop[] = [Type::T_KEYWORD, 'only'];
+            }
+
+            if (isset($not)) {
+                $prop[] = [Type::T_KEYWORD, 'not'];
+            }
+
+            $media = [Type::T_LIST, '', []];
+
+            foreach ((array) $mediaType as $type) {
+                if (\is_array($type)) {
+                    $media[2][] = $type;
+                } else {
+                    $media[2][] = [Type::T_KEYWORD, $type];
+                }
+            }
+
+            $prop[]  = $media;
+            $parts[] = $prop;
+        }
+
+        if (empty($parts) || $this->literal('and', 3)) {
+            $this->genericList($expressions, 'mediaExpression', 'and', false);
+
+            if (\is_array($expressions)) {
+                $parts = array_merge($parts, $expressions[2]);
+            }
+        }
+
+        $out = $parts;
+
+        return true;
+    }
+
+    /**
+     * Parse supports query
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function supportsQuery(&$out)
+    {
+        $expressions = null;
+        $parts = [];
+
+        $s = $this->count;
+
+        $not = false;
+
+        if (
+            ($this->literal('not', 3) && ($not = true) || true) &&
+            $this->matchChar('(') &&
+            ($this->expression($property)) &&
+            $this->literal(': ', 2) &&
+            $this->valueList($value) &&
+            $this->matchChar(')')
+        ) {
+            $support = [Type::T_STRING, '', [[Type::T_KEYWORD, ($not ? 'not ' : '') . '(']]];
+            $support[2][] = $property;
+            $support[2][] = [Type::T_KEYWORD, ': '];
+            $support[2][] = $value;
+            $support[2][] = [Type::T_KEYWORD, ')'];
+
+            $parts[] = $support;
+            $s = $this->count;
+        } else {
+            $this->seek($s);
+        }
+
+        if (
+            $this->matchChar('(') &&
+            $this->supportsQuery($subQuery) &&
+            $this->matchChar(')')
+        ) {
+            $parts[] = [Type::T_STRING, '', [[Type::T_KEYWORD, '('], $subQuery, [Type::T_KEYWORD, ')']]];
+            $s = $this->count;
+        } else {
+            $this->seek($s);
+        }
+
+        if (
+            $this->literal('not', 3) &&
+            $this->supportsQuery($subQuery)
+        ) {
+            $parts[] = [Type::T_STRING, '', [[Type::T_KEYWORD, 'not '], $subQuery]];
+            $s = $this->count;
+        } else {
+            $this->seek($s);
+        }
+
+        if (
+            $this->literal('selector(', 9) &&
+            $this->selector($selector) &&
+            $this->matchChar(')')
+        ) {
+            $support = [Type::T_STRING, '', [[Type::T_KEYWORD, 'selector(']]];
+
+            $selectorList = [Type::T_LIST, '', []];
+
+            foreach ($selector as $sc) {
+                $compound = [Type::T_STRING, '', []];
+
+                foreach ($sc as $scp) {
+                    if (\is_array($scp)) {
+                        $compound[2][] = $scp;
+                    } else {
+                        $compound[2][] = [Type::T_KEYWORD, $scp];
+                    }
+                }
+
+                $selectorList[2][] = $compound;
+            }
+
+            $support[2][] = $selectorList;
+            $support[2][] = [Type::T_KEYWORD, ')'];
+            $parts[] = $support;
+            $s = $this->count;
+        } else {
+            $this->seek($s);
+        }
+
+        if ($this->variable($var) or $this->interpolation($var)) {
+            $parts[] = $var;
+            $s = $this->count;
+        } else {
+            $this->seek($s);
+        }
+
+        if (
+            $this->literal('and', 3) &&
+            $this->genericList($expressions, 'supportsQuery', ' and', false)
+        ) {
+            array_unshift($expressions[2], [Type::T_STRING, '', $parts]);
+
+            $parts = [$expressions];
+            $s = $this->count;
+        } else {
+            $this->seek($s);
+        }
+
+        if (
+            $this->literal('or', 2) &&
+            $this->genericList($expressions, 'supportsQuery', ' or', false)
+        ) {
+            array_unshift($expressions[2], [Type::T_STRING, '', $parts]);
+
+            $parts = [$expressions];
+            $s = $this->count;
+        } else {
+            $this->seek($s);
+        }
+
+        if (\count($parts)) {
+            if ($this->eatWhiteDefault) {
+                $this->whitespace();
+            }
+
+            $out = [Type::T_STRING, '', $parts];
+
+            return true;
+        }
+
+        return false;
+    }
+
+
+    /**
+     * Parse media expression
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function mediaExpression(&$out)
+    {
+        $s = $this->count;
+        $value = null;
+
+        if (
+            $this->matchChar('(') &&
+            $this->expression($feature) &&
+            ($this->matchChar(':') &&
+                $this->expression($value) || true) &&
+            $this->matchChar(')')
+        ) {
+            $out = [Type::T_MEDIA_EXPRESSION, $feature];
+
+            if ($value) {
+                $out[] = $value;
+            }
+
+            return true;
+        }
+
+        $this->seek($s);
+
+        return false;
+    }
+
+    /**
+     * Parse argument values
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function argValues(&$out)
+    {
+        $discardComments = $this->discardComments;
+        $this->discardComments = true;
+
+        if ($this->genericList($list, 'argValue', ',', false)) {
+            $out = $list[2];
+
+            $this->discardComments = $discardComments;
+
+            return true;
+        }
+
+        $this->discardComments = $discardComments;
+
+        return false;
+    }
+
+    /**
+     * Parse argument value
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function argValue(&$out)
+    {
+        $s = $this->count;
+
+        $keyword = null;
+
+        if (! $this->variable($keyword) || ! $this->matchChar(':')) {
+            $this->seek($s);
+
+            $keyword = null;
+        }
+
+        if ($this->genericList($value, 'expression', '', true)) {
+            $out = [$keyword, $value, false];
+            $s = $this->count;
+
+            if ($this->literal('...', 3)) {
+                $out[2] = true;
+            } else {
+                $this->seek($s);
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Check if a generic directive is known to be able to allow almost any syntax or not
+     * @param $directiveName
+     * @return bool
+     */
+    protected function isKnownGenericDirective($directiveName)
+    {
+        if (\is_array($directiveName) && \is_string(reset($directiveName))) {
+            $directiveName = reset($directiveName);
+        }
+        if (! \is_string($directiveName)) {
+            return false;
+        }
+        if (
+            \in_array($directiveName, [
+            'at-root',
+            'media',
+            'mixin',
+            'include',
+            'scssphp-import-once',
+            'import',
+            'extend',
+            'function',
+            'break',
+            'continue',
+            'return',
+            'each',
+            'while',
+            'for',
+            'if',
+            'debug',
+            'warn',
+            'error',
+            'content',
+            'else',
+            'charset',
+            'supports',
+            // Todo
+            'use',
+            'forward',
+            ])
+        ) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * Parse directive value list that considers $vars as keyword
+     *
+     * @param array          $out
+     * @param boolean|string $endChar
+     *
+     * @return boolean
+     */
+    protected function directiveValue(&$out, $endChar = false)
+    {
+        $s = $this->count;
+
+        if ($this->variable($out)) {
+            if ($endChar && $this->matchChar($endChar, false)) {
+                return true;
+            }
+
+            if (! $endChar && $this->end()) {
+                return true;
+            }
+        }
+
+        $this->seek($s);
+
+        if (\is_string($endChar) && $this->openString($endChar ? $endChar : ';', $out, null, null, true, ";}{")) {
+            if ($endChar && $this->matchChar($endChar, false)) {
+                return true;
+            }
+            $ss = $this->count;
+            if (!$endChar && $this->end()) {
+                $this->seek($ss);
+                return true;
+            }
+        }
+
+        $this->seek($s);
+
+        $allowVars = $this->allowVars;
+        $this->allowVars = false;
+
+        $res = $this->genericList($out, 'spaceList', ',');
+        $this->allowVars = $allowVars;
+
+        if ($res) {
+            if ($endChar && $this->matchChar($endChar, false)) {
+                return true;
+            }
+
+            if (! $endChar && $this->end()) {
+                return true;
+            }
+        }
+
+        $this->seek($s);
+
+        if ($endChar && $this->matchChar($endChar, false)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Parse comma separated value list
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function valueList(&$out)
+    {
+        $discardComments = $this->discardComments;
+        $this->discardComments = true;
+        $res = $this->genericList($out, 'spaceList', ',');
+        $this->discardComments = $discardComments;
+
+        return $res;
+    }
+
+    /**
+     * Parse a function call, where externals () are part of the call
+     * and not of the value list
+     *
+     * @param $out
+     * @param bool $mandatoryEnclos
+     * @param null|string $charAfter
+     * @param null|bool $eatWhiteSp
+     * @return bool
+     */
+    protected function functionCallArgumentsList(&$out, $mandatoryEnclos = true, $charAfter = null, $eatWhiteSp = null)
+    {
+        $s = $this->count;
+
+        if (
+            $this->matchChar('(') &&
+            $this->valueList($out) &&
+            $this->matchChar(')') &&
+            ($charAfter ? $this->matchChar($charAfter, $eatWhiteSp) : $this->end())
+        ) {
+            return true;
+        }
+
+        if (! $mandatoryEnclos) {
+            $this->seek($s);
+
+            if (
+                $this->valueList($out) &&
+                ($charAfter ? $this->matchChar($charAfter, $eatWhiteSp) : $this->end())
+            ) {
+                return true;
+            }
+        }
+
+        $this->seek($s);
+
+        return false;
+    }
+
+    /**
+     * Parse space separated value list
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function spaceList(&$out)
+    {
+        return $this->genericList($out, 'expression');
+    }
+
+    /**
+     * Parse generic list
+     *
+     * @param array    $out
+     * @param callable $parseItem
+     * @param string   $delim
+     * @param boolean  $flatten
+     *
+     * @return boolean
+     */
+    protected function genericList(&$out, $parseItem, $delim = '', $flatten = true)
+    {
+        $s     = $this->count;
+        $items = [];
+        $value = null;
+
+        while ($this->$parseItem($value)) {
+            $trailing_delim = false;
+            $items[] = $value;
+
+            if ($delim) {
+                if (! $this->literal($delim, \strlen($delim))) {
+                    break;
+                }
+
+                $trailing_delim = true;
+            } else {
+                // if no delim watch that a keyword didn't eat the single/double quote
+                // from the following starting string
+                if ($value[0] === Type::T_KEYWORD) {
+                    $word = $value[1];
+
+                    $last_char = substr($word, -1);
+
+                    if (
+                        strlen($word) > 1 &&
+                        in_array($last_char, [ "'", '"']) &&
+                        substr($word, -2, 1) !== '\\'
+                    ) {
+                        // if there is a non escaped opening quote in the keyword, this seems unlikely a mistake
+                        $word = str_replace('\\' . $last_char, '\\\\', $word);
+                        if (strpos($word, $last_char) < strlen($word) - 1) {
+                            continue;
+                        }
+
+                        $currentCount = $this->count;
+
+                        // let's try to rewind to previous char and try a parse
+                        $this->count--;
+                        // in case the keyword also eat spaces
+                        while (substr($this->buffer, $this->count, 1) !== $last_char) {
+                            $this->count--;
+                        }
+
+                        $nextValue = null;
+                        if ($this->$parseItem($nextValue)) {
+                            if ($nextValue[0] === Type::T_KEYWORD && $nextValue[1] === $last_char) {
+                                // bad try, forget it
+                                $this->seek($currentCount);
+                                continue;
+                            }
+                            if ($nextValue[0] !== Type::T_STRING) {
+                                // bad try, forget it
+                                $this->seek($currentCount);
+                                continue;
+                            }
+
+                            // OK it was a good idea
+                            $value[1] = substr($value[1], 0, -1);
+                            array_pop($items);
+                            $items[] = $value;
+                            $items[] = $nextValue;
+                        } else {
+                            // bad try, forget it
+                            $this->seek($currentCount);
+                            continue;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (! $items) {
+            $this->seek($s);
+
+            return false;
+        }
+
+        if ($trailing_delim) {
+            $items[] = [Type::T_NULL];
+        }
+
+        if ($flatten && \count($items) === 1) {
+            $out = $items[0];
+        } else {
+            $out = [Type::T_LIST, $delim, $items];
+        }
+
+        return true;
+    }
+
+    /**
+     * Parse expression
+     *
+     * @param array   $out
+     * @param boolean $listOnly
+     * @param boolean $lookForExp
+     *
+     * @return boolean
+     */
+    protected function expression(&$out, $listOnly = false, $lookForExp = true)
+    {
+        $s = $this->count;
+        $discard = $this->discardComments;
+        $this->discardComments = true;
+        $allowedTypes = ($listOnly ? [Type::T_LIST] : [Type::T_LIST, Type::T_MAP]);
+
+        if ($this->matchChar('(')) {
+            if ($this->enclosedExpression($lhs, $s, ')', $allowedTypes)) {
+                if ($lookForExp) {
+                    $out = $this->expHelper($lhs, 0);
+                } else {
+                    $out = $lhs;
+                }
+
+                $this->discardComments = $discard;
+
+                return true;
+            }
+
+            $this->seek($s);
+        }
+
+        if (\in_array(Type::T_LIST, $allowedTypes) && $this->matchChar('[')) {
+            if ($this->enclosedExpression($lhs, $s, ']', [Type::T_LIST])) {
+                if ($lookForExp) {
+                    $out = $this->expHelper($lhs, 0);
+                } else {
+                    $out = $lhs;
+                }
+
+                $this->discardComments = $discard;
+
+                return true;
+            }
+
+            $this->seek($s);
+        }
+
+        if (! $listOnly && $this->value($lhs)) {
+            if ($lookForExp) {
+                $out = $this->expHelper($lhs, 0);
+            } else {
+                $out = $lhs;
+            }
+
+            $this->discardComments = $discard;
+
+            return true;
+        }
+
+        $this->discardComments = $discard;
+
+        return false;
+    }
+
+    /**
+     * Parse expression specifically checking for lists in parenthesis or brackets
+     *
+     * @param array   $out
+     * @param integer $s
+     * @param string  $closingParen
+     * @param array   $allowedTypes
+     *
+     * @return boolean
+     */
+    protected function enclosedExpression(&$out, $s, $closingParen = ')', $allowedTypes = [Type::T_LIST, Type::T_MAP])
+    {
+        if ($this->matchChar($closingParen) && \in_array(Type::T_LIST, $allowedTypes)) {
+            $out = [Type::T_LIST, '', []];
+
+            switch ($closingParen) {
+                case ')':
+                    $out['enclosing'] = 'parent'; // parenthesis list
+                    break;
+
+                case ']':
+                    $out['enclosing'] = 'bracket'; // bracketed list
+                    break;
+            }
+
+            return true;
+        }
+
+        if (
+            $this->valueList($out) &&
+            $this->matchChar($closingParen) && ! ($closingParen === ')' &&
+            \in_array($out[0], [Type::T_EXPRESSION, Type::T_UNARY])) &&
+            \in_array(Type::T_LIST, $allowedTypes)
+        ) {
+            if ($out[0] !== Type::T_LIST || ! empty($out['enclosing'])) {
+                $out = [Type::T_LIST, '', [$out]];
+            }
+
+            switch ($closingParen) {
+                case ')':
+                    $out['enclosing'] = 'parent'; // parenthesis list
+                    break;
+
+                case ']':
+                    $out['enclosing'] = 'bracket'; // bracketed list
+                    break;
+            }
+
+            return true;
+        }
+
+        $this->seek($s);
+
+        if (\in_array(Type::T_MAP, $allowedTypes) && $this->map($out)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Parse left-hand side of subexpression
+     *
+     * @param array   $lhs
+     * @param integer $minP
+     *
+     * @return array
+     */
+    protected function expHelper($lhs, $minP)
+    {
+        $operators = static::$operatorPattern;
+
+        $ss = $this->count;
+        $whiteBefore = isset($this->buffer[$this->count - 1]) &&
+            ctype_space($this->buffer[$this->count - 1]);
+
+        while ($this->match($operators, $m, false) && static::$precedence[$m[1]] >= $minP) {
+            $whiteAfter = isset($this->buffer[$this->count]) &&
+                ctype_space($this->buffer[$this->count]);
+            $varAfter = isset($this->buffer[$this->count]) &&
+                $this->buffer[$this->count] === '$';
+
+            $this->whitespace();
+
+            $op = $m[1];
+
+            // don't turn negative numbers into expressions
+            if ($op === '-' && $whiteBefore && ! $whiteAfter && ! $varAfter) {
+                break;
+            }
+
+            if (! $this->value($rhs) && ! $this->expression($rhs, true, false)) {
+                break;
+            }
+
+            if ($op === '-' && ! $whiteAfter && $rhs[0] === Type::T_KEYWORD) {
+                break;
+            }
+
+            // peek and see if rhs belongs to next operator
+            if ($this->peek($operators, $next) && static::$precedence[$next[1]] > static::$precedence[$op]) {
+                $rhs = $this->expHelper($rhs, static::$precedence[$next[1]]);
+            }
+
+            $lhs = [Type::T_EXPRESSION, $op, $lhs, $rhs, $this->inParens, $whiteBefore, $whiteAfter];
+
+            $ss = $this->count;
+            $whiteBefore = isset($this->buffer[$this->count - 1]) &&
+                ctype_space($this->buffer[$this->count - 1]);
+        }
+
+        $this->seek($ss);
+
+        return $lhs;
+    }
+
+    /**
+     * Parse value
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function value(&$out)
+    {
+        if (! isset($this->buffer[$this->count])) {
+            return false;
+        }
+
+        $s = $this->count;
+        $char = $this->buffer[$this->count];
+
+        if (
+            $this->literal('url(', 4) &&
+            $this->match('data:([a-z]+)\/([a-z0-9.+-]+);base64,', $m, false)
+        ) {
+            $len = strspn(
+                $this->buffer,
+                'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwyxz0123456789+/=',
+                $this->count
+            );
+
+            $this->count += $len;
+
+            if ($this->matchChar(')')) {
+                $content = substr($this->buffer, $s, $this->count - $s);
+                $out = [Type::T_KEYWORD, $content];
+
+                return true;
+            }
+        }
+
+        $this->seek($s);
+
+        if (
+            $this->literal('url(', 4, false) &&
+            $this->match('\s*(\/\/[^\s\)]+)\s*', $m)
+        ) {
+            $content = 'url(' . $m[1];
+
+            if ($this->matchChar(')')) {
+                $content .= ')';
+                $out = [Type::T_KEYWORD, $content];
+
+                return true;
+            }
+        }
+
+        $this->seek($s);
+
+        // not
+        if ($char === 'n' && $this->literal('not', 3, false)) {
+            if (
+                $this->whitespace() &&
+                $this->value($inner)
+            ) {
+                $out = [Type::T_UNARY, 'not', $inner, $this->inParens];
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if ($this->parenValue($inner)) {
+                $out = [Type::T_UNARY, 'not', $inner, $this->inParens];
+
+                return true;
+            }
+
+            $this->seek($s);
+        }
+
+        // addition
+        if ($char === '+') {
+            $this->count++;
+
+            $follow_white = $this->whitespace();
+
+            if ($this->value($inner)) {
+                $out = [Type::T_UNARY, '+', $inner, $this->inParens];
+
+                return true;
+            }
+
+            if ($follow_white) {
+                $out = [Type::T_KEYWORD, $char];
+                return  true;
+            }
+
+            $this->seek($s);
+
+            return false;
+        }
+
+        // negation
+        if ($char === '-') {
+            if ($this->customProperty($out)) {
+                return true;
+            }
+
+            $this->count++;
+
+            $follow_white = $this->whitespace();
+
+            if ($this->variable($inner) || $this->unit($inner) || $this->parenValue($inner)) {
+                $out = [Type::T_UNARY, '-', $inner, $this->inParens];
+
+                return true;
+            }
+
+            if (
+                $this->keyword($inner) &&
+                ! $this->func($inner, $out)
+            ) {
+                $out = [Type::T_UNARY, '-', $inner, $this->inParens];
+
+                return true;
+            }
+
+            if ($follow_white) {
+                $out = [Type::T_KEYWORD, $char];
+
+                return  true;
+            }
+
+            $this->seek($s);
+        }
+
+        // paren
+        if ($char === '(' && $this->parenValue($out)) {
+            return true;
+        }
+
+        if ($char === '#') {
+            if ($this->interpolation($out) || $this->color($out)) {
+                return true;
+            }
+
+            $this->count++;
+
+            if ($this->keyword($keyword)) {
+                $out = [Type::T_KEYWORD, '#' . $keyword];
+
+                return true;
+            }
+
+            $this->count--;
+        }
+
+        if ($this->matchChar('&', true)) {
+            $out = [Type::T_SELF];
+
+            return true;
+        }
+
+        if ($char === '$' && $this->variable($out)) {
+            return true;
+        }
+
+        if ($char === 'p' && $this->progid($out)) {
+            return true;
+        }
+
+        if (($char === '"' || $char === "'") && $this->string($out)) {
+            return true;
+        }
+
+        if ($this->unit($out)) {
+            return true;
+        }
+
+        // unicode range with wildcards
+        if (
+            $this->literal('U+', 2) &&
+            $this->match('\?+|([0-9A-F]+(\?+|(-[0-9A-F]+))?)', $m, false)
+        ) {
+            $unicode = explode('-', $m[0]);
+            if (strlen(reset($unicode)) <= 6 && strlen(end($unicode)) <= 6) {
+                $out = [Type::T_KEYWORD, 'U+' . $m[0]];
+
+                return true;
+            }
+            $this->count -= strlen($m[0]) + 2;
+        }
+
+        if ($this->keyword($keyword, false)) {
+            if ($this->func($keyword, $out)) {
+                return true;
+            }
+
+            $this->whitespace();
+
+            if ($keyword === 'null') {
+                $out = [Type::T_NULL];
+            } else {
+                $out = [Type::T_KEYWORD, $keyword];
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Parse parenthesized value
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function parenValue(&$out)
+    {
+        $s = $this->count;
+
+        $inParens = $this->inParens;
+
+        if ($this->matchChar('(')) {
+            if ($this->matchChar(')')) {
+                $out = [Type::T_LIST, '', []];
+
+                return true;
+            }
+
+            $this->inParens = true;
+
+            if (
+                $this->expression($exp) &&
+                $this->matchChar(')')
+            ) {
+                $out = $exp;
+                $this->inParens = $inParens;
+
+                return true;
+            }
+        }
+
+        $this->inParens = $inParens;
+        $this->seek($s);
+
+        return false;
+    }
+
+    /**
+     * Parse "progid:"
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function progid(&$out)
+    {
+        $s = $this->count;
+
+        if (
+            $this->literal('progid:', 7, false) &&
+            $this->openString('(', $fn) &&
+            $this->matchChar('(')
+        ) {
+            $this->openString(')', $args, '(');
+
+            if ($this->matchChar(')')) {
+                $out = [Type::T_STRING, '', [
+                    'progid:', $fn, '(', $args, ')'
+                ]];
+
+                return true;
+            }
+        }
+
+        $this->seek($s);
+
+        return false;
+    }
+
+    /**
+     * Parse function call
+     *
+     * @param string $name
+     * @param array  $func
+     *
+     * @return boolean
+     */
+    protected function func($name, &$func)
+    {
+        $s = $this->count;
+
+        if ($this->matchChar('(')) {
+            if ($name === 'alpha' && $this->argumentList($args)) {
+                $func = [Type::T_FUNCTION, $name, [Type::T_STRING, '', $args]];
+
+                return true;
+            }
+
+            if ($name !== 'expression' && ! preg_match('/^(-[a-z]+-)?calc$/', $name)) {
+                $ss = $this->count;
+
+                if (
+                    $this->argValues($args) &&
+                    $this->matchChar(')')
+                ) {
+                    $func = [Type::T_FUNCTION_CALL, $name, $args];
+
+                    return true;
+                }
+
+                $this->seek($ss);
+            }
+
+            if (
+                ($this->openString(')', $str, '(') || true) &&
+                $this->matchChar(')')
+            ) {
+                $args = [];
+
+                if (! empty($str)) {
+                    $args[] = [null, [Type::T_STRING, '', [$str]]];
+                }
+
+                $func = [Type::T_FUNCTION_CALL, $name, $args];
+
+                return true;
+            }
+        }
+
+        $this->seek($s);
+
+        return false;
+    }
+
+    /**
+     * Parse function call argument list
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function argumentList(&$out)
+    {
+        $s = $this->count;
+        $this->matchChar('(');
+
+        $args = [];
+
+        while ($this->keyword($var)) {
+            if (
+                $this->matchChar('=') &&
+                $this->expression($exp)
+            ) {
+                $args[] = [Type::T_STRING, '', [$var . '=']];
+                $arg = $exp;
+            } else {
+                break;
+            }
+
+            $args[] = $arg;
+
+            if (! $this->matchChar(',')) {
+                break;
+            }
+
+            $args[] = [Type::T_STRING, '', [', ']];
+        }
+
+        if (! $this->matchChar(')') || ! $args) {
+            $this->seek($s);
+
+            return false;
+        }
+
+        $out = $args;
+
+        return true;
+    }
+
+    /**
+     * Parse mixin/function definition  argument list
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function argumentDef(&$out)
+    {
+        $s = $this->count;
+        $this->matchChar('(');
+
+        $args = [];
+
+        while ($this->variable($var)) {
+            $arg = [$var[1], null, false];
+
+            $ss = $this->count;
+
+            if (
+                $this->matchChar(':') &&
+                $this->genericList($defaultVal, 'expression', '', true)
+            ) {
+                $arg[1] = $defaultVal;
+            } else {
+                $this->seek($ss);
+            }
+
+            $ss = $this->count;
+
+            if ($this->literal('...', 3)) {
+                $sss = $this->count;
+
+                if (! $this->matchChar(')')) {
+                    $this->throwParseError('... has to be after the final argument');
+                }
+
+                $arg[2] = true;
+
+                $this->seek($sss);
+            } else {
+                $this->seek($ss);
+            }
+
+            $args[] = $arg;
+
+            if (! $this->matchChar(',')) {
+                break;
+            }
+        }
+
+        if (! $this->matchChar(')')) {
+            $this->seek($s);
+
+            return false;
+        }
+
+        $out = $args;
+
+        return true;
+    }
+
+    /**
+     * Parse map
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function map(&$out)
+    {
+        $s = $this->count;
+
+        if (! $this->matchChar('(')) {
+            return false;
+        }
+
+        $keys = [];
+        $values = [];
+
+        while (
+            $this->genericList($key, 'expression', '', true) &&
+            $this->matchChar(':') &&
+            $this->genericList($value, 'expression', '', true)
+        ) {
+            $keys[] = $key;
+            $values[] = $value;
+
+            if (! $this->matchChar(',')) {
+                break;
+            }
+        }
+
+        if (! $keys || ! $this->matchChar(')')) {
+            $this->seek($s);
+
+            return false;
+        }
+
+        $out = [Type::T_MAP, $keys, $values];
+
+        return true;
+    }
+
+    /**
+     * Parse color
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function color(&$out)
+    {
+        $s = $this->count;
+
+        if ($this->match('(#([0-9a-f]+)\b)', $m)) {
+            if (\in_array(\strlen($m[2]), [3,4,6,8])) {
+                $out = [Type::T_KEYWORD, $m[0]];
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            return false;
+        }
+
+        return false;
+    }
+
+    /**
+     * Parse number with unit
+     *
+     * @param array $unit
+     *
+     * @return boolean
+     */
+    protected function unit(&$unit)
+    {
+        $s = $this->count;
+
+        if ($this->match('([0-9]*(\.)?[0-9]+)([%a-zA-Z]+)?', $m, false)) {
+            if (\strlen($this->buffer) === $this->count || ! ctype_digit($this->buffer[$this->count])) {
+                $this->whitespace();
+
+                $unit = new Node\Number($m[1], empty($m[3]) ? '' : $m[3]);
+
+                return true;
+            }
+
+            $this->seek($s);
+        }
+
+        return false;
+    }
+
+    /**
+     * Parse string
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function string(&$out, $keepDelimWithInterpolation = false)
+    {
+        $s = $this->count;
+
+        if ($this->matchChar('"', false)) {
+            $delim = '"';
+        } elseif ($this->matchChar("'", false)) {
+            $delim = "'";
+        } else {
+            return false;
+        }
+
+        $content = [];
+        $oldWhite = $this->eatWhiteDefault;
+        $this->eatWhiteDefault = false;
+        $hasInterpolation = false;
+
+        while ($this->matchString($m, $delim)) {
+            if ($m[1] !== '') {
+                $content[] = $m[1];
+            }
+
+            if ($m[2] === '#{') {
+                $this->count -= \strlen($m[2]);
+
+                if ($this->interpolation($inter, false)) {
+                    $content[] = $inter;
+                    $hasInterpolation = true;
+                } else {
+                    $this->count += \strlen($m[2]);
+                    $content[] = '#{'; // ignore it
+                }
+            } elseif ($m[2] === "\r") {
+                $content[] = '\\a';
+                // TODO : warning
+                # DEPRECATION WARNING on line x, column y of zzz:
+                # Unescaped multiline strings are deprecated and will be removed in a future version of Sass.
+                # To include a newline in a string, use "\a" or "\a " as in CSS.
+                if ($this->matchChar("\n", false)) {
+                    $content[] = ' ';
+                }
+            } elseif ($m[2] === '\\') {
+                if (
+                    $this->literal("\r\n", 2, false) ||
+                    $this->matchChar("\r", false) ||
+                    $this->matchChar("\n", false) ||
+                    $this->matchChar("\f", false)
+                ) {
+                    // this is a continuation escaping, to be ignored
+                } elseif ($this->matchEscapeCharacter($c)) {
+                    $content[] = $c;
+                } else {
+                    $this->throwParseError('Unterminated escape sequence');
+                }
+            } else {
+                $this->count -= \strlen($delim);
+                break; // delim
+            }
+        }
+
+        $this->eatWhiteDefault = $oldWhite;
+
+        if ($this->literal($delim, \strlen($delim))) {
+            if ($hasInterpolation && ! $keepDelimWithInterpolation) {
+                $delim = '"';
+            }
+
+            $out = [Type::T_STRING, $delim, $content];
+
+            return true;
+        }
+
+        $this->seek($s);
+
+        return false;
+    }
+
+    protected function matchEscapeCharacter(&$out)
+    {
+        if ($this->match('[a-f0-9]', $m, false)) {
+            $hex = $m[0];
+
+            for ($i = 5; $i--;) {
+                if ($this->match('[a-f0-9]', $m, false)) {
+                    $hex .= $m[0];
+                } else {
+                    break;
+                }
+            }
+
+            $value = hexdec($hex);
+
+            if ($value == 0 || ($value >= 0xD800 && $value <= 0xDFFF) || $value >= 0x10FFFF) {
+                $out = "\u{FFFD}";
+            } else {
+                $out = Util::mbChr($value);
+            }
+
+            return true;
+        }
+
+        if ($this->match('.', $m, false)) {
+            $out = $m[0];
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Parse keyword or interpolation
+     *
+     * @param array   $out
+     * @param boolean $restricted
+     *
+     * @return boolean
+     */
+    protected function mixedKeyword(&$out, $restricted = false)
+    {
+        $parts = [];
+
+        $oldWhite = $this->eatWhiteDefault;
+        $this->eatWhiteDefault = false;
+
+        for (;;) {
+            if ($restricted ? $this->restrictedKeyword($key) : $this->keyword($key)) {
+                $parts[] = $key;
+                continue;
+            }
+
+            if ($this->interpolation($inter)) {
+                $parts[] = $inter;
+                continue;
+            }
+
+            break;
+        }
+
+        $this->eatWhiteDefault = $oldWhite;
+
+        if (! $parts) {
+            return false;
+        }
+
+        if ($this->eatWhiteDefault) {
+            $this->whitespace();
+        }
+
+        $out = $parts;
+
+        return true;
+    }
+
+    /**
+     * Parse an unbounded string stopped by $end
+     *
+     * @param string  $end
+     * @param array   $out
+     * @param string  $nestOpen
+     * @param string  $nestClose
+     * @param boolean $rtrim
+     * @param string $disallow
+     *
+     * @return boolean
+     */
+    protected function openString($end, &$out, $nestOpen = null, $nestClose = null, $rtrim = true, $disallow = null)
+    {
+        $oldWhite = $this->eatWhiteDefault;
+        $this->eatWhiteDefault = false;
+
+        if ($nestOpen && ! $nestClose) {
+            $nestClose = $end;
+        }
+
+        $patt = ($disallow ? '[^' . $this->pregQuote($disallow) . ']' : '.');
+        $patt = '(' . $patt . '*?)([\'"]|#\{|'
+            . $this->pregQuote($end) . '|'
+            . (($nestClose && $nestClose !== $end) ? $this->pregQuote($nestClose) . '|' : '')
+            . static::$commentPattern . ')';
+
+        $nestingLevel = 0;
+
+        $content = [];
+
+        while ($this->match($patt, $m, false)) {
+            if (isset($m[1]) && $m[1] !== '') {
+                $content[] = $m[1];
+
+                if ($nestOpen) {
+                    $nestingLevel += substr_count($m[1], $nestOpen);
+                }
+            }
+
+            $tok = $m[2];
+
+            $this->count -= \strlen($tok);
+
+            if ($tok === $end && ! $nestingLevel) {
+                break;
+            }
+
+            if ($tok === $nestClose) {
+                $nestingLevel--;
+            }
+
+            if (($tok === "'" || $tok === '"') && $this->string($str, true)) {
+                $content[] = $str;
+                continue;
+            }
+
+            if ($tok === '#{' && $this->interpolation($inter)) {
+                $content[] = $inter;
+                continue;
+            }
+
+            $content[] = $tok;
+            $this->count += \strlen($tok);
+        }
+
+        $this->eatWhiteDefault = $oldWhite;
+
+        if (! $content || $tok !== $end) {
+            return false;
+        }
+
+        // trim the end
+        if ($rtrim && \is_string(end($content))) {
+            $content[\count($content) - 1] = rtrim(end($content));
+        }
+
+        $out = [Type::T_STRING, '', $content];
+
+        return true;
+    }
+
+    /**
+     * Parser interpolation
+     *
+     * @param string|array $out
+     * @param boolean      $lookWhite save information about whitespace before and after
+     *
+     * @return boolean
+     */
+    protected function interpolation(&$out, $lookWhite = true)
+    {
+        $oldWhite = $this->eatWhiteDefault;
+        $allowVars = $this->allowVars;
+        $this->allowVars = true;
+        $this->eatWhiteDefault = true;
+
+        $s = $this->count;
+
+        if (
+            $this->literal('#{', 2) &&
+            $this->valueList($value) &&
+            $this->matchChar('}', false)
+        ) {
+            if ($value === [Type::T_SELF]) {
+                $out = $value;
+            } else {
+                if ($lookWhite) {
+                    $left = ($s > 0 && preg_match('/\s/', $this->buffer[$s - 1])) ? ' ' : '';
+                    $right = (
+                        ! empty($this->buffer[$this->count]) &&
+                        preg_match('/\s/', $this->buffer[$this->count])
+                    ) ? ' ' : '';
+                } else {
+                    $left = $right = false;
+                }
+
+                $out = [Type::T_INTERPOLATE, $value, $left, $right];
+            }
+
+            $this->eatWhiteDefault = $oldWhite;
+            $this->allowVars = $allowVars;
+
+            if ($this->eatWhiteDefault) {
+                $this->whitespace();
+            }
+
+            return true;
+        }
+
+        $this->seek($s);
+
+        $this->eatWhiteDefault = $oldWhite;
+        $this->allowVars = $allowVars;
+
+        return false;
+    }
+
+    /**
+     * Parse property name (as an array of parts or a string)
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function propertyName(&$out)
+    {
+        $parts = [];
+
+        $oldWhite = $this->eatWhiteDefault;
+        $this->eatWhiteDefault = false;
+
+        for (;;) {
+            if ($this->interpolation($inter)) {
+                $parts[] = $inter;
+                continue;
+            }
+
+            if ($this->keyword($text)) {
+                $parts[] = $text;
+                continue;
+            }
+
+            if (! $parts && $this->match('[:.#]', $m, false)) {
+                // css hacks
+                $parts[] = $m[0];
+                continue;
+            }
+
+            break;
+        }
+
+        $this->eatWhiteDefault = $oldWhite;
+
+        if (! $parts) {
+            return false;
+        }
+
+        // match comment hack
+        if (preg_match(static::$whitePattern, $this->buffer, $m, null, $this->count)) {
+            if (! empty($m[0])) {
+                $parts[] = $m[0];
+                $this->count += \strlen($m[0]);
+            }
+        }
+
+        $this->whitespace(); // get any extra whitespace
+
+        $out = [Type::T_STRING, '', $parts];
+
+        return true;
+    }
+
+    /**
+     * Parse custom property name (as an array of parts or a string)
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function customProperty(&$out)
+    {
+        $s = $this->count;
+
+        if (! $this->literal('--', 2, false)) {
+            return false;
+        }
+
+        $parts = ['--'];
+
+        $oldWhite = $this->eatWhiteDefault;
+        $this->eatWhiteDefault = false;
+
+        for (;;) {
+            if ($this->interpolation($inter)) {
+                $parts[] = $inter;
+                continue;
+            }
+
+            if ($this->matchChar('&', false)) {
+                $parts[] = [Type::T_SELF];
+                continue;
+            }
+
+            if ($this->variable($var)) {
+                $parts[] = $var;
+                continue;
+            }
+
+            if ($this->keyword($text)) {
+                $parts[] = $text;
+                continue;
+            }
+
+            break;
+        }
+
+        $this->eatWhiteDefault = $oldWhite;
+
+        if (\count($parts) == 1) {
+            $this->seek($s);
+
+            return false;
+        }
+
+        $this->whitespace(); // get any extra whitespace
+
+        $out = [Type::T_STRING, '', $parts];
+
+        return true;
+    }
+
+    /**
+     * Parse comma separated selector list
+     *
+     * @param array   $out
+     * @param boolean $subSelector
+     *
+     * @return boolean
+     */
+    protected function selectors(&$out, $subSelector = false)
+    {
+        $s = $this->count;
+        $selectors = [];
+
+        while ($this->selector($sel, $subSelector)) {
+            $selectors[] = $sel;
+
+            if (! $this->matchChar(',', true)) {
+                break;
+            }
+
+            while ($this->matchChar(',', true)) {
+                ; // ignore extra
+            }
+        }
+
+        if (! $selectors) {
+            $this->seek($s);
+
+            return false;
+        }
+
+        $out = $selectors;
+
+        return true;
+    }
+
+    /**
+     * Parse whitespace separated selector list
+     *
+     * @param array   $out
+     * @param boolean $subSelector
+     *
+     * @return boolean
+     */
+    protected function selector(&$out, $subSelector = false)
+    {
+        $selector = [];
+
+        for (;;) {
+            $s = $this->count;
+
+            if ($this->match('[>+~]+', $m, true)) {
+                if (
+                    $subSelector && \is_string($subSelector) && strpos($subSelector, 'nth-') === 0 &&
+                    $m[0] === '+' && $this->match("(\d+|n\b)", $counter)
+                ) {
+                    $this->seek($s);
+                } else {
+                    $selector[] = [$m[0]];
+                    continue;
+                }
+            }
+
+            if ($this->selectorSingle($part, $subSelector)) {
+                $selector[] = $part;
+                $this->match('\s+', $m);
+                continue;
+            }
+
+            if ($this->match('\/[^\/]+\/', $m, true)) {
+                $selector[] = [$m[0]];
+                continue;
+            }
+
+            break;
+        }
+
+        if (! $selector) {
+            return false;
+        }
+
+        $out = $selector;
+
+        return true;
+    }
+
+    /**
+     * Parse the parts that make up a selector
+     *
+     * {@internal
+     *     div[yes=no]#something.hello.world:nth-child(-2n+1)%placeholder
+     * }}
+     *
+     * @param array   $out
+     * @param boolean $subSelector
+     *
+     * @return boolean
+     */
+    protected function selectorSingle(&$out, $subSelector = false)
+    {
+        $oldWhite = $this->eatWhiteDefault;
+        $this->eatWhiteDefault = false;
+
+        $parts = [];
+
+        if ($this->matchChar('*', false)) {
+            $parts[] = '*';
+        }
+
+        for (;;) {
+            if (! isset($this->buffer[$this->count])) {
+                break;
+            }
+
+            $s = $this->count;
+            $char = $this->buffer[$this->count];
+
+            // see if we can stop early
+            if ($char === '{' || $char === ',' || $char === ';' || $char === '}' || $char === '@') {
+                break;
+            }
+
+            // parsing a sub selector in () stop with the closing )
+            if ($subSelector && $char === ')') {
+                break;
+            }
+
+            //self
+            switch ($char) {
+                case '&':
+                    $parts[] = Compiler::$selfSelector;
+                    $this->count++;
+                    ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+                    continue 2;
+
+                case '.':
+                    $parts[] = '.';
+                    $this->count++;
+                    continue 2;
+
+                case '|':
+                    $parts[] = '|';
+                    $this->count++;
+                    continue 2;
+            }
+
+            if ($char === '\\' && $this->match('\\\\\S', $m)) {
+                $parts[] = $m[0];
+                continue;
+            }
+
+            if ($char === '%') {
+                $this->count++;
+
+                if ($this->placeholder($placeholder)) {
+                    $parts[] = '%';
+                    $parts[] = $placeholder;
+                    ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+                    continue;
+                }
+
+                break;
+            }
+
+            if ($char === '#') {
+                if ($this->interpolation($inter)) {
+                    $parts[] = $inter;
+                    ! $this->cssOnly || $this->assertPlainCssValid(false, $s);
+                    continue;
+                }
+
+                $parts[] = '#';
+                $this->count++;
+                continue;
+            }
+
+            // a pseudo selector
+            if ($char === ':') {
+                if ($this->buffer[$this->count + 1] === ':') {
+                    $this->count += 2;
+                    $part = '::';
+                } else {
+                    $this->count++;
+                    $part = ':';
+                }
+
+                if ($this->mixedKeyword($nameParts, true)) {
+                    $parts[] = $part;
+
+                    foreach ($nameParts as $sub) {
+                        $parts[] = $sub;
+                    }
+
+                    $ss = $this->count;
+
+                    if (
+                        $nameParts === ['not'] ||
+                        $nameParts === ['is'] ||
+                        $nameParts === ['has'] ||
+                        $nameParts === ['where'] ||
+                        $nameParts === ['slotted'] ||
+                        $nameParts === ['nth-child'] ||
+                        $nameParts === ['nth-last-child'] ||
+                        $nameParts === ['nth-of-type'] ||
+                        $nameParts === ['nth-last-of-type']
+                    ) {
+                        if (
+                            $this->matchChar('(', true) &&
+                            ($this->selectors($subs, reset($nameParts)) || true) &&
+                            $this->matchChar(')')
+                        ) {
+                            $parts[] = '(';
+
+                            while ($sub = array_shift($subs)) {
+                                while ($ps = array_shift($sub)) {
+                                    foreach ($ps as &$p) {
+                                        $parts[] = $p;
+                                    }
+
+                                    if (\count($sub) && reset($sub)) {
+                                        $parts[] = ' ';
+                                    }
+                                }
+
+                                if (\count($subs) && reset($subs)) {
+                                    $parts[] = ', ';
+                                }
+                            }
+
+                            $parts[] = ')';
+                        } else {
+                            $this->seek($ss);
+                        }
+                    } elseif (
+                        $this->matchChar('(') &&
+                        ($this->openString(')', $str, '(') || true) &&
+                        $this->matchChar(')')
+                    ) {
+                        $parts[] = '(';
+
+                        if (! empty($str)) {
+                            $parts[] = $str;
+                        }
+
+                        $parts[] = ')';
+                    } else {
+                        $this->seek($ss);
+                    }
+
+                    continue;
+                }
+            }
+
+            $this->seek($s);
+
+            // 2n+1
+            if ($subSelector && \is_string($subSelector) && strpos($subSelector, 'nth-') === 0) {
+                if ($this->match("(\s*(\+\s*|\-\s*)?(\d+|n|\d+n))+", $counter)) {
+                    $parts[] = $counter[0];
+                    //$parts[] = str_replace(' ', '', $counter[0]);
+                    continue;
+                }
+            }
+
+            $this->seek($s);
+
+            // attribute selector
+            if (
+                $char === '[' &&
+                $this->matchChar('[') &&
+                ($this->openString(']', $str, '[') || true) &&
+                $this->matchChar(']')
+            ) {
+                $parts[] = '[';
+
+                if (! empty($str)) {
+                    $parts[] = $str;
+                }
+
+                $parts[] = ']';
+                continue;
+            }
+
+            $this->seek($s);
+
+            // for keyframes
+            if ($this->unit($unit)) {
+                $parts[] = $unit;
+                continue;
+            }
+
+            if ($this->restrictedKeyword($name)) {
+                $parts[] = $name;
+                continue;
+            }
+
+            break;
+        }
+
+        $this->eatWhiteDefault = $oldWhite;
+
+        if (! $parts) {
+            return false;
+        }
+
+        $out = $parts;
+
+        return true;
+    }
+
+    /**
+     * Parse a variable
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function variable(&$out)
+    {
+        $s = $this->count;
+
+        if (
+            $this->matchChar('$', false) &&
+            $this->keyword($name)
+        ) {
+            if ($this->allowVars) {
+                $out = [Type::T_VARIABLE, $name];
+            } else {
+                $out = [Type::T_KEYWORD, '$' . $name];
+            }
+
+            return true;
+        }
+
+        $this->seek($s);
+
+        return false;
+    }
+
+    /**
+     * Parse a keyword
+     *
+     * @param string  $word
+     * @param boolean $eatWhitespace
+     *
+     * @return boolean
+     */
+    protected function keyword(&$word, $eatWhitespace = null)
+    {
+        $match = $this->match(
+            $this->utf8
+                ? '(([\pL\w\x{00A0}-\x{10FFFF}_\-\*!"\']|[\\\\].)([\pL\w\x{00A0}-\x{10FFFF}\-_"\']|[\\\\].)*)'
+                : '(([\w_\-\*!"\']|[\\\\].)([\w\-_"\']|[\\\\].)*)',
+            $m,
+            $eatWhitespace
+        );
+
+        if ($match) {
+            $word = $m[1];
+
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Parse a keyword that should not start with a number
+     *
+     * @param string  $word
+     * @param boolean $eatWhitespace
+     *
+     * @return boolean
+     */
+    protected function restrictedKeyword(&$word, $eatWhitespace = null)
+    {
+        $s = $this->count;
+
+        if ($this->keyword($word, $eatWhitespace) && (\ord($word[0]) > 57 || \ord($word[0]) < 48)) {
+            return true;
+        }
+
+        $this->seek($s);
+
+        return false;
+    }
+
+    /**
+     * Parse a placeholder
+     *
+     * @param string|array $placeholder
+     *
+     * @return boolean
+     */
+    protected function placeholder(&$placeholder)
+    {
+        $match = $this->match(
+            $this->utf8
+                ? '([\pL\w\-_]+)'
+                : '([\w\-_]+)',
+            $m
+        );
+
+        if ($match) {
+            $placeholder = $m[1];
+
+            return true;
+        }
+
+        if ($this->interpolation($placeholder)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Parse a url
+     *
+     * @param array $out
+     *
+     * @return boolean
+     */
+    protected function url(&$out)
+    {
+        if ($this->literal('url(', 4)) {
+            $s = $this->count;
+
+            if (
+                ($this->string($out) || $this->spaceList($out)) &&
+                $this->matchChar(')')
+            ) {
+                $out = [Type::T_STRING, '', ['url(', $out, ')']];
+
+                return true;
+            }
+
+            $this->seek($s);
+
+            if (
+                $this->openString(')', $out) &&
+                $this->matchChar(')')
+            ) {
+                $out = [Type::T_STRING, '', ['url(', $out, ')']];
+
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Consume an end of statement delimiter
+     * @param bool $eatWhitespace
+     *
+     * @return boolean
+     */
+    protected function end($eatWhitespace = null)
+    {
+        if ($this->matchChar(';', $eatWhitespace)) {
+            return true;
+        }
+
+        if ($this->count === \strlen($this->buffer) || $this->buffer[$this->count] === '}') {
+            // if there is end of file or a closing block next then we don't need a ;
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Strip assignment flag from the list
+     *
+     * @param array $value
+     *
+     * @return array
+     */
+    protected function stripAssignmentFlags(&$value)
+    {
+        $flags = [];
+
+        for ($token = &$value; $token[0] === Type::T_LIST && ($s = \count($token[2])); $token = &$lastNode) {
+            $lastNode = &$token[2][$s - 1];
+
+            while ($lastNode[0] === Type::T_KEYWORD && \in_array($lastNode[1], ['!default', '!global'])) {
+                array_pop($token[2]);
+
+                $node     = end($token[2]);
+                $token    = $this->flattenList($token);
+                $flags[]  = $lastNode[1];
+                $lastNode = $node;
+            }
+        }
+
+        return $flags;
+    }
+
+    /**
+     * Strip optional flag from selector list
+     *
+     * @param array $selectors
+     *
+     * @return string
+     */
+    protected function stripOptionalFlag(&$selectors)
+    {
+        $optional = false;
+        $selector = end($selectors);
+        $part     = end($selector);
+
+        if ($part === ['!optional']) {
+            array_pop($selectors[\count($selectors) - 1]);
+
+            $optional = true;
+        }
+
+        return $optional;
+    }
+
+    /**
+     * Turn list of length 1 into value type
+     *
+     * @param array $value
+     *
+     * @return array
+     */
+    protected function flattenList($value)
+    {
+        if ($value[0] === Type::T_LIST && \count($value[2]) === 1) {
+            return $this->flattenList($value[2][0]);
+        }
+
+        return $value;
+    }
+
+    /**
+     * Quote regular expression
+     *
+     * @param string $what
+     *
+     * @return string
+     */
+    private function pregQuote($what)
+    {
+        return preg_quote($what, '/');
+    }
+
+    /**
+     * Extract line numbers from buffer
+     *
+     * @param string $buffer
+     */
+    private function extractLineNumbers($buffer)
+    {
+        $this->sourcePositions = [0 => 0];
+        $prev = 0;
+
+        while (($pos = strpos($buffer, "\n", $prev)) !== false) {
+            $this->sourcePositions[] = $pos;
+            $prev = $pos + 1;
+        }
+
+        $this->sourcePositions[] = \strlen($buffer);
+
+        if (substr($buffer, -1) !== "\n") {
+            $this->sourcePositions[] = \strlen($buffer) + 1;
+        }
+    }
+
+    /**
+     * Get source line number and column (given character position in the buffer)
+     *
+     * @param integer $pos
+     *
+     * @return array
+     */
+    private function getSourcePosition($pos)
+    {
+        $low = 0;
+        $high = \count($this->sourcePositions);
+
+        while ($low < $high) {
+            $mid = (int) (($high + $low) / 2);
+
+            if ($pos < $this->sourcePositions[$mid]) {
+                $high = $mid - 1;
+                continue;
+            }
+
+            if ($pos >= $this->sourcePositions[$mid + 1]) {
+                $low = $mid + 1;
+                continue;
+            }
+
+            return [$mid + 1, $pos - $this->sourcePositions[$mid]];
+        }
+
+        return [$low + 1, $pos - $this->sourcePositions[$low]];
+    }
+
+    /**
+     * Save internal encoding
+     */
+    private function saveEncoding()
+    {
+        if (\extension_loaded('mbstring')) {
+            $this->encoding = mb_internal_encoding();
+
+            mb_internal_encoding('iso-8859-1');
+        }
+    }
+
+    /**
+     * Restore internal encoding
+     */
+    private function restoreEncoding()
+    {
+        if (\extension_loaded('mbstring') && $this->encoding) {
+            mb_internal_encoding($this->encoding);
+        }
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/SourceMap/Base64.php b/civicrm/vendor/scssphp/scssphp/src/SourceMap/Base64.php
new file mode 100644
index 0000000000000000000000000000000000000000..5fc56b25a12b4a4bf10dea9301189af893c70bdb
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/SourceMap/Base64.php
@@ -0,0 +1,185 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\SourceMap;
+
+/**
+ * Base 64 Encode/Decode
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Base64
+{
+    /**
+     * @var array
+     */
+    private static $encodingMap = [
+        0 => 'A',
+        1 => 'B',
+        2 => 'C',
+        3 => 'D',
+        4 => 'E',
+        5 => 'F',
+        6 => 'G',
+        7 => 'H',
+        8 => 'I',
+        9 => 'J',
+        10 => 'K',
+        11 => 'L',
+        12 => 'M',
+        13 => 'N',
+        14 => 'O',
+        15 => 'P',
+        16 => 'Q',
+        17 => 'R',
+        18 => 'S',
+        19 => 'T',
+        20 => 'U',
+        21 => 'V',
+        22 => 'W',
+        23 => 'X',
+        24 => 'Y',
+        25 => 'Z',
+        26 => 'a',
+        27 => 'b',
+        28 => 'c',
+        29 => 'd',
+        30 => 'e',
+        31 => 'f',
+        32 => 'g',
+        33 => 'h',
+        34 => 'i',
+        35 => 'j',
+        36 => 'k',
+        37 => 'l',
+        38 => 'm',
+        39 => 'n',
+        40 => 'o',
+        41 => 'p',
+        42 => 'q',
+        43 => 'r',
+        44 => 's',
+        45 => 't',
+        46 => 'u',
+        47 => 'v',
+        48 => 'w',
+        49 => 'x',
+        50 => 'y',
+        51 => 'z',
+        52 => '0',
+        53 => '1',
+        54 => '2',
+        55 => '3',
+        56 => '4',
+        57 => '5',
+        58 => '6',
+        59 => '7',
+        60 => '8',
+        61 => '9',
+        62 => '+',
+        63 => '/',
+    ];
+
+    /**
+     * @var array
+     */
+    private static $decodingMap = [
+        'A' => 0,
+        'B' => 1,
+        'C' => 2,
+        'D' => 3,
+        'E' => 4,
+        'F' => 5,
+        'G' => 6,
+        'H' => 7,
+        'I' => 8,
+        'J' => 9,
+        'K' => 10,
+        'L' => 11,
+        'M' => 12,
+        'N' => 13,
+        'O' => 14,
+        'P' => 15,
+        'Q' => 16,
+        'R' => 17,
+        'S' => 18,
+        'T' => 19,
+        'U' => 20,
+        'V' => 21,
+        'W' => 22,
+        'X' => 23,
+        'Y' => 24,
+        'Z' => 25,
+        'a' => 26,
+        'b' => 27,
+        'c' => 28,
+        'd' => 29,
+        'e' => 30,
+        'f' => 31,
+        'g' => 32,
+        'h' => 33,
+        'i' => 34,
+        'j' => 35,
+        'k' => 36,
+        'l' => 37,
+        'm' => 38,
+        'n' => 39,
+        'o' => 40,
+        'p' => 41,
+        'q' => 42,
+        'r' => 43,
+        's' => 44,
+        't' => 45,
+        'u' => 46,
+        'v' => 47,
+        'w' => 48,
+        'x' => 49,
+        'y' => 50,
+        'z' => 51,
+        0 => 52,
+        1 => 53,
+        2 => 54,
+        3 => 55,
+        4 => 56,
+        5 => 57,
+        6 => 58,
+        7 => 59,
+        8 => 60,
+        9 => 61,
+        '+' => 62,
+        '/' => 63,
+    ];
+
+    /**
+     * Convert to base64
+     *
+     * @param integer $value
+     *
+     * @return string
+     */
+    public static function encode($value)
+    {
+        return self::$encodingMap[$value];
+    }
+
+    /**
+     * Convert from base64
+     *
+     * @param string $value
+     *
+     * @return integer
+     */
+    public static function decode($value)
+    {
+        return self::$decodingMap[$value];
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/SourceMap/Base64VLQ.php b/civicrm/vendor/scssphp/scssphp/src/SourceMap/Base64VLQ.php
new file mode 100644
index 0000000000000000000000000000000000000000..9083d785d8ed30c2c5dc0ce280ad1a5da7526dc4
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/SourceMap/Base64VLQ.php
@@ -0,0 +1,151 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\SourceMap;
+
+use ScssPhp\ScssPhp\SourceMap\Base64;
+
+/**
+ * Base 64 VLQ
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://github.com/google/closure-compiler/blob/master/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors.
+ *
+ * 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.
+ *
+ * @author John Lenz <johnlenz@google.com>
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Base64VLQ
+{
+    // A Base64 VLQ digit can represent 5 bits, so it is base-32.
+    const VLQ_BASE_SHIFT = 5;
+
+    // A mask of bits for a VLQ digit (11111), 31 decimal.
+    const VLQ_BASE_MASK = 31;
+
+    // The continuation bit is the 6th bit.
+    const VLQ_CONTINUATION_BIT = 32;
+
+    /**
+     * Returns the VLQ encoded value.
+     *
+     * @param integer $value
+     *
+     * @return string
+     */
+    public static function encode($value)
+    {
+        $encoded = '';
+        $vlq = self::toVLQSigned($value);
+
+        do {
+            $digit = $vlq & self::VLQ_BASE_MASK;
+
+            //$vlq >>>= self::VLQ_BASE_SHIFT; // unsigned right shift
+            $vlq = (($vlq >> 1) & PHP_INT_MAX) >> (self::VLQ_BASE_SHIFT - 1);
+
+            if ($vlq > 0) {
+                $digit |= self::VLQ_CONTINUATION_BIT;
+            }
+
+            $encoded .= Base64::encode($digit);
+        } while ($vlq > 0);
+
+        return $encoded;
+    }
+
+    /**
+     * Decodes VLQValue.
+     *
+     * @param string $str
+     * @param integer $index
+     *
+     * @return integer
+     */
+    public static function decode($str, &$index)
+    {
+        $result = 0;
+        $shift = 0;
+
+        do {
+            $c = $str[$index++];
+            $digit = Base64::decode($c);
+            $continuation = ($digit & self::VLQ_CONTINUATION_BIT) != 0;
+            $digit &= self::VLQ_BASE_MASK;
+            $result = $result + ($digit << $shift);
+            $shift = $shift + self::VLQ_BASE_SHIFT;
+        } while ($continuation);
+
+        return self::fromVLQSigned($result);
+    }
+
+    /**
+     * Converts from a two-complement value to a value where the sign bit is
+     * is placed in the least significant bit.  For example, as decimals:
+     *   1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+     *   2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+     *
+     * @param integer $value
+     *
+     * @return integer
+     */
+    private static function toVLQSigned($value)
+    {
+        if ($value < 0) {
+            return ((-$value) << 1) + 1;
+        }
+
+        return ($value << 1) + 0;
+    }
+
+    /**
+     * Converts to a two-complement value from a value where the sign bit is
+     * is placed in the least significant bit.  For example, as decimals:
+     *   2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+     *   4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+     *
+     * @param integer $value
+     *
+     * @return integer
+     */
+    private static function fromVLQSigned($value)
+    {
+        $negate = ($value & 1) === 1;
+
+        //$value >>>= 1; // unsigned right shift
+        $value = ($value >> 1) & PHP_INT_MAX;
+
+        if (! $negate) {
+            return $value;
+        }
+
+        // We need to OR 0x80000000 here to ensure the 32nd bit (the sign bit) is
+        // always set for negative numbers. If `value` were 1, (meaning `negate` is
+        // true and all other bits were zeros), `value` would now be 0. -0 is just
+        // 0, and doesn't flip the 32nd bit as intended. All positive numbers will
+        // successfully flip the 32nd bit without issue, so it's a noop for them.
+        return -$value | 0x80000000;
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php b/civicrm/vendor/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php
new file mode 100644
index 0000000000000000000000000000000000000000..d01f7cca5ba0d789c678658a9ae34ba454b90106
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/SourceMap/SourceMapGenerator.php
@@ -0,0 +1,349 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp\SourceMap;
+
+use ScssPhp\ScssPhp\Exception\CompilerException;
+
+/**
+ * Source Map Generator
+ *
+ * {@internal Derivative of oyejorge/less.php's lib/SourceMap/Generator.php, relicensed with permission. }}
+ *
+ * @author Josh Schmidt <oyejorge@gmail.com>
+ * @author Nicolas FRANÇOIS <nicolas.francois@frog-labs.com>
+ */
+class SourceMapGenerator
+{
+    /**
+     * What version of source map does the generator generate?
+     */
+    const VERSION = 3;
+
+    /**
+     * Array of default options
+     *
+     * @var array
+     */
+    protected $defaultOptions = [
+        // an optional source root, useful for relocating source files
+        // on a server or removing repeated values in the 'sources' entry.
+        // This value is prepended to the individual entries in the 'source' field.
+        'sourceRoot' => '',
+
+        // an optional name of the generated code that this source map is associated with.
+        'sourceMapFilename' => null,
+
+        // url of the map
+        'sourceMapURL' => null,
+
+        // absolute path to a file to write the map to
+        'sourceMapWriteTo' => null,
+
+        // output source contents?
+        'outputSourceFiles' => false,
+
+        // base path for filename normalization
+        'sourceMapRootpath' => '',
+
+        // base path for filename normalization
+        'sourceMapBasepath' => ''
+    ];
+
+    /**
+     * The base64 VLQ encoder
+     *
+     * @var \ScssPhp\ScssPhp\SourceMap\Base64VLQ
+     */
+    protected $encoder;
+
+    /**
+     * Array of mappings
+     *
+     * @var array
+     */
+    protected $mappings = [];
+
+    /**
+     * Array of contents map
+     *
+     * @var array
+     */
+    protected $contentsMap = [];
+
+    /**
+     * File to content map
+     *
+     * @var array
+     */
+    protected $sources = [];
+    protected $sourceKeys = [];
+
+    /**
+     * @var array
+     */
+    private $options;
+
+    public function __construct(array $options = [])
+    {
+        $this->options = array_merge($this->defaultOptions, $options);
+        $this->encoder = new Base64VLQ();
+    }
+
+    /**
+     * Adds a mapping
+     *
+     * @param integer $generatedLine   The line number in generated file
+     * @param integer $generatedColumn The column number in generated file
+     * @param integer $originalLine    The line number in original file
+     * @param integer $originalColumn  The column number in original file
+     * @param string  $sourceFile      The original source file
+     */
+    public function addMapping($generatedLine, $generatedColumn, $originalLine, $originalColumn, $sourceFile)
+    {
+        $this->mappings[] = [
+            'generated_line'   => $generatedLine,
+            'generated_column' => $generatedColumn,
+            'original_line'    => $originalLine,
+            'original_column'  => $originalColumn,
+            'source_file'      => $sourceFile
+        ];
+
+        $this->sources[$sourceFile] = $sourceFile;
+    }
+
+    /**
+     * Saves the source map to a file
+     *
+     * @param string $content The content to write
+     *
+     * @return string
+     *
+     * @throws \ScssPhp\ScssPhp\Exception\CompilerException If the file could not be saved
+     */
+    public function saveMap($content)
+    {
+        $file = $this->options['sourceMapWriteTo'];
+        $dir  = \dirname($file);
+
+        // directory does not exist
+        if (! is_dir($dir)) {
+            // FIXME: create the dir automatically?
+            throw new CompilerException(
+                sprintf('The directory "%s" does not exist. Cannot save the source map.', $dir)
+            );
+        }
+
+        // FIXME: proper saving, with dir write check!
+        if (file_put_contents($file, $content) === false) {
+            throw new CompilerException(sprintf('Cannot save the source map to "%s"', $file));
+        }
+
+        return $this->options['sourceMapURL'];
+    }
+
+    /**
+     * Generates the JSON source map
+     *
+     * @return string
+     *
+     * @see https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#
+     */
+    public function generateJson()
+    {
+        $sourceMap = [];
+        $mappings  = $this->generateMappings();
+
+        // File version (always the first entry in the object) and must be a positive integer.
+        $sourceMap['version'] = self::VERSION;
+
+        // An optional name of the generated code that this source map is associated with.
+        $file = $this->options['sourceMapFilename'];
+
+        if ($file) {
+            $sourceMap['file'] = $file;
+        }
+
+        // An optional source root, useful for relocating source files on a server or removing repeated values in the
+        // 'sources' entry. This value is prepended to the individual entries in the 'source' field.
+        $root = $this->options['sourceRoot'];
+
+        if ($root) {
+            $sourceMap['sourceRoot'] = $root;
+        }
+
+        // A list of original sources used by the 'mappings' entry.
+        $sourceMap['sources'] = [];
+
+        foreach ($this->sources as $sourceUri => $sourceFilename) {
+            $sourceMap['sources'][] = $this->normalizeFilename($sourceFilename);
+        }
+
+        // A list of symbol names used by the 'mappings' entry.
+        $sourceMap['names'] = [];
+
+        // A string with the encoded mapping data.
+        $sourceMap['mappings'] = $mappings;
+
+        if ($this->options['outputSourceFiles']) {
+            // An optional list of source content, useful when the 'source' can't be hosted.
+            // The contents are listed in the same order as the sources above.
+            // 'null' may be used if some original sources should be retrieved by name.
+            $sourceMap['sourcesContent'] = $this->getSourcesContent();
+        }
+
+        // less.js compat fixes
+        if (\count($sourceMap['sources']) && empty($sourceMap['sourceRoot'])) {
+            unset($sourceMap['sourceRoot']);
+        }
+
+        return json_encode($sourceMap, JSON_UNESCAPED_SLASHES);
+    }
+
+    /**
+     * Returns the sources contents
+     *
+     * @return array|null
+     */
+    protected function getSourcesContent()
+    {
+        if (empty($this->sources)) {
+            return null;
+        }
+
+        $content = [];
+
+        foreach ($this->sources as $sourceFile) {
+            $content[] = file_get_contents($sourceFile);
+        }
+
+        return $content;
+    }
+
+    /**
+     * Generates the mappings string
+     *
+     * @return string
+     */
+    public function generateMappings()
+    {
+        if (! \count($this->mappings)) {
+            return '';
+        }
+
+        $this->sourceKeys = array_flip(array_keys($this->sources));
+
+        // group mappings by generated line number.
+        $groupedMap = $groupedMapEncoded = [];
+
+        foreach ($this->mappings as $m) {
+            $groupedMap[$m['generated_line']][] = $m;
+        }
+
+        ksort($groupedMap);
+
+        $lastGeneratedLine = $lastOriginalIndex = $lastOriginalLine = $lastOriginalColumn = 0;
+
+        foreach ($groupedMap as $lineNumber => $lineMap) {
+            while (++$lastGeneratedLine < $lineNumber) {
+                $groupedMapEncoded[] = ';';
+            }
+
+            $lineMapEncoded = [];
+            $lastGeneratedColumn = 0;
+
+            foreach ($lineMap as $m) {
+                $mapEncoded = $this->encoder->encode($m['generated_column'] - $lastGeneratedColumn);
+                $lastGeneratedColumn = $m['generated_column'];
+
+                // find the index
+                if ($m['source_file']) {
+                    $index = $this->findFileIndex($m['source_file']);
+
+                    if ($index !== false) {
+                        $mapEncoded .= $this->encoder->encode($index - $lastOriginalIndex);
+                        $lastOriginalIndex = $index;
+                        // lines are stored 0-based in SourceMap spec version 3
+                        $mapEncoded .= $this->encoder->encode($m['original_line'] - 1 - $lastOriginalLine);
+                        $lastOriginalLine = $m['original_line'] - 1;
+                        $mapEncoded .= $this->encoder->encode($m['original_column'] - $lastOriginalColumn);
+                        $lastOriginalColumn = $m['original_column'];
+                    }
+                }
+
+                $lineMapEncoded[] = $mapEncoded;
+            }
+
+            $groupedMapEncoded[] = implode(',', $lineMapEncoded) . ';';
+        }
+
+        return rtrim(implode($groupedMapEncoded), ';');
+    }
+
+    /**
+     * Finds the index for the filename
+     *
+     * @param string $filename
+     *
+     * @return integer|false
+     */
+    protected function findFileIndex($filename)
+    {
+        return $this->sourceKeys[$filename];
+    }
+
+    /**
+     * Normalize filename
+     *
+     * @param string $filename
+     *
+     * @return string
+     */
+    protected function normalizeFilename($filename)
+    {
+        $filename = $this->fixWindowsPath($filename);
+        $rootpath = $this->options['sourceMapRootpath'];
+        $basePath = $this->options['sourceMapBasepath'];
+
+        // "Trim" the 'sourceMapBasepath' from the output filename.
+        if (\strlen($basePath) && strpos($filename, $basePath) === 0) {
+            $filename = substr($filename, \strlen($basePath));
+        }
+
+        // Remove extra leading path separators.
+        if (strpos($filename, '\\') === 0 || strpos($filename, '/') === 0) {
+            $filename = substr($filename, 1);
+        }
+
+        return $rootpath . $filename;
+    }
+
+    /**
+     * Fix windows paths
+     *
+     * @param string  $path
+     * @param boolean $addEndSlash
+     *
+     * @return string
+     */
+    public function fixWindowsPath($path, $addEndSlash = false)
+    {
+        $slash = ($addEndSlash) ? '/' : '';
+
+        if (! empty($path)) {
+            $path = str_replace('\\', '/', $path);
+            $path = rtrim($path, '/') . $slash;
+        }
+
+        return $path;
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Type.php b/civicrm/vendor/scssphp/scssphp/src/Type.php
new file mode 100644
index 0000000000000000000000000000000000000000..97ebb0d5a5b90a2d0287d19f2ace3961288219ff
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Type.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+/**
+ * Block/node types
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Type
+{
+    const T_ASSIGN = 'assign';
+    const T_AT_ROOT = 'at-root';
+    const T_BLOCK = 'block';
+    const T_BREAK = 'break';
+    const T_CHARSET = 'charset';
+    const T_COLOR = 'color';
+    const T_COMMENT = 'comment';
+    const T_CONTINUE = 'continue';
+    const T_CONTROL = 'control';
+    const T_CUSTOM_PROPERTY = 'custom';
+    const T_DEBUG = 'debug';
+    const T_DIRECTIVE = 'directive';
+    const T_EACH = 'each';
+    const T_ELSE = 'else';
+    const T_ELSEIF = 'elseif';
+    const T_ERROR = 'error';
+    const T_EXPRESSION = 'exp';
+    const T_EXTEND = 'extend';
+    const T_FOR = 'for';
+    const T_FUNCTION = 'function';
+    const T_FUNCTION_REFERENCE = 'function-reference';
+    const T_FUNCTION_CALL = 'fncall';
+    const T_HSL = 'hsl';
+    const T_IF = 'if';
+    const T_IMPORT = 'import';
+    const T_INCLUDE = 'include';
+    const T_INTERPOLATE = 'interpolate';
+    const T_INTERPOLATED = 'interpolated';
+    const T_KEYWORD = 'keyword';
+    const T_LIST = 'list';
+    const T_MAP = 'map';
+    const T_MEDIA = 'media';
+    const T_MEDIA_EXPRESSION = 'mediaExp';
+    const T_MEDIA_TYPE = 'mediaType';
+    const T_MEDIA_VALUE = 'mediaValue';
+    const T_MIXIN = 'mixin';
+    const T_MIXIN_CONTENT = 'mixin_content';
+    const T_NESTED_PROPERTY = 'nestedprop';
+    const T_NOT = 'not';
+    const T_NULL = 'null';
+    const T_NUMBER = 'number';
+    const T_RETURN = 'return';
+    const T_ROOT = 'root';
+    const T_SCSSPHP_IMPORT_ONCE = 'scssphp-import-once';
+    const T_SELF = 'self';
+    const T_STRING = 'string';
+    const T_UNARY = 'unary';
+    const T_VARIABLE = 'var';
+    const T_WARN = 'warn';
+    const T_WHILE = 'while';
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Util.php b/civicrm/vendor/scssphp/scssphp/src/Util.php
new file mode 100644
index 0000000000000000000000000000000000000000..124aa820436aa3c8b3baf3804116af98b0628fdd
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Util.php
@@ -0,0 +1,160 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+use ScssPhp\ScssPhp\Base\Range;
+use ScssPhp\ScssPhp\Exception\RangeException;
+
+/**
+ * Utilty functions
+ *
+ * @author Anthon Pang <anthon.pang@gmail.com>
+ */
+class Util
+{
+    /**
+     * Asserts that `value` falls within `range` (inclusive), leaving
+     * room for slight floating-point errors.
+     *
+     * @param string                    $name  The name of the value. Used in the error message.
+     * @param \ScssPhp\ScssPhp\Base\Range $range Range of values.
+     * @param array                     $value The value to check.
+     * @param string                    $unit  The unit of the value. Used in error reporting.
+     *
+     * @return mixed `value` adjusted to fall within range, if it was outside by a floating-point margin.
+     *
+     * @throws \ScssPhp\ScssPhp\Exception\RangeException
+     */
+    public static function checkRange($name, Range $range, $value, $unit = '')
+    {
+        $val = $value[1];
+        $grace = new Range(-0.00001, 0.00001);
+
+        if (! \is_numeric($val)) {
+            throw new RangeException("$name {$val} is not a number.");
+        }
+
+        if ($range->includes($val)) {
+            return $val;
+        }
+
+        if ($grace->includes($val - $range->first)) {
+            return $range->first;
+        }
+
+        if ($grace->includes($val - $range->last)) {
+            return $range->last;
+        }
+
+        throw new RangeException("$name {$val} must be between {$range->first} and {$range->last}$unit");
+    }
+
+    /**
+     * Encode URI component
+     *
+     * @param string $string
+     *
+     * @return string
+     */
+    public static function encodeURIComponent($string)
+    {
+        $revert = ['%21' => '!', '%2A' => '*', '%27' => "'", '%28' => '(', '%29' => ')'];
+
+        return strtr(rawurlencode($string), $revert);
+    }
+
+    /**
+     * mb_chr() wrapper
+     *
+     * @param integer $code
+     *
+     * @return string
+     */
+    public static function mbChr($code)
+    {
+        // Use the native implementation if available.
+        if (\function_exists('mb_chr')) {
+            return mb_chr($code, 'UTF-8');
+        }
+
+        if (0x80 > $code %= 0x200000) {
+            $s = \chr($code);
+        } elseif (0x800 > $code) {
+            $s = \chr(0xC0 | $code >> 6) . \chr(0x80 | $code & 0x3F);
+        } elseif (0x10000 > $code) {
+            $s = \chr(0xE0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3F) . \chr(0x80 | $code & 0x3F);
+        } else {
+            $s = \chr(0xF0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3F)
+                . \chr(0x80 | $code >> 6 & 0x3F) . \chr(0x80 | $code & 0x3F);
+        }
+
+        return $s;
+    }
+
+    /**
+     * mb_strlen() wrapper
+     *
+     * @param string $string
+     * @return false|int
+     */
+    public static function mbStrlen($string)
+    {
+        // Use the native implementation if available.
+        if (\function_exists('mb_strlen')) {
+            return mb_strlen($string, 'UTF-8');
+        }
+
+        if (\function_exists('iconv_strlen')) {
+            return @iconv_strlen($string, 'UTF-8');
+        }
+
+        return strlen($string);
+    }
+
+    /**
+     * mb_substr() wrapper
+     * @param string $string
+     * @param int $start
+     * @param null|int $length
+     * @return string
+     */
+    public static function mbSubstr($string, $start, $length = null)
+    {
+        // Use the native implementation if available.
+        if (\function_exists('mb_substr')) {
+            return mb_substr($string, $start, $length, 'UTF-8');
+        }
+
+        if (\function_exists('iconv_substr')) {
+            if ($start < 0) {
+                $start = static::mbStrlen($string) + $start;
+                if ($start < 0) {
+                    $start = 0;
+                }
+            }
+
+            if (null === $length) {
+                $length = 2147483647;
+            } elseif ($length < 0) {
+                $length = static::mbStrlen($string) + $length - $start;
+                if ($length < 0) {
+                    return '';
+                }
+            }
+
+            return (string)iconv_substr($string, $start, $length, 'UTF-8');
+        }
+
+        return substr($string, $start, $length);
+    }
+}
diff --git a/civicrm/vendor/scssphp/scssphp/src/Version.php b/civicrm/vendor/scssphp/scssphp/src/Version.php
new file mode 100644
index 0000000000000000000000000000000000000000..8445434c5c28fc8c9ed955df39e22a690d12defb
--- /dev/null
+++ b/civicrm/vendor/scssphp/scssphp/src/Version.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * SCSSPHP
+ *
+ * @copyright 2012-2020 Leaf Corcoran
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ *
+ * @link http://scssphp.github.io/scssphp
+ */
+
+namespace ScssPhp\ScssPhp;
+
+/**
+ * SCSSPHP version
+ *
+ * @author Leaf Corcoran <leafot@gmail.com>
+ */
+class Version
+{
+    const VERSION = '1.2.1';
+}
diff --git a/civicrm/vendor/symfony/var-dumper/.gitignore b/civicrm/vendor/symfony/var-dumper/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..5414c2c655e72ae741a2eccd1d69d06ce7c20f02
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/.gitignore
@@ -0,0 +1,3 @@
+composer.lock
+phpunit.xml
+vendor/
diff --git a/civicrm/vendor/symfony/var-dumper/CHANGELOG.md b/civicrm/vendor/symfony/var-dumper/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..2d44cad2259c0642765df2ef3b5cf8ea1ebe81c9
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/CHANGELOG.md
@@ -0,0 +1,13 @@
+CHANGELOG
+=========
+
+3.4.0
+-----
+
+ * added `AbstractCloner::setMinDepth()` function to ensure minimum tree depth
+ * deprecated `MongoCaster`
+
+2.7.0
+-----
+
+ * deprecated Cloner\Data::getLimitedClone(). Use withMaxDepth, withMaxItemsPerDepth or withRefHandles instead.
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/AmqpCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/AmqpCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..19bdc29525eab53212bb4cc27d5105b3ae036454
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/AmqpCaster.php
@@ -0,0 +1,210 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts Amqp related classes to array representation.
+ *
+ * @author Grégoire Pineau <lyrixx@lyrixx.info>
+ */
+class AmqpCaster
+{
+    private static $flags = [
+        AMQP_DURABLE => 'AMQP_DURABLE',
+        AMQP_PASSIVE => 'AMQP_PASSIVE',
+        AMQP_EXCLUSIVE => 'AMQP_EXCLUSIVE',
+        AMQP_AUTODELETE => 'AMQP_AUTODELETE',
+        AMQP_INTERNAL => 'AMQP_INTERNAL',
+        AMQP_NOLOCAL => 'AMQP_NOLOCAL',
+        AMQP_AUTOACK => 'AMQP_AUTOACK',
+        AMQP_IFEMPTY => 'AMQP_IFEMPTY',
+        AMQP_IFUNUSED => 'AMQP_IFUNUSED',
+        AMQP_MANDATORY => 'AMQP_MANDATORY',
+        AMQP_IMMEDIATE => 'AMQP_IMMEDIATE',
+        AMQP_MULTIPLE => 'AMQP_MULTIPLE',
+        AMQP_NOWAIT => 'AMQP_NOWAIT',
+        AMQP_REQUEUE => 'AMQP_REQUEUE',
+    ];
+
+    private static $exchangeTypes = [
+        AMQP_EX_TYPE_DIRECT => 'AMQP_EX_TYPE_DIRECT',
+        AMQP_EX_TYPE_FANOUT => 'AMQP_EX_TYPE_FANOUT',
+        AMQP_EX_TYPE_TOPIC => 'AMQP_EX_TYPE_TOPIC',
+        AMQP_EX_TYPE_HEADERS => 'AMQP_EX_TYPE_HEADERS',
+    ];
+
+    public static function castConnection(\AMQPConnection $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        $a += [
+            $prefix.'is_connected' => $c->isConnected(),
+        ];
+
+        // Recent version of the extension already expose private properties
+        if (isset($a["\x00AMQPConnection\x00login"])) {
+            return $a;
+        }
+
+        // BC layer in the amqp lib
+        if (method_exists($c, 'getReadTimeout')) {
+            $timeout = $c->getReadTimeout();
+        } else {
+            $timeout = $c->getTimeout();
+        }
+
+        $a += [
+            $prefix.'is_connected' => $c->isConnected(),
+            $prefix.'login' => $c->getLogin(),
+            $prefix.'password' => $c->getPassword(),
+            $prefix.'host' => $c->getHost(),
+            $prefix.'vhost' => $c->getVhost(),
+            $prefix.'port' => $c->getPort(),
+            $prefix.'read_timeout' => $timeout,
+        ];
+
+        return $a;
+    }
+
+    public static function castChannel(\AMQPChannel $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        $a += [
+            $prefix.'is_connected' => $c->isConnected(),
+            $prefix.'channel_id' => $c->getChannelId(),
+        ];
+
+        // Recent version of the extension already expose private properties
+        if (isset($a["\x00AMQPChannel\x00connection"])) {
+            return $a;
+        }
+
+        $a += [
+            $prefix.'connection' => $c->getConnection(),
+            $prefix.'prefetch_size' => $c->getPrefetchSize(),
+            $prefix.'prefetch_count' => $c->getPrefetchCount(),
+        ];
+
+        return $a;
+    }
+
+    public static function castQueue(\AMQPQueue $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        $a += [
+            $prefix.'flags' => self::extractFlags($c->getFlags()),
+        ];
+
+        // Recent version of the extension already expose private properties
+        if (isset($a["\x00AMQPQueue\x00name"])) {
+            return $a;
+        }
+
+        $a += [
+            $prefix.'connection' => $c->getConnection(),
+            $prefix.'channel' => $c->getChannel(),
+            $prefix.'name' => $c->getName(),
+            $prefix.'arguments' => $c->getArguments(),
+        ];
+
+        return $a;
+    }
+
+    public static function castExchange(\AMQPExchange $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        $a += [
+            $prefix.'flags' => self::extractFlags($c->getFlags()),
+        ];
+
+        $type = isset(self::$exchangeTypes[$c->getType()]) ? new ConstStub(self::$exchangeTypes[$c->getType()], $c->getType()) : $c->getType();
+
+        // Recent version of the extension already expose private properties
+        if (isset($a["\x00AMQPExchange\x00name"])) {
+            $a["\x00AMQPExchange\x00type"] = $type;
+
+            return $a;
+        }
+
+        $a += [
+            $prefix.'connection' => $c->getConnection(),
+            $prefix.'channel' => $c->getChannel(),
+            $prefix.'name' => $c->getName(),
+            $prefix.'type' => $type,
+            $prefix.'arguments' => $c->getArguments(),
+        ];
+
+        return $a;
+    }
+
+    public static function castEnvelope(\AMQPEnvelope $c, array $a, Stub $stub, $isNested, $filter = 0)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        $deliveryMode = new ConstStub($c->getDeliveryMode().(2 === $c->getDeliveryMode() ? ' (persistent)' : ' (non-persistent)'), $c->getDeliveryMode());
+
+        // Recent version of the extension already expose private properties
+        if (isset($a["\x00AMQPEnvelope\x00body"])) {
+            $a["\0AMQPEnvelope\0delivery_mode"] = $deliveryMode;
+
+            return $a;
+        }
+
+        if (!($filter & Caster::EXCLUDE_VERBOSE)) {
+            $a += [$prefix.'body' => $c->getBody()];
+        }
+
+        $a += [
+            $prefix.'delivery_tag' => $c->getDeliveryTag(),
+            $prefix.'is_redelivery' => $c->isRedelivery(),
+            $prefix.'exchange_name' => $c->getExchangeName(),
+            $prefix.'routing_key' => $c->getRoutingKey(),
+            $prefix.'content_type' => $c->getContentType(),
+            $prefix.'content_encoding' => $c->getContentEncoding(),
+            $prefix.'headers' => $c->getHeaders(),
+            $prefix.'delivery_mode' => $deliveryMode,
+            $prefix.'priority' => $c->getPriority(),
+            $prefix.'correlation_id' => $c->getCorrelationId(),
+            $prefix.'reply_to' => $c->getReplyTo(),
+            $prefix.'expiration' => $c->getExpiration(),
+            $prefix.'message_id' => $c->getMessageId(),
+            $prefix.'timestamp' => $c->getTimeStamp(),
+            $prefix.'type' => $c->getType(),
+            $prefix.'user_id' => $c->getUserId(),
+            $prefix.'app_id' => $c->getAppId(),
+        ];
+
+        return $a;
+    }
+
+    private static function extractFlags($flags)
+    {
+        $flagsArray = [];
+
+        foreach (self::$flags as $value => $name) {
+            if ($flags & $value) {
+                $flagsArray[] = $name;
+            }
+        }
+
+        if (!$flagsArray) {
+            $flagsArray = ['AMQP_NOPARAM'];
+        }
+
+        return new ConstStub(implode('|', $flagsArray), $flags);
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/ArgsStub.php b/civicrm/vendor/symfony/var-dumper/Caster/ArgsStub.php
new file mode 100644
index 0000000000000000000000000000000000000000..081fb47e996320b4fb5e0fbe410bf0584932702c
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/ArgsStub.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Represents a list of function arguments.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ArgsStub extends EnumStub
+{
+    private static $parameters = [];
+
+    public function __construct(array $args, $function, $class)
+    {
+        list($variadic, $params) = self::getParameters($function, $class);
+
+        $values = [];
+        foreach ($args as $k => $v) {
+            $values[$k] = !is_scalar($v) && !$v instanceof Stub ? new CutStub($v) : $v;
+        }
+        if (null === $params) {
+            parent::__construct($values, false);
+
+            return;
+        }
+        if (\count($values) < \count($params)) {
+            $params = \array_slice($params, 0, \count($values));
+        } elseif (\count($values) > \count($params)) {
+            $values[] = new EnumStub(array_splice($values, \count($params)), false);
+            $params[] = $variadic;
+        }
+        if (['...'] === $params) {
+            $this->dumpKeys = false;
+            $this->value = $values[0]->value;
+        } else {
+            $this->value = array_combine($params, $values);
+        }
+    }
+
+    private static function getParameters($function, $class)
+    {
+        if (isset(self::$parameters[$k = $class.'::'.$function])) {
+            return self::$parameters[$k];
+        }
+
+        try {
+            $r = null !== $class ? new \ReflectionMethod($class, $function) : new \ReflectionFunction($function);
+        } catch (\ReflectionException $e) {
+            return [null, null];
+        }
+
+        $variadic = '...';
+        $params = [];
+        foreach ($r->getParameters() as $v) {
+            $k = '$'.$v->name;
+            if ($v->isPassedByReference()) {
+                $k = '&'.$k;
+            }
+            if (method_exists($v, 'isVariadic') && $v->isVariadic()) {
+                $variadic .= $k;
+            } else {
+                $params[] = $k;
+            }
+        }
+
+        return self::$parameters[$k] = [$variadic, $params];
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/Caster.php b/civicrm/vendor/symfony/var-dumper/Caster/Caster.php
new file mode 100644
index 0000000000000000000000000000000000000000..a78410f2f792d19839b1c5444f3403a060fd5743
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/Caster.php
@@ -0,0 +1,192 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Helper for filtering out properties in casters.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @final
+ */
+class Caster
+{
+    const EXCLUDE_VERBOSE = 1;
+    const EXCLUDE_VIRTUAL = 2;
+    const EXCLUDE_DYNAMIC = 4;
+    const EXCLUDE_PUBLIC = 8;
+    const EXCLUDE_PROTECTED = 16;
+    const EXCLUDE_PRIVATE = 32;
+    const EXCLUDE_NULL = 64;
+    const EXCLUDE_EMPTY = 128;
+    const EXCLUDE_NOT_IMPORTANT = 256;
+    const EXCLUDE_STRICT = 512;
+
+    const PREFIX_VIRTUAL = "\0~\0";
+    const PREFIX_DYNAMIC = "\0+\0";
+    const PREFIX_PROTECTED = "\0*\0";
+
+    /**
+     * Casts objects to arrays and adds the dynamic property prefix.
+     *
+     * @param object $obj          The object to cast
+     * @param string $class        The class of the object
+     * @param bool   $hasDebugInfo Whether the __debugInfo method exists on $obj or not
+     *
+     * @return array The array-cast of the object, with prefixed dynamic properties
+     */
+    public static function castObject($obj, $class, $hasDebugInfo = false, $debugClass = null)
+    {
+        if ($class instanceof \ReflectionClass) {
+            @trigger_error(sprintf('Passing a ReflectionClass to "%s()" is deprecated since Symfony 3.3 and will be unsupported in 4.0. Pass the class name as string instead.', __METHOD__), E_USER_DEPRECATED);
+            $hasDebugInfo = $class->hasMethod('__debugInfo');
+            $class = $class->name;
+        }
+
+        if ($hasDebugInfo) {
+            try {
+                $debugInfo = $obj->__debugInfo();
+            } catch (\Exception $e) {
+                // ignore failing __debugInfo()
+                $hasDebugInfo = false;
+            }
+        }
+
+        $a = $obj instanceof \Closure ? [] : (array) $obj;
+
+        if ($obj instanceof \__PHP_Incomplete_Class) {
+            return $a;
+        }
+
+        if ($a) {
+            static $publicProperties = [];
+            if (null === $debugClass) {
+                if (\PHP_VERSION_ID >= 80000) {
+                    $debugClass = get_debug_type($obj);
+                } else {
+                    $debugClass = $class;
+
+                    if (isset($debugClass[15]) && "\0" === $debugClass[15]) {
+                        $debugClass = (get_parent_class($debugClass) ?: key(class_implements($debugClass)) ?: 'class').'@anonymous';
+                    }
+                }
+            }
+
+            $i = 0;
+            $prefixedKeys = [];
+            foreach ($a as $k => $v) {
+                if (isset($k[0]) ? "\0" !== $k[0] : \PHP_VERSION_ID >= 70200) {
+                    if (!isset($publicProperties[$class])) {
+                        foreach ((new \ReflectionClass($class))->getProperties(\ReflectionProperty::IS_PUBLIC) as $prop) {
+                            $publicProperties[$class][$prop->name] = true;
+                        }
+                    }
+                    if (!isset($publicProperties[$class][$k])) {
+                        $prefixedKeys[$i] = self::PREFIX_DYNAMIC.$k;
+                    }
+                } elseif ($debugClass !== $class && 1 === strpos($k, $class)) {
+                    $prefixedKeys[$i] = "\0".$debugClass.strrchr($k, "\0");
+                }
+                ++$i;
+            }
+            if ($prefixedKeys) {
+                $keys = array_keys($a);
+                foreach ($prefixedKeys as $i => $k) {
+                    $keys[$i] = $k;
+                }
+                $a = array_combine($keys, $a);
+            }
+        }
+
+        if ($hasDebugInfo && \is_array($debugInfo)) {
+            foreach ($debugInfo as $k => $v) {
+                if (!isset($k[0]) || "\0" !== $k[0]) {
+                    if (\array_key_exists(self::PREFIX_DYNAMIC.$k, $a)) {
+                        continue;
+                    }
+                    $k = self::PREFIX_VIRTUAL.$k;
+                }
+
+                unset($a[$k]);
+                $a[$k] = $v;
+            }
+        }
+
+        return $a;
+    }
+
+    /**
+     * Filters out the specified properties.
+     *
+     * By default, a single match in the $filter bit field filters properties out, following an "or" logic.
+     * When EXCLUDE_STRICT is set, an "and" logic is applied: all bits must match for a property to be removed.
+     *
+     * @param array    $a                The array containing the properties to filter
+     * @param int      $filter           A bit field of Caster::EXCLUDE_* constants specifying which properties to filter out
+     * @param string[] $listedProperties List of properties to exclude when Caster::EXCLUDE_VERBOSE is set, and to preserve when Caster::EXCLUDE_NOT_IMPORTANT is set
+     * @param int      &$count           Set to the number of removed properties
+     *
+     * @return array The filtered array
+     */
+    public static function filter(array $a, $filter, array $listedProperties = [], &$count = 0)
+    {
+        $count = 0;
+
+        foreach ($a as $k => $v) {
+            $type = self::EXCLUDE_STRICT & $filter;
+
+            if (null === $v) {
+                $type |= self::EXCLUDE_NULL & $filter;
+                $type |= self::EXCLUDE_EMPTY & $filter;
+            } elseif (false === $v || '' === $v || '0' === $v || 0 === $v || 0.0 === $v || [] === $v) {
+                $type |= self::EXCLUDE_EMPTY & $filter;
+            }
+            if ((self::EXCLUDE_NOT_IMPORTANT & $filter) && !\in_array($k, $listedProperties, true)) {
+                $type |= self::EXCLUDE_NOT_IMPORTANT;
+            }
+            if ((self::EXCLUDE_VERBOSE & $filter) && \in_array($k, $listedProperties, true)) {
+                $type |= self::EXCLUDE_VERBOSE;
+            }
+
+            if (!isset($k[1]) || "\0" !== $k[0]) {
+                $type |= self::EXCLUDE_PUBLIC & $filter;
+            } elseif ('~' === $k[1]) {
+                $type |= self::EXCLUDE_VIRTUAL & $filter;
+            } elseif ('+' === $k[1]) {
+                $type |= self::EXCLUDE_DYNAMIC & $filter;
+            } elseif ('*' === $k[1]) {
+                $type |= self::EXCLUDE_PROTECTED & $filter;
+            } else {
+                $type |= self::EXCLUDE_PRIVATE & $filter;
+            }
+
+            if ((self::EXCLUDE_STRICT & $filter) ? $type === $filter : $type) {
+                unset($a[$k]);
+                ++$count;
+            }
+        }
+
+        return $a;
+    }
+
+    public static function castPhpIncompleteClass(\__PHP_Incomplete_Class $c, array $a, Stub $stub, $isNested)
+    {
+        if (isset($a['__PHP_Incomplete_Class_Name'])) {
+            $stub->class .= '('.$a['__PHP_Incomplete_Class_Name'].')';
+            unset($a['__PHP_Incomplete_Class_Name']);
+        }
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/ClassStub.php b/civicrm/vendor/symfony/var-dumper/Caster/ClassStub.php
new file mode 100644
index 0000000000000000000000000000000000000000..1a85098e1581bb59dfbcd872cf6b86c33de13431
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/ClassStub.php
@@ -0,0 +1,87 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+/**
+ * Represents a PHP class identifier.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ClassStub extends ConstStub
+{
+    /**
+     * @param string   $identifier A PHP identifier, e.g. a class, method, interface, etc. name
+     * @param callable $callable   The callable targeted by the identifier when it is ambiguous or not a real PHP identifier
+     */
+    public function __construct($identifier, $callable = null)
+    {
+        $this->value = $identifier;
+
+        if (0 < $i = strrpos($identifier, '\\')) {
+            $this->attr['ellipsis'] = \strlen($identifier) - $i;
+            $this->attr['ellipsis-type'] = 'class';
+            $this->attr['ellipsis-tail'] = 1;
+        }
+
+        try {
+            if (null !== $callable) {
+                if ($callable instanceof \Closure) {
+                    $r = new \ReflectionFunction($callable);
+                } elseif (\is_object($callable)) {
+                    $r = [$callable, '__invoke'];
+                } elseif (\is_array($callable)) {
+                    $r = $callable;
+                } elseif (false !== $i = strpos($callable, '::')) {
+                    $r = [substr($callable, 0, $i), substr($callable, 2 + $i)];
+                } else {
+                    $r = new \ReflectionFunction($callable);
+                }
+            } elseif (0 < $i = strpos($identifier, '::') ?: strpos($identifier, '->')) {
+                $r = [substr($identifier, 0, $i), substr($identifier, 2 + $i)];
+            } else {
+                $r = new \ReflectionClass($identifier);
+            }
+
+            if (\is_array($r)) {
+                try {
+                    $r = new \ReflectionMethod($r[0], $r[1]);
+                } catch (\ReflectionException $e) {
+                    $r = new \ReflectionClass($r[0]);
+                }
+            }
+        } catch (\ReflectionException $e) {
+            return;
+        }
+
+        if ($f = $r->getFileName()) {
+            $this->attr['file'] = $f;
+            $this->attr['line'] = $r->getStartLine();
+        }
+    }
+
+    public static function wrapCallable($callable)
+    {
+        if (\is_object($callable) || !\is_callable($callable)) {
+            return $callable;
+        }
+
+        if (!\is_array($callable)) {
+            $callable = new static($callable);
+        } elseif (\is_string($callable[0])) {
+            $callable[0] = new static($callable[0]);
+        } else {
+            $callable[1] = new static($callable[1], $callable);
+        }
+
+        return $callable;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/ConstStub.php b/civicrm/vendor/symfony/var-dumper/Caster/ConstStub.php
new file mode 100644
index 0000000000000000000000000000000000000000..26c0010b66a8cac06c3ce25e8b1c2ef08d0b013a
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/ConstStub.php
@@ -0,0 +1,33 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Represents a PHP constant and its value.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ConstStub extends Stub
+{
+    public function __construct($name, $value)
+    {
+        $this->class = $name;
+        $this->value = $value;
+    }
+
+    public function __toString()
+    {
+        return (string) $this->value;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/CutArrayStub.php b/civicrm/vendor/symfony/var-dumper/Caster/CutArrayStub.php
new file mode 100644
index 0000000000000000000000000000000000000000..0e4fb363d2d41a45267d011d6c92b5da3dbb10be
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/CutArrayStub.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+/**
+ * Represents a cut array.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class CutArrayStub extends CutStub
+{
+    public $preservedSubset;
+
+    public function __construct(array $value, array $preservedKeys)
+    {
+        parent::__construct($value);
+
+        $this->preservedSubset = array_intersect_key($value, array_flip($preservedKeys));
+        $this->cut -= \count($this->preservedSubset);
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/CutStub.php b/civicrm/vendor/symfony/var-dumper/Caster/CutStub.php
new file mode 100644
index 0000000000000000000000000000000000000000..690338f542d97a8ad4f7bfe4f79cb3ebe20857ca
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/CutStub.php
@@ -0,0 +1,59 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Represents the main properties of a PHP variable, pre-casted by a caster.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class CutStub extends Stub
+{
+    public function __construct($value)
+    {
+        $this->value = $value;
+
+        switch (\gettype($value)) {
+            case 'object':
+                $this->type = self::TYPE_OBJECT;
+                $this->class = \get_class($value);
+                $this->cut = -1;
+                break;
+
+            case 'array':
+                $this->type = self::TYPE_ARRAY;
+                $this->class = self::ARRAY_ASSOC;
+                $this->cut = $this->value = \count($value);
+                break;
+
+            case 'resource':
+            case 'unknown type':
+            case 'resource (closed)':
+                $this->type = self::TYPE_RESOURCE;
+                $this->handle = (int) $value;
+                if ('Unknown' === $this->class = @get_resource_type($value)) {
+                    $this->class = 'Closed';
+                }
+                $this->cut = -1;
+                break;
+
+            case 'string':
+                $this->type = self::TYPE_STRING;
+                $this->class = preg_match('//u', $value) ? self::STRING_UTF8 : self::STRING_BINARY;
+                $this->cut = self::STRING_BINARY === $this->class ? \strlen($value) : mb_strlen($value, 'UTF-8');
+                $this->value = '';
+                break;
+        }
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/DOMCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/DOMCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..65151b4f4ff7498134366d0704400891adb50b34
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/DOMCaster.php
@@ -0,0 +1,302 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts DOM related classes to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DOMCaster
+{
+    private static $errorCodes = [
+        DOM_PHP_ERR => 'DOM_PHP_ERR',
+        DOM_INDEX_SIZE_ERR => 'DOM_INDEX_SIZE_ERR',
+        DOMSTRING_SIZE_ERR => 'DOMSTRING_SIZE_ERR',
+        DOM_HIERARCHY_REQUEST_ERR => 'DOM_HIERARCHY_REQUEST_ERR',
+        DOM_WRONG_DOCUMENT_ERR => 'DOM_WRONG_DOCUMENT_ERR',
+        DOM_INVALID_CHARACTER_ERR => 'DOM_INVALID_CHARACTER_ERR',
+        DOM_NO_DATA_ALLOWED_ERR => 'DOM_NO_DATA_ALLOWED_ERR',
+        DOM_NO_MODIFICATION_ALLOWED_ERR => 'DOM_NO_MODIFICATION_ALLOWED_ERR',
+        DOM_NOT_FOUND_ERR => 'DOM_NOT_FOUND_ERR',
+        DOM_NOT_SUPPORTED_ERR => 'DOM_NOT_SUPPORTED_ERR',
+        DOM_INUSE_ATTRIBUTE_ERR => 'DOM_INUSE_ATTRIBUTE_ERR',
+        DOM_INVALID_STATE_ERR => 'DOM_INVALID_STATE_ERR',
+        DOM_SYNTAX_ERR => 'DOM_SYNTAX_ERR',
+        DOM_INVALID_MODIFICATION_ERR => 'DOM_INVALID_MODIFICATION_ERR',
+        DOM_NAMESPACE_ERR => 'DOM_NAMESPACE_ERR',
+        DOM_INVALID_ACCESS_ERR => 'DOM_INVALID_ACCESS_ERR',
+        DOM_VALIDATION_ERR => 'DOM_VALIDATION_ERR',
+    ];
+
+    private static $nodeTypes = [
+        XML_ELEMENT_NODE => 'XML_ELEMENT_NODE',
+        XML_ATTRIBUTE_NODE => 'XML_ATTRIBUTE_NODE',
+        XML_TEXT_NODE => 'XML_TEXT_NODE',
+        XML_CDATA_SECTION_NODE => 'XML_CDATA_SECTION_NODE',
+        XML_ENTITY_REF_NODE => 'XML_ENTITY_REF_NODE',
+        XML_ENTITY_NODE => 'XML_ENTITY_NODE',
+        XML_PI_NODE => 'XML_PI_NODE',
+        XML_COMMENT_NODE => 'XML_COMMENT_NODE',
+        XML_DOCUMENT_NODE => 'XML_DOCUMENT_NODE',
+        XML_DOCUMENT_TYPE_NODE => 'XML_DOCUMENT_TYPE_NODE',
+        XML_DOCUMENT_FRAG_NODE => 'XML_DOCUMENT_FRAG_NODE',
+        XML_NOTATION_NODE => 'XML_NOTATION_NODE',
+        XML_HTML_DOCUMENT_NODE => 'XML_HTML_DOCUMENT_NODE',
+        XML_DTD_NODE => 'XML_DTD_NODE',
+        XML_ELEMENT_DECL_NODE => 'XML_ELEMENT_DECL_NODE',
+        XML_ATTRIBUTE_DECL_NODE => 'XML_ATTRIBUTE_DECL_NODE',
+        XML_ENTITY_DECL_NODE => 'XML_ENTITY_DECL_NODE',
+        XML_NAMESPACE_DECL_NODE => 'XML_NAMESPACE_DECL_NODE',
+    ];
+
+    public static function castException(\DOMException $e, array $a, Stub $stub, $isNested)
+    {
+        $k = Caster::PREFIX_PROTECTED.'code';
+        if (isset($a[$k], self::$errorCodes[$a[$k]])) {
+            $a[$k] = new ConstStub(self::$errorCodes[$a[$k]], $a[$k]);
+        }
+
+        return $a;
+    }
+
+    public static function castLength($dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'length' => $dom->length,
+        ];
+
+        return $a;
+    }
+
+    public static function castImplementation($dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            Caster::PREFIX_VIRTUAL.'Core' => '1.0',
+            Caster::PREFIX_VIRTUAL.'XML' => '2.0',
+        ];
+
+        return $a;
+    }
+
+    public static function castNode(\DOMNode $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'nodeName' => $dom->nodeName,
+            'nodeValue' => new CutStub($dom->nodeValue),
+            'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType),
+            'parentNode' => new CutStub($dom->parentNode),
+            'childNodes' => $dom->childNodes,
+            'firstChild' => new CutStub($dom->firstChild),
+            'lastChild' => new CutStub($dom->lastChild),
+            'previousSibling' => new CutStub($dom->previousSibling),
+            'nextSibling' => new CutStub($dom->nextSibling),
+            'attributes' => $dom->attributes,
+            'ownerDocument' => new CutStub($dom->ownerDocument),
+            'namespaceURI' => $dom->namespaceURI,
+            'prefix' => $dom->prefix,
+            'localName' => $dom->localName,
+            'baseURI' => $dom->baseURI ? new LinkStub($dom->baseURI) : $dom->baseURI,
+            'textContent' => new CutStub($dom->textContent),
+        ];
+
+        return $a;
+    }
+
+    public static function castNameSpaceNode(\DOMNameSpaceNode $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'nodeName' => $dom->nodeName,
+            'nodeValue' => new CutStub($dom->nodeValue),
+            'nodeType' => new ConstStub(self::$nodeTypes[$dom->nodeType], $dom->nodeType),
+            'prefix' => $dom->prefix,
+            'localName' => $dom->localName,
+            'namespaceURI' => $dom->namespaceURI,
+            'ownerDocument' => new CutStub($dom->ownerDocument),
+            'parentNode' => new CutStub($dom->parentNode),
+        ];
+
+        return $a;
+    }
+
+    public static function castDocument(\DOMDocument $dom, array $a, Stub $stub, $isNested, $filter = 0)
+    {
+        $a += [
+            'doctype' => $dom->doctype,
+            'implementation' => $dom->implementation,
+            'documentElement' => new CutStub($dom->documentElement),
+            'actualEncoding' => $dom->actualEncoding,
+            'encoding' => $dom->encoding,
+            'xmlEncoding' => $dom->xmlEncoding,
+            'standalone' => $dom->standalone,
+            'xmlStandalone' => $dom->xmlStandalone,
+            'version' => $dom->version,
+            'xmlVersion' => $dom->xmlVersion,
+            'strictErrorChecking' => $dom->strictErrorChecking,
+            'documentURI' => $dom->documentURI ? new LinkStub($dom->documentURI) : $dom->documentURI,
+            'config' => $dom->config,
+            'formatOutput' => $dom->formatOutput,
+            'validateOnParse' => $dom->validateOnParse,
+            'resolveExternals' => $dom->resolveExternals,
+            'preserveWhiteSpace' => $dom->preserveWhiteSpace,
+            'recover' => $dom->recover,
+            'substituteEntities' => $dom->substituteEntities,
+        ];
+
+        if (!($filter & Caster::EXCLUDE_VERBOSE)) {
+            $formatOutput = $dom->formatOutput;
+            $dom->formatOutput = true;
+            $a += [Caster::PREFIX_VIRTUAL.'xml' => $dom->saveXML()];
+            $dom->formatOutput = $formatOutput;
+        }
+
+        return $a;
+    }
+
+    public static function castCharacterData(\DOMCharacterData $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'data' => $dom->data,
+            'length' => $dom->length,
+        ];
+
+        return $a;
+    }
+
+    public static function castAttr(\DOMAttr $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'name' => $dom->name,
+            'specified' => $dom->specified,
+            'value' => $dom->value,
+            'ownerElement' => $dom->ownerElement,
+            'schemaTypeInfo' => $dom->schemaTypeInfo,
+        ];
+
+        return $a;
+    }
+
+    public static function castElement(\DOMElement $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'tagName' => $dom->tagName,
+            'schemaTypeInfo' => $dom->schemaTypeInfo,
+        ];
+
+        return $a;
+    }
+
+    public static function castText(\DOMText $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'wholeText' => $dom->wholeText,
+        ];
+
+        return $a;
+    }
+
+    public static function castTypeinfo(\DOMTypeinfo $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'typeName' => $dom->typeName,
+            'typeNamespace' => $dom->typeNamespace,
+        ];
+
+        return $a;
+    }
+
+    public static function castDomError(\DOMDomError $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'severity' => $dom->severity,
+            'message' => $dom->message,
+            'type' => $dom->type,
+            'relatedException' => $dom->relatedException,
+            'related_data' => $dom->related_data,
+            'location' => $dom->location,
+        ];
+
+        return $a;
+    }
+
+    public static function castLocator(\DOMLocator $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'lineNumber' => $dom->lineNumber,
+            'columnNumber' => $dom->columnNumber,
+            'offset' => $dom->offset,
+            'relatedNode' => $dom->relatedNode,
+            'uri' => $dom->uri ? new LinkStub($dom->uri, $dom->lineNumber) : $dom->uri,
+        ];
+
+        return $a;
+    }
+
+    public static function castDocumentType(\DOMDocumentType $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'name' => $dom->name,
+            'entities' => $dom->entities,
+            'notations' => $dom->notations,
+            'publicId' => $dom->publicId,
+            'systemId' => $dom->systemId,
+            'internalSubset' => $dom->internalSubset,
+        ];
+
+        return $a;
+    }
+
+    public static function castNotation(\DOMNotation $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'publicId' => $dom->publicId,
+            'systemId' => $dom->systemId,
+        ];
+
+        return $a;
+    }
+
+    public static function castEntity(\DOMEntity $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'publicId' => $dom->publicId,
+            'systemId' => $dom->systemId,
+            'notationName' => $dom->notationName,
+            'actualEncoding' => $dom->actualEncoding,
+            'encoding' => $dom->encoding,
+            'version' => $dom->version,
+        ];
+
+        return $a;
+    }
+
+    public static function castProcessingInstruction(\DOMProcessingInstruction $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'target' => $dom->target,
+            'data' => $dom->data,
+        ];
+
+        return $a;
+    }
+
+    public static function castXPath(\DOMXPath $dom, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            'document' => $dom->document,
+        ];
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/DateCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/DateCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..70f229a0d8b7d9d3eacf04ddc1608b6267ab08ed
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/DateCaster.php
@@ -0,0 +1,133 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts DateTimeInterface related classes to array representation.
+ *
+ * @author Dany Maillard <danymaillard93b@gmail.com>
+ */
+class DateCaster
+{
+    public static function castDateTime(\DateTimeInterface $d, array $a, Stub $stub, $isNested, $filter)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+        $location = $d->getTimezone()->getLocation();
+        $fromNow = (new \DateTime())->diff($d);
+
+        $title = $d->format('l, F j, Y')
+            ."\n".self::formatInterval($fromNow).' from now'
+            .($location ? ($d->format('I') ? "\nDST On" : "\nDST Off") : '')
+        ;
+
+        unset(
+            $a[Caster::PREFIX_DYNAMIC.'date'],
+            $a[Caster::PREFIX_DYNAMIC.'timezone'],
+            $a[Caster::PREFIX_DYNAMIC.'timezone_type']
+        );
+        $a[$prefix.'date'] = new ConstStub(self::formatDateTime($d, $location ? ' e (P)' : ' P'), $title);
+
+        $stub->class .= $d->format(' @U');
+
+        return $a;
+    }
+
+    public static function castInterval(\DateInterval $interval, array $a, Stub $stub, $isNested, $filter)
+    {
+        $now = new \DateTimeImmutable();
+        $numberOfSeconds = $now->add($interval)->getTimestamp() - $now->getTimestamp();
+        $title = number_format($numberOfSeconds, 0, '.', ' ').'s';
+
+        $i = [Caster::PREFIX_VIRTUAL.'interval' => new ConstStub(self::formatInterval($interval), $title)];
+
+        return $filter & Caster::EXCLUDE_VERBOSE ? $i : $i + $a;
+    }
+
+    private static function formatInterval(\DateInterval $i)
+    {
+        $format = '%R ';
+
+        if (0 === $i->y && 0 === $i->m && ($i->h >= 24 || $i->i >= 60 || $i->s >= 60)) {
+            $i = date_diff($d = new \DateTime(), date_add(clone $d, $i)); // recalculate carry over points
+            $format .= 0 < $i->days ? '%ad ' : '';
+        } else {
+            $format .= ($i->y ? '%yy ' : '').($i->m ? '%mm ' : '').($i->d ? '%dd ' : '');
+        }
+
+        if (\PHP_VERSION_ID >= 70100 && isset($i->f)) {
+            $format .= $i->h || $i->i || $i->s || $i->f ? '%H:%I:'.self::formatSeconds($i->s, substr($i->f, 2)) : '';
+        } else {
+            $format .= $i->h || $i->i || $i->s ? '%H:%I:%S' : '';
+        }
+
+        $format = '%R ' === $format ? '0s' : $format;
+
+        return $i->format(rtrim($format));
+    }
+
+    public static function castTimeZone(\DateTimeZone $timeZone, array $a, Stub $stub, $isNested, $filter)
+    {
+        $location = $timeZone->getLocation();
+        $formatted = (new \DateTime('now', $timeZone))->format($location ? 'e (P)' : 'P');
+        $title = $location && \extension_loaded('intl') ? \Locale::getDisplayRegion('-'.$location['country_code'], \Locale::getDefault()) : '';
+
+        $z = [Caster::PREFIX_VIRTUAL.'timezone' => new ConstStub($formatted, $title)];
+
+        return $filter & Caster::EXCLUDE_VERBOSE ? $z : $z + $a;
+    }
+
+    public static function castPeriod(\DatePeriod $p, array $a, Stub $stub, $isNested, $filter)
+    {
+        if (\defined('HHVM_VERSION_ID') || \PHP_VERSION_ID < 50620 || (\PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID < 70005)) { // see https://bugs.php.net/71635
+            return $a;
+        }
+
+        $dates = [];
+        if (\PHP_VERSION_ID >= 70107) { // see https://bugs.php.net/74639
+            foreach (clone $p as $i => $d) {
+                if (3 === $i) {
+                    $now = new \DateTimeImmutable();
+                    $dates[] = sprintf('%s more', ($end = $p->getEndDate())
+                        ? ceil(($end->format('U.u') - $d->format('U.u')) / ((int) $now->add($p->getDateInterval())->format('U.u') - (int) $now->format('U.u')))
+                        : $p->recurrences - $i
+                    );
+                    break;
+                }
+                $dates[] = sprintf('%s) %s', $i + 1, self::formatDateTime($d));
+            }
+        }
+
+        $period = sprintf(
+            'every %s, from %s (%s) %s',
+            self::formatInterval($p->getDateInterval()),
+            self::formatDateTime($p->getStartDate()),
+            $p->include_start_date ? 'included' : 'excluded',
+            ($end = $p->getEndDate()) ? 'to '.self::formatDateTime($end) : 'recurring '.$p->recurrences.' time/s'
+        );
+
+        $p = [Caster::PREFIX_VIRTUAL.'period' => new ConstStub($period, implode("\n", $dates))];
+
+        return $filter & Caster::EXCLUDE_VERBOSE ? $p : $p + $a;
+    }
+
+    private static function formatDateTime(\DateTimeInterface $d, $extra = '')
+    {
+        return $d->format('Y-m-d H:i:'.self::formatSeconds($d->format('s'), $d->format('u')).$extra);
+    }
+
+    private static function formatSeconds($s, $us)
+    {
+        return sprintf('%02d.%s', $s, 0 === ($len = \strlen($t = rtrim($us, '0'))) ? '0' : ($len <= 3 ? str_pad($t, 3, '0') : $us));
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/DoctrineCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/DoctrineCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..696b87816ea8e9df7ad514ee1310ed8468f30053
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/DoctrineCaster.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Doctrine\Common\Proxy\Proxy as CommonProxy;
+use Doctrine\ORM\PersistentCollection;
+use Doctrine\ORM\Proxy\Proxy as OrmProxy;
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts Doctrine related classes to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class DoctrineCaster
+{
+    public static function castCommonProxy(CommonProxy $proxy, array $a, Stub $stub, $isNested)
+    {
+        foreach (['__cloner__', '__initializer__'] as $k) {
+            if (\array_key_exists($k, $a)) {
+                unset($a[$k]);
+                ++$stub->cut;
+            }
+        }
+
+        return $a;
+    }
+
+    public static function castOrmProxy(OrmProxy $proxy, array $a, Stub $stub, $isNested)
+    {
+        foreach (['_entityPersister', '_identifier'] as $k) {
+            if (\array_key_exists($k = "\0Doctrine\\ORM\\Proxy\\Proxy\0".$k, $a)) {
+                unset($a[$k]);
+                ++$stub->cut;
+            }
+        }
+
+        return $a;
+    }
+
+    public static function castPersistentCollection(PersistentCollection $coll, array $a, Stub $stub, $isNested)
+    {
+        foreach (['snapshot', 'association', 'typeClass'] as $k) {
+            if (\array_key_exists($k = "\0Doctrine\\ORM\\PersistentCollection\0".$k, $a)) {
+                $a[$k] = new CutStub($a[$k]);
+            }
+        }
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/EnumStub.php b/civicrm/vendor/symfony/var-dumper/Caster/EnumStub.php
new file mode 100644
index 0000000000000000000000000000000000000000..3cee23eac202b1dc7cad7e6ca3fb629110741e9d
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/EnumStub.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Represents an enumeration of values.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class EnumStub extends Stub
+{
+    public $dumpKeys = true;
+
+    public function __construct(array $values, $dumpKeys = true)
+    {
+        $this->value = $values;
+        $this->dumpKeys = $dumpKeys;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/ExceptionCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/ExceptionCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..e0acbe39dfe9bf6f7c992d3b553755b53303479b
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/ExceptionCaster.php
@@ -0,0 +1,349 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\Debug\Exception\SilencedErrorContext;
+use Symfony\Component\VarDumper\Cloner\Stub;
+use Symfony\Component\VarDumper\Exception\ThrowingCasterException;
+
+/**
+ * Casts common Exception classes to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ExceptionCaster
+{
+    public static $srcContext = 1;
+    public static $traceArgs = true;
+    public static $errorTypes = [
+        E_DEPRECATED => 'E_DEPRECATED',
+        E_USER_DEPRECATED => 'E_USER_DEPRECATED',
+        E_RECOVERABLE_ERROR => 'E_RECOVERABLE_ERROR',
+        E_ERROR => 'E_ERROR',
+        E_WARNING => 'E_WARNING',
+        E_PARSE => 'E_PARSE',
+        E_NOTICE => 'E_NOTICE',
+        E_CORE_ERROR => 'E_CORE_ERROR',
+        E_CORE_WARNING => 'E_CORE_WARNING',
+        E_COMPILE_ERROR => 'E_COMPILE_ERROR',
+        E_COMPILE_WARNING => 'E_COMPILE_WARNING',
+        E_USER_ERROR => 'E_USER_ERROR',
+        E_USER_WARNING => 'E_USER_WARNING',
+        E_USER_NOTICE => 'E_USER_NOTICE',
+        E_STRICT => 'E_STRICT',
+    ];
+
+    private static $framesCache = [];
+
+    public static function castError(\Error $e, array $a, Stub $stub, $isNested, $filter = 0)
+    {
+        return self::filterExceptionArray($stub->class, $a, "\0Error\0", $filter);
+    }
+
+    public static function castException(\Exception $e, array $a, Stub $stub, $isNested, $filter = 0)
+    {
+        return self::filterExceptionArray($stub->class, $a, "\0Exception\0", $filter);
+    }
+
+    public static function castErrorException(\ErrorException $e, array $a, Stub $stub, $isNested)
+    {
+        if (isset($a[$s = Caster::PREFIX_PROTECTED.'severity'], self::$errorTypes[$a[$s]])) {
+            $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]);
+        }
+
+        return $a;
+    }
+
+    public static function castThrowingCasterException(ThrowingCasterException $e, array $a, Stub $stub, $isNested)
+    {
+        $trace = Caster::PREFIX_VIRTUAL.'trace';
+        $prefix = Caster::PREFIX_PROTECTED;
+        $xPrefix = "\0Exception\0";
+
+        if (isset($a[$xPrefix.'previous'], $a[$trace]) && $a[$xPrefix.'previous'] instanceof \Exception) {
+            $b = (array) $a[$xPrefix.'previous'];
+            self::traceUnshift($b[$xPrefix.'trace'], \get_class($a[$xPrefix.'previous']), $b[$prefix.'file'], $b[$prefix.'line']);
+            $a[$trace] = new TraceStub($b[$xPrefix.'trace'], false, 0, -\count($a[$trace]->value));
+        }
+
+        unset($a[$xPrefix.'previous'], $a[$prefix.'code'], $a[$prefix.'file'], $a[$prefix.'line']);
+
+        return $a;
+    }
+
+    public static function castSilencedErrorContext(SilencedErrorContext $e, array $a, Stub $stub, $isNested)
+    {
+        $sPrefix = "\0".SilencedErrorContext::class."\0";
+
+        if (!isset($a[$s = $sPrefix.'severity'])) {
+            return $a;
+        }
+
+        if (isset(self::$errorTypes[$a[$s]])) {
+            $a[$s] = new ConstStub(self::$errorTypes[$a[$s]], $a[$s]);
+        }
+
+        $trace = [[
+            'file' => $a[$sPrefix.'file'],
+            'line' => $a[$sPrefix.'line'],
+        ]];
+
+        if (isset($a[$sPrefix.'trace'])) {
+            $trace = array_merge($trace, $a[$sPrefix.'trace']);
+        }
+
+        unset($a[$sPrefix.'file'], $a[$sPrefix.'line'], $a[$sPrefix.'trace']);
+        $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs);
+
+        return $a;
+    }
+
+    public static function castTraceStub(TraceStub $trace, array $a, Stub $stub, $isNested)
+    {
+        if (!$isNested) {
+            return $a;
+        }
+        $stub->class = '';
+        $stub->handle = 0;
+        $frames = $trace->value;
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        $a = [];
+        $j = \count($frames);
+        if (0 > $i = $trace->sliceOffset) {
+            $i = max(0, $j + $i);
+        }
+        if (!isset($trace->value[$i])) {
+            return [];
+        }
+        $lastCall = isset($frames[$i]['function']) ? (isset($frames[$i]['class']) ? $frames[0]['class'].$frames[$i]['type'] : '').$frames[$i]['function'].'()' : '';
+        $frames[] = ['function' => ''];
+        $collapse = false;
+
+        for ($j += $trace->numberingOffset - $i++; isset($frames[$i]); ++$i, --$j) {
+            $f = $frames[$i];
+            $call = isset($f['function']) ? (isset($f['class']) ? $f['class'].$f['type'] : '').$f['function'] : '???';
+
+            $frame = new FrameStub(
+                [
+                    'object' => isset($f['object']) ? $f['object'] : null,
+                    'class' => isset($f['class']) ? $f['class'] : null,
+                    'type' => isset($f['type']) ? $f['type'] : null,
+                    'function' => isset($f['function']) ? $f['function'] : null,
+                ] + $frames[$i - 1],
+                false,
+                true
+            );
+            $f = self::castFrameStub($frame, [], $frame, true);
+            if (isset($f[$prefix.'src'])) {
+                foreach ($f[$prefix.'src']->value as $label => $frame) {
+                    if (0 === strpos($label, "\0~collapse=0")) {
+                        if ($collapse) {
+                            $label = substr_replace($label, '1', 11, 1);
+                        } else {
+                            $collapse = true;
+                        }
+                    }
+                    $label = substr_replace($label, "title=Stack level $j.&", 2, 0);
+                }
+                $f = $frames[$i - 1];
+                if ($trace->keepArgs && !empty($f['args']) && $frame instanceof EnumStub) {
+                    $frame->value['arguments'] = new ArgsStub($f['args'], isset($f['function']) ? $f['function'] : null, isset($f['class']) ? $f['class'] : null);
+                }
+            } elseif ('???' !== $lastCall) {
+                $label = new ClassStub($lastCall);
+                if (isset($label->attr['ellipsis'])) {
+                    $label->attr['ellipsis'] += 2;
+                    $label = substr_replace($prefix, "ellipsis-type=class&ellipsis={$label->attr['ellipsis']}&ellipsis-tail=1&title=Stack level $j.", 2, 0).$label->value.'()';
+                } else {
+                    $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$label->value.'()';
+                }
+            } else {
+                $label = substr_replace($prefix, "title=Stack level $j.", 2, 0).$lastCall;
+            }
+            $a[substr_replace($label, sprintf('separator=%s&', $frame instanceof EnumStub ? ' ' : ':'), 2, 0)] = $frame;
+
+            $lastCall = $call;
+        }
+        if (null !== $trace->sliceLength) {
+            $a = \array_slice($a, 0, $trace->sliceLength, true);
+        }
+
+        return $a;
+    }
+
+    public static function castFrameStub(FrameStub $frame, array $a, Stub $stub, $isNested)
+    {
+        if (!$isNested) {
+            return $a;
+        }
+        $f = $frame->value;
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        if (isset($f['file'], $f['line'])) {
+            $cacheKey = $f;
+            unset($cacheKey['object'], $cacheKey['args']);
+            $cacheKey[] = self::$srcContext;
+            $cacheKey = implode('-', $cacheKey);
+
+            if (isset(self::$framesCache[$cacheKey])) {
+                $a[$prefix.'src'] = self::$framesCache[$cacheKey];
+            } else {
+                if (preg_match('/\((\d+)\)(?:\([\da-f]{32}\))? : (?:eval\(\)\'d code|runtime-created function)$/', $f['file'], $match)) {
+                    $f['file'] = substr($f['file'], 0, -\strlen($match[0]));
+                    $f['line'] = (int) $match[1];
+                }
+                $caller = isset($f['function']) ? sprintf('in %s() on line %d', (isset($f['class']) ? $f['class'].$f['type'] : '').$f['function'], $f['line']) : null;
+                $src = $f['line'];
+                $srcKey = $f['file'];
+                $ellipsis = new LinkStub($srcKey, 0);
+                $srcAttr = 'collapse='.(int) $ellipsis->inVendor;
+                $ellipsisTail = isset($ellipsis->attr['ellipsis-tail']) ? $ellipsis->attr['ellipsis-tail'] : 0;
+                $ellipsis = isset($ellipsis->attr['ellipsis']) ? $ellipsis->attr['ellipsis'] : 0;
+
+                if (file_exists($f['file']) && 0 <= self::$srcContext) {
+                    if (!empty($f['class']) && (is_subclass_of($f['class'], 'Twig\Template') || is_subclass_of($f['class'], 'Twig_Template')) && method_exists($f['class'], 'getDebugInfo')) {
+                        $template = isset($f['object']) ? $f['object'] : unserialize(sprintf('O:%d:"%s":0:{}', \strlen($f['class']), $f['class']));
+
+                        $ellipsis = 0;
+                        $templateSrc = method_exists($template, 'getSourceContext') ? $template->getSourceContext()->getCode() : (method_exists($template, 'getSource') ? $template->getSource() : '');
+                        $templateInfo = $template->getDebugInfo();
+                        if (isset($templateInfo[$f['line']])) {
+                            if (!method_exists($template, 'getSourceContext') || !file_exists($templatePath = $template->getSourceContext()->getPath())) {
+                                $templatePath = null;
+                            }
+                            if ($templateSrc) {
+                                $src = self::extractSource($templateSrc, $templateInfo[$f['line']], self::$srcContext, $caller, 'twig', $templatePath);
+                                $srcKey = ($templatePath ?: $template->getTemplateName()).':'.$templateInfo[$f['line']];
+                            }
+                        }
+                    }
+                    if ($srcKey == $f['file']) {
+                        $src = self::extractSource(file_get_contents($f['file']), $f['line'], self::$srcContext, $caller, 'php', $f['file']);
+                        $srcKey .= ':'.$f['line'];
+                        if ($ellipsis) {
+                            $ellipsis += 1 + \strlen($f['line']);
+                        }
+                    }
+                    $srcAttr .= '&separator= ';
+                } else {
+                    $srcAttr .= '&separator=:';
+                }
+                $srcAttr .= $ellipsis ? '&ellipsis-type=path&ellipsis='.$ellipsis.'&ellipsis-tail='.$ellipsisTail : '';
+                self::$framesCache[$cacheKey] = $a[$prefix.'src'] = new EnumStub(["\0~$srcAttr\0$srcKey" => $src]);
+            }
+        }
+
+        unset($a[$prefix.'args'], $a[$prefix.'line'], $a[$prefix.'file']);
+        if ($frame->inTraceStub) {
+            unset($a[$prefix.'class'], $a[$prefix.'type'], $a[$prefix.'function']);
+        }
+        foreach ($a as $k => $v) {
+            if (!$v) {
+                unset($a[$k]);
+            }
+        }
+        if ($frame->keepArgs && !empty($f['args'])) {
+            $a[$prefix.'arguments'] = new ArgsStub($f['args'], $f['function'], $f['class']);
+        }
+
+        return $a;
+    }
+
+    private static function filterExceptionArray($xClass, array $a, $xPrefix, $filter)
+    {
+        if (isset($a[$xPrefix.'trace'])) {
+            $trace = $a[$xPrefix.'trace'];
+            unset($a[$xPrefix.'trace']); // Ensures the trace is always last
+        } else {
+            $trace = [];
+        }
+
+        if (!($filter & Caster::EXCLUDE_VERBOSE) && $trace) {
+            if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) {
+                self::traceUnshift($trace, $xClass, $a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']);
+            }
+            $a[Caster::PREFIX_VIRTUAL.'trace'] = new TraceStub($trace, self::$traceArgs);
+        }
+        if (empty($a[$xPrefix.'previous'])) {
+            unset($a[$xPrefix.'previous']);
+        }
+        unset($a[$xPrefix.'string'], $a[Caster::PREFIX_DYNAMIC.'xdebug_message'], $a[Caster::PREFIX_DYNAMIC.'__destructorException']);
+
+        if (isset($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line'])) {
+            $a[Caster::PREFIX_PROTECTED.'file'] = new LinkStub($a[Caster::PREFIX_PROTECTED.'file'], $a[Caster::PREFIX_PROTECTED.'line']);
+        }
+
+        return $a;
+    }
+
+    private static function traceUnshift(&$trace, $class, $file, $line)
+    {
+        if (isset($trace[0]['file'], $trace[0]['line']) && $trace[0]['file'] === $file && $trace[0]['line'] === $line) {
+            return;
+        }
+        array_unshift($trace, [
+            'function' => $class ? 'new '.$class : null,
+            'file' => $file,
+            'line' => $line,
+        ]);
+    }
+
+    private static function extractSource($srcLines, $line, $srcContext, $title, $lang, $file = null)
+    {
+        $srcLines = explode("\n", $srcLines);
+        $src = [];
+
+        for ($i = $line - 1 - $srcContext; $i <= $line - 1 + $srcContext; ++$i) {
+            $src[] = (isset($srcLines[$i]) ? $srcLines[$i] : '')."\n";
+        }
+
+        $srcLines = [];
+        $ltrim = 0;
+        do {
+            $pad = null;
+            for ($i = $srcContext << 1; $i >= 0; --$i) {
+                if (isset($src[$i][$ltrim]) && "\r" !== ($c = $src[$i][$ltrim]) && "\n" !== $c) {
+                    if (null === $pad) {
+                        $pad = $c;
+                    }
+                    if ((' ' !== $c && "\t" !== $c) || $pad !== $c) {
+                        break;
+                    }
+                }
+            }
+            ++$ltrim;
+        } while (0 > $i && null !== $pad);
+
+        --$ltrim;
+
+        foreach ($src as $i => $c) {
+            if ($ltrim) {
+                $c = isset($c[$ltrim]) && "\r" !== $c[$ltrim] ? substr($c, $ltrim) : ltrim($c, " \t");
+            }
+            $c = substr($c, 0, -1);
+            if ($i !== $srcContext) {
+                $c = new ConstStub('default', $c);
+            } else {
+                $c = new ConstStub($c, $title);
+                if (null !== $file) {
+                    $c->attr['file'] = $file;
+                    $c->attr['line'] = $line;
+                }
+            }
+            $c->attr['lang'] = $lang;
+            $srcLines[sprintf("\0~separator=› &%d\0", $i + $line - $srcContext)] = $c;
+        }
+
+        return new EnumStub($srcLines);
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/FrameStub.php b/civicrm/vendor/symfony/var-dumper/Caster/FrameStub.php
new file mode 100644
index 0000000000000000000000000000000000000000..1e1194dc85b89041be0bfb5a57071a05a4ba204a
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/FrameStub.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+/**
+ * Represents a single backtrace frame as returned by debug_backtrace() or Exception->getTrace().
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class FrameStub extends EnumStub
+{
+    public $keepArgs;
+    public $inTraceStub;
+
+    public function __construct(array $frame, $keepArgs = true, $inTraceStub = false)
+    {
+        $this->value = $frame;
+        $this->keepArgs = $keepArgs;
+        $this->inTraceStub = $inTraceStub;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/LinkStub.php b/civicrm/vendor/symfony/var-dumper/Caster/LinkStub.php
new file mode 100644
index 0000000000000000000000000000000000000000..b589b502d4cef8a8a45a34c3b8fc165693ce1647
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/LinkStub.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+/**
+ * Represents a file or a URL.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class LinkStub extends ConstStub
+{
+    public $inVendor = false;
+
+    private static $vendorRoots;
+    private static $composerRoots;
+
+    public function __construct($label, $line = 0, $href = null)
+    {
+        $this->value = $label;
+
+        if (null === $href) {
+            $href = $label;
+        }
+        if (!\is_string($href)) {
+            return;
+        }
+        if (0 === strpos($href, 'file://')) {
+            if ($href === $label) {
+                $label = substr($label, 7);
+            }
+            $href = substr($href, 7);
+        } elseif (false !== strpos($href, '://')) {
+            $this->attr['href'] = $href;
+
+            return;
+        }
+        if (!file_exists($href)) {
+            return;
+        }
+        if ($line) {
+            $this->attr['line'] = $line;
+        }
+        if ($label !== $this->attr['file'] = realpath($href) ?: $href) {
+            return;
+        }
+        if ($composerRoot = $this->getComposerRoot($href, $this->inVendor)) {
+            $this->attr['ellipsis'] = \strlen($href) - \strlen($composerRoot) + 1;
+            $this->attr['ellipsis-type'] = 'path';
+            $this->attr['ellipsis-tail'] = 1 + ($this->inVendor ? 2 + \strlen(implode('', \array_slice(explode(\DIRECTORY_SEPARATOR, substr($href, 1 - $this->attr['ellipsis'])), 0, 2))) : 0);
+        } elseif (3 < \count($ellipsis = explode(\DIRECTORY_SEPARATOR, $href))) {
+            $this->attr['ellipsis'] = 2 + \strlen(implode('', \array_slice($ellipsis, -2)));
+            $this->attr['ellipsis-type'] = 'path';
+            $this->attr['ellipsis-tail'] = 1;
+        }
+    }
+
+    private function getComposerRoot($file, &$inVendor)
+    {
+        if (null === self::$vendorRoots) {
+            self::$vendorRoots = [];
+
+            foreach (get_declared_classes() as $class) {
+                if ('C' === $class[0] && 0 === strpos($class, 'ComposerAutoloaderInit')) {
+                    $r = new \ReflectionClass($class);
+                    $v = \dirname(\dirname($r->getFileName()));
+                    if (file_exists($v.'/composer/installed.json')) {
+                        self::$vendorRoots[] = $v.\DIRECTORY_SEPARATOR;
+                    }
+                }
+            }
+        }
+        $inVendor = false;
+
+        if (isset(self::$composerRoots[$dir = \dirname($file)])) {
+            return self::$composerRoots[$dir];
+        }
+
+        foreach (self::$vendorRoots as $root) {
+            if ($inVendor = 0 === strpos($file, $root)) {
+                return $root;
+            }
+        }
+
+        $parent = $dir;
+        while (!@file_exists($parent.'/composer.json')) {
+            if (!@file_exists($parent)) {
+                // open_basedir restriction in effect
+                break;
+            }
+            if ($parent === \dirname($parent)) {
+                return self::$composerRoots[$dir] = false;
+            }
+
+            $parent = \dirname($parent);
+        }
+
+        return self::$composerRoots[$dir] = $parent.\DIRECTORY_SEPARATOR;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/MongoCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/MongoCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b8fb338e5bff02461dcdbb563e8e1be3f0fc430
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/MongoCaster.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+@trigger_error('The '.__NAMESPACE__.'\MongoCaster class is deprecated since Symfony 3.4 and will be removed in 4.0.', E_USER_DEPRECATED);
+
+/**
+ * Casts classes from the MongoDb extension to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ *
+ * @deprecated since version 3.4, to be removed in 4.0.
+ */
+class MongoCaster
+{
+    public static function castCursor(\MongoCursorInterface $cursor, array $a, Stub $stub, $isNested)
+    {
+        if ($info = $cursor->info()) {
+            foreach ($info as $k => $v) {
+                $a[Caster::PREFIX_VIRTUAL.$k] = $v;
+            }
+        }
+        $a[Caster::PREFIX_VIRTUAL.'dead'] = $cursor->dead();
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/PdoCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/PdoCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..8af51829a93fbf0d127c8826d5f8312cccc87585
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/PdoCaster.php
@@ -0,0 +1,120 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts PDO related classes to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class PdoCaster
+{
+    private static $pdoAttributes = [
+        'CASE' => [
+            \PDO::CASE_LOWER => 'LOWER',
+            \PDO::CASE_NATURAL => 'NATURAL',
+            \PDO::CASE_UPPER => 'UPPER',
+        ],
+        'ERRMODE' => [
+            \PDO::ERRMODE_SILENT => 'SILENT',
+            \PDO::ERRMODE_WARNING => 'WARNING',
+            \PDO::ERRMODE_EXCEPTION => 'EXCEPTION',
+        ],
+        'TIMEOUT',
+        'PREFETCH',
+        'AUTOCOMMIT',
+        'PERSISTENT',
+        'DRIVER_NAME',
+        'SERVER_INFO',
+        'ORACLE_NULLS' => [
+            \PDO::NULL_NATURAL => 'NATURAL',
+            \PDO::NULL_EMPTY_STRING => 'EMPTY_STRING',
+            \PDO::NULL_TO_STRING => 'TO_STRING',
+        ],
+        'CLIENT_VERSION',
+        'SERVER_VERSION',
+        'STATEMENT_CLASS',
+        'EMULATE_PREPARES',
+        'CONNECTION_STATUS',
+        'STRINGIFY_FETCHES',
+        'DEFAULT_FETCH_MODE' => [
+            \PDO::FETCH_ASSOC => 'ASSOC',
+            \PDO::FETCH_BOTH => 'BOTH',
+            \PDO::FETCH_LAZY => 'LAZY',
+            \PDO::FETCH_NUM => 'NUM',
+            \PDO::FETCH_OBJ => 'OBJ',
+        ],
+    ];
+
+    public static function castPdo(\PDO $c, array $a, Stub $stub, $isNested)
+    {
+        $attr = [];
+        $errmode = $c->getAttribute(\PDO::ATTR_ERRMODE);
+        $c->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
+
+        foreach (self::$pdoAttributes as $k => $v) {
+            if (!isset($k[0])) {
+                $k = $v;
+                $v = [];
+            }
+
+            try {
+                $attr[$k] = 'ERRMODE' === $k ? $errmode : $c->getAttribute(\constant('PDO::ATTR_'.$k));
+                if ($v && isset($v[$attr[$k]])) {
+                    $attr[$k] = new ConstStub($v[$attr[$k]], $attr[$k]);
+                }
+            } catch (\Exception $e) {
+            }
+        }
+        if (isset($attr[$k = 'STATEMENT_CLASS'][1])) {
+            if ($attr[$k][1]) {
+                $attr[$k][1] = new ArgsStub($attr[$k][1], '__construct', $attr[$k][0]);
+            }
+            $attr[$k][0] = new ClassStub($attr[$k][0]);
+        }
+
+        $prefix = Caster::PREFIX_VIRTUAL;
+        $a += [
+            $prefix.'inTransaction' => method_exists($c, 'inTransaction'),
+            $prefix.'errorInfo' => $c->errorInfo(),
+            $prefix.'attributes' => new EnumStub($attr),
+        ];
+
+        if ($a[$prefix.'inTransaction']) {
+            $a[$prefix.'inTransaction'] = $c->inTransaction();
+        } else {
+            unset($a[$prefix.'inTransaction']);
+        }
+
+        if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) {
+            unset($a[$prefix.'errorInfo']);
+        }
+
+        $c->setAttribute(\PDO::ATTR_ERRMODE, $errmode);
+
+        return $a;
+    }
+
+    public static function castPdoStatement(\PDOStatement $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+        $a[$prefix.'errorInfo'] = $c->errorInfo();
+
+        if (!isset($a[$prefix.'errorInfo'][1], $a[$prefix.'errorInfo'][2])) {
+            unset($a[$prefix.'errorInfo']);
+        }
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/PgSqlCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/PgSqlCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..cd6bf5b5fe66604a0175429c22636623e6bc31dd
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/PgSqlCaster.php
@@ -0,0 +1,154 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts pqsql resources to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class PgSqlCaster
+{
+    private static $paramCodes = [
+        'server_encoding',
+        'client_encoding',
+        'is_superuser',
+        'session_authorization',
+        'DateStyle',
+        'TimeZone',
+        'IntervalStyle',
+        'integer_datetimes',
+        'application_name',
+        'standard_conforming_strings',
+    ];
+
+    private static $transactionStatus = [
+        PGSQL_TRANSACTION_IDLE => 'PGSQL_TRANSACTION_IDLE',
+        PGSQL_TRANSACTION_ACTIVE => 'PGSQL_TRANSACTION_ACTIVE',
+        PGSQL_TRANSACTION_INTRANS => 'PGSQL_TRANSACTION_INTRANS',
+        PGSQL_TRANSACTION_INERROR => 'PGSQL_TRANSACTION_INERROR',
+        PGSQL_TRANSACTION_UNKNOWN => 'PGSQL_TRANSACTION_UNKNOWN',
+    ];
+
+    private static $resultStatus = [
+        PGSQL_EMPTY_QUERY => 'PGSQL_EMPTY_QUERY',
+        PGSQL_COMMAND_OK => 'PGSQL_COMMAND_OK',
+        PGSQL_TUPLES_OK => 'PGSQL_TUPLES_OK',
+        PGSQL_COPY_OUT => 'PGSQL_COPY_OUT',
+        PGSQL_COPY_IN => 'PGSQL_COPY_IN',
+        PGSQL_BAD_RESPONSE => 'PGSQL_BAD_RESPONSE',
+        PGSQL_NONFATAL_ERROR => 'PGSQL_NONFATAL_ERROR',
+        PGSQL_FATAL_ERROR => 'PGSQL_FATAL_ERROR',
+    ];
+
+    private static $diagCodes = [
+        'severity' => PGSQL_DIAG_SEVERITY,
+        'sqlstate' => PGSQL_DIAG_SQLSTATE,
+        'message' => PGSQL_DIAG_MESSAGE_PRIMARY,
+        'detail' => PGSQL_DIAG_MESSAGE_DETAIL,
+        'hint' => PGSQL_DIAG_MESSAGE_HINT,
+        'statement position' => PGSQL_DIAG_STATEMENT_POSITION,
+        'internal position' => PGSQL_DIAG_INTERNAL_POSITION,
+        'internal query' => PGSQL_DIAG_INTERNAL_QUERY,
+        'context' => PGSQL_DIAG_CONTEXT,
+        'file' => PGSQL_DIAG_SOURCE_FILE,
+        'line' => PGSQL_DIAG_SOURCE_LINE,
+        'function' => PGSQL_DIAG_SOURCE_FUNCTION,
+    ];
+
+    public static function castLargeObject($lo, array $a, Stub $stub, $isNested)
+    {
+        $a['seek position'] = pg_lo_tell($lo);
+
+        return $a;
+    }
+
+    public static function castLink($link, array $a, Stub $stub, $isNested)
+    {
+        $a['status'] = pg_connection_status($link);
+        $a['status'] = new ConstStub(PGSQL_CONNECTION_OK === $a['status'] ? 'PGSQL_CONNECTION_OK' : 'PGSQL_CONNECTION_BAD', $a['status']);
+        $a['busy'] = pg_connection_busy($link);
+
+        $a['transaction'] = pg_transaction_status($link);
+        if (isset(self::$transactionStatus[$a['transaction']])) {
+            $a['transaction'] = new ConstStub(self::$transactionStatus[$a['transaction']], $a['transaction']);
+        }
+
+        $a['pid'] = pg_get_pid($link);
+        $a['last error'] = pg_last_error($link);
+        $a['last notice'] = pg_last_notice($link);
+        $a['host'] = pg_host($link);
+        $a['port'] = pg_port($link);
+        $a['dbname'] = pg_dbname($link);
+        $a['options'] = pg_options($link);
+        $a['version'] = pg_version($link);
+
+        foreach (self::$paramCodes as $v) {
+            if (false !== $s = pg_parameter_status($link, $v)) {
+                $a['param'][$v] = $s;
+            }
+        }
+
+        $a['param']['client_encoding'] = pg_client_encoding($link);
+        $a['param'] = new EnumStub($a['param']);
+
+        return $a;
+    }
+
+    public static function castResult($result, array $a, Stub $stub, $isNested)
+    {
+        $a['num rows'] = pg_num_rows($result);
+        $a['status'] = pg_result_status($result);
+        if (isset(self::$resultStatus[$a['status']])) {
+            $a['status'] = new ConstStub(self::$resultStatus[$a['status']], $a['status']);
+        }
+        $a['command-completion tag'] = pg_result_status($result, PGSQL_STATUS_STRING);
+
+        if (-1 === $a['num rows']) {
+            foreach (self::$diagCodes as $k => $v) {
+                $a['error'][$k] = pg_result_error_field($result, $v);
+            }
+        }
+
+        $a['affected rows'] = pg_affected_rows($result);
+        $a['last OID'] = pg_last_oid($result);
+
+        $fields = pg_num_fields($result);
+
+        for ($i = 0; $i < $fields; ++$i) {
+            $field = [
+                'name' => pg_field_name($result, $i),
+                'table' => sprintf('%s (OID: %s)', pg_field_table($result, $i), pg_field_table($result, $i, true)),
+                'type' => sprintf('%s (OID: %s)', pg_field_type($result, $i), pg_field_type_oid($result, $i)),
+                'nullable' => (bool) pg_field_is_null($result, $i),
+                'storage' => pg_field_size($result, $i).' bytes',
+                'display' => pg_field_prtlen($result, $i).' chars',
+            ];
+            if (' (OID: )' === $field['table']) {
+                $field['table'] = null;
+            }
+            if ('-1 bytes' === $field['storage']) {
+                $field['storage'] = 'variable size';
+            } elseif ('1 bytes' === $field['storage']) {
+                $field['storage'] = '1 byte';
+            }
+            if ('1 chars' === $field['display']) {
+                $field['display'] = '1 char';
+            }
+            $a['fields'][] = new EnumStub($field);
+        }
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/RedisCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/RedisCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..1e2fb3991629b68a5413186d704abab0180908ed
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/RedisCaster.php
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts Redis class from ext-redis to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class RedisCaster
+{
+    private static $serializer = [
+        \Redis::SERIALIZER_NONE => 'NONE',
+        \Redis::SERIALIZER_PHP => 'PHP',
+        2 => 'IGBINARY', // Optional Redis::SERIALIZER_IGBINARY
+    ];
+
+    public static function castRedis(\Redis $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        if (\defined('HHVM_VERSION_ID')) {
+            if (isset($a[Caster::PREFIX_PROTECTED.'serializer'])) {
+                $ser = $a[Caster::PREFIX_PROTECTED.'serializer'];
+                $a[Caster::PREFIX_PROTECTED.'serializer'] = isset(self::$serializer[$ser]) ? new ConstStub(self::$serializer[$ser], $ser) : $ser;
+            }
+
+            return $a;
+        }
+
+        if (!$connected = $c->isConnected()) {
+            return $a + [
+                $prefix.'isConnected' => $connected,
+            ];
+        }
+
+        $ser = $c->getOption(\Redis::OPT_SERIALIZER);
+        $retry = \defined('Redis::OPT_SCAN') ? $c->getOption(\Redis::OPT_SCAN) : 0;
+
+        return $a + [
+            $prefix.'isConnected' => $connected,
+            $prefix.'host' => $c->getHost(),
+            $prefix.'port' => $c->getPort(),
+            $prefix.'auth' => $c->getAuth(),
+            $prefix.'dbNum' => $c->getDbNum(),
+            $prefix.'timeout' => $c->getTimeout(),
+            $prefix.'persistentId' => $c->getPersistentID(),
+            $prefix.'options' => new EnumStub([
+                'READ_TIMEOUT' => $c->getOption(\Redis::OPT_READ_TIMEOUT),
+                'SERIALIZER' => isset(self::$serializer[$ser]) ? new ConstStub(self::$serializer[$ser], $ser) : $ser,
+                'PREFIX' => $c->getOption(\Redis::OPT_PREFIX),
+                'SCAN' => new ConstStub($retry ? 'RETRY' : 'NORETRY', $retry),
+            ]),
+        ];
+    }
+
+    public static function castRedisArray(\RedisArray $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        return $a + [
+            $prefix.'hosts' => $c->_hosts(),
+            $prefix.'function' => ClassStub::wrapCallable($c->_function()),
+        ];
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/ReflectionCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/ReflectionCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..31de78e961db099b9de5b27761a213e8762f4deb
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/ReflectionCaster.php
@@ -0,0 +1,345 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts Reflector related classes to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ReflectionCaster
+{
+    private static $extraMap = [
+        'docComment' => 'getDocComment',
+        'extension' => 'getExtensionName',
+        'isDisabled' => 'isDisabled',
+        'isDeprecated' => 'isDeprecated',
+        'isInternal' => 'isInternal',
+        'isUserDefined' => 'isUserDefined',
+        'isGenerator' => 'isGenerator',
+        'isVariadic' => 'isVariadic',
+    ];
+
+    public static function castClosure(\Closure $c, array $a, Stub $stub, $isNested, $filter = 0)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+        $c = new \ReflectionFunction($c);
+
+        $stub->class = 'Closure'; // HHVM generates unique class names for closures
+        $a = static::castFunctionAbstract($c, $a, $stub, $isNested, $filter);
+
+        if (false === strpos($c->name, '{closure}')) {
+            $stub->class = isset($a[$prefix.'class']) ? $a[$prefix.'class']->value.'::'.$c->name : $c->name;
+            unset($a[$prefix.'class']);
+        }
+
+        if (isset($a[$prefix.'parameters'])) {
+            foreach ($a[$prefix.'parameters']->value as &$v) {
+                $param = $v;
+                $v = new EnumStub([]);
+                foreach (static::castParameter($param, [], $stub, true) as $k => $param) {
+                    if ("\0" === $k[0]) {
+                        $v->value[substr($k, 3)] = $param;
+                    }
+                }
+                unset($v->value['position'], $v->value['isVariadic'], $v->value['byReference'], $v);
+            }
+        }
+
+        if (!($filter & Caster::EXCLUDE_VERBOSE) && $f = $c->getFileName()) {
+            $a[$prefix.'file'] = new LinkStub($f, $c->getStartLine());
+            $a[$prefix.'line'] = $c->getStartLine().' to '.$c->getEndLine();
+        }
+
+        $prefix = Caster::PREFIX_DYNAMIC;
+        unset($a['name'], $a[$prefix.'this'], $a[$prefix.'parameter'], $a[Caster::PREFIX_VIRTUAL.'extra']);
+
+        return $a;
+    }
+
+    public static function castGenerator(\Generator $c, array $a, Stub $stub, $isNested)
+    {
+        if (!class_exists('ReflectionGenerator', false)) {
+            return $a;
+        }
+
+        // Cannot create ReflectionGenerator based on a terminated Generator
+        try {
+            $reflectionGenerator = new \ReflectionGenerator($c);
+        } catch (\Exception $e) {
+            $a[Caster::PREFIX_VIRTUAL.'closed'] = true;
+
+            return $a;
+        }
+
+        return self::castReflectionGenerator($reflectionGenerator, $a, $stub, $isNested);
+    }
+
+    public static function castType(\ReflectionType $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        $a += [
+            $prefix.'name' => $c instanceof \ReflectionNamedType ? $c->getName() : (string) $c,
+            $prefix.'allowsNull' => $c->allowsNull(),
+            $prefix.'isBuiltin' => $c->isBuiltin(),
+        ];
+
+        return $a;
+    }
+
+    public static function castReflectionGenerator(\ReflectionGenerator $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        if ($c->getThis()) {
+            $a[$prefix.'this'] = new CutStub($c->getThis());
+        }
+        $function = $c->getFunction();
+        $frame = [
+            'class' => isset($function->class) ? $function->class : null,
+            'type' => isset($function->class) ? ($function->isStatic() ? '::' : '->') : null,
+            'function' => $function->name,
+            'file' => $c->getExecutingFile(),
+            'line' => $c->getExecutingLine(),
+        ];
+        if ($trace = $c->getTrace(DEBUG_BACKTRACE_IGNORE_ARGS)) {
+            $function = new \ReflectionGenerator($c->getExecutingGenerator());
+            array_unshift($trace, [
+                'function' => 'yield',
+                'file' => $function->getExecutingFile(),
+                'line' => $function->getExecutingLine() - 1,
+            ]);
+            $trace[] = $frame;
+            $a[$prefix.'trace'] = new TraceStub($trace, false, 0, -1, -1);
+        } else {
+            $function = new FrameStub($frame, false, true);
+            $function = ExceptionCaster::castFrameStub($function, [], $function, true);
+            $a[$prefix.'executing'] = new EnumStub([
+                "\0~separator= \0".$frame['class'].$frame['type'].$frame['function'].'()' => $function[$prefix.'src'],
+            ]);
+        }
+
+        $a[Caster::PREFIX_VIRTUAL.'closed'] = false;
+
+        return $a;
+    }
+
+    public static function castClass(\ReflectionClass $c, array $a, Stub $stub, $isNested, $filter = 0)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        if ($n = \Reflection::getModifierNames($c->getModifiers())) {
+            $a[$prefix.'modifiers'] = implode(' ', $n);
+        }
+
+        self::addMap($a, $c, [
+            'extends' => 'getParentClass',
+            'implements' => 'getInterfaceNames',
+            'constants' => 'getConstants',
+        ]);
+
+        foreach ($c->getProperties() as $n) {
+            $a[$prefix.'properties'][$n->name] = $n;
+        }
+
+        foreach ($c->getMethods() as $n) {
+            $a[$prefix.'methods'][$n->name] = $n;
+        }
+
+        if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) {
+            self::addExtra($a, $c);
+        }
+
+        return $a;
+    }
+
+    public static function castFunctionAbstract(\ReflectionFunctionAbstract $c, array $a, Stub $stub, $isNested, $filter = 0)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        self::addMap($a, $c, [
+            'returnsReference' => 'returnsReference',
+            'returnType' => 'getReturnType',
+            'class' => 'getClosureScopeClass',
+            'this' => 'getClosureThis',
+        ]);
+
+        if (isset($a[$prefix.'returnType'])) {
+            $v = $a[$prefix.'returnType'];
+            $v = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v;
+            $a[$prefix.'returnType'] = new ClassStub($a[$prefix.'returnType']->allowsNull() ? '?'.$v : $v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']);
+        }
+        if (isset($a[$prefix.'class'])) {
+            $a[$prefix.'class'] = new ClassStub($a[$prefix.'class']);
+        }
+        if (isset($a[$prefix.'this'])) {
+            $a[$prefix.'this'] = new CutStub($a[$prefix.'this']);
+        }
+
+        foreach ($c->getParameters() as $v) {
+            $k = '$'.$v->name;
+            if (method_exists($v, 'isVariadic') && $v->isVariadic()) {
+                $k = '...'.$k;
+            }
+            if ($v->isPassedByReference()) {
+                $k = '&'.$k;
+            }
+            $a[$prefix.'parameters'][$k] = $v;
+        }
+        if (isset($a[$prefix.'parameters'])) {
+            $a[$prefix.'parameters'] = new EnumStub($a[$prefix.'parameters']);
+        }
+
+        if ($v = $c->getStaticVariables()) {
+            foreach ($v as $k => &$v) {
+                if (\is_object($v)) {
+                    $a[$prefix.'use']['$'.$k] = new CutStub($v);
+                } else {
+                    $a[$prefix.'use']['$'.$k] = &$v;
+                }
+            }
+            unset($v);
+            $a[$prefix.'use'] = new EnumStub($a[$prefix.'use']);
+        }
+
+        if (!($filter & Caster::EXCLUDE_VERBOSE) && !$isNested) {
+            self::addExtra($a, $c);
+        }
+
+        // Added by HHVM
+        unset($a[Caster::PREFIX_DYNAMIC.'static']);
+
+        return $a;
+    }
+
+    public static function castMethod(\ReflectionMethod $c, array $a, Stub $stub, $isNested)
+    {
+        $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers()));
+
+        return $a;
+    }
+
+    public static function castParameter(\ReflectionParameter $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        // Added by HHVM
+        unset($a['info']);
+
+        self::addMap($a, $c, [
+            'position' => 'getPosition',
+            'isVariadic' => 'isVariadic',
+            'byReference' => 'isPassedByReference',
+            'allowsNull' => 'allowsNull',
+        ]);
+
+        if (method_exists($c, 'getType')) {
+            if ($v = $c->getType()) {
+                $a[$prefix.'typeHint'] = $v instanceof \ReflectionNamedType ? $v->getName() : (string) $v;
+            }
+        } elseif (preg_match('/^(?:[^ ]++ ){4}([a-zA-Z_\x7F-\xFF][^ ]++)/', $c, $v)) {
+            $a[$prefix.'typeHint'] = $v[1];
+        }
+
+        if (isset($a[$prefix.'typeHint'])) {
+            $v = $a[$prefix.'typeHint'];
+            $a[$prefix.'typeHint'] = new ClassStub($v, [class_exists($v, false) || interface_exists($v, false) || trait_exists($v, false) ? $v : '', '']);
+        } else {
+            unset($a[$prefix.'allowsNull']);
+        }
+
+        try {
+            $a[$prefix.'default'] = $v = $c->getDefaultValue();
+            if (method_exists($c, 'isDefaultValueConstant') && $c->isDefaultValueConstant()) {
+                $a[$prefix.'default'] = new ConstStub($c->getDefaultValueConstantName(), $v);
+            }
+            if (null === $v) {
+                unset($a[$prefix.'allowsNull']);
+            }
+        } catch (\ReflectionException $e) {
+            if (isset($a[$prefix.'typeHint']) && $c->allowsNull() && !class_exists('ReflectionNamedType', false)) {
+                $a[$prefix.'default'] = null;
+                unset($a[$prefix.'allowsNull']);
+            }
+        }
+
+        return $a;
+    }
+
+    public static function castProperty(\ReflectionProperty $c, array $a, Stub $stub, $isNested)
+    {
+        $a[Caster::PREFIX_VIRTUAL.'modifiers'] = implode(' ', \Reflection::getModifierNames($c->getModifiers()));
+        self::addExtra($a, $c);
+
+        return $a;
+    }
+
+    public static function castExtension(\ReflectionExtension $c, array $a, Stub $stub, $isNested)
+    {
+        self::addMap($a, $c, [
+            'version' => 'getVersion',
+            'dependencies' => 'getDependencies',
+            'iniEntries' => 'getIniEntries',
+            'isPersistent' => 'isPersistent',
+            'isTemporary' => 'isTemporary',
+            'constants' => 'getConstants',
+            'functions' => 'getFunctions',
+            'classes' => 'getClasses',
+        ]);
+
+        return $a;
+    }
+
+    public static function castZendExtension(\ReflectionZendExtension $c, array $a, Stub $stub, $isNested)
+    {
+        self::addMap($a, $c, [
+            'version' => 'getVersion',
+            'author' => 'getAuthor',
+            'copyright' => 'getCopyright',
+            'url' => 'getURL',
+        ]);
+
+        return $a;
+    }
+
+    private static function addExtra(&$a, \Reflector $c)
+    {
+        $x = isset($a[Caster::PREFIX_VIRTUAL.'extra']) ? $a[Caster::PREFIX_VIRTUAL.'extra']->value : [];
+
+        if (method_exists($c, 'getFileName') && $m = $c->getFileName()) {
+            $x['file'] = new LinkStub($m, $c->getStartLine());
+            $x['line'] = $c->getStartLine().' to '.$c->getEndLine();
+        }
+
+        self::addMap($x, $c, self::$extraMap, '');
+
+        if ($x) {
+            $a[Caster::PREFIX_VIRTUAL.'extra'] = new EnumStub($x);
+        }
+    }
+
+    private static function addMap(&$a, \Reflector $c, $map, $prefix = Caster::PREFIX_VIRTUAL)
+    {
+        foreach ($map as $k => $m) {
+            if (\PHP_VERSION_ID >= 80000 && 'isDisabled' === $k) {
+                continue;
+            }
+
+            if (method_exists($c, $m) && false !== ($m = $c->$m()) && null !== $m) {
+                $a[$prefix.$k] = $m instanceof \Reflector ? $m->name : $m;
+            }
+        }
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/ResourceCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/ResourceCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..eb11aee1f026412ef309c5362cfd90933e16ef42
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/ResourceCaster.php
@@ -0,0 +1,77 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts common resource types to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ResourceCaster
+{
+    /**
+     * @param \CurlHandle|resource $h
+     *
+     * @return array
+     */
+    public static function castCurl($h, array $a, Stub $stub, $isNested)
+    {
+        return curl_getinfo($h);
+    }
+
+    public static function castDba($dba, array $a, Stub $stub, $isNested)
+    {
+        $list = dba_list();
+        $a['file'] = $list[(int) $dba];
+
+        return $a;
+    }
+
+    public static function castProcess($process, array $a, Stub $stub, $isNested)
+    {
+        return proc_get_status($process);
+    }
+
+    public static function castStream($stream, array $a, Stub $stub, $isNested)
+    {
+        $a = stream_get_meta_data($stream) + static::castStreamContext($stream, $a, $stub, $isNested);
+        if (isset($a['uri'])) {
+            $a['uri'] = new LinkStub($a['uri']);
+        }
+
+        return $a;
+    }
+
+    public static function castStreamContext($stream, array $a, Stub $stub, $isNested)
+    {
+        return @stream_context_get_params($stream) ?: $a;
+    }
+
+    public static function castGd($gd, array $a, Stub $stub, $isNested)
+    {
+        $a['size'] = imagesx($gd).'x'.imagesy($gd);
+        $a['trueColor'] = imageistruecolor($gd);
+
+        return $a;
+    }
+
+    public static function castMysqlLink($h, array $a, Stub $stub, $isNested)
+    {
+        $a['host'] = mysql_get_host_info($h);
+        $a['protocol'] = mysql_get_proto_info($h);
+        $a['server'] = mysql_get_server_info($h);
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/SplCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/SplCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..53df3de2392e3211eafc10b6405c0dc2630efaae
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/SplCaster.php
@@ -0,0 +1,214 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts SPL related classes to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class SplCaster
+{
+    private static $splFileObjectFlags = [
+        \SplFileObject::DROP_NEW_LINE => 'DROP_NEW_LINE',
+        \SplFileObject::READ_AHEAD => 'READ_AHEAD',
+        \SplFileObject::SKIP_EMPTY => 'SKIP_EMPTY',
+        \SplFileObject::READ_CSV => 'READ_CSV',
+    ];
+
+    public static function castArrayObject(\ArrayObject $c, array $a, Stub $stub, $isNested)
+    {
+        return self::castSplArray($c, $a, $stub, $isNested);
+    }
+
+    public static function castArrayIterator(\ArrayIterator $c, array $a, Stub $stub, $isNested)
+    {
+        return self::castSplArray($c, $a, $stub, $isNested);
+    }
+
+    public static function castHeap(\Iterator $c, array $a, Stub $stub, $isNested)
+    {
+        $a += [
+            Caster::PREFIX_VIRTUAL.'heap' => iterator_to_array(clone $c),
+        ];
+
+        return $a;
+    }
+
+    public static function castDoublyLinkedList(\SplDoublyLinkedList $c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+        $mode = $c->getIteratorMode();
+        $c->setIteratorMode(\SplDoublyLinkedList::IT_MODE_KEEP | $mode & ~\SplDoublyLinkedList::IT_MODE_DELETE);
+
+        $a += [
+            $prefix.'mode' => new ConstStub((($mode & \SplDoublyLinkedList::IT_MODE_LIFO) ? 'IT_MODE_LIFO' : 'IT_MODE_FIFO').' | '.(($mode & \SplDoublyLinkedList::IT_MODE_DELETE) ? 'IT_MODE_DELETE' : 'IT_MODE_KEEP'), $mode),
+            $prefix.'dllist' => iterator_to_array($c),
+        ];
+        $c->setIteratorMode($mode);
+
+        return $a;
+    }
+
+    public static function castFileInfo(\SplFileInfo $c, array $a, Stub $stub, $isNested)
+    {
+        static $map = [
+            'path' => 'getPath',
+            'filename' => 'getFilename',
+            'basename' => 'getBasename',
+            'pathname' => 'getPathname',
+            'extension' => 'getExtension',
+            'realPath' => 'getRealPath',
+            'aTime' => 'getATime',
+            'mTime' => 'getMTime',
+            'cTime' => 'getCTime',
+            'inode' => 'getInode',
+            'size' => 'getSize',
+            'perms' => 'getPerms',
+            'owner' => 'getOwner',
+            'group' => 'getGroup',
+            'type' => 'getType',
+            'writable' => 'isWritable',
+            'readable' => 'isReadable',
+            'executable' => 'isExecutable',
+            'file' => 'isFile',
+            'dir' => 'isDir',
+            'link' => 'isLink',
+            'linkTarget' => 'getLinkTarget',
+        ];
+
+        $prefix = Caster::PREFIX_VIRTUAL;
+        unset($a["\0SplFileInfo\0fileName"]);
+        unset($a["\0SplFileInfo\0pathName"]);
+
+        if (false === $c->getPathname()) {
+            $a[$prefix.'âš '] = 'The parent constructor was not called: the object is in an invalid state';
+
+            return $a;
+        }
+
+        foreach ($map as $key => $accessor) {
+            try {
+                $a[$prefix.$key] = $c->$accessor();
+            } catch (\Exception $e) {
+            }
+        }
+
+        if (isset($a[$prefix.'realPath'])) {
+            $a[$prefix.'realPath'] = new LinkStub($a[$prefix.'realPath']);
+        }
+
+        if (isset($a[$prefix.'perms'])) {
+            $a[$prefix.'perms'] = new ConstStub(sprintf('0%o', $a[$prefix.'perms']), $a[$prefix.'perms']);
+        }
+
+        static $mapDate = ['aTime', 'mTime', 'cTime'];
+        foreach ($mapDate as $key) {
+            if (isset($a[$prefix.$key])) {
+                $a[$prefix.$key] = new ConstStub(date('Y-m-d H:i:s', $a[$prefix.$key]), $a[$prefix.$key]);
+            }
+        }
+
+        return $a;
+    }
+
+    public static function castFileObject(\SplFileObject $c, array $a, Stub $stub, $isNested)
+    {
+        static $map = [
+            'csvControl' => 'getCsvControl',
+            'flags' => 'getFlags',
+            'maxLineLen' => 'getMaxLineLen',
+            'fstat' => 'fstat',
+            'eof' => 'eof',
+            'key' => 'key',
+        ];
+
+        $prefix = Caster::PREFIX_VIRTUAL;
+
+        foreach ($map as $key => $accessor) {
+            try {
+                $a[$prefix.$key] = $c->$accessor();
+            } catch (\Exception $e) {
+            }
+        }
+
+        if (isset($a[$prefix.'flags'])) {
+            $flagsArray = [];
+            foreach (self::$splFileObjectFlags as $value => $name) {
+                if ($a[$prefix.'flags'] & $value) {
+                    $flagsArray[] = $name;
+                }
+            }
+            $a[$prefix.'flags'] = new ConstStub(implode('|', $flagsArray), $a[$prefix.'flags']);
+        }
+
+        if (isset($a[$prefix.'fstat'])) {
+            $a[$prefix.'fstat'] = new CutArrayStub($a[$prefix.'fstat'], ['dev', 'ino', 'nlink', 'rdev', 'blksize', 'blocks']);
+        }
+
+        return $a;
+    }
+
+    public static function castObjectStorage(\SplObjectStorage $c, array $a, Stub $stub, $isNested)
+    {
+        $storage = [];
+        unset($a[Caster::PREFIX_DYNAMIC."\0gcdata"]); // Don't hit https://bugs.php.net/65967
+        unset($a["\0SplObjectStorage\0storage"]);
+
+        $clone = clone $c;
+        foreach ($clone as $obj) {
+            $storage[] = [
+                'object' => $obj,
+                'info' => $clone->getInfo(),
+             ];
+        }
+
+        $a += [
+            Caster::PREFIX_VIRTUAL.'storage' => $storage,
+        ];
+
+        return $a;
+    }
+
+    public static function castOuterIterator(\OuterIterator $c, array $a, Stub $stub, $isNested)
+    {
+        $a[Caster::PREFIX_VIRTUAL.'innerIterator'] = $c->getInnerIterator();
+
+        return $a;
+    }
+
+    private static function castSplArray($c, array $a, Stub $stub, $isNested)
+    {
+        $prefix = Caster::PREFIX_VIRTUAL;
+        $flags = $c->getFlags();
+
+        if (!($flags & \ArrayObject::STD_PROP_LIST)) {
+            $c->setFlags(\ArrayObject::STD_PROP_LIST);
+            $a = Caster::castObject($c, \get_class($c), method_exists($c, '__debugInfo'), $stub->class);
+            $c->setFlags($flags);
+        }
+        if (\PHP_VERSION_ID < 70400) {
+            $a[$prefix.'storage'] = $c->getArrayCopy();
+        }
+        $a += [
+            $prefix.'flag::STD_PROP_LIST' => (bool) ($flags & \ArrayObject::STD_PROP_LIST),
+            $prefix.'flag::ARRAY_AS_PROPS' => (bool) ($flags & \ArrayObject::ARRAY_AS_PROPS),
+        ];
+        if ($c instanceof \ArrayObject) {
+            $a[$prefix.'iteratorClass'] = new ClassStub($c->getIteratorClass());
+        }
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/StubCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/StubCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..9927d42610c18ca0c64dd6a089dcf78f57446727
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/StubCaster.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts a caster's Stub.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class StubCaster
+{
+    public static function castStub(Stub $c, array $a, Stub $stub, $isNested)
+    {
+        if ($isNested) {
+            $stub->type = $c->type;
+            $stub->class = $c->class;
+            $stub->value = $c->value;
+            $stub->handle = $c->handle;
+            $stub->cut = $c->cut;
+            $stub->attr = $c->attr;
+
+            if (Stub::TYPE_REF === $c->type && !$c->class && \is_string($c->value) && !preg_match('//u', $c->value)) {
+                $stub->type = Stub::TYPE_STRING;
+                $stub->class = Stub::STRING_BINARY;
+            }
+
+            $a = [];
+        }
+
+        return $a;
+    }
+
+    public static function castCutArray(CutArrayStub $c, array $a, Stub $stub, $isNested)
+    {
+        return $isNested ? $c->preservedSubset : $a;
+    }
+
+    public static function cutInternals($obj, array $a, Stub $stub, $isNested)
+    {
+        if ($isNested) {
+            $stub->cut += \count($a);
+
+            return [];
+        }
+
+        return $a;
+    }
+
+    public static function castEnum(EnumStub $c, array $a, Stub $stub, $isNested)
+    {
+        if ($isNested) {
+            $stub->class = $c->dumpKeys ? '' : null;
+            $stub->handle = 0;
+            $stub->value = null;
+            $stub->cut = $c->cut;
+            $stub->attr = $c->attr;
+
+            $a = [];
+
+            if ($c->value) {
+                foreach (array_keys($c->value) as $k) {
+                    $keys[] = !isset($k[0]) || "\0" !== $k[0] ? Caster::PREFIX_VIRTUAL.$k : $k;
+                }
+                // Preserve references with array_combine()
+                $a = array_combine($keys, $c->value);
+            }
+        }
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/SymfonyCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/SymfonyCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae7134f55b2a1e2b9e133859662187e6d582ee6c
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/SymfonyCaster.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+class SymfonyCaster
+{
+    private static $requestGetters = [
+        'pathInfo' => 'getPathInfo',
+        'requestUri' => 'getRequestUri',
+        'baseUrl' => 'getBaseUrl',
+        'basePath' => 'getBasePath',
+        'method' => 'getMethod',
+        'format' => 'getRequestFormat',
+    ];
+
+    public static function castRequest(Request $request, array $a, Stub $stub, $isNested)
+    {
+        $clone = null;
+
+        foreach (self::$requestGetters as $prop => $getter) {
+            if (null === $a[Caster::PREFIX_PROTECTED.$prop]) {
+                if (null === $clone) {
+                    $clone = clone $request;
+                }
+                $a[Caster::PREFIX_VIRTUAL.$prop] = $clone->{$getter}();
+            }
+        }
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/TraceStub.php b/civicrm/vendor/symfony/var-dumper/Caster/TraceStub.php
new file mode 100644
index 0000000000000000000000000000000000000000..59548acaee61c8dbd93ee8492c4224ea36113186
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/TraceStub.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Represents a backtrace as returned by debug_backtrace() or Exception->getTrace().
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class TraceStub extends Stub
+{
+    public $keepArgs;
+    public $sliceOffset;
+    public $sliceLength;
+    public $numberingOffset;
+
+    public function __construct(array $trace, $keepArgs = true, $sliceOffset = 0, $sliceLength = null, $numberingOffset = 0)
+    {
+        $this->value = $trace;
+        $this->keepArgs = $keepArgs;
+        $this->sliceOffset = $sliceOffset;
+        $this->sliceLength = $sliceLength;
+        $this->numberingOffset = $numberingOffset;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ae9ec0ba19a03eda7bbc605b68cf0f780b6ea41
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/XmlReaderCaster.php
@@ -0,0 +1,77 @@
+<?php
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts XmlReader class to array representation.
+ *
+ * @author Baptiste Clavié <clavie.b@gmail.com>
+ */
+class XmlReaderCaster
+{
+    private static $nodeTypes = [
+        \XMLReader::NONE => 'NONE',
+        \XMLReader::ELEMENT => 'ELEMENT',
+        \XMLReader::ATTRIBUTE => 'ATTRIBUTE',
+        \XMLReader::TEXT => 'TEXT',
+        \XMLReader::CDATA => 'CDATA',
+        \XMLReader::ENTITY_REF => 'ENTITY_REF',
+        \XMLReader::ENTITY => 'ENTITY',
+        \XMLReader::PI => 'PI (Processing Instruction)',
+        \XMLReader::COMMENT => 'COMMENT',
+        \XMLReader::DOC => 'DOC',
+        \XMLReader::DOC_TYPE => 'DOC_TYPE',
+        \XMLReader::DOC_FRAGMENT => 'DOC_FRAGMENT',
+        \XMLReader::NOTATION => 'NOTATION',
+        \XMLReader::WHITESPACE => 'WHITESPACE',
+        \XMLReader::SIGNIFICANT_WHITESPACE => 'SIGNIFICANT_WHITESPACE',
+        \XMLReader::END_ELEMENT => 'END_ELEMENT',
+        \XMLReader::END_ENTITY => 'END_ENTITY',
+        \XMLReader::XML_DECLARATION => 'XML_DECLARATION',
+    ];
+
+    public static function castXmlReader(\XMLReader $reader, array $a, Stub $stub, $isNested)
+    {
+        $props = Caster::PREFIX_VIRTUAL.'parserProperties';
+        $info = [
+            'localName' => $reader->localName,
+            'prefix' => $reader->prefix,
+            'nodeType' => new ConstStub(self::$nodeTypes[$reader->nodeType], $reader->nodeType),
+            'depth' => $reader->depth,
+            'isDefault' => $reader->isDefault,
+            'isEmptyElement' => \XMLReader::NONE === $reader->nodeType ? null : $reader->isEmptyElement,
+            'xmlLang' => $reader->xmlLang,
+            'attributeCount' => $reader->attributeCount,
+            'value' => $reader->value,
+            'namespaceURI' => $reader->namespaceURI,
+            'baseURI' => $reader->baseURI ? new LinkStub($reader->baseURI) : $reader->baseURI,
+            $props => [
+                'LOADDTD' => $reader->getParserProperty(\XMLReader::LOADDTD),
+                'DEFAULTATTRS' => $reader->getParserProperty(\XMLReader::DEFAULTATTRS),
+                'VALIDATE' => $reader->getParserProperty(\XMLReader::VALIDATE),
+                'SUBST_ENTITIES' => $reader->getParserProperty(\XMLReader::SUBST_ENTITIES),
+            ],
+        ];
+
+        if ($info[$props] = Caster::filter($info[$props], Caster::EXCLUDE_EMPTY, [], $count)) {
+            $info[$props] = new EnumStub($info[$props]);
+            $info[$props]->cut = $count;
+        }
+
+        $info = Caster::filter($info, Caster::EXCLUDE_EMPTY, [], $count);
+        // +2 because hasValue and hasAttributes are always filtered
+        $stub->cut += $count + 2;
+
+        return $a + $info;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php b/civicrm/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php
new file mode 100644
index 0000000000000000000000000000000000000000..117138c7848c05856b6ad671c0a9b7884e30fb60
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Caster/XmlResourceCaster.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Caster;
+
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * Casts XML resources to array representation.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class XmlResourceCaster
+{
+    private static $xmlErrors = [
+        XML_ERROR_NONE => 'XML_ERROR_NONE',
+        XML_ERROR_NO_MEMORY => 'XML_ERROR_NO_MEMORY',
+        XML_ERROR_SYNTAX => 'XML_ERROR_SYNTAX',
+        XML_ERROR_NO_ELEMENTS => 'XML_ERROR_NO_ELEMENTS',
+        XML_ERROR_INVALID_TOKEN => 'XML_ERROR_INVALID_TOKEN',
+        XML_ERROR_UNCLOSED_TOKEN => 'XML_ERROR_UNCLOSED_TOKEN',
+        XML_ERROR_PARTIAL_CHAR => 'XML_ERROR_PARTIAL_CHAR',
+        XML_ERROR_TAG_MISMATCH => 'XML_ERROR_TAG_MISMATCH',
+        XML_ERROR_DUPLICATE_ATTRIBUTE => 'XML_ERROR_DUPLICATE_ATTRIBUTE',
+        XML_ERROR_JUNK_AFTER_DOC_ELEMENT => 'XML_ERROR_JUNK_AFTER_DOC_ELEMENT',
+        XML_ERROR_PARAM_ENTITY_REF => 'XML_ERROR_PARAM_ENTITY_REF',
+        XML_ERROR_UNDEFINED_ENTITY => 'XML_ERROR_UNDEFINED_ENTITY',
+        XML_ERROR_RECURSIVE_ENTITY_REF => 'XML_ERROR_RECURSIVE_ENTITY_REF',
+        XML_ERROR_ASYNC_ENTITY => 'XML_ERROR_ASYNC_ENTITY',
+        XML_ERROR_BAD_CHAR_REF => 'XML_ERROR_BAD_CHAR_REF',
+        XML_ERROR_BINARY_ENTITY_REF => 'XML_ERROR_BINARY_ENTITY_REF',
+        XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF => 'XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF',
+        XML_ERROR_MISPLACED_XML_PI => 'XML_ERROR_MISPLACED_XML_PI',
+        XML_ERROR_UNKNOWN_ENCODING => 'XML_ERROR_UNKNOWN_ENCODING',
+        XML_ERROR_INCORRECT_ENCODING => 'XML_ERROR_INCORRECT_ENCODING',
+        XML_ERROR_UNCLOSED_CDATA_SECTION => 'XML_ERROR_UNCLOSED_CDATA_SECTION',
+        XML_ERROR_EXTERNAL_ENTITY_HANDLING => 'XML_ERROR_EXTERNAL_ENTITY_HANDLING',
+    ];
+
+    public static function castXml($h, array $a, Stub $stub, $isNested)
+    {
+        $a['current_byte_index'] = xml_get_current_byte_index($h);
+        $a['current_column_number'] = xml_get_current_column_number($h);
+        $a['current_line_number'] = xml_get_current_line_number($h);
+        $a['error_code'] = xml_get_error_code($h);
+
+        if (isset(self::$xmlErrors[$a['error_code']])) {
+            $a['error_code'] = new ConstStub(self::$xmlErrors[$a['error_code']], $a['error_code']);
+        }
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Cloner/AbstractCloner.php b/civicrm/vendor/symfony/var-dumper/Cloner/AbstractCloner.php
new file mode 100644
index 0000000000000000000000000000000000000000..2e1af1d77625ae9e6694a5fae74427f10ae93378
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Cloner/AbstractCloner.php
@@ -0,0 +1,336 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Cloner;
+
+use Symfony\Component\VarDumper\Caster\Caster;
+use Symfony\Component\VarDumper\Exception\ThrowingCasterException;
+
+/**
+ * AbstractCloner implements a generic caster mechanism for objects and resources.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+abstract class AbstractCloner implements ClonerInterface
+{
+    public static $defaultCasters = [
+        '__PHP_Incomplete_Class' => ['Symfony\Component\VarDumper\Caster\Caster', 'castPhpIncompleteClass'],
+
+        'Symfony\Component\VarDumper\Caster\CutStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'],
+        'Symfony\Component\VarDumper\Caster\CutArrayStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castCutArray'],
+        'Symfony\Component\VarDumper\Caster\ConstStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castStub'],
+        'Symfony\Component\VarDumper\Caster\EnumStub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'castEnum'],
+
+        'Closure' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClosure'],
+        'Generator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castGenerator'],
+        'ReflectionType' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castType'],
+        'ReflectionGenerator' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castReflectionGenerator'],
+        'ReflectionClass' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castClass'],
+        'ReflectionFunctionAbstract' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castFunctionAbstract'],
+        'ReflectionMethod' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castMethod'],
+        'ReflectionParameter' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castParameter'],
+        'ReflectionProperty' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castProperty'],
+        'ReflectionExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castExtension'],
+        'ReflectionZendExtension' => ['Symfony\Component\VarDumper\Caster\ReflectionCaster', 'castZendExtension'],
+
+        'Doctrine\Common\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
+        'Doctrine\Common\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castCommonProxy'],
+        'Doctrine\ORM\Proxy\Proxy' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castOrmProxy'],
+        'Doctrine\ORM\PersistentCollection' => ['Symfony\Component\VarDumper\Caster\DoctrineCaster', 'castPersistentCollection'],
+        'Doctrine\Persistence\ObjectManager' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
+
+        'DOMException' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castException'],
+        'DOMStringList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
+        'DOMNameList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
+        'DOMImplementation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castImplementation'],
+        'DOMImplementationList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
+        'DOMNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNode'],
+        'DOMNameSpaceNode' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNameSpaceNode'],
+        'DOMDocument' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocument'],
+        'DOMNodeList' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
+        'DOMNamedNodeMap' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLength'],
+        'DOMCharacterData' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castCharacterData'],
+        'DOMAttr' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castAttr'],
+        'DOMElement' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castElement'],
+        'DOMText' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castText'],
+        'DOMTypeinfo' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castTypeinfo'],
+        'DOMDomError' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDomError'],
+        'DOMLocator' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castLocator'],
+        'DOMDocumentType' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castDocumentType'],
+        'DOMNotation' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castNotation'],
+        'DOMEntity' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castEntity'],
+        'DOMProcessingInstruction' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castProcessingInstruction'],
+        'DOMXPath' => ['Symfony\Component\VarDumper\Caster\DOMCaster', 'castXPath'],
+
+        'XmlReader' => ['Symfony\Component\VarDumper\Caster\XmlReaderCaster', 'castXmlReader'],
+
+        'ErrorException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castErrorException'],
+        'Exception' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castException'],
+        'Error' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castError'],
+        'Symfony\Component\DependencyInjection\ContainerInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
+        'Symfony\Component\HttpFoundation\Request' => ['Symfony\Component\VarDumper\Caster\SymfonyCaster', 'castRequest'],
+        'Symfony\Component\VarDumper\Exception\ThrowingCasterException' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castThrowingCasterException'],
+        'Symfony\Component\VarDumper\Caster\TraceStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castTraceStub'],
+        'Symfony\Component\VarDumper\Caster\FrameStub' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castFrameStub'],
+        'Symfony\Component\Debug\Exception\SilencedErrorContext' => ['Symfony\Component\VarDumper\Caster\ExceptionCaster', 'castSilencedErrorContext'],
+
+        'PHPUnit_Framework_MockObject_MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
+        'PHPUnit\Framework\MockObject\MockObject' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
+        'PHPUnit\Framework\MockObject\Stub' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
+        'Prophecy\Prophecy\ProphecySubjectInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
+        'Mockery\MockInterface' => ['Symfony\Component\VarDumper\Caster\StubCaster', 'cutInternals'],
+
+        'PDO' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdo'],
+        'PDOStatement' => ['Symfony\Component\VarDumper\Caster\PdoCaster', 'castPdoStatement'],
+
+        'AMQPConnection' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castConnection'],
+        'AMQPChannel' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castChannel'],
+        'AMQPQueue' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castQueue'],
+        'AMQPExchange' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castExchange'],
+        'AMQPEnvelope' => ['Symfony\Component\VarDumper\Caster\AmqpCaster', 'castEnvelope'],
+
+        'ArrayObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayObject'],
+        'ArrayIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castArrayIterator'],
+        'SplDoublyLinkedList' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castDoublyLinkedList'],
+        'SplFileInfo' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileInfo'],
+        'SplFileObject' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castFileObject'],
+        'SplHeap' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'],
+        'SplObjectStorage' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castObjectStorage'],
+        'SplPriorityQueue' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castHeap'],
+        'OuterIterator' => ['Symfony\Component\VarDumper\Caster\SplCaster', 'castOuterIterator'],
+
+        'MongoCursorInterface' => ['Symfony\Component\VarDumper\Caster\MongoCaster', 'castCursor'],
+
+        'Redis' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedis'],
+        'RedisArray' => ['Symfony\Component\VarDumper\Caster\RedisCaster', 'castRedisArray'],
+
+        'DateTimeInterface' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castDateTime'],
+        'DateInterval' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castInterval'],
+        'DateTimeZone' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castTimeZone'],
+        'DatePeriod' => ['Symfony\Component\VarDumper\Caster\DateCaster', 'castPeriod'],
+
+        'CurlHandle' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'],
+        ':curl' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castCurl'],
+
+        ':dba' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'],
+        ':dba persistent' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castDba'],
+        ':gd' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castGd'],
+        ':mysql link' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castMysqlLink'],
+        ':pgsql large object' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLargeObject'],
+        ':pgsql link' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'],
+        ':pgsql link persistent' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castLink'],
+        ':pgsql result' => ['Symfony\Component\VarDumper\Caster\PgSqlCaster', 'castResult'],
+        ':process' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castProcess'],
+        ':stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'],
+        ':persistent stream' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStream'],
+        ':stream-context' => ['Symfony\Component\VarDumper\Caster\ResourceCaster', 'castStreamContext'],
+        ':xml' => ['Symfony\Component\VarDumper\Caster\XmlResourceCaster', 'castXml'],
+    ];
+
+    protected $maxItems = 2500;
+    protected $maxString = -1;
+    protected $minDepth = 1;
+    protected $useExt;
+
+    private $casters = [];
+    private $prevErrorHandler;
+    private $classInfo = [];
+    private $filter = 0;
+
+    /**
+     * @param callable[]|null $casters A map of casters
+     *
+     * @see addCasters
+     */
+    public function __construct(array $casters = null)
+    {
+        if (null === $casters) {
+            $casters = static::$defaultCasters;
+        }
+        $this->addCasters($casters);
+        $this->useExt = \extension_loaded('symfony_debug');
+    }
+
+    /**
+     * Adds casters for resources and objects.
+     *
+     * Maps resources or objects types to a callback.
+     * Types are in the key, with a callable caster for value.
+     * Resource types are to be prefixed with a `:`,
+     * see e.g. static::$defaultCasters.
+     *
+     * @param callable[] $casters A map of casters
+     */
+    public function addCasters(array $casters)
+    {
+        foreach ($casters as $type => $callback) {
+            $this->casters[strtolower($type)][] = \is_string($callback) && false !== strpos($callback, '::') ? explode('::', $callback, 2) : $callback;
+        }
+    }
+
+    /**
+     * Sets the maximum number of items to clone past the minimum depth in nested structures.
+     *
+     * @param int $maxItems
+     */
+    public function setMaxItems($maxItems)
+    {
+        $this->maxItems = (int) $maxItems;
+    }
+
+    /**
+     * Sets the maximum cloned length for strings.
+     *
+     * @param int $maxString
+     */
+    public function setMaxString($maxString)
+    {
+        $this->maxString = (int) $maxString;
+    }
+
+    /**
+     * Sets the minimum tree depth where we are guaranteed to clone all the items.  After this
+     * depth is reached, only setMaxItems items will be cloned.
+     *
+     * @param int $minDepth
+     */
+    public function setMinDepth($minDepth)
+    {
+        $this->minDepth = (int) $minDepth;
+    }
+
+    /**
+     * Clones a PHP variable.
+     *
+     * @param mixed $var    Any PHP variable
+     * @param int   $filter A bit field of Caster::EXCLUDE_* constants
+     *
+     * @return Data The cloned variable represented by a Data object
+     */
+    public function cloneVar($var, $filter = 0)
+    {
+        $this->prevErrorHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) {
+            if (E_RECOVERABLE_ERROR === $type || E_USER_ERROR === $type) {
+                // Cloner never dies
+                throw new \ErrorException($msg, 0, $type, $file, $line);
+            }
+
+            if ($this->prevErrorHandler) {
+                return \call_user_func($this->prevErrorHandler, $type, $msg, $file, $line, $context);
+            }
+
+            return false;
+        });
+        $this->filter = $filter;
+
+        if ($gc = gc_enabled()) {
+            gc_disable();
+        }
+        try {
+            return new Data($this->doClone($var));
+        } finally {
+            if ($gc) {
+                gc_enable();
+            }
+            restore_error_handler();
+            $this->prevErrorHandler = null;
+        }
+    }
+
+    /**
+     * Effectively clones the PHP variable.
+     *
+     * @param mixed $var Any PHP variable
+     *
+     * @return array The cloned variable represented in an array
+     */
+    abstract protected function doClone($var);
+
+    /**
+     * Casts an object to an array representation.
+     *
+     * @param Stub $stub     The Stub for the casted object
+     * @param bool $isNested True if the object is nested in the dumped structure
+     *
+     * @return array The object casted as array
+     */
+    protected function castObject(Stub $stub, $isNested)
+    {
+        $obj = $stub->value;
+        $class = $stub->class;
+
+        if ((\PHP_VERSION_ID >= 80000 || (isset($class[15]) && "\0" === $class[15])) && false !== strpos($class, "@anonymous\0")) {
+            $stub->class = \PHP_VERSION_ID < 80000 ? (get_parent_class($class) ?: key(class_implements($class)) ?: 'class').'@anonymous' : get_debug_type($obj);
+        }
+        if (isset($this->classInfo[$class])) {
+            list($i, $parents, $hasDebugInfo) = $this->classInfo[$class];
+        } else {
+            $i = 2;
+            $parents = [strtolower($class)];
+            $hasDebugInfo = method_exists($class, '__debugInfo');
+
+            foreach (class_parents($class) as $p) {
+                $parents[] = strtolower($p);
+                ++$i;
+            }
+            foreach (class_implements($class) as $p) {
+                $parents[] = strtolower($p);
+                ++$i;
+            }
+            $parents[] = '*';
+
+            $this->classInfo[$class] = [$i, $parents, $hasDebugInfo];
+        }
+
+        $a = Caster::castObject($obj, $class, $hasDebugInfo, $stub->class);
+
+        try {
+            while ($i--) {
+                if (!empty($this->casters[$p = $parents[$i]])) {
+                    foreach ($this->casters[$p] as $callback) {
+                        $a = $callback($obj, $a, $stub, $isNested, $this->filter);
+                    }
+                }
+            }
+        } catch (\Exception $e) {
+            $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'âš ' => new ThrowingCasterException($e)] + $a;
+        }
+
+        return $a;
+    }
+
+    /**
+     * Casts a resource to an array representation.
+     *
+     * @param Stub $stub     The Stub for the casted resource
+     * @param bool $isNested True if the object is nested in the dumped structure
+     *
+     * @return array The resource casted as array
+     */
+    protected function castResource(Stub $stub, $isNested)
+    {
+        $a = [];
+        $res = $stub->value;
+        $type = $stub->class;
+
+        try {
+            if (!empty($this->casters[':'.$type])) {
+                foreach ($this->casters[':'.$type] as $callback) {
+                    $a = $callback($res, $a, $stub, $isNested, $this->filter);
+                }
+            }
+        } catch (\Exception $e) {
+            $a = [(Stub::TYPE_OBJECT === $stub->type ? Caster::PREFIX_VIRTUAL : '').'âš ' => new ThrowingCasterException($e)] + $a;
+        }
+
+        return $a;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Cloner/ClonerInterface.php b/civicrm/vendor/symfony/var-dumper/Cloner/ClonerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ed287a2ddf0da20615c4f2c6d3bdaf4a6873b98
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Cloner/ClonerInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Cloner;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface ClonerInterface
+{
+    /**
+     * Clones a PHP variable.
+     *
+     * @param mixed $var Any PHP variable
+     *
+     * @return Data The cloned variable represented by a Data object
+     */
+    public function cloneVar($var);
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Cloner/Cursor.php b/civicrm/vendor/symfony/var-dumper/Cloner/Cursor.php
new file mode 100644
index 0000000000000000000000000000000000000000..5b0542f6c20cefdad75c7a93f483bce546a85819
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Cloner/Cursor.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Cloner;
+
+/**
+ * Represents the current state of a dumper while dumping.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class Cursor
+{
+    const HASH_INDEXED = Stub::ARRAY_INDEXED;
+    const HASH_ASSOC = Stub::ARRAY_ASSOC;
+    const HASH_OBJECT = Stub::TYPE_OBJECT;
+    const HASH_RESOURCE = Stub::TYPE_RESOURCE;
+
+    public $depth = 0;
+    public $refIndex = 0;
+    public $softRefTo = 0;
+    public $softRefCount = 0;
+    public $softRefHandle = 0;
+    public $hardRefTo = 0;
+    public $hardRefCount = 0;
+    public $hardRefHandle = 0;
+    public $hashType;
+    public $hashKey;
+    public $hashKeyIsBinary;
+    public $hashIndex = 0;
+    public $hashLength = 0;
+    public $hashCut = 0;
+    public $stop = false;
+    public $attr = [];
+    public $skipChildren = false;
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Cloner/Data.php b/civicrm/vendor/symfony/var-dumper/Cloner/Data.php
new file mode 100644
index 0000000000000000000000000000000000000000..42742d852dd3c934d47ce18306814ab392c9bd91
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Cloner/Data.php
@@ -0,0 +1,441 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Cloner;
+
+use Symfony\Component\VarDumper\Caster\Caster;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class Data implements \ArrayAccess, \Countable, \IteratorAggregate
+{
+    private $data;
+    private $position = 0;
+    private $key = 0;
+    private $maxDepth = 20;
+    private $maxItemsPerDepth = -1;
+    private $useRefHandles = -1;
+
+    /**
+     * @param array $data An array as returned by ClonerInterface::cloneVar()
+     */
+    public function __construct(array $data)
+    {
+        $this->data = $data;
+    }
+
+    /**
+     * @return string|null The type of the value
+     */
+    public function getType()
+    {
+        $item = $this->data[$this->position][$this->key];
+
+        if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) {
+            $item = $item->value;
+        }
+        if (!$item instanceof Stub) {
+            return \gettype($item);
+        }
+        if (Stub::TYPE_STRING === $item->type) {
+            return 'string';
+        }
+        if (Stub::TYPE_ARRAY === $item->type) {
+            return 'array';
+        }
+        if (Stub::TYPE_OBJECT === $item->type) {
+            return $item->class;
+        }
+        if (Stub::TYPE_RESOURCE === $item->type) {
+            return $item->class.' resource';
+        }
+
+        return null;
+    }
+
+    /**
+     * @param array|bool $recursive Whether values should be resolved recursively or not
+     *
+     * @return string|int|float|bool|array|Data[]|null A native representation of the original value
+     */
+    public function getValue($recursive = false)
+    {
+        $item = $this->data[$this->position][$this->key];
+
+        if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) {
+            $item = $item->value;
+        }
+        if (!($item = $this->getStub($item)) instanceof Stub) {
+            return $item;
+        }
+        if (Stub::TYPE_STRING === $item->type) {
+            return $item->value;
+        }
+
+        $children = $item->position ? $this->data[$item->position] : [];
+
+        foreach ($children as $k => $v) {
+            if ($recursive && !($v = $this->getStub($v)) instanceof Stub) {
+                continue;
+            }
+            $children[$k] = clone $this;
+            $children[$k]->key = $k;
+            $children[$k]->position = $item->position;
+
+            if ($recursive) {
+                if (Stub::TYPE_REF === $v->type && ($v = $this->getStub($v->value)) instanceof Stub) {
+                    $recursive = (array) $recursive;
+                    if (isset($recursive[$v->position])) {
+                        continue;
+                    }
+                    $recursive[$v->position] = true;
+                }
+                $children[$k] = $children[$k]->getValue($recursive);
+            }
+        }
+
+        return $children;
+    }
+
+    public function count()
+    {
+        return \count($this->getValue());
+    }
+
+    public function getIterator()
+    {
+        if (!\is_array($value = $this->getValue())) {
+            throw new \LogicException(sprintf('"%s" object holds non-iterable type "%s".', self::class, \gettype($value)));
+        }
+
+        foreach ($value as $k => $v) {
+            yield $k => $v;
+        }
+    }
+
+    public function __get($key)
+    {
+        if (null !== $data = $this->seek($key)) {
+            $item = $this->getStub($data->data[$data->position][$data->key]);
+
+            return $item instanceof Stub || [] === $item ? $data : $item;
+        }
+
+        return null;
+    }
+
+    public function __isset($key)
+    {
+        return null !== $this->seek($key);
+    }
+
+    public function offsetExists($key)
+    {
+        return $this->__isset($key);
+    }
+
+    public function offsetGet($key)
+    {
+        return $this->__get($key);
+    }
+
+    public function offsetSet($key, $value)
+    {
+        throw new \BadMethodCallException(self::class.' objects are immutable.');
+    }
+
+    public function offsetUnset($key)
+    {
+        throw new \BadMethodCallException(self::class.' objects are immutable.');
+    }
+
+    public function __toString()
+    {
+        $value = $this->getValue();
+
+        if (!\is_array($value)) {
+            return (string) $value;
+        }
+
+        return sprintf('%s (count=%d)', $this->getType(), \count($value));
+    }
+
+    /**
+     * @return array The raw data structure
+     *
+     * @deprecated since version 3.3. Use array or object access instead.
+     */
+    public function getRawData()
+    {
+        @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the array or object access instead.', __METHOD__));
+
+        return $this->data;
+    }
+
+    /**
+     * Returns a depth limited clone of $this.
+     *
+     * @param int $maxDepth The max dumped depth level
+     *
+     * @return static
+     */
+    public function withMaxDepth($maxDepth)
+    {
+        $data = clone $this;
+        $data->maxDepth = (int) $maxDepth;
+
+        return $data;
+    }
+
+    /**
+     * Limits the number of elements per depth level.
+     *
+     * @param int $maxItemsPerDepth The max number of items dumped per depth level
+     *
+     * @return static
+     */
+    public function withMaxItemsPerDepth($maxItemsPerDepth)
+    {
+        $data = clone $this;
+        $data->maxItemsPerDepth = (int) $maxItemsPerDepth;
+
+        return $data;
+    }
+
+    /**
+     * Enables/disables objects' identifiers tracking.
+     *
+     * @param bool $useRefHandles False to hide global ref. handles
+     *
+     * @return static
+     */
+    public function withRefHandles($useRefHandles)
+    {
+        $data = clone $this;
+        $data->useRefHandles = $useRefHandles ? -1 : 0;
+
+        return $data;
+    }
+
+    /**
+     * Seeks to a specific key in nested data structures.
+     *
+     * @param string|int $key The key to seek to
+     *
+     * @return static|null Null if the key is not set
+     */
+    public function seek($key)
+    {
+        $item = $this->data[$this->position][$this->key];
+
+        if ($item instanceof Stub && Stub::TYPE_REF === $item->type && !$item->position) {
+            $item = $item->value;
+        }
+        if (!($item = $this->getStub($item)) instanceof Stub || !$item->position) {
+            return null;
+        }
+        $keys = [$key];
+
+        switch ($item->type) {
+            case Stub::TYPE_OBJECT:
+                $keys[] = Caster::PREFIX_DYNAMIC.$key;
+                $keys[] = Caster::PREFIX_PROTECTED.$key;
+                $keys[] = Caster::PREFIX_VIRTUAL.$key;
+                $keys[] = "\0$item->class\0$key";
+                // no break
+            case Stub::TYPE_ARRAY:
+            case Stub::TYPE_RESOURCE:
+                break;
+            default:
+                return null;
+        }
+
+        $data = null;
+        $children = $this->data[$item->position];
+
+        foreach ($keys as $key) {
+            if (isset($children[$key]) || \array_key_exists($key, $children)) {
+                $data = clone $this;
+                $data->key = $key;
+                $data->position = $item->position;
+                break;
+            }
+        }
+
+        return $data;
+    }
+
+    /**
+     * Dumps data with a DumperInterface dumper.
+     */
+    public function dump(DumperInterface $dumper)
+    {
+        $refs = [0];
+        $this->dumpItem($dumper, new Cursor(), $refs, $this->data[$this->position][$this->key]);
+    }
+
+    /**
+     * Depth-first dumping of items.
+     *
+     * @param DumperInterface $dumper The dumper being used for dumping
+     * @param Cursor          $cursor A cursor used for tracking dumper state position
+     * @param array           &$refs  A map of all references discovered while dumping
+     * @param mixed           $item   A Stub object or the original value being dumped
+     */
+    private function dumpItem($dumper, $cursor, &$refs, $item)
+    {
+        $cursor->refIndex = 0;
+        $cursor->softRefTo = $cursor->softRefHandle = $cursor->softRefCount = 0;
+        $cursor->hardRefTo = $cursor->hardRefHandle = $cursor->hardRefCount = 0;
+        $firstSeen = true;
+
+        if (!$item instanceof Stub) {
+            $cursor->attr = [];
+            $type = \gettype($item);
+            if ($item && 'array' === $type) {
+                $item = $this->getStub($item);
+            }
+        } elseif (Stub::TYPE_REF === $item->type) {
+            if ($item->handle) {
+                if (!isset($refs[$r = $item->handle - (PHP_INT_MAX >> 1)])) {
+                    $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0];
+                } else {
+                    $firstSeen = false;
+                }
+                $cursor->hardRefTo = $refs[$r];
+                $cursor->hardRefHandle = $this->useRefHandles & $item->handle;
+                $cursor->hardRefCount = $item->refCount;
+            }
+            $cursor->attr = $item->attr;
+            $type = $item->class ?: \gettype($item->value);
+            $item = $this->getStub($item->value);
+        }
+        if ($item instanceof Stub) {
+            if ($item->refCount) {
+                if (!isset($refs[$r = $item->handle])) {
+                    $cursor->refIndex = $refs[$r] = $cursor->refIndex ?: ++$refs[0];
+                } else {
+                    $firstSeen = false;
+                }
+                $cursor->softRefTo = $refs[$r];
+            }
+            $cursor->softRefHandle = $this->useRefHandles & $item->handle;
+            $cursor->softRefCount = $item->refCount;
+            $cursor->attr = $item->attr;
+            $cut = $item->cut;
+
+            if ($item->position && $firstSeen) {
+                $children = $this->data[$item->position];
+
+                if ($cursor->stop) {
+                    if ($cut >= 0) {
+                        $cut += \count($children);
+                    }
+                    $children = [];
+                }
+            } else {
+                $children = [];
+            }
+            switch ($item->type) {
+                case Stub::TYPE_STRING:
+                    $dumper->dumpString($cursor, $item->value, Stub::STRING_BINARY === $item->class, $cut);
+                    break;
+
+                case Stub::TYPE_ARRAY:
+                    $item = clone $item;
+                    $item->type = $item->class;
+                    $item->class = $item->value;
+                    // no break
+                case Stub::TYPE_OBJECT:
+                case Stub::TYPE_RESOURCE:
+                    $withChildren = $children && $cursor->depth !== $this->maxDepth && $this->maxItemsPerDepth;
+                    $dumper->enterHash($cursor, $item->type, $item->class, $withChildren);
+                    if ($withChildren) {
+                        if ($cursor->skipChildren) {
+                            $withChildren = false;
+                            $cut = -1;
+                        } else {
+                            $cut = $this->dumpChildren($dumper, $cursor, $refs, $children, $cut, $item->type, null !== $item->class);
+                        }
+                    } elseif ($children && 0 <= $cut) {
+                        $cut += \count($children);
+                    }
+                    $cursor->skipChildren = false;
+                    $dumper->leaveHash($cursor, $item->type, $item->class, $withChildren, $cut);
+                    break;
+
+                default:
+                    throw new \RuntimeException(sprintf('Unexpected Stub type: "%s".', $item->type));
+            }
+        } elseif ('array' === $type) {
+            $dumper->enterHash($cursor, Cursor::HASH_INDEXED, 0, false);
+            $dumper->leaveHash($cursor, Cursor::HASH_INDEXED, 0, false, 0);
+        } elseif ('string' === $type) {
+            $dumper->dumpString($cursor, $item, false, 0);
+        } else {
+            $dumper->dumpScalar($cursor, $type, $item);
+        }
+    }
+
+    /**
+     * Dumps children of hash structures.
+     *
+     * @param DumperInterface $dumper
+     * @param Cursor          $parentCursor The cursor of the parent hash
+     * @param array           &$refs        A map of all references discovered while dumping
+     * @param array           $children     The children to dump
+     * @param int             $hashCut      The number of items removed from the original hash
+     * @param string          $hashType     A Cursor::HASH_* const
+     * @param bool            $dumpKeys     Whether keys should be dumped or not
+     *
+     * @return int The final number of removed items
+     */
+    private function dumpChildren($dumper, $parentCursor, &$refs, $children, $hashCut, $hashType, $dumpKeys)
+    {
+        $cursor = clone $parentCursor;
+        ++$cursor->depth;
+        $cursor->hashType = $hashType;
+        $cursor->hashIndex = 0;
+        $cursor->hashLength = \count($children);
+        $cursor->hashCut = $hashCut;
+        foreach ($children as $key => $child) {
+            $cursor->hashKeyIsBinary = isset($key[0]) && !preg_match('//u', $key);
+            $cursor->hashKey = $dumpKeys ? $key : null;
+            $this->dumpItem($dumper, $cursor, $refs, $child);
+            if (++$cursor->hashIndex === $this->maxItemsPerDepth || $cursor->stop) {
+                $parentCursor->stop = true;
+
+                return $hashCut >= 0 ? $hashCut + $cursor->hashLength - $cursor->hashIndex : $hashCut;
+            }
+        }
+
+        return $hashCut;
+    }
+
+    private function getStub($item)
+    {
+        if (!$item || !\is_array($item)) {
+            return $item;
+        }
+
+        $stub = new Stub();
+        $stub->type = Stub::TYPE_ARRAY;
+        foreach ($item as $stub->class => $stub->position) {
+        }
+        if (isset($item[0])) {
+            $stub->cut = $item[0];
+        }
+        $stub->value = $stub->cut + ($stub->position ? \count($this->data[$stub->position]) : 0);
+
+        return $stub;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Cloner/DumperInterface.php b/civicrm/vendor/symfony/var-dumper/Cloner/DumperInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..912bb5213975936ee2cdcd258f4b3886ae54098b
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Cloner/DumperInterface.php
@@ -0,0 +1,60 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Cloner;
+
+/**
+ * DumperInterface used by Data objects.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface DumperInterface
+{
+    /**
+     * Dumps a scalar value.
+     *
+     * @param Cursor                $cursor The Cursor position in the dump
+     * @param string                $type   The PHP type of the value being dumped
+     * @param string|int|float|bool $value  The scalar value being dumped
+     */
+    public function dumpScalar(Cursor $cursor, $type, $value);
+
+    /**
+     * Dumps a string.
+     *
+     * @param Cursor $cursor The Cursor position in the dump
+     * @param string $str    The string being dumped
+     * @param bool   $bin    Whether $str is UTF-8 or binary encoded
+     * @param int    $cut    The number of characters $str has been cut by
+     */
+    public function dumpString(Cursor $cursor, $str, $bin, $cut);
+
+    /**
+     * Dumps while entering an hash.
+     *
+     * @param Cursor     $cursor   The Cursor position in the dump
+     * @param int        $type     A Cursor::HASH_* const for the type of hash
+     * @param string|int $class    The object class, resource type or array count
+     * @param bool       $hasChild When the dump of the hash has child item
+     */
+    public function enterHash(Cursor $cursor, $type, $class, $hasChild);
+
+    /**
+     * Dumps while leaving an hash.
+     *
+     * @param Cursor     $cursor   The Cursor position in the dump
+     * @param int        $type     A Cursor::HASH_* const for the type of hash
+     * @param string|int $class    The object class, resource type or array count
+     * @param bool       $hasChild When the dump of the hash has child item
+     * @param int        $cut      The number of items the hash has been cut by
+     */
+    public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut);
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Cloner/Stub.php b/civicrm/vendor/symfony/var-dumper/Cloner/Stub.php
new file mode 100644
index 0000000000000000000000000000000000000000..a56120ce363112a44d8d1d48154407d2f083a5a3
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Cloner/Stub.php
@@ -0,0 +1,67 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Cloner;
+
+/**
+ * Represents the main properties of a PHP variable.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class Stub
+{
+    const TYPE_REF = 1;
+    const TYPE_STRING = 2;
+    const TYPE_ARRAY = 3;
+    const TYPE_OBJECT = 4;
+    const TYPE_RESOURCE = 5;
+
+    const STRING_BINARY = 1;
+    const STRING_UTF8 = 2;
+
+    const ARRAY_ASSOC = 1;
+    const ARRAY_INDEXED = 2;
+
+    public $type = self::TYPE_REF;
+    public $class = '';
+    public $value;
+    public $cut = 0;
+    public $handle = 0;
+    public $refCount = 0;
+    public $position = 0;
+    public $attr = [];
+
+    private static $defaultProperties = [];
+
+    /**
+     * @internal
+     */
+    public function __sleep()
+    {
+        $properties = [];
+
+        if (!isset(self::$defaultProperties[$c = static::class])) {
+            self::$defaultProperties[$c] = get_class_vars($c);
+
+            foreach ((new \ReflectionClass($c))->getStaticProperties() as $k => $v) {
+                unset(self::$defaultProperties[$c][$k]);
+            }
+        }
+
+        foreach (self::$defaultProperties[$c] as $k => $v) {
+            if ($this->$k !== $v) {
+                $properties[] = $k;
+            }
+        }
+
+        return $properties;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Cloner/VarCloner.php b/civicrm/vendor/symfony/var-dumper/Cloner/VarCloner.php
new file mode 100644
index 0000000000000000000000000000000000000000..e69e44407cecdf1e572575bdb8df0d68874960ec
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Cloner/VarCloner.php
@@ -0,0 +1,335 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Cloner;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class VarCloner extends AbstractCloner
+{
+    private static $gid;
+    private static $hashMask = 0;
+    private static $hashOffset = 0;
+    private static $arrayCache = [];
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doClone($var)
+    {
+        $len = 1;                       // Length of $queue
+        $pos = 0;                       // Number of cloned items past the minimum depth
+        $refsCounter = 0;               // Hard references counter
+        $queue = [[$var]];    // This breadth-first queue is the return value
+        $indexedArrays = [];       // Map of queue indexes that hold numerically indexed arrays
+        $hardRefs = [];            // Map of original zval hashes to stub objects
+        $objRefs = [];             // Map of original object handles to their stub object counterpart
+        $objects = [];             // Keep a ref to objects to ensure their handle cannot be reused while cloning
+        $resRefs = [];             // Map of original resource handles to their stub object counterpart
+        $values = [];              // Map of stub objects' hashes to original values
+        $maxItems = $this->maxItems;
+        $maxString = $this->maxString;
+        $minDepth = $this->minDepth;
+        $currentDepth = 0;              // Current tree depth
+        $currentDepthFinalIndex = 0;    // Final $queue index for current tree depth
+        $minimumDepthReached = 0 === $minDepth; // Becomes true when minimum tree depth has been reached
+        $cookie = (object) [];          // Unique object used to detect hard references
+        $a = null;                      // Array cast for nested structures
+        $stub = null;                   // Stub capturing the main properties of an original item value
+                                        // or null if the original value is used directly
+
+        if (!self::$hashMask) {
+            self::initHashMask();
+            self::$gid = md5(dechex(self::$hashMask)); // Unique string used to detect the special $GLOBALS variable
+        }
+        $gid = self::$gid;
+        $hashMask = self::$hashMask;
+        $hashOffset = self::$hashOffset;
+        $arrayStub = new Stub();
+        $arrayStub->type = Stub::TYPE_ARRAY;
+        $fromObjCast = false;
+
+        for ($i = 0; $i < $len; ++$i) {
+            // Detect when we move on to the next tree depth
+            if ($i > $currentDepthFinalIndex) {
+                ++$currentDepth;
+                $currentDepthFinalIndex = $len - 1;
+                if ($currentDepth >= $minDepth) {
+                    $minimumDepthReached = true;
+                }
+            }
+
+            $refs = $vals = $queue[$i];
+            if (\PHP_VERSION_ID < 70200 && empty($indexedArrays[$i])) {
+                // see https://wiki.php.net/rfc/convert_numeric_keys_in_object_array_casts
+                foreach ($vals as $k => $v) {
+                    if (\is_int($k)) {
+                        continue;
+                    }
+                    foreach ([$k => true] as $gk => $gv) {
+                    }
+                    if ($gk !== $k) {
+                        $fromObjCast = true;
+                        $refs = $vals = array_values($queue[$i]);
+                        break;
+                    }
+                }
+            }
+            foreach ($vals as $k => $v) {
+                // $v is the original value or a stub object in case of hard references
+
+                if (\PHP_VERSION_ID >= 70400) {
+                    $zvalIsRef = null !== \ReflectionReference::fromArrayElement($vals, $k);
+                } else {
+                    $refs[$k] = $cookie;
+                    $zvalIsRef = $vals[$k] === $cookie;
+                }
+
+                if ($zvalIsRef) {
+                    $vals[$k] = &$stub;         // Break hard references to make $queue completely
+                    unset($stub);               // independent from the original structure
+                    if ($v instanceof Stub && isset($hardRefs[spl_object_hash($v)])) {
+                        $vals[$k] = $refs[$k] = $v;
+                        if ($v->value instanceof Stub && (Stub::TYPE_OBJECT === $v->value->type || Stub::TYPE_RESOURCE === $v->value->type)) {
+                            ++$v->value->refCount;
+                        }
+                        ++$v->refCount;
+                        continue;
+                    }
+                    $refs[$k] = $vals[$k] = new Stub();
+                    $refs[$k]->value = $v;
+                    $h = spl_object_hash($refs[$k]);
+                    $hardRefs[$h] = &$refs[$k];
+                    $values[$h] = $v;
+                    $vals[$k]->handle = ++$refsCounter;
+                }
+                // Create $stub when the original value $v can not be used directly
+                // If $v is a nested structure, put that structure in array $a
+                switch (true) {
+                    case null === $v:
+                    case \is_bool($v):
+                    case \is_int($v):
+                    case \is_float($v):
+                        continue 2;
+                    case \is_string($v):
+                        if ('' === $v) {
+                            continue 2;
+                        }
+                        if (!preg_match('//u', $v)) {
+                            $stub = new Stub();
+                            $stub->type = Stub::TYPE_STRING;
+                            $stub->class = Stub::STRING_BINARY;
+                            if (0 <= $maxString && 0 < $cut = \strlen($v) - $maxString) {
+                                $stub->cut = $cut;
+                                $stub->value = substr($v, 0, -$cut);
+                            } else {
+                                $stub->value = $v;
+                            }
+                        } elseif (0 <= $maxString && isset($v[1 + ($maxString >> 2)]) && 0 < $cut = mb_strlen($v, 'UTF-8') - $maxString) {
+                            $stub = new Stub();
+                            $stub->type = Stub::TYPE_STRING;
+                            $stub->class = Stub::STRING_UTF8;
+                            $stub->cut = $cut;
+                            $stub->value = mb_substr($v, 0, $maxString, 'UTF-8');
+                        } else {
+                            continue 2;
+                        }
+                        $a = null;
+                        break;
+
+                    case \is_array($v):
+                        if (!$v) {
+                            continue 2;
+                        }
+                        $stub = $arrayStub;
+                        $stub->class = Stub::ARRAY_INDEXED;
+
+                        $j = -1;
+                        foreach ($v as $gk => $gv) {
+                            if ($gk !== ++$j) {
+                                $stub->class = Stub::ARRAY_ASSOC;
+                                break;
+                            }
+                        }
+                        $a = $v;
+
+                        if (Stub::ARRAY_ASSOC === $stub->class) {
+                            // Copies of $GLOBALS have very strange behavior,
+                            // let's detect them with some black magic
+                            $a[$gid] = true;
+
+                            // Happens with copies of $GLOBALS
+                            if (isset($v[$gid])) {
+                                unset($v[$gid]);
+                                $a = [];
+                                foreach ($v as $gk => &$gv) {
+                                    $a[$gk] = &$gv;
+                                }
+                                unset($gv);
+                            } else {
+                                $a = $v;
+                            }
+                        } elseif (\PHP_VERSION_ID < 70200) {
+                            $indexedArrays[$len] = true;
+                        }
+                        break;
+
+                    case \is_object($v):
+                    case $v instanceof \__PHP_Incomplete_Class:
+                        if (empty($objRefs[$h = $hashMask ^ hexdec(substr(spl_object_hash($v), $hashOffset, \PHP_INT_SIZE))])) {
+                            $stub = new Stub();
+                            $stub->type = Stub::TYPE_OBJECT;
+                            $stub->class = \get_class($v);
+                            $stub->value = $v;
+                            $stub->handle = $h;
+                            $a = $this->castObject($stub, 0 < $i);
+                            if ($v !== $stub->value) {
+                                if (Stub::TYPE_OBJECT !== $stub->type || null === $stub->value) {
+                                    break;
+                                }
+                                $h = $hashMask ^ hexdec(substr(spl_object_hash($stub->value), $hashOffset, \PHP_INT_SIZE));
+                                $stub->handle = $h;
+                            }
+                            $stub->value = null;
+                            if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) {
+                                $stub->cut = \count($a);
+                                $a = null;
+                            }
+                        }
+                        if (empty($objRefs[$h])) {
+                            $objRefs[$h] = $stub;
+                            $objects[] = $v;
+                        } else {
+                            $stub = $objRefs[$h];
+                            ++$stub->refCount;
+                            $a = null;
+                        }
+                        break;
+
+                    default: // resource
+                        if (empty($resRefs[$h = (int) $v])) {
+                            $stub = new Stub();
+                            $stub->type = Stub::TYPE_RESOURCE;
+                            if ('Unknown' === $stub->class = @get_resource_type($v)) {
+                                $stub->class = 'Closed';
+                            }
+                            $stub->value = $v;
+                            $stub->handle = $h;
+                            $a = $this->castResource($stub, 0 < $i);
+                            $stub->value = null;
+                            if (0 <= $maxItems && $maxItems <= $pos && $minimumDepthReached) {
+                                $stub->cut = \count($a);
+                                $a = null;
+                            }
+                        }
+                        if (empty($resRefs[$h])) {
+                            $resRefs[$h] = $stub;
+                        } else {
+                            $stub = $resRefs[$h];
+                            ++$stub->refCount;
+                            $a = null;
+                        }
+                        break;
+                }
+
+                if ($a) {
+                    if (!$minimumDepthReached || 0 > $maxItems) {
+                        $queue[$len] = $a;
+                        $stub->position = $len++;
+                    } elseif ($pos < $maxItems) {
+                        if ($maxItems < $pos += \count($a)) {
+                            $a = \array_slice($a, 0, $maxItems - $pos);
+                            if ($stub->cut >= 0) {
+                                $stub->cut += $pos - $maxItems;
+                            }
+                        }
+                        $queue[$len] = $a;
+                        $stub->position = $len++;
+                    } elseif ($stub->cut >= 0) {
+                        $stub->cut += \count($a);
+                        $stub->position = 0;
+                    }
+                }
+
+                if ($arrayStub === $stub) {
+                    if ($arrayStub->cut) {
+                        $stub = [$arrayStub->cut, $arrayStub->class => $arrayStub->position];
+                        $arrayStub->cut = 0;
+                    } elseif (isset(self::$arrayCache[$arrayStub->class][$arrayStub->position])) {
+                        $stub = self::$arrayCache[$arrayStub->class][$arrayStub->position];
+                    } else {
+                        self::$arrayCache[$arrayStub->class][$arrayStub->position] = $stub = [$arrayStub->class => $arrayStub->position];
+                    }
+                }
+
+                if ($zvalIsRef) {
+                    $refs[$k]->value = $stub;
+                } else {
+                    $vals[$k] = $stub;
+                }
+            }
+
+            if ($fromObjCast) {
+                $fromObjCast = false;
+                $refs = $vals;
+                $vals = [];
+                $j = -1;
+                foreach ($queue[$i] as $k => $v) {
+                    foreach ([$k => true] as $gk => $gv) {
+                    }
+                    if ($gk !== $k) {
+                        $vals = (object) $vals;
+                        $vals->{$k} = $refs[++$j];
+                        $vals = (array) $vals;
+                    } else {
+                        $vals[$k] = $refs[++$j];
+                    }
+                }
+            }
+
+            $queue[$i] = $vals;
+        }
+
+        foreach ($values as $h => $v) {
+            $hardRefs[$h] = $v;
+        }
+
+        return $queue;
+    }
+
+    private static function initHashMask()
+    {
+        $obj = (object) [];
+        self::$hashOffset = 16 - \PHP_INT_SIZE;
+        self::$hashMask = -1;
+
+        if (\defined('HHVM_VERSION')) {
+            self::$hashOffset += 16;
+        } else {
+            // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below
+            $obFuncs = ['ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush'];
+            foreach (debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) as $frame) {
+                if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) {
+                    $frame['line'] = 0;
+                    break;
+                }
+            }
+            if (!empty($frame['line'])) {
+                ob_start();
+                debug_zval_dump($obj);
+                self::$hashMask = (int) substr(ob_get_clean(), 17);
+            }
+        }
+
+        self::$hashMask ^= hexdec(substr(spl_object_hash($obj), self::$hashOffset, \PHP_INT_SIZE));
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Dumper/AbstractDumper.php b/civicrm/vendor/symfony/var-dumper/Dumper/AbstractDumper.php
new file mode 100644
index 0000000000000000000000000000000000000000..87195bb6a1b12a41515d551c69d8b284d4748db9
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Dumper/AbstractDumper.php
@@ -0,0 +1,213 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Dumper;
+
+use Symfony\Component\VarDumper\Cloner\Data;
+use Symfony\Component\VarDumper\Cloner\DumperInterface;
+
+/**
+ * Abstract mechanism for dumping a Data object.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+abstract class AbstractDumper implements DataDumperInterface, DumperInterface
+{
+    const DUMP_LIGHT_ARRAY = 1;
+    const DUMP_STRING_LENGTH = 2;
+    const DUMP_COMMA_SEPARATOR = 4;
+    const DUMP_TRAILING_COMMA = 8;
+
+    public static $defaultOutput = 'php://output';
+
+    protected $line = '';
+    protected $lineDumper;
+    protected $outputStream;
+    protected $decimalPoint; // This is locale dependent
+    protected $indentPad = '  ';
+    protected $flags;
+
+    private $charset = '';
+
+    /**
+     * @param callable|resource|string|null $output  A line dumper callable, an opened stream or an output path, defaults to static::$defaultOutput
+     * @param string|null                   $charset The default character encoding to use for non-UTF8 strings
+     * @param int                           $flags   A bit field of static::DUMP_* constants to fine tune dumps representation
+     */
+    public function __construct($output = null, $charset = null, $flags = 0)
+    {
+        $this->flags = (int) $flags;
+        $this->setCharset($charset ?: ini_get('php.output_encoding') ?: ini_get('default_charset') ?: 'UTF-8');
+        $this->decimalPoint = localeconv();
+        $this->decimalPoint = $this->decimalPoint['decimal_point'];
+        $this->setOutput($output ?: static::$defaultOutput);
+        if (!$output && \is_string(static::$defaultOutput)) {
+            static::$defaultOutput = $this->outputStream;
+        }
+    }
+
+    /**
+     * Sets the output destination of the dumps.
+     *
+     * @param callable|resource|string $output A line dumper callable, an opened stream or an output path
+     *
+     * @return callable|resource|string The previous output destination
+     */
+    public function setOutput($output)
+    {
+        $prev = null !== $this->outputStream ? $this->outputStream : $this->lineDumper;
+
+        if (\is_callable($output)) {
+            $this->outputStream = null;
+            $this->lineDumper = $output;
+        } else {
+            if (\is_string($output)) {
+                $output = fopen($output, 'wb');
+            }
+            $this->outputStream = $output;
+            $this->lineDumper = [$this, 'echoLine'];
+        }
+
+        return $prev;
+    }
+
+    /**
+     * Sets the default character encoding to use for non-UTF8 strings.
+     *
+     * @param string $charset The default character encoding to use for non-UTF8 strings
+     *
+     * @return string The previous charset
+     */
+    public function setCharset($charset)
+    {
+        $prev = $this->charset;
+
+        $charset = strtoupper($charset);
+        $charset = null === $charset || 'UTF-8' === $charset || 'UTF8' === $charset ? 'CP1252' : $charset;
+
+        $this->charset = $charset;
+
+        return $prev;
+    }
+
+    /**
+     * Sets the indentation pad string.
+     *
+     * @param string $pad A string that will be prepended to dumped lines, repeated by nesting level
+     *
+     * @return string The previous indent pad
+     */
+    public function setIndentPad($pad)
+    {
+        $prev = $this->indentPad;
+        $this->indentPad = $pad;
+
+        return $prev;
+    }
+
+    /**
+     * Dumps a Data object.
+     *
+     * @param Data                               $data   A Data object
+     * @param callable|resource|string|true|null $output A line dumper callable, an opened stream, an output path or true to return the dump
+     *
+     * @return string|null The dump as string when $output is true
+     */
+    public function dump(Data $data, $output = null)
+    {
+        $this->decimalPoint = localeconv();
+        $this->decimalPoint = $this->decimalPoint['decimal_point'];
+
+        if ($locale = $this->flags & (self::DUMP_COMMA_SEPARATOR | self::DUMP_TRAILING_COMMA) ? setlocale(LC_NUMERIC, 0) : null) {
+            setlocale(LC_NUMERIC, 'C');
+        }
+
+        if ($returnDump = true === $output) {
+            $output = fopen('php://memory', 'r+b');
+        }
+        if ($output) {
+            $prevOutput = $this->setOutput($output);
+        }
+        try {
+            $data->dump($this);
+            $this->dumpLine(-1);
+
+            if ($returnDump) {
+                $result = stream_get_contents($output, -1, 0);
+                fclose($output);
+
+                return $result;
+            }
+        } finally {
+            if ($output) {
+                $this->setOutput($prevOutput);
+            }
+            if ($locale) {
+                setlocale(LC_NUMERIC, $locale);
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * Dumps the current line.
+     *
+     * @param int $depth The recursive depth in the dumped structure for the line being dumped,
+     *                   or -1 to signal the end-of-dump to the line dumper callable
+     */
+    protected function dumpLine($depth)
+    {
+        \call_user_func($this->lineDumper, $this->line, $depth, $this->indentPad);
+        $this->line = '';
+    }
+
+    /**
+     * Generic line dumper callback.
+     *
+     * @param string $line      The line to write
+     * @param int    $depth     The recursive depth in the dumped structure
+     * @param string $indentPad The line indent pad
+     */
+    protected function echoLine($line, $depth, $indentPad)
+    {
+        if (-1 !== $depth) {
+            fwrite($this->outputStream, str_repeat($indentPad, $depth).$line."\n");
+        }
+    }
+
+    /**
+     * Converts a non-UTF-8 string to UTF-8.
+     *
+     * @param string|null $s The non-UTF-8 string to convert
+     *
+     * @return string|null The string converted to UTF-8
+     */
+    protected function utf8Encode($s)
+    {
+        if (null === $s || preg_match('//u', $s)) {
+            return $s;
+        }
+
+        if (!\function_exists('iconv')) {
+            throw new \RuntimeException('Unable to convert a non-UTF-8 string to UTF-8: required function iconv() does not exist. You should install ext-iconv or symfony/polyfill-iconv.');
+        }
+
+        if (false !== $c = @iconv($this->charset, 'UTF-8', $s)) {
+            return $c;
+        }
+        if ('CP1252' !== $this->charset && false !== $c = @iconv('CP1252', 'UTF-8', $s)) {
+            return $c;
+        }
+
+        return iconv('CP850', 'UTF-8', $s);
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Dumper/CliDumper.php b/civicrm/vendor/symfony/var-dumper/Dumper/CliDumper.php
new file mode 100644
index 0000000000000000000000000000000000000000..76737a499fbe543d2ffcff686b19535f14e360da
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Dumper/CliDumper.php
@@ -0,0 +1,601 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Dumper;
+
+use Symfony\Component\VarDumper\Cloner\Cursor;
+use Symfony\Component\VarDumper\Cloner\Stub;
+
+/**
+ * CliDumper dumps variables for command line output.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class CliDumper extends AbstractDumper
+{
+    public static $defaultColors;
+    public static $defaultOutput = 'php://stdout';
+
+    protected $colors;
+    protected $maxStringWidth = 0;
+    protected $styles = [
+        // See http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+        'default' => '0;38;5;208',
+        'num' => '1;38;5;38',
+        'const' => '1;38;5;208',
+        'str' => '1;38;5;113',
+        'note' => '38;5;38',
+        'ref' => '38;5;247',
+        'public' => '',
+        'protected' => '',
+        'private' => '',
+        'meta' => '38;5;170',
+        'key' => '38;5;113',
+        'index' => '38;5;38',
+    ];
+
+    protected static $controlCharsRx = '/[\x00-\x1F\x7F]+/';
+    protected static $controlCharsMap = [
+        "\t" => '\t',
+        "\n" => '\n',
+        "\v" => '\v',
+        "\f" => '\f',
+        "\r" => '\r',
+        "\033" => '\e',
+    ];
+
+    protected $collapseNextHash = false;
+    protected $expandNextHash = false;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct($output = null, $charset = null, $flags = 0)
+    {
+        parent::__construct($output, $charset, $flags);
+
+        if ('\\' === \DIRECTORY_SEPARATOR && !$this->isWindowsTrueColor()) {
+            // Use only the base 16 xterm colors when using ANSICON or standard Windows 10 CLI
+            $this->setStyles([
+                'default' => '31',
+                'num' => '1;34',
+                'const' => '1;31',
+                'str' => '1;32',
+                'note' => '34',
+                'ref' => '1;30',
+                'meta' => '35',
+                'key' => '32',
+                'index' => '34',
+            ]);
+        }
+    }
+
+    /**
+     * Enables/disables colored output.
+     *
+     * @param bool $colors
+     */
+    public function setColors($colors)
+    {
+        $this->colors = (bool) $colors;
+    }
+
+    /**
+     * Sets the maximum number of characters per line for dumped strings.
+     *
+     * @param int $maxStringWidth
+     */
+    public function setMaxStringWidth($maxStringWidth)
+    {
+        $this->maxStringWidth = (int) $maxStringWidth;
+    }
+
+    /**
+     * Configures styles.
+     *
+     * @param array $styles A map of style names to style definitions
+     */
+    public function setStyles(array $styles)
+    {
+        $this->styles = $styles + $this->styles;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpScalar(Cursor $cursor, $type, $value)
+    {
+        $this->dumpKey($cursor);
+
+        $style = 'const';
+        $attr = $cursor->attr;
+
+        switch ($type) {
+            case 'default':
+                $style = 'default';
+                break;
+
+            case 'integer':
+                $style = 'num';
+                break;
+
+            case 'double':
+                $style = 'num';
+
+                switch (true) {
+                    case INF === $value:  $value = 'INF'; break;
+                    case -INF === $value: $value = '-INF'; break;
+                    case is_nan($value):  $value = 'NAN'; break;
+                    default:
+                        $value = (string) $value;
+                        if (false === strpos($value, $this->decimalPoint)) {
+                            $value .= $this->decimalPoint.'0';
+                        }
+                        break;
+                }
+                break;
+
+            case 'NULL':
+                $value = 'null';
+                break;
+
+            case 'boolean':
+                $value = $value ? 'true' : 'false';
+                break;
+
+            default:
+                $attr += ['value' => $this->utf8Encode($value)];
+                $value = $this->utf8Encode($type);
+                break;
+        }
+
+        $this->line .= $this->style($style, $value, $attr);
+
+        $this->endValue($cursor);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dumpString(Cursor $cursor, $str, $bin, $cut)
+    {
+        $this->dumpKey($cursor);
+        $attr = $cursor->attr;
+
+        if ($bin) {
+            $str = $this->utf8Encode($str);
+        }
+        if ('' === $str) {
+            $this->line .= '""';
+            $this->endValue($cursor);
+        } else {
+            $attr += [
+                'length' => 0 <= $cut ? mb_strlen($str, 'UTF-8') + $cut : 0,
+                'binary' => $bin,
+            ];
+            $str = explode("\n", $str);
+            if (isset($str[1]) && !isset($str[2]) && !isset($str[1][0])) {
+                unset($str[1]);
+                $str[0] .= "\n";
+            }
+            $m = \count($str) - 1;
+            $i = $lineCut = 0;
+
+            if (self::DUMP_STRING_LENGTH & $this->flags) {
+                $this->line .= '('.$attr['length'].') ';
+            }
+            if ($bin) {
+                $this->line .= 'b';
+            }
+
+            if ($m) {
+                $this->line .= '"""';
+                $this->dumpLine($cursor->depth);
+            } else {
+                $this->line .= '"';
+            }
+
+            foreach ($str as $str) {
+                if ($i < $m) {
+                    $str .= "\n";
+                }
+                if (0 < $this->maxStringWidth && $this->maxStringWidth < $len = mb_strlen($str, 'UTF-8')) {
+                    $str = mb_substr($str, 0, $this->maxStringWidth, 'UTF-8');
+                    $lineCut = $len - $this->maxStringWidth;
+                }
+                if ($m && 0 < $cursor->depth) {
+                    $this->line .= $this->indentPad;
+                }
+                if ('' !== $str) {
+                    $this->line .= $this->style('str', $str, $attr);
+                }
+                if ($i++ == $m) {
+                    if ($m) {
+                        if ('' !== $str) {
+                            $this->dumpLine($cursor->depth);
+                            if (0 < $cursor->depth) {
+                                $this->line .= $this->indentPad;
+                            }
+                        }
+                        $this->line .= '"""';
+                    } else {
+                        $this->line .= '"';
+                    }
+                    if ($cut < 0) {
+                        $this->line .= '…';
+                        $lineCut = 0;
+                    } elseif ($cut) {
+                        $lineCut += $cut;
+                    }
+                }
+                if ($lineCut) {
+                    $this->line .= '…'.$lineCut;
+                    $lineCut = 0;
+                }
+
+                if ($i > $m) {
+                    $this->endValue($cursor);
+                } else {
+                    $this->dumpLine($cursor->depth);
+                }
+            }
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function enterHash(Cursor $cursor, $type, $class, $hasChild)
+    {
+        if (null === $this->colors) {
+            $this->colors = $this->supportsColors();
+        }
+
+        $this->dumpKey($cursor);
+
+        if ($this->collapseNextHash) {
+            $cursor->skipChildren = true;
+            $this->collapseNextHash = $hasChild = false;
+        }
+
+        $class = $this->utf8Encode($class);
+        if (Cursor::HASH_OBJECT === $type) {
+            $prefix = $class && 'stdClass' !== $class ? $this->style('note', $class).' {' : '{';
+        } elseif (Cursor::HASH_RESOURCE === $type) {
+            $prefix = $this->style('note', $class.' resource').($hasChild ? ' {' : ' ');
+        } else {
+            $prefix = $class && !(self::DUMP_LIGHT_ARRAY & $this->flags) ? $this->style('note', 'array:'.$class).' [' : '[';
+        }
+
+        if ($cursor->softRefCount || 0 < $cursor->softRefHandle) {
+            $prefix .= $this->style('ref', (Cursor::HASH_RESOURCE === $type ? '@' : '#').(0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->softRefTo), ['count' => $cursor->softRefCount]);
+        } elseif ($cursor->hardRefTo && !$cursor->refIndex && $class) {
+            $prefix .= $this->style('ref', '&'.$cursor->hardRefTo, ['count' => $cursor->hardRefCount]);
+        } elseif (!$hasChild && Cursor::HASH_RESOURCE === $type) {
+            $prefix = substr($prefix, 0, -1);
+        }
+
+        $this->line .= $prefix;
+
+        if ($hasChild) {
+            $this->dumpLine($cursor->depth);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut)
+    {
+        $this->dumpEllipsis($cursor, $hasChild, $cut);
+        $this->line .= Cursor::HASH_OBJECT === $type ? '}' : (Cursor::HASH_RESOURCE !== $type ? ']' : ($hasChild ? '}' : ''));
+        $this->endValue($cursor);
+    }
+
+    /**
+     * Dumps an ellipsis for cut children.
+     *
+     * @param Cursor $cursor   The Cursor position in the dump
+     * @param bool   $hasChild When the dump of the hash has child item
+     * @param int    $cut      The number of items the hash has been cut by
+     */
+    protected function dumpEllipsis(Cursor $cursor, $hasChild, $cut)
+    {
+        if ($cut) {
+            $this->line .= ' …';
+            if (0 < $cut) {
+                $this->line .= $cut;
+            }
+            if ($hasChild) {
+                $this->dumpLine($cursor->depth + 1);
+            }
+        }
+    }
+
+    /**
+     * Dumps a key in a hash structure.
+     *
+     * @param Cursor $cursor The Cursor position in the dump
+     */
+    protected function dumpKey(Cursor $cursor)
+    {
+        if (null !== $key = $cursor->hashKey) {
+            if ($cursor->hashKeyIsBinary) {
+                $key = $this->utf8Encode($key);
+            }
+            $attr = ['binary' => $cursor->hashKeyIsBinary];
+            $bin = $cursor->hashKeyIsBinary ? 'b' : '';
+            $style = 'key';
+            switch ($cursor->hashType) {
+                default:
+                case Cursor::HASH_INDEXED:
+                    if (self::DUMP_LIGHT_ARRAY & $this->flags) {
+                        break;
+                    }
+                    $style = 'index';
+                    // no break
+                case Cursor::HASH_ASSOC:
+                    if (\is_int($key)) {
+                        $this->line .= $this->style($style, $key).' => ';
+                    } else {
+                        $this->line .= $bin.'"'.$this->style($style, $key).'" => ';
+                    }
+                    break;
+
+                case Cursor::HASH_RESOURCE:
+                    $key = "\0~\0".$key;
+                    // no break
+                case Cursor::HASH_OBJECT:
+                    if (!isset($key[0]) || "\0" !== $key[0]) {
+                        $this->line .= '+'.$bin.$this->style('public', $key).': ';
+                    } elseif (0 < strpos($key, "\0", 1)) {
+                        $key = explode("\0", substr($key, 1), 2);
+
+                        switch ($key[0][0]) {
+                            case '+': // User inserted keys
+                                $attr['dynamic'] = true;
+                                $this->line .= '+'.$bin.'"'.$this->style('public', $key[1], $attr).'": ';
+                                break 2;
+                            case '~':
+                                $style = 'meta';
+                                if (isset($key[0][1])) {
+                                    parse_str(substr($key[0], 1), $attr);
+                                    $attr += ['binary' => $cursor->hashKeyIsBinary];
+                                }
+                                break;
+                            case '*':
+                                $style = 'protected';
+                                $bin = '#'.$bin;
+                                break;
+                            default:
+                                $attr['class'] = $key[0];
+                                $style = 'private';
+                                $bin = '-'.$bin;
+                                break;
+                        }
+
+                        if (isset($attr['collapse'])) {
+                            if ($attr['collapse']) {
+                                $this->collapseNextHash = true;
+                            } else {
+                                $this->expandNextHash = true;
+                            }
+                        }
+
+                        $this->line .= $bin.$this->style($style, $key[1], $attr).(isset($attr['separator']) ? $attr['separator'] : ': ');
+                    } else {
+                        // This case should not happen
+                        $this->line .= '-'.$bin.'"'.$this->style('private', $key, ['class' => '']).'": ';
+                    }
+                    break;
+            }
+
+            if ($cursor->hardRefTo) {
+                $this->line .= $this->style('ref', '&'.($cursor->hardRefCount ? $cursor->hardRefTo : ''), ['count' => $cursor->hardRefCount]).' ';
+            }
+        }
+    }
+
+    /**
+     * Decorates a value with some style.
+     *
+     * @param string $style The type of style being applied
+     * @param string $value The value being styled
+     * @param array  $attr  Optional context information
+     *
+     * @return string The value with style decoration
+     */
+    protected function style($style, $value, $attr = [])
+    {
+        if (null === $this->colors) {
+            $this->colors = $this->supportsColors();
+        }
+
+        if (isset($attr['ellipsis'], $attr['ellipsis-type'])) {
+            $prefix = substr($value, 0, -$attr['ellipsis']);
+            if ('cli' === \PHP_SAPI && 'path' === $attr['ellipsis-type'] && isset($_SERVER[$pwd = '\\' === \DIRECTORY_SEPARATOR ? 'CD' : 'PWD']) && 0 === strpos($prefix, $_SERVER[$pwd])) {
+                $prefix = '.'.substr($prefix, \strlen($_SERVER[$pwd]));
+            }
+            if (!empty($attr['ellipsis-tail'])) {
+                $prefix .= substr($value, -$attr['ellipsis'], $attr['ellipsis-tail']);
+                $value = substr($value, -$attr['ellipsis'] + $attr['ellipsis-tail']);
+            } else {
+                $value = substr($value, -$attr['ellipsis']);
+            }
+
+            return $this->style('default', $prefix).$this->style($style, $value);
+        }
+
+        $style = $this->styles[$style];
+
+        $map = static::$controlCharsMap;
+        $startCchr = $this->colors ? "\033[m\033[{$this->styles['default']}m" : '';
+        $endCchr = $this->colors ? "\033[m\033[{$style}m" : '';
+        $value = preg_replace_callback(static::$controlCharsRx, function ($c) use ($map, $startCchr, $endCchr) {
+            $s = $startCchr;
+            $c = $c[$i = 0];
+            do {
+                $s .= isset($map[$c[$i]]) ? $map[$c[$i]] : sprintf('\x%02X', \ord($c[$i]));
+            } while (isset($c[++$i]));
+
+            return $s.$endCchr;
+        }, $value, -1, $cchrCount);
+
+        if ($this->colors) {
+            if ($cchrCount && "\033" === $value[0]) {
+                $value = substr($value, \strlen($startCchr));
+            } else {
+                $value = "\033[{$style}m".$value;
+            }
+            if ($cchrCount && $endCchr === substr($value, -\strlen($endCchr))) {
+                $value = substr($value, 0, -\strlen($endCchr));
+            } else {
+                $value .= "\033[{$this->styles['default']}m";
+            }
+        }
+
+        return $value;
+    }
+
+    /**
+     * @return bool Tells if the current output stream supports ANSI colors or not
+     */
+    protected function supportsColors()
+    {
+        if ($this->outputStream !== static::$defaultOutput) {
+            return $this->hasColorSupport($this->outputStream);
+        }
+        if (null !== static::$defaultColors) {
+            return static::$defaultColors;
+        }
+        if (isset($_SERVER['argv'][1])) {
+            $colors = $_SERVER['argv'];
+            $i = \count($colors);
+            while (--$i > 0) {
+                if (isset($colors[$i][5])) {
+                    switch ($colors[$i]) {
+                        case '--ansi':
+                        case '--color':
+                        case '--color=yes':
+                        case '--color=force':
+                        case '--color=always':
+                            return static::$defaultColors = true;
+
+                        case '--no-ansi':
+                        case '--color=no':
+                        case '--color=none':
+                        case '--color=never':
+                            return static::$defaultColors = false;
+                    }
+                }
+            }
+        }
+
+        $h = stream_get_meta_data($this->outputStream) + ['wrapper_type' => null];
+        $h = 'Output' === $h['stream_type'] && 'PHP' === $h['wrapper_type'] ? fopen('php://stdout', 'wb') : $this->outputStream;
+
+        return static::$defaultColors = $this->hasColorSupport($h);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function dumpLine($depth, $endOfValue = false)
+    {
+        if ($this->colors) {
+            $this->line = sprintf("\033[%sm%s\033[m", $this->styles['default'], $this->line);
+        }
+        parent::dumpLine($depth);
+    }
+
+    protected function endValue(Cursor $cursor)
+    {
+        if (Stub::ARRAY_INDEXED === $cursor->hashType || Stub::ARRAY_ASSOC === $cursor->hashType) {
+            if (self::DUMP_TRAILING_COMMA & $this->flags && 0 < $cursor->depth) {
+                $this->line .= ',';
+            } elseif (self::DUMP_COMMA_SEPARATOR & $this->flags && 1 < $cursor->hashLength - $cursor->hashIndex) {
+                $this->line .= ',';
+            }
+        }
+
+        $this->dumpLine($cursor->depth, true);
+    }
+
+    /**
+     * Returns true if the stream supports colorization.
+     *
+     * Reference: Composer\XdebugHandler\Process::supportsColor
+     * https://github.com/composer/xdebug-handler
+     *
+     * @param mixed $stream A CLI output stream
+     *
+     * @return bool
+     */
+    private function hasColorSupport($stream)
+    {
+        if (!\is_resource($stream) || 'stream' !== get_resource_type($stream)) {
+            return false;
+        }
+
+        if ('Hyper' === getenv('TERM_PROGRAM')) {
+            return true;
+        }
+
+        if (\DIRECTORY_SEPARATOR === '\\') {
+            return (\function_exists('sapi_windows_vt100_support')
+                && @sapi_windows_vt100_support($stream))
+                || false !== getenv('ANSICON')
+                || 'ON' === getenv('ConEmuANSI')
+                || 'xterm' === getenv('TERM');
+        }
+
+        if (\function_exists('stream_isatty')) {
+            return @stream_isatty($stream);
+        }
+
+        if (\function_exists('posix_isatty')) {
+            return @posix_isatty($stream);
+        }
+
+        $stat = @fstat($stream);
+        // Check if formatted mode is S_IFCHR
+        return $stat ? 0020000 === ($stat['mode'] & 0170000) : false;
+    }
+
+    /**
+     * Returns true if the Windows terminal supports true color.
+     *
+     * Note that this does not check an output stream, but relies on environment
+     * variables from known implementations, or a PHP and Windows version that
+     * supports true color.
+     *
+     * @return bool
+     */
+    private function isWindowsTrueColor()
+    {
+        $result = 183 <= getenv('ANSICON_VER')
+            || 'ON' === getenv('ConEmuANSI')
+            || 'xterm' === getenv('TERM')
+            || 'Hyper' === getenv('TERM_PROGRAM');
+
+        if (!$result && \PHP_VERSION_ID >= 70200) {
+            $version = sprintf(
+                '%s.%s.%s',
+                PHP_WINDOWS_VERSION_MAJOR,
+                PHP_WINDOWS_VERSION_MINOR,
+                PHP_WINDOWS_VERSION_BUILD
+            );
+            $result = $version >= '10.0.15063';
+        }
+
+        return $result;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php b/civicrm/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..b173bccf389160b7b3898367303dfe8045dad1d5
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Dumper/DataDumperInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Dumper;
+
+use Symfony\Component\VarDumper\Cloner\Data;
+
+/**
+ * DataDumperInterface for dumping Data objects.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+interface DataDumperInterface
+{
+    public function dump(Data $data);
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Dumper/HtmlDumper.php b/civicrm/vendor/symfony/var-dumper/Dumper/HtmlDumper.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2f6ee7012b67155c5339a9da9cbee8fbfb37018
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Dumper/HtmlDumper.php
@@ -0,0 +1,904 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Dumper;
+
+use Symfony\Component\VarDumper\Cloner\Cursor;
+use Symfony\Component\VarDumper\Cloner\Data;
+
+/**
+ * HtmlDumper dumps variables as HTML.
+ *
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class HtmlDumper extends CliDumper
+{
+    public static $defaultOutput = 'php://output';
+
+    protected $dumpHeader;
+    protected $dumpPrefix = '<pre class=sf-dump id=%s data-indent-pad="%s">';
+    protected $dumpSuffix = '</pre><script>Sfdump(%s)</script>';
+    protected $dumpId = 'sf-dump';
+    protected $colors = true;
+    protected $headerIsDumped = false;
+    protected $lastDepth = -1;
+    protected $styles = [
+        'default' => 'background-color:#18171B; color:#FF8400; line-height:1.2em; font:12px Menlo, Monaco, Consolas, monospace; word-wrap: break-word; white-space: pre-wrap; position:relative; z-index:99999; word-break: break-all',
+        'num' => 'font-weight:bold; color:#1299DA',
+        'const' => 'font-weight:bold',
+        'str' => 'font-weight:bold; color:#56DB3A',
+        'note' => 'color:#1299DA',
+        'ref' => 'color:#A0A0A0',
+        'public' => 'color:#FFFFFF',
+        'protected' => 'color:#FFFFFF',
+        'private' => 'color:#FFFFFF',
+        'meta' => 'color:#B729D9',
+        'key' => 'color:#56DB3A',
+        'index' => 'color:#1299DA',
+        'ellipsis' => 'color:#FF8400',
+    ];
+
+    private $displayOptions = [
+        'maxDepth' => 1,
+        'maxStringLength' => 160,
+        'fileLinkFormat' => null,
+    ];
+    private $extraDisplayOptions = [];
+
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct($output = null, $charset = null, $flags = 0)
+    {
+        AbstractDumper::__construct($output, $charset, $flags);
+        $this->dumpId = 'sf-dump-'.mt_rand();
+        $this->displayOptions['fileLinkFormat'] = ini_get('xdebug.file_link_format') ?: get_cfg_var('xdebug.file_link_format');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setStyles(array $styles)
+    {
+        $this->headerIsDumped = false;
+        $this->styles = $styles + $this->styles;
+    }
+
+    /**
+     * Configures display options.
+     *
+     * @param array $displayOptions A map of display options to customize the behavior
+     */
+    public function setDisplayOptions(array $displayOptions)
+    {
+        $this->headerIsDumped = false;
+        $this->displayOptions = $displayOptions + $this->displayOptions;
+    }
+
+    /**
+     * Sets an HTML header that will be dumped once in the output stream.
+     *
+     * @param string $header An HTML string
+     */
+    public function setDumpHeader($header)
+    {
+        $this->dumpHeader = $header;
+    }
+
+    /**
+     * Sets an HTML prefix and suffix that will encapse every single dump.
+     *
+     * @param string $prefix The prepended HTML string
+     * @param string $suffix The appended HTML string
+     */
+    public function setDumpBoundaries($prefix, $suffix)
+    {
+        $this->dumpPrefix = $prefix;
+        $this->dumpSuffix = $suffix;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function dump(Data $data, $output = null, array $extraDisplayOptions = [])
+    {
+        $this->extraDisplayOptions = $extraDisplayOptions;
+        $result = parent::dump($data, $output);
+        $this->dumpId = 'sf-dump-'.mt_rand();
+
+        return $result;
+    }
+
+    /**
+     * Dumps the HTML header.
+     */
+    protected function getDumpHeader()
+    {
+        $this->headerIsDumped = null !== $this->outputStream ? $this->outputStream : $this->lineDumper;
+
+        if (null !== $this->dumpHeader) {
+            return $this->dumpHeader;
+        }
+
+        $line = str_replace('{$options}', json_encode($this->displayOptions, JSON_FORCE_OBJECT), <<<'EOHTML'
+<script>
+Sfdump = window.Sfdump || (function (doc) {
+
+var refStyle = doc.createElement('style'),
+    rxEsc = /([.*+?^${}()|\[\]\/\\])/g,
+    idRx = /\bsf-dump-\d+-ref[012]\w+\b/,
+    keyHint = 0 <= navigator.platform.toUpperCase().indexOf('MAC') ? 'Cmd' : 'Ctrl',
+    addEventListener = function (e, n, cb) {
+        e.addEventListener(n, cb, false);
+    };
+
+(doc.documentElement.firstElementChild || doc.documentElement.children[0]).appendChild(refStyle);
+
+if (!doc.addEventListener) {
+    addEventListener = function (element, eventName, callback) {
+        element.attachEvent('on' + eventName, function (e) {
+            e.preventDefault = function () {e.returnValue = false;};
+            e.target = e.srcElement;
+            callback(e);
+        });
+    };
+}
+
+function toggle(a, recursive) {
+    var s = a.nextSibling || {}, oldClass = s.className, arrow, newClass;
+
+    if (/\bsf-dump-compact\b/.test(oldClass)) {
+        arrow = 'â–¼';
+        newClass = 'sf-dump-expanded';
+    } else if (/\bsf-dump-expanded\b/.test(oldClass)) {
+        arrow = 'â–¶';
+        newClass = 'sf-dump-compact';
+    } else {
+        return false;
+    }
+
+    if (doc.createEvent && s.dispatchEvent) {
+        var event = doc.createEvent('Event');
+        event.initEvent('sf-dump-expanded' === newClass ? 'sfbeforedumpexpand' : 'sfbeforedumpcollapse', true, false);
+
+        s.dispatchEvent(event);
+    }
+
+    a.lastChild.innerHTML = arrow;
+    s.className = s.className.replace(/\bsf-dump-(compact|expanded)\b/, newClass);
+
+    if (recursive) {
+        try {
+            a = s.querySelectorAll('.'+oldClass);
+            for (s = 0; s < a.length; ++s) {
+                if (-1 == a[s].className.indexOf(newClass)) {
+                    a[s].className = newClass;
+                    a[s].previousSibling.lastChild.innerHTML = arrow;
+                }
+            }
+        } catch (e) {
+        }
+    }
+
+    return true;
+};
+
+function collapse(a, recursive) {
+    var s = a.nextSibling || {}, oldClass = s.className;
+
+    if (/\bsf-dump-expanded\b/.test(oldClass)) {
+        toggle(a, recursive);
+
+        return true;
+    }
+
+    return false;
+};
+
+function expand(a, recursive) {
+    var s = a.nextSibling || {}, oldClass = s.className;
+
+    if (/\bsf-dump-compact\b/.test(oldClass)) {
+        toggle(a, recursive);
+
+        return true;
+    }
+
+    return false;
+};
+
+function collapseAll(root) {
+    var a = root.querySelector('a.sf-dump-toggle');
+    if (a) {
+        collapse(a, true);
+        expand(a);
+
+        return true;
+    }
+
+    return false;
+}
+
+function reveal(node) {
+    var previous, parents = [];
+
+    while ((node = node.parentNode || {}) && (previous = node.previousSibling) && 'A' === previous.tagName) {
+        parents.push(previous);
+    }
+
+    if (0 !== parents.length) {
+        parents.forEach(function (parent) {
+            expand(parent);
+        });
+
+        return true;
+    }
+
+    return false;
+}
+
+function highlight(root, activeNode, nodes) {
+    resetHighlightedNodes(root);
+
+    Array.from(nodes||[]).forEach(function (node) {
+        if (!/\bsf-dump-highlight\b/.test(node.className)) {
+            node.className = node.className + ' sf-dump-highlight';
+        }
+    });
+
+    if (!/\bsf-dump-highlight-active\b/.test(activeNode.className)) {
+        activeNode.className = activeNode.className + ' sf-dump-highlight-active';
+    }
+}
+
+function resetHighlightedNodes(root) {
+    Array.from(root.querySelectorAll('.sf-dump-str, .sf-dump-key, .sf-dump-public, .sf-dump-protected, .sf-dump-private')).forEach(function (strNode) {
+        strNode.className = strNode.className.replace(/\bsf-dump-highlight\b/, '');
+        strNode.className = strNode.className.replace(/\bsf-dump-highlight-active\b/, '');
+    });
+}
+
+return function (root, x) {
+    root = doc.getElementById(root);
+
+    var indentRx = new RegExp('^('+(root.getAttribute('data-indent-pad') || '  ').replace(rxEsc, '\\$1')+')+', 'm'),
+        options = {$options},
+        elt = root.getElementsByTagName('A'),
+        len = elt.length,
+        i = 0, s, h,
+        t = [];
+
+    while (i < len) t.push(elt[i++]);
+
+    for (i in x) {
+        options[i] = x[i];
+    }
+
+    function a(e, f) {
+        addEventListener(root, e, function (e) {
+            if ('A' == e.target.tagName) {
+                f(e.target, e);
+            } else if ('A' == e.target.parentNode.tagName) {
+                f(e.target.parentNode, e);
+            } else if (e.target.nextElementSibling && 'A' == e.target.nextElementSibling.tagName) {
+                f(e.target.nextElementSibling, e, true);
+            }
+        });
+    };
+    function isCtrlKey(e) {
+        return e.ctrlKey || e.metaKey;
+    }
+    function xpathString(str) {
+        var parts = str.match(/[^'"]+|['"]/g).map(function (part) {
+            if ("'" == part)  {
+                return '"\'"';
+            }
+            if ('"' == part) {
+                return "'\"'";
+            }
+
+            return "'" + part + "'";
+        });
+
+        return "concat(" + parts.join(",") + ", '')";
+    }
+    function xpathHasClass(className) {
+        return "contains(concat(' ', normalize-space(@class), ' '), ' " + className +" ')";
+    }
+    addEventListener(root, 'mouseover', function (e) {
+        if ('' != refStyle.innerHTML) {
+            refStyle.innerHTML = '';
+        }
+    });
+    a('mouseover', function (a, e, c) {
+        if (c) {
+            e.target.style.cursor = "pointer";
+        } else if (a = idRx.exec(a.className)) {
+            try {
+                refStyle.innerHTML = 'pre.sf-dump .'+a[0]+'{background-color: #B729D9; color: #FFF !important; border-radius: 2px}';
+            } catch (e) {
+            }
+        }
+    });
+    a('click', function (a, e, c) {
+        if (/\bsf-dump-toggle\b/.test(a.className)) {
+            e.preventDefault();
+            if (!toggle(a, isCtrlKey(e))) {
+                var r = doc.getElementById(a.getAttribute('href').substr(1)),
+                    s = r.previousSibling,
+                    f = r.parentNode,
+                    t = a.parentNode;
+                t.replaceChild(r, a);
+                f.replaceChild(a, s);
+                t.insertBefore(s, r);
+                f = f.firstChild.nodeValue.match(indentRx);
+                t = t.firstChild.nodeValue.match(indentRx);
+                if (f && t && f[0] !== t[0]) {
+                    r.innerHTML = r.innerHTML.replace(new RegExp('^'+f[0].replace(rxEsc, '\\$1'), 'mg'), t[0]);
+                }
+                if (/\bsf-dump-compact\b/.test(r.className)) {
+                    toggle(s, isCtrlKey(e));
+                }
+            }
+
+            if (c) {
+            } else if (doc.getSelection) {
+                try {
+                    doc.getSelection().removeAllRanges();
+                } catch (e) {
+                    doc.getSelection().empty();
+                }
+            } else {
+                doc.selection.empty();
+            }
+        } else if (/\bsf-dump-str-toggle\b/.test(a.className)) {
+            e.preventDefault();
+            e = a.parentNode.parentNode;
+            e.className = e.className.replace(/\bsf-dump-str-(expand|collapse)\b/, a.parentNode.className);
+        }
+    });
+
+    elt = root.getElementsByTagName('SAMP');
+    len = elt.length;
+    i = 0;
+
+    while (i < len) t.push(elt[i++]);
+    len = t.length;
+
+    for (i = 0; i < len; ++i) {
+        elt = t[i];
+        if ('SAMP' == elt.tagName) {
+            a = elt.previousSibling || {};
+            if ('A' != a.tagName) {
+                a = doc.createElement('A');
+                a.className = 'sf-dump-ref';
+                elt.parentNode.insertBefore(a, elt);
+            } else {
+                a.innerHTML += ' ';
+            }
+            a.title = (a.title ? a.title+'\n[' : '[')+keyHint+'+click] Expand all children';
+            a.innerHTML += '<span>â–¼</span>';
+            a.className += ' sf-dump-toggle';
+
+            x = 1;
+            if ('sf-dump' != elt.parentNode.className) {
+                x += elt.parentNode.getAttribute('data-depth')/1;
+            }
+            elt.setAttribute('data-depth', x);
+            var className = elt.className;
+            elt.className = 'sf-dump-expanded';
+            if (className ? 'sf-dump-expanded' !== className : (x > options.maxDepth)) {
+                toggle(a);
+            }
+        } else if (/\bsf-dump-ref\b/.test(elt.className) && (a = elt.getAttribute('href'))) {
+            a = a.substr(1);
+            elt.className += ' '+a;
+
+            if (/[\[{]$/.test(elt.previousSibling.nodeValue)) {
+                a = a != elt.nextSibling.id && doc.getElementById(a);
+                try {
+                    s = a.nextSibling;
+                    elt.appendChild(a);
+                    s.parentNode.insertBefore(a, s);
+                    if (/^[@#]/.test(elt.innerHTML)) {
+                        elt.innerHTML += ' <span>â–¶</span>';
+                    } else {
+                        elt.innerHTML = '<span>â–¶</span>';
+                        elt.className = 'sf-dump-ref';
+                    }
+                    elt.className += ' sf-dump-toggle';
+                } catch (e) {
+                    if ('&' == elt.innerHTML.charAt(0)) {
+                        elt.innerHTML = '…';
+                        elt.className = 'sf-dump-ref';
+                    }
+                }
+            }
+        }
+    }
+
+    if (doc.evaluate && Array.from && root.children.length > 1) {
+        root.setAttribute('tabindex', 0);
+
+        SearchState = function () {
+            this.nodes = [];
+            this.idx = 0;
+        };
+        SearchState.prototype = {
+            next: function () {
+                if (this.isEmpty()) {
+                    return this.current();
+                }
+                this.idx = this.idx < (this.nodes.length - 1) ? this.idx + 1 : 0;
+
+                return this.current();
+            },
+            previous: function () {
+                if (this.isEmpty()) {
+                    return this.current();
+                }
+                this.idx = this.idx > 0 ? this.idx - 1 : (this.nodes.length - 1);
+
+                return this.current();
+            },
+            isEmpty: function () {
+                return 0 === this.count();
+            },
+            current: function () {
+                if (this.isEmpty()) {
+                    return null;
+                }
+                return this.nodes[this.idx];
+            },
+            reset: function () {
+                this.nodes = [];
+                this.idx = 0;
+            },
+            count: function () {
+                return this.nodes.length;
+            },
+        };
+
+        function showCurrent(state)
+        {
+            var currentNode = state.current();
+            if (currentNode) {
+                reveal(currentNode);
+                highlight(root, currentNode, state.nodes);
+            }
+            counter.textContent = (state.isEmpty() ? 0 : state.idx + 1) + ' of ' + state.count();
+        }
+
+        var search = doc.createElement('div');
+        search.className = 'sf-dump-search-wrapper sf-dump-search-hidden';
+        search.innerHTML = '
+            <input type="text" class="sf-dump-search-input">
+            <span class="sf-dump-search-count">0 of 0<\/span>
+            <button type="button" class="sf-dump-search-input-previous" tabindex="-1">
+                <svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1683 1331l-166 165q-19 19-45 19t-45-19L896 965l-531 531q-19 19-45 19t-45-19l-166-165q-19-19-19-45.5t19-45.5l742-741q19-19 45-19t45 19l742 741q19 19 19 45.5t-19 45.5z"\/><\/svg>
+            <\/button>
+            <button type="button" class="sf-dump-search-input-next" tabindex="-1">
+                <svg viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1683 808l-742 741q-19 19-45 19t-45-19L109 808q-19-19-19-45.5t19-45.5l166-165q19-19 45-19t45 19l531 531 531-531q19-19 45-19t45 19l166 165q19 19 19 45.5t-19 45.5z"\/><\/svg>
+            <\/button>
+        ';
+        root.insertBefore(search, root.firstChild);
+
+        var state = new SearchState();
+        var searchInput = search.querySelector('.sf-dump-search-input');
+        var counter = search.querySelector('.sf-dump-search-count');
+        var searchInputTimer = 0;
+        var previousSearchQuery = '';
+
+        addEventListener(searchInput, 'keyup', function (e) {
+            var searchQuery = e.target.value;
+            /* Don't perform anything if the pressed key didn't change the query */
+            if (searchQuery === previousSearchQuery) {
+                return;
+            }
+            previousSearchQuery = searchQuery;
+            clearTimeout(searchInputTimer);
+            searchInputTimer = setTimeout(function () {
+                state.reset();
+                collapseAll(root);
+                resetHighlightedNodes(root);
+                if ('' === searchQuery) {
+                    counter.textContent = '0 of 0';
+
+                    return;
+                }
+
+                var classMatches = [
+                    "sf-dump-str",
+                    "sf-dump-key",
+                    "sf-dump-public",
+                    "sf-dump-protected",
+                    "sf-dump-private",
+                ].map(xpathHasClass).join(' or ');
+
+                var xpathResult = doc.evaluate('.//span[' + classMatches + '][contains(translate(child::text(), ' + xpathString(searchQuery.toUpperCase()) + ', ' + xpathString(searchQuery.toLowerCase()) + '), ' + xpathString(searchQuery.toLowerCase()) + ')]', root, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
+
+                while (node = xpathResult.iterateNext()) state.nodes.push(node);
+
+                showCurrent(state);
+            }, 400);
+        });
+
+        Array.from(search.querySelectorAll('.sf-dump-search-input-next, .sf-dump-search-input-previous')).forEach(function (btn) {
+            addEventListener(btn, 'click', function (e) {
+                e.preventDefault();
+                -1 !== e.target.className.indexOf('next') ? state.next() : state.previous();
+                searchInput.focus();
+                collapseAll(root);
+                showCurrent(state);
+            })
+        });
+
+        addEventListener(root, 'keydown', function (e) {
+            var isSearchActive = !/\bsf-dump-search-hidden\b/.test(search.className);
+            if ((114 === e.keyCode && !isSearchActive) || (isCtrlKey(e) && 70 === e.keyCode)) {
+                /* F3 or CMD/CTRL + F */
+                e.preventDefault();
+                search.className = search.className.replace(/\bsf-dump-search-hidden\b/, '');
+                searchInput.focus();
+            } else if (isSearchActive) {
+                if (27 === e.keyCode) {
+                    /* ESC key */
+                    search.className += ' sf-dump-search-hidden';
+                    e.preventDefault();
+                    resetHighlightedNodes(root);
+                    searchInput.value = '';
+                } else if (
+                    (isCtrlKey(e) && 71 === e.keyCode) /* CMD/CTRL + G */
+                    || 13 === e.keyCode /* Enter */
+                    || 114 === e.keyCode /* F3 */
+                ) {
+                    e.preventDefault();
+                    e.shiftKey ? state.previous() : state.next();
+                    collapseAll(root);
+                    showCurrent(state);
+                }
+            }
+        });
+    }
+
+    if (0 >= options.maxStringLength) {
+        return;
+    }
+    try {
+        elt = root.querySelectorAll('.sf-dump-str');
+        len = elt.length;
+        i = 0;
+        t = [];
+
+        while (i < len) t.push(elt[i++]);
+        len = t.length;
+
+        for (i = 0; i < len; ++i) {
+            elt = t[i];
+            s = elt.innerText || elt.textContent;
+            x = s.length - options.maxStringLength;
+            if (0 < x) {
+                h = elt.innerHTML;
+                elt[elt.innerText ? 'innerText' : 'textContent'] = s.substring(0, options.maxStringLength);
+                elt.className += ' sf-dump-str-collapse';
+                elt.innerHTML = '<span class=sf-dump-str-collapse>'+h+'<a class="sf-dump-ref sf-dump-str-toggle" title="Collapse"> â—€</a></span>'+
+                    '<span class=sf-dump-str-expand>'+elt.innerHTML+'<a class="sf-dump-ref sf-dump-str-toggle" title="'+x+' remaining characters"> â–¶</a></span>';
+            }
+        }
+    } catch (e) {
+    }
+};
+
+})(document);
+</script><style>
+pre.sf-dump {
+    display: block;
+    white-space: pre;
+    padding: 5px;
+}
+pre.sf-dump:after {
+   content: "";
+   visibility: hidden;
+   display: block;
+   height: 0;
+   clear: both;
+}
+pre.sf-dump span {
+    display: inline;
+}
+pre.sf-dump .sf-dump-compact {
+    display: none;
+}
+pre.sf-dump abbr {
+    text-decoration: none;
+    border: none;
+    cursor: help;
+}
+pre.sf-dump a {
+    text-decoration: none;
+    cursor: pointer;
+    border: 0;
+    outline: none;
+    color: inherit;
+}
+pre.sf-dump .sf-dump-ellipsis {
+    display: inline-block;
+    overflow: visible;
+    text-overflow: ellipsis;
+    max-width: 5em;
+    white-space: nowrap;
+    overflow: hidden;
+    vertical-align: top;
+}
+pre.sf-dump .sf-dump-ellipsis+.sf-dump-ellipsis {
+    max-width: none;
+}
+pre.sf-dump code {
+    display:inline;
+    padding:0;
+    background:none;
+}
+.sf-dump-str-collapse .sf-dump-str-collapse {
+    display: none;
+}
+.sf-dump-str-expand .sf-dump-str-expand {
+    display: none;
+}
+.sf-dump-public.sf-dump-highlight,
+.sf-dump-protected.sf-dump-highlight,
+.sf-dump-private.sf-dump-highlight,
+.sf-dump-str.sf-dump-highlight,
+.sf-dump-key.sf-dump-highlight {
+    background: rgba(111, 172, 204, 0.3);
+    border: 1px solid #7DA0B1;
+    border-radius: 3px;
+}
+.sf-dump-public.sf-dump-highlight-active,
+.sf-dump-protected.sf-dump-highlight-active,
+.sf-dump-private.sf-dump-highlight-active,
+.sf-dump-str.sf-dump-highlight-active,
+.sf-dump-key.sf-dump-highlight-active {
+    background: rgba(253, 175, 0, 0.4);
+    border: 1px solid #ffa500;
+    border-radius: 3px;
+}
+pre.sf-dump .sf-dump-search-hidden {
+    display: none;
+}
+pre.sf-dump .sf-dump-search-wrapper {
+    float: right;
+    font-size: 0;
+    white-space: nowrap;
+    max-width: 100%;
+    text-align: right;
+}
+pre.sf-dump .sf-dump-search-wrapper > * {
+    vertical-align: top;
+    box-sizing: border-box;
+    height: 21px;
+    font-weight: normal;
+    border-radius: 0;
+    background: #FFF;
+    color: #757575;
+    border: 1px solid #BBB;
+}
+pre.sf-dump .sf-dump-search-wrapper > input.sf-dump-search-input {
+    padding: 3px;
+    height: 21px;
+    font-size: 12px;
+    border-right: none;
+    width: 140px;
+    border-top-left-radius: 3px;
+    border-bottom-left-radius: 3px;
+    color: #000;
+}
+pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next,
+pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-previous {
+    background: #F2F2F2;
+    outline: none;
+    border-left: none;
+    font-size: 0;
+    line-height: 0;
+}
+pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next {
+    border-top-right-radius: 3px;
+    border-bottom-right-radius: 3px;
+}
+pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-next > svg,
+pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-input-previous > svg {
+    pointer-events: none;
+    width: 12px;
+    height: 12px;
+}
+pre.sf-dump .sf-dump-search-wrapper > .sf-dump-search-count {
+    display: inline-block;
+    padding: 0 5px;
+    margin: 0;
+    border-left: none;
+    line-height: 21px;
+    font-size: 12px;
+}
+EOHTML
+        );
+
+        foreach ($this->styles as $class => $style) {
+            $line .= 'pre.sf-dump'.('default' === $class ? ', pre.sf-dump' : '').' .sf-dump-'.$class.'{'.$style.'}';
+        }
+
+        return $this->dumpHeader = preg_replace('/\s+/', ' ', $line).'</style>'.$this->dumpHeader;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function enterHash(Cursor $cursor, $type, $class, $hasChild)
+    {
+        parent::enterHash($cursor, $type, $class, false);
+
+        if ($cursor->skipChildren) {
+            $cursor->skipChildren = false;
+            $eol = ' class=sf-dump-compact>';
+        } elseif ($this->expandNextHash) {
+            $this->expandNextHash = false;
+            $eol = ' class=sf-dump-expanded>';
+        } else {
+            $eol = '>';
+        }
+
+        if ($hasChild) {
+            $this->line .= '<samp';
+            if ($cursor->refIndex) {
+                $r = Cursor::HASH_OBJECT !== $type ? 1 - (Cursor::HASH_RESOURCE !== $type) : 2;
+                $r .= $r && 0 < $cursor->softRefHandle ? $cursor->softRefHandle : $cursor->refIndex;
+
+                $this->line .= sprintf(' id=%s-ref%s', $this->dumpId, $r);
+            }
+            $this->line .= $eol;
+            $this->dumpLine($cursor->depth);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function leaveHash(Cursor $cursor, $type, $class, $hasChild, $cut)
+    {
+        $this->dumpEllipsis($cursor, $hasChild, $cut);
+        if ($hasChild) {
+            $this->line .= '</samp>';
+        }
+        parent::leaveHash($cursor, $type, $class, $hasChild, 0);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function style($style, $value, $attr = [])
+    {
+        if ('' === $value) {
+            return '';
+        }
+
+        $v = esc($value);
+
+        if ('ref' === $style) {
+            if (empty($attr['count'])) {
+                return sprintf('<a class=sf-dump-ref>%s</a>', $v);
+            }
+            $r = ('#' !== $v[0] ? 1 - ('@' !== $v[0]) : 2).substr($value, 1);
+
+            return sprintf('<a class=sf-dump-ref href=#%s-ref%s title="%d occurrences">%s</a>', $this->dumpId, $r, 1 + $attr['count'], $v);
+        }
+
+        if ('const' === $style && isset($attr['value'])) {
+            $style .= sprintf(' title="%s"', esc(is_scalar($attr['value']) ? $attr['value'] : json_encode($attr['value'])));
+        } elseif ('public' === $style) {
+            $style .= sprintf(' title="%s"', empty($attr['dynamic']) ? 'Public property' : 'Runtime added dynamic property');
+        } elseif ('str' === $style && 1 < $attr['length']) {
+            $style .= sprintf(' title="%d%s characters"', $attr['length'], $attr['binary'] ? ' binary or non-UTF-8' : '');
+        } elseif ('note' === $style && false !== $c = strrpos($v, '\\')) {
+            return sprintf('<abbr title="%s" class=sf-dump-%s>%s</abbr>', $v, $style, substr($v, $c + 1));
+        } elseif ('protected' === $style) {
+            $style .= ' title="Protected property"';
+        } elseif ('meta' === $style && isset($attr['title'])) {
+            $style .= sprintf(' title="%s"', esc($this->utf8Encode($attr['title'])));
+        } elseif ('private' === $style) {
+            $style .= sprintf(' title="Private property defined in class:&#10;`%s`"', esc($this->utf8Encode($attr['class'])));
+        }
+        $map = static::$controlCharsMap;
+
+        if (isset($attr['ellipsis'])) {
+            $class = 'sf-dump-ellipsis';
+            if (isset($attr['ellipsis-type'])) {
+                $class = sprintf('"%s sf-dump-ellipsis-%s"', $class, $attr['ellipsis-type']);
+            }
+            $label = esc(substr($value, -$attr['ellipsis']));
+            $style = str_replace(' title="', " title=\"$v\n", $style);
+            $v = sprintf('<span class=%s>%s</span>', $class, substr($v, 0, -\strlen($label)));
+
+            if (!empty($attr['ellipsis-tail'])) {
+                $tail = \strlen(esc(substr($value, -$attr['ellipsis'], $attr['ellipsis-tail'])));
+                $v .= sprintf('<span class=sf-dump-ellipsis>%s</span>%s', substr($label, 0, $tail), substr($label, $tail));
+            } else {
+                $v .= $label;
+            }
+        }
+
+        $v = "<span class=sf-dump-{$style}>".preg_replace_callback(static::$controlCharsRx, function ($c) use ($map) {
+            $s = '<span class=sf-dump-default>';
+            $c = $c[$i = 0];
+            do {
+                $s .= isset($map[$c[$i]]) ? $map[$c[$i]] : sprintf('\x%02X', \ord($c[$i]));
+            } while (isset($c[++$i]));
+
+            return $s.'</span>';
+        }, $v).'</span>';
+
+        if (isset($attr['file']) && $href = $this->getSourceLink($attr['file'], isset($attr['line']) ? $attr['line'] : 0)) {
+            $attr['href'] = $href;
+        }
+        if (isset($attr['href'])) {
+            $target = isset($attr['file']) ? '' : ' target="_blank"';
+            $v = sprintf('<a href="%s"%s rel="noopener noreferrer">%s</a>', esc($this->utf8Encode($attr['href'])), $target, $v);
+        }
+        if (isset($attr['lang'])) {
+            $v = sprintf('<code class="%s">%s</code>', esc($attr['lang']), $v);
+        }
+
+        return $v;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function dumpLine($depth, $endOfValue = false)
+    {
+        if (-1 === $this->lastDepth) {
+            $this->line = sprintf($this->dumpPrefix, $this->dumpId, $this->indentPad).$this->line;
+        }
+        if ($this->headerIsDumped !== (null !== $this->outputStream ? $this->outputStream : $this->lineDumper)) {
+            $this->line = $this->getDumpHeader().$this->line;
+        }
+
+        if (-1 === $depth) {
+            $args = ['"'.$this->dumpId.'"'];
+            if ($this->extraDisplayOptions) {
+                $args[] = json_encode($this->extraDisplayOptions, JSON_FORCE_OBJECT);
+            }
+            // Replace is for BC
+            $this->line .= sprintf(str_replace('"%s"', '%s', $this->dumpSuffix), implode(', ', $args));
+        }
+        $this->lastDepth = $depth;
+
+        $this->line = mb_convert_encoding($this->line, 'HTML-ENTITIES', 'UTF-8');
+
+        if (-1 === $depth) {
+            AbstractDumper::dumpLine(0);
+        }
+        AbstractDumper::dumpLine($depth);
+    }
+
+    private function getSourceLink($file, $line)
+    {
+        $options = $this->extraDisplayOptions + $this->displayOptions;
+
+        if ($fmt = $options['fileLinkFormat']) {
+            return \is_string($fmt) ? strtr($fmt, ['%f' => $file, '%l' => $line]) : $fmt->format($file, $line);
+        }
+
+        return false;
+    }
+}
+
+function esc($str)
+{
+    return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
+}
diff --git a/civicrm/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php b/civicrm/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php
new file mode 100644
index 0000000000000000000000000000000000000000..af47753ad5b692f27ca287b19b16b3fdfed039c1
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Exception/ThrowingCasterException.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper\Exception;
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class ThrowingCasterException extends \Exception
+{
+    /**
+     * @param \Exception $prev The exception thrown from the caster
+     */
+    public function __construct(\Exception $prev)
+    {
+        parent::__construct('Unexpected '.\get_class($prev).' thrown from a caster: '.$prev->getMessage(), 0, $prev);
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/LICENSE b/civicrm/vendor/symfony/var-dumper/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..684fbf94df83c1ab0d15ccb159147c4c9d483e85
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2014-2020 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/civicrm/vendor/symfony/var-dumper/README.md b/civicrm/vendor/symfony/var-dumper/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..339f73eba30525a4acea14c4420da7115465419a
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/README.md
@@ -0,0 +1,15 @@
+VarDumper Component
+===================
+
+The VarDumper component provides mechanisms for walking through any arbitrary
+PHP variable. It provides a better `dump()` function that you can use instead
+of `var_dump`.
+
+Resources
+---------
+
+  * [Documentation](https://symfony.com/doc/current/components/var_dumper/introduction.html)
+  * [Contributing](https://symfony.com/doc/current/contributing/index.html)
+  * [Report issues](https://github.com/symfony/symfony/issues) and
+    [send Pull Requests](https://github.com/symfony/symfony/pulls)
+    in the [main Symfony repository](https://github.com/symfony/symfony)
diff --git a/civicrm/vendor/symfony/var-dumper/Resources/functions/dump.php b/civicrm/vendor/symfony/var-dumper/Resources/functions/dump.php
new file mode 100644
index 0000000000000000000000000000000000000000..0e0e4d043521816b22871997b72ce5d9f8edb13f
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/Resources/functions/dump.php
@@ -0,0 +1,30 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Component\VarDumper\VarDumper;
+
+if (!function_exists('dump')) {
+    /**
+     * @author Nicolas Grekas <p@tchwork.com>
+     */
+    function dump($var)
+    {
+        foreach (func_get_args() as $v) {
+            VarDumper::dump($v);
+        }
+
+        if (1 < func_num_args()) {
+            return func_get_args();
+        }
+
+        return $var;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/VarDumper.php b/civicrm/vendor/symfony/var-dumper/VarDumper.php
new file mode 100644
index 0000000000000000000000000000000000000000..2ef20c064b01559dbea456cbec3cc8e917715729
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/VarDumper.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\VarDumper;
+
+use Symfony\Component\VarDumper\Cloner\VarCloner;
+use Symfony\Component\VarDumper\Dumper\CliDumper;
+use Symfony\Component\VarDumper\Dumper\HtmlDumper;
+
+// Load the global dump() function
+require_once __DIR__.'/Resources/functions/dump.php';
+
+/**
+ * @author Nicolas Grekas <p@tchwork.com>
+ */
+class VarDumper
+{
+    private static $handler;
+
+    public static function dump($var)
+    {
+        if (null === self::$handler) {
+            $cloner = new VarCloner();
+            $dumper = \in_array(\PHP_SAPI, ['cli', 'phpdbg'], true) ? new CliDumper() : new HtmlDumper();
+            self::$handler = function ($var) use ($cloner, $dumper) {
+                $dumper->dump($cloner->cloneVar($var));
+            };
+        }
+
+        return \call_user_func(self::$handler, $var);
+    }
+
+    public static function setHandler(callable $callable = null)
+    {
+        $prevHandler = self::$handler;
+        self::$handler = $callable;
+
+        return $prevHandler;
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/composer.json b/civicrm/vendor/symfony/var-dumper/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..d31e0b495abb9ccec6fcfc01fd47be2ad0e877fa
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/composer.json
@@ -0,0 +1,47 @@
+{
+    "name": "symfony/var-dumper",
+    "type": "library",
+    "description": "Symfony mechanism for exploring and dumping PHP variables",
+    "keywords": ["dump", "debug"],
+    "homepage": "https://symfony.com",
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Nicolas Grekas",
+            "email": "p@tchwork.com"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors"
+        }
+    ],
+    "require": {
+        "php": "^5.5.9|>=7.0.8",
+        "symfony/polyfill-mbstring": "~1.0"
+    },
+    "require-dev": {
+        "ext-iconv": "*",
+        "twig/twig": "~1.34|~2.4"
+    },
+    "conflict": {
+        "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+    },
+    "suggest": {
+        "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+        "ext-intl": "To show region name in time zone dump",
+        "ext-symfony_debug": ""
+    },
+    "autoload": {
+        "files": [ "Resources/functions/dump.php" ],
+        "psr-4": { "Symfony\\Component\\VarDumper\\": "" },
+        "exclude-from-classmap": [
+            "/Tests/"
+        ]
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "3.4-dev"
+        }
+    }
+}
diff --git a/civicrm/vendor/symfony/var-dumper/phpunit.xml.dist b/civicrm/vendor/symfony/var-dumper/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..3243fcd0279ccf5ab05e3fc8e0b6c84fbba0c669
--- /dev/null
+++ b/civicrm/vendor/symfony/var-dumper/phpunit.xml.dist
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.2/phpunit.xsd"
+         backupGlobals="false"
+         colors="true"
+         bootstrap="vendor/autoload.php"
+         failOnRisky="true"
+         failOnWarning="true"
+>
+    <php>
+        <ini name="error_reporting" value="-1" />
+        <env name="DUMP_LIGHT_ARRAY" value="" />
+        <env name="DUMP_STRING_LENGTH" value="" />
+    </php>
+
+    <testsuites>
+        <testsuite name="Symfony VarDumper Component Test Suite">
+            <directory>./Tests/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./</directory>
+            <exclude>
+                <directory>./Resources</directory>
+                <directory>./Tests</directory>
+                <directory>./vendor</directory>
+            </exclude>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/civicrm/vendor/totten/lurkerlite/.gitignore b/civicrm/vendor/totten/lurkerlite/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..2e80ae6b545cfaeb8cd847e3f6f609e7af9a0f00
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/.gitignore
@@ -0,0 +1,4 @@
+/vendor
+/phpunit.xml
+*~
+/.idea
diff --git a/civicrm/vendor/totten/lurkerlite/.travis.yml b/civicrm/vendor/totten/lurkerlite/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..781e566400a41028b5cedcc9a9f9e4230e5a49f5
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/.travis.yml
@@ -0,0 +1,31 @@
+language: php
+
+sudo: false
+
+
+cache:
+  directories:
+    - $HOME/.composer/cache/files
+
+php:
+  - 5.6
+  - 7.0
+  - 7.3
+
+matrix:
+  include:
+    # Pyrus doesn't appear to be available on current Travis env.
+    #- php: 5.6
+    #  env: INOTIFY_EXTENSION=pyrus
+    - php: 7.0
+      env: INOTIFY_EXTENSION=pecl
+    - php: 7.3
+      env: INOTIFY_EXTENSION=pecl
+
+before_script:
+  ## PHPUnit 5 runs well enough for php56-php73. For php74, may need to adjust.
+  - curl -sSfL -o ~/.phpenv/versions/$(phpenv version-name)/bin/phpunit https://phar.phpunit.de/phpunit-5.7.phar
+  ## Test builds with and without inotify.
+  - "if [ \"$INOTIFY_EXTENSION\" = \"pyrus\" ]; then pyrus install pecl/inotify && pyrus build pecl/inotify && echo \"extension=inotify.so\" >> ~/.phpenv/versions/$(phpenv version-name)/etc/php.ini; fi"
+  - "if [ \"$INOTIFY_EXTENSION\" = \"pecl\" ]; then pecl install inotify ; fi"
+  - "composer install --no-progress"
diff --git a/civicrm/vendor/totten/lurkerlite/CHANGELOG.md b/civicrm/vendor/totten/lurkerlite/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..e1d6d0abbf59679cf2552aeca797a42779fe9c26
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/CHANGELOG.md
@@ -0,0 +1,45 @@
+CHANGELOG
+=========
+
+lurkerlite 1.3.0 (2020-08-31)
+------------------
+
+  `totten/lurkerlite` 1.3 is a fork of `henrikbjorn/lurker` 1.2.  It primarily aims to address dependency-management
+  issues which have been outstanding for multiple years -- and also to merge some of the PR backlog.
+
+  This revision should be a drop-in replacement *unless* you customize the event-dispatcher. Compare:
+
+  * __Default dispatch__: By default, `ResourceWatcher` creates its own internal event-dispatcher.
+    If you use this default, then the update should be a drop-in replacement.
+  * __Custom dispatch__: The `ResourceWatcher` previously accepted an optional argument based on
+    `\Symfony\Component\EventDispatcher\EventDispatcherInterface`.  This may have been useful for glueing into another
+    dispatcher/application.  This also makes `lurker` a dependency-bottleneck, and it is not supported by `lurkerlite`. 
+    If a system attempts to use a Symfony `EventDispatcher`, `lurkerlite` will ignore it and emit a warning
+    (`E_USER_DEPRECATED`).
+
+  If you need to bridge `lurker` with another event system, then here is an alternative technique: subscribe to the
+  wildcard event (`all`) and pass it to your preferred dispatcher.  This technique should work equally well on
+  `lurker` or `lurkerlite`, and it should work with diverse event systems.  Pseudocode:
+
+      ```php
+      $w = new \Lurker\ResourceWatcher();
+      $w->addListener('all', function(\Lurker\Event\FilesystemEvent $e) use ($myDispatcher) {
+        $myEventName = 'resource_watcher.' . $e->getTrackedResource()->getTrackingId();
+        $myEvent = new MyFilesystemEvent($e->getResource(), ...);
+        $myDispatcher->dispatch($myEventName, $myEvent);
+      });
+      ```
+
+  More detailed list of changes:
+
+  * Update Travis test matrix to more contemporary PHP builds
+  * Remove dependency on `symfony/config` (https://github.com/flint/Lurker/pull/22)
+  * Remove dependency on `symfony/event-dispatcher`. (This is an alternative
+    to https://github.com/flint/Lurker/pull/29 or https://github.com/flint/Lurker/pull/31.)
+  * Use autoload-dev rather than manually adding the tests directory (https://github.com/flint/Lurker/pull/23)
+  * Update branch-alias (https://github.com/flint/Lurker/pull/26)
+  * Use `RecursiveIteratorTracker` as the default -- effectively disabling `InotifyTracker`
+    (unless you specifically opt into it). `InotifyTrackerTest` has been reporting failures (eg https://github.com/flint/Lurker/pull/24 and
+    https://github.com/flint/Lurker/issues/32).  The reason is unclear, but it is not any kind of obvious,
+    bisectable cause. (Perhaps it was an upstream change in PHP, pecl/inotify, or Linux? Or perhaps it never
+    fully worked?) Turn it off until someone figures out how to fix it.
diff --git a/civicrm/vendor/totten/lurkerlite/LICENSE b/civicrm/vendor/totten/lurkerlite/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..a369d6b8ffd85d6adcad3d60d2e1c50faeb2d3c7
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2013 Konstantin Kudryashov & Henrik Bjornskov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/civicrm/vendor/totten/lurkerlite/README.md b/civicrm/vendor/totten/lurkerlite/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..f7c3efac440710b4907ae964ea757ae5097cd7eb
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/README.md
@@ -0,0 +1,82 @@
+# Lurkerlite
+
+Lurkerlite provides PHP utilities for monitoring files and directories for changes.  It is a fork of
+[henrikbjorn/lurker](https://github.com/flint/Lurker/).
+
+[![Build Status](https://travis-ci.com/totten/Lurker.svg?branch=master)](https://travis-ci.com/totten/Lurker)
+
+## Usage
+
+Use `composer` to install the package:
+
+``` bash
+composer require totten/lurkerlite
+```
+
+Lurker works by giving the resource watcher a tracking id which is the name of the event and a path to
+the resource you want to track.
+
+When all the resources have been added that should be track you would want to add event listeners for them so
+your can act when the resources are changed.
+
+``` php
+<?php
+
+use Lurker\Event\FilesystemEvent;
+use Lurker\ResourceWatcher;
+
+$watcher = new ResourceWatcher;
+$watcher->track('twig.templates', '/path/to/views');
+
+$watcher->addListener('twig.templates', function (FilesystemEvent $event) {
+    echo $event->getResource() . 'was' . $event->getTypeString();
+});
+
+$watcher->start();
+```
+
+The above example would watch for all events `create`, `delete` and `modify`. This can be controlled by passing a 
+third parameter to `track()`.
+
+``` php
+<?php
+
+$watcher->track('twig.templates', '/path/to/views', FilesystemEvent::CREATE);
+$watcher->track('twig.templates', '/path/to/views', FilesystemEvent::MODIFY);
+$watcher->track('twig.templates', '/path/to/views', FilesystemEvent::DELETE);
+$watcher->track('twig.templates', '/path/to/views', FilesystemEvent::ALL);
+```
+
+Note that `FilesystemEvent::ALL` is a special case and of course means it will watch for every type of event.
+
+## Comparison
+
+`totten/lurkerlite` v1.3 is a fork of [henrikbjorn/lurker](https://github.com/flint/Lurker/) v1.2.  The original
+`lurker` provides a portable `ResourceWatcher` which monitors files and directories.  Depending on operating-system and
+runtime support, it chooses a different backend driver for tracking files.  This is a great idea, and the
+implementation has lots of tests.
+
+The distinguishing characteristic of `lurkerlite` is that it has no formal dependencies on other packages, which means it is:
+
+* Less prone to version conflicts and stale dependencies
+* Safer to embed in more contexts
+
+`lurkerlite` should be a drop-in replacement for `lurker` *unless* you previously customized the event-dispatcher.  If
+you customized the event-dispatcher, see [CHANGELOG.md](CHANGELOG.md).
+
+## Known Issues (*Patch-welcome*)
+
+Lurker is designed to support multiple file-watching backends, most notably:
+
+* `RecursiveIteratorTracker`: A portable (but less-efficient) backend based on filesystem polling.
+* `InotifyTracker`: A more efficient backend based on the Linux `inotify` API and PECL's `inotify` extension.
+
+At time of writing, `InotifyTracker` does not pass its tests, and the cause has not been determined.  (Did it ever
+work?  Does it only work in certain environments?) Consequently, it is disabled by default in the stable release.
+(To use the unstable implementation, call `new ResourceWatcher(new InotifyTracker())`.
+
+See also:
+
+* `\Lurker\Tests\Tracker\TrackerTest::testMoveSubdirResource()`
+* `\Lurker\Tests\Tracker\InotifyTrackerTest::testMoveSubdirResource()`
+* https://github.com/flint/Lurker/issues/32
diff --git a/civicrm/vendor/totten/lurkerlite/composer.json b/civicrm/vendor/totten/lurkerlite/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..c8595540ced64374cec26d034c6659227bf12b2e
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/composer.json
@@ -0,0 +1,45 @@
+{
+    "name"        : "totten/lurkerlite",
+    "type"        : "library",
+    "description" : "Resource Watcher - Lightweight edition of henrikbjorn/lurker with no dependencies",
+    "keywords"    : ["resource", "filesystem", "watching"],
+    "license"     : "MIT",
+
+    "authors" : [
+        {
+            "name"  : "Konstantin Kudryashov",
+            "email" : "ever.zet@gmail.com"
+        },
+        {
+            "name"  : "Yaroslav Kiliba",
+            "email" : "om.dattaya@gmail.com"
+        },
+        {
+            "name"  : "Henrik Bjrnskov",
+            "email" : "henrik@bjrnskov.dk"
+        }
+    ],
+
+    "require" : {
+        "php"                      : ">=5.3.3"
+    },
+
+    "autoload" : {
+        "psr-0" : { "Lurker": "src" }
+    },
+    "autoload-dev": {
+        "psr-0" : { "Lurker\\Tests": "tests" }
+    },
+    "replace" : {
+        "henrikbjorn/lurker": "*"
+    },
+    "suggest" : {
+        "ext-inotify": ">=0.1.6"
+    },
+
+    "extra" : {
+        "branch-alias" : {
+            "dev-master" : "1.3.x-dev"
+        }
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/composer.lock b/civicrm/vendor/totten/lurkerlite/composer.lock
new file mode 100644
index 0000000000000000000000000000000000000000..0b8f5d765de8cbea82b85e8da43c68d3985360c6
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/composer.lock
@@ -0,0 +1,19 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "b067bf4a6861177f634df0bb0c3e5a95",
+    "packages": [],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=5.3.3"
+    },
+    "platform-dev": []
+}
diff --git a/civicrm/vendor/totten/lurkerlite/mkdocs.yml b/civicrm/vendor/totten/lurkerlite/mkdocs.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4d8eadb71d2304ad31ccd32e630cc8ec595e1b12
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/mkdocs.yml
@@ -0,0 +1,7 @@
+site_name: Lurker
+theme: readthedocs
+repo_url: https://github.com/flint/Lurker
+
+markdown_extensions:
+  - toc:
+      permalink: true
diff --git a/civicrm/vendor/totten/lurkerlite/phpunit.xml.dist b/civicrm/vendor/totten/lurkerlite/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..ea1d8a7aa73cf5fa060f181293a6f3babec1ae52
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/phpunit.xml.dist
@@ -0,0 +1,22 @@
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         bootstrap="tests/bootstrap.php">
+
+    <testsuites>
+        <testsuite name="Lurker TestSuite">
+            <directory>./tests/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>src</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Event/FilesystemEvent.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Event/FilesystemEvent.php
new file mode 100644
index 0000000000000000000000000000000000000000..fdc5b771631923b145bc4ecbd48653e773268c20
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Event/FilesystemEvent.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Lurker\Event;
+
+/**
+ * Resource change event.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class FilesystemEvent
+{
+    const CREATE = 1;
+    const MODIFY = 2;
+    const DELETE = 4;
+    const ALL    = 7;
+
+    use FilesystemEventTrait;
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Event/FilesystemEventTrait.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Event/FilesystemEventTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..e208907a47ec8b2b3ce4f401e7988557bedf14db
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Event/FilesystemEventTrait.php
@@ -0,0 +1,100 @@
+<?php
+namespace Lurker\Event;
+
+use Lurker\Resource\TrackedResource;
+use Lurker\Exception\InvalidArgumentException;
+use Lurker\Resource\ResourceInterface;
+use Lurker\Resource\FileResource;
+use Lurker\Resource\DirectoryResource;
+
+trait FilesystemEventTrait
+{
+
+    private $tracked;
+    private $resource;
+    private $type;
+
+    protected static $types = array(
+    1 => 'create',
+    2 => 'modify',
+    4 => 'delete',
+    );
+
+  /**
+   * Initializes resource event.
+   *
+   * @param TrackedResource   $tracked  resource, that being tracked
+   * @param ResourceInterface $resource resource instance
+   * @param integer           $type     event type bit
+   */
+    public function __construct(TrackedResource $tracked, ResourceInterface $resource, $type)
+    {
+        if (!isset(self::$types[$type])) {
+            throw new InvalidArgumentException('Wrong event type providen');
+        }
+
+        $this->tracked  = $tracked;
+        $this->resource = $resource;
+        $this->type     = $type;
+    }
+
+  /**
+   * Returns resource, that being tracked while event occured.
+   *
+   * @return int
+   */
+    public function getTrackedResource()
+    {
+        return $this->tracked;
+    }
+
+  /**
+   * Returns changed resource.
+   *
+   * @return ResourceInterface
+   */
+    public function getResource()
+    {
+        return $this->resource;
+    }
+
+  /**
+   * Returns true is resource, that fired event is file.
+   *
+   * @return Boolean
+   */
+    public function isFileChange()
+    {
+        return $this->resource instanceof FileResource;
+    }
+
+  /**
+   * Returns true is resource, that fired event is directory.
+   *
+   * @return Boolean
+   */
+    public function isDirectoryChange()
+    {
+        return $this->resource instanceof DirectoryResource;
+    }
+
+  /**
+   * Returns event type.
+   *
+   * @return integer
+   */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+  /**
+   * Returns event type string representation.
+   *
+   * @return string
+   */
+    public function getTypeString()
+    {
+        return self::$types[$this->getType()];
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/EventDispatcher/EventDispatcher.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/EventDispatcher/EventDispatcher.php
new file mode 100644
index 0000000000000000000000000000000000000000..e37f71fbc1a13eb0b97fdbdad9fa110c65bf13bf
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/EventDispatcher/EventDispatcher.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Lurker\EventDispatcher;
+
+/**
+ * Class EventDispatcher
+ * @package Lurker
+ *
+ * This EventDispatcher supports a strict subset of the contract in
+ * Symfony (v2/3) EventDispatcher.
+ */
+class EventDispatcher implements EventDispatcherInterface
+{
+
+    /**
+     * @var array
+     *
+     * $listeners['event-name'][$int] = $callable;
+     */
+    protected $listeners = [];
+
+    public function addListener($eventName, $listener)
+    {
+        $this->listeners[$eventName][] = $listener;
+    }
+
+    public function dispatch($eventName, $event = null)
+    {
+        $listeners = isset($this->listeners[$eventName]) ? $this->listeners[$eventName] : [];
+        foreach ($listeners as $listener) {
+            \call_user_func($listener, $event, $eventName, $this);
+        }
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/EventDispatcher/EventDispatcherInterface.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/EventDispatcher/EventDispatcherInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..31110c524060e8518eac4381de83cb7da9855b78
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/EventDispatcher/EventDispatcherInterface.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Lurker\EventDispatcher;
+
+/**
+ * Interface EventDispatcherInterface
+ * @package Lurker
+ *
+ * This is a strict subset of Symfony 2/3 "EventDispatcherInterface".
+ */
+interface EventDispatcherInterface
+{
+    public function dispatch($eventName, $event = null);
+
+    public function addListener($eventName, $listener);
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Exception/ExceptionInterface.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Exception/ExceptionInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..9beacfd9e9c5965751f9dfa1de03cd4b7fcd7d89
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Exception/ExceptionInterface.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Lurker\Exception;
+
+/**
+ * Exception interface for all exceptions thrown by the component.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+interface ExceptionInterface
+{
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Exception/InvalidArgumentException.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000000000000000000000000000000000000..3cada8c76d673ed55b8ad5dd26ab3f3ee304c991
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Exception/InvalidArgumentException.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Lurker\Exception;
+
+use \InvalidArgumentException as BaseInvalidArgumentException;
+
+/**
+ * InvalidArgumentException
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface
+{
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Exception/RuntimeException.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Exception/RuntimeException.php
new file mode 100644
index 0000000000000000000000000000000000000000..74d25782f9007f397ba7f90d67169dc5136e3681
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Exception/RuntimeException.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Lurker\Exception;
+
+use \RuntimeException as BaseRuntimeException;
+
+/**
+ * RuntimeException
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ */
+class RuntimeException extends BaseRuntimeException implements ExceptionInterface
+{
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/DirectoryResource.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/DirectoryResource.php
new file mode 100644
index 0000000000000000000000000000000000000000..3de001f4712534084568764a03c14854dbb64957
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/DirectoryResource.php
@@ -0,0 +1,152 @@
+<?php
+
+namespace Lurker\Resource;
+
+use Lurker\Exception\InvalidArgumentException;
+
+/**
+ * @package Lurker
+ */
+class DirectoryResource implements ResourceInterface
+{
+    /**
+     * @var string
+     */
+    private $resource;
+
+    /**
+     * @var string|null
+     */
+    private $pattern;
+
+    /**
+     * @param string $resource
+     * @param string|null $pattern
+     */
+    public function __construct($resource, $pattern = null)
+    {
+        $this->resource = realpath($resource);
+        $this->pattern = $pattern;
+
+        if (false === $this->resource || !is_dir($this->resource)) {
+            throw new InvalidArgumentException(sprintf('The directory "%s" does not exist.', $resource));
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function getResource()
+    {
+        return $this->resource;
+    }
+
+    /**
+     * @return string
+     */
+    public function getPattern()
+    {
+        return $this->pattern;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return md5(serialize(array($this->resource, $this->pattern)));
+    }
+
+    public function exists()
+    {
+        clearstatcache(true, $resource = $this->getResource());
+
+        return is_dir($resource);
+    }
+
+    public function getModificationTime()
+    {
+        if (!$this->exists()) {
+            return -1;
+        }
+
+        clearstatcache(true, $this->getResource());
+        if (false === $mtime = @filemtime($this->getResource())) {
+            return -1;
+        }
+
+        return $mtime;
+    }
+
+    public function isFresh($timestamp)
+    {
+        if (!$this->exists()) {
+            return false;
+        }
+
+        return $this->getModificationTime() < $timestamp;
+    }
+
+    public function getId()
+    {
+        return md5('d' . $this . $this->getPattern());
+    }
+
+    public function hasFile($file)
+    {
+        if (!$file instanceof \SplFileInfo) {
+            $file = new \SplFileInfo($file);
+        }
+
+        if (0 !== strpos($file->getRealPath(), realpath($this->getResource()))) {
+            return false;
+        }
+
+        if ($this->getPattern()) {
+            return (bool) preg_match($this->getPattern(), $file->getBasename());
+        }
+
+        return true;
+    }
+
+    public function getFilteredResources()
+    {
+        if (!$this->exists()) {
+            return array();
+        }
+
+        // race conditions
+        try {
+            $iterator = new \DirectoryIterator($this->getResource());
+        } catch (\UnexpectedValueException $e) {
+            return array();
+        }
+
+        $resources = array();
+        foreach ($iterator as $file) {
+            // if regex filtering is enabled only return matching files
+            if ($file->isFile() && !$this->hasFile($file)) {
+                continue;
+            }
+
+            // always monitor directories for changes, except the .. entries
+            // (otherwise deleted files wouldn't get detected)
+            if ($file->isDir() && '/..' === substr($file, -3)) {
+                continue;
+            }
+
+            // if file is dot - continue
+            if ($file->isDot()) {
+                continue;
+            }
+
+            if ($file->isFile()) {
+                $resources[] = new FileResource($file->getRealPath());
+            } elseif ($file->isDir()) {
+                $resources[] = new DirectoryResource($file->getRealPath());
+            }
+        }
+
+        return $resources;
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/FileResource.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/FileResource.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac595e9e182cfaea7ca56a54342316c14ad08486
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/FileResource.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Lurker\Resource;
+
+use Lurker\Exception\InvalidArgumentException;
+
+/**
+ * @package Lurker
+ */
+class FileResource implements ResourceInterface
+{
+    /**
+     * @var string
+     */
+    private $resource;
+
+    /**
+     * @param string $resource
+     */
+    public function __construct($resource)
+    {
+        $this->resource = realpath($resource);
+
+        if (false === $this->resource && file_exists($resource)) {
+            $this->resource = $resource;
+        }
+
+        if (false === $this->resource) {
+            throw new InvalidArgumentException(sprintf('The file "%s" does not exist.', $resource));
+        }
+    }
+
+    /**
+     * @return string
+     */
+    public function getResource()
+    {
+        return $this->resource;
+    }
+
+    /**
+     * @return string
+     */
+    public function __toString()
+    {
+        return $this->resource;
+    }
+
+    public function getModificationTime()
+    {
+        if (!$this->exists()) {
+            return -1;
+        }
+
+        clearstatcache(true, $this->getResource());
+        if (false === $mtime = @filemtime($this->getResource())) {
+            return -1;
+        }
+
+        return $mtime;
+    }
+
+    public function getId()
+    {
+        return md5('f' . $this);
+    }
+
+    public function isFresh($timestamp)
+    {
+        if (!$this->exists()) {
+            return false;
+        }
+
+        return $this->getModificationTime() < $timestamp;
+    }
+
+    public function exists()
+    {
+        clearstatcache(true, $this->getResource());
+
+        return is_file($this);
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/ResourceInterface.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/ResourceInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..776461e55b0bdae1b3a15488ecbf84d27c903885
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/ResourceInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Lurker\Resource;
+
+/**
+ * @package Lurker
+ */
+interface ResourceInterface
+{
+    /**
+     * @return boolean
+     */
+    public function exists();
+
+    /**
+     * @return integer
+     */
+    public function getModificationTime();
+
+    /**
+     * @return string
+     */
+    public function getId();
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/TrackedResource.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/TrackedResource.php
new file mode 100644
index 0000000000000000000000000000000000000000..41a2525782cefae09ad4f164bb60e20d824a39a8
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Resource/TrackedResource.php
@@ -0,0 +1,54 @@
+<?php
+
+namespace Lurker\Resource;
+
+use Lurker\Exception\InvalidArgumentException;
+
+/**
+ * Wraps usual resource with tracker information.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class TrackedResource
+{
+    private $trackingId;
+    private $resource;
+
+    /**
+     * Initializes tracked resource.
+     *
+     * @param string            $trackingId id of the tracked resource
+     * @param ResourceInterface $resource   resource
+     */
+    public function __construct($trackingId, ResourceInterface $resource)
+    {
+        if (!$resource->exists()) {
+            throw new InvalidArgumentException(sprintf(
+                'Unable to track a non-existent resource (%s)', $resource
+            ));
+        }
+
+        $this->trackingId = $trackingId;
+        $this->resource   = $resource;
+    }
+
+    /**
+     * Returns tracking ID of the resource.
+     *
+     * @return string
+     */
+    public function getTrackingId()
+    {
+        return $this->trackingId;
+    }
+
+    /**
+     * Returns original resource instance.
+     *
+     * @return ResourceInterface
+     */
+    public function getOriginalResource()
+    {
+        return $this->resource;
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/ResourceWatcher.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/ResourceWatcher.php
new file mode 100644
index 0000000000000000000000000000000000000000..a0f2a3bb08ab822e5f839d7f5aa707ff1c5ad4f2
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/ResourceWatcher.php
@@ -0,0 +1,210 @@
+<?php
+
+namespace Lurker;
+
+use Lurker\Event\FilesystemEvent;
+use Lurker\Exception\InvalidArgumentException;
+use Lurker\Resource\DirectoryResource;
+use Lurker\Resource\FileResource;
+use Lurker\Resource\ResourceInterface;
+use Lurker\Resource\TrackedResource;
+use Lurker\Tracker\InotifyTracker;
+use Lurker\Tracker\RecursiveIteratorTracker;
+use Lurker\Tracker\TrackerInterface;
+use Lurker\EventDispatcher\EventDispatcher;
+use Lurker\EventDispatcher\EventDispatcherInterface;
+
+/**
+ * Resource changes watcher.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class ResourceWatcher
+{
+    private $tracker;
+
+    /**
+     * @var EventDispatcherInterface|null
+     */
+    private $eventDispatcher;
+    private $watching = false;
+
+    /**
+     * Initializes path watcher.
+     *
+     * @param TrackerInterface         $tracker
+     * @param EventDispatcherInterface $eventDispatcher
+     */
+    public function __construct(TrackerInterface $tracker = null, $eventDispatcher = null)
+    {
+        if (null === $tracker) {
+            // TODO: Re-enable InotifyTracker when it's passing its tests.
+            $tracker = new RecursiveIteratorTracker();
+            //if (function_exists('inotify_init')) {
+            //    $tracker = new InotifyTracker();
+            //} else {
+            //    $tracker = new RecursiveIteratorTracker();
+            //}
+        }
+
+        if ($eventDispatcher instanceof \Symfony\Component\EventDispatcher\EventDispatcherInterface) {
+            trigger_error(
+                'In lurkerlite, the ResourceWatcher does not support Symfony EventDispatcher.'
+                . ' See CHANGELOG for upgrade guidance.',
+                E_USER_DEPRECATED
+            );
+            $eventDispatcher = new EventDispatcher();
+        }
+
+        if (null === $eventDispatcher) {
+            $eventDispatcher = new EventDispatcher();
+        }
+
+        $this->tracker         = $tracker;
+        $this->eventDispatcher = $eventDispatcher;
+    }
+
+    /**
+     * Returns current tracker instance.
+     *
+     * @return TrackerInterface
+     */
+    public function getTracker()
+    {
+        return $this->tracker;
+    }
+
+    /**
+     * Returns event dispatcher mapped to this tracker.
+     *
+     * @return EventDispatcherInterface
+     */
+    public function getEventDispatcher()
+    {
+        return $this->eventDispatcher;
+    }
+
+    /**
+     * Track resource with watcher.
+     *
+     * @param string                   $trackingId id to this track (used for events naming)
+     * @param ResourceInterface|string $resource   resource to track
+     * @param integer                  $eventsMask event types bitmask
+     *
+     * @throws InvalidArgumentException If 'all' is used as a tracking id
+     */
+    public function track($trackingId, $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        if ('all' === $trackingId) {
+            throw new InvalidArgumentException(
+                '"all" is a reserved keyword and can not be used as tracking id'
+            );
+        }
+
+        if (!$resource instanceof ResourceInterface) {
+            if (is_file($resource)) {
+                $resource = new FileResource($resource);
+            } elseif (is_dir($resource)) {
+                $resource = new DirectoryResource($resource);
+            } else {
+                throw new InvalidArgumentException(sprintf(
+                    'Second argument to track() should be either file or directory resource, '.
+                    'but got "%s"',
+                    $resource
+                ));
+            }
+        }
+
+        $trackedResource = new TrackedResource($trackingId, $resource);
+        $this->getTracker()->track($trackedResource, $eventsMask);
+    }
+
+    /**
+     * Adds callback as specific tracking listener.
+     *
+     * @param string   $trackingId id to this track (used for events naming)
+     * @param callable $callback   callback to call on change
+     *
+     * @throws InvalidArgumentException If $callback argument isn't callable
+     */
+    public function addListener($trackingId, $callback)
+    {
+        if (!is_callable($callback)) {
+            throw new InvalidArgumentException(sprintf(
+                'Second argument to listen() should be callable, but got %s', gettype($callback)
+            ));
+        }
+
+        $this->getEventDispatcher()->addListener('resource_watcher.'.$trackingId, $callback);
+    }
+
+    /**
+     * Tracks specific resource change by provided callback.
+     *
+     * @param ResourceInterface|string $resource   resource to track
+     * @param callable                 $callback   callback to call on change
+     * @param integer                  $eventsMask event types bitmask
+     */
+    public function trackByListener($resource, $callback, $eventsMask = FilesystemEvent::ALL)
+    {
+        $this->track($trackingId = md5((string) $resource.$eventsMask), $resource, $eventsMask);
+        $this->addListener($trackingId, $callback);
+    }
+
+    /**
+     * Returns true if watcher is currently watching on tracked resources (started).
+     *
+     * @return Boolean
+     */
+    public function isWatching()
+    {
+        return $this->watching;
+    }
+
+    /**
+     * Starts watching on tracked resources.
+     *
+     * @param integer $checkInterval check interval in microseconds
+     * @param integer $timeLimit     maximum watching time limit in microseconds
+     */
+    public function start($checkInterval = 1000000, $timeLimit = null)
+    {
+        $totalTime = 0;
+        $this->watching = true;
+
+        while ($this->watching) {
+            usleep($checkInterval);
+            $totalTime += $checkInterval;
+
+            if (null !== $timeLimit && $totalTime > $timeLimit) {
+                break;
+            }
+
+            foreach ($this->getTracker()->getEvents() as $event) {
+                $trackedResource = $event->getTrackedResource();
+
+                // fire global event
+                $this->getEventDispatcher()->dispatch(
+                    'resource_watcher.all',
+                    $event
+                );
+
+                // fire specific trackingId event
+                $this->getEventDispatcher()->dispatch(
+                    sprintf('resource_watcher.%s', $trackedResource->getTrackingId()),
+                    $event
+                );
+            }
+        }
+
+        $this->watching = false;
+    }
+
+    /**
+     * Stop watching on tracked resources.
+     */
+    public function stop()
+    {
+        $this->watching = false;
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/DirectoryStateChecker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/DirectoryStateChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..35c906f67504ec3e21a09dd69e43d6f0f1c5eb07
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/DirectoryStateChecker.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Lurker\StateChecker;
+
+use Lurker\Event\FilesystemEvent;
+use Lurker\Resource\DirectoryResource;
+
+/**
+ * Recursive directory state checker.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class DirectoryStateChecker extends NewDirectoryStateChecker
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function __construct(DirectoryResource $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        parent::__construct($resource, $eventsMask);
+
+        foreach ($this->createDirectoryChildCheckers($resource) as $checker) {
+            $this->childs[$checker->getResource()->getId()] = $checker;
+        }
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/FileStateChecker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/FileStateChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..acf133780dfad8a9a9501c46b0c3342c4324f585
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/FileStateChecker.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Lurker\StateChecker;
+
+use Lurker\Resource\FileResource;
+use Lurker\Event\FilesystemEvent;
+
+/**
+ * File state checker.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class FileStateChecker extends ResourceStateChecker
+{
+    /**
+     * Initializes checker.
+     *
+     * @param FileResource $resource
+     * @param integer      $eventsMask event types bitmask
+     */
+    public function __construct(FileResource $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        parent::__construct($resource, $eventsMask);
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/CheckerBag.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/CheckerBag.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab4360b6c74d1055b7f783c4239cdef5958e2149
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/CheckerBag.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Lurker\StateChecker\Inotify;
+
+/**
+ * Bag for the inotify resource state checkers.
+ *
+ * @author Yaroslav Kiliba <om.dattaya@gmail.com>
+ */
+class CheckerBag
+{
+    /**
+     * @var \SplObjectStorage[]
+     */
+    protected $watched = array();
+
+    /**
+     * @var resource Inotify resource.
+     */
+    private $inotify;
+
+    /**
+     * Initializes bag.
+     *
+     * @param resource $inotify Inotify resource
+     */
+    public function __construct($inotify)
+    {
+        $this->inotify = $inotify;
+    }
+
+    /**
+     * Adds state checker to the bag.
+     *
+     * @param ResourceStateChecker $watched
+     */
+    public function add(ResourceStateChecker $watched)
+    {
+        $id = $watched->getId();
+        if (!isset($this->watched[$id])) {
+            $this->watched[$id] = new \SplObjectStorage();
+        }
+
+        $this->watched[$id]->attach($watched);
+    }
+
+    /**
+     * Returns state checker from the bag
+     *
+     * @param int $id Watch descriptor
+     *
+     * @return \SplObjectStorage|array
+     */
+    public function get($id)
+    {
+        return isset($this->watched[$id]) ? $this->watched[$id] : array();
+    }
+
+    /**
+     * Checks whether at least one state checker with id $id exists.
+     *
+     * @param int $id Watch descriptor
+     *
+     * @return bool
+     */
+    public function has($id)
+    {
+        return isset($this->watched[$id]) && 0 !== $this->watched[$id]->count();
+    }
+
+    /**
+     * @return resource Inotify resource
+     */
+    public function getInotify()
+    {
+        return $this->inotify;
+    }
+
+    /**
+     * Removes state checker from the bag
+     *
+     * @param ResourceStateChecker $watched
+     */
+    public function remove(ResourceStateChecker $watched)
+    {
+        $this->watched[$watched->getId()]->detach($watched);
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/DirectoryStateChecker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/DirectoryStateChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..a597b261e9c682f49d662bd3215fde2986d893a1
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/DirectoryStateChecker.php
@@ -0,0 +1,305 @@
+<?php
+
+namespace Lurker\StateChecker\Inotify;
+
+use Lurker\Resource\DirectoryResource;
+use Lurker\Resource\FileResource;
+use Lurker\Event\FilesystemEvent;
+
+/**
+ * Directory state checker.
+ *
+ * @author Yaroslav Kiliba <om.dattaya@gmail.com>
+ */
+class DirectoryStateChecker extends ResourceStateChecker
+{
+    /**
+     * @var DirectoryStateChecker[]
+     */
+    protected $directories = array();
+
+    /**
+     * @var FileResource[]
+     */
+    protected $files = array();
+
+    /**
+     * @var array File inotify events
+     */
+    protected $fileEvents = array();
+
+    /**
+     * @var array Dir inotify events
+     */
+    protected $dirEvents = array();
+
+    /**
+     * @var array It is used to track resource moving
+     * @see DirectoryStateChecker::trackMoveEvent()
+     */
+    protected $movedResources = array();
+
+    /**
+     * @var string Key in the $movedResources array where to put name of the resource from next following move event.
+     * @see DirectoryStateChecker::trackMoveEvent()
+     */
+    protected $lastMove;
+
+    /**
+     * @var bool
+     */
+    protected $isNew = false;
+
+    /**
+     * Initializes checker.
+     *
+     * @param CheckerBag        $bag
+     * @param DirectoryResource $resource
+     * @param int               $eventsMask
+     */
+    public function __construct(CheckerBag $bag, DirectoryResource $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        parent::__construct($bag, $resource, $eventsMask);
+
+        $this->createChildCheckers();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setEvent($mask, $name = '')
+    {
+        if ($this->isDir($mask)) {
+            if (0 !== (IN_ATTRIB & $mask)) {
+                return;
+            }
+            $this->dirEvents[$name] = $mask;
+        } else {
+            $this->fileEvents[$name] = $mask;
+        }
+        $this->trackMoveEvent($mask, $name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getChangeset()
+    {
+        $this->event = isset($this->fileEvents['']) ? $this->fileEvents[''] : null;
+        unset($this->fileEvents['']);
+
+        $this->handleItself();
+
+        $changeset = array();
+        if ($this->event) {
+            if ($event = $this->fromInotifyMask($this->event)) {
+                $changeset[] = array(
+                    'resource' => $this->getResource(),
+                    'event'    => $event
+                );
+            }
+
+            if ($this->isDeleted($this->event)) {
+                $this->fileEvents = array_fill_keys(array_keys($this->files), IN_DELETE);
+                $this->dirEvents  = array_fill_keys(array_keys($this->directories), IN_DELETE);
+                $this->getBag()->remove($this);
+                $this->id = null;
+            }
+        }
+        $deleted = array();
+
+        foreach ($this->movedResources as $key => $value) {
+            if ($key === $value) {
+                unset($this->dirEvents[$key]);
+                unset($this->fileEvents[$key]);
+            }
+        }
+
+        foreach ($this->dirEvents as $name => $event) {
+            $normalized = $this->normalizeEvent($event);
+            if (isset($this->directories[$name])) {
+                $this->directories[$name]->setEvent($normalized);
+                if ($this->isDeleted($normalized)) {
+                    $deleted[] = $this->directories[$name];
+                    unset($this->directories[$name]);
+                }
+            } elseif (!$this->isDeleted($normalized)) {
+                $this->createNewDirectoryChecker($name);
+            }
+        }
+
+        foreach ($this->fileEvents as $name => $event) {
+            $normalized = $this->normalizeFileEvent($event, $name);
+            if (($event = $this->fromInotifyMask($normalized)) && $this->files[$name] instanceof FileResource) {
+                $changeset[] =
+                    array(
+                        'resource' => $this->files[$name],
+                        'event'    => $event
+                    );
+            }
+            if ($this->isDeleted($normalized)) {
+                unset($this->files[$name]);
+            }
+        }
+
+        $funct = function($checker) use (&$changeset) {
+            foreach ($checker->getChangeset() as $change) {
+                $changeset[] = $change;
+            }
+        };
+
+        array_walk($this->directories, $funct);
+        array_walk($deleted, $funct);
+
+        $this->dirEvents = $this->fileEvents = $this->movedResources = array();
+        $this->event     = null;
+
+        return $changeset;
+    }
+
+    /**
+     * Tracks move event. It is for situation when resource was roundtripped, e.g.
+     * rename('dir', 'dir_new'); rename('dir_new', 'dir'). As a result no events should be returned.
+     * This function just keeps track of the move events, and they're analyzed in the getChangeset method.
+     *
+     * @param int    $mask
+     * @param string $name
+     */
+    protected function trackMoveEvent($mask, $name)
+    {
+        if ($this->isMovedFrom($mask)) {
+            if ($key = array_search($name, $this->movedResources)) {
+                $this->lastMove = $key;
+            } else {
+                $this->lastMove = $name;
+            }
+        } elseif ($this->isMovedTo($mask)) {
+            $this->movedResources[$this->lastMove] = $name;
+        } elseif ($key = array_search($name, $this->movedResources)) {
+            unset($this->movedResources[$key]);
+        }
+    }
+
+    /**
+     * Handles event related to itself.
+     */
+    protected function handleItself()
+    {
+        if (!$this->isNew && $this->isCreated($this->event)) {
+            $this->unwatch($this->id);
+            $this->reindexChildCheckers();
+            $this->event = null;
+        }
+        $this->isNew = false;
+    }
+
+    /**
+     * Reads files and subdirectories and transforms them to resources.
+     */
+    protected function createChildCheckers()
+    {
+        foreach ($this->getResource()->getFilteredResources() as $resource) {
+            $resource instanceof DirectoryResource
+                ? $this->directories[basename((string) $resource)] = new DirectoryStateChecker($this->getBag(), $resource, $this->getEventsMask())
+                : $this->files[basename((string) $resource)] = $resource;
+        }
+    }
+
+    /**
+     * Used in case the folder was deleted and than created again or situations like this.
+     * It rescans the folder, files that was before get IN_MODIFY event, folders - IN_CREATE - to make them to rescan itself
+     */
+    protected function reindexChildCheckers()
+    {
+        $this->fileEvents = array_fill_keys(array_keys($this->files), IN_DELETE);
+        $this->dirEvents  = array_fill_keys(array_keys($this->directories), IN_DELETE);
+        foreach ($this->getResource()->getFilteredResources() as $resource) {
+            $basename = basename((string) $resource);
+            if ($resource instanceof FileResource) {
+                if (isset($this->files[$basename])) {
+                    $this->fileEvents[$basename] = IN_MODIFY;
+                } else {
+                    $this->files[$basename] = $resource;
+                    $this->fileEvents[$basename] = 'new';
+                }
+            } else {
+                isset($this->directories[$basename])
+                    ? $this->dirEvents[$basename] = IN_CREATE
+                    : $this->createNewDirectoryChecker($basename, $resource);
+            }
+        }
+        $this->watch();
+    }
+
+    /**
+     * Normalizes file event
+     *
+     * @param int    $event
+     * @param string $name
+     *
+     * @return null|int
+     */
+    protected function normalizeFileEvent($event, $name)
+    {
+        if ('new' === $event) {
+            return IN_CREATE;
+        }
+
+        $event = $this->normalizeEvent($event);
+        if (isset($this->files[$name])) {
+            return $this->isCreated($event) ? IN_MODIFY : $event;
+        }
+        if (!$this->isDeleted($event)) {
+            $this->createFileResource($name);
+
+            return IN_CREATE;
+        }
+
+        return null;
+    }
+
+    /**
+     * Normalizes event
+     *
+     * @param int $event
+     *
+     * @return int
+     */
+    protected function normalizeEvent($event)
+    {
+        $event &= ~IN_ISDIR;
+        if (0 !== ($event & IN_MOVED_FROM)) {
+            return IN_DELETE;
+        } elseif (0 !== ($event & IN_MOVED_TO)) {
+            return IN_CREATE;
+        }
+
+        return $event;
+    }
+
+    /**
+     * Creates new DirectoryStateChecker
+     *
+     * @param string                 $name
+     * @param null|DirectoryResource $resource
+     */
+    protected function createNewDirectoryChecker($name, DirectoryResource $resource = null)
+    {
+        $resource = $resource ?: new DirectoryResource($this->getResource()->getResource().'/'.$name);
+        $this->directories[$name] = new NewDirectoryStateChecker($this->getBag(), $resource, $this->getEventsMask());
+    }
+
+    /**
+     * Creates new FileResource
+     *
+     * @param string $name
+     */
+    protected function createFileResource($name)
+    {
+        if ($this->getResource()->getPattern() && !preg_match($this->getResource()->getPattern(), $name)) {
+            $this->files[$name] = 'skip';
+        } else {
+            $this->files[$name] = new FileResource($this->getResource()->getResource().'/'.$name);
+        }
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/FileStateChecker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/FileStateChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..a15a1a48e9413308080be63da9d9c568008bf82f
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/FileStateChecker.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace Lurker\StateChecker\Inotify;
+
+use Lurker\Resource\FileResource;
+use Lurker\Event\FilesystemEvent;
+
+/**
+ * File state checker.
+ *
+ * @author Yaroslav Kiliba <om.dattaya@gmail.com>
+ */
+class FileStateChecker extends ResourceStateChecker
+{
+    /**
+     * Initializes checker.
+     *
+     * @param CheckerBag   $bag
+     * @param FileResource $resource
+     * @param int          $eventsMask
+     */
+    public function __construct(CheckerBag $bag, FileResource $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        parent::__construct($bag, $resource, $eventsMask);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function setEvent($mask, $name = '')
+    {
+        $this->event = $mask;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getChangeset()
+    {
+        $changeset = array();
+
+        $this->handleItself();
+
+        if ($this->fromInotifyMask($this->event)) {
+            $changeset[] =
+                array(
+                    'resource' => $this->getResource(),
+                    'event'    => $this->fromInotifyMask($this->event)
+                );
+        }
+        $this->setEvent(false);
+
+        return $changeset;
+    }
+
+    /**
+     * Handles event related to itself.
+     */
+    protected function handleItself()
+    {
+        if ($this->isMoved($this->event)) {
+            if ($this->getResource()->exists() && $this->addWatch() === $this->id) {
+                return;
+            }
+
+            $this->unwatch($this->id);
+        }
+
+        if ($this->getResource()->exists()) {
+            if ($this->isIgnored($this->event) || $this->isMoved($this->event) || !$this->id) {
+                $this->setEvent($this->id ? IN_MODIFY : IN_CREATE);
+                $this->watch();
+            }
+        } elseif ($this->id) {
+            $this->event = IN_DELETE;
+            $this->getBag()->remove($this);
+            $this->unwatch($this->id);
+            $this->id = null;
+        }
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/NewDirectoryStateChecker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/NewDirectoryStateChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..8b821ac51d3ceded9a22fa256ca8a2ff9629148d
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/NewDirectoryStateChecker.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Lurker\StateChecker\Inotify;
+
+use Lurker\Resource\DirectoryResource;
+use Lurker\Event\FilesystemEvent;
+
+/**
+ * Directory state checker. Sets for itself and children a flag that indicates newness.
+ *
+ * @author Yaroslav Kiliba <om.dattaya@gmail.com>
+ */
+class NewDirectoryStateChecker extends DirectoryStateChecker
+{
+    /**
+     * @var bool|null
+     */
+    protected $isNew = true;
+
+    /**
+     * Initializes checker.
+     *
+     * @param CheckerBag        $bag
+     * @param DirectoryResource $resource
+     * @param int               $eventsMask
+     */
+    public function __construct(CheckerBag $bag, DirectoryResource $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        $this->setEvent(IN_CREATE);
+        parent::__construct($bag, $resource, $eventsMask);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function createChildCheckers()
+    {
+        foreach ($this->getResource()->getFilteredResources() as $resource) {
+            $basename = basename((string) $resource);
+            if ($resource instanceof DirectoryResource) {
+                $this->createNewDirectoryChecker($basename, $resource);
+            } else {
+                $this->files[$basename] = $resource;
+                $this->fileEvents[$basename] = 'new';
+            }
+        }
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/ResourceStateChecker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/ResourceStateChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..46b7a1f5b53c0d53cfedaa57f5c96779c70784c8
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/ResourceStateChecker.php
@@ -0,0 +1,267 @@
+<?php
+
+namespace Lurker\StateChecker\Inotify;
+
+use Lurker\Event\FilesystemEvent;
+use Lurker\Resource\ResourceInterface;
+use Lurker\StateChecker\StateCheckerInterface;
+
+/**
+ * Abstract resource state checker.
+ *
+ * @author Yaroslav Kiliba <om.dattaya@gmail.com>
+ */
+abstract class ResourceStateChecker implements StateCheckerInterface
+{
+    /**
+     * @var int Watch descriptor
+     */
+    protected $id;
+
+    /**
+     * @var int Inotify event
+     */
+    protected $event;
+
+    /**
+     * @var CheckerBag
+     */
+    private $bag;
+
+    /**
+     * @var int
+     */
+    private $eventsMask;
+
+    /**
+     * @var ResourceInterface
+     */
+    private $resource;
+
+    /**
+     * Initializes checker.
+     *
+     * @param CheckerBag        $bag
+     * @param ResourceInterface $resource
+     * @param int               $eventsMask
+     */
+    public function __construct(CheckerBag $bag, ResourceInterface $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        $this->resource   = $resource;
+        $this->eventsMask = $eventsMask;
+        $this->bag = $bag;
+        $this->watch();
+    }
+
+    /**
+     * Returns tracked resource.
+     *
+     * @return ResourceInterface
+     */
+    public function getResource()
+    {
+        return $this->resource;
+    }
+
+    /**
+     * Returns watch descriptor
+     *
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
+
+    /**
+     * Allows to set event for resource itself or for child resources.
+     *
+     * @param int    $mask
+     * @param string $name
+     */
+    abstract public function setEvent($mask, $name = '');
+
+    /**
+     * Returns events mask for checker.
+     *
+     * @return int
+     */
+    protected function getEventsMask()
+    {
+        return $this->eventsMask;
+    }
+
+    /**
+     * @return CheckerBag
+     */
+    protected function getBag()
+    {
+        return $this->bag;
+    }
+
+    /**
+     * Starts to track current resource
+     */
+    protected function watch()
+    {
+        if ($this->id) {
+            $this->bag->remove($this);
+        }
+
+        $this->id = $this->addWatch();
+        $this->bag->add($this);
+    }
+
+    /**
+     * Watch resource
+     *
+     * @return int
+     */
+    protected function addWatch()
+    {
+        return inotify_add_watch($this->getBag()->getInotify(), $this->getResource()->getResource(), $this->getInotifyEventMask());
+    }
+
+    /**
+     * Unwatch resource
+     *
+     * @param int $id Watch descriptor
+     */
+    protected function unwatch($id)
+    {
+        @inotify_rm_watch($this->bag->getInotify(), $id);
+    }
+
+    /**
+     * Transforms inotify event to FilesystemEvent event
+     *
+     * @param int $mask
+     *
+     * @return bool|int Returns event only if the checker supports it.
+     */
+    protected function fromInotifyMask($mask)
+    {
+        $mask &= ~IN_ISDIR;
+        $event = 0;
+        switch ($mask) {
+            case (IN_MODIFY):
+            case (IN_ATTRIB):
+                $event =  FilesystemEvent::MODIFY;
+                break;
+            case (IN_CREATE):
+                $event =  FilesystemEvent::CREATE;
+                break;
+            case (IN_DELETE):
+            case (IN_IGNORED):
+                $event =  FilesystemEvent::DELETE;
+        }
+
+        return $this->supportsEvent($event) ? $event : false;
+    }
+
+    /**
+     * Checks whether checker supports provided resource event.
+     *
+     * @param int $event
+     *
+     * @return bool
+     */
+    protected function supportsEvent($event)
+    {
+        return 0 !== ($this->eventsMask & $event);
+    }
+
+    /**
+     * Inotify event mask for inotify_add_watch
+     *
+     * @return int
+     */
+    protected function getInotifyEventMask()
+    {
+        return IN_MODIFY | IN_ATTRIB | IN_DELETE | IN_CREATE | IN_MOVE | IN_MOVE_SELF;
+    }
+
+    /**
+     * Returns true if it is a directory mask
+     *
+     * @param int $mask
+     *
+     * @return bool
+     */
+    protected function isDir($mask)
+    {
+        return 0 !== ($mask & IN_ISDIR);
+    }
+
+    /**
+     * Returns true if it is a mask with a IN_DELETE bit active
+     *
+     * @param int $mask
+     *
+     * @return bool
+     */
+    protected function isDeleted($mask)
+    {
+        return 0 !== ($mask & IN_DELETE);
+    }
+
+    /**
+     * Returns true if it is a IN_IGNORED mask
+     *
+     * @param int $mask
+     *
+     * @return bool
+     */
+    protected function isIgnored($mask)
+    {
+        return IN_IGNORED === $mask;
+    }
+
+    /**
+     * Returns true if it is a IN_MOVE_SELF mask
+     *
+     * @param int $mask
+     *
+     * @return bool
+     */
+    protected function isMoved($mask)
+    {
+        return IN_MOVE_SELF === $mask;
+    }
+
+    /**
+     * Returns true if it is a mask with a IN_CREATE bit active
+     *
+     * @param int $mask
+     *
+     * @return bool
+     */
+    protected function isCreated($mask)
+    {
+        return 0 !== ($mask & IN_CREATE);
+    }
+
+    /**
+     * Returns true if it is a mask with a IN_MOVED_FROM bit active
+     *
+     * @param int $mask
+     *
+     * @return bool
+     */
+    protected function isMovedFrom($mask)
+    {
+        return 0 !== ($mask & IN_MOVED_FROM);
+    }
+
+    /**
+     * Returns true if it is a mask with a IN_MOVED_TO bit active
+     *
+     * @param int $mask
+     *
+     * @return bool
+     */
+    protected function isMovedTo($mask)
+    {
+        return 0 !== ($mask & IN_MOVED_TO);
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/TopDirectoryStateChecker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/TopDirectoryStateChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..f1fe7404b28fc3d4a104a56199046bc3c3959deb
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/Inotify/TopDirectoryStateChecker.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace Lurker\StateChecker\Inotify;
+
+/**
+ * Topmost directory state checker. Top directory - folder that was provided to InotifyTracker::track method.
+ *
+ * @author Yaroslav Kiliba <om.dattaya@gmail.com>
+ */
+class TopDirectoryStateChecker extends DirectoryStateChecker
+{
+    /**
+     * {@inheritdoc}
+     */
+    protected function handleItself()
+    {
+        if ($this->getResource()->exists()) {
+            if ($this->isMoved($this->event)) {
+                if ($this->id !== ($id = $this->addWatch())) {
+                    $this->unwatch($this->id);
+                    $this->reindexChildCheckers();
+                    if ($this->getBag()->has($id)) {
+                        $this->unwatch($id);
+                    }
+                }
+
+                return;
+            }
+            if ($this->isIgnored($this->event) || !$this->id) {
+                $this->event = $this->id ? null : IN_CREATE;
+                $this->reindexChildCheckers();
+            }
+        } elseif ($this->id) {
+            $this->event = IN_DELETE;
+            $this->unwatch($this->id);
+        }
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/NewDirectoryStateChecker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/NewDirectoryStateChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..79391a6c9faf90640e2e8fca9812110dc825d6f9
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/NewDirectoryStateChecker.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Lurker\StateChecker;
+
+use Lurker\Event\FilesystemEvent;
+use Lurker\Resource\DirectoryResource;
+
+/**
+ * Recursive directory state checker.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class NewDirectoryStateChecker extends ResourceStateChecker
+{
+    protected $childs = array();
+
+    /**
+     * Initializes checker.
+     *
+     * @param DirectoryResource $resource
+     * @param integer           $eventsMask event types bitmask
+     */
+    public function __construct(DirectoryResource $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        parent::__construct($resource, $eventsMask);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getChangeset()
+    {
+        $changeset = parent::getChangeset();
+
+        // remove directory modification from changeset
+        if (isset($changeset[0]) && FilesystemEvent::MODIFY === $changeset[0]['event']) {
+            $changeset = array();
+        }
+
+        // check for changes in already added subfolders/files
+        foreach ($this->childs as $id => $checker) {
+            foreach ($checker->getChangeset() as $change) {
+                if ($this->supportsEvent($change['event'])) {
+                    $changeset[] = $change;
+                }
+            }
+
+            // remove checkers for removed resources
+            if (!$checker->getResource()->exists()) {
+                unset($this->childs[$id]);
+            }
+        }
+
+        // check for new subfolders/files
+        if ($this->getResource()->exists()) {
+            foreach ($this->createNewDirectoryChildCheckers($this->getResource()) as $checker) {
+                $resource   = $checker->getResource();
+                $resourceId = $resource->getId();
+
+                if (!isset($this->childs[$resourceId])) {
+                    $this->childs[$resourceId] = $checker;
+
+                    if ($this->supportsEvent($event = FilesystemEvent::CREATE)) {
+                        $changeset[] = array(
+                            'event'    => $event,
+                            'resource' => $resource
+                        );
+                    }
+
+                    // check for new directory changes
+                    if ($checker instanceof NewDirectoryStateChecker) {
+                        foreach ($checker->getChangeset() as $change) {
+                            if ($this->supportsEvent($change['event'])) {
+                                $changeset[] = $change;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        return $changeset;
+    }
+
+    /**
+     * Reads files and subdirectories on provided resource path and transform them to resources.
+     *
+     * @param DirectoryResource $resource
+     *
+     * @return array
+     */
+    protected function createDirectoryChildCheckers(DirectoryResource $resource)
+    {
+        $checkers = array();
+        foreach ($resource->getFilteredResources() as $resource) {
+            if ($resource instanceof DirectoryResource) {
+                $checkers[] = new DirectoryStateChecker($resource, $this->getEventsMask());
+            } else {
+                $checkers[] = new FileStateChecker($resource, $this->getEventsMask());
+            }
+        }
+
+        return $checkers;
+    }
+
+    /**
+     * Reads files and subdirectories on provided resource path and transform them to resources.
+     *
+     * @param DirectoryResource $resource
+     *
+     * @return array
+     */
+    protected function createNewDirectoryChildCheckers(DirectoryResource $resource)
+    {
+        $checkers = array();
+        foreach ($resource->getFilteredResources() as $resource) {
+            if ($resource instanceof DirectoryResource) {
+                $checkers[] = new NewDirectoryStateChecker($resource, $this->getEventsMask());
+            } else {
+                $checkers[] = new FileStateChecker($resource, $this->getEventsMask());
+            }
+        }
+
+        return $checkers;
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/ResourceStateChecker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/ResourceStateChecker.php
new file mode 100644
index 0000000000000000000000000000000000000000..a62f9088a9b769ed044f67b326a3e8c96d63ec99
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/ResourceStateChecker.php
@@ -0,0 +1,115 @@
+<?php
+
+namespace Lurker\StateChecker;
+
+use Lurker\Event\FilesystemEvent;
+use Lurker\Resource\ResourceInterface;
+
+/**
+ * Abstract resource state checker class.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+abstract class ResourceStateChecker implements StateCheckerInterface
+{
+    private $resource;
+    private $timestamp;
+    private $eventsMask;
+    private $deleted = false;
+
+    /**
+     * Initializes checker.
+     *
+     * @param ResourceInterface $resource   resource
+     * @param integer           $eventsMask event types bitmask
+     */
+    public function __construct(ResourceInterface $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        $this->resource   = $resource;
+        $this->timestamp  = $resource->getModificationTime() + 1;
+        $this->eventsMask = $eventsMask;
+        $this->deleted    = !$resource->exists();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getResource()
+    {
+        return $this->resource;
+    }
+
+    /**
+     * Returns events mask for checker.
+     *
+     * @return integer
+     */
+    public function getEventsMask()
+    {
+        return $this->eventsMask;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getChangeset()
+    {
+        $changeset = array();
+
+        if ($this->deleted) {
+            if ($this->resource->exists()) {
+                $this->timestamp = $this->resource->getModificationTime() + 1;
+                $this->deleted   = false;
+
+                if ($this->supportsEvent($event = FilesystemEvent::CREATE)) {
+                    $changeset[] = array(
+                        'event'    => $event,
+                        'resource' => $this->resource
+                    );
+                }
+            }
+        } elseif (!$this->resource->exists()) {
+            $this->deleted = true;
+
+            if ($this->supportsEvent($event = FilesystemEvent::DELETE)) {
+                $changeset[] = array(
+                    'event'    => $event,
+                    'resource' => $this->resource
+                );
+            }
+        } elseif (!$this->resource->isFresh($this->timestamp)) {
+            $this->timestamp = $this->resource->getModificationTime() + 1;
+
+            if ($this->supportsEvent($event = FilesystemEvent::MODIFY)) {
+                $changeset[] = array(
+                    'event'    => $event,
+                    'resource' => $this->resource
+                );
+            }
+        }
+
+        return $changeset;
+    }
+
+    /**
+     * Checks whether checker supports provided resource event.
+     *
+     * @param integer $event
+     *
+     * @return Boolean
+     */
+    protected function supportsEvent($event)
+    {
+        return 0 !== ($this->eventsMask & $event);
+    }
+
+    /**
+     * Checks whether resource have been previously deleted.
+     *
+     * @return Boolean
+     */
+    protected function isDeleted()
+    {
+        return $this->deleted;
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/StateCheckerInterface.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/StateCheckerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..57f3c12285213402a7d91da0f7687c61eaecf3bb
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/StateChecker/StateCheckerInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Lurker\StateChecker;
+
+use Lurker\Resource\ResourceInterface;
+
+/**
+ * Resource state checker interface.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+interface StateCheckerInterface
+{
+    /**
+     * Returns tracked resource.
+     *
+     * @return ResourceInterface
+     */
+    public function getResource();
+
+    /**
+     * Check tracked resource for changes.
+     *
+     * @return array
+     */
+    public function getChangeset();
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Tracker/InotifyTracker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Tracker/InotifyTracker.php
new file mode 100644
index 0000000000000000000000000000000000000000..658d5bcfc9b7f0cd2d7081807c854deb4a1edb03
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Tracker/InotifyTracker.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace Lurker\Tracker;
+
+use Lurker\Resource\DirectoryResource;
+use Lurker\Resource\TrackedResource;
+use Lurker\Event\FilesystemEvent;
+use Lurker\StateChecker\Inotify\TopDirectoryStateChecker;
+use Lurker\StateChecker\Inotify\FileStateChecker;
+use Lurker\Exception\RuntimeException;
+use Lurker\StateChecker\Inotify\CheckerBag;
+
+/**
+ * Inotify tracker. To use this tracker you must install inotify extension.
+ *
+ * @link http://pecl.php.net/package/inotify Inotify PECL extension
+ * @author Yaroslav Kiliba <om.dattaya@gmail.com>
+ */
+class InotifyTracker implements TrackerInterface
+{
+    /**
+     * @var array
+     */
+    protected $checkers = array();
+
+    /**
+     * @var CheckerBag
+     */
+    protected $bag;
+
+    /**
+     * @var resource Inotify resource.
+     */
+    private $inotify;
+
+    /**
+     * Initializes tracker. Creates inotify resource used to track file and directory changes.
+     *
+     * @throws RuntimeException If inotify extension unavailable
+     */
+    public function __construct()
+    {
+        if (!function_exists('inotify_init')) {
+            throw new RuntimeException('You must install inotify to be able to use this tracker.');
+        }
+
+        $this->inotify = inotify_init();
+        stream_set_blocking($this->inotify, 0);
+
+        $this->bag = new CheckerBag($this->inotify);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function track(TrackedResource $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        $trackingId = $resource->getTrackingId();
+        $checker    = $resource->getOriginalResource() instanceof DirectoryResource
+            ? new TopDirectoryStateChecker($this->bag, $resource->getOriginalResource(), $eventsMask)
+            : new FileStateChecker($this->bag, $resource->getOriginalResource(), $eventsMask);
+
+        $this->checkers[$trackingId] = array(
+            'tracked' => $resource,
+            'checker' => $checker
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @throws RuntimeException If event queue overflowed
+     */
+    public function getEvents()
+    {
+        $inotifyEvents = $this->readEvents();
+
+        $inotifyEvents = is_array($inotifyEvents) ? $inotifyEvents : array();
+
+        $last = end($inotifyEvents);
+        if (IN_Q_OVERFLOW === $last['mask']) {
+            throw new RuntimeException('Event queue overflowed. Either read events more frequently or increase the limit for queues. The limit can be changed in /proc/sys/fs/inotify/max_queued_events');
+        }
+
+        foreach ($inotifyEvents as $event) {
+            foreach ($this->bag->get($event['wd']) as $watched) {
+                $watched->setEvent($event['mask'], $event['name']);
+            }
+        }
+
+        $events = array();
+
+        foreach ($this->checkers as $meta) {
+            $tracked = $meta['tracked'];
+            $watched = $meta['checker'];
+            foreach ($watched->getChangeset() as $change) {
+                $events[] = new FilesystemEvent($tracked, $change['resource'], $change['event']);
+            }
+        }
+
+        return $events;
+    }
+
+    /**
+     * Closes the inotify resource.
+     */
+    public function __destruct()
+    {
+        fclose($this->inotify);
+    }
+
+    /**
+     * Returns all events happened since last event readout
+     *
+     * @return array
+     */
+    protected function readEvents()
+    {
+        return inotify_read($this->inotify);
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Tracker/RecursiveIteratorTracker.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Tracker/RecursiveIteratorTracker.php
new file mode 100644
index 0000000000000000000000000000000000000000..aa83289cf297ce43fa314cc1ca070cce403bfb07
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Tracker/RecursiveIteratorTracker.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Lurker\Tracker;
+
+use Lurker\Resource\DirectoryResource;
+use Lurker\Event\FilesystemEvent;
+use Lurker\Resource\TrackedResource;
+use Lurker\StateChecker\DirectoryStateChecker;
+use Lurker\StateChecker\FileStateChecker;
+
+/**
+ * Recursive iterator resources tracker.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class RecursiveIteratorTracker implements TrackerInterface
+{
+    private $checkers = array();
+
+    /**
+     * {@inheritdoc}
+     */
+    public function track(TrackedResource $resource, $eventsMask = FilesystemEvent::ALL)
+    {
+        $trackingId = $resource->getTrackingId();
+        $checker    = $resource->getOriginalResource() instanceof DirectoryResource
+            ? new DirectoryStateChecker($resource->getOriginalResource(), $eventsMask)
+            : new FileStateChecker($resource->getOriginalResource(), $eventsMask);
+
+        $this->checkers[$trackingId] = array(
+            'tracked' => $resource,
+            'checker' => $checker
+        );
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getEvents()
+    {
+        $events = array();
+        foreach ($this->checkers as $trackingId => $meta) {
+            $tracked = $meta['tracked'];
+            $checker = $meta['checker'];
+
+            foreach ($checker->getChangeset() as $change) {
+                $events[] = new FilesystemEvent($tracked, $change['resource'], $change['event']);
+            }
+        }
+
+        return $events;
+    }
+}
diff --git a/civicrm/vendor/totten/lurkerlite/src/Lurker/Tracker/TrackerInterface.php b/civicrm/vendor/totten/lurkerlite/src/Lurker/Tracker/TrackerInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..1f16fb8e436af3251891982c2508acbb9257812e
--- /dev/null
+++ b/civicrm/vendor/totten/lurkerlite/src/Lurker/Tracker/TrackerInterface.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Lurker\Tracker;
+
+use Lurker\Resource\TrackedResource;
+use Lurker\Event\FilesystemEvent;
+
+/**
+ * Resources tracker interface.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+interface TrackerInterface
+{
+    /**
+     * Starts to track provided resource for changes.
+     *
+     * @param TrackedResource $resource
+     * @param integer         $eventsMask event types bitmask
+     */
+    public function track(TrackedResource $resource, $eventsMask = FilesystemEvent::ALL);
+
+    /**
+     * Checks tracked resources for change events.
+     *
+     * @return array change events array
+     */
+    public function getEvents();
+}
diff --git a/civicrm/vendor/tubalmartin/cssmin/.gitignore b/civicrm/vendor/tubalmartin/cssmin/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..47ac4fe41bd24bf2a7de5ea3ac6b9bb78e1679fe
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/.gitignore
@@ -0,0 +1,5 @@
+.*
+!/.gitignore
+/vendor
+composer.lock
+composer.phar
\ No newline at end of file
diff --git a/civicrm/vendor/tubalmartin/cssmin/README.md b/civicrm/vendor/tubalmartin/cssmin/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..fecea5459c2a8904043076dee2a8b5897a4d4842
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/README.md
@@ -0,0 +1,461 @@
+# A PHP port of the YUI CSS compressor
+
+[![Latest Stable Version](https://poser.pugx.org/tubalmartin/cssmin/v/stable)](https://packagist.org/packages/tubalmartin/cssmin) [![Total Downloads](https://poser.pugx.org/tubalmartin/cssmin/downloads)](https://packagist.org/packages/tubalmartin/cssmin) [![Daily Downloads](https://poser.pugx.org/tubalmartin/cssmin/d/daily)](https://packagist.org/packages/tubalmartin/cssmin) [![License](https://poser.pugx.org/tubalmartin/cssmin/license)](https://packagist.org/packages/tubalmartin/cssmin)
+
+This port is based on version 2.4.8 (Jun 12, 2013) of the [YUI compressor](https://github.com/yui/yuicompressor).   
+This port contains fixes & features not present in the original YUI compressor.
+
+**Table of Contents**
+
+1.  [Installation & requirements](#install)
+2.  [How to use](#howtouse)
+3.  [Tests](#tests)
+4.  [API Reference](#api)
+5.  [Who uses this?](#whousesit)
+6.  [Changelog](#changelog)
+
+<a name="install"></a>
+
+## 1. Installation & requirements
+
+### Installation
+
+Use [Composer](http://getcomposer.org/) to include the library into your project:
+
+    $ composer.phar require tubalmartin/cssmin
+
+Require Composer's autoloader file:
+
+```php
+<?php
+
+require './vendor/autoload.php';
+
+use tubalmartin\CssMin\Minifier as CSSmin;
+
+// Use it!
+$compressor = new CSSmin;
+```
+
+### Requirements
+
+* PHP 5.3.2 or newer with PCRE extension.
+
+<a name="howtouse"></a>
+
+## 2. How to use
+
+There are three ways you can use this library:
+
+1. [PHP](#php)
+2. [CLI](#cli)
+3. [GUI](#gui)
+
+<a name="php"></a>
+
+### PHP
+
+```php
+<?php
+
+// Autoload libraries
+require './vendor/autoload.php';
+
+use tubalmartin\CssMin\Minifier as CSSmin;
+
+// Extract the CSS code you want to compress from your CSS files
+$input_css = file_get_contents('test.css');
+
+// Create a new CSSmin object.
+// By default CSSmin will try to raise PHP settings.
+// If you don't want CSSmin to raise the PHP settings pass FALSE to
+// the constructor i.e. $compressor = new CSSmin(false);
+$compressor = new CSSmin;
+
+// Set the compressor up before compressing (global setup):
+
+// Keep sourcemap comment in the output.
+// Default behavior removes it.
+$compressor->keepSourceMapComment();
+
+// Remove important comments from output.
+$compressor->removeImportantComments();
+
+// Split long lines in the output approximately every 1000 chars.
+$compressor->setLineBreakPosition(1000);
+
+// Override any PHP configuration options before calling run() (optional)
+$compressor->setMemoryLimit('256M');
+$compressor->setMaxExecutionTime(120);
+$compressor->setPcreBacktrackLimit(3000000);
+$compressor->setPcreRecursionLimit(150000);
+
+// Compress the CSS code!
+$output_css = $compressor->run($input_css);
+
+// You can override any setup between runs without having to create another CSSmin object.
+// Let's say you want to remove the sourcemap comment from the output and
+// disable splitting long lines in the output.
+// You can achieve that using the methods `keepSourceMap` and `setLineBreakPosition`:
+$compressor->keepSourceMapComment(false);
+$compressor->setLineBreakPosition(0);
+$output_css = $compressor->run($input_css); 
+
+// Do whatever you need with the compressed CSS code
+echo $output_css;
+```
+
+<a name="cli"></a>
+
+### CLI
+
+A binary file named `cssmin` will be created after installation in `./vendor/bin` folder.
+
+Output help:
+```
+./vendor/bin/cssmin -h
+```
+Output compression result to the command line:
+```
+./vendor/bin/cssmin -i ./my-css-file.css
+```
+Output compression result to another file:
+```
+./vendor/bin/cssmin -i ./my-css-file.css -o ./my-css-file.min.css
+```
+Output compression result to another file and keep sourcemap comment in the output:
+```
+./vendor/bin/cssmin -i ./my-css-file.css -o ./my-css-file.min.css --keep-sourcemap
+```
+See the binary help for all available CLI options.
+
+<a name="gui"></a>
+
+### GUI
+
+We've made a simple web based GUI to use the compressor, it's in the `gui` folder.
+
+GUI features:
+
+* Optional on-the-fly LESS compilation before compression with error reporting included.
+* Absolute control of the library.
+
+How to use the GUI:
+
+* You need a server with PHP 5.3.2+ installed.
+* Download the repository and upload it to a folder in your server.
+* Run `php composer.phar install` in project's root to install dependencies.
+* Open your favourite browser and enter the URL to the `/gui` folder.
+
+<a name="tests"></a>
+
+## 3. Tests
+
+Tests from YUI compressor have been modified to fit this port.
+
+How to run the test suite:
+
+* Run `php composer.phar install` in project's root to install dependencies. `phpunit` will be installed locally.
+* After that, run `phpunit` in the command line:
+
+```
+./vendor/bin/phpunit
+```
+
+PHPUnit diffing is too simple so when a test fails it's hard to see the actual diff, that's why I've created a 
+test runner that displays inline coloured diffs for a failing test. Only one test can be run at a time.
+
+Here's how to use it:
+
+```
+./tests/bin/runner -t <expectation-name> [-f <fixture-name>] [--keep-sourcemap] [--remove-important-comments] [--linebreak-position <pos>]
+```
+
+<a name="api"></a>
+
+## 4. API Reference
+
+### __construct ([ bool *$raisePhpLimits* ])
+
+Class constructor, creates a new CSSmin object.
+
+**Parameters**
+
+*raisePhpLimits*
+
+If TRUE, CSSmin will try to raise the values of some php configuration options.
+Set to FALSE to keep the values of your php configuration options.
+Defaults to TRUE.
+
+### run (string *$css*)
+
+Minifies a string of uncompressed CSS code.
+`run()` may be called multiple times on a single CSSmin instance.
+
+**Parameters**
+
+*css*
+
+A string of uncompressed CSS code.
+CSSmin default value: `''` (empty string).
+
+**Return Values**
+
+A string of compressed CSS code or an empty string if no string is passed.
+
+### keepSourceMapComment (bool *$keepSourceMap*)
+
+Sets whether to keep sourcemap comment `/*# sourceMappingURL=<path> */`in the output.  
+CSSmin default behavior: Sourcemap comment gets removed from output.
+
+### removeImportantComments (bool *$removeImportantComments*)
+
+Sets whether to remove important comments from output.  
+CSSmin default behavior: Important comments outside declaration blocks are kept in the output.
+
+### setLinebreakPosition (int *$position*)
+
+Some source control tools don't like it when files containing lines longer than, say 8000 characters, are checked in.
+The linebreak option is used in that case to split long lines after a specific column.
+
+CSSmin default value: `0` (all CSS code in 1 long line).  
+Minimum value supported: `1`.
+
+### setMaxExecutionTime (int *$seconds*)
+
+Sets the `max_execution_time` configuration option for this script
+
+CSSmin default value: `60`  
+Values & notes: [max_execution_time documentation](http://php.net/manual/en/info.configuration.php#ini.max-execution-time)
+
+### setMemoryLimit (mixed *$limit*)
+
+Sets the `memory_limit` configuration option for this script
+
+CSSmin default value: `128M`  
+Values & notes: [memory_limit documentation](http://php.net/manual/en/ini.core.php#ini.memory-limit)
+
+### setPcreBacktrackLimit (int *$limit*)
+
+Sets the `pcre.backtrack_limit` configuration option for this script
+
+CSSmin default value: `1000000`  
+Values & notes: [pcre.backtrack_limit documentation](http://php.net/manual/en/pcre.configuration.php#ini.pcre.backtrack-limit)
+
+### setPcreRecursionLimit (int *$limit*)
+
+Sets the `pcre.recursion_limit` configuration option for this script.
+
+CSSmin default value: `500000`  
+Values & notes: [pcre.recursion_limit documentation](http://php.net/manual/en/pcre.configuration.php#ini.pcre.recursion-limit)
+
+
+<a name="whousesit"></a>
+
+## 5. Who uses this port
+
+* [Magento](https://magento.com/) eCommerce platforms and solutions for selling online.
+* [Minify](https://github.com/mrclay/minify) Minify is an HTTP content server. It compresses sources of content (usually files), combines the result and serves it with appropriate HTTP headers.
+* [Autoptimize](http://wordpress.org/plugins/autoptimize/) is a Wordpress plugin. Autoptimize speeds up your website and helps you save bandwidth by aggregating and minimizing JS, CSS and HTML.
+* [IMPRESSPAGES](http://www.impresspages.org/) PHP framework with content editor.
+* [Other dependent Composer packages](https://packagist.org/packages/tubalmartin/cssmin/dependents).
+
+<a name="changelog"></a>
+
+## 6. Changelog
+
+### v4.1.1 15 Jan 2018
+
+FIXED:
+* Breakage when minifying at-import rule with unquoted urls containing semicolons [#45](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/45)
+
+### v4.1.0 16 May 2017
+
+* NEW:
+  * `--dry-run` CLI argument to perform a dry run and display statistics.
+* IMPROVED:
+  * Performance: 2x times faster than v4.0.0 after code profiling:
+    * A 1MB file takes 1.8s with PHP 5.3.29 and 350ms with PHP 7.0.18 (on average).
+    * A full Bootstrap v3.3.7 CSS suite takes 330ms with PHP 5.3.29 and 50ms with PHP 7.0.18 (on average).
+
+### v4.0.0 15 May 2017
+
+NEW:
+* API:
+  * Removed: `setChunkLength()` method and `--chunk-length` CLI argument.
+  * Modified: `keepSourceMap()` method is now named `keepSourceMapComment()`. CLI argument `--keep-sourcemap` stays the same but we've added `--keep-sourcemap-comment` too.
+  * Modified: `run()` method signature. It only accepts one argument now.
+  * Added: `removeImportantComments()` method & `--keep-important-comments` CLI argument.
+* Important comments `/*! ... */` can be optionally removed from output too calling `removeImportantComments()` method.
+
+### v3.3.1 16 May 2017
+
+* Backported performance improvements made in v4.1.0
+
+### v3.3.0 13 May 2017
+
+NEW:
+* CLI binary displays some useful stats after execution.
+* A concatenated file can be safely compressed now: `@charset`, `@import` & `@namespace` at-rules will be placed correctly. 
+* Conditional group rules fully and safely supported, that is, unlimited rule nesting levels. Previously only one nesting level was fully supported.
+
+NOTES:
+* Pretty big refactor done for two main reasons:
+  * Make minified output even more reliable even when a potential scenario has not been tested beforehand.
+  * Make development, testing and contribution a bit easier due to simplified logic.
+* As a consequence of this refactor, stylesheet chunking is not needed anymore. `setChunkLength` method and `--chunk-length` CLI argument
+  still exist for backwards compatibility reasons but have no effect at all.
+
+### v3.2.0 10 May 2017
+
+NEW:
+* PHPUnit added as test runner.
+* CLI binary provided.
+* CSS Sourcemap special comment supported.
+* `ms` unit compression: from `300ms` to `.3s`.
+* Shortable double colon (CSS3) pseudo-elements are now shortened to single colon (CSS2): from `::after` to `:after`.
+* `background: none` & `background: transparent` are shortened to `background:0 0`.
+
+IMPROVED:
+* Some regular expressions.
+* Long line splitting algorithm.
+* Lowercasing pseudo-classes, pseudo-elements and functions to cover more cases.
+* Shortening of suitable shorthand properties with repeated values. All cases are covered now.
+* Tests.
+
+FIXED:
+* When splitting long lines in the output, if a comment or string contained closing curly braces `}`, the curly brace
+  could be recognised as a selector or at-rule closing curly brace resulting in an unexpected newline being added.
+
+### v3.1.2 17 Apr 2017
+
+* Improved compression of long named colors: now all long named colors get compressed to their shorter HEX counterpart.
+* Fixes cases such as [#39](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/39)
+* Huge performance improvement after code profiling. See table below for results when running the whole test suite:
+
+PHP version used: 5.3.29
+
+| chunkLength | v3.1.1 | v3.1.2 |
+| --- | --- | --- |
+| 100 | 6.8s | 2.6s |
+| 1000 | 5.3s | 2s |
+| 2000 | 5.2s | 1.95s |
+| 5000 | 5.1s | 1.9s |
+
+PHP version used: 7.0.8
+
+| chunkLength | v3.1.1 | v3.1.2 |
+| --- | --- | --- |
+| 100 | 2s | 0.72s |
+| 1000 | 1s | 0.37s |
+| 2000 | 0.8s | 0.33s |
+| 5000 | 0.7s | 0.3s |
+
+
+### v3.1.1 11 Apr 2017
+
+* Regexes improved.
+* Small performance improvements.
+* Blocks such as `@media` blocks with empty rules are removed too.
+* Quoted unquotable attribute selectors get unquoted now i.e. from `col[class*="col-"]` to `col[class*=col-]`. Covers most common cases. Safe approach.
+
+### v3.1.0 9 Apr 2017
+
+* Code deeply analyzed. Some areas rewritten from the ground up with maximum performance in mind. No change in compressor behavior.
+* Fixed some hidden bugs discovered along the way that affected performance negatively.
+* IE5/Mac comment hack removed from minifier logic. Those comments will no longer be preserved.
+* The table below displays the performance optimization done in this version in comparison with the previous one running the whole test suite:
+
+PHP version used: 5.3.29
+
+| chunkLength | v3.0.0 | v3.1.0 |
+| --- | --- | --- |
+| 100 | 38s | 6.9s |
+| 1000 | 8.5s | 5.4s |
+| 2000 | 7.3s | 5.3s |
+| 5000 | 5.8s | 5.2s |
+
+PHP version used: 7.0.8
+
+| chunkLength | v3.0.0 | v3.1.0 |
+| --- | --- | --- |
+| 100 | 22.8s | 2.1s |
+| 1000 | 2.9s | 1.1s |
+| 2000 | 2s | 0.9s |
+| 5000 | 1.3s | 0.8s |
+
+### v3.0.0 4 Apr 2017
+
+* New API compliant with PSR-1, PSR-2 & PSR-4. PHP 5.3.2+ required. I think it was time!
+* Many tests added, strengthened and fixed. Big, real life, stylesheets included such as Bootstrap or Foundation.
+* Fixed some critical and minor issues, such as:
+   * Chunking system breaking some stylesheets (broken at rules block) or leaving some bits off.
+   * Backreferences in replacement strings breaking stylesheets.
+   * [#23](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/23)
+   * Others...
+* Color compression improved. Now all named colors are supported i.e. from `white` to `#fff`.
+* Shortening zero values is back but in a safe manner, shortening values assigned to "safe" properties only i.e. from `margin: 1px 0.0em 0rem 0%` to `margin:1px 0 0`. Check the code to see the list of "safe" properties.
+* `padding` and `margin` properties are shortened to the bare minimum i.e. from `margin: 3px 2.1em 3px 2.1em` => `margin:3px 2.1em`
+* Upgrading to v3 is strongly recommended for users enjoying PHP 5.3.2+. 
+
+### v2.4.8-p10 4 Apr 2017
+
+* This is the last v2 release. v3 onwards will only support PHP 5.3.2+.
+* This patch has all improvements and fixes v3.0.0 has. See v3.0.0 notes for further info (no API change in this version of course).
+* Updating to this patch is strongly recommended for users stuck with PHP versions lower than PHP 5.3.
+
+### v2.4.8-p9 28 Mar 2017
+
+* Rolling back property declaration with scalar expressions (>= PHP 5.6) introduced in v2.4.8-p8 to support PHP 5.0. No change in compressor behavior.
+
+### v2.4.8-p8 27 Mar 2017
+
+* Fixed issue [#18](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/pull/18)
+* Added `set_chunk_length` method.
+* `bold` & `normal` values get compressed to `700` & `400` respectively for `font-weight` property.
+* GUI updated.
+* FineDiff library loaded through Composer.
+* README updated.
+
+### v2.4.8-p7 26 Mar 2017
+
+* Fixed many issues [#20](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/20), [#22](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/22), [#24](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/24), [#25](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/25), [#26](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/26) reported by contributors and others that I'm sure haven't been reported, at least yet. Sorry for the long delay guys.
+* This release is all about stability and reliability and as such I've had to take some controversial decisions such as:
+   * Not minifying `none` property value to `0` because in some subtle scenarios the resulting output may render some styles differently.
+   * Not removing units from zero length values because in many cases the output will break the intended behavior. Patching every single case after someone finds a new breaking case is not good IMHO taking into account CSS is a live spec and browsers differ in some cases.
+* Hope you agree with me removing those conflicting parts. Enjoy this release :)
+   
+### v2.4.8-p6 21 Mar 2017
+
+* Fixed PHP CLI issues. See [#36](https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/pull/36)
+
+### v2.4.8-p5 27 Feb 2017
+
+* Fixed PHP 7 issues.
+
+### v2.4.8-p4 22 Sep 2014
+
+* Composer support. The package is [tubalmartin/cssmin](https://packagist.org/packages/tubalmartin/cssmin)
+* Fixed issue [#17]
+
+### v2.4.8-p3 26 Apr 2014
+
+* Fixed all reported bugs: See issues [#11], [#13] (first case only) and [#14].
+* LESS compiler upgraded to version 1.7.0
+
+### v2.4.8-p2 13 Nov 2013
+
+* Chunk length reduced to 5000 chars (previously 25.000 chars) in an effort to avoid PCRE backtrack limits (needs feedback).
+* Improvements for the `@keyframes 0%` step bug. Tests improved.
+* Fix IE7 issue on matrix filters which browser accept whitespaces between Matrix parameters
+* LESS compiler upgraded to version 1.4.2
+
+### v2.4.8-p1 8 Aug 2013
+
+* Fix for the `@keyframes 0%` step bug. Tests added.
+* LESS compiler upgraded to version 1.4.1
+
+[#11]: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/11
+[#13]: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/13
+[#14]: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/14
+[#17]: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues/17
diff --git a/civicrm/vendor/tubalmartin/cssmin/composer.json b/civicrm/vendor/tubalmartin/cssmin/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..18eebfe982117e2edf424491f1842ae20e5e242b
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/composer.json
@@ -0,0 +1,38 @@
+{
+    "name": "tubalmartin/cssmin",
+    "description": "A PHP port of the YUI CSS compressor",
+    "keywords": ["yui", "compressor", "css", "cssmin", "compress", "minify"],
+    "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port",
+    "license": "BSD-3-Clause",
+    "authors": [
+        {
+            "name": "Túbal Martín",
+            "homepage": "http://tubalmartin.me/"
+        }
+    ],
+    "support": {
+        "issues": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues",
+        "source": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port"
+    },
+    "autoload": {
+        "psr-4": {
+            "tubalmartin\\CssMin\\": "src"
+        }
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "tubalmartin\\CssMin\\Tests\\": "tests"
+        }
+    },
+    "bin": [
+        "cssmin"
+    ],
+    "require": {
+        "php": ">=5.3.2",
+        "ext-pcre": "*"
+    },
+    "require-dev": {
+        "cogpowered/finediff": "0.3.*",
+        "phpunit/phpunit": "4.8.*"
+    }
+}
\ No newline at end of file
diff --git a/civicrm/vendor/tubalmartin/cssmin/cssmin b/civicrm/vendor/tubalmartin/cssmin/cssmin
new file mode 100755
index 0000000000000000000000000000000000000000..fdb8abbff77533337615d7ce4661fdf54030a417
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/cssmin
@@ -0,0 +1,37 @@
+#!/usr/bin/env php
+<?php
+
+use tubalmartin\CssMin\Command;
+
+$autoloadPath = null;
+$autoloadPaths = array(
+    __DIR__ . '/../../autoload.php',
+    __DIR__ . '/../vendor/autoload.php',
+    __DIR__ . '/vendor/autoload.php'
+);
+
+foreach ($autoloadPaths as $file) {
+    if (file_exists($file)) {
+        $autoloadPath = $file;
+        break;
+    }
+}
+
+unset($file);
+unset($autoloadPaths);
+
+if (is_null($autoloadPath)) {
+    fwrite(
+        STDERR,
+        'You need to set up the project dependencies using Composer:' . PHP_EOL . PHP_EOL .
+        '    composer install' . PHP_EOL . PHP_EOL .
+        'You can learn all about Composer on https://getcomposer.org/.' . PHP_EOL
+    );
+    die(1);
+}
+
+require $autoloadPath;
+
+unset($autoloadPath);
+
+Command::main();
diff --git a/civicrm/vendor/tubalmartin/cssmin/gui/index.php b/civicrm/vendor/tubalmartin/cssmin/gui/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..dcbe54435de8387233497ce7dc5143b2ff9a85f9
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/gui/index.php
@@ -0,0 +1,209 @@
+<?php
+
+require '../vendor/autoload.php';
+
+use tubalmartin\CssMin\Minifier as CSSmin;
+
+mb_internal_encoding('UTF-8');
+
+/**
+ * Navigates through an array and removes slashes from the values.
+ *
+ * If an array is passed, the array_map() function causes a callback to pass the
+ * value back to the function. The slashes from this value will removed.
+ *
+ * @param array|string $value The array or string to be stripped.
+ * @return array|string Stripped array (or string in the callback).
+ */
+function stripslashes_deep($value)
+{
+    if (is_array($value)) {
+        $value = array_map('stripslashes_deep', $value);
+    } elseif (is_object($value)) {
+        $vars = get_object_vars($value);
+        foreach ($vars as $key => $data) {
+            $value->{$key} = stripslashes_deep($data);
+        }
+    } else {
+        $value = stripslashes($value);
+    }
+
+    return $value;
+}
+
+// Disable magic quotes at runtime.
+if (function_exists('ini_set')) {
+    ini_set('magic_quotes_sybase', 0);
+    ini_set('get_magic_quotes_runtime', 0);
+}
+
+// If get_magic_quotes_gpc is active, strip slashes
+if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
+    $_POST = stripslashes_deep($_POST);
+}
+
+
+if (!empty($_POST)) :
+    // Form options
+    parse_str($_POST['options']);
+
+    $linebreak_pos = trim($linebreak_pos) !== '' ? $linebreak_pos : false;
+    $raise_php = isset($raise_php) ? true : false;
+
+    // Create a new CSSmin object and try to raise PHP settings
+    $compressor = new CSSmin($raise_php);
+
+    if ($linebreak_pos !== false) {
+        $compressor->setLineBreakPosition($linebreak_pos);
+    }
+
+    if (isset($keep_sourcemap)) {
+        $compressor->keepSourceMapComment();
+    }
+
+    if (isset($remove_important_comments)) {
+        $compressor->removeImportantComments();
+    }
+
+    if ($raise_php) {
+        $compressor->setMemoryLimit($memory_limit);
+        $compressor->setMaxExecutionTime($max_execution_time);
+        $compressor->setPcreBacktrackLimit(1000 * $pcre_backtrack_limit);
+        $compressor->setPcreRecursionLimit(1000 * $pcre_recursion_limit);
+    }
+
+    // Compress the CSS code and store data
+    $output = array();
+    $output['css'] = $compressor->run($_POST['css']);
+    $output['originalSize'] = mb_strlen($_POST['css'], '8bit');
+    $output['compressedSize'] = mb_strlen($output['css'], '8bit');
+    $output['bytesSaved'] = $output['originalSize'] - $output['compressedSize'];
+    $output['compressionRatio'] = round(($output['bytesSaved'] * 100) /
+        ($output['originalSize'] === 0 ? 1 : $output['originalSize']), 2);
+
+    // Output data
+    echo json_encode($output);
+else :
+?>
+<!DOCTYPE HTML>
+<html lang="en-US">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>YUI CSS compressor - PHP</title>
+    <link rel="stylesheet" type="text/css" href="third-party/bootstrap/css/bootstrap.min.css">
+    <link rel="stylesheet" type="text/css" href="styles.css">
+    <link rel="stylesheet/less" type="text/css" href="styles.less">
+</head>
+<body>
+    <div class="navbar">
+      <div class="navbar-inner">
+        <div class="container-fluid">
+          <a class="brand" href="https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port">YUI CSS compressor PHP port</a>
+        </div>
+      </div>
+    </div>
+    <div class="container-fluid">
+        <div class="row-fluid">
+            <div id="body" class="span9">
+                <!--Body content-->
+                <div id="less-error-message" class="less-error-message"></div>
+                <div class="well">
+                    <div id="input-container">
+                        <label for="input-css">Paste a block of CSS to compress in the area below:</label>
+                        <textarea id="input-css" class="input-block-level" rows="10"></textarea>
+                    </div>
+                    <div id="output-container" class="hide">
+                        <label for="output-css">Here's your compressed CSS code:</label>
+                        <span class="help-block">Original size: <span id="original-size"></span> bytes | Compressed size: <span id="compressed-size"></span> bytes | Bytes saved: <span id="bytes-saved"></span> | Compression ratio: <span id="compression-ratio"></span>%</span>
+                        <textarea id="output-css" class="input-block-level" rows="10"></textarea>
+                    </div>
+                </div>
+            </div>
+            <div id="sidebar" class="span3">
+                <form id="options-form">
+                    <p class="submit">
+                        <button type="submit" id="compress-btn" class="btn btn-primary btn-large" data-loading-text="Compressing...">Compress!</button>
+                    </p>
+                    <fieldset>
+                        <legend>LESS</legend>
+                        <p class="control-group">
+                            <label class="checkbox">
+                                <input type="checkbox" id="enable-less" value="1"> Enable compiler <span class="version">v1.7.5</span>
+                            </label>
+                        </p>
+                    </fieldset>
+                    <fieldset>
+                        <legend>Compressor options</legend>
+                        <div class="control-group">
+                            <label>Linebreak after <i>n</i> columns</label>
+                            <input type="text" name="linebreak_pos" class="span1">
+                        </div>
+                        <div class="control-group">
+                            <label class="checkbox">
+                                <input type="checkbox" name="keep_sourcemap" value="1"> Keep CSS Sourcemap comment
+                            </label>
+                        </div>
+                        <div class="control-group">
+                            <label class="checkbox">
+                                <input type="checkbox" name="remove_important_comments" value="1"> Remove important comments
+                            </label>
+                        </div>
+                    </fieldset>
+                    <fieldset>
+                        <legend>PHP configuration options</legend>
+                        <div class="control-group">
+                            <label class="checkbox">
+                                <input type="checkbox" name="raise_php" value="1" checked="checked"> Raise PHP configuration options
+                            </label>
+                            <label>Memory limit</label>
+                            <select name="memory_limit" class="span2">
+                                <option value="32M">32M</option>
+                                <option value="64M">64M</option>
+                                <option value="128M" selected="selected">128M</option>
+                                <option value="256M">256M</option>
+                                <option value="512M">512M</option>
+                                <option value="1G">1G</option>
+                                <option value="-1">No limit</option>
+                            </select>
+                            <label>Max execution time</label>
+                            <select name="max_execution_time" class="span2">
+                                <option value="30">30 secs</option>
+                                <option value="60" selected="selected">1 min</option>
+                                <option value="120">2 mins</option>
+                                <option value="300">5 mins</option>
+                            </select>
+                            <label>PCRE backtrack limit</label>
+                            <select name="pcre_backtrack_limit" class="span2">
+                                <option value="100">100.000</option>
+                                <option value="1000" selected="selected">1.000.000</option>
+                                <option value="2000">2.000.000</option>
+                                <option value="5000">5.000.000</option>
+                            </select>
+                            <label>PCRE recursion limit</label>
+                            <select name="pcre_recursion_limit" class="span2">
+                                <option value="100">100.000</option>
+                                <option value="250">250.000</option>
+                                <option value="500" selected="selected">500.000</option>
+                                <option value="1000">1.000.000</option>
+                            </select>
+                        </div>
+                    </fieldset>
+                </form>
+            </div>
+        </div>
+    </div>
+    <script type="text/javascript">
+        less = {
+            env: 'development'
+        };
+    </script>
+    <script type="text/javascript" src="third-party/less-1.7.5.min.js"></script>
+    <script type="text/javascript" src="third-party/jquery-1.12.4.min.js"></script>
+    <script type="text/javascript" src="third-party/bootstrap/js/bootstrap.min.js"></script>
+    <script type="text/javascript" src="scripts.js"></script>
+</body>
+</html>
+<?php
+endif;
+?>
diff --git a/civicrm/vendor/tubalmartin/cssmin/gui/scripts.js b/civicrm/vendor/tubalmartin/cssmin/gui/scripts.js
new file mode 100644
index 0000000000000000000000000000000000000000..398358843340f0d77073547b9a8e463226bb8590
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/gui/scripts.js
@@ -0,0 +1,104 @@
+$(function(){
+
+    var inputCss = $('#input-css')
+      ,	outputCss = $('#output-css')
+      ,	outputContainer = $('#output-container')
+      , originalSize = $('#original-size')
+      , compressedSize = $('#compressed-size')
+      , bytesSaved = $('#bytes-saved')
+      , compressionRatio = $('#compression-ratio')
+      ,	compressBtn = $('#compress-btn')
+      ,	lessConsole = $('#less-error-message')
+
+        /**
+         * Prints LESS compilation errors
+         */
+      ,	lessError = function(e) {
+            var content, errorline
+              ,	template = '<li><label>{line}</label><pre class="{class}">{content}</pre></li>'
+              , error = [];
+
+            content = '<h3>'  + (e.type || "Syntax") + "Error: " + (e.message || 'There is an error in your .less file') +
+                      '</h3>' + '<p>';
+
+            errorline = function (e, i, classname) {
+                if (e.extract[i] != undefined) {
+                    error.push(template.replace(/\{line\}/, (parseInt(e.line) || 0) + (i - 1))
+                                       .replace(/\{class\}/, classname)
+                                       .replace(/\{content\}/, e.extract[i]));
+                }
+            };
+
+            if (e.stack) {
+                content += '<br/>' + e.stack.split('\n').slice(1).join('<br/>');
+            } else if (e.extract) {
+                errorline(e, 0, '');
+                errorline(e, 1, 'line');
+                errorline(e, 2, '');
+                content += 'on line ' + e.line + ', column ' + (e.column + 1) + ':</p>' +
+                            '<ul>' + error.join('') + '</ul>';
+            }
+
+            lessConsole.html(content).slideDown('fast');
+      }
+
+        /**
+         * Compresses user's CSS with the PHP port of the YUI compressor
+         */
+      , compress = function(formData) {
+            $.post(window.location.href, formData, function(data, textStatus, jqXHR){
+                // Hide LESS error console
+                lessConsole.slideUp('fast');
+
+                // Fill output & show
+                outputCss.val(data.css);
+                originalSize.html(data.originalSize);
+                compressedSize.html(data.compressedSize);
+                bytesSaved.html(data.bytesSaved);
+                compressionRatio.html(data.compressionRatio);
+
+                outputContainer.slideDown('fast');
+
+                // Restore button state
+                compressBtn.button('reset');
+            }, 'json');
+      };
+
+
+
+    /**
+     * Controller
+     */
+    $('#options-form').on('submit', function(e){
+        e && e.preventDefault();
+
+        var data = {
+            css: inputCss.val(),
+            options: $(this).serialize()
+        };
+
+        // Change button state
+        compressBtn.button('loading');
+
+        // If LESS enabled, precompile CSS with LESS and then compress
+        if (!!$('#enable-less:checked').val()) {
+            try {
+              new(less.Parser)().parse(data.css, function (err, tree) {
+                  if (err) {
+                      lessError(err);
+                      compressBtn.button('reset');
+                  } else {
+                      data.css = tree.toCSS();
+                      compress(data);
+                  }
+              });
+            } catch (err) {
+              lessError(err);
+              compressBtn.button('reset');
+            }
+        } else {
+            compress(data);
+        }
+    });
+
+});
\ No newline at end of file
diff --git a/civicrm/vendor/tubalmartin/cssmin/gui/styles.css b/civicrm/vendor/tubalmartin/cssmin/gui/styles.css
new file mode 100644
index 0000000000000000000000000000000000000000..cc69524c6e055260177c57f04f1235065a8c9cd3
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/gui/styles.css
@@ -0,0 +1,68 @@
+/* LESS error report styles */
+.less-error-message {
+    font-family: Arial, sans-serif;
+    border: 1px solid #e00;
+    border: 1px solid rgba(238,0,0, 0.5);
+    background-color: whiteSmoke;
+    border-radius: 4px;
+    -webkit-border-radius: 4px;
+    -moz-border-radius: 4px;
+    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0, 0.05);
+    -moz-box-shadow: inset 0 1px 1px rgba(0,0,0, 0.05);
+    box-shadow: inset 0 1px 1px rgba(0,0,0, 0.05);
+    color: #e00;
+    padding: 18px;
+    margin-bottom: 18px;
+    display:none;
+}
+.less-error-message ul, .less-error-message li {
+    list-style-type: none;
+    padding: 0;
+    margin: 0;
+}
+.less-error-message label {
+    font-size: 12px;
+    margin-right: 15px;
+    padding: 4px 0;
+    color: #cc7777;
+    display: inline;
+}
+.less-error-message pre {
+    color: #dd6666;
+    padding: 4px 0;
+    margin: 0;
+    display: inline-block;
+}
+.less-error-message pre.line {
+    color: red;
+}
+.less-error-message h3 {
+    font-size: 20px;
+    font-weight: bold;
+    padding: 0 0 5px 0;
+    margin: 0;
+}
+.less-error-message a {
+    color: #10a;
+}
+.less-error-message .error {
+    color: red;
+    font-weight: bold;
+    padding-bottom: 2px;
+    border-bottom: 1px dashed red;
+}
+
+pre {
+    white-space: pre-wrap; /* css-3 */
+    white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
+    white-space: -pre-wrap; /* Opera 4-6 */
+    white-space: -o-pre-wrap; /* Opera 7 */
+    word-wrap: break-word; /* Internet Explorer 5.5+ */
+}
+
+/* APP styles */
+.version{font-size:10px;font-style: italic;letter-spacing: 2px}
+
+legend{font-size: 15px; line-height: 20px; margin-bottom:0}
+.control-group{margin-bottom:12px;}
+#output-container{margin-top:18px}
\ No newline at end of file
diff --git a/civicrm/vendor/tubalmartin/cssmin/gui/third-party/bootstrap/css/bootstrap.min.css b/civicrm/vendor/tubalmartin/cssmin/gui/third-party/bootstrap/css/bootstrap.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..923c406e909e5af5017a3cc4a99e8b07b8d72617
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/gui/third-party/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,339 @@
+/*!
+ * Bootstrap v2.0.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
+.clearfix:after{clear:both;}
+.hide-text{overflow:hidden;text-indent:100%;white-space:nowrap;}
+.input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}
+article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
+audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
+audio:not([controls]){display:none;}
+html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
+a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+a:hover,a:active{outline:0;}
+sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
+sup{top:-0.5em;}
+sub{bottom:-0.25em;}
+img{height:auto;border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;}
+button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
+button,input{*overflow:visible;line-height:normal;}
+button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
+button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
+input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;}
+input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
+textarea{overflow:auto;vertical-align:top;}
+body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}
+a{color:#0088cc;text-decoration:none;}
+a:hover{color:#005580;text-decoration:underline;}
+.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";}
+.row:after{clear:both;}
+[class*="span"]{float:left;margin-left:20px;}
+.container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
+.span12{width:940px;}
+.span11{width:860px;}
+.span10{width:780px;}
+.span9{width:700px;}
+.span8{width:620px;}
+.span7{width:540px;}
+.span6{width:460px;}
+.span5{width:380px;}
+.span4{width:300px;}
+.span3{width:220px;}
+.span2{width:140px;}
+.span1{width:60px;}
+.offset12{margin-left:980px;}
+.offset11{margin-left:900px;}
+.offset10{margin-left:820px;}
+.offset9{margin-left:740px;}
+.offset8{margin-left:660px;}
+.offset7{margin-left:580px;}
+.offset6{margin-left:500px;}
+.offset5{margin-left:420px;}
+.offset4{margin-left:340px;}
+.offset3{margin-left:260px;}
+.offset2{margin-left:180px;}
+.offset1{margin-left:100px;}
+.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";}
+.row-fluid:after{clear:both;}
+.row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;}
+.row-fluid>[class*="span"]:first-child{margin-left:0;}
+.row-fluid > .span12{width:99.99999998999999%;}
+.row-fluid > .span11{width:91.489361693%;}
+.row-fluid > .span10{width:82.97872339599999%;}
+.row-fluid > .span9{width:74.468085099%;}
+.row-fluid > .span8{width:65.95744680199999%;}
+.row-fluid > .span7{width:57.446808505%;}
+.row-fluid > .span6{width:48.93617020799999%;}
+.row-fluid > .span5{width:40.425531911%;}
+.row-fluid > .span4{width:31.914893614%;}
+.row-fluid > .span3{width:23.404255317%;}
+.row-fluid > .span2{width:14.89361702%;}
+.row-fluid > .span1{width:6.382978723%;}
+.container{margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
+.container:after{clear:both;}
+.container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
+.container-fluid:after{clear:both;}
+p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;}
+.lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
+h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
+h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
+h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
+h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;}
+h4,h5,h6{line-height:18px;}
+h4{font-size:14px;}h4 small{font-size:12px;}
+h5{font-size:12px;}
+h6{font-size:11px;color:#999999;text-transform:uppercase;}
+.page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}
+.page-header h1{line-height:1;}
+ul,ol{padding:0;margin:0 0 9px 25px;}
+ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
+ul{list-style:disc;}
+ol{list-style:decimal;}
+li{line-height:18px;}
+ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
+dl{margin-bottom:18px;}
+dt,dd{line-height:18px;}
+dt{font-weight:bold;line-height:17px;}
+dd{margin-left:9px;}
+.dl-horizontal dt{float:left;clear:left;width:120px;text-align:right;}
+.dl-horizontal dd{margin-left:130px;}
+hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
+strong{font-weight:bold;}
+em{font-style:italic;}
+.muted{color:#999999;}
+abbr[title]{border-bottom:1px dotted #ddd;cursor:help;}
+abbr.initialism{font-size:90%;text-transform:uppercase;}
+blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
+blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
+blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
+q:before,q:after,blockquote:before,blockquote:after{content:"";}
+address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;}
+small{font-size:100%;}
+cite{font-style:normal;}
+.label{padding:1px 4px 2px;font-size:10.998px;font-weight:bold;line-height:13px;color:#ffffff;vertical-align:middle;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.label:hover{color:#ffffff;text-decoration:none;}
+.label-important{background-color:#b94a48;}
+.label-important:hover{background-color:#953b39;}
+.label-warning{background-color:#f89406;}
+.label-warning:hover{background-color:#c67605;}
+.label-success{background-color:#468847;}
+.label-success:hover{background-color:#356635;}
+.label-info{background-color:#3a87ad;}
+.label-info:hover{background-color:#2d6987;}
+.label-inverse{background-color:#333333;}
+.label-inverse:hover{background-color:#1a1a1a;}
+form{margin:0 0 18px;}
+fieldset{padding:0;margin:0;border:0;}
+legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;}
+label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;}
+input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
+label{display:block;margin-bottom:5px;color:#333333;}
+input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #cccccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.uneditable-textarea{width:auto;height:auto;}
+label input,label textarea,label select{display:block;}
+input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \9;}
+input[type="image"]{border:0;}
+input[type="file"]{width:auto;padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;}
+select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
+input[type="file"]{line-height:18px \9;}
+select{width:220px;background-color:#ffffff;}
+select[multiple],select[size]{height:auto;}
+input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+textarea{height:auto;}
+input[type="hidden"]{display:none;}
+.radio,.checkbox{padding-left:18px;}
+.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
+.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
+.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
+.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
+input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}
+input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;}
+input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.input-mini{width:60px;}
+.input-small{width:90px;}
+.input-medium{width:150px;}
+.input-large{width:210px;}
+.input-xlarge{width:270px;}
+.input-xxlarge{width:530px;}
+input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;}
+input,textarea,.uneditable-input{margin-left:0;}
+input.span12, textarea.span12, .uneditable-input.span12{width:930px;}
+input.span11, textarea.span11, .uneditable-input.span11{width:850px;}
+input.span10, textarea.span10, .uneditable-input.span10{width:770px;}
+input.span9, textarea.span9, .uneditable-input.span9{width:690px;}
+input.span8, textarea.span8, .uneditable-input.span8{width:610px;}
+input.span7, textarea.span7, .uneditable-input.span7{width:530px;}
+input.span6, textarea.span6, .uneditable-input.span6{width:450px;}
+input.span5, textarea.span5, .uneditable-input.span5{width:370px;}
+input.span4, textarea.span4, .uneditable-input.span4{width:290px;}
+input.span3, textarea.span3, .uneditable-input.span3{width:210px;}
+input.span2, textarea.span2, .uneditable-input.span2{width:130px;}
+input.span1, textarea.span1, .uneditable-input.span1{width:50px;}
+input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#eeeeee;border-color:#ddd;cursor:not-allowed;}
+.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
+.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}
+.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
+.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
+.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}
+.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
+.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
+.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}
+.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
+input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
+.form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#eeeeee;border-top:1px solid #ddd;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";}
+.form-actions:after{clear:both;}
+.uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;}
+:-moz-placeholder{color:#999999;}
+::-webkit-input-placeholder{color:#999999;}
+.help-block,.help-inline{color:#555555;}
+.help-block{display:block;margin-bottom:9px;}
+.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
+.input-prepend,.input-append{margin-bottom:5px;}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{*margin-left:0;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;}
+.input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
+.input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;min-width:16px;height:18px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;}
+.input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}
+.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
+.input-append input,.input-append select .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-append .uneditable-input{border-left-color:#eee;border-right-color:#ccc;}
+.input-append .add-on,.input-append .btn{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
+.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
+.search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
+.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;margin-bottom:0;}
+.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
+.form-search label,.form-inline label{display:inline-block;}
+.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
+.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
+.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-left:0;margin-right:3px;}
+.control-group{margin-bottom:9px;}
+legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
+.form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
+.form-horizontal .control-group:after{clear:both;}
+.form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
+.form-horizontal .controls{margin-left:160px;*display:inline-block;*margin-left:0;*padding-left:20px;}
+.form-horizontal .help-block{margin-top:9px;margin-bottom:0;}
+.form-horizontal .form-actions{padding-left:160px;}
+.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);border:1px solid #cccccc;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;*margin-left:.3em;}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;}
+.btn:active,.btn.active{background-color:#cccccc \9;}
+.btn:first-child{*margin-left:0;}
+.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
+.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
+.btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;outline:0;}
+.btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
+.btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.btn-large [class^="icon-"]{margin-top:1px;}
+.btn-small{padding:5px 9px;font-size:11px;line-height:16px;}
+.btn-small [class^="icon-"]{margin-top:-1px;}
+.btn-mini{padding:2px 6px;font-size:11px;line-height:14px;}
+.btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;}
+.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
+.btn-primary{background-color:#0074cc;background-image:-moz-linear-gradient(top, #0088cc, #0055cc);background-image:-ms-linear-gradient(top, #0088cc, #0055cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));background-image:-webkit-linear-gradient(top, #0088cc, #0055cc);background-image:-o-linear-gradient(top, #0088cc, #0055cc);background-image:linear-gradient(top, #0088cc, #0055cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);border-color:#0055cc #0055cc #003580;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0055cc;}
+.btn-primary:active,.btn-primary.active{background-color:#004099 \9;}
+.btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;}
+.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
+.btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;}
+.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
+.btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;}
+.btn-success:active,.btn-success.active{background-color:#408140 \9;}
+.btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;}
+.btn-info:active,.btn-info.active{background-color:#24748c \9;}
+.btn-inverse{background-color:#414141;background-image:-moz-linear-gradient(top, #555555, #222222);background-image:-ms-linear-gradient(top, #555555, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));background-image:-webkit-linear-gradient(top, #555555, #222222);background-image:-o-linear-gradient(top, #555555, #222222);background-image:linear-gradient(top, #555555, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222222;}
+.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
+button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
+button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
+button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
+button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
+.btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";}
+.btn-group:after{clear:both;}
+.btn-group:first-child{*margin-left:0;}
+.btn-group+.btn-group{margin-left:5px;}
+.btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;}
+.btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;}
+.btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;}
+.btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;}
+.btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;}
+.btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;}
+.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;}
+.btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:3px;*padding-bottom:3px;}
+.btn-group .btn-mini.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:1px;*padding-bottom:1px;}
+.btn-group .btn-small.dropdown-toggle{*padding-top:4px;*padding-bottom:4px;}
+.btn-group .btn-large.dropdown-toggle{padding-left:12px;padding-right:12px;}
+.btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);}
+.btn .caret{margin-top:7px;margin-left:0;}
+.btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);}
+.btn-mini .caret{margin-top:5px;}
+.btn-small .caret{margin-top:6px;}
+.btn-large .caret{margin-top:6px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;}
+.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);}
+.navbar{*position:relative;*z-index:2;overflow:visible;margin-bottom:18px;}
+.navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);}
+.navbar .container{width:auto;}
+.btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:dximagetransform.microsoft.gradient(enabled=false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;}
+.btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;}
+.btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);}
+.btn-navbar .icon-bar+.icon-bar{margin-top:3px;}
+.nav-collapse.collapse{height:auto;}
+.navbar{color:#999999;}.navbar .brand:hover{text-decoration:none;}
+.navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;}
+.navbar .navbar-text{margin-bottom:0;line-height:40px;}
+.navbar .btn,.navbar .btn-group{margin-top:5px;}
+.navbar .btn-group .btn{margin-top:0;}
+.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";}
+.navbar-form:after{clear:both;}
+.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;}
+.navbar-form input,.navbar-form select{display:inline-block;margin-bottom:0;}
+.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;}
+.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;}
+.navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;background-color:#626262;border:1px solid #151515;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query:-moz-placeholder{color:#cccccc;}
+.navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;}
+.navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;}
+.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;}
+.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
+.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;}
+.navbar-fixed-top{top:0;}
+.navbar-fixed-bottom{bottom:0;}
+.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;}
+.navbar .nav.pull-right{float:right;}
+.navbar .nav>li{display:block;float:left;}
+.navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
+.navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;}
+.navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;}
+.navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;}
+.navbar .nav.pull-right{margin-left:10px;margin-right:0;}
+.navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;}
+.navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;}
+.navbar-fixed-bottom .dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;}
+.navbar-fixed-bottom .dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;}
+.navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;}
+.navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);}
+.navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;}
+.navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;}
+.navbar .nav.pull-right .dropdown-menu,.navbar .nav .dropdown-menu.pull-right{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before,.navbar .nav .dropdown-menu.pull-right:before{left:auto;right:12px;}
+.navbar .nav.pull-right .dropdown-menu:after,.navbar .nav .dropdown-menu.pull-right:after{left:auto;right:13px;}
+.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
+.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
+.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+.hide{display:none;}
+.show{display:block;}
+.invisible{visibility:hidden;}
+.hidden{display:none;visibility:hidden;}
+.visible-phone{display:none;}
+.visible-tablet{display:none;}
+.visible-desktop{display:block;}
+.hidden-phone{display:block;}
+.hidden-tablet{display:block;}
+.hidden-desktop{display:none;}
+@media (max-width:767px){.visible-phone{display:block;} .hidden-phone{display:none;} .hidden-desktop{display:block;} .visible-desktop{display:none;}}@media (min-width:768px) and (max-width:979px){.visible-tablet{display:block;} .hidden-tablet{display:none;} .hidden-desktop{display:block;} .visible-desktop{display:none;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:18px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-group>label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .modal{position:absolute;top:10px;left:10px;right:10px;width:auto;margin:0;}.modal.fade.in{top:auto;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top{margin-left:-20px;margin-right:-20px;} .container{width:auto;} .row-fluid{width:100%;} .row{margin-left:0;} .row>[class*="span"],.row-fluid>[class*="span"]{float:none;display:block;width:auto;margin:0;} .thumbnails [class*="span"]{width:auto;} input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;} .input-prepend input[class*="span"],.input-append input[class*="span"]{width:auto;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:20px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.762430939%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid > .span12{width:99.999999993%;} .row-fluid > .span11{width:91.436464082%;} .row-fluid > .span10{width:82.87292817100001%;} .row-fluid > .span9{width:74.30939226%;} .row-fluid > .span8{width:65.74585634900001%;} .row-fluid > .span7{width:57.182320438000005%;} .row-fluid > .span6{width:48.618784527%;} .row-fluid > .span5{width:40.055248616%;} .row-fluid > .span4{width:31.491712705%;} .row-fluid > .span3{width:22.928176794%;} .row-fluid > .span2{width:14.364640883%;} .row-fluid > .span1{width:5.801104972%;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:714px;} input.span11, textarea.span11, .uneditable-input.span11{width:652px;} input.span10, textarea.span10, .uneditable-input.span10{width:590px;} input.span9, textarea.span9, .uneditable-input.span9{width:528px;} input.span8, textarea.span8, .uneditable-input.span8{width:466px;} input.span7, textarea.span7, .uneditable-input.span7{width:404px;} input.span6, textarea.span6, .uneditable-input.span6{width:342px;} input.span5, textarea.span5, .uneditable-input.span5{width:280px;} input.span4, textarea.span4, .uneditable-input.span4{width:218px;} input.span3, textarea.span3, .uneditable-input.span3{width:156px;} input.span2, textarea.span2, .uneditable-input.span2{width:94px;} input.span1, textarea.span1, .uneditable-input.span1{width:32px;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top{position:static;margin-bottom:18px;} .navbar-fixed-top .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .navbar .nav-collapse{clear:left;} .navbar .nav{float:none;margin:0 0 9px;} .navbar .nav>li{float:none;} .navbar .nav>li>a{margin-bottom:2px;} .navbar .nav>.divider-vertical{display:none;} .navbar .nav .nav-header{color:#999999;text-shadow:none;} .navbar .nav>li>a,.navbar .dropdown-menu a{padding:6px 15px;font-weight:bold;color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .navbar .dropdown-menu li+li a{margin-bottom:2px;} .navbar .nav>li>a:hover,.navbar .dropdown-menu a:hover{background-color:#222222;} .navbar .dropdown-menu{position:static;top:auto;left:auto;float:none;display:block;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .navbar .dropdown-menu:before,.navbar .dropdown-menu:after{display:none;} .navbar .dropdown-menu .divider{display:none;} .navbar-form,.navbar-search{float:none;padding:9px 15px;margin:9px 0;border-top:1px solid #222222;border-bottom:1px solid #222222;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.1);} .navbar .nav.pull-right{float:none;margin-left:0;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;} .btn-navbar{display:block;} .nav-collapse{overflow:hidden;height:0;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";} .row:after{clear:both;} [class*="span"]{float:left;margin-left:30px;} .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} .row-fluid:after{clear:both;} .row-fluid>[class*="span"]{float:left;margin-left:2.564102564%;} .row-fluid>[class*="span"]:first-child{margin-left:0;} .row-fluid > .span12{width:100%;} .row-fluid > .span11{width:91.45299145300001%;} .row-fluid > .span10{width:82.905982906%;} .row-fluid > .span9{width:74.358974359%;} .row-fluid > .span8{width:65.81196581200001%;} .row-fluid > .span7{width:57.264957265%;} .row-fluid > .span6{width:48.717948718%;} .row-fluid > .span5{width:40.170940171000005%;} .row-fluid > .span4{width:31.623931624%;} .row-fluid > .span3{width:23.076923077%;} .row-fluid > .span2{width:14.529914530000001%;} .row-fluid > .span1{width:5.982905983%;} input,textarea,.uneditable-input{margin-left:0;} input.span12, textarea.span12, .uneditable-input.span12{width:1160px;} input.span11, textarea.span11, .uneditable-input.span11{width:1060px;} input.span10, textarea.span10, .uneditable-input.span10{width:960px;} input.span9, textarea.span9, .uneditable-input.span9{width:860px;} input.span8, textarea.span8, .uneditable-input.span8{width:760px;} input.span7, textarea.span7, .uneditable-input.span7{width:660px;} input.span6, textarea.span6, .uneditable-input.span6{width:560px;} input.span5, textarea.span5, .uneditable-input.span5{width:460px;} input.span4, textarea.span4, .uneditable-input.span4{width:360px;} input.span3, textarea.span3, .uneditable-input.span3{width:260px;} input.span2, textarea.span2, .uneditable-input.span2{width:160px;} input.span1, textarea.span1, .uneditable-input.span1{width:60px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;}}
diff --git a/civicrm/vendor/tubalmartin/cssmin/gui/third-party/bootstrap/js/bootstrap.min.js b/civicrm/vendor/tubalmartin/cssmin/gui/third-party/bootstrap/js/bootstrap.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..c6e23ea8e1785f6617e576bda039629b82b9e559
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/gui/third-party/bootstrap/js/bootstrap.min.js
@@ -0,0 +1,7 @@
+/**
+* Bootstrap.js by @fat & @mdo
+* plugins: bootstrap-button.js
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(a){var b=function(b,c){this.$element=a(b),this.options=a.extend({},a.fn.button.defaults,c)};b.prototype={constructor:b,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(){a=="loadingText"?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},toggle:function(){var a=this.$element.parent('[data-toggle="buttons-radio"]');a&&a.find(".active").removeClass("active"),this.$element.toggleClass("active")}},a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("button"),f=typeof c=="object"&&c;e||d.data("button",e=new b(this,f)),c=="toggle"?e.toggle():c&&e.setState(c)})},a.fn.button.defaults={loadingText:"loading..."},a.fn.button.Constructor=b,a(function(){a("body").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)
\ No newline at end of file
diff --git a/civicrm/vendor/tubalmartin/cssmin/gui/third-party/jquery-1.12.4.min.js b/civicrm/vendor/tubalmartin/cssmin/gui/third-party/jquery-1.12.4.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..f36cd4c4e3d53b695751656f2b63f23a8070c1a0
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/gui/third-party/jquery-1.12.4.min.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="1.12.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.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]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.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,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?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)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===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]||fa.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]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(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){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.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.replace(P," ")+" ").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,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("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===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.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.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.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"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=la(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=ma(b);function pa(){}pa.prototype=d.filters=d.pseudos,d.setFilters=new pa,g=fa.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=R.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=S.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(Q," ")}),h=h.slice(c.length));for(g in d.filter)!(e=W[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?fa.error(a):z(a,i).slice(0)};function qa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(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 va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){n.each(b,function(b,c){n.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==n.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return n.each(arguments,function(a,b){var c;while((c=n.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.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=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0;
+}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),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 n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?n.queue(this[0],a):void 0===b?this:this.each(function(){var c=n.queue(this,a,b);n._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&n.dequeue(this,a)})},dequeue:function(a){return this.each(function(){n.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=n.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=n._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}}),function(){var a;l.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,e;return c=d.getElementsByTagName("body")[0],c&&c.style?(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(d.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(e),a):void 0}}();var T=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,U=new RegExp("^(?:([+-])=|)("+T+")([a-z%]*)$","i"),V=["Top","Right","Bottom","Left"],W=function(a,b){return a=b||a,"none"===n.css(a,"display")||!n.contains(a.ownerDocument,a)};function X(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return n.css(a,b,"")},i=h(),j=c&&c[3]||(n.cssNumber[b]?"":"px"),k=(n.cssNumber[b]||"px"!==j&&+i)&&U.exec(n.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,n.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var Y=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)Y(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav></:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={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:l.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/<tbody/i;function ia(a){Z.test(a.type)&&(a.defaultChecked=a.checked)}function ja(a,b,c,d,e){for(var f,g,h,i,j,k,m,o=a.length,p=ca(b),q=[],r=0;o>r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?"<table>"!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==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,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[n.expando])return a;var b,c,e,f=a.type,g=a,h=this.fixHooks[f];h||(this.fixHooks[f]=h=ma.test(f)?this.mouseHooks:la.test(f)?this.keyHooks:{}),e=h.props?this.props.concat(h.props):this.props,a=new n.Event(g),b=e.length;while(b--)c=e[b],a[c]=g[c];return a.target||(a.target=g.srcElement||d),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,h.filter?h.filter(a,g):a},props:"altKey bubbles cancelable ctrlKey currentTarget detail 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,b){var c,e,f,g=b.button,h=b.fromElement;return null==a.pageX&&null!=b.clientX&&(e=a.target.ownerDocument||d,f=e.documentElement,c=e.body,a.pageX=b.clientX+(f&&f.scrollLeft||c&&c.scrollLeft||0)-(f&&f.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(f&&f.scrollTop||c&&c.scrollTop||0)-(f&&f.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&h&&(a.relatedTarget=h===a.target?b.toElement:h),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==ra()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===ra()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return n.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return n.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c){var d=n.extend(new n.Event,c,{type:a,isSimulated:!0});n.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}},n.removeEvent=d.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)}:function(a,b,c){var d="on"+b;a.detachEvent&&("undefined"==typeof a[d]&&(a[d]=null),a.detachEvent(d,c))},n.Event=function(a,b){return this instanceof n.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?pa:qa):this.type=a,b&&n.extend(this,b),this.timeStamp=a&&a.timeStamp||n.now(),void(this[n.expando]=!0)):new n.Event(a,b)},n.Event.prototype={constructor:n.Event,isDefaultPrevented:qa,isPropagationStopped:qa,isImmediatePropagationStopped:qa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=pa,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=pa,a&&!this.isSimulated&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=pa,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},n.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){n.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||n.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),l.submit||(n.event.special.submit={setup:function(){return n.nodeName(this,"form")?!1:void n.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=n.nodeName(b,"input")||n.nodeName(b,"button")?n.prop(b,"form"):void 0;c&&!n._data(c,"submit")&&(n.event.add(c,"submit._submit",function(a){a._submitBubble=!0}),n._data(c,"submit",!0))})},postDispatch:function(a){a._submitBubble&&(delete a._submitBubble,this.parentNode&&!a.isTrigger&&n.event.simulate("submit",this.parentNode,a))},teardown:function(){return n.nodeName(this,"form")?!1:void n.event.remove(this,"._submit")}}),l.change||(n.event.special.change={setup:function(){return ka.test(this.nodeName)?("checkbox"!==this.type&&"radio"!==this.type||(n.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._justChanged=!0)}),n.event.add(this,"click._change",function(a){this._justChanged&&!a.isTrigger&&(this._justChanged=!1),n.event.simulate("change",this,a)})),!1):void n.event.add(this,"beforeactivate._change",function(a){var b=a.target;ka.test(b.nodeName)&&!n._data(b,"change")&&(n.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||n.event.simulate("change",this.parentNode,a)}),n._data(b,"change",!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 n.event.remove(this,"._change"),!ka.test(this.nodeName)}}),l.focusin||n.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){n.event.simulate(b,a.target,n.event.fix(a))};n.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=n._data(d,b);e||d.addEventListener(a,c,!0),n._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=n._data(d,b)-1;e?n._data(d,b,e):(d.removeEventListener(a,c,!0),n._removeData(d,b))}}}),n.fn.extend({on:function(a,b,c,d){return sa(this,a,b,c,d)},one:function(a,b,c,d){return sa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,n(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=qa),this.each(function(){n.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){n.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?n.event.trigger(a,b,c,!0):void 0}});var ta=/ jQuery\d+="(?:null|\d+)"/g,ua=new RegExp("<(?:"+ba+")[\\s/>]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/<script|<style|<link/i,xa=/checked\s*(?:[^=]|=\s*.checked.)/i,ya=/^true\/(.*)/,za=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._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++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.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 Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.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 n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Ja[0].contentWindow||Ja[0].contentDocument).document,b.write(),b.close(),c=La(a,b),Ja.detach()),Ka[a]=c),c}var Na=/^margin/,Oa=new RegExp("^("+T+")(?!px)[a-z%]+$","i"),Pa=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},Qa=d.documentElement;!function(){var b,c,e,f,g,h,i=d.createElement("div"),j=d.createElement("div");if(j.style){j.style.cssText="float:left;opacity:.5",l.opacity="0.5"===j.style.opacity,l.cssFloat=!!j.style.cssFloat,j.style.backgroundClip="content-box",j.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===j.style.backgroundClip,i=d.createElement("div"),i.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",j.innerHTML="",i.appendChild(j),l.boxSizing=""===j.style.boxSizing||""===j.style.MozBoxSizing||""===j.style.WebkitBoxSizing,n.extend(l,{reliableHiddenOffsets:function(){return null==b&&k(),f},boxSizingReliable:function(){return null==b&&k(),e},pixelMarginRight:function(){return null==b&&k(),c},pixelPosition:function(){return null==b&&k(),b},reliableMarginRight:function(){return null==b&&k(),g},reliableMarginLeft:function(){return null==b&&k(),h}});function k(){var k,l,m=d.documentElement;m.appendChild(i),j.style.cssText="-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",b=e=h=!1,c=g=!0,a.getComputedStyle&&(l=a.getComputedStyle(j),b="1%"!==(l||{}).top,h="2px"===(l||{}).marginLeft,e="4px"===(l||{width:"4px"}).width,j.style.marginRight="50%",c="4px"===(l||{marginRight:"4px"}).marginRight,k=j.appendChild(d.createElement("div")),k.style.cssText=j.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",k.style.marginRight=k.style.width="0",j.style.width="1px",g=!parseFloat((a.getComputedStyle(k)||{}).marginRight),j.removeChild(k)),j.style.display="none",f=0===j.getClientRects().length,f&&(j.style.display="",j.innerHTML="<table><tr><td></td><td>t</td></tr></table>",j.childNodes[0].style.borderCollapse="separate",k=j.getElementsByTagName("td"),k[0].style.cssText="margin:0;border:0;padding:0;display:none",f=0===k[0].offsetHeight,f&&(k[0].style.display="",k[1].style.display="none",f=0===k[0].offsetHeight)),m.removeChild(i)}}}();var Ra,Sa,Ta=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ra=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c.getPropertyValue(b)||c[b]:void 0,""!==g&&void 0!==g||n.contains(a.ownerDocument,a)||(g=n.style(a,b)),c&&!l.pixelMarginRight()&&Oa.test(g)&&Na.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f),void 0===g?g:g+""}):Qa.currentStyle&&(Ra=function(a){return a.currentStyle},Sa=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ra(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Oa.test(g)&&!Ta.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Ua(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Va=/alpha\([^)]*\)/i,Wa=/opacity\s*=\s*([^)]*)/i,Xa=/^(none|table(?!-c[ea]).+)/,Ya=new RegExp("^("+T+")(.*)$","i"),Za={position:"absolute",visibility:"hidden",display:"block"},$a={letterSpacing:"0",fontWeight:"400"},_a=["Webkit","O","Moz","ms"],ab=d.createElement("div").style;function bb(a){if(a in ab)return a;var b=a.charAt(0).toUpperCase()+a.slice(1),c=_a.length;while(c--)if(a=_a[c]+b,a in ab)return a}function cb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=n._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&W(d)&&(f[g]=n._data(d,"olddisplay",Ma(d.nodeName)))):(e=W(d),(c&&"none"!==c||!e)&&n._data(d,"olddisplay",e?c:n.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 db(a,b,c){var d=Ya.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function eb(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+=n.css(a,c+V[f],!0,e)),d?("content"===c&&(g-=n.css(a,"padding"+V[f],!0,e)),"margin"!==c&&(g-=n.css(a,"border"+V[f]+"Width",!0,e))):(g+=n.css(a,"padding"+V[f],!0,e),"padding"!==c&&(g+=n.css(a,"border"+V[f]+"Width",!0,e)));return g}function fb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ra(a),g=l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Sa(a,b,f),(0>e||null==e)&&(e=a.style[b]),Oa.test(e))return e;d=g&&(l.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+eb(a,b,c||(g?"border":"content"),d,f)+"px"}n.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Sa(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":l.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=n.camelCase(b),i=a.style;if(b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=U.exec(c))&&e[1]&&(c=X(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(n.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=n.camelCase(b);return b=n.cssProps[h]||(n.cssProps[h]=bb(h)||h),g=n.cssHooks[b]||n.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Sa(a,b,d)),"normal"===f&&b in $a&&(f=$a[b]),""===c||c?(e=parseFloat(f),c===!0||isFinite(e)?e||0:f):f}}),n.each(["height","width"],function(a,b){n.cssHooks[b]={get:function(a,c,d){return c?Xa.test(n.css(a,"display"))&&0===a.offsetWidth?Pa(a,Za,function(){return fb(a,b,d)}):fb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ra(a);return db(a,c,d?eb(a,b,d,l.boxSizing&&"border-box"===n.css(a,"boxSizing",!1,e),e):0)}}}),l.opacity||(n.cssHooks.opacity={get:function(a,b){return Wa.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=n.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===n.trim(f.replace(Va,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Va.test(f)?f.replace(Va,e):f+" "+e)}}),n.cssHooks.marginRight=Ua(l.reliableMarginRight,function(a,b){return b?Pa(a,{display:"inline-block"},Sa,[a,"marginRight"]):void 0}),n.cssHooks.marginLeft=Ua(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Sa(a,"marginLeft"))||(n.contains(a.ownerDocument,a)?a.getBoundingClientRect().left-Pa(a,{
+            marginLeft:0},function(){return a.getBoundingClientRect().left}):0))+"px":void 0}),n.each({margin:"",padding:"",border:"Width"},function(a,b){n.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+V[d]+b]=f[d]||f[d-2]||f[0];return e}},Na.test(a)||(n.cssHooks[a+b].set=db)}),n.fn.extend({css:function(a,b){return Y(this,function(a,b,c){var d,e,f={},g=0;if(n.isArray(b)){for(d=Ra(a),e=b.length;e>g;g++)f[b[g]]=n.css(a,b[g],!1,d);return f}return void 0!==c?n.style(a,b,c):n.css(a,b)},a,b,arguments.length>1)},show:function(){return cb(this,!0)},hide:function(){return cb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){W(this)?n(this).show():n(this).hide()})}});function gb(a,b,c,d,e){return new gb.prototype.init(a,b,c,d,e)}n.Tween=gb,gb.prototype={constructor:gb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||n.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(n.cssNumber[c]?"":"px")},cur:function(){var a=gb.propHooks[this.prop];return a&&a.get?a.get(this):gb.propHooks._default.get(this)},run:function(a){var b,c=gb.propHooks[this.prop];return this.options.duration?this.pos=b=n.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=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):gb.propHooks._default.set(this),this}},gb.prototype.init.prototype=gb.prototype,gb.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=n.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){n.fx.step[a.prop]?n.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[n.cssProps[a.prop]]&&!n.cssHooks[a.prop]?a.elem[a.prop]=a.now:n.style(a.elem,a.prop,a.now+a.unit)}}},gb.propHooks.scrollTop=gb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},n.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},n.fx=gb.prototype.init,n.fx.step={};var hb,ib,jb=/^(?:toggle|show|hide)$/,kb=/queueHooks$/;function lb(){return a.setTimeout(function(){hb=void 0}),hb=n.now()}function mb(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=V[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function nb(a,b,c){for(var d,e=(qb.tweeners[b]||[]).concat(qb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ob(a,b,c){var d,e,f,g,h,i,j,k,m=this,o={},p=a.style,q=a.nodeType&&W(a),r=n._data(a,"fxshow");c.queue||(h=n._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,m.always(function(){m.always(function(){h.unqueued--,n.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=n.css(a,"display"),k="none"===j?n._data(a,"olddisplay")||Ma(a.nodeName):j,"inline"===k&&"none"===n.css(a,"float")&&(l.inlineBlockNeedsLayout&&"inline"!==Ma(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",l.shrinkWrapBlocks()||m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],jb.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||n.style(a,d)}else j=void 0;if(n.isEmptyObject(o))"inline"===("none"===j?Ma(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=n._data(a,"fxshow",{}),f&&(r.hidden=!q),q?n(a).show():m.done(function(){n(a).hide()}),m.done(function(){var b;n._removeData(a,"fxshow");for(b in o)n.style(a,b,o[b])});for(d in o)g=nb(q?r[d]:0,d,m),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function pb(a,b){var c,d,e,f,g;for(c in a)if(d=n.camelCase(c),e=b[d],f=a[c],n.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=n.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function qb(a,b,c){var d,e,f=0,g=qb.prefilters.length,h=n.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=hb||lb(),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:n.extend({},b),opts:n.extend(!0,{specialEasing:{},easing:n.easing._default},c),originalProperties:b,originalOptions:c,startTime:hb||lb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=n.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.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(pb(k,j.opts.specialEasing);g>f;f++)if(d=qb.prefilters[f].call(j,a,k,j.opts))return n.isFunction(d.stop)&&(n._queueHooks(j.elem,j.opts.queue).stop=n.proxy(d.stop,d)),d;return n.map(k,nb,j),n.isFunction(j.opts.start)&&j.opts.start.call(a,j),n.fx.timer(n.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)}n.Animation=n.extend(qb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return X(c.elem,a,U.exec(b),c),c}]},tweener:function(a,b){n.isFunction(a)?(b=a,a=["*"]):a=a.match(G);for(var c,d=0,e=a.length;e>d;d++)c=a[d],qb.tweeners[c]=qb.tweeners[c]||[],qb.tweeners[c].unshift(b)},prefilters:[ob],prefilter:function(a,b){b?qb.prefilters.unshift(a):qb.prefilters.push(a)}}),n.speed=function(a,b,c){var d=a&&"object"==typeof a?n.extend({},a):{complete:c||!c&&b||n.isFunction(a)&&a,duration:a,easing:c&&b||b&&!n.isFunction(b)&&b};return d.duration=n.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in n.fx.speeds?n.fx.speeds[d.duration]:n.fx.speeds._default,null!=d.queue&&d.queue!==!0||(d.queue="fx"),d.old=d.complete,d.complete=function(){n.isFunction(d.old)&&d.old.call(this),d.queue&&n.dequeue(this,d.queue)},d},n.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=n.isEmptyObject(a),f=n.speed(b,c,d),g=function(){var b=qb(this,n.extend({},a),f);(e||n._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,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=n.timers,g=n._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&kb.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||n.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=n._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=n.timers,g=d?d.length:0;for(c.finish=!0,n.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),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})}}),n.each(["toggle","show","hide"],function(a,b){var c=n.fn[b];n.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(mb(b,!0),a,d,e)}}),n.each({slideDown:mb("show"),slideUp:mb("hide"),slideToggle:mb("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){n.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),n.timers=[],n.fx.tick=function(){var a,b=n.timers,c=0;for(hb=n.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||n.fx.stop(),hb=void 0},n.fx.timer=function(a){n.timers.push(a),a()?n.fx.start():n.timers.pop()},n.fx.interval=13,n.fx.start=function(){ib||(ib=a.setInterval(n.fx.tick,n.fx.interval))},n.fx.stop=function(){a.clearInterval(ib),ib=null},n.fx.speeds={slow:600,fast:200,_default:400},n.fn.delay=function(b,c){return b=n.fx?n.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a,b=d.createElement("input"),c=d.createElement("div"),e=d.createElement("select"),f=e.appendChild(d.createElement("option"));c=d.createElement("div"),c.setAttribute("className","t"),c.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",a=c.getElementsByTagName("a")[0],b.setAttribute("type","checkbox"),c.appendChild(b),a=c.getElementsByTagName("a")[0],a.style.cssText="top:1px",l.getSetAttribute="t"!==c.className,l.style=/top/.test(a.getAttribute("style")),l.hrefNormalized="/a"===a.getAttribute("href"),l.checkOn=!!b.value,l.optSelected=f.selected,l.enctype=!!d.createElement("form").enctype,e.disabled=!0,l.optDisabled=!f.disabled,b=d.createElement("input"),b.setAttribute("value",""),l.input=""===b.getAttribute("value"),b.value="t",b.setAttribute("type","radio"),l.radioValue="t"===b.value}();var rb=/\r/g,sb=/[\x20\t\r\n\f]+/g;n.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=n.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,n(this).val()):a,null==e?e="":"number"==typeof e?e+="":n.isArray(e)&&(e=n.map(e,function(a){return null==a?"":a+""})),b=n.valHooks[this.type]||n.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=n.valHooks[e.type]||n.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),n.extend({valHooks:{option:{get:function(a){var b=n.find.attr(a,"value");return null!=b?b:n.trim(n.text(a)).replace(sb," ")}},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)&&(l.optDisabled?!c.disabled:null===c.getAttribute("disabled"))&&(!c.parentNode.disabled||!n.nodeName(c.parentNode,"optgroup"))){if(b=n(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=n.makeArray(b),g=e.length;while(g--)if(d=e[g],n.inArray(n.valHooks.option.get(d),f)>-1)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),n.each(["radio","checkbox"],function(){n.valHooks[this]={set:function(a,b){return n.isArray(b)?a.checked=n.inArray(n(a).val(),b)>-1:void 0}},l.checkOn||(n.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var tb,ub,vb=n.expr.attrHandle,wb=/^(?:checked|selected)$/i,xb=l.getSetAttribute,yb=l.input;n.fn.extend({attr:function(a,b){return Y(this,n.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){n.removeAttr(this,a)})}}),n.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?n.prop(a,b,c):(1===f&&n.isXMLDoc(a)||(b=b.toLowerCase(),e=n.attrHooks[b]||(n.expr.match.bool.test(b)?ub:tb)),void 0!==c?null===c?void n.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=n.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&n.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(G);if(f&&1===a.nodeType)while(c=f[e++])d=n.propFix[c]||c,n.expr.match.bool.test(c)?yb&&xb||!wb.test(c)?a[d]=!1:a[n.camelCase("default-"+c)]=a[d]=!1:n.attr(a,c,""),a.removeAttribute(xb?c:d)}}),ub={set:function(a,b,c){return b===!1?n.removeAttr(a,c):yb&&xb||!wb.test(c)?a.setAttribute(!xb&&n.propFix[c]||c,c):a[n.camelCase("default-"+c)]=a[c]=!0,c}},n.each(n.expr.match.bool.source.match(/\w+/g),function(a,b){var c=vb[b]||n.find.attr;yb&&xb||!wb.test(b)?vb[b]=function(a,b,d){var e,f;return d||(f=vb[b],vb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,vb[b]=f),e}:vb[b]=function(a,b,c){return c?void 0:a[n.camelCase("default-"+b)]?b.toLowerCase():null}}),yb&&xb||(n.attrHooks.value={set:function(a,b,c){return n.nodeName(a,"input")?void(a.defaultValue=b):tb&&tb.set(a,b,c)}}),xb||(tb={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},vb.id=vb.name=vb.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},n.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:tb.set},n.attrHooks.contenteditable={set:function(a,b,c){tb.set(a,""===b?!1:b,c)}},n.each(["width","height"],function(a,b){n.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),l.style||(n.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var zb=/^(?:input|select|textarea|button|object)$/i,Ab=/^(?:a|area)$/i;n.fn.extend({prop:function(a,b){return Y(this,n.prop,a,b,arguments.length>1)},removeProp:function(a){return a=n.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),n.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&n.isXMLDoc(a)||(b=n.propFix[b]||b,e=n.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=n.find.attr(a,"tabindex");return b?parseInt(b,10):zb.test(a.nodeName)||Ab.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.hrefNormalized||n.each(["href","src"],function(a,b){n.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),l.optSelected||(n.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),n.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){n.propFix[this.toLowerCase()]=this}),l.enctype||(n.propFix.enctype="encoding");var Bb=/[\t\r\n\f]/g;function Cb(a){return n.attr(a,"class")||""}n.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).addClass(a.call(this,b,Cb(this)))});if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(n.isFunction(a))return this.each(function(b){n(this).removeClass(a.call(this,b,Cb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(G)||[];while(c=this[i++])if(e=Cb(c),d=1===c.nodeType&&(" "+e+" ").replace(Bb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=n.trim(d),e!==h&&n.attr(c,"class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):n.isFunction(a)?this.each(function(c){n(this).toggleClass(a.call(this,c,Cb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=n(this),f=a.match(G)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=Cb(this),b&&n._data(this,"__className__",b),n.attr(this,"class",b||a===!1?"":n._data(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+Cb(c)+" ").replace(Bb," ").indexOf(b)>-1)return!0;return!1}}),n.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){n.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),n.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Db=a.location,Eb=n.now(),Fb=/\?/,Gb=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;n.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=n.trim(b+"");return e&&!n.trim(e.replace(Gb,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():n.error("Invalid JSON: "+b)},n.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new a.DOMParser,c=d.parseFromString(b,"text/xml")):(c=new a.ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||n.error("Invalid XML: "+b),c};var Hb=/#.*$/,Ib=/([?&])_=[^&]*/,Jb=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Kb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Lb=/^(?:GET|HEAD)$/,Mb=/^\/\//,Nb=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Ob={},Pb={},Qb="*/".concat("*"),Rb=Db.href,Sb=Nb.exec(Rb.toLowerCase())||[];function Tb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(G)||[];if(n.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Ub(a,b,c,d){var e={},f=a===Pb;function g(h){var i;return e[h]=!0,n.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Vb(a,b){var c,d,e=n.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&n.extend(!0,a,c),a}function Wb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Xb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}n.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Rb,type:"GET",isLocal:Kb.test(Sb[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Qb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":n.parseJSON,"text xml":n.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Vb(Vb(a,n.ajaxSettings),b):Vb(n.ajaxSettings,a)},ajaxPrefilter:Tb(Ob),ajaxTransport:Tb(Pb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var d,e,f,g,h,i,j,k,l=n.ajaxSetup({},c),m=l.context||l,o=l.context&&(m.nodeType||m.jquery)?n(m):n.event,p=n.Deferred(),q=n.Callbacks("once memory"),r=l.statusCode||{},s={},t={},u=0,v="canceled",w={readyState:0,getResponseHeader:function(a){var b;if(2===u){if(!k){k={};while(b=Jb.exec(g))k[b[1].toLowerCase()]=b[2]}b=k[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===u?g: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||(l.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 j&&j.abort(b),y(0,b),this}};if(p.promise(w).complete=q.add,w.success=w.done,w.error=w.fail,l.url=((b||l.url||Rb)+"").replace(Hb,"").replace(Mb,Sb[1]+"//"),l.type=c.method||c.type||l.method||l.type,l.dataTypes=n.trim(l.dataType||"*").toLowerCase().match(G)||[""],null==l.crossDomain&&(d=Nb.exec(l.url.toLowerCase()),l.crossDomain=!(!d||d[1]===Sb[1]&&d[2]===Sb[2]&&(d[3]||("http:"===d[1]?"80":"443"))===(Sb[3]||("http:"===Sb[1]?"80":"443")))),l.data&&l.processData&&"string"!=typeof l.data&&(l.data=n.param(l.data,l.traditional)),Ub(Ob,l,c,w),2===u)return w;i=n.event&&l.global,i&&0===n.active++&&n.event.trigger("ajaxStart"),l.type=l.type.toUpperCase(),l.hasContent=!Lb.test(l.type),f=l.url,l.hasContent||(l.data&&(f=l.url+=(Fb.test(f)?"&":"?")+l.data,delete l.data),l.cache===!1&&(l.url=Ib.test(f)?f.replace(Ib,"$1_="+Eb++):f+(Fb.test(f)?"&":"?")+"_="+Eb++)),l.ifModified&&(n.lastModified[f]&&w.setRequestHeader("If-Modified-Since",n.lastModified[f]),n.etag[f]&&w.setRequestHeader("If-None-Match",n.etag[f])),(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&w.setRequestHeader("Content-Type",l.contentType),w.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+("*"!==l.dataTypes[0]?", "+Qb+"; q=0.01":""):l.accepts["*"]);for(e in l.headers)w.setRequestHeader(e,l.headers[e]);if(l.beforeSend&&(l.beforeSend.call(m,w,l)===!1||2===u))return w.abort();v="abort";for(e in{success:1,error:1,complete:1})w[e](l[e]);if(j=Ub(Pb,l,c,w)){if(w.readyState=1,i&&o.trigger("ajaxSend",[w,l]),2===u)return w;l.async&&l.timeout>0&&(h=a.setTimeout(function(){w.abort("timeout")},l.timeout));try{u=1,j.send(s,y)}catch(x){if(!(2>u))throw x;y(-1,x)}}else y(-1,"No Transport");function y(b,c,d,e){var k,s,t,v,x,y=c;2!==u&&(u=2,h&&a.clearTimeout(h),j=void 0,g=e||"",w.readyState=b>0?4:0,k=b>=200&&300>b||304===b,d&&(v=Wb(l,w,d)),v=Xb(l,v,w,k),k?(l.ifModified&&(x=w.getResponseHeader("Last-Modified"),x&&(n.lastModified[f]=x),x=w.getResponseHeader("etag"),x&&(n.etag[f]=x)),204===b||"HEAD"===l.type?y="nocontent":304===b?y="notmodified":(y=v.state,s=v.data,t=v.error,k=!t)):(t=y,!b&&y||(y="error",0>b&&(b=0))),w.status=b,w.statusText=(c||y)+"",k?p.resolveWith(m,[s,y,w]):p.rejectWith(m,[w,y,t]),w.statusCode(r),r=void 0,i&&o.trigger(k?"ajaxSuccess":"ajaxError",[w,l,k?s:t]),q.fireWith(m,[w,y]),i&&(o.trigger("ajaxComplete",[w,l]),--n.active||n.event.trigger("ajaxStop")))}return w},getJSON:function(a,b,c){return n.get(a,b,c,"json")},getScript:function(a,b){return n.get(a,void 0,b,"script")}}),n.each(["get","post"],function(a,b){n[b]=function(a,c,d,e){return n.isFunction(c)&&(e=e||d,d=c,c=void 0),n.ajax(n.extend({url:a,type:b,dataType:e,data:c,success:d},n.isPlainObject(a)&&a))}}),n._evalUrl=function(a){return n.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},n.fn.extend({wrapAll:function(a){if(n.isFunction(a))return this.each(function(b){n(this).wrapAll(a.call(this,b))});if(this[0]){var b=n(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return n.isFunction(a)?this.each(function(b){n(this).wrapInner(a.call(this,b))}):this.each(function(){var b=n(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=n.isFunction(a);return this.each(function(c){n(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){n.nodeName(this,"body")||n(this).replaceWith(this.childNodes)}).end()}});function Yb(a){return a.style&&a.style.display||n.css(a,"display")}function Zb(a){if(!n.contains(a.ownerDocument||d,a))return!0;while(a&&1===a.nodeType){if("none"===Yb(a)||"hidden"===a.type)return!0;a=a.parentNode}return!1}n.expr.filters.hidden=function(a){return l.reliableHiddenOffsets()?a.offsetWidth<=0&&a.offsetHeight<=0&&!a.getClientRects().length:Zb(a)},n.expr.filters.visible=function(a){return!n.expr.filters.hidden(a)};var $b=/%20/g,_b=/\[\]$/,ac=/\r?\n/g,bc=/^(?:submit|button|image|reset|file)$/i,cc=/^(?:input|select|textarea|keygen)/i;function dc(a,b,c,d){var e;if(n.isArray(b))n.each(b,function(b,e){c||_b.test(a)?d(a,e):dc(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==n.type(b))d(a,b);else for(e in b)dc(a+"["+e+"]",b[e],c,d)}n.param=function(a,b){var c,d=[],e=function(a,b){b=n.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=n.ajaxSettings&&n.ajaxSettings.traditional),n.isArray(a)||a.jquery&&!n.isPlainObject(a))n.each(a,function(){e(this.name,this.value)});else for(c in a)dc(c,a[c],b,e);return d.join("&").replace($b,"+")},n.fn.extend({serialize:function(){return n.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=n.prop(this,"elements");return a?n.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!n(this).is(":disabled")&&cc.test(this.nodeName)&&!bc.test(a)&&(this.checked||!Z.test(a))}).map(function(a,b){var c=n(this).val();return null==c?null:n.isArray(c)?n.map(c,function(a){return{name:b.name,value:a.replace(ac,"\r\n")}}):{name:b.name,value:c.replace(ac,"\r\n")}}).get()}}),n.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return this.isLocal?ic():d.documentMode>8?hc():/^(get|post|head|put|delete|options)$/i.test(this.type)&&hc()||ic()}:hc;var ec=0,fc={},gc=n.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in fc)fc[a](void 0,!0)}),l.cors=!!gc&&"withCredentials"in gc,gc=l.ajax=!!gc,gc&&n.ajaxTransport(function(b){if(!b.crossDomain||l.cors){var c;return{send:function(d,e){var f,g=b.xhr(),h=++ec;if(g.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(f in b.xhrFields)g[f]=b.xhrFields[f];b.mimeType&&g.overrideMimeType&&g.overrideMimeType(b.mimeType),b.crossDomain||d["X-Requested-With"]||(d["X-Requested-With"]="XMLHttpRequest");for(f in d)void 0!==d[f]&&g.setRequestHeader(f,d[f]+"");g.send(b.hasContent&&b.data||null),c=function(a,d){var f,i,j;if(c&&(d||4===g.readyState))if(delete fc[h],c=void 0,g.onreadystatechange=n.noop,d)4!==g.readyState&&g.abort();else{j={},f=g.status,"string"==typeof g.responseText&&(j.text=g.responseText);try{i=g.statusText}catch(k){i=""}f||!b.isLocal||b.crossDomain?1223===f&&(f=204):f=j.text?200:404}j&&e(f,i,j,g.getAllResponseHeaders())},b.async?4===g.readyState?a.setTimeout(c):g.onreadystatechange=fc[h]=c:c()},abort:function(){c&&c(void 0,!0)}}}});function hc(){try{return new a.XMLHttpRequest}catch(b){}}function ic(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}n.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return n.globalEval(a),a}}}),n.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),n.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=d.head||n("head")[0]||d.documentElement;return{send:function(e,f){b=d.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||f(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var jc=[],kc=/(=)\?(?=&|$)|\?\?/;n.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=jc.pop()||n.expando+"_"+Eb++;return this[a]=!0,a}}),n.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(kc.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&kc.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=n.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(kc,"$1"+e):b.jsonp!==!1&&(b.url+=(Fb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||n.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?n(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,jc.push(e)),g&&n.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),n.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||d;var e=x.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ja([a],b,f),f&&f.length&&n(f).remove(),n.merge([],e.childNodes))};var lc=n.fn.load;n.fn.load=function(a,b,c){if("string"!=typeof a&&lc)return lc.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=n.trim(a.slice(h,a.length)),a=a.slice(0,h)),n.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&n.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?n("<div>").append(n.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},n.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){n.fn[b]=function(a){return this.on(b,a)}}),n.expr.filters.animated=function(a){return n.grep(n.timers,function(b){return a===b.elem}).length};function mc(a){return n.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}n.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=n.css(a,"position"),l=n(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=n.css(a,"top"),i=n.css(a,"left"),j=("absolute"===k||"fixed"===k)&&n.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),n.isFunction(b)&&(b=b.call(a,c,n.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},n.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){n.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,n.contains(b,e)?("undefined"!=typeof e.getBoundingClientRect&&(d=e.getBoundingClientRect()),c=mc(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===n.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),n.nodeName(a[0],"html")||(c=a.offset()),c.top+=n.css(a[0],"borderTopWidth",!0),c.left+=n.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-n.css(d,"marginTop",!0),left:b.left-c.left-n.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&!n.nodeName(a,"html")&&"static"===n.css(a,"position"))a=a.offsetParent;return a||Qa})}}),n.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);n.fn[a]=function(d){return Y(this,function(a,d,e){var f=mc(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?n(f).scrollLeft():e,c?e:n(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),n.each(["top","left"],function(a,b){n.cssHooks[b]=Ua(l.pixelPosition,function(a,c){return c?(c=Sa(a,b),Oa.test(c)?n(a).position()[b]+"px":c):void 0})}),n.each({Height:"height",Width:"width"},function(a,b){n.each({
+    padding:"inner"+a,content:b,"":"outer"+a},function(c,d){n.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return Y(this,function(b,c,d){var e;return n.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?n.css(b,c,g):n.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),n.fn.extend({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)}}),n.fn.size=function(){return this.length},n.fn.andSelf=n.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return n});var nc=a.jQuery,oc=a.$;return n.noConflict=function(b){return a.$===n&&(a.$=oc),b&&a.jQuery===n&&(a.jQuery=nc),n},b||(a.jQuery=a.$=n),n});
\ No newline at end of file
diff --git a/civicrm/vendor/tubalmartin/cssmin/gui/third-party/less-1.7.5.min.js b/civicrm/vendor/tubalmartin/cssmin/gui/third-party/less-1.7.5.min.js
new file mode 100755
index 0000000000000000000000000000000000000000..958b1212edcc3767bc0ca88e680ac6a1417a52b4
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/gui/third-party/less-1.7.5.min.js
@@ -0,0 +1,16 @@
+/*!
+ * Less - Leaner CSS v1.7.5
+ * http://lesscss.org
+ *
+ * Copyright (c) 2009-2014, Alexis Sellier <self@cloudhead.net>
+ * Licensed under the Apache v2 License.
+ *
+ */
+
+ /** * @license Apache v2
+ */
+
+!function(a,b){function c(b){return a.less[b.split("/")[1]]}function d(a,b){"undefined"!=typeof console&&w.logLevel>=b&&console.log("less: "+a)}function e(a){return a.replace(/^[a-z-]+:\/+?[^\/]+/,"").replace(/^\//,"").replace(/\.[a-zA-Z]+$/,"").replace(/[^\.\w-]+/g,"-").replace(/\./g,":")}function f(a,c){var e="{line} {content}",f=a.filename||c,g=[],h=(a.type||"Syntax")+"Error: "+(a.message||"There is an error in your .less file")+" in "+f+" ",i=function(a,c,d){a.extract[c]!==b&&g.push(e.replace(/\{line\}/,(parseInt(a.line,10)||0)+(c-1)).replace(/\{class\}/,d).replace(/\{content\}/,a.extract[c]))};a.extract?(i(a,0,""),i(a,1,"line"),i(a,2,""),h+="on line "+a.line+", column "+(a.column+1)+":\n"+g.join("\n")):a.stack&&(h+=a.stack),d(h,z.errors)}function g(a,b,c){var f=b.href||"",g="less:"+(b.title||e(f)),h=document.getElementById(g),i=!1,j=document.createElement("style");j.setAttribute("type","text/css"),b.media&&j.setAttribute("media",b.media),j.id=g,j.styleSheet||(j.appendChild(document.createTextNode(a)),i=null!==h&&h.childNodes.length>0&&j.childNodes.length>0&&h.firstChild.nodeValue===j.firstChild.nodeValue);var k=document.getElementsByTagName("head")[0];if(null===h||i===!1){var l=b&&b.nextSibling||null;l?l.parentNode.insertBefore(j,l):k.appendChild(j)}if(h&&i===!1&&h.parentNode.removeChild(h),j.styleSheet)try{j.styleSheet.cssText=a}catch(m){throw new Error("Couldn't reassign styleSheet.cssText.")}if(c&&D){d("saving "+f+" to cache.",z.info);try{D.setItem(f,a),D.setItem(f+":timestamp",c)}catch(m){d("failed to save",z.errors)}}}function h(a){return w.postProcessor&&"function"==typeof w.postProcessor&&(a=w.postProcessor.call(a,a)||a),a}function i(a,c){var d,f,h="less-error-message:"+e(c||""),i='<li><label>{line}</label><pre class="{class}">{content}</pre></li>',j=document.createElement("div"),k=[],l=a.filename||c,m=l.match(/([^\/]+(\?.*)?)$/)[1];j.id=h,j.className="less-error-message",f="<h3>"+(a.type||"Syntax")+"Error: "+(a.message||"There is an error in your .less file")+'</h3><p>in <a href="'+l+'">'+m+"</a> ";var n=function(a,c,d){a.extract[c]!==b&&k.push(i.replace(/\{line\}/,(parseInt(a.line,10)||0)+(c-1)).replace(/\{class\}/,d).replace(/\{content\}/,a.extract[c]))};a.extract?(n(a,0,""),n(a,1,"line"),n(a,2,""),f+="on line "+a.line+", column "+(a.column+1)+":</p><ul>"+k.join("")+"</ul>"):a.stack&&(f+="<br/>"+a.stack.split("\n").slice(1).join("<br/>")),j.innerHTML=f,g([".less-error-message ul, .less-error-message li {","list-style-type: none;","margin-right: 15px;","padding: 4px 0;","margin: 0;","}",".less-error-message label {","font-size: 12px;","margin-right: 15px;","padding: 4px 0;","color: #cc7777;","}",".less-error-message pre {","color: #dd6666;","padding: 4px 0;","margin: 0;","display: inline-block;","}",".less-error-message pre.line {","color: #ff0000;","}",".less-error-message h3 {","font-size: 20px;","font-weight: bold;","padding: 15px 0 5px 0;","margin: 0;","}",".less-error-message a {","color: #10a","}",".less-error-message .error {","color: red;","font-weight: bold;","padding-bottom: 2px;","border-bottom: 1px dashed red;","}"].join("\n"),{title:"error-message"}),j.style.cssText=["font-family: Arial, sans-serif","border: 1px solid #e00","background-color: #eee","border-radius: 5px","-webkit-border-radius: 5px","-moz-border-radius: 5px","color: #e00","padding: 15px","margin-bottom: 15px"].join(";"),"development"==w.env&&(d=setInterval(function(){document.body&&(document.getElementById(h)?document.body.replaceChild(j,document.getElementById(h)):document.body.insertBefore(j,document.body.firstChild),clearInterval(d))},10))}function j(a,b){w.errorReporting&&"html"!==w.errorReporting?"console"===w.errorReporting?f(a,b):"function"==typeof w.errorReporting&&w.errorReporting("add",a,b):i(a,b)}function k(a){var b=document.getElementById("less-error-message:"+e(a));b&&b.parentNode.removeChild(b)}function l(){}function m(a){w.errorReporting&&"html"!==w.errorReporting?"console"===w.errorReporting?l(a):"function"==typeof w.errorReporting&&w.errorReporting("remove",a):k(a)}function n(a){for(var b,c=document.getElementsByTagName("style"),d=0;d<c.length;d++)if(b=c[d],b.type.match(C)){var e=new w.tree.parseEnv(w),f=b.innerHTML||"";e.filename=document.location.href.replace(/#.*$/,""),(a||w.globalVars)&&(e.useFileCache=!0);var g=function(a){return function(b,c){if(b)return j(b,"inline");var d=c.toCSS(w);a.type="text/css",a.styleSheet?a.styleSheet.cssText=d:a.innerHTML=d}}(b);new w.Parser(e).parse(f,g,{globalVars:w.globalVars,modifyVars:a})}}function o(a,b){var c,d,e=/^((?:[a-z-]+:)?\/+?(?:[^\/\?#]*\/)|([\/\\]))?((?:[^\/\\\?#]*[\/\\])*)([^\/\\\?#]*)([#\?].*)?$/i,f=a.match(e),g={},h=[];if(!f)throw new Error("Could not parse sheet href - '"+a+"'");if(!f[1]||f[2]){if(d=b.match(e),!d)throw new Error("Could not parse page url - '"+b+"'");f[1]=f[1]||d[1]||"",f[2]||(f[3]=d[3]+f[3])}if(f[3]){for(h=f[3].replace(/\\/g,"/").split("/"),c=0;c<h.length;c++)"."===h[c]&&(h.splice(c,1),c-=1);for(c=0;c<h.length;c++)".."===h[c]&&c>0&&(h.splice(c-1,2),c-=2)}return g.hostPart=f[1],g.directories=h,g.path=f[1]+h.join("/"),g.fileUrl=g.path+(f[4]||""),g.url=g.fileUrl+(f[5]||""),g}function p(a,b){var c,d,e,f,g=o(a),h=o(b),i="";if(g.hostPart!==h.hostPart)return"";for(d=Math.max(h.directories.length,g.directories.length),c=0;d>c&&h.directories[c]===g.directories[c];c++);for(f=h.directories.slice(c),e=g.directories.slice(c),c=0;c<f.length-1;c++)i+="../";for(c=0;c<e.length-1;c++)i+=e[c]+"/";return i}function q(){if(a.XMLHttpRequest&&!("file:"===a.location.protocol&&"ActiveXObject"in a))return new XMLHttpRequest;try{return new ActiveXObject("Microsoft.XMLHTTP")}catch(b){return d("browser doesn't support AJAX.",z.errors),null}}function r(a,b,c,e){function f(b,c,d){b.status>=200&&b.status<300?c(b.responseText,b.getResponseHeader("Last-Modified")):"function"==typeof d&&d(b.status,a)}var g=q(),h=y?w.fileAsync:w.async;"function"==typeof g.overrideMimeType&&g.overrideMimeType("text/css"),d("XHR: Getting '"+a+"'",z.debug),g.open("GET",a,h),g.setRequestHeader("Accept",b||"text/x-less, text/css; q=0.9, */*; q=0.5"),g.send(null),y&&!w.fileAsync?0===g.status||g.status>=200&&g.status<300?c(g.responseText):e(g.status,a):h?g.onreadystatechange=function(){4==g.readyState&&f(g,c,e)}:f(g,c,e)}function s(b,c,d,e){c&&c.currentDirectory&&!/^([A-Za-z-]+:)?\//.test(b)&&(b=c.currentDirectory+b);var f=o(b,a.location.href),g=f.url,h={currentDirectory:f.path,filename:g};if(c?(h.entryPath=c.entryPath,h.rootpath=c.rootpath,h.rootFilename=c.rootFilename,h.relativeUrls=c.relativeUrls):(h.entryPath=f.path,h.rootpath=w.rootpath||f.path,h.rootFilename=g,h.relativeUrls=e.relativeUrls),h.relativeUrls&&(h.rootpath=e.rootpath?o(e.rootpath+p(f.path,h.entryPath)).path:f.path),e.useFileCache&&E[g])try{var i=E[g];d(null,i,g,h,{lastModified:new Date})}catch(j){d(j,null,g)}else r(g,e.mime,function(a,b){E[g]=a;try{d(null,a,g,h,{lastModified:b})}catch(c){d(c,null,g)}},function(a,b){d({type:"File",message:"'"+b+"' wasn't found ("+a+")"},null,g)})}function t(a,b,c,d,e){var f=new w.tree.parseEnv(w);f.mime=a.type,(e||w.globalVars)&&(f.useFileCache=!0),s(a.href,null,function(h,i,j,k,l){if(l){l.remaining=d;var n=D&&D.getItem(j),o=D&&D.getItem(j+":timestamp");if(!c&&o&&l.lastModified&&new Date(l.lastModified).valueOf()===new Date(o).valueOf())return g(n,a),l.local=!0,void b(null,null,i,a,l,j)}m(j),i?(f.currentFileInfo=k,new w.Parser(f).parse(i,function(c,d){if(c)return b(c,null,null,a);try{b(c,d,i,a,l,j)}catch(c){b(c,null,null,a)}},{modifyVars:e,globalVars:w.globalVars})):b(h,null,null,a,l,j)},f,e)}function u(a,b,c){for(var d=0;d<w.sheets.length;d++)t(w.sheets[d],a,b,w.sheets.length-(d+1),c)}function v(){"development"===w.env?(w.optimization=0,w.watchTimer=setInterval(function(){w.watchMode&&u(function(a,b,c,d,e){if(a)j(a,d.href);else if(b){var f=b.toCSS(w);f=h(f),g(f,d,e.lastModified)}})},w.poll)):w.optimization=3}("undefined"==typeof a.less||"undefined"!=typeof a.less.nodeType)&&(a.less={}),w=a.less,x=a.less.tree={},w.mode="browser";var w,x;w===b&&(w=exports,x=c("./tree"),w.mode="node"),w.Parser=function(a){function d(){D=y,G.push({current:C,i:y,j:z})}function e(){var a=G.pop();C=a.current,D=y=a.i,z=a.j}function f(){G.pop()}function g(){y>D&&(C=C.slice(y-D),D=y)}function h(a,b){var c=a.charCodeAt(0|b);return 32>=c&&(32===c||10===c||9===c)}function i(a){var b,c,d=typeof a;return"string"===d?v.charAt(y)!==a?null:(l(1),a):(g(),(b=a.exec(C))?(c=b[0].length,l(c),"string"==typeof b?b:1===b.length?b[0]:b):null)}function j(a){y>D&&(C=C.slice(y-D),D=y);var b=a.exec(C);return b?(l(b[0].length),"string"==typeof b?b:1===b.length?b[0]:b):null}function k(a){return v.charAt(y)!==a?null:(l(1),a)}function l(a){for(var b,c=y,d=z,e=y-D,f=y+C.length-e,g=y+=a,h=v;f>y&&(b=h.charCodeAt(y),!(b>32))&&(32===b||10===b||9===b||13===b);y++);return C=C.slice(a+y-g+e),D=y,!C.length&&z<B.length-1?(C=B[++z],l(0),!0):c!==y||d!==z}function m(a,b){var c="[object Function]"===Object.prototype.toString.call(a)?a.call(F):i(a);return c?c:void o(b||("string"==typeof a?"expected '"+a+"' got '"+v.charAt(y)+"'":"unexpected token"))}function n(a,b){return v.charAt(y)===a?(l(1),a):void o(b||"expected '"+a+"' got '"+v.charAt(y)+"'")}function o(a,b){var c=new Error(a);throw c.index=y,c.type=b||"Syntax",c}function p(a){return"string"==typeof a?v.charAt(y)===a:a.test(C)}function q(a){return v.charAt(y)===a}function r(a,b){return a.filename&&b.currentFileInfo.filename&&a.filename!==b.currentFileInfo.filename?E.imports.contents[a.filename]:v}function s(a,b){for(var c=a+1,d=null,e=-1;--c>=0&&"\n"!==b.charAt(c);)e++;return"number"==typeof a&&(d=(b.slice(0,a).match(/\n/g)||"").length),{line:d,column:e}}function t(a,b,d){var e=d.currentFileInfo.filename;return"browser"!==w.mode&&"rhino"!==w.mode&&(e=c("path").resolve(e)),{lineNumber:s(a,b).line+1,fileName:e}}function u(a,b){var c=r(a,b),d=s(a.index,c),e=d.line,f=d.column,g=a.call&&s(a.call,c).line,h=c.split("\n");this.type=a.type||"Syntax",this.message=a.message,this.filename=a.filename||b.currentFileInfo.filename,this.index=a.index,this.line="number"==typeof e?e+1:null,this.callLine=g+1,this.callExtract=h[g],this.stack=a.stack,this.column=f,this.extract=[h[e-1],h[e],h[e+1]]}var v,y,z,A,B,C,D,E,F,G=[],H=a&&a.filename;a instanceof x.parseEnv||(a=new x.parseEnv(a));var I=this.imports={paths:a.paths||[],queue:[],files:a.files,contents:a.contents,contentsIgnoredChars:a.contentsIgnoredChars,mime:a.mime,error:null,push:function(b,c,d,e){var f=this;this.queue.push(b);var g=function(a,c,d){f.queue.splice(f.queue.indexOf(b),1);var g=d===H;f.files[d]=c,a&&!f.error&&(f.error=a),e(a,c,g,d)};w.Parser.importer?w.Parser.importer(b,c,g,a):w.Parser.fileLoader(b,c,function(b,e,f,h){if(b)return void g(b);var i=new x.parseEnv(a);i.currentFileInfo=h,i.processImports=!1,i.contents[f]=e,(c.reference||d.reference)&&(h.reference=!0),d.inline?g(null,e,f):new w.Parser(i).parse(e,function(a,b){g(a,b,f)})},a)}},J=j;return u.prototype=new Error,u.prototype.constructor=u,this.env=a=a||{},this.optimization="optimization"in this.env?this.env.optimization:1,E={imports:I,parse:function(d,e,f){var g,h,i,j,k,l=null,m="";if(y=z=D=A=0,j=f&&f.globalVars?w.Parser.serializeVars(f.globalVars)+"\n":"",k=f&&f.modifyVars?"\n"+w.Parser.serializeVars(f.modifyVars):"",(j||f&&f.banner)&&(m=(f&&f.banner?f.banner:"")+j,E.imports.contentsIgnoredChars[a.currentFileInfo.filename]=m.length),d=d.replace(/\r\n/g,"\n"),v=d=m+d.replace(/^\uFEFF/,"")+k,E.imports.contents[a.currentFileInfo.filename]=d,B=function(b){function c(b,c){l=new u({index:c||i,type:"Parse",message:b,filename:a.currentFileInfo.filename},a)}function d(a){var c=i-s;512>c&&!a||!c||(r.push(b.slice(s,i+1)),s=i+1)}var e,f,g,h,i,j,k,m,n,o=b.length,p=0,q=0,r=[],s=0;for(i=0;o>i;i++)if(k=b.charCodeAt(i),!(k>=97&&122>=k||34>k))switch(k){case 40:q++,f=i;continue;case 41:if(--q<0)return c("missing opening `(`");continue;case 59:q||d();continue;case 123:p++,e=i;continue;case 125:if(--p<0)return c("missing opening `{`");p||q||d();continue;case 92:if(o-1>i){i++;continue}return c("unescaped `\\`");case 34:case 39:case 96:for(n=0,j=i,i+=1;o>i;i++)if(m=b.charCodeAt(i),!(m>96)){if(m==k){n=1;break}if(92==m){if(i==o-1)return c("unescaped `\\`");i++}}if(n)continue;return c("unmatched `"+String.fromCharCode(k)+"`",j);case 47:if(q||i==o-1)continue;if(m=b.charCodeAt(i+1),47==m)for(i+=2;o>i&&(m=b.charCodeAt(i),!(13>=m)||10!=m&&13!=m);i++);else if(42==m){for(g=j=i,i+=2;o-1>i&&(m=b.charCodeAt(i),125==m&&(h=i),42!=m||47!=b.charCodeAt(i+1));i++);if(i==o-1)return c("missing closing `*/`",j);i++}continue;case 42:if(o-1>i&&47==b.charCodeAt(i+1))return c("unmatched `/*`");continue}return 0!==p?g>e&&h>g?c("missing closing `}` or `*/`",e):c("missing closing `}`",e):0!==q?c("missing closing `)`",f):(d(!0),r)}(d),l)return e(new u(l,a));C=B[0];try{g=new x.Ruleset(null,this.parsers.primary()),g.root=!0,g.firstRoot=!0}catch(n){return e(new u(n,a))}if(g.toCSS=function(d){return function(e,f){e=e||{};var g,h,i=new x.evalEnv(e);"object"!=typeof f||Array.isArray(f)||(f=Object.keys(f).map(function(a){var b=f[a];return b instanceof x.Value||(b instanceof x.Expression||(b=new x.Expression([b])),b=new x.Value([b])),new x.Rule("@"+a,b,!1,null,0)}),i.frames=[new x.Ruleset(null,f)]);try{var j,k=[],l=[new x.joinSelectorVisitor,new x.processExtendsVisitor,new x.toCSSVisitor({compress:Boolean(e.compress)})],m=this;if(e.plugins)for(j=0;j<e.plugins.length;j++)e.plugins[j].isPreEvalVisitor?k.push(e.plugins[j]):e.plugins[j].isPreVisitor?l.splice(0,0,e.plugins[j]):l.push(e.plugins[j]);for(j=0;j<k.length;j++)k[j].run(m);for(g=d.call(m,i),j=0;j<l.length;j++)l[j].run(g);e.sourceMap&&(g=new x.sourceMapOutput({contentsIgnoredCharsMap:E.imports.contentsIgnoredChars,writeSourceMap:e.writeSourceMap,rootNode:g,contentsMap:E.imports.contents,sourceMapFilename:e.sourceMapFilename,sourceMapURL:e.sourceMapURL,outputFilename:e.sourceMapOutputFilename,sourceMapBasepath:e.sourceMapBasepath,sourceMapRootpath:e.sourceMapRootpath,outputSourceFiles:e.outputSourceFiles,sourceMapGenerator:e.sourceMapGenerator})),h=g.toCSS({compress:Boolean(e.compress),dumpLineNumbers:a.dumpLineNumbers,strictUnits:Boolean(e.strictUnits),numPrecision:8})}catch(n){throw new u(n,a)}if(e.cleancss&&"node"===w.mode){var o=c("clean-css"),p=e.cleancssOptions||{};return p.keepSpecialComments===b&&(p.keepSpecialComments="*"),p.processImport=!1,p.noRebase=!0,p.noAdvanced===b&&(p.noAdvanced=!0),new o(p).minify(h)}return e.compress?h.replace(/(^(\s)+)|((\s)+$)/g,""):h}}(g.eval),y<v.length-1){y=A;var o=s(y,v);i=v.split("\n"),h=o.line+1,l={type:"Parse",message:"Unrecognised input",index:y,filename:a.currentFileInfo.filename,line:h,column:o.column,extract:[i[h-2],i[h-1],i[h]]}}var p=function(b){return b=l||b||E.imports.error,b?(b instanceof u||(b=new u(b,a)),e(b)):e(null,g)};return a.processImports===!1?p():void new x.importVisitor(this.imports,p).run(g)},parsers:F={primary:function(){for(var a,b=this.mixin,c=J,d=[];C;){if(a=this.extendRule()||b.definition()||this.rule()||this.ruleset()||b.call()||this.comment()||this.rulesetCall()||this.directive())d.push(a);else if(!c(/^[\s\n]+/)&&!c(/^;+/))break;if(q("}"))break}return d},comment:function(){var b;if("/"===v.charAt(y))return"/"===v.charAt(y+1)?new x.Comment(j(/^\/\/.*/),!0,y,a.currentFileInfo):(b=j(/^\/\*(?:[^*]|\*+[^\/*])*\*+\/\n?/),b?new x.Comment(b,!1,y,a.currentFileInfo):void 0)},comments:function(){for(var a,b=[];;){if(a=this.comment(),!a)break;b.push(a)}return b},entities:{quoted:function(){var b,c,d=y,e=y;return"~"===v.charAt(d)&&(d++,c=!0),'"'===v.charAt(d)||"'"===v.charAt(d)?(c&&k("~"),b=j(/^"((?:[^"\\\r\n]|\\.)*)"|'((?:[^'\\\r\n]|\\.)*)'/),b?new x.Quoted(b[0],b[1]||b[2],c,e,a.currentFileInfo):void 0):void 0},keyword:function(){var a;if(a=j(/^%|^[_A-Za-z-][_A-Za-z0-9-]*/)){var b=x.Color.fromKeyword(a);return b?b:new x.Keyword(a)}},call:function(){var b,c,d,e,f=y;if(b=/^([\w-]+|%|progid:[\w\.]+)\(/.exec(C)){if(b=b[1],c=b.toLowerCase(),"url"===c)return null;if(y+=b.length,"alpha"===c&&(e=F.alpha(),"undefined"!=typeof e))return e;if(k("("),d=this.arguments(),k(")"))return b?new x.Call(b,d,f,a.currentFileInfo):void 0}},arguments:function(){for(var a,b=[];;){if(a=this.assignment()||F.expression(),!a)break;if(b.push(a),!k(","))break}return b},literal:function(){return this.dimension()||this.color()||this.quoted()||this.unicodeDescriptor()},assignment:function(){var a,b;return a=j(/^\w+(?=\s?=)/i),a&&k("=")?(b=F.entity(),b?new x.Assignment(a,b):void 0):void 0},url:function(){var b;if("u"===v.charAt(y)&&j(/^url\(/))return b=this.quoted()||this.variable()||j(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/)||"",n(")"),new x.URL(null!=b.value||b instanceof x.Variable?b:new x.Anonymous(b),a.currentFileInfo)},variable:function(){var b,c=y;return"@"===v.charAt(y)&&(b=j(/^@@?[\w-]+/))?new x.Variable(b,c,a.currentFileInfo):void 0},variableCurly:function(){var b,c=y;return"@"===v.charAt(y)&&(b=j(/^@\{([\w-]+)\}/))?new x.Variable("@"+b[1],c,a.currentFileInfo):void 0},color:function(){var a;if("#"===v.charAt(y)&&(a=j(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/))){var b=a.input.match(/^#([\w]+).*/);return b=b[1],b.match(/^[A-Fa-f0-9]+$/)||o("Invalid HEX color code"),new x.Color(a[1])}},dimension:function(){var a,b=v.charCodeAt(y);if(!(b>57||43>b||47===b||44==b))return a=j(/^([+-]?\d*\.?\d+)(%|[a-z]+)?/),a?new x.Dimension(a[1],a[2]):void 0},unicodeDescriptor:function(){var a;return a=j(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/),a?new x.UnicodeDescriptor(a[0]):void 0},javascript:function(){var c,d,e=y;return"~"===v.charAt(e)&&(e++,d=!0),"`"===v.charAt(e)?(a.javascriptEnabled===b||a.javascriptEnabled||o("You are using JavaScript, which has been disabled."),d&&k("~"),c=j(/^`([^`]*)`/),c?new x.JavaScript(c[1],y,d):void 0):void 0}},variable:function(){var a;return"@"===v.charAt(y)&&(a=j(/^(@[\w-]+)\s*:/))?a[1]:void 0},rulesetCall:function(){var a;return"@"===v.charAt(y)&&(a=j(/^(@[\w-]+)\s*\(\s*\)\s*;/))?new x.RulesetCall(a[1]):void 0},extend:function(a){var b,c,d,e,f,g=y;if(j(a?/^&:extend\(/:/^:extend\(/)){do{for(d=null,b=null;!(d=j(/^(all)(?=\s*(\)|,))/))&&(c=this.element());)b?b.push(c):b=[c];d=d&&d[1],b||o("Missing target selector for :extend()."),f=new x.Extend(new x.Selector(b),d,g),e?e.push(f):e=[f]}while(k(","));return m(/^\)/),a&&m(/^;/),e}},extendRule:function(){return this.extend(!0)},mixin:{call:function(){var b,c,g,h,i,l,m=v.charAt(y),o=!1,p=y;if("."===m||"#"===m){for(d();;){if(b=y,h=j(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/),!h)break;g=new x.Element(i,h,b,a.currentFileInfo),c?c.push(g):c=[g],i=k(">")}return c&&(k("(")&&(l=this.args(!0).args,n(")")),F.important()&&(o=!0),F.end())?(f(),new x.mixin.Call(c,l,p,a.currentFileInfo,o)):void e()}},args:function(a){var b,c,g,h,i,l,m=E.parsers,n=m.entities,p={args:null,variadic:!1},q=[],r=[],s=[];for(d();;){if(a)l=m.detachedRuleset()||m.expression();else{if(m.comments(),"."===v.charAt(y)&&j(/^\.{3}/)){p.variadic=!0,k(";")&&!b&&(b=!0),(b?r:s).push({variadic:!0});break}l=n.variable()||n.literal()||n.keyword()}if(!l)break;h=null,l.throwAwayComments&&l.throwAwayComments(),i=l;var t=null;if(a?l.value&&1==l.value.length&&(t=l.value[0]):t=l,t&&t instanceof x.Variable)if(k(":")){if(q.length>0&&(b&&o("Cannot mix ; and , as delimiter types"),c=!0),i=a&&m.detachedRuleset()||m.expression(),!i){if(!a)return e(),p.args=[],p;o("could not understand value for named argument")}h=g=t.name}else{if(!a&&j(/^\.{3}/)){p.variadic=!0,k(";")&&!b&&(b=!0),(b?r:s).push({name:l.name,variadic:!0});break}a||(g=h=t.name,i=null)}i&&q.push(i),s.push({name:h,value:i}),k(",")||(k(";")||b)&&(c&&o("Cannot mix ; and , as delimiter types"),b=!0,q.length>1&&(i=new x.Value(q)),r.push({name:g,value:i}),g=null,q=[],c=!1)}return f(),p.args=b?r:s,p},definition:function(){var a,b,c,g,h=[],i=!1;if(!("."!==v.charAt(y)&&"#"!==v.charAt(y)||p(/^[^{]*\}/)))if(d(),b=j(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){a=b[1];var l=this.args(!1);if(h=l.args,i=l.variadic,!k(")"))return A=y,void e();if(F.comments(),j(/^when/)&&(g=m(F.conditions,"expected condition")),c=F.block())return f(),new x.mixin.Definition(a,h,c,g,i);e()}else f()}},entity:function(){var a=this.entities;return a.literal()||a.variable()||a.url()||a.call()||a.keyword()||a.javascript()||this.comment()},end:function(){return k(";")||q("}")},alpha:function(){var a;if(j(/^\(opacity=/i))return a=j(/^\d+/)||this.entities.variable(),a?(n(")"),new x.Alpha(a)):void 0},element:function(){var b,c,g,h=y;return c=this.combinator(),b=j(/^(?:\d+\.\d+|\d+)%/)||j(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||k("*")||k("&")||this.attribute()||j(/^\([^()@]+\)/)||j(/^[\.#](?=@)/)||this.entities.variableCurly(),b||(d(),k("(")?(g=this.selector())&&k(")")?(b=new x.Paren(g),f()):e():f()),b?new x.Element(c,b,h,a.currentFileInfo):void 0},combinator:function(){var a=v.charAt(y);if("/"===a){d();var b=j(/^\/[a-z]+\//i);if(b)return f(),new x.Combinator(b);e()}if(">"===a||"+"===a||"~"===a||"|"===a||"^"===a){for(y++,"^"===a&&"^"===v.charAt(y)&&(a="^^",y++);h(v,y);)y++;return new x.Combinator(a)}return new x.Combinator(h(v,y-1)?" ":null)},lessSelector:function(){return this.selector(!0)},selector:function(b){for(var c,d,e,f,g,h,i,j=y,k=J;(b&&(g=this.extend())||b&&(h=k(/^when/))||(f=this.element()))&&(h?i=m(this.conditions,"expected condition"):i?o("CSS guard can only be used at the end of selector"):g?d?d.push(g):d=[g]:(d&&o("Extend can only be used at the end of selector"),e=v.charAt(y),c?c.push(f):c=[f],f=null),"{"!==e&&"}"!==e&&";"!==e&&","!==e&&")"!==e););return c?new x.Selector(c,d,i,j,a.currentFileInfo):void(d&&o("Extend must be used to extend a selector, it cannot be used on its own"))},attribute:function(){if(k("[")){var a,b,c,d=this.entities;return(a=d.variableCurly())||(a=m(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),c=j(/^[|~*$^]?=/),c&&(b=d.quoted()||j(/^[0-9]+%/)||j(/^[\w-]+/)||d.variableCurly()),n("]"),new x.Attribute(a,c,b)}},block:function(){var a;return k("{")&&(a=this.primary())&&k("}")?a:void 0},blockRuleset:function(){var a=this.block();return a&&(a=new x.Ruleset(null,a)),a},detachedRuleset:function(){var a=this.blockRuleset();return a?new x.DetachedRuleset(a):void 0},ruleset:function(){var b,c,g,h;for(d(),a.dumpLineNumbers&&(h=t(y,v,a));;){if(c=this.lessSelector(),!c)break;if(b?b.push(c):b=[c],this.comments(),c.condition&&b.length>1&&o("Guards are only currently allowed on a single selector."),!k(","))break;c.condition&&o("Guards are only currently allowed on a single selector."),this.comments()}if(b&&(g=this.block())){f();var i=new x.Ruleset(b,g,a.strictImports);return a.dumpLineNumbers&&(i.debugInfo=h),i}A=y,e()},rule:function(b){var c,g,h,i,j,k=y,l=v.charAt(k);if("."!==l&&"#"!==l&&"&"!==l)if(d(),c=this.variable()||this.ruleProperty()){if(j="string"==typeof c,j&&(g=this.detachedRuleset()),this.comments(),g||(g=b||!a.compress&&!j?this.anonymousValue()||this.value():this.value()||this.anonymousValue(),h=this.important(),i=!j&&c.pop().value),g&&this.end())return f(),new x.Rule(c,g,h,i,k,a.currentFileInfo);if(A=y,e(),g&&!b)return this.rule(!0)}else f()},anonymousValue:function(){var a;return a=/^([^@+\/'"*`(;{}-]*);/.exec(C),a?(y+=a[0].length-1,new x.Anonymous(a[1])):void 0},"import":function(){var b,c,d=y,e=j(/^@import?\s+/);if(e){var f=(e?this.importOptions():null)||{};if(b=this.entities.quoted()||this.entities.url())return c=this.mediaFeatures(),i(";")||(y=d,o("missing semi-colon or unrecognised media features on import")),c=c&&new x.Value(c),new x.Import(b,c,f,d,a.currentFileInfo);y=d,o("malformed import statement")}},importOptions:function(){var a,b,c,d={};if(!k("("))return null;do if(a=this.importOption()){switch(b=a,c=!0,b){case"css":b="less",c=!1;break;case"once":b="multiple",c=!1}if(d[b]=c,!k(","))break}while(a);return n(")"),d},importOption:function(){var a=j(/^(less|css|multiple|once|inline|reference)/);return a?a[1]:void 0},mediaFeature:function(){var b,c,d=this.entities,e=[];do if(b=d.keyword()||d.variable())e.push(b);else if(k("(")){if(c=this.property(),b=this.value(),!k(")"))return null;if(c&&b)e.push(new x.Paren(new x.Rule(c,b,null,null,y,a.currentFileInfo,!0)));else{if(!b)return null;e.push(new x.Paren(b))}}while(b);return e.length>0?new x.Expression(e):void 0},mediaFeatures:function(){var a,b=this.entities,c=[];do if(a=this.mediaFeature()){if(c.push(a),!k(","))break}else if(a=b.variable(),a&&(c.push(a),!k(",")))break;while(a);return c.length>0?c:null},media:function(){var b,c,d,e;return a.dumpLineNumbers&&(e=t(y,v,a)),j(/^@media/)&&(b=this.mediaFeatures(),c=this.block())?(d=new x.Media(c,b,y,a.currentFileInfo),a.dumpLineNumbers&&(d.debugInfo=e),d):void 0},directive:function(){var b,c,g,h,i,l,m,n=y,p=!0;if("@"===v.charAt(y)){if(c=this["import"]()||this.media())return c;if(d(),b=j(/^@[a-z-]+/)){switch(h=b,"-"==b.charAt(1)&&b.indexOf("-",2)>0&&(h="@"+b.slice(b.indexOf("-",2)+1)),h){case"@charset":i=!0,p=!1;break;case"@namespace":l=!0,p=!1;break;case"@keyframes":i=!0;break;case"@host":case"@page":case"@document":case"@supports":m=!0}return this.comments(),i?(c=this.entity(),c||o("expected "+b+" identifier")):l?(c=this.expression(),c||o("expected "+b+" expression")):m&&(c=(j(/^[^{;]+/)||"").trim(),c&&(c=new x.Anonymous(c))),this.comments(),p&&(g=this.blockRuleset()),g||!p&&c&&k(";")?(f(),new x.Directive(b,c,g,n,a.currentFileInfo,a.dumpLineNumbers?t(n,v,a):null)):void e()}}},value:function(){var a,b=[];do if(a=this.expression(),a&&(b.push(a),!k(",")))break;while(a);return b.length>0?new x.Value(b):void 0},important:function(){return"!"===v.charAt(y)?j(/^! *important/):void 0},sub:function(){var a,b;return k("(")&&(a=this.addition())?(b=new x.Expression([a]),n(")"),b.parens=!0,b):void 0},multiplication:function(){var a,b,c,g,i;if(a=this.operand()){for(i=h(v,y-1);;){if(p(/^\/[*\/]/))break;if(d(),c=k("/")||k("*"),!c){f();break}if(b=this.operand(),!b){e();break}f(),a.parensInOp=!0,b.parensInOp=!0,g=new x.Operation(c,[g||a,b],i),i=h(v,y-1)}return g||a}},addition:function(){var a,b,c,d,e;if(a=this.multiplication()){for(e=h(v,y-1);;){if(c=j(/^[-+]\s+/)||!e&&(k("+")||k("-")),!c)break;if(b=this.multiplication(),!b)break;a.parensInOp=!0,b.parensInOp=!0,d=new x.Operation(c,[d||a,b],e),e=h(v,y-1)}return d||a}},conditions:function(){var a,b,c,d=y;if(a=this.condition()){for(;;){if(!p(/^,\s*(not\s*)?\(/)||!k(","))break;if(b=this.condition(),!b)break;c=new x.Condition("or",c||a,b,d)}return c||a}},condition:function(){var a,b,c,d,e=this.entities,f=y,g=!1;return j(/^not/)&&(g=!0),n("("),a=this.addition()||e.keyword()||e.quoted(),a?(d=j(/^(?:>=|<=|=<|[<=>])/),d?(b=this.addition()||e.keyword()||e.quoted(),b?c=new x.Condition(d,a,b,f,g):o("expected expression")):c=new x.Condition("=",a,new x.Keyword("true"),f,g),n(")"),j(/^and/)?new x.Condition("and",c,this.condition()):c):void 0},operand:function(){var a,b=this.entities,c=v.charAt(y+1);"-"!==v.charAt(y)||"@"!==c&&"("!==c||(a=k("-"));var d=this.sub()||b.dimension()||b.color()||b.variable()||b.call();return a&&(d.parensInOp=!0,d=new x.Negative(d)),d},expression:function(){var a,b,c=[];do a=this.addition()||this.entity(),a&&(c.push(a),p(/^\/[\/*]/)||(b=k("/"),b&&c.push(new x.Anonymous(b))));while(a);return c.length>0?new x.Expression(c):void 0},property:function(){var a=j(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);return a?a[1]:void 0},ruleProperty:function(){function b(a){var b=a.exec(f);return b?(h.push(y+i),i+=b[0].length,f=f.slice(b[1].length),g.push(b[1])):void 0}function c(){var a=/^\s*\/\*(?:[^*]|\*+[^\/*])*\*+\//.exec(f);return a?(i+=a[0].length,f=f.slice(a[0].length),!0):!1}var d,e,f=C,g=[],h=[],i=0;for(b(/^(\*?)/);b(/^((?:[\w-]+)|(?:@\{[\w-]+\}))/););for(;c(););if(g.length>1&&b(/^\s*((?:\+_|\+)?)\s*:/)){for(l(i),""===g[0]&&(g.shift(),h.shift()),e=0;e<g.length;e++)d=g[e],g[e]="@"!==d.charAt(0)?new x.Keyword(d):new x.Variable("@"+d.slice(2,-1),h[e],a.currentFileInfo);return g}}}}},w.Parser.serializeVars=function(a){var b="";for(var c in a)if(Object.hasOwnProperty.call(a,c)){var d=a[c];b+=("@"===c[0]?"":"@")+c+": "+d+(";"===(""+d).slice(-1)?"":";")}return b},function(d){function e(a,b,c){if(!(c instanceof d.Dimension))throw{type:"Argument",message:"argument must be a number"};return null==b?b=c.unit:c=c.unify(),new d.Dimension(a(parseFloat(c.value)),b)}function f(a,b,c){var e,f,g,h,i=b.alpha,j=c.alpha,k=[];g=j+i*(1-j);for(var l=0;3>l;l++)e=b.rgb[l]/255,f=c.rgb[l]/255,h=a(e,f),g&&(h=(j*f+i*(e-j*(e+f-h)))/g),k[l]=255*h;return new d.Color(k,g)}function g(){var a,b=d.functions;for(a in l)l.hasOwnProperty(a)&&(b[a]=e.bind(null,Math[a],l[a]));for(a in m)m.hasOwnProperty(a)&&(b[a]=f.bind(null,m[a]));a=d.defaultFunc,b["default"]=a.eval.bind(a)}function h(a){return d.functions.hsla(a.h,a.s,a.l,a.a)}function i(a,b){return a instanceof d.Dimension&&a.unit.is("%")?parseFloat(a.value*b/100):j(a)}function j(a){if(a instanceof d.Dimension)return parseFloat(a.unit.is("%")?a.value/100:a.value);if("number"==typeof a)return a;throw{error:"RuntimeError",message:"color functions take numbers as parameters"}}function k(a){return Math.min(1,Math.max(0,a))}d.functions={rgb:function(a,b,c){return this.rgba(a,b,c,1)},rgba:function(a,b,c,e){var f=[a,b,c].map(function(a){return i(a,255)});return e=j(e),new d.Color(f,e)},hsl:function(a,b,c){return this.hsla(a,b,c,1)},hsla:function(a,b,c,d){function e(a){return a=0>a?a+1:a>1?a-1:a,1>6*a?g+(f-g)*a*6:1>2*a?f:2>3*a?g+(f-g)*(2/3-a)*6:g}a=j(a)%360/360,b=k(j(b)),c=k(j(c)),d=k(j(d));var f=.5>=c?c*(b+1):c+b-c*b,g=2*c-f;return this.rgba(255*e(a+1/3),255*e(a),255*e(a-1/3),d)},hsv:function(a,b,c){return this.hsva(a,b,c,1)},hsva:function(a,b,c,d){a=j(a)%360/360*360,b=j(b),c=j(c),d=j(d);var e,f;e=Math.floor(a/60%6),f=a/60-e;var g=[c,c*(1-b),c*(1-f*b),c*(1-(1-f)*b)],h=[[0,3,1],[2,0,1],[1,0,3],[1,2,0],[3,1,0],[0,1,2]];return this.rgba(255*g[h[e][0]],255*g[h[e][1]],255*g[h[e][2]],d)},hue:function(a){return new d.Dimension(a.toHSL().h)},saturation:function(a){return new d.Dimension(100*a.toHSL().s,"%")},lightness:function(a){return new d.Dimension(100*a.toHSL().l,"%")},hsvhue:function(a){return new d.Dimension(a.toHSV().h)},hsvsaturation:function(a){return new d.Dimension(100*a.toHSV().s,"%")},hsvvalue:function(a){return new d.Dimension(100*a.toHSV().v,"%")},red:function(a){return new d.Dimension(a.rgb[0])},green:function(a){return new d.Dimension(a.rgb[1])},blue:function(a){return new d.Dimension(a.rgb[2])},alpha:function(a){return new d.Dimension(a.toHSL().a)},luma:function(a){return new d.Dimension(a.luma()*a.alpha*100,"%")},luminance:function(a){var b=.2126*a.rgb[0]/255+.7152*a.rgb[1]/255+.0722*a.rgb[2]/255;return new d.Dimension(b*a.alpha*100,"%")},saturate:function(a,b){if(!a.rgb)return null;var c=a.toHSL();return c.s+=b.value/100,c.s=k(c.s),h(c)},desaturate:function(a,b){var c=a.toHSL();return c.s-=b.value/100,c.s=k(c.s),h(c)},lighten:function(a,b){var c=a.toHSL();return c.l+=b.value/100,c.l=k(c.l),h(c)},darken:function(a,b){var c=a.toHSL();return c.l-=b.value/100,c.l=k(c.l),h(c)},fadein:function(a,b){var c=a.toHSL();return c.a+=b.value/100,c.a=k(c.a),h(c)},fadeout:function(a,b){var c=a.toHSL();return c.a-=b.value/100,c.a=k(c.a),h(c)},fade:function(a,b){var c=a.toHSL();return c.a=b.value/100,c.a=k(c.a),h(c)},spin:function(a,b){var c=a.toHSL(),d=(c.h+b.value)%360;return c.h=0>d?360+d:d,h(c)},mix:function(a,b,c){c||(c=new d.Dimension(50));var e=c.value/100,f=2*e-1,g=a.toHSL().a-b.toHSL().a,h=((f*g==-1?f:(f+g)/(1+f*g))+1)/2,i=1-h,j=[a.rgb[0]*h+b.rgb[0]*i,a.rgb[1]*h+b.rgb[1]*i,a.rgb[2]*h+b.rgb[2]*i],k=a.alpha*e+b.alpha*(1-e);return new d.Color(j,k)},greyscale:function(a){return this.desaturate(a,new d.Dimension(100))},contrast:function(a,b,c,d){if(!a.rgb)return null;if("undefined"==typeof c&&(c=this.rgba(255,255,255,1)),"undefined"==typeof b&&(b=this.rgba(0,0,0,1)),b.luma()>c.luma()){var e=c;c=b,b=e}return d="undefined"==typeof d?.43:j(d),a.luma()<d?c:b},e:function(a){return new d.Anonymous(a instanceof d.JavaScript?a.evaluated:a.value)},escape:function(a){return new d.Anonymous(encodeURI(a.value).replace(/=/g,"%3D").replace(/:/g,"%3A").replace(/#/g,"%23").replace(/;/g,"%3B").replace(/\(/g,"%28").replace(/\)/g,"%29"))
+},replace:function(a,b,c,e){var f=a.value;return f=f.replace(new RegExp(b.value,e?e.value:""),c.value),new d.Quoted(a.quote||"",f,a.escaped)},"%":function(a){for(var b=Array.prototype.slice.call(arguments,1),c=a.value,e=0;e<b.length;e++)c=c.replace(/%[sda]/i,function(a){var c=a.match(/s/i)?b[e].value:b[e].toCSS();return a.match(/[A-Z]$/)?encodeURIComponent(c):c});return c=c.replace(/%%/g,"%"),new d.Quoted(a.quote||"",c,a.escaped)},unit:function(a,b){if(!(a instanceof d.Dimension))throw{type:"Argument",message:"the first argument to unit must be a number"+(a instanceof d.Operation?". Have you forgotten parenthesis?":"")};return b=b?b instanceof d.Keyword?b.value:b.toCSS():"",new d.Dimension(a.value,b)},convert:function(a,b){return a.convertTo(b.value)},round:function(a,b){var c="undefined"==typeof b?0:b.value;return e(function(a){return a.toFixed(c)},null,a)},pi:function(){return new d.Dimension(Math.PI)},mod:function(a,b){return new d.Dimension(a.value%b.value,a.unit)},pow:function(a,b){if("number"==typeof a&&"number"==typeof b)a=new d.Dimension(a),b=new d.Dimension(b);else if(!(a instanceof d.Dimension&&b instanceof d.Dimension))throw{type:"Argument",message:"arguments must be numbers"};return new d.Dimension(Math.pow(a.value,b.value),a.unit)},_minmax:function(a,c){switch(c=Array.prototype.slice.call(c),c.length){case 0:throw{type:"Argument",message:"one or more arguments required"}}var e,f,g,h,i,j,k,l,m=[],n={};for(e=0;e<c.length;e++)if(g=c[e],g instanceof d.Dimension)if(h=""===g.unit.toString()&&l!==b?new d.Dimension(g.value,l).unify():g.unify(),j=""===h.unit.toString()&&k!==b?k:h.unit.toString(),k=""!==j&&k===b||""!==j&&""===m[0].unify().unit.toString()?j:k,l=""!==j&&l===b?g.unit.toString():l,f=n[""]!==b&&""!==j&&j===k?n[""]:n[j],f!==b)i=""===m[f].unit.toString()&&l!==b?new d.Dimension(m[f].value,l).unify():m[f].unify(),(a&&h.value<i.value||!a&&h.value>i.value)&&(m[f]=g);else{if(k!==b&&j!==k)throw{type:"Argument",message:"incompatible types"};n[j]=m.length,m.push(g)}else Array.isArray(c[e].value)&&Array.prototype.push.apply(c,Array.prototype.slice.call(c[e].value));return 1==m.length?m[0]:(c=m.map(function(a){return a.toCSS(this.env)}).join(this.env.compress?",":", "),new d.Anonymous((a?"min":"max")+"("+c+")"))},min:function(){return this._minmax(!0,arguments)},max:function(){return this._minmax(!1,arguments)},"get-unit":function(a){return new d.Anonymous(a.unit)},argb:function(a){return new d.Anonymous(a.toARGB())},percentage:function(a){return new d.Dimension(100*a.value,"%")},color:function(a){if(a instanceof d.Quoted){var b,c=a.value;if(b=d.Color.fromKeyword(c))return b;if(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/.test(c))return new d.Color(c.slice(1));throw{type:"Argument",message:"argument must be a color keyword or 3/6 digit hex e.g. #FFF"}}throw{type:"Argument",message:"argument must be a string"}},iscolor:function(a){return this._isa(a,d.Color)},isnumber:function(a){return this._isa(a,d.Dimension)},isstring:function(a){return this._isa(a,d.Quoted)},iskeyword:function(a){return this._isa(a,d.Keyword)},isurl:function(a){return this._isa(a,d.URL)},ispixel:function(a){return this.isunit(a,"px")},ispercentage:function(a){return this.isunit(a,"%")},isem:function(a){return this.isunit(a,"em")},isunit:function(a,b){return a instanceof d.Dimension&&a.unit.is(b.value||b)?d.True:d.False},_isa:function(a,b){return a instanceof b?d.True:d.False},tint:function(a,b){return this.mix(this.rgb(255,255,255),a,b)},shade:function(a,b){return this.mix(this.rgb(0,0,0),a,b)},extract:function(a,b){return b=b.value-1,Array.isArray(a.value)?a.value[b]:Array(a)[b]},length:function(a){var b=Array.isArray(a.value)?a.value.length:1;return new d.Dimension(b)},"data-uri":function(b,e){if("undefined"!=typeof a)return new d.URL(e||b,this.currentFileInfo).eval(this.env);var f=b.value,g=e&&e.value,h=c("./fs"),i=c("path"),j=!1;arguments.length<2&&(g=f);var k=g.indexOf("#"),l="";if(-1!==k&&(l=g.slice(k),g=g.slice(0,k)),this.env.isPathRelative(g)&&(g=this.currentFileInfo.relativeUrls?i.join(this.currentFileInfo.currentDirectory,g):i.join(this.currentFileInfo.entryPath,g)),arguments.length<2){var m;try{m=c("mime")}catch(n){m=d._mime}f=m.lookup(g);var o=m.charsets.lookup(f);j=["US-ASCII","UTF-8"].indexOf(o)<0,j&&(f+=";base64")}else j=/;base64$/.test(f);var p=h.readFileSync(g),q=32,r=parseInt(p.length/1024,10);if(r>=q&&this.env.ieCompat!==!1)return this.env.silent||console.warn("Skipped data-uri embedding of %s because its size (%dKB) exceeds IE8-safe %dKB!",g,r,q),new d.URL(e||b,this.currentFileInfo).eval(this.env);p=j?p.toString("base64"):encodeURIComponent(p);var s='"data:'+f+","+p+l+'"';return new d.URL(new d.Anonymous(s))},"svg-gradient":function(a){function e(){throw{type:"Argument",message:"svg-gradient expects direction, start_color [start_position], [color position,]..., end_color [end_position]"}}arguments.length<3&&e();var f,g,h,i,j,k,l,m=Array.prototype.slice.call(arguments,1),n="linear",o='x="0" y="0" width="1" height="1"',p=!0,q={compress:!1},r=a.toCSS(q);switch(r){case"to bottom":f='x1="0%" y1="0%" x2="0%" y2="100%"';break;case"to right":f='x1="0%" y1="0%" x2="100%" y2="0%"';break;case"to bottom right":f='x1="0%" y1="0%" x2="100%" y2="100%"';break;case"to top right":f='x1="0%" y1="100%" x2="100%" y2="0%"';break;case"ellipse":case"ellipse at center":n="radial",f='cx="50%" cy="50%" r="75%"',o='x="-50" y="-50" width="101" height="101"';break;default:throw{type:"Argument",message:"svg-gradient direction must be 'to bottom', 'to right', 'to bottom right', 'to top right' or 'ellipse at center'"}}for(g='<?xml version="1.0" ?><svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="100%" height="100%" viewBox="0 0 1 1" preserveAspectRatio="none"><'+n+'Gradient id="gradient" gradientUnits="userSpaceOnUse" '+f+">",h=0;h<m.length;h+=1)m[h].value?(i=m[h].value[0],j=m[h].value[1]):(i=m[h],j=b),i instanceof d.Color&&((0===h||h+1===m.length)&&j===b||j instanceof d.Dimension)||e(),k=j?j.toCSS(q):0===h?"0%":"100%",l=i.alpha,g+='<stop offset="'+k+'" stop-color="'+i.toRGB()+'"'+(1>l?' stop-opacity="'+l+'"':"")+"/>";if(g+="</"+n+"Gradient><rect "+o+' fill="url(#gradient)" /></svg>',p)try{g=c("./encoder").encodeBase64(g)}catch(s){p=!1}return g="'data:image/svg+xml"+(p?";base64":"")+","+g+"'",new d.URL(new d.Anonymous(g))}},d._mime={_types:{".htm":"text/html",".html":"text/html",".gif":"image/gif",".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png"},lookup:function(a){var e=c("path").extname(a),f=d._mime._types[e];if(f===b)throw new Error('Optional dependency "mime" is required for '+e);return f},charsets:{lookup:function(a){return a&&/^text\//.test(a)?"UTF-8":""}}};var l={ceil:null,floor:null,sqrt:null,abs:null,tan:"",sin:"",cos:"",atan:"rad",asin:"rad",acos:"rad"},m={multiply:function(a,b){return a*b},screen:function(a,b){return a+b-a*b},overlay:function(a,b){return a*=2,1>=a?m.multiply(a,b):m.screen(a-1,b)},softlight:function(a,b){var c=1,d=a;return b>.5&&(d=1,c=a>.25?Math.sqrt(a):((16*a-12)*a+4)*a),a-(1-2*b)*d*(c-a)},hardlight:function(a,b){return m.overlay(b,a)},difference:function(a,b){return Math.abs(a-b)},exclusion:function(a,b){return a+b-2*a*b},average:function(a,b){return(a+b)/2},negation:function(a,b){return 1-Math.abs(a+b-1)}};d.defaultFunc={eval:function(){var a=this.value_,b=this.error_;if(b)throw b;return null!=a?a?d.True:d.False:void 0},value:function(a){this.value_=a},error:function(a){this.error_=a},reset:function(){this.value_=this.error_=null}},g(),d.fround=function(a,b){var c=a&&a.numPrecision;return null==c?b:Number((b+2e-16).toFixed(c))},d.functionCall=function(a,b){this.env=a,this.currentFileInfo=b},d.functionCall.prototype=d.functions}(c("./tree")),function(a){a.colors={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"}}(c("./tree")),function(a){a.debugInfo=function(b,c,d){var e="";if(b.dumpLineNumbers&&!b.compress)switch(b.dumpLineNumbers){case"comments":e=a.debugInfo.asComment(c);break;case"mediaquery":e=a.debugInfo.asMediaQuery(c);break;case"all":e=a.debugInfo.asComment(c)+(d||"")+a.debugInfo.asMediaQuery(c)}return e},a.debugInfo.asComment=function(a){return"/* line "+a.debugInfo.lineNumber+", "+a.debugInfo.fileName+" */\n"},a.debugInfo.asMediaQuery=function(a){return"@media -sass-debug-info{filename{font-family:"+("file://"+a.debugInfo.fileName).replace(/([.:\/\\])/g,function(a){return"\\"==a&&(a="/"),"\\"+a})+"}line{font-family:\\00003"+a.debugInfo.lineNumber+"}}\n"},a.find=function(a,b){for(var c,d=0;d<a.length;d++)if(c=b.call(a,a[d]))return c;return null},a.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS()}).join(", ")+"]":a.toCSS()},a.toCSS=function(a){var b=[];return this.genCSS(a,{add:function(a){b.push(a)},isEmpty:function(){return 0===b.length}}),b.join("")},a.outputRuleset=function(a,b,c){var d,e=c.length;if(a.tabLevel=(0|a.tabLevel)+1,a.compress){for(b.add("{"),d=0;e>d;d++)c[d].genCSS(a,b);return b.add("}"),void a.tabLevel--}var f="\n"+Array(a.tabLevel).join("  "),g=f+"  ";if(e){for(b.add(" {"+g),c[0].genCSS(a,b),d=1;e>d;d++)b.add(g),c[d].genCSS(a,b);b.add(f+"}")}else b.add(" {"+f+"}");a.tabLevel--}}(c("./tree")),function(a){a.Alpha=function(a){this.value=a},a.Alpha.prototype={type:"Alpha",accept:function(a){this.value=a.visit(this.value)},eval:function(b){return this.value.eval?new a.Alpha(this.value.eval(b)):this},genCSS:function(a,b){b.add("alpha(opacity="),this.value.genCSS?this.value.genCSS(a,b):b.add(this.value),b.add(")")},toCSS:a.toCSS}}(c("../tree")),function(a){a.Anonymous=function(a,b,c,d,e){this.value=a,this.index=b,this.mapLines=d,this.currentFileInfo=c,this.rulesetLike="undefined"==typeof e?!1:e},a.Anonymous.prototype={type:"Anonymous",eval:function(){return new a.Anonymous(this.value,this.index,this.currentFileInfo,this.mapLines,this.rulesetLike)},compare:function(a){if(!a.toCSS)return-1;var b=this.toCSS(),c=a.toCSS();return b===c?0:c>b?-1:1},isRulesetLike:function(){return this.rulesetLike},genCSS:function(a,b){b.add(this.value,this.currentFileInfo,this.index,this.mapLines)},toCSS:a.toCSS}}(c("../tree")),function(a){a.Assignment=function(a,b){this.key=a,this.value=b},a.Assignment.prototype={type:"Assignment",accept:function(a){this.value=a.visit(this.value)},eval:function(b){return this.value.eval?new a.Assignment(this.key,this.value.eval(b)):this},genCSS:function(a,b){b.add(this.key+"="),this.value.genCSS?this.value.genCSS(a,b):b.add(this.value)},toCSS:a.toCSS}}(c("../tree")),function(a){a.Call=function(a,b,c,d){this.name=a,this.args=b,this.index=c,this.currentFileInfo=d},a.Call.prototype={type:"Call",accept:function(a){this.args&&(this.args=a.visitArray(this.args))},eval:function(b){var c,d,e=this.args.map(function(a){return a.eval(b)}),f=this.name.toLowerCase();if(f in a.functions)try{if(d=new a.functionCall(b,this.currentFileInfo),c=d[f].apply(d,e),null!=c)return c}catch(g){throw{type:g.type||"Runtime",message:"error evaluating function `"+this.name+"`"+(g.message?": "+g.message:""),index:this.index,filename:this.currentFileInfo.filename}}return new a.Call(this.name,e,this.index,this.currentFileInfo)},genCSS:function(a,b){b.add(this.name+"(",this.currentFileInfo,this.index);for(var c=0;c<this.args.length;c++)this.args[c].genCSS(a,b),c+1<this.args.length&&b.add(", ");b.add(")")},toCSS:a.toCSS}}(c("../tree")),function(a){function b(a){return"#"+a.map(function(a){return a=c(Math.round(a),255),(16>a?"0":"")+a.toString(16)}).join("")}function c(a,b){return Math.min(Math.max(a,0),b)}a.Color=function(a,b){this.rgb=Array.isArray(a)?a:6==a.length?a.match(/.{2}/g).map(function(a){return parseInt(a,16)}):a.split("").map(function(a){return parseInt(a+a,16)}),this.alpha="number"==typeof b?b:1};var d="transparent";a.Color.prototype={type:"Color",eval:function(){return this},luma:function(){var a=this.rgb[0]/255,b=this.rgb[1]/255,c=this.rgb[2]/255;return a=.03928>=a?a/12.92:Math.pow((a+.055)/1.055,2.4),b=.03928>=b?b/12.92:Math.pow((b+.055)/1.055,2.4),c=.03928>=c?c/12.92:Math.pow((c+.055)/1.055,2.4),.2126*a+.7152*b+.0722*c},genCSS:function(a,b){b.add(this.toCSS(a))},toCSS:function(b,e){var f=b&&b.compress&&!e,g=a.fround(b,this.alpha);if(1>g)return 0===g&&this.isTransparentKeyword?d:"rgba("+this.rgb.map(function(a){return c(Math.round(a),255)}).concat(c(g,1)).join(","+(f?"":" "))+")";var h=this.toRGB();if(f){var i=h.split("");i[1]===i[2]&&i[3]===i[4]&&i[5]===i[6]&&(h="#"+i[1]+i[3]+i[5])}return h},operate:function(b,c,d){for(var e=[],f=this.alpha*(1-d.alpha)+d.alpha,g=0;3>g;g++)e[g]=a.operate(b,c,this.rgb[g],d.rgb[g]);return new a.Color(e,f)},toRGB:function(){return b(this.rgb)},toHSL:function(){var a,b,c=this.rgb[0]/255,d=this.rgb[1]/255,e=this.rgb[2]/255,f=this.alpha,g=Math.max(c,d,e),h=Math.min(c,d,e),i=(g+h)/2,j=g-h;if(g===h)a=b=0;else{switch(b=i>.5?j/(2-g-h):j/(g+h),g){case c:a=(d-e)/j+(e>d?6:0);break;case d:a=(e-c)/j+2;break;case e:a=(c-d)/j+4}a/=6}return{h:360*a,s:b,l:i,a:f}},toHSV:function(){var a,b,c=this.rgb[0]/255,d=this.rgb[1]/255,e=this.rgb[2]/255,f=this.alpha,g=Math.max(c,d,e),h=Math.min(c,d,e),i=g,j=g-h;if(b=0===g?0:j/g,g===h)a=0;else{switch(g){case c:a=(d-e)/j+(e>d?6:0);break;case d:a=(e-c)/j+2;break;case e:a=(c-d)/j+4}a/=6}return{h:360*a,s:b,v:i,a:f}},toARGB:function(){return b([255*this.alpha].concat(this.rgb))},compare:function(a){return a.rgb&&a.rgb[0]===this.rgb[0]&&a.rgb[1]===this.rgb[1]&&a.rgb[2]===this.rgb[2]&&a.alpha===this.alpha?0:-1}},a.Color.fromKeyword=function(b){if(b=b.toLowerCase(),a.colors.hasOwnProperty(b))return new a.Color(a.colors[b].slice(1));if(b===d){var c=new a.Color([0,0,0],0);return c.isTransparentKeyword=!0,c}}}(c("../tree")),function(a){a.Comment=function(a,b,c,d){this.value=a,this.silent=!!b,this.currentFileInfo=d},a.Comment.prototype={type:"Comment",genCSS:function(b,c){this.debugInfo&&c.add(a.debugInfo(b,this),this.currentFileInfo,this.index),c.add(this.value.trim())},toCSS:a.toCSS,isSilent:function(a){var b=this.currentFileInfo&&this.currentFileInfo.reference&&!this.isReferenced,c=a.compress&&!this.value.match(/^\/\*!/);return this.silent||b||c},eval:function(){return this},markReferenced:function(){this.isReferenced=!0}}}(c("../tree")),function(a){a.Condition=function(a,b,c,d,e){this.op=a.trim(),this.lvalue=b,this.rvalue=c,this.index=d,this.negate=e},a.Condition.prototype={type:"Condition",accept:function(a){this.lvalue=a.visit(this.lvalue),this.rvalue=a.visit(this.rvalue)},eval:function(a){var b,c=this.lvalue.eval(a),d=this.rvalue.eval(a),e=this.index;return b=function(a){switch(a){case"and":return c&&d;case"or":return c||d;default:if(c.compare)b=c.compare(d);else{if(!d.compare)throw{type:"Type",message:"Unable to perform comparison",index:e};b=d.compare(c)}switch(b){case-1:return"<"===a||"=<"===a||"<="===a;case 0:return"="===a||">="===a||"=<"===a||"<="===a;case 1:return">"===a||">="===a}}}(this.op),this.negate?!b:b}}}(c("../tree")),function(a){a.DetachedRuleset=function(a,b){this.ruleset=a,this.frames=b},a.DetachedRuleset.prototype={type:"DetachedRuleset",accept:function(a){this.ruleset=a.visit(this.ruleset)},eval:function(b){var c=this.frames||b.frames.slice(0);return new a.DetachedRuleset(this.ruleset,c)},callEval:function(b){return this.ruleset.eval(this.frames?new a.evalEnv(b,this.frames.concat(b.frames)):b)}}}(c("../tree")),function(a){a.Dimension=function(c,d){this.value=parseFloat(c),this.unit=d&&d instanceof a.Unit?d:new a.Unit(d?[d]:b)},a.Dimension.prototype={type:"Dimension",accept:function(a){this.unit=a.visit(this.unit)},eval:function(){return this},toColor:function(){return new a.Color([this.value,this.value,this.value])},genCSS:function(b,c){if(b&&b.strictUnits&&!this.unit.isSingular())throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: "+this.unit.toString());var d=a.fround(b,this.value),e=String(d);if(0!==d&&1e-6>d&&d>-1e-6&&(e=d.toFixed(20).replace(/0+$/,"")),b&&b.compress){if(0===d&&this.unit.isLength())return void c.add(e);d>0&&1>d&&(e=e.substr(1))}c.add(e),this.unit.genCSS(b,c)},toCSS:a.toCSS,operate:function(b,c,d){var e=a.operate(b,c,this.value,d.value),f=this.unit.clone();if("+"===c||"-"===c)if(0===f.numerator.length&&0===f.denominator.length)f.numerator=d.unit.numerator.slice(0),f.denominator=d.unit.denominator.slice(0);else if(0===d.unit.numerator.length&&0===f.denominator.length);else{if(d=d.convertTo(this.unit.usedUnits()),b.strictUnits&&d.unit.toString()!==f.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+f.toString()+"' and '"+d.unit.toString()+"'.");e=a.operate(b,c,this.value,d.value)}else"*"===c?(f.numerator=f.numerator.concat(d.unit.numerator).sort(),f.denominator=f.denominator.concat(d.unit.denominator).sort(),f.cancel()):"/"===c&&(f.numerator=f.numerator.concat(d.unit.denominator).sort(),f.denominator=f.denominator.concat(d.unit.numerator).sort(),f.cancel());return new a.Dimension(e,f)},compare:function(b){if(b instanceof a.Dimension){var c,d,e,f;if(this.unit.isEmpty()||b.unit.isEmpty())c=this,d=b;else if(c=this.unify(),d=b.unify(),0!==c.unit.compare(d.unit))return-1;return e=c.value,f=d.value,f>e?-1:e>f?1:0}return-1},unify:function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},convertTo:function(b){var c,d,e,f,g,h=this.value,i=this.unit.clone(),j={};if("string"==typeof b){for(c in a.UnitConversions)a.UnitConversions[c].hasOwnProperty(b)&&(j={},j[c]=b);b=j}g=function(a,b){return e.hasOwnProperty(a)?(b?h/=e[a]/e[f]:h*=e[a]/e[f],f):a};for(d in b)b.hasOwnProperty(d)&&(f=b[d],e=a.UnitConversions[d],i.map(g));return i.cancel(),new a.Dimension(h,i)}},a.UnitConversions={length:{m:1,cm:.01,mm:.001,"in":.0254,px:.0254/96,pt:.0254/72,pc:.0254/72*12},duration:{s:1,ms:.001},angle:{rad:1/(2*Math.PI),deg:1/360,grad:.0025,turn:1}},a.Unit=function(a,b,c){this.numerator=a?a.slice(0).sort():[],this.denominator=b?b.slice(0).sort():[],this.backupUnit=c},a.Unit.prototype={type:"Unit",clone:function(){return new a.Unit(this.numerator.slice(0),this.denominator.slice(0),this.backupUnit)},genCSS:function(a,b){this.numerator.length>=1?b.add(this.numerator[0]):this.denominator.length>=1?b.add(this.denominator[0]):a&&a.strictUnits||!this.backupUnit||b.add(this.backupUnit)},toCSS:a.toCSS,toString:function(){var a,b=this.numerator.join("*");for(a=0;a<this.denominator.length;a++)b+="/"+this.denominator[a];return b},compare:function(a){return this.is(a.toString())?0:-1},is:function(a){return this.toString()===a},isLength:function(){return Boolean(this.toCSS().match(/px|em|%|in|cm|mm|pc|pt|ex/))},isEmpty:function(){return 0===this.numerator.length&&0===this.denominator.length},isSingular:function(){return this.numerator.length<=1&&0===this.denominator.length},map:function(a){var b;for(b=0;b<this.numerator.length;b++)this.numerator[b]=a(this.numerator[b],!1);for(b=0;b<this.denominator.length;b++)this.denominator[b]=a(this.denominator[b],!0)},usedUnits:function(){var b,c,d={};c=function(a){return b.hasOwnProperty(a)&&!d[e]&&(d[e]=a),a};for(var e in a.UnitConversions)a.UnitConversions.hasOwnProperty(e)&&(b=a.UnitConversions[e],this.map(c));return d},cancel:function(){var a,b,c,d={};for(b=0;b<this.numerator.length;b++)a=this.numerator[b],c||(c=a),d[a]=(d[a]||0)+1;for(b=0;b<this.denominator.length;b++)a=this.denominator[b],c||(c=a),d[a]=(d[a]||0)-1;this.numerator=[],this.denominator=[];for(a in d)if(d.hasOwnProperty(a)){var e=d[a];if(e>0)for(b=0;e>b;b++)this.numerator.push(a);else if(0>e)for(b=0;-e>b;b++)this.denominator.push(a)}0===this.numerator.length&&0===this.denominator.length&&c&&(this.backupUnit=c),this.numerator.sort(),this.denominator.sort()}}}(c("../tree")),function(a){a.Directive=function(a,b,c,d,e,f){this.name=a,this.value=b,c&&(this.rules=c,this.rules.allowImports=!0),this.index=d,this.currentFileInfo=e,this.debugInfo=f},a.Directive.prototype={type:"Directive",accept:function(a){var b=this.value,c=this.rules;c&&(c=a.visit(c)),b&&(b=a.visit(b))},isRulesetLike:function(){return!this.isCharset()},isCharset:function(){return"@charset"===this.name},genCSS:function(b,c){var d=this.value,e=this.rules;c.add(this.name,this.currentFileInfo,this.index),d&&(c.add(" "),d.genCSS(b,c)),e?a.outputRuleset(b,c,[e]):c.add(";")},toCSS:a.toCSS,eval:function(b){var c=this.value,d=this.rules;return c&&(c=c.eval(b)),d&&(d=d.eval(b),d.root=!0),new a.Directive(this.name,c,d,this.index,this.currentFileInfo,this.debugInfo)},variable:function(b){return this.rules?a.Ruleset.prototype.variable.call(this.rules,b):void 0},find:function(){return this.rules?a.Ruleset.prototype.find.apply(this.rules,arguments):void 0},rulesets:function(){return this.rules?a.Ruleset.prototype.rulesets.apply(this.rules):void 0},markReferenced:function(){var a,b;if(this.isReferenced=!0,this.rules)for(b=this.rules.rules,a=0;a<b.length;a++)b[a].markReferenced&&b[a].markReferenced()}}}(c("../tree")),function(a){a.Element=function(b,c,d,e){this.combinator=b instanceof a.Combinator?b:new a.Combinator(b),this.value="string"==typeof c?c.trim():c?c:"",this.index=d,this.currentFileInfo=e},a.Element.prototype={type:"Element",accept:function(a){var b=this.value;this.combinator=a.visit(this.combinator),"object"==typeof b&&(this.value=a.visit(b))},eval:function(b){return new a.Element(this.combinator,this.value.eval?this.value.eval(b):this.value,this.index,this.currentFileInfo)},genCSS:function(a,b){b.add(this.toCSS(a),this.currentFileInfo,this.index)},toCSS:function(a){var b=this.value.toCSS?this.value.toCSS(a):this.value;return""===b&&"&"===this.combinator.value.charAt(0)?"":this.combinator.toCSS(a||{})+b}},a.Attribute=function(a,b,c){this.key=a,this.op=b,this.value=c},a.Attribute.prototype={type:"Attribute",eval:function(b){return new a.Attribute(this.key.eval?this.key.eval(b):this.key,this.op,this.value&&this.value.eval?this.value.eval(b):this.value)},genCSS:function(a,b){b.add(this.toCSS(a))},toCSS:function(a){var b=this.key.toCSS?this.key.toCSS(a):this.key;return this.op&&(b+=this.op,b+=this.value.toCSS?this.value.toCSS(a):this.value),"["+b+"]"}},a.Combinator=function(a){this.value=" "===a?" ":a?a.trim():""},a.Combinator.prototype={type:"Combinator",_noSpaceCombinators:{"":!0," ":!0,"|":!0},genCSS:function(a,b){var c=a.compress||this._noSpaceCombinators[this.value]?"":" ";b.add(c+this.value+c)},toCSS:a.toCSS}}(c("../tree")),function(a){a.Expression=function(a){this.value=a},a.Expression.prototype={type:"Expression",accept:function(a){this.value&&(this.value=a.visitArray(this.value))},eval:function(b){var c,d=this.parens&&!this.parensInOp,e=!1;return d&&b.inParenthesis(),this.value.length>1?c=new a.Expression(this.value.map(function(a){return a.eval(b)})):1===this.value.length?(this.value[0].parens&&!this.value[0].parensInOp&&(e=!0),c=this.value[0].eval(b)):c=this,d&&b.outOfParenthesis(),this.parens&&this.parensInOp&&!b.isMathOn()&&!e&&(c=new a.Paren(c)),c},genCSS:function(a,b){for(var c=0;c<this.value.length;c++)this.value[c].genCSS(a,b),c+1<this.value.length&&b.add(" ")},toCSS:a.toCSS,throwAwayComments:function(){this.value=this.value.filter(function(b){return!(b instanceof a.Comment)})}}}(c("../tree")),function(a){a.Extend=function(b,c,d){switch(this.selector=b,this.option=c,this.index=d,this.object_id=a.Extend.next_id++,this.parent_ids=[this.object_id],c){case"all":this.allowBefore=!0,this.allowAfter=!0;break;default:this.allowBefore=!1,this.allowAfter=!1}},a.Extend.next_id=0,a.Extend.prototype={type:"Extend",accept:function(a){this.selector=a.visit(this.selector)},eval:function(b){return new a.Extend(this.selector.eval(b),this.option,this.index)},clone:function(){return new a.Extend(this.selector,this.option,this.index)},findSelfSelectors:function(a){var b,c,d=[];for(b=0;b<a.length;b++)c=a[b].elements,b>0&&c.length&&""===c[0].combinator.value&&(c[0].combinator.value=" "),d=d.concat(a[b].elements);this.selfSelectors=[{elements:d}]}}}(c("../tree")),function(a){a.Import=function(a,c,d,e,f){if(this.options=d,this.index=e,this.path=a,this.features=c,this.currentFileInfo=f,this.options.less!==b||this.options.inline)this.css=!this.options.less||this.options.inline;else{var g=this.getPath();g&&/css([\?;].*)?$/.test(g)&&(this.css=!0)}},a.Import.prototype={type:"Import",accept:function(a){this.features&&(this.features=a.visit(this.features)),this.path=a.visit(this.path),!this.options.inline&&this.root&&(this.root=a.visit(this.root))},genCSS:function(a,b){this.css&&(b.add("@import ",this.currentFileInfo,this.index),this.path.genCSS(a,b),this.features&&(b.add(" "),this.features.genCSS(a,b)),b.add(";"))},toCSS:a.toCSS,getPath:function(){if(this.path instanceof a.Quoted){var c=this.path.value;return this.css!==b||/(\.[a-z]*$)|([\?;].*)$/.test(c)?c:c+".less"}return this.path instanceof a.URL?this.path.value.value:null},evalForImport:function(b){return new a.Import(this.path.eval(b),this.features,this.options,this.index,this.currentFileInfo)},evalPath:function(b){var c=this.path.eval(b),d=this.currentFileInfo&&this.currentFileInfo.rootpath;if(!(c instanceof a.URL)){if(d){var e=c.value;e&&b.isPathRelative(e)&&(c.value=d+e)}c.value=b.normalizePath(c.value)}return c},eval:function(b){var c,d=this.features&&this.features.eval(b);if(this.skip&&("function"==typeof this.skip&&(this.skip=this.skip()),this.skip))return[];if(this.options.inline){var e=new a.Anonymous(this.root,0,{filename:this.importedFilename},!0,!0);return this.features?new a.Media([e],this.features.value):[e]}if(this.css){var f=new a.Import(this.evalPath(b),d,this.options,this.index);if(!f.css&&this.error)throw this.error;return f}return c=new a.Ruleset(null,this.root.rules.slice(0)),c.evalImports(b),this.features?new a.Media(c.rules,this.features.value):c.rules}}}(c("../tree")),function(a){a.JavaScript=function(a,b,c){this.escaped=c,this.expression=a,this.index=b},a.JavaScript.prototype={type:"JavaScript",eval:function(b){var c,d=this,e={},f=this.expression.replace(/@\{([\w-]+)\}/g,function(c,e){return a.jsify(new a.Variable("@"+e,d.index).eval(b))});try{f=new Function("return ("+f+")")}catch(g){throw{message:"JavaScript evaluation error: "+g.message+" from `"+f+"`",index:this.index}}var h=b.frames[0].variables();for(var i in h)h.hasOwnProperty(i)&&(e[i.slice(1)]={value:h[i].value,toJS:function(){return this.value.eval(b).toCSS()}});try{c=f.call(e)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message.replace(/["]/g,"'")+"'",index:this.index}}return"number"==typeof c?new a.Dimension(c):"string"==typeof c?new a.Quoted('"'+c+'"',c,this.escaped,this.index):new a.Anonymous(Array.isArray(c)?c.join(", "):c)}}}(c("../tree")),function(a){a.Keyword=function(a){this.value=a},a.Keyword.prototype={type:"Keyword",eval:function(){return this},genCSS:function(a,b){if("%"===this.value)throw{type:"Syntax",message:"Invalid % without number"};b.add(this.value)},toCSS:a.toCSS,compare:function(b){return b instanceof a.Keyword?b.value===this.value?0:1:-1}},a.True=new a.Keyword("true"),a.False=new a.Keyword("false")}(c("../tree")),function(a){a.Media=function(b,c,d,e){this.index=d,this.currentFileInfo=e;var f=this.emptySelectors();this.features=new a.Value(c),this.rules=[new a.Ruleset(f,b)],this.rules[0].allowImports=!0},a.Media.prototype={type:"Media",accept:function(a){this.features&&(this.features=a.visit(this.features)),this.rules&&(this.rules=a.visitArray(this.rules))},genCSS:function(b,c){c.add("@media ",this.currentFileInfo,this.index),this.features.genCSS(b,c),a.outputRuleset(b,c,this.rules)},toCSS:a.toCSS,eval:function(b){b.mediaBlocks||(b.mediaBlocks=[],b.mediaPath=[]);var c=new a.Media(null,[],this.index,this.currentFileInfo);this.debugInfo&&(this.rules[0].debugInfo=this.debugInfo,c.debugInfo=this.debugInfo);var d=!1;b.strictMath||(d=!0,b.strictMath=!0);try{c.features=this.features.eval(b)}finally{d&&(b.strictMath=!1)}return b.mediaPath.push(c),b.mediaBlocks.push(c),b.frames.unshift(this.rules[0]),c.rules=[this.rules[0].eval(b)],b.frames.shift(),b.mediaPath.pop(),0===b.mediaPath.length?c.evalTop(b):c.evalNested(b)},variable:function(b){return a.Ruleset.prototype.variable.call(this.rules[0],b)},find:function(){return a.Ruleset.prototype.find.apply(this.rules[0],arguments)},rulesets:function(){return a.Ruleset.prototype.rulesets.apply(this.rules[0])},emptySelectors:function(){var b=new a.Element("","&",this.index,this.currentFileInfo),c=[new a.Selector([b],null,null,this.index,this.currentFileInfo)];return c[0].mediaEmpty=!0,c},markReferenced:function(){var a,b=this.rules[0].rules;for(this.rules[0].markReferenced(),this.isReferenced=!0,a=0;a<b.length;a++)b[a].markReferenced&&b[a].markReferenced()},evalTop:function(b){var c=this;if(b.mediaBlocks.length>1){var d=this.emptySelectors();c=new a.Ruleset(d,b.mediaBlocks),c.multiMedia=!0}return delete b.mediaBlocks,delete b.mediaPath,c},evalNested:function(b){var c,d,e=b.mediaPath.concat([this]);for(c=0;c<e.length;c++)d=e[c].features instanceof a.Value?e[c].features.value:e[c].features,e[c]=Array.isArray(d)?d:[d];return this.features=new a.Value(this.permute(e).map(function(b){for(b=b.map(function(b){return b.toCSS?b:new a.Anonymous(b)}),c=b.length-1;c>0;c--)b.splice(c,0,new a.Anonymous("and"));return new a.Expression(b)})),new a.Ruleset([],[])},permute:function(a){if(0===a.length)return[];
+if(1===a.length)return a[0];for(var b=[],c=this.permute(a.slice(1)),d=0;d<c.length;d++)for(var e=0;e<a[0].length;e++)b.push([a[0][e]].concat(c[d]));return b},bubbleSelectors:function(b){b&&(this.rules=[new a.Ruleset(b.slice(0),[this.rules[0]])])}}}(c("../tree")),function(a){a.mixin={},a.mixin.Call=function(b,c,d,e,f){this.selector=new a.Selector(b),this.arguments=c&&c.length?c:null,this.index=d,this.currentFileInfo=e,this.important=f},a.mixin.Call.prototype={type:"MixinCall",accept:function(a){this.selector&&(this.selector=a.visit(this.selector)),this.arguments&&(this.arguments=a.visitArray(this.arguments))},eval:function(b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p=[],q=!1,r=[],s=[],t=a.defaultFunc,u=0,v=1,w=2;for(e=this.arguments&&this.arguments.map(function(a){return{name:a.name,value:a.value.eval(b)}}),f=0;f<b.frames.length;f++)if((c=b.frames[f].find(this.selector)).length>0){for(j=!0,g=0;g<c.length;g++){for(d=c[g],i=!1,h=0;h<b.frames.length;h++)if(!(d instanceof a.mixin.Definition)&&d===(b.frames[h].originalRuleset||b.frames[h])){i=!0;break}if(!i&&d.matchArgs(e,b)){if(l={mixin:d,group:u},d.matchCondition){for(h=0;2>h;h++)t.value(h),s[h]=d.matchCondition(e,b);(s[0]||s[1])&&(s[0]!=s[1]&&(l.group=s[1]?v:w),r.push(l))}else r.push(l);q=!0}}for(t.reset(),n=[0,0,0],g=0;g<r.length;g++)n[r[g].group]++;if(n[u]>0)m=w;else if(m=v,n[v]+n[w]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(e)+"`",index:this.index,filename:this.currentFileInfo.filename};for(g=0;g<r.length;g++)if(l=r[g].group,l===u||l===m)try{d=r[g].mixin,d instanceof a.mixin.Definition||(o=d.originalRuleset||d,d=new a.mixin.Definition("",[],d.rules,null,!1),d.originalRuleset=o),Array.prototype.push.apply(p,d.evalCall(b,e,this.important).rules)}catch(x){throw{message:x.message,index:this.index,filename:this.currentFileInfo.filename,stack:x.stack}}if(q){if(!this.currentFileInfo||!this.currentFileInfo.reference)for(f=0;f<p.length;f++)k=p[f],k.markReferenced&&k.markReferenced();return p}}throw j?{type:"Runtime",message:"No matching definition was found for `"+this.format(e)+"`",index:this.index,filename:this.currentFileInfo.filename}:{type:"Name",message:this.selector.toCSS().trim()+" is undefined",index:this.index,filename:this.currentFileInfo.filename}},format:function(a){return this.selector.toCSS().trim()+"("+(a?a.map(function(a){var b="";return a.name&&(b+=a.name+":"),b+=a.value.toCSS?a.value.toCSS():"???"}).join(", "):"")+")"}},a.mixin.Definition=function(b,c,d,e,f,g){this.name=b,this.selectors=[new a.Selector([new a.Element(null,b,this.index,this.currentFileInfo)])],this.params=c,this.condition=e,this.variadic=f,this.arity=c.length,this.rules=d,this._lookups={},this.required=c.reduce(function(a,b){return!b.name||b.name&&!b.value?a+1:a},0),this.parent=a.Ruleset.prototype,this.frames=g},a.mixin.Definition.prototype={type:"MixinDefinition",accept:function(a){this.params&&this.params.length&&(this.params=a.visitArray(this.params)),this.rules=a.visitArray(this.rules),this.condition&&(this.condition=a.visit(this.condition))},variable:function(a){return this.parent.variable.call(this,a)},variables:function(){return this.parent.variables.call(this)},find:function(){return this.parent.find.apply(this,arguments)},rulesets:function(){return this.parent.rulesets.apply(this)},evalParams:function(b,c,d,e){var f,g,h,i,j,k,l,m,n=new a.Ruleset(null,null),o=this.params.slice(0),p=0;if(c=new a.evalEnv(c,[n].concat(c.frames)),d)for(d=d.slice(0),p=d.length,h=0;p>h;h++)if(g=d[h],k=g&&g.name){for(l=!1,i=0;i<o.length;i++)if(!e[i]&&k===o[i].name){e[i]=g.value.eval(b),n.prependRule(new a.Rule(k,g.value.eval(b))),l=!0;break}if(l){d.splice(h,1),h--;continue}throw{type:"Runtime",message:"Named argument for "+this.name+" "+d[h].name+" not found"}}for(m=0,h=0;h<o.length;h++)if(!e[h]){if(g=d&&d[m],k=o[h].name)if(o[h].variadic){for(f=[],i=m;p>i;i++)f.push(d[i].value.eval(b));n.prependRule(new a.Rule(k,new a.Expression(f).eval(b)))}else{if(j=g&&g.value)j=j.eval(b);else{if(!o[h].value)throw{type:"Runtime",message:"wrong number of arguments for "+this.name+" ("+p+" for "+this.arity+")"};j=o[h].value.eval(c),n.resetCache()}n.prependRule(new a.Rule(k,j)),e[h]=j}if(o[h].variadic&&d)for(i=m;p>i;i++)e[i]=d[i].value.eval(b);m++}return n},eval:function(b){return new a.mixin.Definition(this.name,this.params,this.rules,this.condition,this.variadic,this.frames||b.frames.slice(0))},evalCall:function(b,c,d){var e,f,g=[],h=this.frames?this.frames.concat(b.frames):b.frames,i=this.evalParams(b,new a.evalEnv(b,h),c,g);return i.prependRule(new a.Rule("@arguments",new a.Expression(g).eval(b))),e=this.rules.slice(0),f=new a.Ruleset(null,e),f.originalRuleset=this,f=f.eval(new a.evalEnv(b,[this,i].concat(h))),d&&(f=this.parent.makeImportant.apply(f)),f},matchCondition:function(b,c){return this.condition&&!this.condition.eval(new a.evalEnv(c,[this.evalParams(c,new a.evalEnv(c,this.frames?this.frames.concat(c.frames):c.frames),b,[])].concat(this.frames).concat(c.frames)))?!1:!0},matchArgs:function(a,b){var c,d=a&&a.length||0;if(this.variadic){if(d<this.required-1)return!1}else{if(d<this.required)return!1;if(d>this.params.length)return!1}c=Math.min(d,this.arity);for(var e=0;c>e;e++)if(!this.params[e].name&&!this.params[e].variadic&&a[e].value.eval(b).toCSS()!=this.params[e].value.eval(b).toCSS())return!1;return!0}}}(c("../tree")),function(a){a.Negative=function(a){this.value=a},a.Negative.prototype={type:"Negative",accept:function(a){this.value=a.visit(this.value)},genCSS:function(a,b){b.add("-"),this.value.genCSS(a,b)},toCSS:a.toCSS,eval:function(b){return b.isMathOn()?new a.Operation("*",[new a.Dimension(-1),this.value]).eval(b):new a.Negative(this.value.eval(b))}}}(c("../tree")),function(a){a.Operation=function(a,b,c){this.op=a.trim(),this.operands=b,this.isSpaced=c},a.Operation.prototype={type:"Operation",accept:function(a){this.operands=a.visit(this.operands)},eval:function(b){var c=this.operands[0].eval(b),d=this.operands[1].eval(b);if(b.isMathOn()){if(c instanceof a.Dimension&&d instanceof a.Color&&(c=c.toColor()),d instanceof a.Dimension&&c instanceof a.Color&&(d=d.toColor()),!c.operate)throw{type:"Operation",message:"Operation on an invalid type"};return c.operate(b,this.op,d)}return new a.Operation(this.op,[c,d],this.isSpaced)},genCSS:function(a,b){this.operands[0].genCSS(a,b),this.isSpaced&&b.add(" "),b.add(this.op),this.isSpaced&&b.add(" "),this.operands[1].genCSS(a,b)},toCSS:a.toCSS},a.operate=function(a,b,c,d){switch(b){case"+":return c+d;case"-":return c-d;case"*":return c*d;case"/":return c/d}}}(c("../tree")),function(a){a.Paren=function(a){this.value=a},a.Paren.prototype={type:"Paren",accept:function(a){this.value=a.visit(this.value)},genCSS:function(a,b){b.add("("),this.value.genCSS(a,b),b.add(")")},toCSS:a.toCSS,eval:function(b){return new a.Paren(this.value.eval(b))}}}(c("../tree")),function(a){a.Quoted=function(a,b,c,d,e){this.escaped=c,this.value=b||"",this.quote=a.charAt(0),this.index=d,this.currentFileInfo=e},a.Quoted.prototype={type:"Quoted",genCSS:function(a,b){this.escaped||b.add(this.quote,this.currentFileInfo,this.index),b.add(this.value),this.escaped||b.add(this.quote)},toCSS:a.toCSS,eval:function(b){var c=this,d=this.value.replace(/`([^`]+)`/g,function(d,e){return new a.JavaScript(e,c.index,!0).eval(b).value}).replace(/@\{([\w-]+)\}/g,function(d,e){var f=new a.Variable("@"+e,c.index,c.currentFileInfo).eval(b,!0);return f instanceof a.Quoted?f.value:f.toCSS()});return new a.Quoted(this.quote+d+this.quote,d,this.escaped,this.index,this.currentFileInfo)},compare:function(a){if(!a.toCSS)return-1;var b,c;return"Quoted"!==a.type||this.escaped||a.escaped?(b=this.toCSS(),c=a.toCSS()):(b=a.value,c=this.value),b===c?0:c>b?-1:1}}}(c("../tree")),function(a){function c(a,b){var c,d="",e=b.length,f={add:function(a){d+=a}};for(c=0;e>c;c++)b[c].eval(a).genCSS(a,f);return d}a.Rule=function(c,d,e,f,g,h,i,j){this.name=c,this.value=d instanceof a.Value||d instanceof a.Ruleset?d:new a.Value([d]),this.important=e?" "+e.trim():"",this.merge=f,this.index=g,this.currentFileInfo=h,this.inline=i||!1,this.variable=j!==b?j:c.charAt&&"@"===c.charAt(0)},a.Rule.prototype={type:"Rule",accept:function(a){this.value=a.visit(this.value)},genCSS:function(a,b){b.add(this.name+(a.compress?":":": "),this.currentFileInfo,this.index);try{this.value.genCSS(a,b)}catch(c){throw c.index=this.index,c.filename=this.currentFileInfo.filename,c}b.add(this.important+(this.inline||a.lastRule&&a.compress?"":";"),this.currentFileInfo,this.index)},toCSS:a.toCSS,eval:function(b){var d,e=!1,f=this.name,g=this.variable;"string"!=typeof f&&(f=1===f.length&&f[0]instanceof a.Keyword?f[0].value:c(b,f),g=!1),"font"!==f||b.strictMath||(e=!0,b.strictMath=!0);try{if(d=this.value.eval(b),!this.variable&&"DetachedRuleset"===d.type)throw{message:"Rulesets cannot be evaluated on a property.",index:this.index,filename:this.currentFileInfo.filename};return new a.Rule(f,d,this.important,this.merge,this.index,this.currentFileInfo,this.inline,g)}catch(h){throw"number"!=typeof h.index&&(h.index=this.index,h.filename=this.currentFileInfo.filename),h}finally{e&&(b.strictMath=!1)}},makeImportant:function(){return new a.Rule(this.name,this.value,"!important",this.merge,this.index,this.currentFileInfo,this.inline)}}}(c("../tree")),function(a){a.RulesetCall=function(a){this.variable=a},a.RulesetCall.prototype={type:"RulesetCall",accept:function(){},eval:function(b){var c=new a.Variable(this.variable).eval(b);return c.callEval(b)}}}(c("../tree")),function(a){a.Ruleset=function(a,b,c){this.selectors=a,this.rules=b,this._lookups={},this.strictImports=c},a.Ruleset.prototype={type:"Ruleset",accept:function(a){this.paths?a.visitArray(this.paths,!0):this.selectors&&(this.selectors=a.visitArray(this.selectors)),this.rules&&this.rules.length&&(this.rules=a.visitArray(this.rules))},eval:function(b){var c,d,e,f,g=this.selectors,h=a.defaultFunc,i=!1;if(g&&(d=g.length)){for(c=[],h.error({type:"Syntax",message:"it is currently only allowed in parametric mixin guards,"}),f=0;d>f;f++)e=g[f].eval(b),c.push(e),e.evaldCondition&&(i=!0);h.reset()}else i=!0;var j,k,l=this.rules?this.rules.slice(0):null,m=new a.Ruleset(c,l,this.strictImports);m.originalRuleset=this,m.root=this.root,m.firstRoot=this.firstRoot,m.allowImports=this.allowImports,this.debugInfo&&(m.debugInfo=this.debugInfo),i||(l.length=0);var n=b.frames;n.unshift(m);var o=b.selectors;o||(b.selectors=o=[]),o.unshift(this.selectors),(m.root||m.allowImports||!m.strictImports)&&m.evalImports(b);var p=m.rules,q=p?p.length:0;for(f=0;q>f;f++)(p[f]instanceof a.mixin.Definition||p[f]instanceof a.DetachedRuleset)&&(p[f]=p[f].eval(b));var r=b.mediaBlocks&&b.mediaBlocks.length||0;for(f=0;q>f;f++)p[f]instanceof a.mixin.Call?(l=p[f].eval(b).filter(function(b){return b instanceof a.Rule&&b.variable?!m.variable(b.name):!0}),p.splice.apply(p,[f,1].concat(l)),q+=l.length-1,f+=l.length-1,m.resetCache()):p[f]instanceof a.RulesetCall&&(l=p[f].eval(b).rules.filter(function(b){return b instanceof a.Rule&&b.variable?!1:!0}),p.splice.apply(p,[f,1].concat(l)),q+=l.length-1,f+=l.length-1,m.resetCache());for(f=0;f<p.length;f++)j=p[f],j instanceof a.mixin.Definition||j instanceof a.DetachedRuleset||(p[f]=j=j.eval?j.eval(b):j);for(f=0;f<p.length;f++)if(j=p[f],j instanceof a.Ruleset&&j.selectors&&1===j.selectors.length&&j.selectors[0].isJustParentSelector()){p.splice(f--,1);for(var s=0;s<j.rules.length;s++)k=j.rules[s],k instanceof a.Rule&&k.variable||p.splice(++f,0,k)}if(n.shift(),o.shift(),b.mediaBlocks)for(f=r;f<b.mediaBlocks.length;f++)b.mediaBlocks[f].bubbleSelectors(c);return m},evalImports:function(b){var c,d,e=this.rules;if(e)for(c=0;c<e.length;c++)e[c]instanceof a.Import&&(d=e[c].eval(b),d&&d.length?(e.splice.apply(e,[c,1].concat(d)),c+=d.length-1):e.splice(c,1,d),this.resetCache())},makeImportant:function(){return new a.Ruleset(this.selectors,this.rules.map(function(a){return a.makeImportant?a.makeImportant():a}),this.strictImports)},matchArgs:function(a){return!a||0===a.length},matchCondition:function(b,c){var d=this.selectors[this.selectors.length-1];return d.evaldCondition?d.condition&&!d.condition.eval(new a.evalEnv(c,c.frames))?!1:!0:!1},resetCache:function(){this._rulesets=null,this._variables=null,this._lookups={}},variables:function(){return this._variables||(this._variables=this.rules?this.rules.reduce(function(b,c){return c instanceof a.Rule&&c.variable===!0&&(b[c.name]=c),b},{}):{}),this._variables},variable:function(a){return this.variables()[a]},rulesets:function(){if(!this.rules)return null;var b,c,d=a.Ruleset,e=a.mixin.Definition,f=[],g=this.rules,h=g.length;for(b=0;h>b;b++)c=g[b],(c instanceof d||c instanceof e)&&f.push(c);return f},prependRule:function(a){var b=this.rules;b?b.unshift(a):this.rules=[a]},find:function(b,c){c=c||this;var d,e=[],f=b.toCSS();return f in this._lookups?this._lookups[f]:(this.rulesets().forEach(function(f){if(f!==c)for(var g=0;g<f.selectors.length;g++)if(d=b.match(f.selectors[g])){b.elements.length>d?Array.prototype.push.apply(e,f.find(new a.Selector(b.elements.slice(d)),c)):e.push(f);break}}),this._lookups[f]=e,e)},genCSS:function(b,c){function d(b,c){return b.rules?!0:b instanceof a.Media||c&&b instanceof a.Comment?!0:b instanceof a.Directive||b instanceof a.Anonymous?b.isRulesetLike():!1}var e,f,g,h,i,j,k=[],l=[],m=[];b.tabLevel=b.tabLevel||0,this.root||b.tabLevel++;var n,o=b.compress?"":Array(b.tabLevel+1).join("  "),p=b.compress?"":Array(b.tabLevel).join("  ");for(e=0;e<this.rules.length;e++)i=this.rules[e],d(i,this.root)?m.push(i):i.isCharset&&i.isCharset()?k.push(i):l.push(i);if(l=k.concat(l),!this.root){h=a.debugInfo(b,this,p),h&&(c.add(h),c.add(p));var q,r=this.paths,s=r.length;for(n=b.compress?",":",\n"+p,e=0;s>e;e++)if(j=r[e],q=j.length)for(e>0&&c.add(n),b.firstSelector=!0,j[0].genCSS(b,c),b.firstSelector=!1,f=1;q>f;f++)j[f].genCSS(b,c);c.add((b.compress?"{":" {\n")+o)}for(e=0;e<l.length;e++)i=l[e],e+1!==l.length||this.root&&0!==m.length&&!this.firstRoot||(b.lastRule=!0),i.genCSS?i.genCSS(b,c):i.value&&c.add(i.value.toString()),b.lastRule?b.lastRule=!1:c.add(b.compress?"":"\n"+o);if(this.root||(c.add(b.compress?"}":"\n"+p+"}"),b.tabLevel--),n=(b.compress?"":"\n")+(this.root?o:p),g=m.length)for(l.length&&n&&c.add(n),m[0].genCSS(b,c),e=1;g>e;e++)n&&c.add(n),m[e].genCSS(b,c);c.isEmpty()||b.compress||!this.firstRoot||c.add("\n")},toCSS:a.toCSS,markReferenced:function(){if(this.selectors)for(var a=0;a<this.selectors.length;a++)this.selectors[a].markReferenced()},joinSelectors:function(a,b,c){for(var d=0;d<c.length;d++)this.joinSelector(a,b,c[d])},joinSelector:function(b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;for(e=0;e<d.elements.length;e++)j=d.elements[e],"&"===j.value&&(h=!0);if(h){for(r=[],i=[[]],e=0;e<d.elements.length;e++)if(j=d.elements[e],"&"!==j.value)r.push(j);else{for(s=[],r.length>0&&this.mergeElementsOnToSelectors(r,i),f=0;f<i.length;f++)if(k=i[f],0===c.length)k.length>0&&(k[0].elements=k[0].elements.slice(0),k[0].elements.push(new a.Element(j.combinator,"",j.index,j.currentFileInfo))),s.push(k);else for(g=0;g<c.length;g++)l=c[g],m=[],n=[],p=!0,k.length>0?(m=k.slice(0),q=m.pop(),o=d.createDerived(q.elements.slice(0)),p=!1):o=d.createDerived([]),l.length>1&&(n=n.concat(l.slice(1))),l.length>0&&(p=!1,o.elements.push(new a.Element(j.combinator,l[0].elements[0].value,j.index,j.currentFileInfo)),o.elements=o.elements.concat(l[0].elements.slice(1))),p||m.push(o),m=m.concat(n),s.push(m);i=s,r=[]}for(r.length>0&&this.mergeElementsOnToSelectors(r,i),e=0;e<i.length;e++)i[e].length>0&&b.push(i[e])}else if(c.length>0)for(e=0;e<c.length;e++)b.push(c[e].concat(d));else b.push([d])},mergeElementsOnToSelectors:function(b,c){var d,e;if(0===c.length)return void c.push([new a.Selector(b)]);for(d=0;d<c.length;d++)e=c[d],e.length>0?e[e.length-1]=e[e.length-1].createDerived(e[e.length-1].elements.concat(b)):e.push(new a.Selector(b))}}}(c("../tree")),function(a){a.Selector=function(a,b,c,d,e,f){this.elements=a,this.extendList=b,this.condition=c,this.currentFileInfo=e||{},this.isReferenced=f,c||(this.evaldCondition=!0)},a.Selector.prototype={type:"Selector",accept:function(a){this.elements&&(this.elements=a.visitArray(this.elements)),this.extendList&&(this.extendList=a.visitArray(this.extendList)),this.condition&&(this.condition=a.visit(this.condition))},createDerived:function(b,c,d){d=null!=d?d:this.evaldCondition;var e=new a.Selector(b,c||this.extendList,null,this.index,this.currentFileInfo,this.isReferenced);return e.evaldCondition=d,e.mediaEmpty=this.mediaEmpty,e},match:function(a){var b,c,d=this.elements,e=d.length;if(a.CacheElements(),b=a._elements.length,0===b||b>e)return 0;for(c=0;b>c;c++)if(d[c].value!==a._elements[c])return 0;return b},CacheElements:function(){var a,b,c,d="";if(!this._elements){for(a=this.elements.length,c=0;a>c;c++)if(b=this.elements[c],d+=b.combinator.value,b.value.value){if("string"!=typeof b.value.value){d="";break}d+=b.value.value}else d+=b.value;this._elements=d.match(/[,&#\*\.\w-]([\w-]|(\\.))*/g),this._elements?"&"===this._elements[0]&&this._elements.shift():this._elements=[]}},isJustParentSelector:function(){return!this.mediaEmpty&&1===this.elements.length&&"&"===this.elements[0].value&&(" "===this.elements[0].combinator.value||""===this.elements[0].combinator.value)},eval:function(a){var b=this.condition&&this.condition.eval(a),c=this.elements,d=this.extendList;return c=c&&c.map(function(b){return b.eval(a)}),d=d&&d.map(function(b){return b.eval(a)}),this.createDerived(c,d,b)},genCSS:function(a,b){var c,d;if(a&&a.firstSelector||""!==this.elements[0].combinator.value||b.add(" ",this.currentFileInfo,this.index),!this._css)for(c=0;c<this.elements.length;c++)d=this.elements[c],d.genCSS(a,b)},toCSS:a.toCSS,markReferenced:function(){this.isReferenced=!0},getIsReferenced:function(){return!this.currentFileInfo.reference||this.isReferenced},getIsOutput:function(){return this.evaldCondition}}}(c("../tree")),function(a){a.UnicodeDescriptor=function(a){this.value=a},a.UnicodeDescriptor.prototype={type:"UnicodeDescriptor",genCSS:function(a,b){b.add(this.value)},toCSS:a.toCSS,eval:function(){return this}}}(c("../tree")),function(a){a.URL=function(a,b,c){this.value=a,this.currentFileInfo=b,this.isEvald=c},a.URL.prototype={type:"Url",accept:function(a){this.value=a.visit(this.value)},genCSS:function(a,b){b.add("url("),this.value.genCSS(a,b),b.add(")")},toCSS:a.toCSS,eval:function(b){var c,d=this.value.eval(b);if(!this.isEvald&&(c=this.currentFileInfo&&this.currentFileInfo.rootpath,c&&"string"==typeof d.value&&b.isPathRelative(d.value)&&(d.quote||(c=c.replace(/[\(\)'"\s]/g,function(a){return"\\"+a})),d.value=c+d.value),d.value=b.normalizePath(d.value),b.urlArgs&&!d.value.match(/^\s*data:/))){var e=-1===d.value.indexOf("?")?"?":"&",f=e+b.urlArgs;-1!==d.value.indexOf("#")?d.value=d.value.replace("#",f+"#"):d.value+=f}return new a.URL(d,this.currentFileInfo,!0)}}}(c("../tree")),function(a){a.Value=function(a){this.value=a},a.Value.prototype={type:"Value",accept:function(a){this.value&&(this.value=a.visitArray(this.value))},eval:function(b){return 1===this.value.length?this.value[0].eval(b):new a.Value(this.value.map(function(a){return a.eval(b)}))},genCSS:function(a,b){var c;for(c=0;c<this.value.length;c++)this.value[c].genCSS(a,b),c+1<this.value.length&&b.add(a&&a.compress?",":", ")},toCSS:a.toCSS}}(c("../tree")),function(a){a.Variable=function(a,b,c){this.name=a,this.index=b,this.currentFileInfo=c||{}},a.Variable.prototype={type:"Variable",eval:function(b){var c,d=this.name;if(0===d.indexOf("@@")&&(d="@"+new a.Variable(d.slice(1)).eval(b).value),this.evaluating)throw{type:"Name",message:"Recursive variable definition for "+d,filename:this.currentFileInfo.file,index:this.index};if(this.evaluating=!0,c=a.find(b.frames,function(a){var c=a.variable(d);return c?c.value.eval(b):void 0}))return this.evaluating=!1,c;throw{type:"Name",message:"variable "+d+" is undefined",filename:this.currentFileInfo.filename,index:this.index}}}}(c("../tree")),function(a){var b=["paths","optimization","files","contents","contentsIgnoredChars","relativeUrls","rootpath","strictImports","insecure","dumpLineNumbers","compress","processImports","syncImport","javascriptEnabled","mime","useFileCache","currentFileInfo"];a.parseEnv=function(a){if(d(a,this,b),this.contents||(this.contents={}),this.contentsIgnoredChars||(this.contentsIgnoredChars={}),this.files||(this.files={}),"string"==typeof this.paths&&(this.paths=[this.paths]),!this.currentFileInfo){var c=a&&a.filename||"input",e=c.replace(/[^\/\\]*$/,"");a&&(a.filename=null),this.currentFileInfo={filename:c,relativeUrls:this.relativeUrls,rootpath:a&&a.rootpath||"",currentDirectory:e,entryPath:e,rootFilename:c}}};var c=["silent","verbose","compress","yuicompress","ieCompat","strictMath","strictUnits","cleancss","sourceMap","importMultiple","urlArgs"];a.evalEnv=function(a,b){d(a,this,c),this.frames=b||[]},a.evalEnv.prototype.inParenthesis=function(){this.parensStack||(this.parensStack=[]),this.parensStack.push(!0)},a.evalEnv.prototype.outOfParenthesis=function(){this.parensStack.pop()},a.evalEnv.prototype.isMathOn=function(){return this.strictMath?this.parensStack&&this.parensStack.length:!0},a.evalEnv.prototype.isPathRelative=function(a){return!/^(?:[a-z-]+:|\/)/.test(a)},a.evalEnv.prototype.normalizePath=function(a){var b,c=a.split("/").reverse();for(a=[];0!==c.length;)switch(b=c.pop()){case".":break;case"..":0===a.length||".."===a[a.length-1]?a.push(b):a.pop();break;default:a.push(b)}return a.join("/")};var d=function(a,b,c){if(a)for(var d=0;d<c.length;d++)a.hasOwnProperty(c[d])&&(b[c[d]]=a[c[d]])}}(c("./tree")),function(a){function b(a){return a}function c(a,b){var d,e;for(d in a)if(a.hasOwnProperty(d))switch(e=a[d],typeof e){case"function":e.prototype&&e.prototype.type&&(e.prototype.typeIndex=b++);break;case"object":b=c(e,b)}return b}var d={visitDeeper:!0},e=!1;a.visitor=function(b){this._implementation=b,this._visitFnCache=[],e||(c(a,1),e=!0)},a.visitor.prototype={visit:function(a){if(!a)return a;var c=a.typeIndex;if(!c)return a;var e,f=this._visitFnCache,g=this._implementation,h=c<<1,i=1|h,j=f[h],k=f[i],l=d;if(l.visitDeeper=!0,j||(e="visit"+a.type,j=g[e]||b,k=g[e+"Out"]||b,f[h]=j,f[i]=k),j!==b){var m=j.call(g,a,l);g.isReplacing&&(a=m)}return l.visitDeeper&&a&&a.accept&&a.accept(this),k!=b&&k.call(g,a),a},visitArray:function(a,b){if(!a)return a;var c,d=a.length;if(b||!this._implementation.isReplacing){for(c=0;d>c;c++)this.visit(a[c]);return a}var e=[];for(c=0;d>c;c++){var f=this.visit(a[c]);f.splice?f.length&&this.flatten(f,e):e.push(f)}return e},flatten:function(a,b){b||(b=[]);var c,d,e,f,g,h;for(d=0,c=a.length;c>d;d++)if(e=a[d],e.splice)for(g=0,f=e.length;f>g;g++)h=e[g],h.splice?h.length&&this.flatten(h,b):b.push(h);else b.push(e);return b}}}(c("./tree")),function(a){a.importVisitor=function(b,c,d,e,f){if(this._visitor=new a.visitor(this),this._importer=b,this._finish=c,this.env=d||new a.evalEnv,this.importCount=0,this.onceFileDetectionMap=e||{},this.recursionDetector={},f)for(var g in f)f.hasOwnProperty(g)&&(this.recursionDetector[g]=!0)},a.importVisitor.prototype={isReplacing:!0,run:function(a){var b;try{this._visitor.visit(a)}catch(c){b=c}this.isFinished=!0,0===this.importCount&&this._finish(b)},visitImport:function(b,c){var d,e=this,f=b.options.inline;if(!b.css||f){try{d=b.evalForImport(this.env)}catch(g){g.filename||(g.index=b.index,g.filename=b.currentFileInfo.filename),b.css=!0,b.error=g}if(d&&(!d.css||f)){b=d,this.importCount++;var h=new a.evalEnv(this.env,this.env.frames.slice(0));b.options.multiple&&(h.importMultiple=!0),this._importer.push(b.getPath(),b.currentFileInfo,b.options,function(c,d,g,i){c&&!c.filename&&(c.index=b.index,c.filename=b.currentFileInfo.filename);var j=g||i in e.recursionDetector;h.importMultiple||(b.skip=j?!0:function(){return i in e.onceFileDetectionMap?!0:(e.onceFileDetectionMap[i]=!0,!1)});var k=function(a){e.importCount--,0===e.importCount&&e.isFinished&&e._finish(a)};return!d||(b.root=d,b.importedFilename=i,f||!h.importMultiple&&j)?void k():(e.recursionDetector[i]=!0,void new a.importVisitor(e._importer,k,h,e.onceFileDetectionMap,e.recursionDetector).run(d))})}}return c.visitDeeper=!1,b},visitRule:function(a,b){return b.visitDeeper=!1,a},visitDirective:function(a){return this.env.frames.unshift(a),a},visitDirectiveOut:function(){this.env.frames.shift()},visitMixinDefinition:function(a){return this.env.frames.unshift(a),a},visitMixinDefinitionOut:function(){this.env.frames.shift()},visitRuleset:function(a){return this.env.frames.unshift(a),a},visitRulesetOut:function(){this.env.frames.shift()},visitMedia:function(a){return this.env.frames.unshift(a.rules[0]),a},visitMediaOut:function(){this.env.frames.shift()}}}(c("./tree")),function(a){a.joinSelectorVisitor=function(){this.contexts=[[]],this._visitor=new a.visitor(this)},a.joinSelectorVisitor.prototype={run:function(a){return this._visitor.visit(a)},visitRule:function(a,b){b.visitDeeper=!1},visitMixinDefinition:function(a,b){b.visitDeeper=!1},visitRuleset:function(a){var b,c=this.contexts[this.contexts.length-1],d=[];this.contexts.push(d),a.root||(b=a.selectors,b&&(b=b.filter(function(a){return a.getIsOutput()}),a.selectors=b.length?b:b=null,b&&a.joinSelectors(d,c,b)),b||(a.rules=null),a.paths=d)},visitRulesetOut:function(){this.contexts.length=this.contexts.length-1},visitMedia:function(a){var b=this.contexts[this.contexts.length-1];a.rules[0].root=0===b.length||b[0].multiMedia}}}(c("./tree")),function(a){a.toCSSVisitor=function(b){this._visitor=new a.visitor(this),this._env=b},a.toCSSVisitor.prototype={isReplacing:!0,run:function(a){return this._visitor.visit(a)},visitRule:function(a){return a.variable?[]:a},visitMixinDefinition:function(a){return a.frames=[],[]},visitExtend:function(){return[]},visitComment:function(a){return a.isSilent(this._env)?[]:a},visitMedia:function(a,b){return a.accept(this._visitor),b.visitDeeper=!1,a.rules.length?a:[]},visitDirective:function(b){if(b.currentFileInfo.reference&&!b.isReferenced)return[];if("@charset"===b.name){if(this.charset){if(b.debugInfo){var c=new a.Comment("/* "+b.toCSS(this._env).replace(/\n/g,"")+" */\n");return c.debugInfo=b.debugInfo,this._visitor.visit(c)}return[]}this.charset=!0}return b.rules&&b.rules.rules&&this._mergeRules(b.rules.rules),b},checkPropertiesInRoot:function(b){for(var c,d=0;d<b.length;d++)if(c=b[d],c instanceof a.Rule&&!c.variable)throw{message:"properties must be inside selector blocks, they cannot be in the root.",index:c.index,filename:c.currentFileInfo?c.currentFileInfo.filename:null}},visitRuleset:function(b,c){var d,e=[];if(b.firstRoot&&this.checkPropertiesInRoot(b.rules),b.root)b.accept(this._visitor),c.visitDeeper=!1,(b.firstRoot||b.rules&&b.rules.length>0)&&e.splice(0,0,b);else{b.paths&&(b.paths=b.paths.filter(function(b){var c;for(" "===b[0].elements[0].combinator.value&&(b[0].elements[0].combinator=new a.Combinator("")),c=0;c<b.length;c++)if(b[c].getIsReferenced()&&b[c].getIsOutput())return!0;return!1}));for(var f=b.rules,g=f?f.length:0,h=0;g>h;)d=f[h],d&&d.rules?(e.push(this._visitor.visit(d)),f.splice(h,1),g--):h++;g>0?b.accept(this._visitor):b.rules=null,c.visitDeeper=!1,f=b.rules,f&&(this._mergeRules(f),f=b.rules),f&&(this._removeDuplicateRules(f),f=b.rules),f&&f.length>0&&b.paths.length>0&&e.splice(0,0,b)}return 1===e.length?e[0]:e},_removeDuplicateRules:function(b){if(b){var c,d,e,f={};for(e=b.length-1;e>=0;e--)if(d=b[e],d instanceof a.Rule)if(f[d.name]){c=f[d.name],c instanceof a.Rule&&(c=f[d.name]=[f[d.name].toCSS(this._env)]);var g=d.toCSS(this._env);-1!==c.indexOf(g)?b.splice(e,1):c.push(g)}else f[d.name]=d}},_mergeRules:function(b){if(b){for(var c,d,e,f={},g=0;g<b.length;g++)d=b[g],d instanceof a.Rule&&d.merge&&(e=[d.name,d.important?"!":""].join(","),f[e]?b.splice(g--,1):f[e]=[],f[e].push(d));Object.keys(f).map(function(b){function e(b){return new a.Expression(b.map(function(a){return a.value}))}function g(b){return new a.Value(b.map(function(a){return a}))}if(c=f[b],c.length>1){d=c[0];var h=[],i=[];c.map(function(a){"+"===a.merge&&(i.length>0&&h.push(e(i)),i=[]),i.push(a)}),h.push(e(i)),d.value=g(h)}})}}}}(c("./tree")),function(a){a.extendFinderVisitor=function(){this._visitor=new a.visitor(this),this.contexts=[],this.allExtendsStack=[[]]},a.extendFinderVisitor.prototype={run:function(a){return a=this._visitor.visit(a),a.allExtends=this.allExtendsStack[0],a},visitRule:function(a,b){b.visitDeeper=!1},visitMixinDefinition:function(a,b){b.visitDeeper=!1},visitRuleset:function(b){if(!b.root){var c,d,e,f,g=[],h=b.rules,i=h?h.length:0;for(c=0;i>c;c++)b.rules[c]instanceof a.Extend&&(g.push(h[c]),b.extendOnEveryPath=!0);var j=b.paths;for(c=0;c<j.length;c++){var k=j[c],l=k[k.length-1],m=l.extendList;for(f=m?m.slice(0).concat(g):g,f&&(f=f.map(function(a){return a.clone()})),d=0;d<f.length;d++)this.foundExtends=!0,e=f[d],e.findSelfSelectors(k),e.ruleset=b,0===d&&(e.firstExtendOnThisSelectorPath=!0),this.allExtendsStack[this.allExtendsStack.length-1].push(e)}this.contexts.push(b.selectors)}},visitRulesetOut:function(a){a.root||(this.contexts.length=this.contexts.length-1)},visitMedia:function(a){a.allExtends=[],this.allExtendsStack.push(a.allExtends)},visitMediaOut:function(){this.allExtendsStack.length=this.allExtendsStack.length-1},visitDirective:function(a){a.allExtends=[],this.allExtendsStack.push(a.allExtends)},visitDirectiveOut:function(){this.allExtendsStack.length=this.allExtendsStack.length-1}},a.processExtendsVisitor=function(){this._visitor=new a.visitor(this)},a.processExtendsVisitor.prototype={run:function(b){var c=new a.extendFinderVisitor;return c.run(b),c.foundExtends?(b.allExtends=b.allExtends.concat(this.doExtendChaining(b.allExtends,b.allExtends)),this.allExtendsStack=[b.allExtends],this._visitor.visit(b)):b},doExtendChaining:function(b,c,d){var e,f,g,h,i,j,k,l,m=[],n=this;for(d=d||0,e=0;e<b.length;e++)for(f=0;f<c.length;f++)j=b[e],k=c[f],j.parent_ids.indexOf(k.object_id)>=0||(i=[k.selfSelectors[0]],g=n.findMatch(j,i),g.length&&j.selfSelectors.forEach(function(b){h=n.extendSelector(g,i,b),l=new a.Extend(k.selector,k.option,0),l.selfSelectors=h,h[h.length-1].extendList=[l],m.push(l),l.ruleset=k.ruleset,l.parent_ids=l.parent_ids.concat(k.parent_ids,j.parent_ids),k.firstExtendOnThisSelectorPath&&(l.firstExtendOnThisSelectorPath=!0,k.ruleset.paths.push(h))}));if(m.length){if(this.extendChainCount++,d>100){var o="{unable to calculate}",p="{unable to calculate}";try{o=m[0].selfSelectors[0].toCSS(),p=m[0].selector.toCSS()}catch(q){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+o+":extend("+p+")"}}return m.concat(n.doExtendChaining(m,c,d+1))}return m},visitRule:function(a,b){b.visitDeeper=!1},visitMixinDefinition:function(a,b){b.visitDeeper=!1},visitSelector:function(a,b){b.visitDeeper=!1},visitRuleset:function(a){if(!a.root){var b,c,d,e,f=this.allExtendsStack[this.allExtendsStack.length-1],g=[],h=this;for(d=0;d<f.length;d++)for(c=0;c<a.paths.length;c++)if(e=a.paths[c],!a.extendOnEveryPath){var i=e[e.length-1].extendList;i&&i.length||(b=this.findMatch(f[d],e),b.length&&f[d].selfSelectors.forEach(function(a){g.push(h.extendSelector(b,e,a))}))}a.paths=a.paths.concat(g)}},findMatch:function(a,b){var c,d,e,f,g,h,i,j=this,k=a.selector.elements,l=[],m=[];for(c=0;c<b.length;c++)for(d=b[c],e=0;e<d.elements.length;e++)for(f=d.elements[e],(a.allowBefore||0===c&&0===e)&&l.push({pathIndex:c,index:e,matched:0,initialCombinator:f.combinator}),h=0;h<l.length;h++)i=l[h],g=f.combinator.value,""===g&&0===e&&(g=" "),!j.isElementValuesEqual(k[i.matched].value,f.value)||i.matched>0&&k[i.matched].combinator.value!==g?i=null:i.matched++,i&&(i.finished=i.matched===k.length,i.finished&&!a.allowAfter&&(e+1<d.elements.length||c+1<b.length)&&(i=null)),i?i.finished&&(i.length=k.length,i.endPathIndex=c,i.endPathElementIndex=e+1,l.length=0,m.push(i)):(l.splice(h,1),h--);return m},isElementValuesEqual:function(b,c){if("string"==typeof b||"string"==typeof c)return b===c;if(b instanceof a.Attribute)return b.op!==c.op||b.key!==c.key?!1:b.value&&c.value?(b=b.value.value||b.value,c=c.value.value||c.value,b===c):b.value||c.value?!1:!0;
+if(b=b.value,c=c.value,b instanceof a.Selector){if(!(c instanceof a.Selector)||b.elements.length!==c.elements.length)return!1;for(var d=0;d<b.elements.length;d++){if(b.elements[d].combinator.value!==c.elements[d].combinator.value&&(0!==d||(b.elements[d].combinator.value||" ")!==(c.elements[d].combinator.value||" ")))return!1;if(!this.isElementValuesEqual(b.elements[d].value,c.elements[d].value))return!1}return!0}return!1},extendSelector:function(b,c,d){var e,f,g,h,i,j=0,k=0,l=[];for(e=0;e<b.length;e++)h=b[e],f=c[h.pathIndex],g=new a.Element(h.initialCombinator,d.elements[0].value,d.elements[0].index,d.elements[0].currentFileInfo),h.pathIndex>j&&k>0&&(l[l.length-1].elements=l[l.length-1].elements.concat(c[j].elements.slice(k)),k=0,j++),i=f.elements.slice(k,h.index).concat([g]).concat(d.elements.slice(1)),j===h.pathIndex&&e>0?l[l.length-1].elements=l[l.length-1].elements.concat(i):(l=l.concat(c.slice(j,h.pathIndex)),l.push(new a.Selector(i))),j=h.endPathIndex,k=h.endPathElementIndex,k>=c[j].elements.length&&(k=0,j++);return j<c.length&&k>0&&(l[l.length-1].elements=l[l.length-1].elements.concat(c[j].elements.slice(k)),j++),l=l.concat(c.slice(j,c.length))},visitRulesetOut:function(){},visitMedia:function(a){var b=a.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);b=b.concat(this.doExtendChaining(b,a.allExtends)),this.allExtendsStack.push(b)},visitMediaOut:function(){this.allExtendsStack.length=this.allExtendsStack.length-1},visitDirective:function(a){var b=a.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);b=b.concat(this.doExtendChaining(b,a.allExtends)),this.allExtendsStack.push(b)},visitDirectiveOut:function(){this.allExtendsStack.length=this.allExtendsStack.length-1}}}(c("./tree")),function(a){a.sourceMapOutput=function(a){this._css=[],this._rootNode=a.rootNode,this._writeSourceMap=a.writeSourceMap,this._contentsMap=a.contentsMap,this._contentsIgnoredCharsMap=a.contentsIgnoredCharsMap,this._sourceMapFilename=a.sourceMapFilename,this._outputFilename=a.outputFilename,this._sourceMapURL=a.sourceMapURL,a.sourceMapBasepath&&(this._sourceMapBasepath=a.sourceMapBasepath.replace(/\\/g,"/")),this._sourceMapRootpath=a.sourceMapRootpath,this._outputSourceFiles=a.outputSourceFiles,this._sourceMapGeneratorConstructor=a.sourceMapGenerator||c("source-map").SourceMapGenerator,this._sourceMapRootpath&&"/"!==this._sourceMapRootpath.charAt(this._sourceMapRootpath.length-1)&&(this._sourceMapRootpath+="/"),this._lineNumber=0,this._column=0},a.sourceMapOutput.prototype.normalizeFilename=function(a){return a=a.replace(/\\/g,"/"),this._sourceMapBasepath&&0===a.indexOf(this._sourceMapBasepath)&&(a=a.substring(this._sourceMapBasepath.length),("\\"===a.charAt(0)||"/"===a.charAt(0))&&(a=a.substring(1))),(this._sourceMapRootpath||"")+a},a.sourceMapOutput.prototype.add=function(a,b,c,d){if(a){var e,f,g,h,i;if(b){var j=this._contentsMap[b.filename];this._contentsIgnoredCharsMap[b.filename]&&(c-=this._contentsIgnoredCharsMap[b.filename],0>c&&(c=0),j=j.slice(this._contentsIgnoredCharsMap[b.filename])),j=j.substring(0,c),f=j.split("\n"),h=f[f.length-1]}if(e=a.split("\n"),g=e[e.length-1],b)if(d)for(i=0;i<e.length;i++)this._sourceMapGenerator.addMapping({generated:{line:this._lineNumber+i+1,column:0===i?this._column:0},original:{line:f.length+i,column:0===i?h.length:0},source:this.normalizeFilename(b.filename)});else this._sourceMapGenerator.addMapping({generated:{line:this._lineNumber+1,column:this._column},original:{line:f.length,column:h.length},source:this.normalizeFilename(b.filename)});1===e.length?this._column+=g.length:(this._lineNumber+=e.length-1,this._column=g.length),this._css.push(a)}},a.sourceMapOutput.prototype.isEmpty=function(){return 0===this._css.length},a.sourceMapOutput.prototype.toCSS=function(a){if(this._sourceMapGenerator=new this._sourceMapGeneratorConstructor({file:this._outputFilename,sourceRoot:null}),this._outputSourceFiles)for(var b in this._contentsMap)if(this._contentsMap.hasOwnProperty(b)){var d=this._contentsMap[b];this._contentsIgnoredCharsMap[b]&&(d=d.slice(this._contentsIgnoredCharsMap[b])),this._sourceMapGenerator.setSourceContent(this.normalizeFilename(b),d)}if(this._rootNode.genCSS(a,this),this._css.length>0){var e,f=JSON.stringify(this._sourceMapGenerator.toJSON());this._sourceMapURL?e=this._sourceMapURL:this._sourceMapFilename&&(e=this.normalizeFilename(this._sourceMapFilename)),this._writeSourceMap?this._writeSourceMap(f):e="data:application/json;base64,"+c("./encoder.js").encodeBase64(f),e&&this._css.push("/*# sourceMappingURL="+e+" */")}return this._css.join("")}}(c("./tree"));var y=/^(file|chrome(-extension)?|resource|qrc|app):/.test(location.protocol);w.env=w.env||("127.0.0.1"==location.hostname||"0.0.0.0"==location.hostname||"localhost"==location.hostname||location.port&&location.port.length>0||y?"development":"production");var z={debug:3,info:2,errors:1,none:0};if(w.logLevel="undefined"!=typeof w.logLevel?w.logLevel:"development"===w.env?z.debug:z.errors,w.async=w.async||!1,w.fileAsync=w.fileAsync||!1,w.poll=w.poll||(y?1e3:1500),w.functions)for(var A in w.functions)w.functions.hasOwnProperty(A)&&(w.tree.functions[A]=w.functions[A]);var B=/!dumpLineNumbers:(comments|mediaquery|all)/.exec(location.hash);B&&(w.dumpLineNumbers=B[1]);var C=/^text\/(x-)?less$/,D=null,E={};if(w.watch=function(){return w.watchMode||(w.env="development",v()),this.watchMode=!0,!0},w.unwatch=function(){return clearInterval(w.watchTimer),this.watchMode=!1,!1},/!watch/.test(location.hash)&&w.watch(),"development"!=w.env)try{D="undefined"==typeof a.localStorage?null:a.localStorage}catch(F){}var G=document.getElementsByTagName("link");w.sheets=[];for(var H=0;H<G.length;H++)("stylesheet/less"===G[H].rel||G[H].rel.match(/stylesheet/)&&G[H].type.match(C))&&w.sheets.push(G[H]);w.modifyVars=function(a){w.refresh(!1,a)},w.refresh=function(a,b){var c,e;c=e=new Date,u(function(a,b,f,i,k){if(a)return j(a,i.href);if(k.local)d("loading "+i.href+" from cache.",z.info);else{d("parsed "+i.href+" successfully.",z.debug);var l=b.toCSS(w);l=h(l),g(l,i,k.lastModified)}d("css for "+i.href+" generated in "+(new Date-e)+"ms",z.info),0===k.remaining&&d("less has finished. css generated in "+(new Date-c)+"ms",z.info),e=new Date},a,b),n(b)},w.refreshStyles=n,w.Parser.fileLoader=s,w.refresh("development"===w.env),"function"==typeof define&&define.amd&&define(function(){return w})}(window);
\ No newline at end of file
diff --git a/civicrm/vendor/tubalmartin/cssmin/phpunit.xml b/civicrm/vendor/tubalmartin/cssmin/phpunit.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c134a14715a3773375d18df919d66acd5931e405
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/phpunit.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit
+        bootstrap="./vendor/autoload.php"
+        colors="true"
+        convertNoticesToExceptions="true"
+        convertWarningsToExceptions="true"
+        stopOnError="false"
+        stopOnFailure="false"
+        stopOnIncomplete="false">
+    <testsuites>
+        <testsuite name="Minifier">
+            <directory>tests</directory>
+        </testsuite>
+    </testsuites>
+</phpunit>
\ No newline at end of file
diff --git a/civicrm/vendor/tubalmartin/cssmin/src/Colors.php b/civicrm/vendor/tubalmartin/cssmin/src/Colors.php
new file mode 100644
index 0000000000000000000000000000000000000000..459595a96cd474a587ddf1a35b6f929ec755283e
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/src/Colors.php
@@ -0,0 +1,155 @@
+<?php
+
+namespace tubalmartin\CssMin;
+
+class Colors
+{
+    public static function getHexToNamedMap()
+    {
+        // Hex colors longer than named counterpart
+        return array(
+            '#f0ffff' => 'azure',
+            '#f5f5dc' => 'beige',
+            '#ffe4c4' => 'bisque',
+            '#a52a2a' => 'brown',
+            '#ff7f50' => 'coral',
+            '#ffd700' => 'gold',
+            '#808080' => 'gray',
+            '#008000' => 'green',
+            '#4b0082' => 'indigo',
+            '#fffff0' => 'ivory',
+            '#f0e68c' => 'khaki',
+            '#faf0e6' => 'linen',
+            '#800000' => 'maroon',
+            '#000080' => 'navy',
+            '#fdf5e6' => 'oldlace',
+            '#808000' => 'olive',
+            '#ffa500' => 'orange',
+            '#da70d6' => 'orchid',
+            '#cd853f' => 'peru',
+            '#ffc0cb' => 'pink',
+            '#dda0dd' => 'plum',
+            '#800080' => 'purple',
+            '#f00'    => 'red',
+            '#fa8072' => 'salmon',
+            '#a0522d' => 'sienna',
+            '#c0c0c0' => 'silver',
+            '#fffafa' => 'snow',
+            '#d2b48c' => 'tan',
+            '#008080' => 'teal',
+            '#ff6347' => 'tomato',
+            '#ee82ee' => 'violet',
+            '#f5deb3' => 'wheat'
+        );
+    }
+
+    public static function getNamedToHexMap()
+    {
+        // Named colors longer than hex counterpart
+        return array(
+            'aliceblue' => '#f0f8ff',
+            'antiquewhite' => '#faebd7',
+            'aquamarine' => '#7fffd4',
+            'black' => '#000',
+            'blanchedalmond' => '#ffebcd',
+            'blueviolet' => '#8a2be2',
+            'burlywood' => '#deb887',
+            'cadetblue' => '#5f9ea0',
+            'chartreuse' => '#7fff00',
+            'chocolate' => '#d2691e',
+            'cornflowerblue' => '#6495ed',
+            'cornsilk' => '#fff8dc',
+            'darkblue' => '#00008b',
+            'darkcyan' => '#008b8b',
+            'darkgoldenrod' => '#b8860b',
+            'darkgray' => '#a9a9a9',
+            'darkgreen' => '#006400',
+            'darkgrey' => '#a9a9a9',
+            'darkkhaki' => '#bdb76b',
+            'darkmagenta' => '#8b008b',
+            'darkolivegreen' => '#556b2f',
+            'darkorange' => '#ff8c00',
+            'darkorchid' => '#9932cc',
+            'darksalmon' => '#e9967a',
+            'darkseagreen' => '#8fbc8f',
+            'darkslateblue' => '#483d8b',
+            'darkslategray' => '#2f4f4f',
+            'darkslategrey' => '#2f4f4f',
+            'darkturquoise' => '#00ced1',
+            'darkviolet' => '#9400d3',
+            'deeppink' => '#ff1493',
+            'deepskyblue' => '#00bfff',
+            'dodgerblue' => '#1e90ff',
+            'firebrick' => '#b22222',
+            'floralwhite' => '#fffaf0',
+            'forestgreen' => '#228b22',
+            'fuchsia' => '#f0f',
+            'gainsboro' => '#dcdcdc',
+            'ghostwhite' => '#f8f8ff',
+            'goldenrod' => '#daa520',
+            'greenyellow' => '#adff2f',
+            'honeydew' => '#f0fff0',
+            'indianred' => '#cd5c5c',
+            'lavender' => '#e6e6fa',
+            'lavenderblush' => '#fff0f5',
+            'lawngreen' => '#7cfc00',
+            'lemonchiffon' => '#fffacd',
+            'lightblue' => '#add8e6',
+            'lightcoral' => '#f08080',
+            'lightcyan' => '#e0ffff',
+            'lightgoldenrodyellow' => '#fafad2',
+            'lightgray' => '#d3d3d3',
+            'lightgreen' => '#90ee90',
+            'lightgrey' => '#d3d3d3',
+            'lightpink' => '#ffb6c1',
+            'lightsalmon' => '#ffa07a',
+            'lightseagreen' => '#20b2aa',
+            'lightskyblue' => '#87cefa',
+            'lightslategray' => '#778899',
+            'lightslategrey' => '#778899',
+            'lightsteelblue' => '#b0c4de',
+            'lightyellow' => '#ffffe0',
+            'limegreen' => '#32cd32',
+            'mediumaquamarine' => '#66cdaa',
+            'mediumblue' => '#0000cd',
+            'mediumorchid' => '#ba55d3',
+            'mediumpurple' => '#9370db',
+            'mediumseagreen' => '#3cb371',
+            'mediumslateblue' => '#7b68ee',
+            'mediumspringgreen' => '#00fa9a',
+            'mediumturquoise' => '#48d1cc',
+            'mediumvioletred' => '#c71585',
+            'midnightblue' => '#191970',
+            'mintcream' => '#f5fffa',
+            'mistyrose' => '#ffe4e1',
+            'moccasin' => '#ffe4b5',
+            'navajowhite' => '#ffdead',
+            'olivedrab' => '#6b8e23',
+            'orangered' => '#ff4500',
+            'palegoldenrod' => '#eee8aa',
+            'palegreen' => '#98fb98',
+            'paleturquoise' => '#afeeee',
+            'palevioletred' => '#db7093',
+            'papayawhip' => '#ffefd5',
+            'peachpuff' => '#ffdab9',
+            'powderblue' => '#b0e0e6',
+            'rebeccapurple' => '#663399',
+            'rosybrown' => '#bc8f8f',
+            'royalblue' => '#4169e1',
+            'saddlebrown' => '#8b4513',
+            'sandybrown' => '#f4a460',
+            'seagreen' => '#2e8b57',
+            'seashell' => '#fff5ee',
+            'slateblue' => '#6a5acd',
+            'slategray' => '#708090',
+            'slategrey' => '#708090',
+            'springgreen' => '#00ff7f',
+            'steelblue' => '#4682b4',
+            'turquoise' => '#40e0d0',
+            'white' => '#fff',
+            'whitesmoke' => '#f5f5f5',
+            'yellow' => '#ff0',
+            'yellowgreen' => '#9acd32'
+        );
+    }
+}
diff --git a/civicrm/vendor/tubalmartin/cssmin/src/Command.php b/civicrm/vendor/tubalmartin/cssmin/src/Command.php
new file mode 100644
index 0000000000000000000000000000000000000000..f70cd4a7a0ffa4a54a0743fc93e942911c972f1e
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/src/Command.php
@@ -0,0 +1,223 @@
+<?php
+
+namespace tubalmartin\CssMin;
+
+class Command
+{
+    const SUCCESS_EXIT = 0;
+    const FAILURE_EXIT = 1;
+    
+    protected $stats = array();
+    
+    public static function main()
+    {
+        $command = new self;
+        $command->run();
+    }
+
+    public function run()
+    {
+        $opts = getopt(
+            'hi:o:',
+            array(
+                'help',
+                'input:',
+                'output:',
+                'dry-run',
+                'keep-sourcemap',
+                'keep-sourcemap-comment',
+                'linebreak-position:',
+                'memory-limit:',
+                'pcre-backtrack-limit:',
+                'pcre-recursion-limit:',
+                'remove-important-comments'
+            )
+        );
+
+        $help = $this->getOpt(array('h', 'help'), $opts);
+        $input = $this->getOpt(array('i', 'input'), $opts);
+        $output = $this->getOpt(array('o', 'output'), $opts);
+        $dryrun = $this->getOpt('dry-run', $opts);
+        $keepSourceMapComment = $this->getOpt(array('keep-sourcemap', 'keep-sourcemap-comment'), $opts);
+        $linebreakPosition = $this->getOpt('linebreak-position', $opts);
+        $memoryLimit = $this->getOpt('memory-limit', $opts);
+        $backtrackLimit = $this->getOpt('pcre-backtrack-limit', $opts);
+        $recursionLimit = $this->getOpt('pcre-recursion-limit', $opts);
+        $removeImportantComments = $this->getOpt('remove-important-comments', $opts);
+
+        if (!is_null($help)) {
+            $this->showHelp();
+            die(self::SUCCESS_EXIT);
+        }
+
+        if (is_null($input)) {
+            fwrite(STDERR, '-i <file> argument is missing' . PHP_EOL);
+            $this->showHelp();
+            die(self::FAILURE_EXIT);
+        }
+
+        if (!is_readable($input)) {
+            fwrite(STDERR, 'Input file is not readable' . PHP_EOL);
+            die(self::FAILURE_EXIT);
+        }
+
+        $css = file_get_contents($input);
+
+        if ($css === false) {
+            fwrite(STDERR, 'Input CSS code could not be retrieved from input file' . PHP_EOL);
+            die(self::FAILURE_EXIT);
+        }
+        
+        $this->setStat('original-size', strlen($css));
+        
+        $cssmin = new Minifier;
+
+        if (!is_null($keepSourceMapComment)) {
+            $cssmin->keepSourceMapComment();
+        }
+
+        if (!is_null($removeImportantComments)) {
+            $cssmin->removeImportantComments();
+        }
+
+        if (!is_null($linebreakPosition)) {
+            $cssmin->setLineBreakPosition($linebreakPosition);
+        }
+        
+        if (!is_null($memoryLimit)) {
+            $cssmin->setMemoryLimit($memoryLimit);
+        }
+
+        if (!is_null($backtrackLimit)) {
+            $cssmin->setPcreBacktrackLimit($backtrackLimit);
+        }
+
+        if (!is_null($recursionLimit)) {
+            $cssmin->setPcreRecursionLimit($recursionLimit);
+        }
+        
+        $this->setStat('compression-time-start', microtime(true));
+        
+        $css = $cssmin->run($css);
+
+        $this->setStat('compression-time-end', microtime(true));
+        $this->setStat('peak-memory-usage', memory_get_peak_usage(true));
+        $this->setStat('compressed-size', strlen($css));
+        
+        if (!is_null($dryrun)) {
+            $this->showStats();
+            die(self::SUCCESS_EXIT);
+        }
+
+        if (is_null($output)) {
+            fwrite(STDOUT, $css . PHP_EOL);
+            $this->showStats();
+            die(self::SUCCESS_EXIT);
+        }
+
+        if (!is_writable(dirname($output))) {
+            fwrite(STDERR, 'Output file is not writable' . PHP_EOL);
+            die(self::FAILURE_EXIT);
+        }
+
+        if (file_put_contents($output, $css) === false) {
+            fwrite(STDERR, 'Compressed CSS code could not be saved to output file' . PHP_EOL);
+            die(self::FAILURE_EXIT);
+        }
+
+        $this->showStats();
+
+        die(self::SUCCESS_EXIT);
+    }
+
+    protected function getOpt($opts, $options)
+    {
+        $value = null;
+
+        if (is_string($opts)) {
+            $opts = array($opts);
+        }
+
+        foreach ($opts as $opt) {
+            if (array_key_exists($opt, $options)) {
+                $value = $options[$opt];
+                break;
+            }
+        }
+
+        return $value;
+    }
+    
+    protected function setStat($statName, $statValue)
+    {
+        $this->stats[$statName] = $statValue;
+    }
+    
+    protected function formatBytes($size, $precision = 2)
+    {
+        $base = log($size, 1024);
+        $suffixes = array('B', 'K', 'M', 'G', 'T');
+        return round(pow(1024, $base - floor($base)), $precision) .' '. $suffixes[floor($base)];
+    }
+    
+    protected function formatMicroSeconds($microSecs, $precision = 2)
+    {
+        // ms
+        $time = round($microSecs * 1000, $precision);
+        
+        if ($time >= 60 * 1000) {
+            $time = round($time / 60 * 1000, $precision) .' m'; // m
+        } elseif ($time >= 1000) {
+            $time = round($time / 1000, $precision) .' s'; // s
+        } else {
+            $time .= ' ms';
+        }
+        
+        return $time;
+    }
+    
+    protected function showStats()
+    {
+        $spaceSavings = round((1 - ($this->stats['compressed-size'] / $this->stats['original-size'])) * 100, 2);
+        $compressionRatio = round($this->stats['original-size'] / $this->stats['compressed-size'], 2);
+        $compressionTime = $this->formatMicroSeconds(
+            $this->stats['compression-time-end'] - $this->stats['compression-time-start']
+        );
+        $peakMemoryUsage = $this->formatBytes($this->stats['peak-memory-usage']);
+        
+        print <<<EOT
+        
+------------------------------
+CSSMIN STATS        
+------------------------------ 
+Space savings:       {$spaceSavings} %       
+Compression ratio:   {$compressionRatio}:1
+Compression time:    $compressionTime
+Peak memory usage:   $peakMemoryUsage
+
+
+EOT;
+    }
+
+    protected function showHelp()
+    {
+        print <<<'EOT'
+Usage: cssmin [options] -i <file> [-o <file>]
+  
+  -i|--input <file>              File containing uncompressed CSS code.
+  -o|--output <file>             File to use to save compressed CSS code.
+    
+Options:
+    
+  -h|--help                      Prints this usage information.
+  --dry-run                      Performs a dry run displaying statistics.
+  --keep-sourcemap[-comment]     Keeps the sourcemap special comment in the output.
+  --linebreak-position <pos>     Splits long lines after a specific column in the output.
+  --memory-limit <limit>         Sets the memory limit for this script.
+  --pcre-backtrack-limit <limit> Sets the PCRE backtrack limit for this script.
+  --pcre-recursion-limit <limit> Sets the PCRE recursion limit for this script.
+  --remove-important-comments    Removes !important comments from output.
+
+EOT;
+    }
+}
diff --git a/civicrm/vendor/tubalmartin/cssmin/src/Minifier.php b/civicrm/vendor/tubalmartin/cssmin/src/Minifier.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e585776839d7bd02893dc4379a55f9377d692df
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/src/Minifier.php
@@ -0,0 +1,895 @@
+<?php
+
+/*!
+ * CssMin
+ * Author: Tubal Martin - http://tubalmartin.me/
+ * Repo: https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port
+ *
+ * This is a PHP port of the CSS minification tool distributed with YUICompressor,
+ * itself a port of the cssmin utility by Isaac Schlueter - http://foohack.com/
+ * Permission is hereby granted to use the PHP version under the same
+ * conditions as the YUICompressor.
+ */
+
+/*!
+ * YUI Compressor
+ * http://developer.yahoo.com/yui/compressor/
+ * Author: Julien Lecomte - http://www.julienlecomte.net/
+ * Copyright (c) 2013 Yahoo! Inc. All rights reserved.
+ * The copyrights embodied in the content of this file are licensed
+ * by Yahoo! Inc. under the BSD (revised) open source license.
+ */
+
+namespace tubalmartin\CssMin;
+
+class Minifier
+{
+    const QUERY_FRACTION = '_CSSMIN_QF_';
+    const COMMENT_TOKEN = '_CSSMIN_CMT_%d_';
+    const COMMENT_TOKEN_START = '_CSSMIN_CMT_';
+    const RULE_BODY_TOKEN = '_CSSMIN_RBT_%d_';
+    const PRESERVED_TOKEN = '_CSSMIN_PTK_%d_';
+    
+    // Token lists
+    private $comments = array();
+    private $ruleBodies = array();
+    private $preservedTokens = array();
+    
+    // Output options
+    private $keepImportantComments = true;
+    private $keepSourceMapComment = false;
+    private $linebreakPosition = 0;
+    
+    // PHP ini limits
+    private $raisePhpLimits;
+    private $memoryLimit;
+    private $maxExecutionTime = 60; // 1 min
+    private $pcreBacktrackLimit;
+    private $pcreRecursionLimit;
+    
+    // Color maps
+    private $hexToNamedColorsMap;
+    private $namedToHexColorsMap;
+    
+    // Regexes
+    private $numRegex;
+    private $charsetRegex = '/@charset [^;]+;/Si';
+    private $importRegex = '/@import [^;]+;/Si';
+    private $namespaceRegex = '/@namespace [^;]+;/Si';
+    private $namedToHexColorsRegex;
+    private $shortenOneZeroesRegex;
+    private $shortenTwoZeroesRegex;
+    private $shortenThreeZeroesRegex;
+    private $shortenFourZeroesRegex;
+    private $unitsGroupRegex = '(?:ch|cm|em|ex|gd|in|mm|px|pt|pc|q|rem|vh|vmax|vmin|vw|%)';
+
+    /**
+     * @param bool|int $raisePhpLimits If true, PHP settings will be raised if needed
+     */
+    public function __construct($raisePhpLimits = true)
+    {
+        $this->raisePhpLimits = (bool) $raisePhpLimits;
+        $this->memoryLimit = 128 * 1048576; // 128MB in bytes
+        $this->pcreBacktrackLimit = 1000 * 1000;
+        $this->pcreRecursionLimit = 500 * 1000;
+        $this->hexToNamedColorsMap = Colors::getHexToNamedMap();
+        $this->namedToHexColorsMap = Colors::getNamedToHexMap();
+        $this->namedToHexColorsRegex = sprintf(
+            '/([:,( ])(%s)( |,|\)|;|$)/Si',
+            implode('|', array_keys($this->namedToHexColorsMap))
+        );
+        $this->numRegex = sprintf('-?\d*\.?\d+%s?', $this->unitsGroupRegex);
+        $this->setShortenZeroValuesRegexes();
+    }
+
+    /**
+     * Parses & minifies the given input CSS string
+     * @param string $css
+     * @return string
+     */
+    public function run($css = '')
+    {
+        if (empty($css) || !is_string($css)) {
+            return '';
+        }
+
+        $this->resetRunProperties();
+
+        if ($this->raisePhpLimits) {
+            $this->doRaisePhpLimits();
+        }
+
+        return $this->minify($css);
+    }
+
+    /**
+     * Sets whether to keep or remove sourcemap special comment.
+     * Sourcemap comments are removed by default.
+     * @param bool $keepSourceMapComment
+     */
+    public function keepSourceMapComment($keepSourceMapComment = true)
+    {
+        $this->keepSourceMapComment = (bool) $keepSourceMapComment;
+    }
+
+    /**
+     * Sets whether to keep or remove important comments.
+     * Important comments outside of a declaration block are kept by default.
+     * @param bool $removeImportantComments
+     */
+    public function removeImportantComments($removeImportantComments = true)
+    {
+        $this->keepImportantComments = !(bool) $removeImportantComments;
+    }
+
+    /**
+     * Sets the approximate column after which long lines will be splitted in the output
+     * with a linebreak.
+     * @param int $position
+     */
+    public function setLineBreakPosition($position)
+    {
+        $this->linebreakPosition = (int) $position;
+    }
+
+    /**
+     * Sets the memory limit for this script
+     * @param int|string $limit
+     */
+    public function setMemoryLimit($limit)
+    {
+        $this->memoryLimit = Utils::normalizeInt($limit);
+    }
+
+    /**
+     * Sets the maximum execution time for this script
+     * @param int|string $seconds
+     */
+    public function setMaxExecutionTime($seconds)
+    {
+        $this->maxExecutionTime = (int) $seconds;
+    }
+
+    /**
+     * Sets the PCRE backtrack limit for this script
+     * @param int $limit
+     */
+    public function setPcreBacktrackLimit($limit)
+    {
+        $this->pcreBacktrackLimit = (int) $limit;
+    }
+
+    /**
+     * Sets the PCRE recursion limit for this script
+     * @param int $limit
+     */
+    public function setPcreRecursionLimit($limit)
+    {
+        $this->pcreRecursionLimit = (int) $limit;
+    }
+
+    /**
+     * Builds regular expressions needed for shortening zero values
+     */
+    private function setShortenZeroValuesRegexes()
+    {
+        $zeroRegex = '0'. $this->unitsGroupRegex;
+        $numOrPosRegex = '('. $this->numRegex .'|top|left|bottom|right|center) ';
+        $oneZeroSafeProperties = array(
+            '(?:line-)?height',
+            '(?:(?:min|max)-)?width',
+            'top',
+            'left',
+            'background-position',
+            'bottom',
+            'right',
+            'border(?:-(?:top|left|bottom|right))?(?:-width)?',
+            'border-(?:(?:top|bottom)-(?:left|right)-)?radius',
+            'column-(?:gap|width)',
+            'margin(?:-(?:top|left|bottom|right))?',
+            'outline-width',
+            'padding(?:-(?:top|left|bottom|right))?'
+        );
+
+        // First zero regex
+        $regex = '/(^|;)('. implode('|', $oneZeroSafeProperties) .'):%s/Si';
+        $this->shortenOneZeroesRegex = sprintf($regex, $zeroRegex);
+
+        // Multiple zeroes regexes
+        $regex = '/(^|;)(margin|padding|border-(?:width|radius)|background-position):%s/Si';
+        $this->shortenTwoZeroesRegex = sprintf($regex, $numOrPosRegex . $zeroRegex);
+        $this->shortenThreeZeroesRegex = sprintf($regex, $numOrPosRegex . $numOrPosRegex . $zeroRegex);
+        $this->shortenFourZeroesRegex = sprintf($regex, $numOrPosRegex . $numOrPosRegex . $numOrPosRegex . $zeroRegex);
+    }
+
+    /**
+     * Resets properties whose value may change between runs
+     */
+    private function resetRunProperties()
+    {
+        $this->comments = array();
+        $this->ruleBodies = array();
+        $this->preservedTokens = array();
+    }
+
+    /**
+     * Tries to configure PHP to use at least the suggested minimum settings
+     * @return void
+     */
+    private function doRaisePhpLimits()
+    {
+        $phpLimits = array(
+            'memory_limit' => $this->memoryLimit,
+            'max_execution_time' => $this->maxExecutionTime,
+            'pcre.backtrack_limit' => $this->pcreBacktrackLimit,
+            'pcre.recursion_limit' =>  $this->pcreRecursionLimit
+        );
+
+        // If current settings are higher respect them.
+        foreach ($phpLimits as $name => $suggested) {
+            $current = Utils::normalizeInt(ini_get($name));
+
+            if ($current >= $suggested) {
+                continue;
+            }
+
+            // memoryLimit exception: allow -1 for "no memory limit".
+            if ($name === 'memory_limit' && $current === -1) {
+                continue;
+            }
+
+            // maxExecutionTime exception: allow 0 for "no memory limit".
+            if ($name === 'max_execution_time' && $current === 0) {
+                continue;
+            }
+
+            ini_set($name, $suggested);
+        }
+    }
+
+    /**
+     * Registers a preserved token
+     * @param string $token
+     * @return string The token ID string
+     */
+    private function registerPreservedToken($token)
+    {
+        $tokenId = sprintf(self::PRESERVED_TOKEN, count($this->preservedTokens));
+        $this->preservedTokens[$tokenId] = $token;
+        return $tokenId;
+    }
+
+    /**
+     * Registers a candidate comment token
+     * @param string $comment
+     * @return string The comment token ID string
+     */
+    private function registerCommentToken($comment)
+    {
+        $tokenId = sprintf(self::COMMENT_TOKEN, count($this->comments));
+        $this->comments[$tokenId] = $comment;
+        return $tokenId;
+    }
+
+    /**
+     * Registers a rule body token
+     * @param string $body the minified rule body
+     * @return string The rule body token ID string
+     */
+    private function registerRuleBodyToken($body)
+    {
+        if (empty($body)) {
+            return '';
+        }
+
+        $tokenId = sprintf(self::RULE_BODY_TOKEN, count($this->ruleBodies));
+        $this->ruleBodies[$tokenId] = $body;
+        return $tokenId;
+    }
+
+    /**
+     * Parses & minifies the given input CSS string
+     * @param string $css
+     * @return string
+     */
+    private function minify($css)
+    {
+        // Process data urls
+        $css = $this->processDataUrls($css);
+
+        // Process comments
+        $css = preg_replace_callback(
+            '/(?<!\\\\)\/\*(.*?)\*(?<!\\\\)\//Ss',
+            array($this, 'processCommentsCallback'),
+            $css
+        );
+
+        // IE7: Process Microsoft matrix filters (whitespaces between Matrix parameters). Can contain strings inside.
+        $css = preg_replace_callback(
+            '/filter:\s*progid:DXImageTransform\.Microsoft\.Matrix\(([^)]+)\)/Ss',
+            array($this, 'processOldIeSpecificMatrixDefinitionCallback'),
+            $css
+        );
+
+        // Process quoted unquotable attribute selectors to unquote them. Covers most common cases.
+        // Likelyhood of a quoted attribute selector being a substring in a string: Very very low.
+        $css = preg_replace(
+            '/\[\s*([a-z][a-z-]+)\s*([\*\|\^\$~]?=)\s*[\'"](-?[a-z_][a-z0-9-_]+)[\'"]\s*\]/Ssi',
+            '[$1$2$3]',
+            $css
+        );
+
+        // Process strings so their content doesn't get accidentally minified
+        $css = preg_replace_callback(
+            '/(?:"(?:[^\\\\"]|\\\\.|\\\\)*")|'."(?:'(?:[^\\\\']|\\\\.|\\\\)*')/S",
+            array($this, 'processStringsCallback'),
+            $css
+        );
+
+        // Normalize all whitespace strings to single spaces. Easier to work with that way.
+        $css = preg_replace('/\s+/S', ' ', $css);
+
+        // Process import At-rules with unquoted URLs so URI reserved characters such as a semicolon may be used safely.
+        $css = preg_replace_callback(
+            '/@import url\(([^\'"]+?)\)( |;)/Si',
+            array($this, 'processImportUnquotedUrlAtRulesCallback'),
+            $css
+        );
+        
+        // Process comments
+        $css = $this->processComments($css);
+        
+        // Process rule bodies
+        $css = $this->processRuleBodies($css);
+        
+        // Process at-rules and selectors
+        $css = $this->processAtRulesAndSelectors($css);
+
+        // Restore preserved rule bodies before splitting
+        $css = strtr($css, $this->ruleBodies);
+
+        // Split long lines in output if required
+        $css = $this->processLongLineSplitting($css);
+
+        // Restore preserved comments and strings
+        $css = strtr($css, $this->preservedTokens);
+
+        return trim($css);
+    }
+
+    /**
+     * Searches & replaces all data urls with tokens before we start compressing,
+     * to avoid performance issues running some of the subsequent regexes against large string chunks.
+     * @param string $css
+     * @return string
+     */
+    private function processDataUrls($css)
+    {
+        $ret = '';
+        $searchOffset = $substrOffset = 0;
+
+        // Since we need to account for non-base64 data urls, we need to handle
+        // ' and ) being part of the data string.
+        while (preg_match('/url\(\s*(["\']?)data:/Si', $css, $m, PREG_OFFSET_CAPTURE, $searchOffset)) {
+            $matchStartIndex = $m[0][1];
+            $dataStartIndex = $matchStartIndex + 4; // url( length
+            $searchOffset = $matchStartIndex + strlen($m[0][0]);
+            $terminator = $m[1][0]; // ', " or empty (not quoted)
+            $terminatorRegex = '/(?<!\\\\)'. (strlen($terminator) === 0 ? '' : $terminator.'\s*') .'(\))/S';
+            
+            $ret .= substr($css, $substrOffset, $matchStartIndex - $substrOffset);
+
+            // Terminator found
+            if (preg_match($terminatorRegex, $css, $matches, PREG_OFFSET_CAPTURE, $searchOffset)) {
+                $matchEndIndex = $matches[1][1];
+                $searchOffset = $matchEndIndex + 1;
+                $token = substr($css, $dataStartIndex, $matchEndIndex - $dataStartIndex);
+
+                // Remove all spaces only for base64 encoded URLs.
+                if (stripos($token, 'base64,') !== false) {
+                    $token = preg_replace('/\s+/S', '', $token);
+                }
+
+                $ret .= 'url('. $this->registerPreservedToken(trim($token)) .')';
+            // No end terminator found, re-add the whole match. Should we throw/warn here?
+            } else {
+                $ret .= substr($css, $matchStartIndex, $searchOffset - $matchStartIndex);
+            }
+
+            $substrOffset = $searchOffset;
+        }
+
+        $ret .= substr($css, $substrOffset);
+
+        return $ret;
+    }
+
+    /**
+     * Registers all comments found as candidates to be preserved.
+     * @param array $matches
+     * @return string
+     */
+    private function processCommentsCallback($matches)
+    {
+        return '/*'. $this->registerCommentToken($matches[1]) .'*/';
+    }
+
+    /**
+     * Preserves old IE Matrix string definition
+     * @param array $matches
+     * @return string
+     */
+    private function processOldIeSpecificMatrixDefinitionCallback($matches)
+    {
+        return 'filter:progid:DXImageTransform.Microsoft.Matrix('. $this->registerPreservedToken($matches[1]) .')';
+    }
+
+    /**
+     * Preserves strings found
+     * @param array $matches
+     * @return string
+     */
+    private function processStringsCallback($matches)
+    {
+        $match = $matches[0];
+        $quote = substr($match, 0, 1);
+        $match = substr($match, 1, -1);
+
+        // maybe the string contains a comment-like substring?
+        // one, maybe more? put'em back then
+        if (strpos($match, self::COMMENT_TOKEN_START) !== false) {
+            $match = strtr($match, $this->comments);
+        }
+
+        // minify alpha opacity in filter strings
+        $match = str_ireplace('progid:DXImageTransform.Microsoft.Alpha(Opacity=', 'alpha(opacity=', $match);
+
+        return $quote . $this->registerPreservedToken($match) . $quote;
+    }
+
+    /**
+     * Searches & replaces all import at-rule unquoted urls with tokens so URI reserved characters such as a semicolon
+     * may be used safely in a URL.
+     * @param array $matches
+     * @return string
+     */
+    private function processImportUnquotedUrlAtRulesCallback($matches)
+    {
+        return '@import url('. $this->registerPreservedToken($matches[1]) .')'. $matches[2];
+    }
+
+    /**
+     * Preserves or removes comments found.
+     * @param string $css
+     * @return string
+     */
+    private function processComments($css)
+    {
+        foreach ($this->comments as $commentId => $comment) {
+            $commentIdString = '/*'. $commentId .'*/';
+            
+            // ! in the first position of the comment means preserve
+            // so push to the preserved tokens keeping the !
+            if ($this->keepImportantComments && strpos($comment, '!') === 0) {
+                $preservedTokenId = $this->registerPreservedToken($comment);
+                // Put new lines before and after /*! important comments
+                $css = str_replace($commentIdString, "\n/*$preservedTokenId*/\n", $css);
+                continue;
+            }
+
+            // # sourceMappingURL= in the first position of the comment means sourcemap
+            // so push to the preserved tokens if {$this->keepSourceMapComment} is truthy.
+            if ($this->keepSourceMapComment && strpos($comment, '# sourceMappingURL=') === 0) {
+                $preservedTokenId = $this->registerPreservedToken($comment);
+                // Add new line before the sourcemap comment
+                $css = str_replace($commentIdString, "\n/*$preservedTokenId*/", $css);
+                continue;
+            }
+
+            // Keep empty comments after child selectors (IE7 hack)
+            // e.g. html >/**/ body
+            if (strlen($comment) === 0 && strpos($css, '>/*'.$commentId) !== false) {
+                $css = str_replace($commentId, $this->registerPreservedToken(''), $css);
+                continue;
+            }
+
+            // in all other cases kill the comment
+            $css = str_replace($commentIdString, '', $css);
+        }
+
+        // Normalize whitespace again
+        $css = preg_replace('/ +/S', ' ', $css);
+
+        return $css;
+    }
+
+    /**
+     * Finds, minifies & preserves all rule bodies.
+     * @param string $css the whole stylesheet.
+     * @return string
+     */
+    private function processRuleBodies($css)
+    {
+        $ret = '';
+        $searchOffset = $substrOffset = 0;
+
+        while (($blockStartPos = strpos($css, '{', $searchOffset)) !== false) {
+            $blockEndPos = strpos($css, '}', $blockStartPos);
+            $nextBlockStartPos = strpos($css, '{', $blockStartPos + 1);
+            $ret .= substr($css, $substrOffset, $blockStartPos - $substrOffset);
+
+            if ($nextBlockStartPos !== false && $nextBlockStartPos < $blockEndPos) {
+                $ret .= substr($css, $blockStartPos, $nextBlockStartPos - $blockStartPos);
+                $searchOffset = $nextBlockStartPos;
+            } else {
+                $ruleBody = substr($css, $blockStartPos + 1, $blockEndPos - $blockStartPos - 1);
+                $ruleBodyToken = $this->registerRuleBodyToken($this->processRuleBody($ruleBody));
+                $ret .= '{'. $ruleBodyToken .'}';
+                $searchOffset = $blockEndPos + 1;
+            }
+
+            $substrOffset = $searchOffset;
+        }
+
+        $ret .= substr($css, $substrOffset);
+
+        return $ret;
+    }
+
+    /**
+     * Compresses non-group rule bodies.
+     * @param string $body The rule body without curly braces
+     * @return string
+     */
+    private function processRuleBody($body)
+    {
+        $body = trim($body);
+
+        // Remove spaces before the things that should not have spaces before them.
+        $body = preg_replace('/ ([:=,)*\/;\n])/S', '$1', $body);
+
+        // Remove the spaces after the things that should not have spaces after them.
+        $body = preg_replace('/([:=,(*\/!;\n]) /S', '$1', $body);
+        
+        // Replace multiple semi-colons in a row by a single one
+        $body = preg_replace('/;;+/S', ';', $body);
+
+        // Remove semicolon before closing brace except when:
+        // - The last property is prefixed with a `*` (lte IE7 hack) to avoid issues on Symbian S60 3.x browsers.
+        if (!preg_match('/\*[a-z0-9-]+:[^;]+;$/Si', $body)) {
+            $body = rtrim($body, ';');
+        }
+
+        // Remove important comments inside a rule body (because they make no sense here).
+        if (strpos($body, '/*') !== false) {
+            $body = preg_replace('/\n?\/\*[A-Z0-9_]+\*\/\n?/S', '', $body);
+        }
+        
+        // Empty rule body? Exit :)
+        if (empty($body)) {
+            return '';
+        }
+
+        // Shorten font-weight values
+        $body = preg_replace(
+            array('/(font-weight:)bold\b/Si', '/(font-weight:)normal\b/Si'),
+            array('${1}700', '${1}400'),
+            $body
+        );
+
+        // Shorten background property
+        $body = preg_replace('/(background:)(?:none|transparent)( !|;|$)/Si', '${1}0 0$2', $body);
+
+        // Shorten opacity IE filter
+        $body = str_ireplace('progid:DXImageTransform.Microsoft.Alpha(Opacity=', 'alpha(opacity=', $body);
+
+        // Shorten colors from rgb(51,102,153) to #336699, rgb(100%,0%,0%) to #ff0000 (sRGB color space)
+        // Shorten colors from hsl(0, 100%, 50%) to #ff0000 (sRGB color space)
+        // This makes it more likely that it'll get further compressed in the next step.
+        $body = preg_replace_callback(
+            '/(rgb|hsl)\(([0-9,.% -]+)\)(.|$)/Si',
+            array($this, 'shortenHslAndRgbToHexCallback'),
+            $body
+        );
+
+        // Shorten colors from #AABBCC to #ABC or shorter color name:
+        // - Look for hex colors which don't have a "=" in front of them (to avoid MSIE filters)
+        $body = preg_replace_callback(
+            '/(?<!=)#([0-9a-f]{3,6})( |,|\)|;|$)/Si',
+            array($this, 'shortenHexColorsCallback'),
+            $body
+        );
+
+        // Shorten long named colors with a shorter HEX counterpart: white -> #fff.
+        // Run at least 2 times to cover most cases
+        $body = preg_replace_callback(
+            array($this->namedToHexColorsRegex, $this->namedToHexColorsRegex),
+            array($this, 'shortenNamedColorsCallback'),
+            $body
+        );
+
+        // Replace positive sign from numbers before the leading space is removed.
+        // +1.2em to 1.2em, +.8px to .8px, +2% to 2%
+        $body = preg_replace('/([ :,(])\+(\.?\d+)/S', '$1$2', $body);
+
+        // shorten ms to s
+        $body = preg_replace_callback('/([ :,(])(-?)(\d{3,})ms/Si', function ($matches) {
+            return $matches[1] . $matches[2] . ((int) $matches[3] / 1000) .'s';
+        }, $body);
+
+        // Remove leading zeros from integer and float numbers.
+        // 000.6 to .6, -0.8 to -.8, 0050 to 50, -01.05 to -1.05
+        $body = preg_replace('/([ :,(])(-?)0+([1-9]?\.?\d+)/S', '$1$2$3', $body);
+
+        // Remove trailing zeros from float numbers.
+        // -6.0100em to -6.01em, .0100 to .01, 1.200px to 1.2px
+        $body = preg_replace('/([ :,(])(-?\d?\.\d+?)0+([^\d])/S', '$1$2$3', $body);
+
+        // Remove trailing .0 -> -9.0 to -9
+        $body = preg_replace('/([ :,(])(-?\d+)\.0([^\d])/S', '$1$2$3', $body);
+
+        // Replace 0 length numbers with 0
+        $body = preg_replace('/([ :,(])-?\.?0+([^\d])/S', '${1}0$2', $body);
+
+        // Shorten zero values for safe properties only
+        $body = preg_replace(
+            array(
+                $this->shortenOneZeroesRegex,
+                $this->shortenTwoZeroesRegex,
+                $this->shortenThreeZeroesRegex,
+                $this->shortenFourZeroesRegex
+            ),
+            array(
+                '$1$2:0',
+                '$1$2:$3 0',
+                '$1$2:$3 $4 0',
+                '$1$2:$3 $4 $5 0'
+            ),
+            $body
+        );
+
+        // Replace 0 0 0; or 0 0 0 0; with 0 0 for background-position property.
+        $body = preg_replace('/(background-position):0(?: 0){2,3}( !|;|$)/Si', '$1:0 0$2', $body);
+
+        // Shorten suitable shorthand properties with repeated values
+        $body = preg_replace(
+            array(
+                '/(margin|padding|border-(?:width|radius)):('.$this->numRegex.')(?: \2)+( !|;|$)/Si',
+                '/(border-(?:style|color)):([#a-z0-9]+)(?: \2)+( !|;|$)/Si'
+            ),
+            '$1:$2$3',
+            $body
+        );
+        $body = preg_replace(
+            array(
+                '/(margin|padding|border-(?:width|radius)):'.
+                '('.$this->numRegex.') ('.$this->numRegex.') \2 \3( !|;|$)/Si',
+                '/(border-(?:style|color)):([#a-z0-9]+) ([#a-z0-9]+) \2 \3( !|;|$)/Si'
+            ),
+            '$1:$2 $3$4',
+            $body
+        );
+        $body = preg_replace(
+            array(
+                '/(margin|padding|border-(?:width|radius)):'.
+                '('.$this->numRegex.') ('.$this->numRegex.') ('.$this->numRegex.') \3( !|;|$)/Si',
+                '/(border-(?:style|color)):([#a-z0-9]+) ([#a-z0-9]+) ([#a-z0-9]+) \3( !|;|$)/Si'
+            ),
+            '$1:$2 $3 $4$5',
+            $body
+        );
+
+        // Lowercase some common functions that can be values
+        $body = preg_replace_callback(
+            '/(?:attr|blur|brightness|circle|contrast|cubic-bezier|drop-shadow|ellipse|from|grayscale|'.
+            'hsla?|hue-rotate|inset|invert|local|minmax|opacity|perspective|polygon|rgba?|rect|repeat|saturate|sepia|'.
+            'steps|to|url|var|-webkit-gradient|'.
+            '(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?(?:calc|(?:repeating-)?(?:linear|radial)-gradient))\(/Si',
+            array($this, 'strtolowerCallback'),
+            $body
+        );
+
+        // Lowercase all uppercase properties
+        $body = preg_replace_callback('/(?:^|;)[A-Z-]+:/S', array($this, 'strtolowerCallback'), $body);
+
+        return $body;
+    }
+
+    /**
+     * Compresses At-rules and selectors.
+     * @param string $css the whole stylesheet with rule bodies tokenized.
+     * @return string
+     */
+    private function processAtRulesAndSelectors($css)
+    {
+        $charset = '';
+        $imports = '';
+        $namespaces = '';
+        
+        // Remove spaces before the things that should not have spaces before them.
+        $css = preg_replace('/ ([@{};>+)\]~=,\/\n])/S', '$1', $css);
+
+        // Remove the spaces after the things that should not have spaces after them.
+        $css = preg_replace('/([{}:;>+(\[~=,\/\n]) /S', '$1', $css);
+        
+        // Shorten shortable double colon (CSS3) pseudo-elements to single colon (CSS2)
+        $css = preg_replace('/::(before|after|first-(?:line|letter))(\{|,)/Si', ':$1$2', $css);
+
+        // Retain space for special IE6 cases
+        $css = preg_replace_callback('/:first-(line|letter)(\{|,)/Si', function ($matches) {
+            return ':first-'. strtolower($matches[1]) .' '. $matches[2];
+        }, $css);
+
+        // Find a fraction that may used in some @media queries such as: (min-aspect-ratio: 1/1)
+        // Add token to add the "/" back in later
+        $css = preg_replace('/\(([a-z-]+):([0-9]+)\/([0-9]+)\)/Si', '($1:$2'. self::QUERY_FRACTION .'$3)', $css);
+
+        // Remove empty rule blocks up to 2 levels deep.
+        $css = preg_replace(array_fill(0, 2, '/(\{)[^{};\/\n]+\{\}/S'), '$1', $css);
+        $css = preg_replace('/[^{};\/\n]+\{\}/S', '', $css);
+
+        // Two important comments next to each other? Remove extra newline.
+        if ($this->keepImportantComments) {
+            $css = str_replace("\n\n", "\n", $css);
+        }
+        
+        // Restore fraction
+        $css = str_replace(self::QUERY_FRACTION, '/', $css);
+
+        // Lowercase some popular @directives
+        $css = preg_replace_callback(
+            '/(?<!\\\\)@(?:charset|document|font-face|import|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?keyframes|media|'.
+            'namespace|page|supports|viewport)/Si',
+            array($this, 'strtolowerCallback'),
+            $css
+        );
+
+        // Lowercase some popular media types
+        $css = preg_replace_callback(
+            '/[ ,](?:all|aural|braille|handheld|print|projection|screen|tty|tv|embossed|speech)[ ,;{]/Si',
+            array($this, 'strtolowerCallback'),
+            $css
+        );
+
+        // Lowercase some common pseudo-classes & pseudo-elements
+        $css = preg_replace_callback(
+            '/(?<!\\\\):(?:active|after|before|checked|default|disabled|empty|enabled|first-(?:child|of-type)|'.
+            'focus(?:-within)?|hover|indeterminate|in-range|invalid|lang\(|last-(?:child|of-type)|left|link|not\(|'.
+            'nth-(?:child|of-type)\(|nth-last-(?:child|of-type)\(|only-(?:child|of-type)|optional|out-of-range|'.
+            'read-(?:only|write)|required|right|root|:selection|target|valid|visited)/Si',
+            array($this, 'strtolowerCallback'),
+            $css
+        );
+        
+        // @charset handling
+        if (preg_match($this->charsetRegex, $css, $matches)) {
+            // Keep the first @charset at-rule found
+            $charset = $matches[0];
+            // Delete all @charset at-rules
+            $css = preg_replace($this->charsetRegex, '', $css);
+        }
+
+        // @import handling
+        $css = preg_replace_callback($this->importRegex, function ($matches) use (&$imports) {
+            // Keep all @import at-rules found for later
+            $imports .= $matches[0];
+            // Delete all @import at-rules
+            return '';
+        }, $css);
+
+        // @namespace handling
+        $css = preg_replace_callback($this->namespaceRegex, function ($matches) use (&$namespaces) {
+            // Keep all @namespace at-rules found for later
+            $namespaces .= $matches[0];
+            // Delete all @namespace at-rules
+            return '';
+        }, $css);
+        
+        // Order critical at-rules:
+        // 1. @charset first
+        // 2. @imports below @charset
+        // 3. @namespaces below @imports
+        $css = $charset . $imports . $namespaces . $css;
+
+        return $css;
+    }
+
+    /**
+     * Splits long lines after a specific column.
+     *
+     * Some source control tools don't like it when files containing lines longer
+     * than, say 8000 characters, are checked in. The linebreak option is used in
+     * that case to split long lines after a specific column.
+     *
+     * @param string $css the whole stylesheet.
+     * @return string
+     */
+    private function processLongLineSplitting($css)
+    {
+        if ($this->linebreakPosition > 0) {
+            $l = strlen($css);
+            $offset = $this->linebreakPosition;
+            while (preg_match('/(?<!\\\\)\}(?!\n)/S', $css, $matches, PREG_OFFSET_CAPTURE, $offset)) {
+                $matchIndex = $matches[0][1];
+                $css = substr_replace($css, "\n", $matchIndex + 1, 0);
+                $offset = $matchIndex + 2 + $this->linebreakPosition;
+                $l += 1;
+                if ($offset > $l) {
+                    break;
+                }
+            }
+        }
+
+        return $css;
+    }
+
+    /**
+     * Converts hsl() & rgb() colors to HEX format.
+     * @param $matches
+     * @return string
+     */
+    private function shortenHslAndRgbToHexCallback($matches)
+    {
+        $type = $matches[1];
+        $values = explode(',', $matches[2]);
+        $terminator = $matches[3];
+        
+        if ($type === 'hsl') {
+            $values = Utils::hslToRgb($values);
+        }
+        
+        $hexColors = Utils::rgbToHex($values);
+
+        // Restore space after rgb() or hsl() function in some cases such as:
+        // background-image: linear-gradient(to bottom, rgb(210,180,140) 10%, rgb(255,0,0) 90%);
+        if (!empty($terminator) && !preg_match('/[ ,);]/S', $terminator)) {
+            $terminator = ' '. $terminator;
+        }
+
+        return '#'. implode('', $hexColors) . $terminator;
+    }
+
+    /**
+     * Compresses HEX color values of the form #AABBCC to #ABC or short color name.
+     * @param $matches
+     * @return string
+     */
+    private function shortenHexColorsCallback($matches)
+    {
+        $hex = $matches[1];
+        
+        // Shorten suitable 6 chars HEX colors
+        if (strlen($hex) === 6 && preg_match('/^([0-9a-f])\1([0-9a-f])\2([0-9a-f])\3$/Si', $hex, $m)) {
+            $hex = $m[1] . $m[2] . $m[3];
+        }
+        
+        // Lowercase
+        $hex = '#'. strtolower($hex);
+
+        // Replace Hex colors with shorter color names
+        $color = array_key_exists($hex, $this->hexToNamedColorsMap) ? $this->hexToNamedColorsMap[$hex] : $hex;
+
+        return $color . $matches[2];
+    }
+
+    /**
+     * Shortens all named colors with a shorter HEX counterpart for a set of safe properties
+     * e.g. white -> #fff
+     * @param array $matches
+     * @return string
+     */
+    private function shortenNamedColorsCallback($matches)
+    {
+        return $matches[1] . $this->namedToHexColorsMap[strtolower($matches[2])] . $matches[3];
+    }
+
+    /**
+     * Makes a string lowercase
+     * @param array $matches
+     * @return string
+     */
+    private function strtolowerCallback($matches)
+    {
+        return strtolower($matches[0]);
+    }
+}
diff --git a/civicrm/vendor/tubalmartin/cssmin/src/Utils.php b/civicrm/vendor/tubalmartin/cssmin/src/Utils.php
new file mode 100644
index 0000000000000000000000000000000000000000..a0516b475d111bc47b259381570c052592025975
--- /dev/null
+++ b/civicrm/vendor/tubalmartin/cssmin/src/Utils.php
@@ -0,0 +1,149 @@
+<?php
+
+namespace tubalmartin\CssMin;
+
+class Utils
+{
+    /**
+     * Clamps a number between a minimum and a maximum value.
+     * @param int|float $n the number to clamp
+     * @param int|float $min the lower end number allowed
+     * @param int|float $max the higher end number allowed
+     * @return int|float
+     */
+    public static function clampNumber($n, $min, $max)
+    {
+        return min(max($n, $min), $max);
+    }
+
+    /**
+     * Clamps a RGB color number outside the sRGB color space
+     * @param int|float $n the number to clamp
+     * @return int|float
+     */
+    public static function clampNumberSrgb($n)
+    {
+        return self::clampNumber($n, 0, 255);
+    }
+
+    /**
+     * Converts a HSL color into a RGB color
+     * @param array $hslValues
+     * @return array
+     */
+    public static function hslToRgb($hslValues)
+    {
+        $h = floatval($hslValues[0]);
+        $s = floatval(str_replace('%', '', $hslValues[1]));
+        $l = floatval(str_replace('%', '', $hslValues[2]));
+
+        // Wrap and clamp, then fraction!
+        $h = ((($h % 360) + 360) % 360) / 360;
+        $s = self::clampNumber($s, 0, 100) / 100;
+        $l = self::clampNumber($l, 0, 100) / 100;
+
+        if ($s == 0) {
+            $r = $g = $b = self::roundNumber(255 * $l);
+        } else {
+            $v2 = $l < 0.5 ? $l * (1 + $s) : ($l + $s) - ($s * $l);
+            $v1 = (2 * $l) - $v2;
+            $r = self::roundNumber(255 * self::hueToRgb($v1, $v2, $h + (1/3)));
+            $g = self::roundNumber(255 * self::hueToRgb($v1, $v2, $h));
+            $b = self::roundNumber(255 * self::hueToRgb($v1, $v2, $h - (1/3)));
+        }
+
+        return array($r, $g, $b);
+    }
+
+    /**
+     * Tests and selects the correct formula for each RGB color channel
+     * @param $v1
+     * @param $v2
+     * @param $vh
+     * @return mixed
+     */
+    public static function hueToRgb($v1, $v2, $vh)
+    {
+        $vh = $vh < 0 ? $vh + 1 : ($vh > 1 ? $vh - 1 : $vh);
+
+        if ($vh * 6 < 1) {
+            return $v1 + ($v2 - $v1) * 6 * $vh;
+        }
+
+        if ($vh * 2 < 1) {
+            return $v2;
+        }
+
+        if ($vh * 3 < 2) {
+            return $v1 + ($v2 - $v1) * ((2 / 3) - $vh) * 6;
+        }
+
+        return $v1;
+    }
+
+    /**
+     * Convert strings like "64M" or "30" to int values
+     * @param mixed $size
+     * @return int
+     */
+    public static function normalizeInt($size)
+    {
+        if (is_string($size)) {
+            $letter = substr($size, -1);
+            $size = intval($size);
+            switch ($letter) {
+                case 'M':
+                case 'm':
+                    return (int) $size * 1048576;
+                case 'K':
+                case 'k':
+                    return (int) $size * 1024;
+                case 'G':
+                case 'g':
+                    return (int) $size * 1073741824;
+            }
+        }
+        return (int) $size;
+    }
+
+    /**
+     * Converts a string containing and RGB percentage value into a RGB integer value i.e. '90%' -> 229.5
+     * @param $rgbPercentage
+     * @return int
+     */
+    public static function rgbPercentageToRgbInteger($rgbPercentage)
+    {
+        if (strpos($rgbPercentage, '%') !== false) {
+            $rgbPercentage = self::roundNumber(floatval(str_replace('%', '', $rgbPercentage)) * 2.55);
+        }
+
+        return intval($rgbPercentage, 10);
+    }
+
+    /**
+     * Converts a RGB color into a HEX color
+     * @param array $rgbColors
+     * @return array
+     */
+    public static function rgbToHex($rgbColors)
+    {
+        $hexColors = array();
+
+        // Values outside the sRGB color space should be clipped (0-255)
+        for ($i = 0, $l = count($rgbColors); $i < $l; $i++) {
+            $hexColors[$i] = sprintf("%02x", self::clampNumberSrgb(self::rgbPercentageToRgbInteger($rgbColors[$i])));
+        }
+
+        return $hexColors;
+    }
+
+    /**
+     * Rounds a number to its closest integer
+     * @param $n
+     * @return int
+     */
+    public static function roundNumber($n)
+    {
+        return intval(round(floatval($n)), 10);
+    }
+}
diff --git a/civicrm/xml/schema/ACL/Cache.xml b/civicrm/xml/schema/ACL/Cache.xml
index 869eadb96189744be50660dfdd48f49ffabca427..8b54897737aecde817c4d499b65cfa57a1b1b39e 100644
--- a/civicrm/xml/schema/ACL/Cache.xml
+++ b/civicrm/xml/schema/ACL/Cache.xml
@@ -33,8 +33,14 @@
     <table>civicrm_contact</table>
     <key>id</key>
     <add>1.6</add>
+    <drop>5.31</drop>
     <onDelete>CASCADE</onDelete>
   </foreignKey>
+  <index>
+    <name>index_contact_id</name>
+    <fieldName>contact_id</fieldName>
+    <add>5.31</add>
+  </index>
   <field>
     <name>acl_id</name>
     <title>Cache ACL</title>
diff --git a/civicrm/xml/schema/Contact/ACLContactCache.xml b/civicrm/xml/schema/Contact/ACLContactCache.xml
index 450b56b693eb55c5be3b28f3a4db65efbf388f95..75603bdf57a965cd09a55dd51667661b93fa8efa 100644
--- a/civicrm/xml/schema/Contact/ACLContactCache.xml
+++ b/civicrm/xml/schema/Contact/ACLContactCache.xml
@@ -38,6 +38,7 @@
     <table>civicrm_contact</table>
     <key>id</key>
     <add>3.1</add>
+    <drop>5.31</drop>
     <onDelete>CASCADE</onDelete>
   </foreignKey>
   <field>
diff --git a/civicrm/xml/schema/Contact/Group.xml b/civicrm/xml/schema/Contact/Group.xml
index 509f20debcc3751cae8216a4dc326594292fe068..d726af3758b78b90ec5878f8a3ebf205dcc9f189 100644
--- a/civicrm/xml/schema/Contact/Group.xml
+++ b/civicrm/xml/schema/Contact/Group.xml
@@ -32,7 +32,7 @@
     <name>title</name>
     <type>varchar</type>
     <title>Group Title</title>
-    <length>64</length>
+    <length>255</length>
     <localizable>true</localizable>
     <comment>Name of Group.</comment>
     <add>1.1</add>
@@ -225,4 +225,31 @@
     <add>4.5</add>
     <onDelete>SET NULL</onDelete>
   </foreignKey>
+  <field>
+    <name>frontend_title</name>
+    <type>varchar</type>
+    <title>Public Group Title</title>
+    <length>255</length>
+    <localizable>true</localizable>
+    <comment>Alternative public title for this Group.</comment>
+    <default>NULL</default>
+    <add>5.31</add>
+    <html>
+      <type>Text</type>
+    </html>
+  </field>
+  <field>
+    <name>frontend_description</name>
+    <type>text</type>
+    <title>Public Group Description</title>
+    <html>
+      <type>TextArea</type>
+      <rows>2</rows>
+      <cols>60</cols>
+    </html>
+    <comment>Alternative public description of the group.</comment>
+    <localizable>true</localizable>
+    <default>NULL</default>
+    <add>5.31</add>
+  </field>
 </table>
diff --git a/civicrm/xml/schema/Contribute/ContributionRecur.xml b/civicrm/xml/schema/Contribute/ContributionRecur.xml
index 11e70b6afc496ff8bdd6fb8d95bd126cff8d5e05..00411d639be88341aef2ffde43cb18d7e3b22295 100644
--- a/civicrm/xml/schema/Contribute/ContributionRecur.xml
+++ b/civicrm/xml/schema/Contribute/ContributionRecur.xml
@@ -5,7 +5,7 @@
   <name>civicrm_contribution_recur</name>
   <add>1.6</add>
   <log>true</log>
-  <title>Recurring Contributions</title>
+  <title>Recurring Contribution</title>
   <field>
     <name>id</name>
     <uniqueName>contribution_recur_id</uniqueName>
diff --git a/civicrm/xml/schema/Core/CustomField.xml b/civicrm/xml/schema/Core/CustomField.xml
index 44c632256010c3656ab9cd475ba9c5ea5d4cd713..54cd5c5d7454d83984db19f60ff85a30cb354356 100644
--- a/civicrm/xml/schema/Core/CustomField.xml
+++ b/civicrm/xml/schema/Core/CustomField.xml
@@ -73,6 +73,7 @@
     <add>1.1</add>
     <html>
       <type>Select</type>
+      <label>Data Type</label>
     </html>
   </field>
   <field>
@@ -85,6 +86,10 @@
     <pseudoconstant>
       <callback>CRM_Core_SelectValues::customHtmlType</callback>
     </pseudoconstant>
+    <html>
+      <type>Select</type>
+      <label>Field Input Type</label>
+    </html>
     <add>1.1</add>
   </field>
   <field>
diff --git a/civicrm/xml/schema/Core/IM.xml b/civicrm/xml/schema/Core/IM.xml
index f7738d969cbcb3a5ebc102954d0e87c60502beac..58ca90324dc4b5e02d6b46f2adc8b1896730185f 100644
--- a/civicrm/xml/schema/Core/IM.xml
+++ b/civicrm/xml/schema/Core/IM.xml
@@ -8,6 +8,7 @@
   <add>1.1</add>
   <log>true</log>
   <title>Instant Messaging</title>
+  <titlePlural>Instant Messaging</titlePlural>
   <icon>fa-comments-o</icon>
   <field>
     <name>id</name>
diff --git a/civicrm/xml/schema/Core/MailSettings.xml b/civicrm/xml/schema/Core/MailSettings.xml
index 0dea26c13b2a70b69035ba34bba08a2512cf559f..e55f0602c3ccd196da63cc53cb1ff858ff9641ae 100644
--- a/civicrm/xml/schema/Core/MailSettings.xml
+++ b/civicrm/xml/schema/Core/MailSettings.xml
@@ -150,4 +150,26 @@
       <type>Select</type>
     </html>
   </field>
+  <field>
+    <name>is_non_case_email_skipped</name>
+    <title>Skip emails which do not have a Case ID or Case hash</title>
+    <type>boolean</type>
+    <default>0</default>
+    <html>
+      <type>CheckBox</type>
+    </html>
+    <comment>Enabling this option will have CiviCRM skip any emails that do not have the Case ID or Case Hash so that the system will only process emails that can be placed on case records. Any emails that are not processed will be moved to the ignored folder.</comment>
+    <add>5.31</add>
+  </field>
+  <field>
+    <name>is_contact_creation_disabled_if_no_match</name>
+    <type>boolean</type>
+    <title>Do not create new contacts when filing emails</title>
+    <default>0</default>
+    <html>
+      <type>CheckBox</type>
+    </html>
+    <description>If this option is enabled, CiviCRM will not create new contacts when filing emails.</description>
+    <add>5.31</add>
+  </field>
 </table>
diff --git a/civicrm/xml/schema/Core/StateProvince.xml b/civicrm/xml/schema/Core/StateProvince.xml
index 53f7aba31fa21cc7fac67af61a5abb652cd694b6..9d7d94e8864bde4783a0707611f79470e893e421 100644
--- a/civicrm/xml/schema/Core/StateProvince.xml
+++ b/civicrm/xml/schema/Core/StateProvince.xml
@@ -5,6 +5,8 @@
   <class>StateProvince</class>
   <name>civicrm_state_province</name>
   <add>1.1</add>
+  <title>State/Province</title>
+  <titlePlural>States/Provinces</titlePlural>
   <field>
     <name>id</name>
     <title>State ID</title>
diff --git a/civicrm/xml/schema/Member/MembershipType.xml b/civicrm/xml/schema/Member/MembershipType.xml
index cd528adaf26fc8d599c30550e5c14fc0405259e0..fbae25e8d494a3ffbcd7375dac60ce560f09f22a 100644
--- a/civicrm/xml/schema/Member/MembershipType.xml
+++ b/civicrm/xml/schema/Member/MembershipType.xml
@@ -145,6 +145,7 @@
     <title>Membership Type Plan</title>
     <type>varchar</type>
     <length>8</length>
+    <required>true</required>
     <comment>Rolling membership period starts on signup date. Fixed membership periods start on fixed_period_start_day.</comment>
     <html>
       <type>Select</type>
diff --git a/civicrm/xml/schema/Price/LineItem.xml b/civicrm/xml/schema/Price/LineItem.xml
index 82b9c9a7cc56c9d5d6c012334206ba9655d8ab97..ee61447fee6c031b2c48b42c3117b461e707e534 100644
--- a/civicrm/xml/schema/Price/LineItem.xml
+++ b/civicrm/xml/schema/Price/LineItem.xml
@@ -58,6 +58,12 @@
     <title>Line Item Price Field</title>
     <type>int unsigned</type>
     <comment>FK to civicrm_price_field</comment>
+    <pseudoconstant>
+      <table>civicrm_price_field</table>
+      <keyColumn>id</keyColumn>
+      <nameColumn>name</nameColumn>
+      <labelColumn>label</labelColumn>
+    </pseudoconstant>
     <!-- changed to not required in 4.3 in order to change ON DELETE CASCADE FK constraint to SET NULL -->
     <add>1.7</add>
   </field>
@@ -145,6 +151,12 @@
     <type>int unsigned</type>
     <default>NULL</default>
     <comment>FK to civicrm_price_field_value</comment>
+    <pseudoconstant>
+      <table>civicrm_price_field_value</table>
+      <keyColumn>id</keyColumn>
+      <nameColumn>name</nameColumn>
+      <labelColumn>label</labelColumn>
+    </pseudoconstant>
     <add>3.3</add>
   </field>
   <foreignKey>
@@ -155,7 +167,7 @@
   </foreignKey>
   <field>
     <name>financial_type_id</name>
-    <title>Financial Type</title>
+    <title>Financial Type ID</title>
     <type>int unsigned</type>
     <default>NULL</default>
     <pseudoconstant>
@@ -167,6 +179,7 @@
     <add>4.3</add>
     <html>
       <type>Select</type>
+      <label>Financial Type</label>
     </html>
   </field>
   <foreignKey>
diff --git a/civicrm/xml/schema/Price/PriceSet.xml b/civicrm/xml/schema/Price/PriceSet.xml
index d84ac533927c08f81c08d77a287d8a6f57bb2c13..4e995b9b33e3c3f6bd97f449224631cf03de8ce5 100644
--- a/civicrm/xml/schema/Price/PriceSet.xml
+++ b/civicrm/xml/schema/Price/PriceSet.xml
@@ -185,8 +185,8 @@
   <field>
     <name>min_amount</name>
     <title>Minimum Amount</title>
-    <type>int unsigned</type>
-    <default>0</default>
+    <type>decimal</type>
+    <default>0.0</default>
     <comment>Minimum Amount required for this set.</comment>
     <add>4.7</add>
     <html>
diff --git a/civicrm/xml/schema/Report/ReportInstance.xml b/civicrm/xml/schema/Report/ReportInstance.xml
index 028c6fb722e8612d0149ced4cc1e666cd1b6eac9..d85b605c5d9182403c1745aea5e7d996faf5791f 100644
--- a/civicrm/xml/schema/Report/ReportInstance.xml
+++ b/civicrm/xml/schema/Report/ReportInstance.xml
@@ -6,7 +6,7 @@
   <name>civicrm_report_instance</name>
   <comment>Users can save their report instance and put in a cron tab etc.</comment>
   <add>2.2</add>
-  <title>Reports</title>
+  <title>Report</title>
   <icon>fa-bar-chart</icon>
   <field>
     <name>id</name>
diff --git a/civicrm/xml/templates/civicrm_data.tpl b/civicrm/xml/templates/civicrm_data.tpl
index d9891d3e1c96476a8f26f5fb10c0050a65bcf07c..e86bd1e5847280612e4c9f0293eed2eb36f878ec 100644
--- a/civicrm/xml/templates/civicrm_data.tpl
+++ b/civicrm/xml/templates/civicrm_data.tpl
@@ -33,7 +33,7 @@ SET @contactID := LAST_INSERT_ID();
 
 INSERT INTO civicrm_email (contact_id, location_type_id, email, is_primary, is_billing, on_hold, hold_date, reset_date)
 VALUES
-(@contactID, 1, 'fixme.domainemail@example.org', 0, 0, 0, NULL, NULL);
+(@contactID, 1, 'fixme.domainemail@example.org', 1, 0, 0, NULL, NULL);
 
 INSERT INTO civicrm_domain (name, version, contact_id) VALUES (@domainName, '2.2', @contactID);
 SELECT @domainID := id FROM civicrm_domain where name = 'Default Domain Name';
@@ -1157,7 +1157,6 @@ VALUES
  ('PayPal_Express',     '{ts escape="sql"}PayPal - Express{/ts}',       NULL,1,0,'{ts escape="sql"}User Name{/ts}','{ts escape="sql"}Password{/ts}','{ts escape="sql"}Signature{/ts}',NULL,'Payment_PayPalImpl','https://www.paypal.com/','https://api-3t.paypal.com/',NULL,'https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif','https://www.sandbox.paypal.com/','https://api-3t.sandbox.paypal.com/',NULL,'https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif',2, 1),
  ('AuthNet',            '{ts escape="sql"}Authorize.Net{/ts}',          NULL,1,0,'{ts escape="sql"}API Login{/ts}','{ts escape="sql"}Payment Key{/ts}','{ts escape="sql"}MD5 Hash{/ts}',NULL,'Payment_AuthorizeNet','https://secure2.authorize.net/gateway/transact.dll',NULL,'https://api2.authorize.net/xml/v1/request.api',NULL,'https://test.authorize.net/gateway/transact.dll',NULL,'https://apitest.authorize.net/xml/v1/request.api',NULL,1,1),
  ('PayJunction',        '{ts escape="sql"}PayJunction{/ts}',            NULL,0,0,'User Name','Password',NULL,NULL,'Payment_PayJunction','https://payjunction.com/quick_link',NULL,NULL,NULL,'https://www.payjunctionlabs.com/quick_link',NULL,NULL,NULL,1,1),
- ('eWAY',               '{ts escape="sql"}eWAY (Single Currency){/ts}', NULL,0,0,'Customer ID',NULL,NULL,NULL,'Payment_eWAY','https://www.eway.com.au/gateway_cvn/xmlpayment.asp',NULL,NULL,NULL,'https://www.eway.com.au/gateway_cvn/xmltest/testpage.asp',NULL,NULL,NULL,1,0),
  ('Dummy',              '{ts escape="sql"}Dummy Payment Processor{/ts}',NULL,1,1,'{ts escape="sql"}User Name{/ts}',NULL,NULL,NULL,'Payment_Dummy',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,1,1),
  ('Elavon',             '{ts escape="sql"}Elavon Payment Processor{/ts}','{ts escape="sql"}Elavon / Nova Virtual Merchant{/ts}',0,0,'{ts escape="sql"}SSL Merchant ID {/ts}','{ts escape="sql"}SSL User ID{/ts}','{ts escape="sql"}SSL PIN{/ts}',NULL,'Payment_Elavon','https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do',NULL,NULL,NULL,'https://www.myvirtualmerchant.com/VirtualMerchant/processxml.do',NULL,NULL,NULL,1,0),
  ('Realex',             '{ts escape="sql"}Realex Payment{/ts}',         NULL,0,0,'Merchant ID', 'Password', NULL, 'Account', 'Payment_Realex', 'https://epage.payandshop.com/epage.cgi', NULL, NULL, NULL, 'https://epage.payandshop.com/epage-remote.cgi', NULL, NULL, NULL, 1, 0),
@@ -1780,5 +1779,6 @@ VALUES
 -- in the setup routine based on their tags & using the standard extension install api.
 -- do not try this at home folks.
 INSERT IGNORE INTO civicrm_extension (type, full_name, name, label, file, is_active) VALUES ('module', 'sequentialcreditnotes', 'Sequential credit notes', 'Sequential credit notes', 'sequentialcreditnotes', 1);
+INSERT IGNORE INTO civicrm_extension (type, full_name, name, label, file, is_active) VALUES ('module', 'greenwich', 'Theme: Greenwich', 'Theme: Greenwich', 'greenwich', 1);
 INSERT IGNORE INTO civicrm_extension (type, full_name, name, label, file, is_active) VALUES ('module', 'eventcart', 'Event cart', 'Event cart', 'eventcart', 1);
 INSERT IGNORE INTO civicrm_extension (type, full_name, name, label, file, is_active) VALUES ('module', 'financialacls', 'Financial ACLs', 'Financial ACLs', 'financialacls', 1);
diff --git a/civicrm/xml/templates/civicrm_state_province.tpl b/civicrm/xml/templates/civicrm_state_province.tpl
index 614c34c071c8da26a18ffcb5b31dd0d586de9378..a11b5472757c26eae2c22e56c2691ebcc8b42f18 100644
--- a/civicrm/xml/templates/civicrm_state_province.tpl
+++ b/civicrm/xml/templates/civicrm_state_province.tpl
@@ -1216,7 +1216,7 @@ INSERT INTO civicrm_state_province (id, country_id, abbreviation, name) VALUES
 (2597, 1226, "AGB", "Argyll and Bute"),
 (2598, 1226, "ARM", "Co Armagh"),
 (2606, 1226, "BDF", "Bedfordshire"),
-(2612, 1226, "BGW", "Gwent"),
+(2612, 1226, "BGW", "Blaenau Gwent"),
 (2620, 1226, "BST", "Bristol, City of"),
 (2622, 1226, "BKM", "Buckinghamshire"),
 (2626, 1226, "CAM", "Cambridgeshire"),
@@ -1285,7 +1285,7 @@ INSERT INTO civicrm_state_province (id, country_id, abbreviation, name) VALUES
 (2786, 1226, "STG", "Stirling"),
 (2791, 1226, "SFK", "Suffolk"),
 (2793, 1226, "SRY", "Surrey"),
-(2804, 1226, "VGL", "Mid Glamorgan"),
+(2804, 1226, "VGL", "Vale of Glamorgan, The"),
 (2811, 1226, "WAR", "Warwickshire"),
 (2813, 1226, "WDU", "West Dunbartonshire"),
 (2814, 1226, "WLN", "West Lothian"),
@@ -3689,7 +3689,6 @@ INSERT INTO civicrm_state_province (id, country_id, abbreviation, name) VALUES
 
 -- new UK provinces (CRM-5224)
 (10013, 1226, "CWD", "Clwyd"),
-(10014, 1226, "DFD", "Dyfed"),
 (10015, 1226, "SGM", "South Glamorgan"),
 
 -- Haiti (CRM-5628)
@@ -4108,4 +4107,35 @@ INSERT INTO civicrm_state_province (id, country_id, abbreviation, name) VALUES
 (NULL, 1080, "09", "Woleu-Ntem"),
 
 -- dev/Core#131 Missing UK State
-(NULL, 1226, "MON", "Monmouthshire");
+(NULL, 1226, "MON", "Monmouthshire"),
+
+-- dev/core#2027 Missing subdivisions for Northern Ireland and Wales
+(NULL, 1226, "ANN", "Antrim and Newtownabbey"),
+(NULL, 1226, "AND", "Ards and North Down"),
+(NULL, 1226, "ABC", "Armagh City, Banbridge and Craigavon"),
+(NULL, 1226, "BFS", "Belfast"),
+(NULL, 1226, "CCG", "Causeway Coast and Glens"),
+(NULL, 1226, "DRS", "Derry City and Strabane"),
+(NULL, 1226, "FMO", "Fermanagh and Omagh"),
+(NULL, 1226, "LBC", "Lisburn and Castlereagh"),
+(NULL, 1226, "MEA", "Mid and East Antrim"),
+(NULL, 1226, "MUL", "Mid Ulster"),
+(NULL, 1226, "NMD", "Newry, Mourne and Down"),
+
+(NULL, 1226, "BGE", "Bridgend"),
+(NULL, 1226, "CAY", "Caerphilly"),
+(NULL, 1226, "CRF", "Cardiff"),
+(NULL, 1226, "CRF", "Carmarthenshire"),
+(NULL, 1226, "CGN", "Ceredigion"),
+(NULL, 1226, "CWY", "Conwy"),
+(NULL, 1226, "DEN", "Denbighshire"),
+(NULL, 1226, "FLN", "Flintshire"),
+(NULL, 1226, "AGY", "Isle of Anglesey"),
+(NULL, 1226, "MTY", "Merthyr Tydfil"),
+(NULL, 1226, "NTL", "Neath Port Talbot"),
+(NULL, 1226, "NWP", "Newport"),
+(NULL, 1226, "PEM", "Pembrokeshire"),
+(NULL, 1226, "RCT", "Rhondda, Cynon, Taff"),
+(NULL, 1226, "SWA", "Swansea"),
+(NULL, 1226, "TOF", "Torfaen"),
+(NULL, 1226, "WRX", "Wrexham");
diff --git a/civicrm/xml/templates/dao.tpl b/civicrm/xml/templates/dao.tpl
index 87a3463531c9a096e0b7abfdcca99893207263ae..034137433ed489ed46385eb3060fc5bfcbb3c550 100644
--- a/civicrm/xml/templates/dao.tpl
+++ b/civicrm/xml/templates/dao.tpl
@@ -61,9 +61,12 @@ class {$table.className} extends CRM_Core_DAO {ldelim}
 
     /**
      * Returns localized title of this entity.
+     *
+     * @param bool $plural
+     *   Whether to return the plural version of the title.
      */
-    public static function getEntityTitle() {ldelim}
-        return {$tsFunctionName}('{$table.title}');
+    public static function getEntityTitle($plural = FALSE) {ldelim}
+        return $plural ? {$tsFunctionName}('{$table.titlePlural}') : {$tsFunctionName}('{$table.title}');
     {rdelim}
 
 
diff --git a/civicrm/xml/version.xml b/civicrm/xml/version.xml
index 57d18a2041aa88dd58f45f4c01364f4c22be0792..b454fd7f66528ed249cef13128b3b58a5c2ff0b5 100644
--- a/civicrm/xml/version.xml
+++ b/civicrm/xml/version.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="iso-8859-1" ?>
 <version>
-  <version_no>5.30.1</version_no>
+  <version_no>5.31.0</version_no>
 </version>